From af06338d86c6bffddcfbbd0c7347de957909cf98 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 12 Mar 2025 15:12:52 -0300 Subject: [PATCH 01/55] WIP: first bits of Ollama provider, adapted from Gemini --- lib/ruby_llm.rb | 4 +- lib/ruby_llm/configuration.rb | 1 + lib/ruby_llm/providers/ollama.rb | 36 +++++ lib/ruby_llm/providers/ollama/capabilities.rb | 138 ++++++++++++++++++ lib/ruby_llm/providers/ollama/models.rb | 52 +++++++ 5 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 lib/ruby_llm/providers/ollama.rb create mode 100644 lib/ruby_llm/providers/ollama/capabilities.rb create mode 100644 lib/ruby_llm/providers/ollama/models.rb diff --git a/lib/ruby_llm.rb b/lib/ruby_llm.rb index 37dc3b18..80ab4c3c 100644 --- a/lib/ruby_llm.rb +++ b/lib/ruby_llm.rb @@ -15,7 +15,8 @@ 'llm' => 'LLM', 'openai' => 'OpenAI', 'api' => 'API', - 'deepseek' => 'DeepSeek' + 'deepseek' => 'DeepSeek', + 'ollama' => 'Ollama', ) loader.ignore("#{__dir__}/ruby_llm/railtie") loader.ignore("#{__dir__}/ruby_llm/active_record") @@ -70,6 +71,7 @@ def logger RubyLLM::Provider.register :anthropic, RubyLLM::Providers::Anthropic RubyLLM::Provider.register :gemini, RubyLLM::Providers::Gemini RubyLLM::Provider.register :deepseek, RubyLLM::Providers::DeepSeek +RubyLLM::Provider.register :ollama, RubyLLM::Providers::Ollama if defined?(Rails::Railtie) require 'ruby_llm/railtie' diff --git a/lib/ruby_llm/configuration.rb b/lib/ruby_llm/configuration.rb index 72a878aa..22718a79 100644 --- a/lib/ruby_llm/configuration.rb +++ b/lib/ruby_llm/configuration.rb @@ -14,6 +14,7 @@ class Configuration :anthropic_api_key, :gemini_api_key, :deepseek_api_key, + :ollama_api_base_url, :default_model, :default_embedding_model, :default_image_model, diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb new file mode 100644 index 00000000..35d1a665 --- /dev/null +++ b/lib/ruby_llm/providers/ollama.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module RubyLLM + module Providers + # Native Ollama API implementation + module Ollama + extend Provider + # extend Ollama::Chat + # extend Ollama::Embeddings + extend Ollama::Models + # extend Ollama::Streaming + + module_function + + def enabled? + !! RubyLLM.config.ollama_api_base_url + end + + def api_base + RubyLLM.config.ollama_api_base_url + end + + def headers + { } + end + + def capabilities + Ollama::Capabilities + end + + def slug + 'ollama' + end + end + end +end diff --git a/lib/ruby_llm/providers/ollama/capabilities.rb b/lib/ruby_llm/providers/ollama/capabilities.rb new file mode 100644 index 00000000..4d5b9d46 --- /dev/null +++ b/lib/ruby_llm/providers/ollama/capabilities.rb @@ -0,0 +1,138 @@ +# frozen_string_literal: true + +module RubyLLM + module Providers + module Ollama + # Determines capabilities for Ollama + module Capabilities # rubocop:disable Metrics/ModuleLength + module_function + + # Returns the context window size (input token limit) for the given model + # @param model_id [String] the model identifier + # @return [Integer] the context window size in tokens + def context_window_for(model_id) + # FIXME: revise + 4_192 # Sensible (and conservative) default for unknown models + end + + # Returns the maximum output tokens for the given model + # @param model_id [String] the model identifier + # @return [Integer] the maximum output tokens + def max_tokens_for(model_id) + # FIXME: revise + 32_768 + end + + # Returns the input price per million tokens for the given model + # @param model_id [String] the model identifier + # @return [Float] the price per million tokens in USD + def input_price_for(model_id) + 0.0 + end + + # Returns the output price per million tokens for the given model + # @param model_id [String] the model identifier + # @return [Float] the price per million tokens in USD + def output_price_for(model_id) + 0.0 + end + + # Determines if the model supports vision (image/video) inputs + # @param model_id [String] the model identifier + # @return [Boolean] true if the model supports vision inputs + def supports_vision?(model_id) + # FIXME: revise + false + end + + # Determines if the model supports function calling + # @param model_id [String] the model identifier + # @return [Boolean] true if the model supports function calling + def supports_functions?(model_id) + # FIXME: revise + false + end + + # Determines if the model supports JSON mode + # @param model_id [String] the model identifier + # @return [Boolean] true if the model supports JSON mode + def supports_json_mode?(model_id) + # FIXME: revise + false + end + + # Formats the model ID into a human-readable display name + # @param model_id [String] the model identifier + # @return [String] the formatted display name + def format_display_name(model_id) + model_id + .delete_prefix('models/') + .split('-') + .map(&:capitalize) + .join(' ') + .gsub(/(\d+\.\d+)/, ' \1') # Add space before version numbers + .gsub(/\s+/, ' ') # Clean up multiple spaces + .strip + end + + # Determines if the model supports context caching + # @param model_id [String] the model identifier + # @return [Boolean] true if the model supports caching + def supports_caching?(model_id) + # FIXME: revise + true + end + + # Determines if the model supports tuning + # @param model_id [String] the model identifier + # @return [Boolean] true if the model supports tuning + def supports_tuning?(model_id) + # FIXME: revise + false + end + + # Determines if the model supports audio inputs + # @param model_id [String] the model identifier + # @return [Boolean] true if the model supports audio inputs + def supports_audio?(model_id) + # FIXME: revise + false + end + + # Returns the type of model (chat, embedding, image) + # @param model_id [String] the model identifier + # @return [String] the model type + def model_type(model_id) + # FIXME: revise + 'chat' + end + + # Returns the model family identifier + # @param model_id [String] the model identifier + # @return [String] the model family identifier + def model_family(model_id) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength + 'other' + end + + # Returns the context length for the model + # @param model_id [String] the model identifier + # @return [Integer] the context length in tokens + def context_length(model_id) + context_window_for(model_id) + end + + # Default input price for unknown models + # @return [Float] the default input price per million tokens + def default_input_price + 0.0 + end + + # Default output price for unknown models + # @return [Float] the default output price per million tokens + def default_output_price + 0.0 + end + end + end + end +end diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb new file mode 100644 index 00000000..3a62ffc4 --- /dev/null +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module RubyLLM + module Providers + module Ollama + # Models methods for the Ollama API integration + module Models + # Methods needed by Provider - must be public + def models_url + 'api/tags' + end + + def list_models + return [] unless enabled? + + response = connection.get("api/tags") do |req| + req.headers.merge! headers + end + + parse_list_models_response(response, slug, capabilities) + end + + private + + def parse_list_models_response(response, slug, capabilities) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + (response.body['models'] || []).map do |model| + model_id = model['name'] + + ModelInfo.new( + id: model_id, + # NOTE: this is date pulled into ollama, not quite date of introduction of a model + created_at: model['modified_at'], + display_name: model_id, + provider: slug, + type: capabilities.model_type(model_id), + family: model['family'], + metadata: { + }, + context_window: capabilities.context_window_for(model_id), + max_tokens: capabilities.max_tokens_for(model_id), + supports_vision: capabilities.supports_vision?(model_id), + supports_functions: capabilities.supports_functions?(model_id), + supports_json_mode: capabilities.supports_json_mode?(model_id), + input_price_per_million: capabilities.input_price_for(model_id), + output_price_per_million: capabilities.output_price_for(model_id) + ) + end + end + end + end + end +end From 55151a02bd4a7f88ed2742ec8119577c3b0614b8 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 12 Mar 2025 16:23:24 -0300 Subject: [PATCH 02/55] Basic chat functionality --- lib/ruby_llm/providers/ollama.rb | 2 +- lib/ruby_llm/providers/ollama/chat.rb | 102 ++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 lib/ruby_llm/providers/ollama/chat.rb diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index 35d1a665..228ed385 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -5,7 +5,7 @@ module Providers # Native Ollama API implementation module Ollama extend Provider - # extend Ollama::Chat + extend Ollama::Chat # extend Ollama::Embeddings extend Ollama::Models # extend Ollama::Streaming diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb new file mode 100644 index 00000000..0ae3d669 --- /dev/null +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -0,0 +1,102 @@ +# frozen_string_literal: true + +module RubyLLM + module Providers + module Ollama + # Chat methods for the Ollama API implementation + module Chat # rubocop:disable Metrics/ModuleLength + # Must be public for Provider to use + def complete(messages, tools:, temperature:, model:, &block) # rubocop:disable Metrics/MethodLength + if tools.any? + raise NotImplementedError.new("tool use not implemented in Ollama at this time") + end + + payload = { + model: model, + messages: format_messages(messages), + options: { + temperature: temperature, + }, + } + + if block_given? + raise NotImplementedError + # stream_completion(model, payload, &block) + else + payload[:stream] = false + generate_completion(model, payload) + end + end + + # Format methods can be private + private + + def generate_completion(model, payload) + url = "api/chat" + response = post(url, payload) + result = parse_completion_response(response) + + result + end + + def format_messages(messages) + messages.map do |msg| + { + role: format_role(msg.role), + content: format_parts(msg), + } + end + end + + def format_role(role) + case role + when :assistant + when :system + when :tool + role.to_s + # FIXME: probably should validate this + else role.to_s + end + end + + def format_parts(msg) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + if msg.content.is_a?(Array) + # Handle multi-part content (text, images, etc.) + msg.content.map { |part| format_part(part) } + else + # Simple text content + msg.content.to_s + end + end + + def format_part(part) # rubocop:disable Metrics/MethodLength + case part[:type] + when 'text' + { text: part[:text] } + when 'image' + Media.format_image(part) + when 'pdf' + Media.format_pdf(part) + when 'audio' + Media.format_audio(part) + else + { text: part.to_s } + end + end + + def parse_completion_response(response) + data = response.body + message = data['message'] + + Message.new( + role: :assistant, + content: data.dig('message', 'content'), + input_tokens: data['prompt_eval_count'].to_i, + output_tokens: data['eval_count'].to_i, + model_id: data['model'], + ) + end + end + end + end +end From c7b98604eb784bf7455cd90151f938f1bf96295d Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 12 Mar 2025 18:05:56 -0300 Subject: [PATCH 03/55] Basic streaming functionality --- lib/ruby_llm/providers/ollama.rb | 2 +- lib/ruby_llm/providers/ollama/chat.rb | 4 +- lib/ruby_llm/providers/ollama/streaming.rb | 44 ++++++++++++++++++++++ 3 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 lib/ruby_llm/providers/ollama/streaming.rb diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index 228ed385..033301dd 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -8,7 +8,7 @@ module Ollama extend Ollama::Chat # extend Ollama::Embeddings extend Ollama::Models - # extend Ollama::Streaming + extend Ollama::Streaming module_function diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index 0ae3d669..9702e72e 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -20,8 +20,8 @@ def complete(messages, tools:, temperature:, model:, &block) # rubocop:disable M } if block_given? - raise NotImplementedError - # stream_completion(model, payload, &block) + payload[:stream] = true + stream_completion(model, payload, &block) else payload[:stream] = false generate_completion(model, payload) diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb new file mode 100644 index 00000000..3c3641d0 --- /dev/null +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module RubyLLM + module Providers + module Ollama + # Streaming methods for the Ollama API implementation + module Streaming + # Need to make stream_completion public for chat.rb to access + def stream_completion(model, payload, &block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + url = "api/chat" + accumulator = StreamAccumulator.new + + post(url, payload) do |req| + req.options.on_data = stream_handler(accumulator, &block) + end + + message = accumulator.to_message + + accumulator.to_message + end + + private + + # Handle streaming + def stream_handler(accumulator, &block) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity + to_json_stream do |data| # rubocop:disable Metrics/BlockLength + chunk = Chunk.new( + role: :assistant, + content: data.dig('message', 'content'), + model_id: data['model'], + + # NOTE: unavailable in the response - https://ollama.readthedocs.io/en/api/#streaming-responses + input_tokens: nil, + output_tokens: nil, + ) + + accumulator.add(chunk) + block.call(chunk) + end + end + end + end + end +end From f294070d0c25e3d81d566a000886d8d94c85eead Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 12 Mar 2025 18:23:31 -0300 Subject: [PATCH 04/55] Basic embedding functionality --- lib/ruby_llm/providers/ollama.rb | 2 +- lib/ruby_llm/providers/ollama/embeddings.rb | 39 +++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 lib/ruby_llm/providers/ollama/embeddings.rb diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index 033301dd..74467068 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -6,7 +6,7 @@ module Providers module Ollama extend Provider extend Ollama::Chat - # extend Ollama::Embeddings + extend Ollama::Embeddings extend Ollama::Models extend Ollama::Streaming diff --git a/lib/ruby_llm/providers/ollama/embeddings.rb b/lib/ruby_llm/providers/ollama/embeddings.rb new file mode 100644 index 00000000..1c41dc1f --- /dev/null +++ b/lib/ruby_llm/providers/ollama/embeddings.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module RubyLLM + module Providers + module Ollama + # Embeddings methods for the Ollama API integration + module Embeddings + # Must be public for Provider module + def embed(text, model:) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + payload = { + model: model, + input: format_text_for_embedding(text), + } + + url = "api/embed" + response = post(url, payload) + + Embedding.new( + vectors: response.body['embeddings'], + model: model, + # only available when passing a single string input + input_tokens: response.body['prompt_eval_count'] || 0, + ) + end + + private + + def format_text_for_embedding(text) + if text.is_a?(Array) || text.is_a?(String) + # Ollama supports either a string or a string array here + text + else + raise NotImplementedException.new("unsupported argument for Ollama embedding: #{text.class}") + end + end + end + end + end +end From 8b9899f6ac86d592be16c9c93496a8b70514bf09 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 12 Mar 2025 19:17:15 -0300 Subject: [PATCH 05/55] Mention Ollama in getting-started.md --- docs/guides/getting-started.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index ff6cb1c0..960a414d 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -33,6 +33,16 @@ RubyLLM.configure do |config| end ``` +Alternatively, you can point to an Ollama instance; here it is configured to the most common address when Ollama is installed locally: +``` +RubyLLM.configure do |config| + config.ollama_api_base_url = 'http://localhost:11434' +end + +# Needs to be called to populate Ollama models before using any +RubyLLM.models.refresh! +``` + ## Your First Chat Let's start with a simple chat interaction: @@ -64,6 +74,10 @@ claude_chat.ask "Tell me about Ruby programming language" # Use Gemini gemini_chat = RubyLLM.chat(model: 'gemini-2.0-flash') gemini_chat.ask "What are the best Ruby gems for machine learning?" + +# Use an Ollama model (pull it into the server first; consult Ollama docs): +ollama_chat = RubyLLM.chat(model: 'gemma3:latest') +ollama_chat.ask "What is Alphabet?" ``` ## Exploring Available Models @@ -161,4 +175,4 @@ Now that you've got the basics down, you're ready to explore more advanced featu - [Chatting with AI]({% link guides/chat.md %}) - Learn more about chat capabilities - [Using Tools]({% link guides/tools.md %}) - Let AI use your Ruby code -- [Rails Integration]({% link guides/rails.md %}) - Persist chats in your Rails apps \ No newline at end of file +- [Rails Integration]({% link guides/rails.md %}) - Persist chats in your Rails apps From a0617fe38b5ee4698c3930c5d5c0472dcdc7ae04 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 12 Mar 2025 20:10:55 -0300 Subject: [PATCH 06/55] Rubocop autocorrects --- lib/ruby_llm.rb | 2 +- lib/ruby_llm/providers/ollama.rb | 4 ++-- lib/ruby_llm/providers/ollama/chat.rb | 21 ++++++++------------- lib/ruby_llm/providers/ollama/embeddings.rb | 13 ++++++------- lib/ruby_llm/providers/ollama/models.rb | 5 ++--- lib/ruby_llm/providers/ollama/streaming.rb | 6 ++---- 6 files changed, 21 insertions(+), 30 deletions(-) diff --git a/lib/ruby_llm.rb b/lib/ruby_llm.rb index 80ab4c3c..94861ce4 100644 --- a/lib/ruby_llm.rb +++ b/lib/ruby_llm.rb @@ -16,7 +16,7 @@ 'openai' => 'OpenAI', 'api' => 'API', 'deepseek' => 'DeepSeek', - 'ollama' => 'Ollama', + 'ollama' => 'Ollama' ) loader.ignore("#{__dir__}/ruby_llm/railtie") loader.ignore("#{__dir__}/ruby_llm/active_record") diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index 74467068..254ca821 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -13,7 +13,7 @@ module Ollama module_function def enabled? - !! RubyLLM.config.ollama_api_base_url + !!RubyLLM.config.ollama_api_base_url end def api_base @@ -21,7 +21,7 @@ def api_base end def headers - { } + {} end def capabilities diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index 9702e72e..1a9aa8f6 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -7,16 +7,14 @@ module Ollama module Chat # rubocop:disable Metrics/ModuleLength # Must be public for Provider to use def complete(messages, tools:, temperature:, model:, &block) # rubocop:disable Metrics/MethodLength - if tools.any? - raise NotImplementedError.new("tool use not implemented in Ollama at this time") - end + raise NotImplementedError.new('tool use not implemented in Ollama at this time') if tools.any? payload = { model: model, messages: format_messages(messages), options: { - temperature: temperature, - }, + temperature: temperature + } } if block_given? @@ -31,19 +29,17 @@ def complete(messages, tools:, temperature:, model:, &block) # rubocop:disable M # Format methods can be private private - def generate_completion(model, payload) - url = "api/chat" + def generate_completion(_model, payload) + url = 'api/chat' response = post(url, payload) - result = parse_completion_response(response) - - result + parse_completion_response(response) end def format_messages(messages) messages.map do |msg| { role: format_role(msg.role), - content: format_parts(msg), + content: format_parts(msg) } end end @@ -86,14 +82,13 @@ def format_part(part) # rubocop:disable Metrics/MethodLength def parse_completion_response(response) data = response.body - message = data['message'] Message.new( role: :assistant, content: data.dig('message', 'content'), input_tokens: data['prompt_eval_count'].to_i, output_tokens: data['eval_count'].to_i, - model_id: data['model'], + model_id: data['model'] ) end end diff --git a/lib/ruby_llm/providers/ollama/embeddings.rb b/lib/ruby_llm/providers/ollama/embeddings.rb index 1c41dc1f..ecac1876 100644 --- a/lib/ruby_llm/providers/ollama/embeddings.rb +++ b/lib/ruby_llm/providers/ollama/embeddings.rb @@ -9,29 +9,28 @@ module Embeddings def embed(text, model:) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength payload = { model: model, - input: format_text_for_embedding(text), + input: format_text_for_embedding(text) } - url = "api/embed" + url = 'api/embed' response = post(url, payload) Embedding.new( vectors: response.body['embeddings'], model: model, # only available when passing a single string input - input_tokens: response.body['prompt_eval_count'] || 0, + input_tokens: response.body['prompt_eval_count'] || 0 ) end private def format_text_for_embedding(text) - if text.is_a?(Array) || text.is_a?(String) - # Ollama supports either a string or a string array here - text - else + # Ollama supports either a string or a string array here + unless text.is_a?(Array) || text.is_a?(String) raise NotImplementedException.new("unsupported argument for Ollama embedding: #{text.class}") end + text end end end diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb index 3a62ffc4..28c4f32d 100644 --- a/lib/ruby_llm/providers/ollama/models.rb +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -13,7 +13,7 @@ def models_url def list_models return [] unless enabled? - response = connection.get("api/tags") do |req| + response = connection.get('api/tags') do |req| req.headers.merge! headers end @@ -34,8 +34,7 @@ def parse_list_models_response(response, slug, capabilities) # rubocop:disable M provider: slug, type: capabilities.model_type(model_id), family: model['family'], - metadata: { - }, + metadata: {}, context_window: capabilities.context_window_for(model_id), max_tokens: capabilities.max_tokens_for(model_id), supports_vision: capabilities.supports_vision?(model_id), diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index 3c3641d0..a6fd1218 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -7,15 +7,13 @@ module Ollama module Streaming # Need to make stream_completion public for chat.rb to access def stream_completion(model, payload, &block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength - url = "api/chat" + url = 'api/chat' accumulator = StreamAccumulator.new post(url, payload) do |req| req.options.on_data = stream_handler(accumulator, &block) end - message = accumulator.to_message - accumulator.to_message end @@ -31,7 +29,7 @@ def stream_handler(accumulator, &block) # rubocop:disable Metrics/AbcSize,Metric # NOTE: unavailable in the response - https://ollama.readthedocs.io/en/api/#streaming-responses input_tokens: nil, - output_tokens: nil, + output_tokens: nil ) accumulator.add(chunk) From b65132e45771b263108c2039ffb3f1d659da2fb8 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 12 Mar 2025 20:19:47 -0300 Subject: [PATCH 07/55] More rubocop appeasement --- lib/ruby_llm/providers/ollama/chat.rb | 10 ++-------- lib/ruby_llm/providers/ollama/embeddings.rb | 3 ++- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index 1a9aa8f6..b9a0209f 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -7,7 +7,7 @@ module Ollama module Chat # rubocop:disable Metrics/ModuleLength # Must be public for Provider to use def complete(messages, tools:, temperature:, model:, &block) # rubocop:disable Metrics/MethodLength - raise NotImplementedError.new('tool use not implemented in Ollama at this time') if tools.any? + raise NotImplementedError, 'tool use not implemented in Ollama at this time' if tools.any? payload = { model: model, @@ -45,14 +45,8 @@ def format_messages(messages) end def format_role(role) - case role - when :assistant - when :system - when :tool - role.to_s # FIXME: probably should validate this - else role.to_s - end + role.to_s end def format_parts(msg) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength diff --git a/lib/ruby_llm/providers/ollama/embeddings.rb b/lib/ruby_llm/providers/ollama/embeddings.rb index ecac1876..a6aa736f 100644 --- a/lib/ruby_llm/providers/ollama/embeddings.rb +++ b/lib/ruby_llm/providers/ollama/embeddings.rb @@ -28,8 +28,9 @@ def embed(text, model:) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength def format_text_for_embedding(text) # Ollama supports either a string or a string array here unless text.is_a?(Array) || text.is_a?(String) - raise NotImplementedException.new("unsupported argument for Ollama embedding: #{text.class}") + raise NotImplementedException, "unsupported argument for Ollama embedding: #{text.class}" end + text end end From 88cffc382ab847e2d274a8d2cf527440f75c0b26 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Mon, 24 Mar 2025 19:46:47 -0300 Subject: [PATCH 08/55] WIP: start adding Ollama provider tests --- lib/ruby_llm/providers/ollama.rb | 4 + lib/ruby_llm/providers/ollama/models.rb | 7 ++ lib/tasks/ollama.rake | 32 +++++++ spec/ruby_llm/providers/ollama/ollama_spec.rb | 92 +++++++++++++++++++ spec/spec_helper.rb | 3 + 5 files changed, 138 insertions(+) create mode 100644 lib/tasks/ollama.rake create mode 100644 spec/ruby_llm/providers/ollama/ollama_spec.rb diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index 254ca821..3cef062c 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -31,6 +31,10 @@ def capabilities def slug 'ollama' end + + def configuration_requirements + %i[ollama_api_base_url] + end end end end diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb index 28c4f32d..5e394cb7 100644 --- a/lib/ruby_llm/providers/ollama/models.rb +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -10,6 +10,13 @@ def models_url 'api/tags' end + # FIXME: include aliases for tags with the format \d+m or \d+b + # ie. given these models in the server, + # - gemma3:27b + # - gemma3:9b + # + # create an alias gemma3 for gemma3:27b + def list_models return [] unless enabled? diff --git a/lib/tasks/ollama.rake b/lib/tasks/ollama.rake new file mode 100644 index 00000000..b80f9fad --- /dev/null +++ b/lib/tasks/ollama.rake @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +require 'ruby_llm' + +def pull_model(ollama_library_model_spec, description) + warn "+ pulling #{ollama_library_model_spec} from Ollama library (#{description})" + payload = { + model: ollama_library_model_spec, + insecure: false, + stream: false + } + + # ugly but effective + # FIXME: possibly needs timeout adjustment since it downloads models + response = RubyLLM::Providers::Ollama.send :post, '/api/pull', payload + + unless response.body['status'] == 'success' + raise 'non-successful response when pulling model; check Ollama server logs' + end + + warn '+ done' +end + +namespace :ollama do + desc 'Install some tiny models required for running Ollama specs (downloads about 150 MB into your Ollama server)' + task :install_models_for_specs do + RubyLLM.config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL') + + pull_model('smollm:135m', '92MiB chat model') + pull_model('snowflake-arctic-embed:22m', '46MiB embedding model') + end +end diff --git a/spec/ruby_llm/providers/ollama/ollama_spec.rb b/spec/ruby_llm/providers/ollama/ollama_spec.rb new file mode 100644 index 00000000..0fb4ccd1 --- /dev/null +++ b/spec/ruby_llm/providers/ollama/ollama_spec.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +require 'spec_helper' +require 'dotenv/load' + +RSpec.shared_context 'with configured local Ollama server' do + before :all do + RubyLLM.configure do |config| + config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', 'http://localhost:11434') + + # FIXME: need a sane internal API to do this, like RubyLLM.disable_all_providers() + # FIXME: this will break other tests depending on run order + config.openai_api_key = nil + config.anthropic_api_key = nil + config.gemini_api_key = nil + config.deepseek_api_key = nil + end + end +end + +RSpec.describe RubyLLM::Providers::Ollama do # rubocop:disable RSpec/SpecFilePathFormat + include_context 'with configured local Ollama server' + + describe '.models' do + it 'fetches models from the server at runtime' do # rubocop:disable RSpec/MultipleExpectations + RubyLLM.models.refresh! + + # NOTE: to ensure relevant models are pulled into your local server, do + # bundle exec rake ollama:install_models_for_specs + + expect(RubyLLM.models).to include( + an_object_having_attributes(provider: 'ollama', id: 'smollm:135m') + ) + expect(RubyLLM.models).to include( + an_object_having_attributes(provider: 'ollama', id: 'snowflake-arctic-embed:22m') + ) + end + end + + describe '.chat' do + let(:chat) { RubyLLM.chat(model: 'smollm:135m', provider: 'ollama') } + + it 'works' do + response = chat.ask('Count from 1 to 3') + expect(response.content).to be_present + end + end + + describe 'streaming' do + let(:chat) { RubyLLM.chat(model: 'smollm:135m', provider: 'ollama') } + + it 'works' do + chunks = [] + + chat.ask('Count from 1 to 3') do |chunk| + chunks << chunk + end + + expect(chunks).not_to be_empty + expect(chunks.first).to be_a(RubyLLM::Chunk) + end + end + + describe 'embeddings' do + let(:test_text) { "Ruby is a programmer's best friend" } + let(:test_texts) { %w[Ruby Python JavaScript] } + let(:model) { 'snowflake-arctic-embed:22m' } + + it 'can handle a single text' do # rubocop:disable RSpec/MultipleExpectations + # FIXME: need a provider: param just like in chat() + # embedding = RubyLLM.embed(test_text, model: model, provider: 'ollama') + + embedding = RubyLLM.embed(test_text, model: model) + expect(embedding.vectors).to be_an(Array) + expect(embedding.vectors.first).to be_a(Float) + expect(embedding.model).to eq(model) + expect(embedding.input_tokens).to be >= 0 + end + + it 'can handle multiple texts' do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations + # FIXME: need a provider: param just like in chat() + # embeddings = RubyLLM.embed(test_texts, model: model, provider: 'ollama') + + embeddings = RubyLLM.embed(test_texts, model: model) + expect(embeddings.vectors).to be_an(Array) + expect(embeddings.vectors.size).to eq(3) + expect(embeddings.vectors.first).to be_an(Array) + expect(embeddings.model).to eq(model) + expect(embeddings.input_tokens).to be >= 0 + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 26aea5df..2e05f5ce 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -46,6 +46,9 @@ config.filter_sensitive_data('') { ENV.fetch('GEMINI_API_KEY', nil) } config.filter_sensitive_data('') { ENV.fetch('DEEPSEEK_API_KEY', nil) } + # Pretend this is the same for everyone + config.filter_sensitive_data('http://localhost:11434') { ENV.fetch('OLLAMA_API_BASE_URL', nil) } + # Filter sensitive response headers config.filter_sensitive_data('') do |interaction| interaction.response.headers['Openai-Organization']&.first From 836e96140ed71ec2b33f458ce8b8c3df722c51db Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Mon, 24 Mar 2025 20:07:32 -0300 Subject: [PATCH 09/55] Fix embeddings return value --- lib/ruby_llm/providers/ollama/embeddings.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ruby_llm/providers/ollama/embeddings.rb b/lib/ruby_llm/providers/ollama/embeddings.rb index a6aa736f..3a20b6af 100644 --- a/lib/ruby_llm/providers/ollama/embeddings.rb +++ b/lib/ruby_llm/providers/ollama/embeddings.rb @@ -14,9 +14,10 @@ def embed(text, model:) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength url = 'api/embed' response = post(url, payload) + vectors = response.body['embeddings'] Embedding.new( - vectors: response.body['embeddings'], + vectors: text.is_a?(String) ? vectors.first : vectors, model: model, # only available when passing a single string input input_tokens: response.body['prompt_eval_count'] || 0 From 4d8151d969fb50b763520167fce7368d454ac919 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Mon, 24 Mar 2025 22:45:25 -0300 Subject: [PATCH 10/55] Rubocop appeasement --- lib/ruby_llm/providers/ollama/capabilities.rb | 26 +++++++++---------- lib/ruby_llm/providers/ollama/chat.rb | 4 +-- lib/ruby_llm/providers/ollama/embeddings.rb | 2 +- lib/ruby_llm/providers/ollama/models.rb | 2 +- lib/ruby_llm/providers/ollama/streaming.rb | 6 ++--- spec/ruby_llm/providers/ollama/ollama_spec.rb | 8 +++--- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/capabilities.rb b/lib/ruby_llm/providers/ollama/capabilities.rb index 4d5b9d46..be144b47 100644 --- a/lib/ruby_llm/providers/ollama/capabilities.rb +++ b/lib/ruby_llm/providers/ollama/capabilities.rb @@ -4,13 +4,13 @@ module RubyLLM module Providers module Ollama # Determines capabilities for Ollama - module Capabilities # rubocop:disable Metrics/ModuleLength + module Capabilities module_function # Returns the context window size (input token limit) for the given model # @param model_id [String] the model identifier # @return [Integer] the context window size in tokens - def context_window_for(model_id) + def context_window_for(_model_id) # FIXME: revise 4_192 # Sensible (and conservative) default for unknown models end @@ -18,7 +18,7 @@ def context_window_for(model_id) # Returns the maximum output tokens for the given model # @param model_id [String] the model identifier # @return [Integer] the maximum output tokens - def max_tokens_for(model_id) + def max_tokens_for(_model_id) # FIXME: revise 32_768 end @@ -26,21 +26,21 @@ def max_tokens_for(model_id) # Returns the input price per million tokens for the given model # @param model_id [String] the model identifier # @return [Float] the price per million tokens in USD - def input_price_for(model_id) + def input_price_for(_model_id) 0.0 end # Returns the output price per million tokens for the given model # @param model_id [String] the model identifier # @return [Float] the price per million tokens in USD - def output_price_for(model_id) + def output_price_for(_model_id) 0.0 end # Determines if the model supports vision (image/video) inputs # @param model_id [String] the model identifier # @return [Boolean] true if the model supports vision inputs - def supports_vision?(model_id) + def supports_vision?(_model_id) # FIXME: revise false end @@ -48,7 +48,7 @@ def supports_vision?(model_id) # Determines if the model supports function calling # @param model_id [String] the model identifier # @return [Boolean] true if the model supports function calling - def supports_functions?(model_id) + def supports_functions?(_model_id) # FIXME: revise false end @@ -56,7 +56,7 @@ def supports_functions?(model_id) # Determines if the model supports JSON mode # @param model_id [String] the model identifier # @return [Boolean] true if the model supports JSON mode - def supports_json_mode?(model_id) + def supports_json_mode?(_model_id) # FIXME: revise false end @@ -78,7 +78,7 @@ def format_display_name(model_id) # Determines if the model supports context caching # @param model_id [String] the model identifier # @return [Boolean] true if the model supports caching - def supports_caching?(model_id) + def supports_caching?(_model_id) # FIXME: revise true end @@ -86,7 +86,7 @@ def supports_caching?(model_id) # Determines if the model supports tuning # @param model_id [String] the model identifier # @return [Boolean] true if the model supports tuning - def supports_tuning?(model_id) + def supports_tuning?(_model_id) # FIXME: revise false end @@ -94,7 +94,7 @@ def supports_tuning?(model_id) # Determines if the model supports audio inputs # @param model_id [String] the model identifier # @return [Boolean] true if the model supports audio inputs - def supports_audio?(model_id) + def supports_audio?(_model_id) # FIXME: revise false end @@ -102,7 +102,7 @@ def supports_audio?(model_id) # Returns the type of model (chat, embedding, image) # @param model_id [String] the model identifier # @return [String] the model type - def model_type(model_id) + def model_type(_model_id) # FIXME: revise 'chat' end @@ -110,7 +110,7 @@ def model_type(model_id) # Returns the model family identifier # @param model_id [String] the model identifier # @return [String] the model family identifier - def model_family(model_id) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength + def model_family(_model_id) 'other' end diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index b9a0209f..d86d12c4 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -4,7 +4,7 @@ module RubyLLM module Providers module Ollama # Chat methods for the Ollama API implementation - module Chat # rubocop:disable Metrics/ModuleLength + module Chat # Must be public for Provider to use def complete(messages, tools:, temperature:, model:, &block) # rubocop:disable Metrics/MethodLength raise NotImplementedError, 'tool use not implemented in Ollama at this time' if tools.any? @@ -49,7 +49,7 @@ def format_role(role) role.to_s end - def format_parts(msg) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + def format_parts(msg) if msg.content.is_a?(Array) # Handle multi-part content (text, images, etc.) msg.content.map { |part| format_part(part) } diff --git a/lib/ruby_llm/providers/ollama/embeddings.rb b/lib/ruby_llm/providers/ollama/embeddings.rb index 3a20b6af..8d2eb722 100644 --- a/lib/ruby_llm/providers/ollama/embeddings.rb +++ b/lib/ruby_llm/providers/ollama/embeddings.rb @@ -6,7 +6,7 @@ module Ollama # Embeddings methods for the Ollama API integration module Embeddings # Must be public for Provider module - def embed(text, model:) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + def embed(text, model:) # rubocop:disable Metrics/MethodLength payload = { model: model, input: format_text_for_embedding(text) diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb index 5e394cb7..136414fc 100644 --- a/lib/ruby_llm/providers/ollama/models.rb +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -29,7 +29,7 @@ def list_models private - def parse_list_models_response(response, slug, capabilities) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + def parse_list_models_response(response, slug, capabilities) # rubocop:disable Metrics/MethodLength (response.body['models'] || []).map do |model| model_id = model['name'] diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index a6fd1218..b268ee01 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -6,7 +6,7 @@ module Ollama # Streaming methods for the Ollama API implementation module Streaming # Need to make stream_completion public for chat.rb to access - def stream_completion(model, payload, &block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + def stream_completion(_model, payload, &block) url = 'api/chat' accumulator = StreamAccumulator.new @@ -20,8 +20,8 @@ def stream_completion(model, payload, &block) # rubocop:disable Metrics/AbcSize, private # Handle streaming - def stream_handler(accumulator, &block) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity - to_json_stream do |data| # rubocop:disable Metrics/BlockLength + def stream_handler(accumulator, &block) # rubocop:disable Metrics/MethodLength + to_json_stream do |data| chunk = Chunk.new( role: :assistant, content: data.dig('message', 'content'), diff --git a/spec/ruby_llm/providers/ollama/ollama_spec.rb b/spec/ruby_llm/providers/ollama/ollama_spec.rb index 0fb4ccd1..56ea89b2 100644 --- a/spec/ruby_llm/providers/ollama/ollama_spec.rb +++ b/spec/ruby_llm/providers/ollama/ollama_spec.rb @@ -18,11 +18,11 @@ end end -RSpec.describe RubyLLM::Providers::Ollama do # rubocop:disable RSpec/SpecFilePathFormat +RSpec.describe RubyLLM::Providers::Ollama do include_context 'with configured local Ollama server' describe '.models' do - it 'fetches models from the server at runtime' do # rubocop:disable RSpec/MultipleExpectations + it 'fetches models from the server at runtime' do # rubocop:disable RSpec/MultipleExpectations,RSpec/ExampleLength RubyLLM.models.refresh! # NOTE: to ensure relevant models are pulled into your local server, do @@ -40,7 +40,7 @@ describe '.chat' do let(:chat) { RubyLLM.chat(model: 'smollm:135m', provider: 'ollama') } - it 'works' do + it 'ask works' do response = chat.ask('Count from 1 to 3') expect(response.content).to be_present end @@ -49,7 +49,7 @@ describe 'streaming' do let(:chat) { RubyLLM.chat(model: 'smollm:135m', provider: 'ollama') } - it 'works' do + it 'ask with streaming works' do # rubocop:disable RSpec/MultipleExpectations,RSpec/ExampleLength chunks = [] chat.ask('Count from 1 to 3') do |chunk| From fb9697c9a4c1efb7a4f7e4c320a7b2636ad9677b Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Mon, 24 Mar 2025 22:21:22 -0300 Subject: [PATCH 11/55] Add VCR cassettes --- .../providers_ollama_chat_ask_works.yml | 45 ++++++++ ...ma_embeddings_can_handle_a_single_text.yml | 38 +++++++ ...a_embeddings_can_handle_multiple_texts.yml | 37 +++++++ ...ches_models_from_the_server_at_runtime.yml | 35 ++++++ ...ama_streaming_ask_with_streaming_works.yml | 101 ++++++++++++++++++ 5 files changed, 256 insertions(+) create mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_chat_ask_works.yml create mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_a_single_text.yml create mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_multiple_texts.yml create mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_models_fetches_models_from_the_server_at_runtime.yml create mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_streaming_ask_with_streaming_works.yml diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_chat_ask_works.yml b/spec/fixtures/vcr_cassettes/providers_ollama_chat_ask_works.yml new file mode 100644 index 00000000..8ca26bdb --- /dev/null +++ b/spec/fixtures/vcr_cassettes/providers_ollama_chat_ask_works.yml @@ -0,0 +1,45 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"smollm:135m","messages":[{"role":"user","content":"Count + from 1 to 3"}],"options":{"temperature":0.7},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 25 Mar 2025 11:42:35 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '812' + body: + encoding: ASCII-8BIT + string: '{"model":"smollm:135m","created_at":"2025-03-25T11:42:35.763421821Z","message":{"role":"assistant","content":"To + count the number of numbers in a list, you can use the `count()` method on + an iterable object like a list or tuple. The `count()` method returns the + number of occurrences of each item in the iterable and its position in the + list. To find the first occurrence of an element, you can access it using + indexing and then return the value obtained by that index:\n\n```python\nnumbers + = [1, 2, 3]\nresult = numbers[0] == 1 or numbers[1] == 3\nassert result == + True\n# ... (approximate count of numbers in list)\n```"},"done_reason":"stop","done":true,"total_duration":1783007537,"load_duration":1218168782,"prompt_eval_count":16,"prompt_eval_duration":186161937,"eval_count":132,"eval_duration":376576424}' + recorded_at: Tue, 25 Mar 2025 11:42:31 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_a_single_text.yml b/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_a_single_text.yml new file mode 100644 index 00000000..bd9fa5d5 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_a_single_text.yml @@ -0,0 +1,38 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/embed + body: + encoding: UTF-8 + string: '{"model":"snowflake-arctic-embed:22m","input":"Ruby is a programmer''s + best friend"}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 25 Mar 2025 11:42:36 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.025825415,-0.023176115,-0.052045297,-0.023625664,0.0006673469,0.009949714,-0.04538417,-0.06849524,-0.019409077,0.0010184002,-0.054927465,0.04728714,0.032690506,0.030963264,-0.028091758,-0.05092271,0.00021566867,0.023615433,-0.12640688,0.015840458,0.012315658,0.087370574,0.011073331,0.0090212375,0.007156342,-0.0052327104,0.021913407,-0.020346882,-0.03459649,-0.20068292,0.021031896,0.07291515,0.031049531,-0.04963502,0.023327535,-0.06476457,0.0131773045,0.004342761,-0.05204616,-0.03947274,0.0122103775,0.003776148,-0.050048206,-0.017586641,-0.029104842,-0.016230974,0.021660762,-0.017151477,0.0865443,0.01920734,-0.042871486,-0.0089291595,-0.02822964,-0.04884569,-0.018680912,-0.01892585,0.015438859,0.0065737013,-0.021804608,0.00633415,0.0343607,0.0017093703,-0.34944108,-0.06468269,0.0478818,-0.00246448,0.046574403,0.02243261,-0.024708489,-0.016602987,-0.011909359,0.014165576,-0.07424154,-0.03776865,0.032787047,-0.05530688,0.013535443,0.042380534,0.038827997,-0.033742167,0.015697544,0.009775907,0.0042203693,0.0011168025,0.023423292,0.04484947,-0.043061797,-0.05383481,-0.028867329,-0.0033860689,0.018773982,-0.018347567,0.03903167,-0.029658085,-0.06440208,0.040508885,-0.0017985007,0.049720276,0.033716165,0.31325525,0.04386892,0.0048334296,0.050675593,-0.056929454,0.0518016,-0.004611103,-0.0029309082,-0.028916717,0.0060408665,-0.004141483,0.01923389,-0.031655706,0.01768319,0.02311225,0.045390822,-0.024344986,-0.039786555,0.024944702,0.005075094,0.056426894,-0.0009737753,0.0037892968,-0.032363605,-0.012793344,-0.041841026,-0.014850747,-0.06273983,0.033704888,0.031475354,0.011834117,0.05125323,-0.011774348,-0.06885821,-0.014935385,-0.0006414335,0.017715653,-0.008953341,-0.097899854,-0.036503628,-0.084191576,0.023606507,-0.1339018,0.1330882,0.007957225,0.01985772,0.00030814653,0.021941159,0.05639211,-0.043463834,-0.045274723,0.011725757,-0.003486319,0.003375221,0.0074666464,0.06974618,-0.0006389784,-0.038667206,0.07041848,-0.02421246,0.03300245,-0.011266481,0.035639856,0.040018253,0.09069596,0.08246825,-0.009912788,0.012884513,-0.022981415,0.03470591,-0.022104705,0.0043493398,0.013083702,0.035951313,0.03946172,-0.038252268,0.030231304,-0.036359355,0.01005223,0.0025720727,0.0013707506,0.034241233,0.088925935,-0.051440887,-0.050102297,-0.0016456994,-0.009496842,0.062487546,0.040939905,0.07381002,0.078291304,-0.038428534,0.1316706,-0.0055638882,0.008280254,-0.021145111,0.04876571,0.040031683,0.04628573,0.046338666,-0.017028602,-0.007903445,0.007545737,-0.07565534,0.064689994,-0.022149073,-0.046088018,0.014704514,-0.040415496,0.00550196,0.006901969,0.00089305703,0.006521102,0.0366565,0.0074207284,0.039539423,0.005592426,-0.003989626,0.008083243,0.033852484,0.052595314,-0.015218367,0.03131478,0.0040506576,-0.048098013,-0.027468681,-0.024048975,-0.04536876,-0.05319465,-0.027298115,-0.01941297,0.010558779,0.06863464,0.04396793,0.08020219,0.033566475,-0.009056651,-0.014715962,0.04780099,0.05536488,-0.06740807,0.002055909,0.013943318,-0.05024147,-0.035200298,0.027621565,-0.040184192,-0.007491963,-0.06297288,-0.022879997,0.093055375,0.04880813,-0.012168053,0.019717308,0.064516716,0.020201867,0.012079503,-0.17798914,-0.027345736,-0.0612433,0.038101118,-0.06641872,-0.00939703,0.052195832,-0.03770301,-0.022270007,0.012196051,-0.041005902,-0.06945124,-0.027733557,-0.009639078,-0.059247572,0.04474978,0.00042829235,0.010153207,0.02728113,0.029422356,0.049308695,-0.038985588,-0.017589854,-0.02842523,-0.027386962,0.042216763,0.061242577,0.003747581,-0.024338258,-0.050467186,-0.013143215,0.0031099522,0.010997509,0.026045857,0.01815751,-0.027380131,0.01929404,-0.0022469186,0.111852795,0.07823112,0.024928685,0.059756078,-0.008221097,0.016979527,-0.039244134,-0.0019415446,0.011487329,-0.03280691,-0.08006135,-0.026343029,0.026450884,-0.053655412,-0.005154362,0.01307755,0.053237017,0.04086586,-0.0019484188,0.011518151,0.08618621,-0.041709326,0.047144253,0.077645905,-0.044002645,-0.16881582,-0.02115599,-0.011150404,-0.029005526,-0.022859793,-0.0107934745,0.009013299,0.0037840477,-0.023908136,-0.041892353,0.13362311,0.05498781,-0.0010903508,-0.027582854,0.02074264,0.08133009,-0.016295228,0.046583474,-0.012219358,-0.07110713,-0.031505097,0.04635908,0.13795494,0.004750067,0.044614047,0.018176915,0.020094909,-0.08733446,-0.14297998,0.045279857,0.0077459584,-0.019933412,0.059806284,0.0053598317,0.005684153,0.01267696,0.06831267,-0.03196309,0.0056615137,-0.023855256,0.14950311,0.028314097,0.0012290949,-0.034989975,0.014838987,-0.0043164054,-0.0380489,-0.002994491,-0.04658432,-0.023052199,0.009330306,0.019073954,-0.0048254183,0.039711606,0.026755748,0.05285787,0.005976852,-0.02769884,0.03918166,0.022543069,0.035913944,-0.030974701,-0.033151094,-0.061393328,0.012922418]],"total_duration":926343313,"load_duration":836913075,"prompt_eval_count":8}' + recorded_at: Tue, 25 Mar 2025 11:42:32 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_multiple_texts.yml b/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_multiple_texts.yml new file mode 100644 index 00000000..d5dcdb36 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_multiple_texts.yml @@ -0,0 +1,37 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/embed + body: + encoding: UTF-8 + string: '{"model":"snowflake-arctic-embed:22m","input":["Ruby","Python","JavaScript"]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 25 Mar 2025 11:42:36 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.038980126,0.020101948,-0.067413226,0.007685114,-0.021361317,0.028405204,-0.05964908,-0.09178641,-0.032397546,0.008366828,-0.05523459,0.014637846,0.0298761,0.03387804,-0.016674861,-0.044479024,0.008276525,-0.0022477629,-0.12195336,-0.008178106,0.008199949,0.07350191,0.01897805,0.013661541,-0.003947917,0.00030909953,0.006917925,-0.012626692,-0.09616951,-0.17709318,0.01293276,0.031847943,0.025997223,-0.042996813,0.03192809,-0.048060544,-0.0017395425,0.029812165,-0.026901668,-0.030327402,-0.0068094945,0.023497479,-0.019625092,-0.003110331,0.010590182,-0.027034454,0.04182794,-0.009884578,0.09661056,0.043840215,-0.037773125,-0.033335246,0.009626258,-0.013944384,-0.040054895,-0.0026200123,0.046114273,0.0049590026,-0.008846017,0.034012534,0.038100995,0.0013456035,-0.34869465,-0.06399822,0.06681992,-0.007770172,0.03451249,0.006695025,0.0016939766,-0.005725403,-0.059506737,-0.0011312707,-0.034694858,-0.0070268526,0.033973437,-0.07178208,0.0019529031,0.050796922,0.033150885,-0.04453945,-0.010778929,-0.01298108,0.01772847,0.027397834,0.017516151,0.05094088,-0.045374986,-0.031055674,0.0034364148,0.017342873,0.03724968,-0.020449797,0.03487508,-0.023868825,-0.0705106,0.045591667,0.0014132301,0.04102965,0.0082013225,0.3076015,0.041163538,-0.0075212517,0.0632507,-0.07494113,0.054058343,-0.013692275,-0.018088195,0.0039990763,-0.016607765,-0.00915819,0.03353369,-0.017990997,-0.008927891,0.018497262,0.04622437,-0.028729072,-0.0070351255,-0.005821854,0.0063457754,0.044443272,-0.03001723,0.014840464,-0.03265875,-0.017414864,-0.014599514,-0.022385433,-0.06727593,0.03655243,0.009642398,0.04557801,0.028509801,0.011939836,-0.062560804,-0.015390183,-0.0050801174,0.011868977,0.00253459,-0.07341563,-0.004279252,-0.07461656,-0.0006562158,-0.16768059,0.13006905,0.03295397,0.0145061985,0.000511846,0.009465702,0.037566304,-0.012595248,-0.042188045,0.015753305,0.02033451,-0.026321119,0.020434551,0.09113539,-0.014463864,-0.04273769,0.05132384,-0.007610653,0.036329918,0.010425151,0.0075439727,0.042681746,0.060391378,0.053032257,0.0071610347,0.018304583,-0.0199126,0.008234456,-0.026586238,-0.00048163044,0.018455869,0.012418799,0.061977547,-0.014351739,0.019218396,0.010331768,0.033490002,0.0102368975,-0.031620093,0.015966186,0.10022163,-0.03886677,-0.058662754,-0.010719046,0.011613407,0.055317454,0.021442259,0.041051246,0.05395217,-0.031625535,0.1561225,-0.04847817,0.012704446,-0.017351678,-0.005412353,0.05782586,0.063770935,0.028648905,-0.0010758642,-0.03315512,0.011804742,-0.054954775,0.034165937,-0.027770827,-0.040539972,0.01901002,-0.008845964,-0.009943114,-0.00007340114,0.008205162,0.014036151,0.015788715,0.013589957,0.040579043,-0.015481178,0.0013020202,-0.019863069,0.044024546,0.054241393,-0.019910982,0.019316196,-0.009067846,-0.06370655,-0.038542934,-0.005822525,-0.05564244,-0.020892167,-0.04894251,-0.012727646,0.05143602,0.06270096,0.022492254,0.11401925,0.014643738,0.0030262705,-0.036580373,0.05074049,0.04994587,-0.06580306,0.008364971,0.0012129012,-0.034641,-0.0046832887,0.012338395,-0.032140378,-0.045876123,-0.048861995,-0.019786038,0.12485802,0.06277426,-0.033950374,0.036432575,0.06035506,0.014863595,0.0047113854,-0.19050083,-0.032735668,-0.077262625,0.044320498,-0.059189577,-0.014459053,0.03718649,-0.0026039602,0.004493112,-0.011763187,-0.05504196,-0.025533773,-0.02048363,-0.023919607,-0.015506923,0.061790027,0.01816571,0.0130165955,0.04316555,0.020895818,0.034394037,-0.00560091,0.011984886,-0.06372637,0.02781977,0.020621277,0.06389801,0.0032279587,-0.064306036,-0.07160552,-0.05394653,0.032840647,-0.0021832213,0.030553438,0.0039347326,-0.026431374,-0.026453791,-0.024773262,0.14158836,0.00027325953,-0.003358694,0.031054376,0.005467873,-0.000014875217,-0.05249387,0.05296582,-0.013941867,-0.031785127,-0.07282081,-0.029387616,-0.0076221772,-0.032214306,0.008221592,0.01732765,0.01000591,0.015568096,-0.005231348,-0.012036904,0.07718011,-0.045315113,0.008787361,0.02417641,-0.015230668,-0.15053827,-0.0037556684,-0.01667005,-0.0013223562,-0.02209581,0.016655259,0.019694244,0.015031552,-0.037394483,-0.057655845,0.12982553,0.04818329,0.0077882116,-0.015061786,0.004192891,0.08628084,0.027619699,0.044403546,0.00034237612,-0.044426452,0.00096744276,0.06186224,0.16129373,0.024928987,-0.0073914034,0.0040016263,0.039090827,-0.08990263,-0.118701264,0.04410862,-0.03954887,-0.030827247,0.112970345,0.04363939,-0.021480395,0.03728192,0.044834364,-0.0009248547,0.032832358,-0.035760213,0.15535384,-0.0009505413,-0.0034093896,-0.029711511,0.008248596,-0.051867787,-0.012275803,0.012434058,-0.04902186,-0.011476671,0.0133925,-0.03379115,-0.0151935695,0.010195133,0.031876706,0.025932532,0.036986034,-0.01739396,0.017166032,0.05808856,0.030131826,-0.0008843879,-0.06526332,-0.09222386,-0.0049838475],[-0.007225496,0.037155706,-0.016906068,-0.030758644,-0.020417303,0.011231278,-0.06530078,-0.061754078,-0.020577524,-0.024164986,-0.035808578,0.015893035,0.061571326,0.020668881,0.016767306,-0.023883428,-0.01099219,0.025237663,-0.15266667,-0.013051586,-0.010288909,0.029873036,0.017107742,0.0315594,0.021337744,0.0034486242,0.013156374,-0.037249252,-0.13094991,-0.15867794,0.024068367,0.005509016,-0.0056714285,-0.042848945,-0.0045933733,-0.04299176,0.0020768172,0.04483032,-0.03212172,-0.027772011,-0.0036520734,-0.0075447895,-0.013391376,0.0045278594,0.04607957,0.0027125278,0.049626715,-0.021857744,0.06873977,0.04173157,-0.04370165,0.014249006,-0.0373972,-0.05551407,-0.045433797,-0.0011728521,0.044487648,-0.0074436087,-0.00975718,0.008799588,0.0073077497,0.024823438,-0.35174075,-0.012705645,0.04136241,0.047284245,0.0020329098,0.04765345,-0.02604234,-0.02548834,-0.02704063,0.017578213,0.01482943,0.0055936393,0.023184825,-0.041498873,-0.003050582,0.012843925,0.05516694,-0.03866418,0.02621437,0.032198943,0.01935349,-0.018680874,-0.013953387,0.0451372,-0.018057078,-0.012344732,0.04716202,0.0010259423,-0.028411478,0.04075236,0.024121404,0.0006758823,-0.0674563,0.009551461,-0.01973488,0.05264174,0.04568158,0.29859018,0.030333413,-0.04152799,0.016276676,-0.037692044,0.053379524,-0.029166088,-0.008381986,-0.03611233,0.021734668,-0.02926269,0.01770523,-0.021257408,-0.0026680147,0.0033788746,0.03192171,-0.02859868,-0.050017837,0.007628301,-0.005211484,0.055639394,-0.04813225,-0.00062740705,-0.023975527,-0.05272858,0.0012510746,-0.016620526,-0.05937839,0.014596674,-0.007940771,-0.0060859257,0.03417475,-0.020669967,-0.09361984,-0.019438276,-0.012983339,0.022100516,0.03252378,-0.052587945,0.016381664,-0.047060754,0.015694086,-0.1377361,0.10544033,0.0026725356,0.01146019,0.026346128,-0.025007993,0.004997534,-0.053778246,-0.038643032,0.023108022,0.016371924,-0.015227947,0.0020684898,0.124686636,0.02065184,-0.0070788977,0.031109046,-0.011467157,0.0051159468,0.0174688,0.019905413,-0.0069136377,0.032805618,0.029705629,-0.038734376,0.032078113,-0.01761205,0.01944323,-0.0030690655,0.018461121,0.018608272,-0.012803209,0.017234804,-0.05453963,-0.0014086623,-0.032340996,0.0010491384,0.038566574,-0.03347248,-0.015357926,0.08070545,-0.028756669,-0.046844523,-0.01529485,0.052366853,0.059635386,0.03260225,0.05999529,0.06562162,-0.025594424,0.19492106,-0.09446214,-0.02200547,0.021350436,-0.0047113174,0.03170546,0.032968767,-0.017730163,-0.023518713,-0.024787944,-0.014301349,-0.00028776744,0.015872791,0.015544321,-0.079372294,-0.005725175,0.017331447,-0.0056501715,-0.012182198,-0.009767331,-0.05171092,0.038543854,0.034115233,0.07627104,0.032627165,0.016347326,0.012965246,0.024923127,0.02650983,-0.0040691686,0.04411213,-0.02981039,-0.06744219,-0.030292222,-0.0021420228,-0.06861754,-0.0020280352,-0.08233997,-0.0059836525,0.037955742,0.039244626,0.034866735,0.11366857,0.02521095,0.018243132,0.024956543,0.027358694,0.011940862,-0.061406422,0.0018358993,0.015471496,-0.0400448,-0.024514355,0.020818526,-0.078023,-0.019798901,-0.046464335,-0.03319194,0.16930555,0.050408904,-0.013528864,0.007027566,0.0381429,0.0010658541,-0.011183001,-0.18296444,-0.025517514,-0.028616475,0.044594944,-0.002806602,-0.00036968052,0.040348303,0.022882342,-0.0099050915,-0.029638626,-0.009392766,-0.035751175,-0.02882233,-0.05017968,-0.031793848,0.104784735,0.026196804,0.025192862,0.0053355214,-0.009864406,0.07273947,0.029665705,-0.030834008,0.005743688,0.0130977845,0.027437972,0.042631894,0.02490531,-0.031600703,-0.055224583,-0.04933041,-0.0008777641,-0.002849928,0.06742398,-0.041109774,0.00045421268,-0.008093842,-0.026830377,0.18975478,0.0022353292,0.016124677,0.03874153,-0.01676804,0.0016409162,0.0022479978,0.039468583,-0.03589011,-0.005279329,-0.031004557,-0.014081007,0.058285933,-0.03845023,-0.022855511,0.008495943,-0.013061212,0.029775871,0.024829257,-0.015684903,0.09160675,-0.057623718,0.035138898,0.037533384,0.02173393,-0.20164658,-0.034627892,-0.013216875,0.04897353,-0.058580056,0.018308442,0.028224163,-0.011080451,0.020418232,-0.026639828,0.1152522,0.05399439,-0.017088734,-0.0043683355,0.04675239,0.055089362,0.01442295,0.019836834,-0.013131093,-0.040812545,0.0028349068,0.06096238,0.15055773,-0.0047997017,0.04041006,0.023423078,0.0068679894,-0.036161505,-0.11227965,0.027264446,-0.032434683,-0.033046544,0.05816228,0.019367868,-0.035861887,0.023473343,0.07127074,-0.036597442,0.00892375,-0.03424332,0.15918937,-0.028045062,0.01727863,-0.016116075,-0.033897277,-0.04147993,0.000102095604,0.0054549514,-0.054227076,-0.014035331,0.022229984,-0.0101330625,0.0061006444,0.031121459,0.034375396,0.027529038,0.02083103,-0.01970649,0.01220227,0.048865896,0.04224607,0.034099545,-0.018085487,-0.035159428,-0.057188712],[0.010182182,0.01467856,0.02307528,-0.031243263,-0.019379467,0.018989552,-0.04283347,-0.065710135,0.037127666,-0.00186089,-0.043939225,0.02675395,0.017098242,0.01003573,0.016530303,-0.07529927,-0.0045888554,-0.00783502,-0.16103624,-0.018049028,-0.023261337,0.0726829,0.03554955,0.007101789,-0.03776669,0.03965637,0.010605459,-0.034077637,-0.1356997,-0.17605451,0.017438654,0.021631619,-0.00033740848,-0.05291991,-0.021556789,-0.020458516,-0.035007652,0.015351501,-0.013426498,-0.03958441,0.007752372,-0.016570576,-0.046401996,-0.011264202,0.05016379,-0.013889148,0.023654828,-0.030822476,0.024557399,0.041917533,-0.057632543,-0.032482482,0.00036849198,-0.038682386,-0.046676703,0.050744284,-0.010942368,-0.031797383,0.010470975,0.016948372,0.0055663995,0.058688268,-0.36635372,0.025145743,0.07269215,0.019211076,-0.018371176,-0.007865585,-0.00085583143,0.015894871,0.038337328,-0.014794488,-0.012541673,0.01718971,0.02693935,-0.045785226,0.0036220509,0.021907976,0.06554055,-0.04263025,0.0019336614,0.020152396,0.016324878,0.030021766,-0.015724592,0.06523936,0.0062361993,-0.028796729,0.038781464,0.00485937,-0.04877486,0.035066955,0.003006257,-0.0022367106,-0.04857364,0.001250449,0.0014392686,0.034671582,0.018141782,0.30240846,0.018054346,0.003062208,0.040367432,-0.07040852,0.052332688,-0.0028175337,-0.028020458,-0.021599045,0.031913813,-0.03909125,0.0028893205,-0.017719263,0.0052999025,-0.0061596422,0.054935843,-0.0012574365,-0.016914988,-0.009276138,0.023673639,0.043957185,-0.027961437,0.025381606,-0.04037111,-0.0053644218,-0.01048436,0.0035398034,-0.06366181,0.025020782,-0.046017863,-0.011454832,0.055446308,0.00011163922,-0.09325482,0.019621197,0.022895223,0.03182137,0.0010375826,-0.03117694,0.025362851,-0.031175531,-0.018045994,-0.13010256,0.10690098,-0.010491627,0.025534678,-0.0049998793,-0.028496867,0.043118607,-0.026229834,-0.01440331,0.024678908,0.033322413,-0.04394492,-0.005047783,0.0846922,0.022463208,0.0030116427,-0.003502701,-0.006854317,0.029395698,0.026690561,0.02559026,0.059080407,0.08340788,0.032878075,-0.0951223,0.05720357,0.02495402,0.014070283,-0.0042589814,0.018304987,-0.024781907,-0.041739304,-0.025803747,-0.012889254,-0.008009496,-0.028856821,-0.0005779219,0.028763987,-0.051368624,0.0027247544,0.06316944,-0.026757175,-0.08121664,-0.010547304,0.025082018,0.03702747,0.012908532,0.03141585,0.06318691,-0.027946094,0.17676711,-0.082001895,-0.036393072,-0.034927875,0.021505699,0.015366971,0.043793295,-0.0021506813,0.011197076,-0.04681245,-0.07142668,0.009581391,0.035224073,-0.04230499,-0.03571502,0.044728618,0.013419941,0.04271971,-0.008869499,-0.03126791,-0.0022953814,0.09043066,0.02422671,0.031988394,-0.005063331,-0.01025437,0.028456746,0.005116802,0.047064006,0.006069893,0.018045707,-0.022872277,-0.04572793,0.009827904,0.0069014616,-0.040622003,-0.013080576,-0.04777706,0.0012043755,0.07896354,0.043710608,0.040280547,0.073466524,0.06464221,0.014187437,-0.04872054,0.031972423,0.012510081,-0.038348954,0.016539646,0.006683025,-0.040044174,-0.056529168,0.04949601,-0.09106357,-0.030466262,0.010563386,-0.029358381,0.18323456,0.092901036,0.0274177,0.015892414,0.03165387,-0.06160097,0.0015103974,-0.11125003,0.010338306,-0.04025745,0.03327973,-0.025003629,-0.03141167,0.06007851,-0.029752823,-0.025986204,-0.0014932271,-0.00599316,-0.021954508,-0.005476444,-0.029271869,-0.040407516,0.09515277,0.019253343,0.04248291,0.00067515706,-0.009261151,0.025339367,-0.014061599,-0.0580183,-0.020854905,0.018436473,-0.0027048623,0.05364179,0.03416436,-0.009260716,-0.0785917,-0.023255466,0.03542782,0.07159498,0.0069388812,-0.038117178,-0.012323471,-0.009949083,-0.005902662,0.1273025,0.0014150682,0.018899381,0.022011757,-0.048523538,-0.03720841,-0.009601104,0.0547053,0.013078509,-0.013740014,-0.047507983,-0.018159833,0.017327625,-0.028147077,-0.030314941,-0.0028794382,-0.045816995,0.0028496154,0.015196548,-0.007854572,0.10382276,-0.01617453,0.017708423,0.037362352,0.002230973,-0.17829818,-0.036029417,-0.0006612718,-0.014223209,-0.06350168,-0.030032892,0.023901368,-0.00077770976,0.02510791,-0.04697416,0.15435414,0.08471184,-0.018154247,-0.030085038,0.03331496,0.09898532,0.016086424,0.010282825,-0.018388266,-0.006998348,0.017570151,0.0994389,0.12580456,0.023195932,0.008063885,0.003250409,-0.005355925,-0.047599785,-0.13378266,-0.0018643751,-0.045305796,-0.020819422,0.06300365,0.00095856196,0.005435208,0.0057721534,0.031151773,-0.03753951,0.016918143,-0.044961866,0.13784775,-0.016061982,-0.00000515642,-0.008715281,-0.01241248,-0.0021270465,0.022557234,0.05173467,-0.04232277,0.008206349,0.012508353,-0.004212918,-0.01315854,0.048109457,0.00035447034,-0.0082567325,0.012337424,0.0065427353,0.036199752,0.030513138,0.039167494,-0.028987426,-0.016657345,-0.07125146,-0.020769335]],"total_duration":11837394,"load_duration":2672695,"prompt_eval_count":4}' + recorded_at: Tue, 25 Mar 2025 11:42:32 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_models_fetches_models_from_the_server_at_runtime.yml b/spec/fixtures/vcr_cassettes/providers_ollama_models_fetches_models_from_the_server_at_runtime.yml new file mode 100644 index 00000000..b719a3eb --- /dev/null +++ b/spec/fixtures/vcr_cassettes/providers_ollama_models_fetches_models_from_the_server_at_runtime.yml @@ -0,0 +1,35 @@ +--- +http_interactions: +- request: + method: get + uri: http://localhost:11434/api/tags + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 25 Mar 2025 11:42:33 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: '{ "models": [ { "details": { "families": [ "bert" ], "family": "bert", "format": "gguf", "parameter_size": "23M", "parent_model": "", "quantization_level": "F16" }, "digest": "bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb", "model": "snowflake-arctic-embed:22m", "modified_at": "2025-03-25T01:16:44.503745925Z", "name": "snowflake-arctic-embed:22m", "size": 45838698 }, { "details": { "families": [ "llama" ], "family": "llama", "format": "gguf", "parameter_size": "134.52M", "parent_model": "", "quantization_level": "Q4_0" }, "digest": "b0b2a46174385c0adcaa77ff245ffeced5fc4a61447b6f221b2beb5c5a760133", "model": "smollm:135m", "modified_at": "2025-03-25T01:16:43.495760964Z", "name": "smollm:135m", "size": 91739413 } ] }' + recorded_at: Tue, 25 Mar 2025 11:42:29 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_streaming_ask_with_streaming_works.yml b/spec/fixtures/vcr_cassettes/providers_ollama_streaming_ask_with_streaming_works.yml new file mode 100644 index 00000000..a70a2ebb --- /dev/null +++ b/spec/fixtures/vcr_cassettes/providers_ollama_streaming_ask_with_streaming_works.yml @@ -0,0 +1,101 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"smollm:135m","messages":[{"role":"user","content":"Count + from 1 to 3"}],"options":{"temperature":0.7},"stream":true}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Tue, 25 Mar 2025 11:42:35 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.7830333Z","message":{"role":"assistant","content":"Here"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.785646727Z","message":{"role":"assistant","content":" is"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.78827431Z","message":{"role":"assistant","content":" a"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.790801785Z","message":{"role":"assistant","content":" Python"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.793274065Z","message":{"role":"assistant","content":" function"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.795874434Z","message":{"role":"assistant","content":" that"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.7984565Z","message":{"role":"assistant","content":" counts"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.801031415Z","message":{"role":"assistant","content":" the"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.803573893Z","message":{"role":"assistant","content":" number"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.806231278Z","message":{"role":"assistant","content":" of"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.808821071Z","message":{"role":"assistant","content":" digits"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.81137248Z","message":{"role":"assistant","content":" in"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.813966219Z","message":{"role":"assistant","content":" a"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.816573617Z","message":{"role":"assistant","content":" string"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.81917068Z","message":{"role":"assistant","content":" and"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.821770818Z","message":{"role":"assistant","content":" returns"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.824417413Z","message":{"role":"assistant","content":" the"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.828470856Z","message":{"role":"assistant","content":" corresponding"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.831226755Z","message":{"role":"assistant","content":" integer"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.834009618Z","message":{"role":"assistant","content":" value"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.83662707Z","message":{"role":"assistant","content":":"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.839237899Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.841888936Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.844437076Z","message":{"role":"assistant","content":"```"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.847064226Z","message":{"role":"assistant","content":"python"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.849627235Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.852219701Z","message":{"role":"assistant","content":"def"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.854814973Z","message":{"role":"assistant","content":" count"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.857436203Z","message":{"role":"assistant","content":"_"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.860108144Z","message":{"role":"assistant","content":"digits"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.862759224Z","message":{"role":"assistant","content":"("},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.865434499Z","message":{"role":"assistant","content":"s"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.868125297Z","message":{"role":"assistant","content":"):"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.870760844Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.873382963Z","message":{"role":"assistant","content":" count"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.875996933Z","message":{"role":"assistant","content":" ="},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.878590201Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.881191519Z","message":{"role":"assistant","content":"0"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.883832365Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.886564727Z","message":{"role":"assistant","content":" for"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.889166207Z","message":{"role":"assistant","content":" digit"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.891879215Z","message":{"role":"assistant","content":" in"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.894548894Z","message":{"role":"assistant","content":" s"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.897207567Z","message":{"role":"assistant","content":":"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.899841625Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.902498196Z","message":{"role":"assistant","content":" if"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.905107832Z","message":{"role":"assistant","content":" digit"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.907789586Z","message":{"role":"assistant","content":"."},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.910502793Z","message":{"role":"assistant","content":"is"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.9143673Z","message":{"role":"assistant","content":"digit"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.917111538Z","message":{"role":"assistant","content":"():"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.919863033Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.922599882Z","message":{"role":"assistant","content":" count"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.925334577Z","message":{"role":"assistant","content":" +="},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.928067663Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.930770166Z","message":{"role":"assistant","content":"1"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.933410933Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.936033812Z","message":{"role":"assistant","content":" return"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.938684522Z","message":{"role":"assistant","content":" int"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.941285311Z","message":{"role":"assistant","content":"("},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.943928387Z","message":{"role":"assistant","content":"count"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.946601129Z","message":{"role":"assistant","content":")"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.94925745Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.951855253Z","message":{"role":"assistant","content":"```"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.954468729Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":181710972,"load_duration":5399447,"prompt_eval_count":16,"prompt_eval_duration":2211058,"eval_count":65,"eval_duration":173901215} + recorded_at: Tue, 25 Mar 2025 11:42:31 GMT +recorded_with: VCR 6.3.1 From 1298c19363ebb298637b61fe36151c80eedc28a3 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Tue, 25 Mar 2025 08:56:21 -0300 Subject: [PATCH 12/55] Resolve FIXMEs --- lib/ruby_llm/provider.rb | 8 ++++++++ lib/ruby_llm/providers/ollama/chat.rb | 7 +------ lib/tasks/ollama.rake | 14 +++++++------- spec/ruby_llm/providers/ollama/ollama_spec.rb | 14 +++++--------- 4 files changed, 21 insertions(+), 22 deletions(-) diff --git a/lib/ruby_llm/provider.rb b/lib/ruby_llm/provider.rb index c3b3c491..6f76711e 100644 --- a/lib/ruby_llm/provider.rb +++ b/lib/ruby_llm/provider.rb @@ -188,6 +188,14 @@ def providers def configured_providers providers.select { |_name, provider| provider.configured? }.values end + + def disable_all_providers + providers.each_value do |provider| + provider.configuration_requirements.each do |key| + RubyLLM.config.send "#{key}=", nil + end + end + end end end end diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index d86d12c4..cacfbf46 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -38,17 +38,12 @@ def generate_completion(_model, payload) def format_messages(messages) messages.map do |msg| { - role: format_role(msg.role), + role: msg.role.to_s, content: format_parts(msg) } end end - def format_role(role) - # FIXME: probably should validate this - role.to_s - end - def format_parts(msg) if msg.content.is_a?(Array) # Handle multi-part content (text, images, etc.) diff --git a/lib/tasks/ollama.rake b/lib/tasks/ollama.rake index b80f9fad..ac454932 100644 --- a/lib/tasks/ollama.rake +++ b/lib/tasks/ollama.rake @@ -4,15 +4,15 @@ require 'ruby_llm' def pull_model(ollama_library_model_spec, description) warn "+ pulling #{ollama_library_model_spec} from Ollama library (#{description})" - payload = { - model: ollama_library_model_spec, - insecure: false, - stream: false - } # ugly but effective - # FIXME: possibly needs timeout adjustment since it downloads models - response = RubyLLM::Providers::Ollama.send :post, '/api/pull', payload + response = RubyLLM::Providers::Ollama.send( + :post, '/api/pull', { + model: ollama_library_model_spec, + insecure: false, + stream: false + } + ) unless response.body['status'] == 'success' raise 'non-successful response when pulling model; check Ollama server logs' diff --git a/spec/ruby_llm/providers/ollama/ollama_spec.rb b/spec/ruby_llm/providers/ollama/ollama_spec.rb index 56ea89b2..306957df 100644 --- a/spec/ruby_llm/providers/ollama/ollama_spec.rb +++ b/spec/ruby_llm/providers/ollama/ollama_spec.rb @@ -3,23 +3,19 @@ require 'spec_helper' require 'dotenv/load' -RSpec.shared_context 'with configured local Ollama server' do +RSpec.shared_context 'with configured local Ollama server as sole provider' do before :all do RubyLLM.configure do |config| - config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', 'http://localhost:11434') + # NOTE: other tests will need to ensure relevant providers are enabled as needed + RubyLLM::Provider.disable_all_providers - # FIXME: need a sane internal API to do this, like RubyLLM.disable_all_providers() - # FIXME: this will break other tests depending on run order - config.openai_api_key = nil - config.anthropic_api_key = nil - config.gemini_api_key = nil - config.deepseek_api_key = nil + config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', 'http://localhost:11434') end end end RSpec.describe RubyLLM::Providers::Ollama do - include_context 'with configured local Ollama server' + include_context 'with configured local Ollama server as sole provider' describe '.models' do it 'fetches models from the server at runtime' do # rubocop:disable RSpec/MultipleExpectations,RSpec/ExampleLength From 88ca59e246113a4596053c1100bc8ea10788b471 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Mon, 24 Mar 2025 23:31:01 -0300 Subject: [PATCH 13/55] Hint about need for models.refresh! --- lib/ruby_llm/providers/ollama/models.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb index 136414fc..0b81a49c 100644 --- a/lib/ruby_llm/providers/ollama/models.rb +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -17,6 +17,14 @@ def models_url # # create an alias gemma3 for gemma3:27b + # NOTE: Unlike other providers for well known APIs with stable model + # offerings, the Ollama provider deals with local servers which + # might have arbitrarily named models or even zero models installed. + # + # Thus, this provider can't ship hardcoded assumptions in models.json + # and thus no Ollama models will be known at runtime, so you'll need a + # `RubyLLM.models.refresh!` to populate your instance's models. + def list_models return [] unless enabled? From 5dac2bc227418454bc9f9ee3f03d3ea5fec3d229 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Tue, 25 Mar 2025 09:35:44 -0300 Subject: [PATCH 14/55] Expose more model metadata --- lib/ruby_llm/providers/ollama/models.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb index 0b81a49c..cc6a97f4 100644 --- a/lib/ruby_llm/providers/ollama/models.rb +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -49,14 +49,20 @@ def parse_list_models_response(response, slug, capabilities) # rubocop:disable M provider: slug, type: capabilities.model_type(model_id), family: model['family'], - metadata: {}, context_window: capabilities.context_window_for(model_id), max_tokens: capabilities.max_tokens_for(model_id), supports_vision: capabilities.supports_vision?(model_id), supports_functions: capabilities.supports_functions?(model_id), supports_json_mode: capabilities.supports_json_mode?(model_id), input_price_per_million: capabilities.input_price_for(model_id), - output_price_per_million: capabilities.output_price_for(model_id) + output_price_per_million: capabilities.output_price_for(model_id), + metadata: { + byte_size: model['size']&.to_i, + parameter_size: model.dig('details', 'parameter_size'), + quantization_level: model.dig('details', 'quantization_level'), + format: model.dig('details', 'format'), + parent_model: model.dig('details', 'parent_model') + } ) end end From 099978e53c3d4e5f8551521a9aff0e7f9b5681d5 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 09:05:20 -0300 Subject: [PATCH 15/55] Streamline usage in docs --- docs/guides/getting-started.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index 960a414d..5fad91b6 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -30,17 +30,12 @@ RubyLLM.configure do |config| config.anthropic_api_key = ENV['ANTHROPIC_API_KEY'] config.gemini_api_key = ENV['GEMINI_API_KEY'] config.deepseek_api_key = ENV['DEEPSEEK_API_KEY'] + config.ollama_api_base_url = 'http://localhost:11434' end ``` Alternatively, you can point to an Ollama instance; here it is configured to the most common address when Ollama is installed locally: ``` -RubyLLM.configure do |config| - config.ollama_api_base_url = 'http://localhost:11434' -end - -# Needs to be called to populate Ollama models before using any -RubyLLM.models.refresh! ``` ## Your First Chat @@ -75,7 +70,8 @@ claude_chat.ask "Tell me about Ruby programming language" gemini_chat = RubyLLM.chat(model: 'gemini-2.0-flash') gemini_chat.ask "What are the best Ruby gems for machine learning?" -# Use an Ollama model (pull it into the server first; consult Ollama docs): +# Use an Ollama model - pull it to the server first (consult Ollama docs) and then do models.refresh! before using it: +RubyLLM.models.refresh! # Needs to be called to populate Ollama models before using any ollama_chat = RubyLLM.chat(model: 'gemma3:latest') ollama_chat.ask "What is Alphabet?" ``` From d668c75f7b6551f70770c26ad5f5e01c9e90b922 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 09:13:30 -0300 Subject: [PATCH 16/55] Remove leftovers --- lib/ruby_llm/providers/ollama.rb | 4 ---- lib/ruby_llm/providers/ollama/models.rb | 2 -- 2 files changed, 6 deletions(-) diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index 3cef062c..dd56f6d5 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -12,10 +12,6 @@ module Ollama module_function - def enabled? - !!RubyLLM.config.ollama_api_base_url - end - def api_base RubyLLM.config.ollama_api_base_url end diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb index cc6a97f4..0e8dfab5 100644 --- a/lib/ruby_llm/providers/ollama/models.rb +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -26,8 +26,6 @@ def models_url # `RubyLLM.models.refresh!` to populate your instance's models. def list_models - return [] unless enabled? - response = connection.get('api/tags') do |req| req.headers.merge! headers end From ad7ce33476e53a2d5e0c04c018e3a49f5f5bf76b Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 09:38:07 -0300 Subject: [PATCH 17/55] Streamline provider to be more like OpenAI's --- lib/ruby_llm/providers/ollama/chat.rb | 56 ++++--------------- lib/ruby_llm/providers/ollama/embeddings.rb | 24 +++++--- lib/ruby_llm/providers/ollama/streaming.rb | 61 +++++++++++++-------- 3 files changed, 64 insertions(+), 77 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index cacfbf46..b681fa50 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -5,8 +5,13 @@ module Providers module Ollama # Chat methods for the Ollama API implementation module Chat - # Must be public for Provider to use - def complete(messages, tools:, temperature:, model:, &block) # rubocop:disable Metrics/MethodLength + module_function + + def completion_url + 'api/chat' + end + + def render_payload(messages, tools:, temperature:, model:, stream: false) # rubocop:disable Metrics/MethodLength raise NotImplementedError, 'tool use not implemented in Ollama at this time' if tools.any? payload = { @@ -14,61 +19,20 @@ def complete(messages, tools:, temperature:, model:, &block) # rubocop:disable M messages: format_messages(messages), options: { temperature: temperature - } + }, + stream: stream } - - if block_given? - payload[:stream] = true - stream_completion(model, payload, &block) - else - payload[:stream] = false - generate_completion(model, payload) - end - end - - # Format methods can be private - private - - def generate_completion(_model, payload) - url = 'api/chat' - response = post(url, payload) - parse_completion_response(response) end def format_messages(messages) messages.map do |msg| { role: msg.role.to_s, - content: format_parts(msg) + content: msg.content.to_s } end end - def format_parts(msg) - if msg.content.is_a?(Array) - # Handle multi-part content (text, images, etc.) - msg.content.map { |part| format_part(part) } - else - # Simple text content - msg.content.to_s - end - end - - def format_part(part) # rubocop:disable Metrics/MethodLength - case part[:type] - when 'text' - { text: part[:text] } - when 'image' - Media.format_image(part) - when 'pdf' - Media.format_pdf(part) - when 'audio' - Media.format_audio(part) - else - { text: part.to_s } - end - end - def parse_completion_response(response) data = response.body diff --git a/lib/ruby_llm/providers/ollama/embeddings.rb b/lib/ruby_llm/providers/ollama/embeddings.rb index 8d2eb722..93b02b59 100644 --- a/lib/ruby_llm/providers/ollama/embeddings.rb +++ b/lib/ruby_llm/providers/ollama/embeddings.rb @@ -5,22 +5,30 @@ module Providers module Ollama # Embeddings methods for the Ollama API integration module Embeddings - # Must be public for Provider module - def embed(text, model:) # rubocop:disable Metrics/MethodLength - payload = { + module_function + + def embedding_url + 'api/embed' + end + + def render_embedding_payload(text, model:) + { model: model, input: format_text_for_embedding(text) } + end - url = 'api/embed' - response = post(url, payload) + def parse_embedding_response(response) vectors = response.body['embeddings'] + model_id = response.body['model'] + input_tokens = response.body['prompt_eval_count'] || 0 + vectors = vectors.first if vectors.size == 1 Embedding.new( - vectors: text.is_a?(String) ? vectors.first : vectors, - model: model, + vectors: vectors, + model: model_id, # only available when passing a single string input - input_tokens: response.body['prompt_eval_count'] || 0 + input_tokens: input_tokens ) end diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index b268ee01..d624e712 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -5,35 +5,50 @@ module Providers module Ollama # Streaming methods for the Ollama API implementation module Streaming - # Need to make stream_completion public for chat.rb to access - def stream_completion(_model, payload, &block) - url = 'api/chat' - accumulator = StreamAccumulator.new + module_function - post(url, payload) do |req| - req.options.on_data = stream_handler(accumulator, &block) + def stream_url + completion_url + end + + def handle_stream(&block) + to_json_stream do |data| + # FIXME: for some reason, there's an unexpected final call + # from on_data with the complete response as an Array. + # + # It is skipped here, but this smells a bit; this method shouldn't + # need to be overridden just for this. Will look into it + done = data.is_a?(Array) || data['done'] + + block.call(build_chunk(data)) if data && !done end + end - accumulator.to_message + def build_chunk(data) + raise 'wtf' if data.is_a?(Array) + + chunk = Chunk.new( + role: :assistant, + content: data.dig('message', 'content'), + model_id: data['model'], + + # NOTE: unavailable in the response - https://ollama.readthedocs.io/en/api/#streaming-responses + input_tokens: nil, + output_tokens: nil + ) end - private + def handle_sse(chunk, parser, env, &block) + # NOTE: Ollama uses NDJSON rather than standard SSE here + content_type = env.response_headers['content-type'] + unless content_type =~ %r{application/x-ndjson} + raise "Unexpected content-type when parsing Ollama streaming response: #{content_type}" + end - # Handle streaming - def stream_handler(accumulator, &block) # rubocop:disable Metrics/MethodLength - to_json_stream do |data| - chunk = Chunk.new( - role: :assistant, - content: data.dig('message', 'content'), - model_id: data['model'], - - # NOTE: unavailable in the response - https://ollama.readthedocs.io/en/api/#streaming-responses - input_tokens: nil, - output_tokens: nil - ) - - accumulator.add(chunk) - block.call(chunk) + chunk.split(/\n+/).each do |line| + next if line.length == 0 + parsed_data = JSON.parse(line) + block.call(parsed_data) end end end From 0f8684c7fdd9c63175ca0fa47d382f095af30f9a Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 12:16:43 -0300 Subject: [PATCH 18/55] Rubocop appeasement --- lib/ruby_llm/providers/ollama/chat.rb | 4 ++-- lib/ruby_llm/providers/ollama/streaming.rb | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index b681fa50..39d64b3e 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -11,10 +11,10 @@ def completion_url 'api/chat' end - def render_payload(messages, tools:, temperature:, model:, stream: false) # rubocop:disable Metrics/MethodLength + def render_payload(messages, tools:, temperature:, model:, stream: false) raise NotImplementedError, 'tool use not implemented in Ollama at this time' if tools.any? - payload = { + { model: model, messages: format_messages(messages), options: { diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index d624e712..68cddb8e 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -27,7 +27,7 @@ def handle_stream(&block) def build_chunk(data) raise 'wtf' if data.is_a?(Array) - chunk = Chunk.new( + Chunk.new( role: :assistant, content: data.dig('message', 'content'), model_id: data['model'], @@ -38,7 +38,7 @@ def build_chunk(data) ) end - def handle_sse(chunk, parser, env, &block) + def handle_sse(chunk, _parser, env, &block) # NOTE: Ollama uses NDJSON rather than standard SSE here content_type = env.response_headers['content-type'] unless content_type =~ %r{application/x-ndjson} @@ -46,7 +46,8 @@ def handle_sse(chunk, parser, env, &block) end chunk.split(/\n+/).each do |line| - next if line.length == 0 + next if line.empty? + parsed_data = JSON.parse(line) block.call(parsed_data) end From 4cd54fb3fc7c4be476739d954999eff87f484ac0 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 12:13:23 -0300 Subject: [PATCH 19/55] WIP: fold back all ollama specs into existing files Breaks all tests since the `refresh!` call clobbers all known models except those pulled from Ollama's, since only Ollama is configured when it runs (and live API calls go out with the `TEST` key otherwise). --- lib/ruby_llm/provider.rb | 8 -- spec/ruby_llm/chat_spec.rb | 3 +- spec/ruby_llm/chat_streaming_spec.rb | 3 +- spec/ruby_llm/embeddings_spec.rb | 3 +- spec/ruby_llm/providers/ollama/ollama_spec.rb | 88 ------------------- spec/spec_helper.rb | 7 ++ 6 files changed, 13 insertions(+), 99 deletions(-) delete mode 100644 spec/ruby_llm/providers/ollama/ollama_spec.rb diff --git a/lib/ruby_llm/provider.rb b/lib/ruby_llm/provider.rb index 6f76711e..c3b3c491 100644 --- a/lib/ruby_llm/provider.rb +++ b/lib/ruby_llm/provider.rb @@ -188,14 +188,6 @@ def providers def configured_providers providers.select { |_name, provider| provider.configured? }.values end - - def disable_all_providers - providers.each_value do |provider| - provider.configuration_requirements.each do |key| - RubyLLM.config.send "#{key}=", nil - end - end - end end end end diff --git a/spec/ruby_llm/chat_spec.rb b/spec/ruby_llm/chat_spec.rb index 7ced4f95..f35c0cf7 100644 --- a/spec/ruby_llm/chat_spec.rb +++ b/spec/ruby_llm/chat_spec.rb @@ -11,7 +11,8 @@ 'claude-3-5-haiku-20241022', 'gemini-2.0-flash', 'deepseek-chat', - 'gpt-4o-mini' + 'gpt-4o-mini', + 'smollm:135m' ].each do |model| it "#{model} can have a basic conversation" do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) diff --git a/spec/ruby_llm/chat_streaming_spec.rb b/spec/ruby_llm/chat_streaming_spec.rb index a42bf9ca..0f40e121 100644 --- a/spec/ruby_llm/chat_streaming_spec.rb +++ b/spec/ruby_llm/chat_streaming_spec.rb @@ -11,7 +11,8 @@ 'claude-3-5-haiku-20241022', 'gemini-2.0-flash', 'deepseek-chat', - 'gpt-4o-mini' + 'gpt-4o-mini', + 'smollm:135m' ].each do |model| it "#{model} supports streaming responses" do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) diff --git a/spec/ruby_llm/embeddings_spec.rb b/spec/ruby_llm/embeddings_spec.rb index 76a62fbd..6d4813df 100644 --- a/spec/ruby_llm/embeddings_spec.rb +++ b/spec/ruby_llm/embeddings_spec.rb @@ -12,7 +12,8 @@ describe 'basic functionality' do [ 'text-embedding-004', # gemini - 'text-embedding-3-small' # openai + 'text-embedding-3-small', # openai + 'snowflake-arctic-embed:22m' # ollama ].each do |model| it "#{model} can handle a single text" do # rubocop:disable RSpec/MultipleExpectations embedding = RubyLLM.embed(test_text, model: model) diff --git a/spec/ruby_llm/providers/ollama/ollama_spec.rb b/spec/ruby_llm/providers/ollama/ollama_spec.rb deleted file mode 100644 index 306957df..00000000 --- a/spec/ruby_llm/providers/ollama/ollama_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require 'dotenv/load' - -RSpec.shared_context 'with configured local Ollama server as sole provider' do - before :all do - RubyLLM.configure do |config| - # NOTE: other tests will need to ensure relevant providers are enabled as needed - RubyLLM::Provider.disable_all_providers - - config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', 'http://localhost:11434') - end - end -end - -RSpec.describe RubyLLM::Providers::Ollama do - include_context 'with configured local Ollama server as sole provider' - - describe '.models' do - it 'fetches models from the server at runtime' do # rubocop:disable RSpec/MultipleExpectations,RSpec/ExampleLength - RubyLLM.models.refresh! - - # NOTE: to ensure relevant models are pulled into your local server, do - # bundle exec rake ollama:install_models_for_specs - - expect(RubyLLM.models).to include( - an_object_having_attributes(provider: 'ollama', id: 'smollm:135m') - ) - expect(RubyLLM.models).to include( - an_object_having_attributes(provider: 'ollama', id: 'snowflake-arctic-embed:22m') - ) - end - end - - describe '.chat' do - let(:chat) { RubyLLM.chat(model: 'smollm:135m', provider: 'ollama') } - - it 'ask works' do - response = chat.ask('Count from 1 to 3') - expect(response.content).to be_present - end - end - - describe 'streaming' do - let(:chat) { RubyLLM.chat(model: 'smollm:135m', provider: 'ollama') } - - it 'ask with streaming works' do # rubocop:disable RSpec/MultipleExpectations,RSpec/ExampleLength - chunks = [] - - chat.ask('Count from 1 to 3') do |chunk| - chunks << chunk - end - - expect(chunks).not_to be_empty - expect(chunks.first).to be_a(RubyLLM::Chunk) - end - end - - describe 'embeddings' do - let(:test_text) { "Ruby is a programmer's best friend" } - let(:test_texts) { %w[Ruby Python JavaScript] } - let(:model) { 'snowflake-arctic-embed:22m' } - - it 'can handle a single text' do # rubocop:disable RSpec/MultipleExpectations - # FIXME: need a provider: param just like in chat() - # embedding = RubyLLM.embed(test_text, model: model, provider: 'ollama') - - embedding = RubyLLM.embed(test_text, model: model) - expect(embedding.vectors).to be_an(Array) - expect(embedding.vectors.first).to be_a(Float) - expect(embedding.model).to eq(model) - expect(embedding.input_tokens).to be >= 0 - end - - it 'can handle multiple texts' do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations - # FIXME: need a provider: param just like in chat() - # embeddings = RubyLLM.embed(test_texts, model: model, provider: 'ollama') - - embeddings = RubyLLM.embed(test_texts, model: model) - expect(embeddings.vectors).to be_an(Array) - expect(embeddings.vectors.size).to eq(3) - expect(embeddings.vectors.first).to be_an(Array) - expect(embeddings.model).to eq(model) - expect(embeddings.input_tokens).to be >= 0 - end - end -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 2e05f5ce..26df0428 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -87,6 +87,13 @@ RSpec.shared_context 'with configured RubyLLM' do before do RubyLLM.configure do |config| + # NOTE: to ensure relevant models are pulled into your local server, do + # bundle exec rake ollama:install_models_for_specs + config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', 'http://localhost:11434') + + # FIXME: this clobbers the model list from models.json and results in all tests except for ollama's to fail + RubyLLM.models.refresh! + config.openai_api_key = ENV.fetch('OPENAI_API_KEY', 'test') config.anthropic_api_key = ENV.fetch('ANTHROPIC_API_KEY', 'test') config.gemini_api_key = ENV.fetch('GEMINI_API_KEY', 'test') From af550155beccddacbd42e9bba4c2fd2d6d5f65c3 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 12:43:40 -0300 Subject: [PATCH 20/55] Small fixes --- docs/guides/getting-started.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index 5fad91b6..cbb25866 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -34,10 +34,6 @@ RubyLLM.configure do |config| end ``` -Alternatively, you can point to an Ollama instance; here it is configured to the most common address when Ollama is installed locally: -``` -``` - ## Your First Chat Let's start with a simple chat interaction: From 5cdbd1a445b66a6211d9ab8b32b9f6d0c49be364 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 14:21:40 -0300 Subject: [PATCH 21/55] WIP: closer to a refresh! solution --- ...5m_can_handle_multi-turn_conversations.yml | 61 +++++++++++ ...llm_135m_can_have_a_basic_conversation.yml | 74 +++++++++++++ ...ollm_135m_supports_streaming_responses.yml | 100 +++++++++++++++++ ...tic-embed_22m_can_handle_a_single_text.yml | 34 ++++++ ...ic-embed_22m_can_handle_multiple_texts.yml | 33 ++++++ ...nd_returns_a_chainable_models_instance.yml | 28 +++++ ...ls_refresh_works_as_a_class_method_too.yml | 28 +++++ .../providers_ollama_chat_ask_works.yml | 45 -------- ...ma_embeddings_can_handle_a_single_text.yml | 38 ------- ...a_embeddings_can_handle_multiple_texts.yml | 37 ------- ...ches_models_from_the_server_at_runtime.yml | 35 ------ ...ama_streaming_ask_with_streaming_works.yml | 101 ------------------ spec/ruby_llm/chat_spec.rb | 1 + spec/spec_helper.rb | 15 +-- 14 files changed, 367 insertions(+), 263 deletions(-) create mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_handle_multi-turn_conversations.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_have_a_basic_conversation.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_streaming_responses_smollm_135m_supports_streaming_responses.yml create mode 100644 spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml create mode 100644 spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml delete mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_chat_ask_works.yml delete mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_a_single_text.yml delete mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_multiple_texts.yml delete mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_models_fetches_models_from_the_server_at_runtime.yml delete mode 100644 spec/fixtures/vcr_cassettes/providers_ollama_streaming_ask_with_streaming_works.yml diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_handle_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_handle_multi-turn_conversations.yml new file mode 100644 index 00000000..8326a281 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_handle_multi-turn_conversations.yml @@ -0,0 +1,61 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"smollm:135m","messages":[{"role":"user","content":"Who was + Ruby''s creator?"}],"options":{"temperature":0.7},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 26 Mar 2025 17:20:39 GMT + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: '{"model":"smollm:135m","created_at":"2025-03-26T17:20:39.40000571Z","message":{"role":"assistant","content":"Ruby''s + creator is unknown, but some theories suggest that she might have been a member + of a team or group of women who worked on the project. Here are a few examples:\n\n1. + **Sophie Couture**: The only person to receive the Ruby Award, a posthumous + honor given to women for outstanding performance in a musical, dance, or other + performance art project. This is a notable exception, as it''s unclear whether + she was a member of a team or a single woman on the project.\n2. **Sitse Selvin**: + A member of a team led by her brother, Robert Selvin, who worked with the + project from 1975 to 1983. He is believed to have been a talented pianist + and composer, but his real role remains unknown.\n3. **Vincent Chesnutt**: + A woman who was a member of a team led by her brother, Vincent Chesnutt, who + worked with the project from 1975 to 2006. She is believed to have been a + talented pianist and composer, but her real role remains unknown.\n4. **Sandra + Lee Cox**: A woman who was a member of a team led by her brother, Sandra Cox, + who worked with the project from 1983 to 2007. She is believed to have been + a talented pianist and composer, but her real role remains unknown.\n5. **Rachel + Vash**: A woman who was a member of a team led by her brother, Rachel Vash, + who worked with the project from 1994 to 2008. She is believed to have been + a talented pianist and composer, but her real role remains unknown.\n6. **Laurie + Lidwell**: A woman who was a member of a team led by her brother, Laurie Lidwell, + who worked with the project from 1994 to 2008. She is believed to have been + a talented pianist and composer, but her real role remains unknown.\n7. **Lindsey + Foyne**: A woman who was a member of a team led by her brother, Lindsey Foyne, + who worked with the project from 1994 to 2008. She is believed to have been + a talented pianist and composer, but her real role remains unknown.\n\nThese + are just a few examples of the many people who might have been involved in + the Ruby Award or on the project. While it''s difficult to provide an exact + count, it''s clear that Rachel Vash was a key part of the project."},"done_reason":"stop","done":true,"total_duration":2071286463,"load_duration":5108714,"prompt_eval_count":15,"prompt_eval_duration":8958877,"eval_count":548,"eval_duration":2056874892}' + recorded_at: Wed, 26 Mar 2025 17:20:39 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_have_a_basic_conversation.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_have_a_basic_conversation.yml new file mode 100644 index 00000000..118d6ebb --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_have_a_basic_conversation.yml @@ -0,0 +1,74 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"smollm:135m","messages":[{"role":"user","content":"What''s + 2 + 2?"}],"options":{"temperature":0.7},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 26 Mar 2025 17:18:34 GMT + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: '{"model":"smollm:135m","created_at":"2025-03-26T17:18:34.665407999Z","message":{"role":"assistant","content":"What + a great question! The concept of \"1+1\" is a fascinating mathematical operation + that can be understood in various ways. Here are some possible interpretations:\n\n1. + **Counting numbers**: In counting notation (binary, octal, hexadecimal, etc.), + 2 + 2 represents the binary representation of \"1\". This means that it''s + equivalent to adding 1 to itself twice!\n2. **Algebraic operations**: When + two integers are added, they become equivalent by definition. For example, + `a + b = c`, where a is positive and b is negative (i.e., 3+4=7). This equation + shows that 2 + 2 equals 5, which can be considered as \"1+1\" or \"2+2\".\n3. + **Real-world applications**: In some cases, 2 + 2 could represent a real number, + like the sum of two integers: `a + b = c`, where a is positive and b is negative + (i.e., -3). This equation shows that 1 plus 2 equals 5 in this case.\n4. **Fractional + part**: In fractional notation (fractional part), 2+2 could represent the + fractional part of \"1\", like `a/b = 0.2`, where a is positive and b is negative + (i.e., -3). This fraction shows that 2 + 2 equals 5 in this case as well, + albeit with a slightly greater numerator.\n5. **Algebraic expressions**: When + two expressions are algebraic expressions (expression without fractions), + they can be treated similarly to the real-world examples we mentioned earlier: + `a = ab`, where a is positive and b is negative. This expression shows that + 2 + 2 equals 5 in this case, albeit with an extra fraction element added.\n6. + **Symbolic manipulation**: In symbolic manipulation, like in algebra or combinatorics, + the addition of two integers can be represented as `a = ab`, where a is positive + and b is negative. This expression shows that 1 + 2 equals 5 in this case + by definition.\n7. **In mathematics education**: The concept of \"1+1\" has + been part of many mathematical proofs and discussions, often referred to as + \"integral summation\" or \"algebraic summation.\" These ideas can be seen + as a way of representing the summation of two integers that are equivalent + by definition.\n8. **Philosophical significance**: The concept of 2 + 2 raises + fundamental questions about the nature of numbers and their relationship to + reality: What is real, and what is an additive identity? Does zero have a + place in mathematics or can it be treated as a number without being additive + (i.e., 1 cannot equal zero)?\n9. **Mathematical intuition**: The concept of + 2 + 2 can evoke strong mathematical intuitions about the distribution of integers + among positive and negative numbers, which is essential to understanding some + other important properties in mathematics, like the prime number theorem or + the distribution of irrational numbers.\n10. **Philosophical implications**: + The idea of 2 + 2 has been a subject of philosophical debate, with different + interpretations (e.g., \"additive identity\" or \"non-additional\" as an additive + identity) that have challenged our understanding of mathematics and its relationship + to reality.\n\nThese are just a few examples of the many ways in which \"1+1\" + can be understood in various mathematical contexts."},"done_reason":"stop","done":true,"total_duration":3245290565,"load_duration":322808107,"prompt_eval_count":17,"prompt_eval_duration":13628372,"eval_count":733,"eval_duration":2908275176}' + recorded_at: Wed, 26 Mar 2025 17:18:34 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_smollm_135m_supports_streaming_responses.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_smollm_135m_supports_streaming_responses.yml new file mode 100644 index 00000000..390fd1fd --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_streaming_responses_smollm_135m_supports_streaming_responses.yml @@ -0,0 +1,100 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"smollm:135m","messages":[{"role":"user","content":"Count + from 1 to 3"}],"options":{"temperature":0.7},"stream":true}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Wed, 26 Mar 2025 17:18:38 GMT + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.100562561Z","message":{"role":"assistant","content":"Here"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.104881895Z","message":{"role":"assistant","content":" is"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.109163649Z","message":{"role":"assistant","content":" a"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.113094772Z","message":{"role":"assistant","content":" Python"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.116972445Z","message":{"role":"assistant","content":" function"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.120733929Z","message":{"role":"assistant","content":" that"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.124307882Z","message":{"role":"assistant","content":" counts"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.128387505Z","message":{"role":"assistant","content":" the"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.132135107Z","message":{"role":"assistant","content":" number"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.13578816Z","message":{"role":"assistant","content":" of"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.139146823Z","message":{"role":"assistant","content":" digits"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.142487577Z","message":{"role":"assistant","content":" in"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.145833149Z","message":{"role":"assistant","content":" a"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.149574122Z","message":{"role":"assistant","content":" string"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.153284265Z","message":{"role":"assistant","content":":"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.156734808Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.160126451Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.163615804Z","message":{"role":"assistant","content":"```"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.17177554Z","message":{"role":"assistant","content":"python"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.176081914Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.180185308Z","message":{"role":"assistant","content":"def"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.184394831Z","message":{"role":"assistant","content":" count"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.188109373Z","message":{"role":"assistant","content":"_"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.191586197Z","message":{"role":"assistant","content":"digits"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.19498339Z","message":{"role":"assistant","content":"("},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.198339013Z","message":{"role":"assistant","content":"s"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.201589705Z","message":{"role":"assistant","content":"):"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.205084617Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.208314251Z","message":{"role":"assistant","content":" result"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.211665804Z","message":{"role":"assistant","content":" ="},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.215361477Z","message":{"role":"assistant","content":" {}"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.219057039Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.222497532Z","message":{"role":"assistant","content":" for"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.226058135Z","message":{"role":"assistant","content":" char"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.229534369Z","message":{"role":"assistant","content":" in"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.232965531Z","message":{"role":"assistant","content":" s"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.236452504Z","message":{"role":"assistant","content":":"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.240042996Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.24349197Z","message":{"role":"assistant","content":" if"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.247069563Z","message":{"role":"assistant","content":" char"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.250678586Z","message":{"role":"assistant","content":" not"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.254176448Z","message":{"role":"assistant","content":" in"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.257590831Z","message":{"role":"assistant","content":" result"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.260969383Z","message":{"role":"assistant","content":":"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.264846698Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.268374811Z","message":{"role":"assistant","content":" result"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.272071133Z","message":{"role":"assistant","content":"["},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.275484896Z","message":{"role":"assistant","content":"char"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.278916879Z","message":{"role":"assistant","content":"]"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.282696043Z","message":{"role":"assistant","content":" ="},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.286494845Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.290218278Z","message":{"role":"assistant","content":"0"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.293935121Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.297789735Z","message":{"role":"assistant","content":" result"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.301722288Z","message":{"role":"assistant","content":"["},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.305849971Z","message":{"role":"assistant","content":"char"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.309743804Z","message":{"role":"assistant","content":"]"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.313734477Z","message":{"role":"assistant","content":" +="},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.317732522Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.321434594Z","message":{"role":"assistant","content":"1"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.325045267Z","message":{"role":"assistant","content":"\n "},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.32905447Z","message":{"role":"assistant","content":" return"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.332839624Z","message":{"role":"assistant","content":" result"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.336708717Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.34039667Z","message":{"role":"assistant","content":"```"},"done":false} + {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.343979733Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":261623797,"load_duration":5114494,"prompt_eval_count":16,"prompt_eval_duration":12307330,"eval_count":66,"eval_duration":243867952} + recorded_at: Wed, 26 Mar 2025 17:18:38 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml new file mode 100644 index 00000000..0ce408e9 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml @@ -0,0 +1,34 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/embed + body: + encoding: UTF-8 + string: '{"model":"snowflake-arctic-embed:22m","input":"Ruby is a programmer''s + best friend"}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 26 Mar 2025 17:18:38 GMT + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.025819365,-0.023147449,-0.05204419,-0.02359659,0.0006516247,0.009969577,-0.0453889,-0.068442866,-0.019442763,0.0009812108,-0.05498037,0.04730593,0.032717418,0.030947946,-0.028105065,-0.05090078,0.00025667102,0.023571288,-0.12629306,0.015917534,0.01231173,0.08733777,0.011108408,0.009003669,0.00718937,-0.0052934815,0.02193917,-0.020292742,-0.03461139,-0.20070425,0.02107215,0.072910964,0.031031353,-0.049616367,0.023306997,-0.06486672,0.013256376,0.0043853885,-0.052061625,-0.039435886,0.012164081,0.003788034,-0.050004035,-0.01751829,-0.029081171,-0.016297124,0.021628456,-0.017189225,0.08650422,0.019240791,-0.04283047,-0.008972946,-0.0282798,-0.048760213,-0.018701227,-0.018923806,0.015387223,0.0066132424,-0.021767087,0.006322427,0.034335203,0.0016922819,-0.3494393,-0.06468288,0.04789346,-0.00242133,0.046571758,0.022469908,-0.024689795,-0.016555127,-0.011920086,0.014217722,-0.074248835,-0.0378238,0.03272102,-0.055375192,0.013477699,0.042363465,0.038778525,-0.033732694,0.015692627,0.009818383,0.004275665,0.0011522578,0.023426272,0.044826716,-0.043028492,-0.05380732,-0.028874718,-0.0033281562,0.018819876,-0.018340344,0.03899947,-0.029625487,-0.064442106,0.04053737,-0.0017892135,0.049774364,0.033641562,0.31321952,0.04387253,0.004834189,0.050648943,-0.056952856,0.051840045,-0.004622082,-0.0029022766,-0.028918024,0.006063617,-0.0041818386,0.019223802,-0.031667218,0.017668251,0.023125196,0.045376316,-0.024328684,-0.03980277,0.024929393,0.0051530804,0.056438677,-0.0009725082,0.0037956084,-0.03239649,-0.012817254,-0.041858695,-0.014856791,-0.06271684,0.033761166,0.031467415,0.011851511,0.051261365,-0.01179492,-0.068899974,-0.014964267,-0.00063179573,0.017690614,-0.009009361,-0.09789638,-0.036439195,-0.0841935,0.023575196,-0.13396092,0.13305002,0.007911912,0.019786658,0.0002827157,0.02192103,0.05638941,-0.043504674,-0.04524754,0.011735054,-0.0035346176,0.0033445251,0.007442268,0.069734655,-0.0006457193,-0.03868659,0.07044447,-0.024192037,0.032955248,-0.011209725,0.03564046,0.039964315,0.09071652,0.08253361,-0.009900468,0.012840352,-0.02295395,0.03471711,-0.022090193,0.0044087064,0.0130827855,0.035907153,0.039426714,-0.03819838,0.030248774,-0.036349647,0.010017172,0.0025868686,0.0013163028,0.03427282,0.08895476,-0.051354308,-0.050073903,-0.0016582799,-0.009518917,0.06254944,0.040961392,0.07374542,0.078283615,-0.038456604,0.13166244,-0.0055810083,0.008324925,-0.021115026,0.04865895,0.040081963,0.04631163,0.04633088,-0.017098077,-0.007893804,0.007607068,-0.07570857,0.064662516,-0.022200007,-0.04613742,0.014698096,-0.040343154,0.0054809875,0.0068689506,0.00092213764,0.006511137,0.036636386,0.0075024543,0.039534982,0.005514188,-0.003920646,0.008136021,0.033838425,0.05254808,-0.015216625,0.031380977,0.0040966547,-0.04814886,-0.027520526,-0.024087062,-0.04536847,-0.05320231,-0.027292114,-0.01939129,0.010507547,0.068630666,0.043998722,0.0801662,0.03348169,-0.009085184,-0.01477701,0.047791857,0.05540584,-0.06736693,0.0020285759,0.013938147,-0.05031106,-0.035206556,0.02761124,-0.04022496,-0.007451326,-0.06296886,-0.022859126,0.09301553,0.048795525,-0.012271036,0.019697173,0.06446396,0.020241095,0.012088095,-0.17798372,-0.027375236,-0.061207205,0.038104277,-0.06642423,-0.009415216,0.052199904,-0.037760843,-0.022187525,0.012181313,-0.041066676,-0.06942215,-0.027730862,-0.009680216,-0.059220828,0.04467606,0.0003948015,0.01014289,0.027306745,0.029429084,0.0493429,-0.039006017,-0.01756003,-0.028417608,-0.027354918,0.042255033,0.061257206,0.0036709877,-0.024329077,-0.050390333,-0.013186946,0.0031478943,0.011040366,0.026129626,0.018130504,-0.027353661,0.019211745,-0.0022117277,0.1118481,0.0782376,0.024995422,0.059711028,-0.008173296,0.017002877,-0.039264616,-0.001962071,0.011470576,-0.032904048,-0.079988904,-0.02629866,0.026457293,-0.053743444,-0.0051814294,0.013066732,0.05321082,0.040862862,-0.0019826875,0.011493213,0.08629233,-0.041718166,0.047269218,0.07769727,-0.044020433,-0.16877456,-0.021221237,-0.011129706,-0.028999822,-0.022866756,-0.010865134,0.009030771,0.003806579,-0.024056332,-0.041828144,0.13366036,0.0550153,-0.0011019756,-0.027688803,0.02077072,0.08133359,-0.016294481,0.046593014,-0.012201837,-0.07112024,-0.03148493,0.046461217,0.13798657,0.004675504,0.04464258,0.018120104,0.020195337,-0.0872914,-0.1429005,0.045251735,0.007702035,-0.019940052,0.0597414,0.0053394698,0.005676257,0.012717743,0.068366244,-0.03198958,0.00562614,-0.023898745,0.14956613,0.028330524,0.0012210672,-0.034995347,0.014900526,-0.0042808442,-0.038005907,-0.0029655711,-0.046612997,-0.023074953,0.0093577355,0.019100675,-0.0048536737,0.03977017,0.02677702,0.05293125,0.005948059,-0.02770206,0.03918424,0.022482652,0.03589692,-0.030975368,-0.03310301,-0.061353248,0.012955803]],"total_duration":282200344,"load_duration":275638829,"prompt_eval_count":8}' + recorded_at: Wed, 26 Mar 2025 17:18:38 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml new file mode 100644 index 00000000..1cbab58b --- /dev/null +++ b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml @@ -0,0 +1,33 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/embed + body: + encoding: UTF-8 + string: '{"model":"snowflake-arctic-embed:22m","input":["Ruby","Python","JavaScript"]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 26 Mar 2025 17:18:38 GMT + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.0388441,0.020130958,-0.067431964,0.007655712,-0.02143178,0.028401934,-0.059553344,-0.09178961,-0.032458898,0.008410962,-0.055265877,0.014614829,0.029787311,0.03382428,-0.01684954,-0.04444329,0.008301062,-0.0022140234,-0.122114494,-0.008171147,0.008162438,0.07341534,0.018977866,0.013705484,-0.0040139267,0.00035185603,0.0069316016,-0.01251507,-0.09616702,-0.17709394,0.012925018,0.03197588,0.026001623,-0.043088693,0.031905584,-0.04813018,-0.0017315283,0.029841121,-0.026876168,-0.030367695,-0.0067817485,0.02359407,-0.019723006,-0.0030676995,0.010523006,-0.027055979,0.04175819,-0.009885953,0.096520424,0.04388586,-0.03775211,-0.033325512,0.0096065905,-0.0139596285,-0.040052965,-0.002589836,0.046065394,0.004938671,-0.008818979,0.033967253,0.038127918,0.0013382456,-0.34866735,-0.06390991,0.066892646,-0.0076447544,0.034478936,0.0066651497,0.0017603931,-0.005765021,-0.059580464,-0.0011398621,-0.034723498,-0.0070240623,0.033945907,-0.07172375,0.0019033181,0.050755918,0.033208486,-0.044483263,-0.010917951,-0.013006815,0.017780134,0.027302826,0.017522654,0.050923645,-0.045407858,-0.031065013,0.0034971004,0.017281314,0.03732062,-0.020520234,0.034877818,-0.023866747,-0.070485,0.04555996,0.001389987,0.041110877,0.0083451895,0.30750144,0.041160934,-0.007575193,0.06326734,-0.07495616,0.05411205,-0.013711487,-0.018127367,0.0040174066,-0.016591415,-0.009179355,0.033549752,-0.01786939,-0.008867672,0.018478448,0.04625403,-0.028747778,-0.007066149,-0.005806406,0.0062766555,0.04459573,-0.03000371,0.014898422,-0.032604568,-0.017415427,-0.014565004,-0.022372194,-0.06727879,0.0365807,0.00958214,0.045523975,0.028445095,0.011969768,-0.06253902,-0.015415758,-0.0050557056,0.012014955,0.0024233195,-0.07337232,-0.0042311987,-0.07457154,-0.0006373777,-0.16765094,0.13003069,0.03297481,0.0144618815,0.0005355533,0.009557741,0.037592538,-0.012591949,-0.04204159,0.015775016,0.02042741,-0.026271803,0.020424932,0.091125205,-0.014388012,-0.042810924,0.051355045,-0.0075769946,0.03629031,0.010354268,0.0074680853,0.042652246,0.060397565,0.05299325,0.0070928345,0.018289784,-0.019927645,0.008178775,-0.026709922,-0.0004766831,0.018478047,0.012326361,0.061957974,-0.01432786,0.019229595,0.010431529,0.03351462,0.010213068,-0.031673603,0.01589807,0.10027719,-0.039053105,-0.058606964,-0.010657152,0.011582607,0.05528668,0.021357857,0.04105508,0.05390399,-0.0316559,0.156173,-0.048507318,0.012662477,-0.017382665,-0.005330175,0.057885952,0.06385099,0.028633239,-0.0010585266,-0.033099838,0.011883581,-0.054964617,0.034078836,-0.027739037,-0.04053948,0.019028971,-0.008881098,-0.009892724,-0.00016677074,0.008185013,0.014028663,0.015764946,0.013674434,0.040554117,-0.015574529,0.0012967308,-0.019827649,0.044048622,0.054283343,-0.019935552,0.019209668,-0.009141968,-0.06369639,-0.038524695,-0.00584429,-0.05572212,-0.020921145,-0.049070027,-0.01276479,0.051422957,0.062778324,0.02250262,0.11412264,0.014608461,0.0030205897,-0.036526274,0.050726265,0.049905915,-0.065770596,0.008405842,0.0010899245,-0.034585573,-0.004634513,0.012284967,-0.03207842,-0.04583995,-0.048865594,-0.019766245,0.12478698,0.06276402,-0.033869267,0.03652329,0.060382184,0.014759198,0.0046959203,-0.19071387,-0.032657206,-0.07738984,0.0442774,-0.05914576,-0.014506996,0.03734469,-0.0025898803,0.004546905,-0.0117728645,-0.05503146,-0.025510276,-0.020450229,-0.023852503,-0.015572229,0.06172686,0.018116174,0.013062141,0.043132544,0.020856835,0.034402605,-0.0055950414,0.012068603,-0.06377293,0.027816271,0.02069718,0.06381159,0.0031838878,-0.06427212,-0.071605794,-0.053954642,0.032803938,-0.0021615664,0.030591654,0.0039456603,-0.026492551,-0.026371498,-0.024719616,0.14168687,0.0002901896,-0.0034020492,0.031027138,0.0053976467,-0.000027014497,-0.052480403,0.0529854,-0.013960096,-0.03182876,-0.07278522,-0.029438145,-0.0076043443,-0.032225914,0.008225171,0.017322546,0.009984277,0.015520695,-0.0052385437,-0.011876693,0.07715109,-0.045244373,0.008803014,0.02424746,-0.015235667,-0.15054744,-0.0036824355,-0.016711554,-0.0013559143,-0.02194606,0.016720122,0.019720519,0.01517699,-0.03738912,-0.057589684,0.12978709,0.04813223,0.0077710785,-0.015100561,0.004117948,0.08621212,0.027476143,0.04439229,0.00030685926,-0.044507023,0.00089704886,0.061830766,0.16139033,0.024911765,-0.0074146036,0.004032755,0.039143074,-0.0898164,-0.11864838,0.04416452,-0.039557893,-0.03088087,0.11287578,0.043714676,-0.021582166,0.037369095,0.04492175,-0.0010107799,0.03280375,-0.035768308,0.15532315,-0.0009561552,-0.0034369607,-0.029741783,0.008190347,-0.051745743,-0.012318028,0.012402675,-0.04895367,-0.011466236,0.013425867,-0.033821847,-0.015193115,0.010228869,0.03193425,0.02603917,0.037040178,-0.017338518,0.01710686,0.058089267,0.030198513,-0.0008354163,-0.06520546,-0.0921685,-0.005078346],[-0.0072552343,0.03713646,-0.01699283,-0.030782733,-0.02052221,0.01125825,-0.06529242,-0.061818272,-0.020571295,-0.024209626,-0.03579918,0.015797382,0.061592482,0.02068423,0.016780416,-0.023932647,-0.010951945,0.025292471,-0.15266368,-0.012987599,-0.010199094,0.029842783,0.017119406,0.03163956,0.021315867,0.0035011058,0.013092083,-0.037269205,-0.13100713,-0.15873815,0.024110278,0.0054965187,-0.0057078693,-0.042900756,-0.00460323,-0.043012183,0.002026602,0.044829354,-0.0321034,-0.027913237,-0.0035799183,-0.0075295595,-0.013355917,0.0045460337,0.046187807,0.0027242594,0.049688134,-0.021872735,0.068736166,0.04175792,-0.0437622,0.014226286,-0.037445676,-0.055501036,-0.045524184,-0.001189907,0.044486266,-0.007421061,-0.0097211385,0.008858515,0.007311453,0.024857061,-0.35175383,-0.012672284,0.041481517,0.047193956,0.0020684737,0.047606543,-0.026176704,-0.025530554,-0.026922593,0.017605826,0.014854451,0.005629944,0.023153292,-0.041461922,-0.003056519,0.012925506,0.05518522,-0.038745392,0.026249396,0.03217421,0.019464033,-0.018742876,-0.013937561,0.045195688,-0.018083213,-0.012282628,0.0471358,0.0008688498,-0.028306754,0.0408566,0.024084115,0.0005985765,-0.06742631,0.009600122,-0.019761212,0.052697483,0.045696277,0.29864073,0.03026967,-0.0415359,0.016219707,-0.037604477,0.053452723,-0.029339043,-0.008365499,-0.03606822,0.021689609,-0.029203571,0.01769295,-0.021349482,-0.002733219,0.0033789296,0.031930774,-0.028539872,-0.04999919,0.007576535,-0.005124299,0.05567214,-0.048217237,-0.0006354506,-0.023972036,-0.052717745,0.0013329871,-0.016641501,-0.05940865,0.014591998,-0.007996123,-0.0060994998,0.034148518,-0.020664569,-0.09358414,-0.0194255,-0.0128993485,0.022041388,0.032610774,-0.052574314,0.016395817,-0.047118947,0.015677843,-0.13766375,0.10541323,0.0026426625,0.011538131,0.026277615,-0.02502458,0.0049760668,-0.053827237,-0.03863926,0.023165068,0.016438669,-0.0151872,0.002109835,0.12469035,0.020599306,-0.006932304,0.031132199,-0.011493038,0.0051031685,0.017425977,0.019842505,-0.006905538,0.03286136,0.029737378,-0.03871717,0.03207742,-0.017586391,0.019399468,-0.003148388,0.018489016,0.018581418,-0.012901189,0.017172573,-0.05461113,-0.001390115,-0.03233814,0.0011009739,0.03855168,-0.033363048,-0.015336527,0.080612056,-0.028678833,-0.046856903,-0.015384176,0.052241,0.059723865,0.032644298,0.059932925,0.06560817,-0.025778033,0.19489264,-0.09447736,-0.021961018,0.021270901,-0.004714235,0.03169394,0.033007365,-0.017643515,-0.023465928,-0.024755051,-0.014296845,-0.0002619207,0.015911218,0.015445326,-0.079413936,-0.0057071378,0.017307783,-0.005565825,-0.012172522,-0.009783294,-0.05173357,0.03838994,0.03412497,0.07624654,0.032628186,0.016304875,0.012916574,0.024889637,0.026531337,-0.0040279627,0.04415734,-0.02977549,-0.06746127,-0.03022296,-0.0021678545,-0.06871879,-0.0020891097,-0.082151935,-0.0058978163,0.03801924,0.039217323,0.03492099,0.113563396,0.025192197,0.018200427,0.024883514,0.027362043,0.011942755,-0.06134862,0.0019354849,0.015484824,-0.040022288,-0.024537606,0.020911857,-0.07808669,-0.019743685,-0.046418775,-0.03314287,0.1694522,0.050321065,-0.013430357,0.0070345113,0.038134124,0.0010241308,-0.011185799,-0.1828692,-0.025442472,-0.028564518,0.044677004,-0.0028425956,-0.00042380465,0.04030299,0.022801027,-0.009841054,-0.029609146,-0.009356221,-0.03580966,-0.028770214,-0.050125327,-0.031781837,0.104847625,0.026230568,0.02514224,0.0053547267,-0.009917238,0.07282194,0.029626124,-0.030785127,0.005750769,0.013035853,0.027320353,0.04267924,0.024914404,-0.031501085,-0.05527291,-0.04931349,-0.00094031333,-0.0029171903,0.067338765,-0.041093227,0.00045597606,-0.008067708,-0.026840648,0.18961208,0.0021951848,0.016140003,0.038745787,-0.016722713,0.0016434207,0.002311968,0.039490942,-0.03590958,-0.0054072104,-0.03100541,-0.014101151,0.058239665,-0.038461883,-0.02283073,0.008492259,-0.013109407,0.02975444,0.024842035,-0.015734265,0.09163665,-0.057609167,0.035152502,0.037537843,0.021865102,-0.2016707,-0.03457164,-0.013295931,0.048858218,-0.058543745,0.018288808,0.028178774,-0.0111076655,0.020360066,-0.026658798,0.11522286,0.053960584,-0.017099507,-0.0043872525,0.046700936,0.054960232,0.014453873,0.019755626,-0.013162808,-0.040781327,0.0028153716,0.060916595,0.15055314,-0.0048034787,0.040378716,0.023411844,0.0069524855,-0.03615119,-0.11237404,0.02728505,-0.032408927,-0.033139788,0.05818729,0.019382754,-0.035828292,0.023392975,0.071280956,-0.036502235,0.008983084,-0.034260582,0.1593053,-0.028021295,0.0172493,-0.016131653,-0.033713784,-0.04138278,0.00016605067,0.0054855584,-0.054233927,-0.013987903,0.022237027,-0.010095551,0.006079947,0.031176228,0.034318067,0.027573293,0.020763315,-0.019646917,0.012187558,0.04892568,0.04229697,0.034125984,-0.018135771,-0.035252318,-0.057188697],[0.010169066,0.014699193,0.02312678,-0.031285737,-0.019339556,0.01898938,-0.042842016,-0.065713726,0.037114225,-0.0019252088,-0.04387124,0.02680714,0.017134406,0.010056415,0.016514305,-0.07524968,-0.004598689,-0.0077995756,-0.16111827,-0.018086512,-0.023329865,0.07266939,0.035500344,0.007105781,-0.037746858,0.03954511,0.010651382,-0.03404992,-0.13568549,-0.1758981,0.017500464,0.021587882,-0.00029796895,-0.05286976,-0.021638112,-0.020357909,-0.03505305,0.015242394,-0.013434969,-0.03953229,0.007741148,-0.016568061,-0.046428822,-0.0113176145,0.050263844,-0.013899913,0.023608234,-0.030784462,0.024582472,0.041902494,-0.05761777,-0.032375082,0.00036015094,-0.03865763,-0.046571795,0.050851,-0.011026816,-0.03191825,0.010439611,0.01701438,0.0055330084,0.0587453,-0.3662647,0.025101654,0.07276847,0.019127958,-0.018416954,-0.0078095226,-0.00087658176,0.015874607,0.038312003,-0.014843252,-0.0125896605,0.01718569,0.026865218,-0.04576379,0.00359911,0.021899922,0.06563156,-0.042660784,0.0018792639,0.020148722,0.016360225,0.030104727,-0.015654275,0.06526195,0.0061962763,-0.028802281,0.038764264,0.0048531652,-0.048788548,0.035097387,0.0030290019,-0.002194582,-0.048610423,0.0012355483,0.0014674183,0.034617357,0.018160649,0.30238912,0.018115664,0.0030157077,0.040349476,-0.0703222,0.05237721,-0.0028105106,-0.028073953,-0.021660421,0.031953406,-0.0390731,0.0028894274,-0.017770546,0.005304085,-0.0061753215,0.054985832,-0.0013282879,-0.016932156,-0.009256211,0.023674654,0.043953825,-0.027819972,0.025420371,-0.04043455,-0.005284352,-0.010442454,0.0035201733,-0.06362815,0.02499165,-0.04596317,-0.011497569,0.05550298,0.00008448542,-0.09329214,0.019624306,0.022909734,0.03186377,0.0010003478,-0.031093974,0.0253383,-0.031195963,-0.018049393,-0.13012893,0.10688446,-0.010589804,0.025470642,-0.0050498014,-0.028474659,0.043146398,-0.026209809,-0.014387408,0.024687277,0.033259496,-0.04391259,-0.0050338595,0.0845666,0.022489144,0.0029990883,-0.0035517574,-0.006752627,0.029374328,0.02664534,0.025731422,0.059084013,0.08346221,0.032861166,-0.09516849,0.057318185,0.024989773,0.014103997,-0.004171578,0.018135788,-0.024807887,-0.041765466,-0.025802964,-0.012921618,-0.008061644,-0.028848117,-0.0005917901,0.02881574,-0.051334593,0.0027097291,0.063163355,-0.026775215,-0.08124945,-0.0105067,0.025091348,0.03696275,0.012843601,0.031530064,0.06319013,-0.027962644,0.17676653,-0.08200779,-0.03632199,-0.034959286,0.02156012,0.015361243,0.043850943,-0.0021428494,0.011226801,-0.046751194,-0.07139608,0.009606031,0.035172343,-0.04229935,-0.03569737,0.04477027,0.013450342,0.04269794,-0.008891381,-0.031291332,-0.0022993302,0.09038422,0.02420419,0.031999685,-0.0051883184,-0.010298845,0.028453493,0.0050622746,0.04699291,0.006085575,0.018052265,-0.022887442,-0.045732647,0.009925399,0.0068673166,-0.040608596,-0.013074616,-0.04770688,0.0011602375,0.078974366,0.04360928,0.040327042,0.073482476,0.06473103,0.014272077,-0.0487856,0.032009773,0.012478921,-0.0383686,0.016539803,0.0066691204,-0.040024173,-0.056614283,0.04952658,-0.09106773,-0.030492447,0.010533615,-0.029398412,0.18325548,0.09290254,0.027460678,0.01589842,0.031662818,-0.06166192,0.0014848855,-0.11129306,0.010330616,-0.040127635,0.03328302,-0.025017919,-0.03147771,0.06017222,-0.029784242,-0.026018031,-0.0014891784,-0.0060136514,-0.02197994,-0.005521501,-0.02919752,-0.040479988,0.09514643,0.019242264,0.042500548,0.00066325505,-0.009165173,0.025331255,-0.014075222,-0.058067344,-0.020931922,0.018429274,-0.002701154,0.053624205,0.034054026,-0.00924732,-0.07858087,-0.023325374,0.035447456,0.07162372,0.006831908,-0.03824091,-0.012311438,-0.010005245,-0.0059660277,0.12724046,0.0014100341,0.018896865,0.021953704,-0.04847068,-0.03720164,-0.009651089,0.054688897,0.013091016,-0.013793644,-0.04749705,-0.018131005,0.017314631,-0.028080247,-0.030335128,-0.0028840683,-0.04583448,0.0028758575,0.0152386045,-0.007833423,0.10375125,-0.016216613,0.017764568,0.037414994,0.0022454704,-0.17834663,-0.03604582,-0.00064713095,-0.014282952,-0.063561186,-0.030035643,0.02400106,-0.0008161259,0.025210572,-0.04692099,0.15453176,0.08460845,-0.018154804,-0.030075192,0.033266056,0.09898789,0.016117847,0.010213679,-0.018335694,-0.006946004,0.017542744,0.09943681,0.12576352,0.02319345,0.008129597,0.0032028987,-0.0053399303,-0.047532618,-0.13376793,-0.0018692309,-0.045244668,-0.020810418,0.06288976,0.00091563916,0.0054674884,0.005820324,0.031138638,-0.03758025,0.016956536,-0.04498085,0.13776563,-0.01599851,-0.000038715556,-0.008666058,-0.01248527,-0.002156642,0.022566035,0.051826704,-0.042339765,0.008286659,0.012520414,-0.004150474,-0.013118474,0.048206005,0.0003086508,-0.008351304,0.012447726,0.006553263,0.03620175,0.03051183,0.03917375,-0.029004231,-0.016662572,-0.07127831,-0.020850424]],"total_duration":7034636,"load_duration":731830,"prompt_eval_count":4}' + recorded_at: Wed, 26 Mar 2025 17:18:38 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/models_refresh_updates_models_and_returns_a_chainable_models_instance.yml b/spec/fixtures/vcr_cassettes/models_refresh_updates_models_and_returns_a_chainable_models_instance.yml index 0b01884f..ea64e3c2 100644 --- a/spec/fixtures/vcr_cassettes/models_refresh_updates_models_and_returns_a_chainable_models_instance.yml +++ b/spec/fixtures/vcr_cassettes/models_refresh_updates_models_and_returns_a_chainable_models_instance.yml @@ -1239,4 +1239,32 @@ http_interactions: encoding: ASCII-8BIT string: '{"object":"list","data":[{"id":"deepseek-chat","object":"model","owned_by":"deepseek"},{"id":"deepseek-reasoner","object":"model","owned_by":"deepseek"}]}' recorded_at: Tue, 25 Mar 2025 17:50:51 GMT +- request: + method: get + uri: http://localhost:11434/api/tags + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 26 Mar 2025 17:18:38 GMT + Content-Length: + - '681' + body: + encoding: UTF-8 + string: '{"models":[{"name":"snowflake-arctic-embed:22m","model":"snowflake-arctic-embed:22m","modified_at":"2025-03-26T17:18:08.367580922Z","size":45838698,"digest":"bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb","details":{"parent_model":"","format":"gguf","family":"bert","families":["bert"],"parameter_size":"23M","quantization_level":"F16"}},{"name":"smollm:135m","model":"smollm:135m","modified_at":"2025-03-26T17:18:01.303574119Z","size":91739413,"digest":"b0b2a46174385c0adcaa77ff245ffeced5fc4a61447b6f221b2beb5c5a760133","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"134.52M","quantization_level":"Q4_0"}}]}' + recorded_at: Wed, 26 Mar 2025 17:18:38 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/models_refresh_works_as_a_class_method_too.yml b/spec/fixtures/vcr_cassettes/models_refresh_works_as_a_class_method_too.yml index d2efc013..67c955d8 100644 --- a/spec/fixtures/vcr_cassettes/models_refresh_works_as_a_class_method_too.yml +++ b/spec/fixtures/vcr_cassettes/models_refresh_works_as_a_class_method_too.yml @@ -1239,4 +1239,32 @@ http_interactions: encoding: ASCII-8BIT string: '{"object":"list","data":[{"id":"deepseek-chat","object":"model","owned_by":"deepseek"},{"id":"deepseek-reasoner","object":"model","owned_by":"deepseek"}]}' recorded_at: Tue, 25 Mar 2025 17:50:52 GMT +- request: + method: get + uri: http://localhost:11434/api/tags + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 26 Mar 2025 17:18:38 GMT + Content-Length: + - '681' + body: + encoding: UTF-8 + string: '{"models":[{"name":"snowflake-arctic-embed:22m","model":"snowflake-arctic-embed:22m","modified_at":"2025-03-26T17:18:08.367580922Z","size":45838698,"digest":"bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb","details":{"parent_model":"","format":"gguf","family":"bert","families":["bert"],"parameter_size":"23M","quantization_level":"F16"}},{"name":"smollm:135m","model":"smollm:135m","modified_at":"2025-03-26T17:18:01.303574119Z","size":91739413,"digest":"b0b2a46174385c0adcaa77ff245ffeced5fc4a61447b6f221b2beb5c5a760133","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"134.52M","quantization_level":"Q4_0"}}]}' + recorded_at: Wed, 26 Mar 2025 17:18:38 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_chat_ask_works.yml b/spec/fixtures/vcr_cassettes/providers_ollama_chat_ask_works.yml deleted file mode 100644 index 8ca26bdb..00000000 --- a/spec/fixtures/vcr_cassettes/providers_ollama_chat_ask_works.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"smollm:135m","messages":[{"role":"user","content":"Count - from 1 to 3"}],"options":{"temperature":0.7},"stream":false}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 25 Mar 2025 11:42:35 GMT - Server: - - Caddy - Vary: - - Accept-Encoding - Content-Length: - - '812' - body: - encoding: ASCII-8BIT - string: '{"model":"smollm:135m","created_at":"2025-03-25T11:42:35.763421821Z","message":{"role":"assistant","content":"To - count the number of numbers in a list, you can use the `count()` method on - an iterable object like a list or tuple. The `count()` method returns the - number of occurrences of each item in the iterable and its position in the - list. To find the first occurrence of an element, you can access it using - indexing and then return the value obtained by that index:\n\n```python\nnumbers - = [1, 2, 3]\nresult = numbers[0] == 1 or numbers[1] == 3\nassert result == - True\n# ... (approximate count of numbers in list)\n```"},"done_reason":"stop","done":true,"total_duration":1783007537,"load_duration":1218168782,"prompt_eval_count":16,"prompt_eval_duration":186161937,"eval_count":132,"eval_duration":376576424}' - recorded_at: Tue, 25 Mar 2025 11:42:31 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_a_single_text.yml b/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_a_single_text.yml deleted file mode 100644 index bd9fa5d5..00000000 --- a/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_a_single_text.yml +++ /dev/null @@ -1,38 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/embed - body: - encoding: UTF-8 - string: '{"model":"snowflake-arctic-embed:22m","input":"Ruby is a programmer''s - best friend"}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 25 Mar 2025 11:42:36 GMT - Server: - - Caddy - Vary: - - Accept-Encoding - Transfer-Encoding: - - chunked - body: - encoding: ASCII-8BIT - string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.025825415,-0.023176115,-0.052045297,-0.023625664,0.0006673469,0.009949714,-0.04538417,-0.06849524,-0.019409077,0.0010184002,-0.054927465,0.04728714,0.032690506,0.030963264,-0.028091758,-0.05092271,0.00021566867,0.023615433,-0.12640688,0.015840458,0.012315658,0.087370574,0.011073331,0.0090212375,0.007156342,-0.0052327104,0.021913407,-0.020346882,-0.03459649,-0.20068292,0.021031896,0.07291515,0.031049531,-0.04963502,0.023327535,-0.06476457,0.0131773045,0.004342761,-0.05204616,-0.03947274,0.0122103775,0.003776148,-0.050048206,-0.017586641,-0.029104842,-0.016230974,0.021660762,-0.017151477,0.0865443,0.01920734,-0.042871486,-0.0089291595,-0.02822964,-0.04884569,-0.018680912,-0.01892585,0.015438859,0.0065737013,-0.021804608,0.00633415,0.0343607,0.0017093703,-0.34944108,-0.06468269,0.0478818,-0.00246448,0.046574403,0.02243261,-0.024708489,-0.016602987,-0.011909359,0.014165576,-0.07424154,-0.03776865,0.032787047,-0.05530688,0.013535443,0.042380534,0.038827997,-0.033742167,0.015697544,0.009775907,0.0042203693,0.0011168025,0.023423292,0.04484947,-0.043061797,-0.05383481,-0.028867329,-0.0033860689,0.018773982,-0.018347567,0.03903167,-0.029658085,-0.06440208,0.040508885,-0.0017985007,0.049720276,0.033716165,0.31325525,0.04386892,0.0048334296,0.050675593,-0.056929454,0.0518016,-0.004611103,-0.0029309082,-0.028916717,0.0060408665,-0.004141483,0.01923389,-0.031655706,0.01768319,0.02311225,0.045390822,-0.024344986,-0.039786555,0.024944702,0.005075094,0.056426894,-0.0009737753,0.0037892968,-0.032363605,-0.012793344,-0.041841026,-0.014850747,-0.06273983,0.033704888,0.031475354,0.011834117,0.05125323,-0.011774348,-0.06885821,-0.014935385,-0.0006414335,0.017715653,-0.008953341,-0.097899854,-0.036503628,-0.084191576,0.023606507,-0.1339018,0.1330882,0.007957225,0.01985772,0.00030814653,0.021941159,0.05639211,-0.043463834,-0.045274723,0.011725757,-0.003486319,0.003375221,0.0074666464,0.06974618,-0.0006389784,-0.038667206,0.07041848,-0.02421246,0.03300245,-0.011266481,0.035639856,0.040018253,0.09069596,0.08246825,-0.009912788,0.012884513,-0.022981415,0.03470591,-0.022104705,0.0043493398,0.013083702,0.035951313,0.03946172,-0.038252268,0.030231304,-0.036359355,0.01005223,0.0025720727,0.0013707506,0.034241233,0.088925935,-0.051440887,-0.050102297,-0.0016456994,-0.009496842,0.062487546,0.040939905,0.07381002,0.078291304,-0.038428534,0.1316706,-0.0055638882,0.008280254,-0.021145111,0.04876571,0.040031683,0.04628573,0.046338666,-0.017028602,-0.007903445,0.007545737,-0.07565534,0.064689994,-0.022149073,-0.046088018,0.014704514,-0.040415496,0.00550196,0.006901969,0.00089305703,0.006521102,0.0366565,0.0074207284,0.039539423,0.005592426,-0.003989626,0.008083243,0.033852484,0.052595314,-0.015218367,0.03131478,0.0040506576,-0.048098013,-0.027468681,-0.024048975,-0.04536876,-0.05319465,-0.027298115,-0.01941297,0.010558779,0.06863464,0.04396793,0.08020219,0.033566475,-0.009056651,-0.014715962,0.04780099,0.05536488,-0.06740807,0.002055909,0.013943318,-0.05024147,-0.035200298,0.027621565,-0.040184192,-0.007491963,-0.06297288,-0.022879997,0.093055375,0.04880813,-0.012168053,0.019717308,0.064516716,0.020201867,0.012079503,-0.17798914,-0.027345736,-0.0612433,0.038101118,-0.06641872,-0.00939703,0.052195832,-0.03770301,-0.022270007,0.012196051,-0.041005902,-0.06945124,-0.027733557,-0.009639078,-0.059247572,0.04474978,0.00042829235,0.010153207,0.02728113,0.029422356,0.049308695,-0.038985588,-0.017589854,-0.02842523,-0.027386962,0.042216763,0.061242577,0.003747581,-0.024338258,-0.050467186,-0.013143215,0.0031099522,0.010997509,0.026045857,0.01815751,-0.027380131,0.01929404,-0.0022469186,0.111852795,0.07823112,0.024928685,0.059756078,-0.008221097,0.016979527,-0.039244134,-0.0019415446,0.011487329,-0.03280691,-0.08006135,-0.026343029,0.026450884,-0.053655412,-0.005154362,0.01307755,0.053237017,0.04086586,-0.0019484188,0.011518151,0.08618621,-0.041709326,0.047144253,0.077645905,-0.044002645,-0.16881582,-0.02115599,-0.011150404,-0.029005526,-0.022859793,-0.0107934745,0.009013299,0.0037840477,-0.023908136,-0.041892353,0.13362311,0.05498781,-0.0010903508,-0.027582854,0.02074264,0.08133009,-0.016295228,0.046583474,-0.012219358,-0.07110713,-0.031505097,0.04635908,0.13795494,0.004750067,0.044614047,0.018176915,0.020094909,-0.08733446,-0.14297998,0.045279857,0.0077459584,-0.019933412,0.059806284,0.0053598317,0.005684153,0.01267696,0.06831267,-0.03196309,0.0056615137,-0.023855256,0.14950311,0.028314097,0.0012290949,-0.034989975,0.014838987,-0.0043164054,-0.0380489,-0.002994491,-0.04658432,-0.023052199,0.009330306,0.019073954,-0.0048254183,0.039711606,0.026755748,0.05285787,0.005976852,-0.02769884,0.03918166,0.022543069,0.035913944,-0.030974701,-0.033151094,-0.061393328,0.012922418]],"total_duration":926343313,"load_duration":836913075,"prompt_eval_count":8}' - recorded_at: Tue, 25 Mar 2025 11:42:32 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_multiple_texts.yml b/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_multiple_texts.yml deleted file mode 100644 index d5dcdb36..00000000 --- a/spec/fixtures/vcr_cassettes/providers_ollama_embeddings_can_handle_multiple_texts.yml +++ /dev/null @@ -1,37 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/embed - body: - encoding: UTF-8 - string: '{"model":"snowflake-arctic-embed:22m","input":["Ruby","Python","JavaScript"]}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 25 Mar 2025 11:42:36 GMT - Server: - - Caddy - Vary: - - Accept-Encoding - Transfer-Encoding: - - chunked - body: - encoding: ASCII-8BIT - string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.038980126,0.020101948,-0.067413226,0.007685114,-0.021361317,0.028405204,-0.05964908,-0.09178641,-0.032397546,0.008366828,-0.05523459,0.014637846,0.0298761,0.03387804,-0.016674861,-0.044479024,0.008276525,-0.0022477629,-0.12195336,-0.008178106,0.008199949,0.07350191,0.01897805,0.013661541,-0.003947917,0.00030909953,0.006917925,-0.012626692,-0.09616951,-0.17709318,0.01293276,0.031847943,0.025997223,-0.042996813,0.03192809,-0.048060544,-0.0017395425,0.029812165,-0.026901668,-0.030327402,-0.0068094945,0.023497479,-0.019625092,-0.003110331,0.010590182,-0.027034454,0.04182794,-0.009884578,0.09661056,0.043840215,-0.037773125,-0.033335246,0.009626258,-0.013944384,-0.040054895,-0.0026200123,0.046114273,0.0049590026,-0.008846017,0.034012534,0.038100995,0.0013456035,-0.34869465,-0.06399822,0.06681992,-0.007770172,0.03451249,0.006695025,0.0016939766,-0.005725403,-0.059506737,-0.0011312707,-0.034694858,-0.0070268526,0.033973437,-0.07178208,0.0019529031,0.050796922,0.033150885,-0.04453945,-0.010778929,-0.01298108,0.01772847,0.027397834,0.017516151,0.05094088,-0.045374986,-0.031055674,0.0034364148,0.017342873,0.03724968,-0.020449797,0.03487508,-0.023868825,-0.0705106,0.045591667,0.0014132301,0.04102965,0.0082013225,0.3076015,0.041163538,-0.0075212517,0.0632507,-0.07494113,0.054058343,-0.013692275,-0.018088195,0.0039990763,-0.016607765,-0.00915819,0.03353369,-0.017990997,-0.008927891,0.018497262,0.04622437,-0.028729072,-0.0070351255,-0.005821854,0.0063457754,0.044443272,-0.03001723,0.014840464,-0.03265875,-0.017414864,-0.014599514,-0.022385433,-0.06727593,0.03655243,0.009642398,0.04557801,0.028509801,0.011939836,-0.062560804,-0.015390183,-0.0050801174,0.011868977,0.00253459,-0.07341563,-0.004279252,-0.07461656,-0.0006562158,-0.16768059,0.13006905,0.03295397,0.0145061985,0.000511846,0.009465702,0.037566304,-0.012595248,-0.042188045,0.015753305,0.02033451,-0.026321119,0.020434551,0.09113539,-0.014463864,-0.04273769,0.05132384,-0.007610653,0.036329918,0.010425151,0.0075439727,0.042681746,0.060391378,0.053032257,0.0071610347,0.018304583,-0.0199126,0.008234456,-0.026586238,-0.00048163044,0.018455869,0.012418799,0.061977547,-0.014351739,0.019218396,0.010331768,0.033490002,0.0102368975,-0.031620093,0.015966186,0.10022163,-0.03886677,-0.058662754,-0.010719046,0.011613407,0.055317454,0.021442259,0.041051246,0.05395217,-0.031625535,0.1561225,-0.04847817,0.012704446,-0.017351678,-0.005412353,0.05782586,0.063770935,0.028648905,-0.0010758642,-0.03315512,0.011804742,-0.054954775,0.034165937,-0.027770827,-0.040539972,0.01901002,-0.008845964,-0.009943114,-0.00007340114,0.008205162,0.014036151,0.015788715,0.013589957,0.040579043,-0.015481178,0.0013020202,-0.019863069,0.044024546,0.054241393,-0.019910982,0.019316196,-0.009067846,-0.06370655,-0.038542934,-0.005822525,-0.05564244,-0.020892167,-0.04894251,-0.012727646,0.05143602,0.06270096,0.022492254,0.11401925,0.014643738,0.0030262705,-0.036580373,0.05074049,0.04994587,-0.06580306,0.008364971,0.0012129012,-0.034641,-0.0046832887,0.012338395,-0.032140378,-0.045876123,-0.048861995,-0.019786038,0.12485802,0.06277426,-0.033950374,0.036432575,0.06035506,0.014863595,0.0047113854,-0.19050083,-0.032735668,-0.077262625,0.044320498,-0.059189577,-0.014459053,0.03718649,-0.0026039602,0.004493112,-0.011763187,-0.05504196,-0.025533773,-0.02048363,-0.023919607,-0.015506923,0.061790027,0.01816571,0.0130165955,0.04316555,0.020895818,0.034394037,-0.00560091,0.011984886,-0.06372637,0.02781977,0.020621277,0.06389801,0.0032279587,-0.064306036,-0.07160552,-0.05394653,0.032840647,-0.0021832213,0.030553438,0.0039347326,-0.026431374,-0.026453791,-0.024773262,0.14158836,0.00027325953,-0.003358694,0.031054376,0.005467873,-0.000014875217,-0.05249387,0.05296582,-0.013941867,-0.031785127,-0.07282081,-0.029387616,-0.0076221772,-0.032214306,0.008221592,0.01732765,0.01000591,0.015568096,-0.005231348,-0.012036904,0.07718011,-0.045315113,0.008787361,0.02417641,-0.015230668,-0.15053827,-0.0037556684,-0.01667005,-0.0013223562,-0.02209581,0.016655259,0.019694244,0.015031552,-0.037394483,-0.057655845,0.12982553,0.04818329,0.0077882116,-0.015061786,0.004192891,0.08628084,0.027619699,0.044403546,0.00034237612,-0.044426452,0.00096744276,0.06186224,0.16129373,0.024928987,-0.0073914034,0.0040016263,0.039090827,-0.08990263,-0.118701264,0.04410862,-0.03954887,-0.030827247,0.112970345,0.04363939,-0.021480395,0.03728192,0.044834364,-0.0009248547,0.032832358,-0.035760213,0.15535384,-0.0009505413,-0.0034093896,-0.029711511,0.008248596,-0.051867787,-0.012275803,0.012434058,-0.04902186,-0.011476671,0.0133925,-0.03379115,-0.0151935695,0.010195133,0.031876706,0.025932532,0.036986034,-0.01739396,0.017166032,0.05808856,0.030131826,-0.0008843879,-0.06526332,-0.09222386,-0.0049838475],[-0.007225496,0.037155706,-0.016906068,-0.030758644,-0.020417303,0.011231278,-0.06530078,-0.061754078,-0.020577524,-0.024164986,-0.035808578,0.015893035,0.061571326,0.020668881,0.016767306,-0.023883428,-0.01099219,0.025237663,-0.15266667,-0.013051586,-0.010288909,0.029873036,0.017107742,0.0315594,0.021337744,0.0034486242,0.013156374,-0.037249252,-0.13094991,-0.15867794,0.024068367,0.005509016,-0.0056714285,-0.042848945,-0.0045933733,-0.04299176,0.0020768172,0.04483032,-0.03212172,-0.027772011,-0.0036520734,-0.0075447895,-0.013391376,0.0045278594,0.04607957,0.0027125278,0.049626715,-0.021857744,0.06873977,0.04173157,-0.04370165,0.014249006,-0.0373972,-0.05551407,-0.045433797,-0.0011728521,0.044487648,-0.0074436087,-0.00975718,0.008799588,0.0073077497,0.024823438,-0.35174075,-0.012705645,0.04136241,0.047284245,0.0020329098,0.04765345,-0.02604234,-0.02548834,-0.02704063,0.017578213,0.01482943,0.0055936393,0.023184825,-0.041498873,-0.003050582,0.012843925,0.05516694,-0.03866418,0.02621437,0.032198943,0.01935349,-0.018680874,-0.013953387,0.0451372,-0.018057078,-0.012344732,0.04716202,0.0010259423,-0.028411478,0.04075236,0.024121404,0.0006758823,-0.0674563,0.009551461,-0.01973488,0.05264174,0.04568158,0.29859018,0.030333413,-0.04152799,0.016276676,-0.037692044,0.053379524,-0.029166088,-0.008381986,-0.03611233,0.021734668,-0.02926269,0.01770523,-0.021257408,-0.0026680147,0.0033788746,0.03192171,-0.02859868,-0.050017837,0.007628301,-0.005211484,0.055639394,-0.04813225,-0.00062740705,-0.023975527,-0.05272858,0.0012510746,-0.016620526,-0.05937839,0.014596674,-0.007940771,-0.0060859257,0.03417475,-0.020669967,-0.09361984,-0.019438276,-0.012983339,0.022100516,0.03252378,-0.052587945,0.016381664,-0.047060754,0.015694086,-0.1377361,0.10544033,0.0026725356,0.01146019,0.026346128,-0.025007993,0.004997534,-0.053778246,-0.038643032,0.023108022,0.016371924,-0.015227947,0.0020684898,0.124686636,0.02065184,-0.0070788977,0.031109046,-0.011467157,0.0051159468,0.0174688,0.019905413,-0.0069136377,0.032805618,0.029705629,-0.038734376,0.032078113,-0.01761205,0.01944323,-0.0030690655,0.018461121,0.018608272,-0.012803209,0.017234804,-0.05453963,-0.0014086623,-0.032340996,0.0010491384,0.038566574,-0.03347248,-0.015357926,0.08070545,-0.028756669,-0.046844523,-0.01529485,0.052366853,0.059635386,0.03260225,0.05999529,0.06562162,-0.025594424,0.19492106,-0.09446214,-0.02200547,0.021350436,-0.0047113174,0.03170546,0.032968767,-0.017730163,-0.023518713,-0.024787944,-0.014301349,-0.00028776744,0.015872791,0.015544321,-0.079372294,-0.005725175,0.017331447,-0.0056501715,-0.012182198,-0.009767331,-0.05171092,0.038543854,0.034115233,0.07627104,0.032627165,0.016347326,0.012965246,0.024923127,0.02650983,-0.0040691686,0.04411213,-0.02981039,-0.06744219,-0.030292222,-0.0021420228,-0.06861754,-0.0020280352,-0.08233997,-0.0059836525,0.037955742,0.039244626,0.034866735,0.11366857,0.02521095,0.018243132,0.024956543,0.027358694,0.011940862,-0.061406422,0.0018358993,0.015471496,-0.0400448,-0.024514355,0.020818526,-0.078023,-0.019798901,-0.046464335,-0.03319194,0.16930555,0.050408904,-0.013528864,0.007027566,0.0381429,0.0010658541,-0.011183001,-0.18296444,-0.025517514,-0.028616475,0.044594944,-0.002806602,-0.00036968052,0.040348303,0.022882342,-0.0099050915,-0.029638626,-0.009392766,-0.035751175,-0.02882233,-0.05017968,-0.031793848,0.104784735,0.026196804,0.025192862,0.0053355214,-0.009864406,0.07273947,0.029665705,-0.030834008,0.005743688,0.0130977845,0.027437972,0.042631894,0.02490531,-0.031600703,-0.055224583,-0.04933041,-0.0008777641,-0.002849928,0.06742398,-0.041109774,0.00045421268,-0.008093842,-0.026830377,0.18975478,0.0022353292,0.016124677,0.03874153,-0.01676804,0.0016409162,0.0022479978,0.039468583,-0.03589011,-0.005279329,-0.031004557,-0.014081007,0.058285933,-0.03845023,-0.022855511,0.008495943,-0.013061212,0.029775871,0.024829257,-0.015684903,0.09160675,-0.057623718,0.035138898,0.037533384,0.02173393,-0.20164658,-0.034627892,-0.013216875,0.04897353,-0.058580056,0.018308442,0.028224163,-0.011080451,0.020418232,-0.026639828,0.1152522,0.05399439,-0.017088734,-0.0043683355,0.04675239,0.055089362,0.01442295,0.019836834,-0.013131093,-0.040812545,0.0028349068,0.06096238,0.15055773,-0.0047997017,0.04041006,0.023423078,0.0068679894,-0.036161505,-0.11227965,0.027264446,-0.032434683,-0.033046544,0.05816228,0.019367868,-0.035861887,0.023473343,0.07127074,-0.036597442,0.00892375,-0.03424332,0.15918937,-0.028045062,0.01727863,-0.016116075,-0.033897277,-0.04147993,0.000102095604,0.0054549514,-0.054227076,-0.014035331,0.022229984,-0.0101330625,0.0061006444,0.031121459,0.034375396,0.027529038,0.02083103,-0.01970649,0.01220227,0.048865896,0.04224607,0.034099545,-0.018085487,-0.035159428,-0.057188712],[0.010182182,0.01467856,0.02307528,-0.031243263,-0.019379467,0.018989552,-0.04283347,-0.065710135,0.037127666,-0.00186089,-0.043939225,0.02675395,0.017098242,0.01003573,0.016530303,-0.07529927,-0.0045888554,-0.00783502,-0.16103624,-0.018049028,-0.023261337,0.0726829,0.03554955,0.007101789,-0.03776669,0.03965637,0.010605459,-0.034077637,-0.1356997,-0.17605451,0.017438654,0.021631619,-0.00033740848,-0.05291991,-0.021556789,-0.020458516,-0.035007652,0.015351501,-0.013426498,-0.03958441,0.007752372,-0.016570576,-0.046401996,-0.011264202,0.05016379,-0.013889148,0.023654828,-0.030822476,0.024557399,0.041917533,-0.057632543,-0.032482482,0.00036849198,-0.038682386,-0.046676703,0.050744284,-0.010942368,-0.031797383,0.010470975,0.016948372,0.0055663995,0.058688268,-0.36635372,0.025145743,0.07269215,0.019211076,-0.018371176,-0.007865585,-0.00085583143,0.015894871,0.038337328,-0.014794488,-0.012541673,0.01718971,0.02693935,-0.045785226,0.0036220509,0.021907976,0.06554055,-0.04263025,0.0019336614,0.020152396,0.016324878,0.030021766,-0.015724592,0.06523936,0.0062361993,-0.028796729,0.038781464,0.00485937,-0.04877486,0.035066955,0.003006257,-0.0022367106,-0.04857364,0.001250449,0.0014392686,0.034671582,0.018141782,0.30240846,0.018054346,0.003062208,0.040367432,-0.07040852,0.052332688,-0.0028175337,-0.028020458,-0.021599045,0.031913813,-0.03909125,0.0028893205,-0.017719263,0.0052999025,-0.0061596422,0.054935843,-0.0012574365,-0.016914988,-0.009276138,0.023673639,0.043957185,-0.027961437,0.025381606,-0.04037111,-0.0053644218,-0.01048436,0.0035398034,-0.06366181,0.025020782,-0.046017863,-0.011454832,0.055446308,0.00011163922,-0.09325482,0.019621197,0.022895223,0.03182137,0.0010375826,-0.03117694,0.025362851,-0.031175531,-0.018045994,-0.13010256,0.10690098,-0.010491627,0.025534678,-0.0049998793,-0.028496867,0.043118607,-0.026229834,-0.01440331,0.024678908,0.033322413,-0.04394492,-0.005047783,0.0846922,0.022463208,0.0030116427,-0.003502701,-0.006854317,0.029395698,0.026690561,0.02559026,0.059080407,0.08340788,0.032878075,-0.0951223,0.05720357,0.02495402,0.014070283,-0.0042589814,0.018304987,-0.024781907,-0.041739304,-0.025803747,-0.012889254,-0.008009496,-0.028856821,-0.0005779219,0.028763987,-0.051368624,0.0027247544,0.06316944,-0.026757175,-0.08121664,-0.010547304,0.025082018,0.03702747,0.012908532,0.03141585,0.06318691,-0.027946094,0.17676711,-0.082001895,-0.036393072,-0.034927875,0.021505699,0.015366971,0.043793295,-0.0021506813,0.011197076,-0.04681245,-0.07142668,0.009581391,0.035224073,-0.04230499,-0.03571502,0.044728618,0.013419941,0.04271971,-0.008869499,-0.03126791,-0.0022953814,0.09043066,0.02422671,0.031988394,-0.005063331,-0.01025437,0.028456746,0.005116802,0.047064006,0.006069893,0.018045707,-0.022872277,-0.04572793,0.009827904,0.0069014616,-0.040622003,-0.013080576,-0.04777706,0.0012043755,0.07896354,0.043710608,0.040280547,0.073466524,0.06464221,0.014187437,-0.04872054,0.031972423,0.012510081,-0.038348954,0.016539646,0.006683025,-0.040044174,-0.056529168,0.04949601,-0.09106357,-0.030466262,0.010563386,-0.029358381,0.18323456,0.092901036,0.0274177,0.015892414,0.03165387,-0.06160097,0.0015103974,-0.11125003,0.010338306,-0.04025745,0.03327973,-0.025003629,-0.03141167,0.06007851,-0.029752823,-0.025986204,-0.0014932271,-0.00599316,-0.021954508,-0.005476444,-0.029271869,-0.040407516,0.09515277,0.019253343,0.04248291,0.00067515706,-0.009261151,0.025339367,-0.014061599,-0.0580183,-0.020854905,0.018436473,-0.0027048623,0.05364179,0.03416436,-0.009260716,-0.0785917,-0.023255466,0.03542782,0.07159498,0.0069388812,-0.038117178,-0.012323471,-0.009949083,-0.005902662,0.1273025,0.0014150682,0.018899381,0.022011757,-0.048523538,-0.03720841,-0.009601104,0.0547053,0.013078509,-0.013740014,-0.047507983,-0.018159833,0.017327625,-0.028147077,-0.030314941,-0.0028794382,-0.045816995,0.0028496154,0.015196548,-0.007854572,0.10382276,-0.01617453,0.017708423,0.037362352,0.002230973,-0.17829818,-0.036029417,-0.0006612718,-0.014223209,-0.06350168,-0.030032892,0.023901368,-0.00077770976,0.02510791,-0.04697416,0.15435414,0.08471184,-0.018154247,-0.030085038,0.03331496,0.09898532,0.016086424,0.010282825,-0.018388266,-0.006998348,0.017570151,0.0994389,0.12580456,0.023195932,0.008063885,0.003250409,-0.005355925,-0.047599785,-0.13378266,-0.0018643751,-0.045305796,-0.020819422,0.06300365,0.00095856196,0.005435208,0.0057721534,0.031151773,-0.03753951,0.016918143,-0.044961866,0.13784775,-0.016061982,-0.00000515642,-0.008715281,-0.01241248,-0.0021270465,0.022557234,0.05173467,-0.04232277,0.008206349,0.012508353,-0.004212918,-0.01315854,0.048109457,0.00035447034,-0.0082567325,0.012337424,0.0065427353,0.036199752,0.030513138,0.039167494,-0.028987426,-0.016657345,-0.07125146,-0.020769335]],"total_duration":11837394,"load_duration":2672695,"prompt_eval_count":4}' - recorded_at: Tue, 25 Mar 2025 11:42:32 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_models_fetches_models_from_the_server_at_runtime.yml b/spec/fixtures/vcr_cassettes/providers_ollama_models_fetches_models_from_the_server_at_runtime.yml deleted file mode 100644 index b719a3eb..00000000 --- a/spec/fixtures/vcr_cassettes/providers_ollama_models_fetches_models_from_the_server_at_runtime.yml +++ /dev/null @@ -1,35 +0,0 @@ ---- -http_interactions: -- request: - method: get - uri: http://localhost:11434/api/tags - body: - encoding: US-ASCII - string: '' - headers: - User-Agent: - - Faraday v2.12.2 - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 25 Mar 2025 11:42:33 GMT - Server: - - Caddy - Vary: - - Accept-Encoding - Transfer-Encoding: - - chunked - body: - encoding: ASCII-8BIT - string: '{ "models": [ { "details": { "families": [ "bert" ], "family": "bert", "format": "gguf", "parameter_size": "23M", "parent_model": "", "quantization_level": "F16" }, "digest": "bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb", "model": "snowflake-arctic-embed:22m", "modified_at": "2025-03-25T01:16:44.503745925Z", "name": "snowflake-arctic-embed:22m", "size": 45838698 }, { "details": { "families": [ "llama" ], "family": "llama", "format": "gguf", "parameter_size": "134.52M", "parent_model": "", "quantization_level": "Q4_0" }, "digest": "b0b2a46174385c0adcaa77ff245ffeced5fc4a61447b6f221b2beb5c5a760133", "model": "smollm:135m", "modified_at": "2025-03-25T01:16:43.495760964Z", "name": "smollm:135m", "size": 91739413 } ] }' - recorded_at: Tue, 25 Mar 2025 11:42:29 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/providers_ollama_streaming_ask_with_streaming_works.yml b/spec/fixtures/vcr_cassettes/providers_ollama_streaming_ask_with_streaming_works.yml deleted file mode 100644 index a70a2ebb..00000000 --- a/spec/fixtures/vcr_cassettes/providers_ollama_streaming_ask_with_streaming_works.yml +++ /dev/null @@ -1,101 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"smollm:135m","messages":[{"role":"user","content":"Count - from 1 to 3"}],"options":{"temperature":0.7},"stream":true}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/x-ndjson - Date: - - Tue, 25 Mar 2025 11:42:35 GMT - Server: - - Caddy - Transfer-Encoding: - - chunked - body: - encoding: UTF-8 - string: | - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.7830333Z","message":{"role":"assistant","content":"Here"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.785646727Z","message":{"role":"assistant","content":" is"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.78827431Z","message":{"role":"assistant","content":" a"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.790801785Z","message":{"role":"assistant","content":" Python"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.793274065Z","message":{"role":"assistant","content":" function"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.795874434Z","message":{"role":"assistant","content":" that"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.7984565Z","message":{"role":"assistant","content":" counts"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.801031415Z","message":{"role":"assistant","content":" the"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.803573893Z","message":{"role":"assistant","content":" number"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.806231278Z","message":{"role":"assistant","content":" of"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.808821071Z","message":{"role":"assistant","content":" digits"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.81137248Z","message":{"role":"assistant","content":" in"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.813966219Z","message":{"role":"assistant","content":" a"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.816573617Z","message":{"role":"assistant","content":" string"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.81917068Z","message":{"role":"assistant","content":" and"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.821770818Z","message":{"role":"assistant","content":" returns"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.824417413Z","message":{"role":"assistant","content":" the"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.828470856Z","message":{"role":"assistant","content":" corresponding"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.831226755Z","message":{"role":"assistant","content":" integer"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.834009618Z","message":{"role":"assistant","content":" value"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.83662707Z","message":{"role":"assistant","content":":"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.839237899Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.841888936Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.844437076Z","message":{"role":"assistant","content":"```"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.847064226Z","message":{"role":"assistant","content":"python"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.849627235Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.852219701Z","message":{"role":"assistant","content":"def"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.854814973Z","message":{"role":"assistant","content":" count"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.857436203Z","message":{"role":"assistant","content":"_"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.860108144Z","message":{"role":"assistant","content":"digits"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.862759224Z","message":{"role":"assistant","content":"("},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.865434499Z","message":{"role":"assistant","content":"s"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.868125297Z","message":{"role":"assistant","content":"):"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.870760844Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.873382963Z","message":{"role":"assistant","content":" count"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.875996933Z","message":{"role":"assistant","content":" ="},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.878590201Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.881191519Z","message":{"role":"assistant","content":"0"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.883832365Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.886564727Z","message":{"role":"assistant","content":" for"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.889166207Z","message":{"role":"assistant","content":" digit"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.891879215Z","message":{"role":"assistant","content":" in"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.894548894Z","message":{"role":"assistant","content":" s"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.897207567Z","message":{"role":"assistant","content":":"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.899841625Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.902498196Z","message":{"role":"assistant","content":" if"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.905107832Z","message":{"role":"assistant","content":" digit"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.907789586Z","message":{"role":"assistant","content":"."},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.910502793Z","message":{"role":"assistant","content":"is"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.9143673Z","message":{"role":"assistant","content":"digit"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.917111538Z","message":{"role":"assistant","content":"():"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.919863033Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.922599882Z","message":{"role":"assistant","content":" count"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.925334577Z","message":{"role":"assistant","content":" +="},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.928067663Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.930770166Z","message":{"role":"assistant","content":"1"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.933410933Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.936033812Z","message":{"role":"assistant","content":" return"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.938684522Z","message":{"role":"assistant","content":" int"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.941285311Z","message":{"role":"assistant","content":"("},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.943928387Z","message":{"role":"assistant","content":"count"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.946601129Z","message":{"role":"assistant","content":")"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.94925745Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.951855253Z","message":{"role":"assistant","content":"```"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-25T11:42:35.954468729Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":181710972,"load_duration":5399447,"prompt_eval_count":16,"prompt_eval_duration":2211058,"eval_count":65,"eval_duration":173901215} - recorded_at: Tue, 25 Mar 2025 11:42:31 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/ruby_llm/chat_spec.rb b/spec/ruby_llm/chat_spec.rb index f35c0cf7..16591e81 100644 --- a/spec/ruby_llm/chat_spec.rb +++ b/spec/ruby_llm/chat_spec.rb @@ -12,6 +12,7 @@ 'gemini-2.0-flash', 'deepseek-chat', 'gpt-4o-mini', + # FIXME: this 0.1B model is too dumb to know who Matz is 'smollm:135m' ].each do |model| it "#{model} can have a basic conversation" do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 26df0428..6c7b4270 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -82,16 +82,13 @@ example.run end end -end -RSpec.shared_context 'with configured RubyLLM' do - before do + # Run once before all tests + config.before(:suite) do RubyLLM.configure do |config| - # NOTE: to ensure relevant models are pulled into your local server, do - # bundle exec rake ollama:install_models_for_specs config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', 'http://localhost:11434') - - # FIXME: this clobbers the model list from models.json and results in all tests except for ollama's to fail + # needs to run when ONLY Ollama is configured and before any others are configured + # FIXME: RubyLLM.models.refresh!(provider: 'ollama') would be a cleaner solution RubyLLM.models.refresh! config.openai_api_key = ENV.fetch('OPENAI_API_KEY', 'test') @@ -102,3 +99,7 @@ end end end + +RSpec.shared_context 'with configured RubyLLM' do +end + From a9e9cdcd7fc0ad00462ba7f303091ec5fab38357 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 15:03:09 -0300 Subject: [PATCH 22/55] Remove leftovers --- lib/ruby_llm/providers/ollama/streaming.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index 68cddb8e..2e88839d 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -25,8 +25,6 @@ def handle_stream(&block) end def build_chunk(data) - raise 'wtf' if data.is_a?(Array) - Chunk.new( role: :assistant, content: data.dig('message', 'content'), From 18ec0840a1d4561201e26edbec2e19338877b30f Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 16:42:03 -0300 Subject: [PATCH 23/55] Describe the streaming mystery some more; still no proper solution --- lib/ruby_llm/providers/ollama/streaming.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index 2e88839d..c8283c81 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -13,12 +13,12 @@ def stream_url def handle_stream(&block) to_json_stream do |data| - # FIXME: for some reason, there's an unexpected final call - # from on_data with the complete response as an Array. + # FIXME: on connection close, on_data is called with the entire response so far as one chunk + # consisting of an Array of unparsed JSON strings (ie. an array of lines). # - # It is skipped here, but this smells a bit; this method shouldn't - # need to be overridden just for this. Will look into it - done = data.is_a?(Array) || data['done'] + # It is detected and skipped here, but this is a code smell; + # likely standard SSE behavior which shouldn't be happening for NDJSON streaming. + done = data.is_a?(Array) && data.first.is_a?(String) && data.first[0] == '{' block.call(build_chunk(data)) if data && !done end @@ -47,7 +47,7 @@ def handle_sse(chunk, _parser, env, &block) next if line.empty? parsed_data = JSON.parse(line) - block.call(parsed_data) + block.call(parsed_data) unless parsed_data['done'] end end end From 8735f9585cb3f496ed6e3e6cc8bb08bbfe069b1d Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 17:04:21 -0300 Subject: [PATCH 24/55] Streamline capabilities some more (but still mostly placeholders) --- lib/ruby_llm/providers/ollama/capabilities.rb | 93 ++----------------- lib/ruby_llm/providers/ollama/models.rb | 6 +- 2 files changed, 12 insertions(+), 87 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/capabilities.rb b/lib/ruby_llm/providers/ollama/capabilities.rb index be144b47..1bd590de 100644 --- a/lib/ruby_llm/providers/ollama/capabilities.rb +++ b/lib/ruby_llm/providers/ollama/capabilities.rb @@ -7,11 +7,14 @@ module Ollama module Capabilities module_function + # FIXME: none of these facts are available from the Ollama server, + # or from the Ollama library (https://ollama.com/library) in a structured way. + # Returns the context window size (input token limit) for the given model # @param model_id [String] the model identifier # @return [Integer] the context window size in tokens def context_window_for(_model_id) - # FIXME: revise + # FIXME: placeholder 4_192 # Sensible (and conservative) default for unknown models end @@ -19,29 +22,15 @@ def context_window_for(_model_id) # @param model_id [String] the model identifier # @return [Integer] the maximum output tokens def max_tokens_for(_model_id) - # FIXME: revise + # FIXME: placeholder 32_768 end - # Returns the input price per million tokens for the given model - # @param model_id [String] the model identifier - # @return [Float] the price per million tokens in USD - def input_price_for(_model_id) - 0.0 - end - - # Returns the output price per million tokens for the given model - # @param model_id [String] the model identifier - # @return [Float] the price per million tokens in USD - def output_price_for(_model_id) - 0.0 - end - # Determines if the model supports vision (image/video) inputs # @param model_id [String] the model identifier # @return [Boolean] true if the model supports vision inputs def supports_vision?(_model_id) - # FIXME: revise + # FIXME: placeholder false end @@ -49,7 +38,7 @@ def supports_vision?(_model_id) # @param model_id [String] the model identifier # @return [Boolean] true if the model supports function calling def supports_functions?(_model_id) - # FIXME: revise + # FIXME: placeholder false end @@ -57,45 +46,7 @@ def supports_functions?(_model_id) # @param model_id [String] the model identifier # @return [Boolean] true if the model supports JSON mode def supports_json_mode?(_model_id) - # FIXME: revise - false - end - - # Formats the model ID into a human-readable display name - # @param model_id [String] the model identifier - # @return [String] the formatted display name - def format_display_name(model_id) - model_id - .delete_prefix('models/') - .split('-') - .map(&:capitalize) - .join(' ') - .gsub(/(\d+\.\d+)/, ' \1') # Add space before version numbers - .gsub(/\s+/, ' ') # Clean up multiple spaces - .strip - end - - # Determines if the model supports context caching - # @param model_id [String] the model identifier - # @return [Boolean] true if the model supports caching - def supports_caching?(_model_id) - # FIXME: revise - true - end - - # Determines if the model supports tuning - # @param model_id [String] the model identifier - # @return [Boolean] true if the model supports tuning - def supports_tuning?(_model_id) - # FIXME: revise - false - end - - # Determines if the model supports audio inputs - # @param model_id [String] the model identifier - # @return [Boolean] true if the model supports audio inputs - def supports_audio?(_model_id) - # FIXME: revise + # FIXME: placeholder false end @@ -103,35 +54,9 @@ def supports_audio?(_model_id) # @param model_id [String] the model identifier # @return [String] the model type def model_type(_model_id) - # FIXME: revise + # FIXME: placeholder 'chat' end - - # Returns the model family identifier - # @param model_id [String] the model identifier - # @return [String] the model family identifier - def model_family(_model_id) - 'other' - end - - # Returns the context length for the model - # @param model_id [String] the model identifier - # @return [Integer] the context length in tokens - def context_length(model_id) - context_window_for(model_id) - end - - # Default input price for unknown models - # @return [Float] the default input price per million tokens - def default_input_price - 0.0 - end - - # Default output price for unknown models - # @return [Float] the default output price per million tokens - def default_output_price - 0.0 - end end end end diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb index 0e8dfab5..f7a22bc1 100644 --- a/lib/ruby_llm/providers/ollama/models.rb +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -41,7 +41,7 @@ def parse_list_models_response(response, slug, capabilities) # rubocop:disable M ModelInfo.new( id: model_id, - # NOTE: this is date pulled into ollama, not quite date of introduction of a model + # NOTE: this is date pulled into the Ollama server, not date of introduction of a model created_at: model['modified_at'], display_name: model_id, provider: slug, @@ -52,8 +52,8 @@ def parse_list_models_response(response, slug, capabilities) # rubocop:disable M supports_vision: capabilities.supports_vision?(model_id), supports_functions: capabilities.supports_functions?(model_id), supports_json_mode: capabilities.supports_json_mode?(model_id), - input_price_per_million: capabilities.input_price_for(model_id), - output_price_per_million: capabilities.output_price_for(model_id), + input_price_per_million: 0.0, + output_price_per_million: 0.0, metadata: { byte_size: model['size']&.to_i, parameter_size: model.dig('details', 'parameter_size'), From 8d7fecff185617cf9ec5e70947ecdfd1dea023a0 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 10:49:49 -0300 Subject: [PATCH 25/55] Fix un-VCR'd `models.refresh!` --- .../vcr_cassettes/initial_model_refresh.yml | 35 +++++++++++++++++++ spec/spec_helper.rb | 3 +- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 spec/fixtures/vcr_cassettes/initial_model_refresh.yml diff --git a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml new file mode 100644 index 00000000..bcaab46c --- /dev/null +++ b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml @@ -0,0 +1,35 @@ +--- +http_interactions: +- request: + method: get + uri: http://localhost:11434/api/tags + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 13:46:21 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: '{ "models": [ { "details": { "families": [ "bert" ], "family": "bert", "format": "gguf", "parameter_size": "23M", "parent_model": "", "quantization_level": "F16" }, "digest": "bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb", "model": "snowflake-arctic-embed:22m", "modified_at": "2025-03-25T01:52:52.027398285Z", "name": "snowflake-arctic-embed:22m", "size": 45838698 }, { "details": { "families": [ "llama" ], "family": "llama", "format": "gguf", "parameter_size": "134.52M", "parent_model": "", "quantization_level": "Q4_0" }, "digest": "b0b2a46174385c0adcaa77ff245ffeced5fc4a61447b6f221b2beb5c5a760133", "model": "smollm:135m", "modified_at": "2025-03-25T01:52:51.363408194Z", "name": "smollm:135m", "size": 91739413 } ] }' + recorded_at: Thu, 27 Mar 2025 13:46:15 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 6c7b4270..7dfc15c2 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -83,8 +83,7 @@ end end - # Run once before all tests - config.before(:suite) do + VCR.use_cassette("initial_model_refresh") do RubyLLM.configure do |config| config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', 'http://localhost:11434') # needs to run when ONLY Ollama is configured and before any others are configured From f377120b1f7c6254e19b9812fa2ab631b5c84518 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 11:01:13 -0300 Subject: [PATCH 26/55] Parse errors correctly --- lib/ruby_llm/providers/ollama.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index dd56f6d5..65f96934 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -31,6 +31,13 @@ def slug def configuration_requirements %i[ollama_api_base_url] end + + def parse_error(response) + return if response.body.empty? + + body = try_parse_json(response.body) + body['error'] + end end end end From b8d3c9b38f6cbcb542148f427c22758ae517be1d Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 12:24:56 -0300 Subject: [PATCH 27/55] Fix streaming --- lib/ruby_llm/providers/ollama/streaming.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index c8283c81..96566dda 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -47,7 +47,7 @@ def handle_sse(chunk, _parser, env, &block) next if line.empty? parsed_data = JSON.parse(line) - block.call(parsed_data) unless parsed_data['done'] + block.call(parsed_data) end end end From ce9f430d210efee47a478c05888c71fe6733a05d Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 16:55:43 -0300 Subject: [PATCH 28/55] Settle on llama3.1:8b model It's about 5 GB instead of 92MB, but it supports tool calling well and is a lot more competent. While it's an order of magnitude heavier, it should still be OK for running tests sporadically even on CPU. --- lib/tasks/ollama.rake | 11 +- ...8b_can_handle_multi-turn_conversations.yml | 108 ++++++++++++++++++ ...ma3_1_8b_can_have_a_basic_conversation.yml | 37 ++++++ ...5m_can_handle_multi-turn_conversations.yml | 61 ---------- ...llm_135m_can_have_a_basic_conversation.yml | 74 ------------ ...ama3_1_8b_supports_streaming_responses.yml | 46 ++++++++ ...ollm_135m_supports_streaming_responses.yml | 100 ---------------- .../vcr_cassettes/initial_model_refresh.yml | 6 +- spec/ruby_llm/chat_spec.rb | 18 ++- spec/ruby_llm/chat_streaming_spec.rb | 2 +- 10 files changed, 217 insertions(+), 246 deletions(-) create mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml delete mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_handle_multi-turn_conversations.yml delete mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_have_a_basic_conversation.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml delete mode 100644 spec/fixtures/vcr_cassettes/chat_streaming_responses_smollm_135m_supports_streaming_responses.yml diff --git a/lib/tasks/ollama.rake b/lib/tasks/ollama.rake index ac454932..c28465e6 100644 --- a/lib/tasks/ollama.rake +++ b/lib/tasks/ollama.rake @@ -3,7 +3,9 @@ require 'ruby_llm' def pull_model(ollama_library_model_spec, description) - warn "+ pulling #{ollama_library_model_spec} from Ollama library (#{description})" + warn <<~MESSAGE + + pulling #{ollama_library_model_spec} from Ollama library (#{description}); monitor progress in Ollama server logs + MESSAGE # ugly but effective response = RubyLLM::Providers::Ollama.send( @@ -22,11 +24,12 @@ def pull_model(ollama_library_model_spec, description) end namespace :ollama do - desc 'Install some tiny models required for running Ollama specs (downloads about 150 MB into your Ollama server)' + desc 'Install some tiny models required for running Ollama specs (downloads about 5 GiB into your Ollama server)' task :install_models_for_specs do + RubyLLM.config.request_timeout = 60 * 30 # 30min timeout per model since pull is synchronous RubyLLM.config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL') - pull_model('smollm:135m', '92MiB chat model') - pull_model('snowflake-arctic-embed:22m', '46MiB embedding model') + pull_model('llama3.1:8b', '4.9 GiB chat model') + pull_model('snowflake-arctic-embed:22m', '46 MiB embedding model') end end diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml new file mode 100644 index 00000000..bdaf1f1a --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml @@ -0,0 +1,108 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was + the creator of Ruby?"}],"options":{"temperature":0.7},"stream":false,"tools":[]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:46:58 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '1400' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:46:58.740797174Z","message":{"role":"assistant","content":"The + creator of the Ruby programming language is Yukihiro Matsumoto, a Japanese + computer programmer. He started working on Ruby in 1993 and released the first + version, known as Ruby 0.95, in 1995.\n\nMatsumoto, also known by his nickname + \"Matz,\" wanted to create a language that was easy to use and fun to program + with, while still being powerful enough for real-world applications. He drew + inspiration from various languages, including Perl, Smalltalk, Ada, and Lisp, + and incorporated features such as dynamic typing, object-oriented programming, + and a syntax similar to Perl.\n\nToday, Ruby is a popular language used in + web development (especially with the Ruby on Rails framework), scripting, + and other areas of software development. Matsumoto continues to be involved + in the development of Ruby and has also created several other projects, including + the Ruby on Rails framework and the YARV (Yet Another Ruby VM) project.\n\nMatsumoto + is often referred to as one of the most influential programmers of his generation, + and his work on Ruby has had a significant impact on the programming community."},"done_reason":"stop","done":true,"total_duration":2168998404,"load_duration":18237858,"prompt_eval_count":17,"prompt_eval_duration":3883030,"eval_count":226,"eval_duration":2146427889}' + recorded_at: Thu, 27 Mar 2025 19:46:52 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was + the creator of Ruby?"},{"role":"assistant","content":"The creator of the Ruby + programming language is Yukihiro Matsumoto, a Japanese computer programmer. + He started working on Ruby in 1993 and released the first version, known as + Ruby 0.95, in 1995.\n\nMatsumoto, also known by his nickname \"Matz,\" wanted + to create a language that was easy to use and fun to program with, while still + being powerful enough for real-world applications. He drew inspiration from + various languages, including Perl, Smalltalk, Ada, and Lisp, and incorporated + features such as dynamic typing, object-oriented programming, and a syntax + similar to Perl.\n\nToday, Ruby is a popular language used in web development + (especially with the Ruby on Rails framework), scripting, and other areas + of software development. Matsumoto continues to be involved in the development + of Ruby and has also created several other projects, including the Ruby on + Rails framework and the YARV (Yet Another Ruby VM) project.\n\nMatsumoto is + often referred to as one of the most influential programmers of his generation, + and his work on Ruby has had a significant impact on the programming community."},{"role":"user","content":"What + year did he create Ruby?"}],"options":{"temperature":0.7},"stream":false,"tools":[]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:46:59 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '690' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:46:59.755190489Z","message":{"role":"assistant","content":"Yukihiro + Matsumoto started working on Ruby in 1993, but it was not until 1995 that + the first version, known as Ruby 0.95, was released.\n\nHowever, if you''re + asking for a more specific answer to \"when did he create Ruby?\", I would + say that Matsumoto created the idea and initial design of Ruby around 1992-1993, + but the language gained its final form and was first publicly available in + 1995."},"done_reason":"stop","done":true,"total_duration":1009884033,"load_duration":17976970,"prompt_eval_count":259,"prompt_eval_duration":4256642,"eval_count":99,"eval_duration":986877265}' + recorded_at: Thu, 27 Mar 2025 19:46:53 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml new file mode 100644 index 00000000..3385a1b6 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml @@ -0,0 +1,37 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + 2 + 2?"}],"options":{"temperature":0.7},"stream":false,"tools":[]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '310' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:46:56 GMT + Server: + - Caddy + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:46:56.566074923Z","message":{"role":"assistant","content":"The + answer is: 4!"},"done_reason":"stop","done":true,"total_duration":132025686,"load_duration":17201717,"prompt_eval_count":18,"prompt_eval_duration":25849721,"eval_count":8,"eval_duration":88593644}' + recorded_at: Thu, 27 Mar 2025 19:46:49 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_handle_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_handle_multi-turn_conversations.yml deleted file mode 100644 index 8326a281..00000000 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_handle_multi-turn_conversations.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"smollm:135m","messages":[{"role":"user","content":"Who was - Ruby''s creator?"}],"options":{"temperature":0.7},"stream":false}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 26 Mar 2025 17:20:39 GMT - Transfer-Encoding: - - chunked - body: - encoding: UTF-8 - string: '{"model":"smollm:135m","created_at":"2025-03-26T17:20:39.40000571Z","message":{"role":"assistant","content":"Ruby''s - creator is unknown, but some theories suggest that she might have been a member - of a team or group of women who worked on the project. Here are a few examples:\n\n1. - **Sophie Couture**: The only person to receive the Ruby Award, a posthumous - honor given to women for outstanding performance in a musical, dance, or other - performance art project. This is a notable exception, as it''s unclear whether - she was a member of a team or a single woman on the project.\n2. **Sitse Selvin**: - A member of a team led by her brother, Robert Selvin, who worked with the - project from 1975 to 1983. He is believed to have been a talented pianist - and composer, but his real role remains unknown.\n3. **Vincent Chesnutt**: - A woman who was a member of a team led by her brother, Vincent Chesnutt, who - worked with the project from 1975 to 2006. She is believed to have been a - talented pianist and composer, but her real role remains unknown.\n4. **Sandra - Lee Cox**: A woman who was a member of a team led by her brother, Sandra Cox, - who worked with the project from 1983 to 2007. She is believed to have been - a talented pianist and composer, but her real role remains unknown.\n5. **Rachel - Vash**: A woman who was a member of a team led by her brother, Rachel Vash, - who worked with the project from 1994 to 2008. She is believed to have been - a talented pianist and composer, but her real role remains unknown.\n6. **Laurie - Lidwell**: A woman who was a member of a team led by her brother, Laurie Lidwell, - who worked with the project from 1994 to 2008. She is believed to have been - a talented pianist and composer, but her real role remains unknown.\n7. **Lindsey - Foyne**: A woman who was a member of a team led by her brother, Lindsey Foyne, - who worked with the project from 1994 to 2008. She is believed to have been - a talented pianist and composer, but her real role remains unknown.\n\nThese - are just a few examples of the many people who might have been involved in - the Ruby Award or on the project. While it''s difficult to provide an exact - count, it''s clear that Rachel Vash was a key part of the project."},"done_reason":"stop","done":true,"total_duration":2071286463,"load_duration":5108714,"prompt_eval_count":15,"prompt_eval_duration":8958877,"eval_count":548,"eval_duration":2056874892}' - recorded_at: Wed, 26 Mar 2025 17:20:39 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_have_a_basic_conversation.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_have_a_basic_conversation.yml deleted file mode 100644 index 118d6ebb..00000000 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_smollm_135m_can_have_a_basic_conversation.yml +++ /dev/null @@ -1,74 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"smollm:135m","messages":[{"role":"user","content":"What''s - 2 + 2?"}],"options":{"temperature":0.7},"stream":false}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 26 Mar 2025 17:18:34 GMT - Transfer-Encoding: - - chunked - body: - encoding: UTF-8 - string: '{"model":"smollm:135m","created_at":"2025-03-26T17:18:34.665407999Z","message":{"role":"assistant","content":"What - a great question! The concept of \"1+1\" is a fascinating mathematical operation - that can be understood in various ways. Here are some possible interpretations:\n\n1. - **Counting numbers**: In counting notation (binary, octal, hexadecimal, etc.), - 2 + 2 represents the binary representation of \"1\". This means that it''s - equivalent to adding 1 to itself twice!\n2. **Algebraic operations**: When - two integers are added, they become equivalent by definition. For example, - `a + b = c`, where a is positive and b is negative (i.e., 3+4=7). This equation - shows that 2 + 2 equals 5, which can be considered as \"1+1\" or \"2+2\".\n3. - **Real-world applications**: In some cases, 2 + 2 could represent a real number, - like the sum of two integers: `a + b = c`, where a is positive and b is negative - (i.e., -3). This equation shows that 1 plus 2 equals 5 in this case.\n4. **Fractional - part**: In fractional notation (fractional part), 2+2 could represent the - fractional part of \"1\", like `a/b = 0.2`, where a is positive and b is negative - (i.e., -3). This fraction shows that 2 + 2 equals 5 in this case as well, - albeit with a slightly greater numerator.\n5. **Algebraic expressions**: When - two expressions are algebraic expressions (expression without fractions), - they can be treated similarly to the real-world examples we mentioned earlier: - `a = ab`, where a is positive and b is negative. This expression shows that - 2 + 2 equals 5 in this case, albeit with an extra fraction element added.\n6. - **Symbolic manipulation**: In symbolic manipulation, like in algebra or combinatorics, - the addition of two integers can be represented as `a = ab`, where a is positive - and b is negative. This expression shows that 1 + 2 equals 5 in this case - by definition.\n7. **In mathematics education**: The concept of \"1+1\" has - been part of many mathematical proofs and discussions, often referred to as - \"integral summation\" or \"algebraic summation.\" These ideas can be seen - as a way of representing the summation of two integers that are equivalent - by definition.\n8. **Philosophical significance**: The concept of 2 + 2 raises - fundamental questions about the nature of numbers and their relationship to - reality: What is real, and what is an additive identity? Does zero have a - place in mathematics or can it be treated as a number without being additive - (i.e., 1 cannot equal zero)?\n9. **Mathematical intuition**: The concept of - 2 + 2 can evoke strong mathematical intuitions about the distribution of integers - among positive and negative numbers, which is essential to understanding some - other important properties in mathematics, like the prime number theorem or - the distribution of irrational numbers.\n10. **Philosophical implications**: - The idea of 2 + 2 has been a subject of philosophical debate, with different - interpretations (e.g., \"additive identity\" or \"non-additional\" as an additive - identity) that have challenged our understanding of mathematics and its relationship - to reality.\n\nThese are just a few examples of the many ways in which \"1+1\" - can be understood in various mathematical contexts."},"done_reason":"stop","done":true,"total_duration":3245290565,"load_duration":322808107,"prompt_eval_count":17,"prompt_eval_duration":13628372,"eval_count":733,"eval_duration":2908275176}' - recorded_at: Wed, 26 Mar 2025 17:18:34 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml new file mode 100644 index 00000000..d1a49912 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml @@ -0,0 +1,46 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Count + from 1 to 3","images":[]}],"options":{"temperature":0.7},"stream":true,"tools":[]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Thu, 27 Mar 2025 20:15:12 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.823627546Z","message":{"role":"assistant","content":"Here"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.836926583Z","message":{"role":"assistant","content":" it"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.845628305Z","message":{"role":"assistant","content":" is"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.854520068Z","message":{"role":"assistant","content":":\n\n"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.863223164Z","message":{"role":"assistant","content":"1"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.871980804Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.880710143Z","message":{"role":"assistant","content":"2"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.889518343Z","message":{"role":"assistant","content":"\n"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.89843357Z","message":{"role":"assistant","content":"3"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.907436856Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":3301695608,"load_duration":3125133401,"prompt_eval_count":17,"prompt_eval_duration":88101212,"eval_count":10,"eval_duration":86549601} + recorded_at: Thu, 27 Mar 2025 20:15:06 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_smollm_135m_supports_streaming_responses.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_smollm_135m_supports_streaming_responses.yml deleted file mode 100644 index 390fd1fd..00000000 --- a/spec/fixtures/vcr_cassettes/chat_streaming_responses_smollm_135m_supports_streaming_responses.yml +++ /dev/null @@ -1,100 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"smollm:135m","messages":[{"role":"user","content":"Count - from 1 to 3"}],"options":{"temperature":0.7},"stream":true}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/x-ndjson - Date: - - Wed, 26 Mar 2025 17:18:38 GMT - Transfer-Encoding: - - chunked - body: - encoding: UTF-8 - string: | - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.100562561Z","message":{"role":"assistant","content":"Here"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.104881895Z","message":{"role":"assistant","content":" is"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.109163649Z","message":{"role":"assistant","content":" a"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.113094772Z","message":{"role":"assistant","content":" Python"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.116972445Z","message":{"role":"assistant","content":" function"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.120733929Z","message":{"role":"assistant","content":" that"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.124307882Z","message":{"role":"assistant","content":" counts"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.128387505Z","message":{"role":"assistant","content":" the"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.132135107Z","message":{"role":"assistant","content":" number"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.13578816Z","message":{"role":"assistant","content":" of"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.139146823Z","message":{"role":"assistant","content":" digits"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.142487577Z","message":{"role":"assistant","content":" in"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.145833149Z","message":{"role":"assistant","content":" a"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.149574122Z","message":{"role":"assistant","content":" string"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.153284265Z","message":{"role":"assistant","content":":"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.156734808Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.160126451Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.163615804Z","message":{"role":"assistant","content":"```"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.17177554Z","message":{"role":"assistant","content":"python"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.176081914Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.180185308Z","message":{"role":"assistant","content":"def"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.184394831Z","message":{"role":"assistant","content":" count"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.188109373Z","message":{"role":"assistant","content":"_"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.191586197Z","message":{"role":"assistant","content":"digits"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.19498339Z","message":{"role":"assistant","content":"("},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.198339013Z","message":{"role":"assistant","content":"s"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.201589705Z","message":{"role":"assistant","content":"):"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.205084617Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.208314251Z","message":{"role":"assistant","content":" result"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.211665804Z","message":{"role":"assistant","content":" ="},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.215361477Z","message":{"role":"assistant","content":" {}"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.219057039Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.222497532Z","message":{"role":"assistant","content":" for"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.226058135Z","message":{"role":"assistant","content":" char"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.229534369Z","message":{"role":"assistant","content":" in"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.232965531Z","message":{"role":"assistant","content":" s"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.236452504Z","message":{"role":"assistant","content":":"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.240042996Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.24349197Z","message":{"role":"assistant","content":" if"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.247069563Z","message":{"role":"assistant","content":" char"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.250678586Z","message":{"role":"assistant","content":" not"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.254176448Z","message":{"role":"assistant","content":" in"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.257590831Z","message":{"role":"assistant","content":" result"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.260969383Z","message":{"role":"assistant","content":":"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.264846698Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.268374811Z","message":{"role":"assistant","content":" result"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.272071133Z","message":{"role":"assistant","content":"["},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.275484896Z","message":{"role":"assistant","content":"char"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.278916879Z","message":{"role":"assistant","content":"]"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.282696043Z","message":{"role":"assistant","content":" ="},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.286494845Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.290218278Z","message":{"role":"assistant","content":"0"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.293935121Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.297789735Z","message":{"role":"assistant","content":" result"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.301722288Z","message":{"role":"assistant","content":"["},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.305849971Z","message":{"role":"assistant","content":"char"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.309743804Z","message":{"role":"assistant","content":"]"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.313734477Z","message":{"role":"assistant","content":" +="},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.317732522Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.321434594Z","message":{"role":"assistant","content":"1"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.325045267Z","message":{"role":"assistant","content":"\n "},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.32905447Z","message":{"role":"assistant","content":" return"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.332839624Z","message":{"role":"assistant","content":" result"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.336708717Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.34039667Z","message":{"role":"assistant","content":"```"},"done":false} - {"model":"smollm:135m","created_at":"2025-03-26T17:18:38.343979733Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":261623797,"load_duration":5114494,"prompt_eval_count":16,"prompt_eval_duration":12307330,"eval_count":66,"eval_duration":243867952} - recorded_at: Wed, 26 Mar 2025 17:18:38 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml index bcaab46c..e12a9013 100644 --- a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml +++ b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml @@ -21,7 +21,7 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 13:46:21 GMT + - Thu, 27 Mar 2025 20:15:09 GMT Server: - Caddy Vary: @@ -30,6 +30,6 @@ http_interactions: - chunked body: encoding: ASCII-8BIT - string: '{ "models": [ { "details": { "families": [ "bert" ], "family": "bert", "format": "gguf", "parameter_size": "23M", "parent_model": "", "quantization_level": "F16" }, "digest": "bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb", "model": "snowflake-arctic-embed:22m", "modified_at": "2025-03-25T01:52:52.027398285Z", "name": "snowflake-arctic-embed:22m", "size": 45838698 }, { "details": { "families": [ "llama" ], "family": "llama", "format": "gguf", "parameter_size": "134.52M", "parent_model": "", "quantization_level": "Q4_0" }, "digest": "b0b2a46174385c0adcaa77ff245ffeced5fc4a61447b6f221b2beb5c5a760133", "model": "smollm:135m", "modified_at": "2025-03-25T01:52:51.363408194Z", "name": "smollm:135m", "size": 91739413 } ] }' - recorded_at: Thu, 27 Mar 2025 13:46:15 GMT + string: '{ "models": [ { "details": { "families": [ "granite", "clip" ], "family": "granite", "format": "gguf", "parameter_size": "2.5B", "parent_model": "", "quantization_level": "Q4_K_M" }, "digest": "3be41a661804ad72cd08269816c5a145f1df6479ad07e2b3a7e29dba575d2669", "model": "granite3.2-vision:2b", "modified_at": "2025-03-27T20:09:18.017039337Z", "name": "granite3.2-vision:2b", "size": 2437852465 }, { "details": { "families": [ "llama" ], "family": "llama", "format": "gguf", "parameter_size": "8.0B", "parent_model": "", "quantization_level": "Q4_K_M" }, "digest": "46e0c10c039e019119339687c3c1757cc81b9da49709a3b3924863ba87ca666e", "model": "llama3.1:8b", "modified_at": "2025-03-27T19:29:58.416254293Z", "name": "llama3.1:8b", "size": 4920753328 }, { "details": { "families": [ "bert" ], "family": "bert", "format": "gguf", "parameter_size": "23M", "parent_model": "", "quantization_level": "F16" }, "digest": "bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb", "model": "snowflake-arctic-embed:22m", "modified_at": "2025-03-25T01:52:52.027398285Z", "name": "snowflake-arctic-embed:22m", "size": 45838698 } ] }' + recorded_at: Thu, 27 Mar 2025 20:15:02 GMT recorded_with: VCR 6.3.1 diff --git a/spec/ruby_llm/chat_spec.rb b/spec/ruby_llm/chat_spec.rb index 16591e81..b8d7b789 100644 --- a/spec/ruby_llm/chat_spec.rb +++ b/spec/ruby_llm/chat_spec.rb @@ -12,8 +12,7 @@ 'gemini-2.0-flash', 'deepseek-chat', 'gpt-4o-mini', - # FIXME: this 0.1B model is too dumb to know who Matz is - 'smollm:135m' + 'llama3.1:8b' ].each do |model| it "#{model} can have a basic conversation" do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) @@ -28,7 +27,20 @@ it "#{model} can handle multi-turn conversations" do # rubocop:disable RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) - first = chat.ask("Who was Ruby's creator?") + first = + if model =~ /llama/ + # HACK: provisional code just to exemplify a problem with the original question. + # llama3.1:8b takes "Ruby's creator" to refer to some fictional character, + # but apparently "creator of Ruby" sounds less about a person and gives it a little helpful push. + # + # Ideally the question could be changed and other cassettes re-recorded; + # otherwise this can probably be solved with a bigger model but it will make the repeating Ollama tests + # more computationally expensive for everyone. + chat.ask('Who was the creator of Ruby?') + else + chat.ask("Who was Ruby's creator?") + end + expect(first.content).to include('Matz') followup = chat.ask('What year did he create Ruby?') diff --git a/spec/ruby_llm/chat_streaming_spec.rb b/spec/ruby_llm/chat_streaming_spec.rb index 0f40e121..6343102b 100644 --- a/spec/ruby_llm/chat_streaming_spec.rb +++ b/spec/ruby_llm/chat_streaming_spec.rb @@ -12,7 +12,7 @@ 'gemini-2.0-flash', 'deepseek-chat', 'gpt-4o-mini', - 'smollm:135m' + 'llama3.1:8b' ].each do |model| it "#{model} supports streaming responses" do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) From e0d072f2b08fcabdf0bd144bf59205095ac36ece Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Wed, 26 Mar 2025 20:47:28 -0300 Subject: [PATCH 29/55] Implement vision --- lib/ruby_llm/providers/ollama.rb | 1 + lib/ruby_llm/providers/ollama/chat.rb | 11 +----- lib/ruby_llm/providers/ollama/media.rb | 37 +++++++++++++++++++ lib/tasks/ollama.rake | 3 +- ...ite3_2-vision_2b_can_understand_images.yml | 37 +++++++++++++++++++ spec/ruby_llm/chat_content_spec.rb | 3 +- 6 files changed, 80 insertions(+), 12 deletions(-) create mode 100644 lib/ruby_llm/providers/ollama/media.rb create mode 100644 spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index 65f96934..7441e50c 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -9,6 +9,7 @@ module Ollama extend Ollama::Embeddings extend Ollama::Models extend Ollama::Streaming + extend Ollama::Media module_function diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index 39d64b3e..20305a90 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -16,7 +16,7 @@ def render_payload(messages, tools:, temperature:, model:, stream: false) { model: model, - messages: format_messages(messages), + messages: Media.format_messages(messages), options: { temperature: temperature }, @@ -24,15 +24,6 @@ def render_payload(messages, tools:, temperature:, model:, stream: false) } end - def format_messages(messages) - messages.map do |msg| - { - role: msg.role.to_s, - content: msg.content.to_s - } - end - end - def parse_completion_response(response) data = response.body diff --git a/lib/ruby_llm/providers/ollama/media.rb b/lib/ruby_llm/providers/ollama/media.rb new file mode 100644 index 00000000..f63759cb --- /dev/null +++ b/lib/ruby_llm/providers/ollama/media.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module RubyLLM + module Providers + module Ollama + # Handles formatting of text or media content for Ollama + module Media + module_function + + def format_messages(messages) + messages.map do |msg| + text = nil + images = [] + + if msg.content.is_a?(Array) + msg.content.each do |part| + case part[:type] + when 'text' + text = part[:text] + when 'image' + images << part[:source][:data] + end + end + else + text = msg.content + end + + { + role: msg.role.to_s, + content: text, + }.tap { |h| h.merge!(images: images) if images.any? } + end + end + end + end + end +end diff --git a/lib/tasks/ollama.rake b/lib/tasks/ollama.rake index c28465e6..f07dcc73 100644 --- a/lib/tasks/ollama.rake +++ b/lib/tasks/ollama.rake @@ -24,12 +24,13 @@ def pull_model(ollama_library_model_spec, description) end namespace :ollama do - desc 'Install some tiny models required for running Ollama specs (downloads about 5 GiB into your Ollama server)' + desc 'Install some tiny models required for running Ollama specs (downloads about 7.5 GiB into your Ollama server)' task :install_models_for_specs do RubyLLM.config.request_timeout = 60 * 30 # 30min timeout per model since pull is synchronous RubyLLM.config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL') pull_model('llama3.1:8b', '4.9 GiB chat model') + pull_model('granite3.2-vision:2b', '2.4 GiB vision model') pull_model('snowflake-arctic-embed:22m', '46 MiB embedding model') end end diff --git a/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml b/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml new file mode 100644 index 00000000..441cca98 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml @@ -0,0 +1,37 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"granite3.2-vision:2b","messages":[{"role":"user","content":"What + do you see in this image?","images":["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"]}],"options":{"temperature":0.7},"stream":false,"tools":[]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '380' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 20:10:23 GMT + Server: + - Caddy + body: + encoding: UTF-8 + string: '{"model":"granite3.2-vision:2b","created_at":"2025-03-27T20:10:23.42586545Z","message":{"role":"assistant","content":"\nI + see a red diamond-like object with a white center on a black background."},"done_reason":"stop","done":true,"total_duration":165572248,"load_duration":6699362,"prompt_eval_count":2242,"prompt_eval_duration":24375911,"eval_count":20,"eval_duration":133708153}' + recorded_at: Thu, 27 Mar 2025 20:10:16 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/ruby_llm/chat_content_spec.rb b/spec/ruby_llm/chat_content_spec.rb index f72493a9..39d34f92 100644 --- a/spec/ruby_llm/chat_content_spec.rb +++ b/spec/ruby_llm/chat_content_spec.rb @@ -13,7 +13,8 @@ [ 'claude-3-5-haiku-20241022', 'gemini-2.0-flash', - 'gpt-4o-mini' + 'gpt-4o-mini', + 'granite3.2-vision:2b' ].each do |model| it "#{model} can understand images" do # rubocop:disable RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) From 5a621886399884ccce7b008cfa2e8fafd697b288 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 10:04:55 -0300 Subject: [PATCH 30/55] Implement tool calling --- lib/ruby_llm/providers/ollama.rb | 1 + lib/ruby_llm/providers/ollama/capabilities.rb | 2 +- lib/ruby_llm/providers/ollama/chat.rb | 8 +-- lib/ruby_llm/providers/ollama/streaming.rb | 1 + lib/ruby_llm/providers/ollama/tools.rb | 54 +++++++++++++++++++ 5 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 lib/ruby_llm/providers/ollama/tools.rb diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index 7441e50c..e66c9310 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -10,6 +10,7 @@ module Ollama extend Ollama::Models extend Ollama::Streaming extend Ollama::Media + extend Ollama::Tools module_function diff --git a/lib/ruby_llm/providers/ollama/capabilities.rb b/lib/ruby_llm/providers/ollama/capabilities.rb index 1bd590de..263201ed 100644 --- a/lib/ruby_llm/providers/ollama/capabilities.rb +++ b/lib/ruby_llm/providers/ollama/capabilities.rb @@ -39,7 +39,7 @@ def supports_vision?(_model_id) # @return [Boolean] true if the model supports function calling def supports_functions?(_model_id) # FIXME: placeholder - false + true end # Determines if the model supports JSON mode diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index 20305a90..6a5cbe65 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -12,15 +12,14 @@ def completion_url end def render_payload(messages, tools:, temperature:, model:, stream: false) - raise NotImplementedError, 'tool use not implemented in Ollama at this time' if tools.any? - { model: model, messages: Media.format_messages(messages), options: { temperature: temperature }, - stream: stream + stream: stream, + tools: tools.map { |_, tool| tool_for(tool) } } end @@ -32,7 +31,8 @@ def parse_completion_response(response) content: data.dig('message', 'content'), input_tokens: data['prompt_eval_count'].to_i, output_tokens: data['eval_count'].to_i, - model_id: data['model'] + model_id: data['model'], + tool_calls: parse_tool_calls(data.dig('message', 'tool_calls')) ) end end diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index 96566dda..289d011c 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -29,6 +29,7 @@ def build_chunk(data) role: :assistant, content: data.dig('message', 'content'), model_id: data['model'], + tool_calls: parse_tool_calls(data.dig('message', 'tool_calls')), # NOTE: unavailable in the response - https://ollama.readthedocs.io/en/api/#streaming-responses input_tokens: nil, diff --git a/lib/ruby_llm/providers/ollama/tools.rb b/lib/ruby_llm/providers/ollama/tools.rb new file mode 100644 index 00000000..257c51fb --- /dev/null +++ b/lib/ruby_llm/providers/ollama/tools.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +module RubyLLM + module Providers + module Ollama + # Tools methods of the Ollama API integration + module Tools + module_function + + def tool_for(tool) + { + type: 'function', + function: { + name: tool.name, + description: tool.description, + parameters: { + type: 'object', + properties: tool.parameters.transform_values { |param| param_schema(param) }, + required: tool.parameters.select { |_, p| p.required }.keys + } + } + } + end + + def param_schema(param) + { + type: param.type, + description: param.description + }.compact + end + + def parse_tool_calls(tool_calls) + return nil unless tool_calls&.any? + + tool_calls.to_h do |tc| + tc = tc['function'] if tc['function'] + name = tc['name'] + next [nil, nil] unless name =~ /\S/ + + [ + name, + ToolCall.new( + id: name, + name: name, + arguments: tc['arguments'] + ) + ] + end.compact + end + + end + end + end +end From 87f8955090da1449c7cd04699c4de17b0f234d54 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 16:26:23 -0300 Subject: [PATCH 31/55] Attempt to parse tool calling markup in text response --- lib/ruby_llm/providers/ollama/chat.rb | 2 +- lib/ruby_llm/providers/ollama/streaming.rb | 2 ++ lib/ruby_llm/providers/ollama/tools.rb | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index 6a5cbe65..85905396 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -24,7 +24,7 @@ def render_payload(messages, tools:, temperature:, model:, stream: false) end def parse_completion_response(response) - data = response.body + data = Tools.preprocess_tool_calls(response.body) Message.new( role: :assistant, diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index 289d011c..89e868d2 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -25,6 +25,8 @@ def handle_stream(&block) end def build_chunk(data) + data = Tools.preprocess_tool_calls(data) + Chunk.new( role: :assistant, content: data.dig('message', 'content'), diff --git a/lib/ruby_llm/providers/ollama/tools.rb b/lib/ruby_llm/providers/ollama/tools.rb index 257c51fb..2e6c76f6 100644 --- a/lib/ruby_llm/providers/ollama/tools.rb +++ b/lib/ruby_llm/providers/ollama/tools.rb @@ -48,6 +48,26 @@ def parse_tool_calls(tool_calls) end.compact end + # HACK: Llama3.x yields this in the proper tool_calls response field, + # but some other models return it as markup inside the text response. + # + # Unfortunately said other models are all over the place when it comes + # to sticking to a format so this doesn't cover all edge cases. + def preprocess_tool_calls(response_data) + # Move JSON markup from inside the text to its + # specific field in the response where it should be. + # https://github.com/ollama/ollama/blob/main/docs/api.md#chat-request-with-tools + + tc = response_data['message']['tool_calls'] ||= [] + response_data['message']['content']&.gsub!(%r{(.*)}mi) do + capture = $1 + tc << JSON.parse(capture) if capture =~ /^\s*{/ + '' + end + tc.flatten! + response_data + end + end end end From e810a7ab1d878fa48b7baac97ccadd40946a6942 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 16:57:32 -0300 Subject: [PATCH 32/55] Use low temperature when tools are involved --- lib/ruby_llm/chat.rb | 4 +++- lib/ruby_llm/providers/ollama/chat.rb | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/ruby_llm/chat.rb b/lib/ruby_llm/chat.rb index 9c6d2941..7d42f9fe 100644 --- a/lib/ruby_llm/chat.rb +++ b/lib/ruby_llm/chat.rb @@ -11,12 +11,14 @@ module RubyLLM class Chat include Enumerable + DEFAULT_TEMPERATURE = 0.7 + attr_reader :model, :messages, :tools def initialize(model: nil, provider: nil) model_id = model || RubyLLM.config.default_model with_model(model_id, provider: provider) - @temperature = 0.7 + @temperature = DEFAULT_TEMPERATURE @messages = [] @tools = {} @on = { diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index 85905396..c3213a48 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -12,6 +12,11 @@ def completion_url end def render_payload(messages, tools:, temperature:, model:, stream: false) + # Heuristic: if temperature is set to default and tools are in play, + # use a low temperature to reduce risk of small models ignoring available + # tools in favor of making up imaginary API calls + temperature = 0.1 if tools.any? && temperature == RubyLLM::Chat::DEFAULT_TEMPERATURE + { model: model, messages: Media.format_messages(messages), From 68c257d9421f8e2cb1f70ce008fba8f3a748cc39 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 16:58:17 -0300 Subject: [PATCH 33/55] Passing tools spec --- ...tion_calling_llama3_1_8b_can_use_tools.yml | 77 +++++++++ ..._use_tools_in_multi-turn_conversations.yml | 159 +++++++++++++++++ ...ith_multi-turn_streaming_conversations.yml | 163 ++++++++++++++++++ ..._1_8b_can_use_tools_without_parameters.yml | 87 ++++++++++ spec/ruby_llm/chat_tools_spec.rb | 3 +- 5 files changed, 488 insertions(+), 1 deletion(-) create mode 100644 spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml new file mode 100644 index 00000000..fcb62cfe --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml @@ -0,0 +1,77 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '400' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:40:44 GMT + Server: + - Caddy + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:44.116572023Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":330510672,"load_duration":19297272,"prompt_eval_count":205,"prompt_eval_duration":10692419,"eval_count":28,"eval_duration":300128824}' + recorded_at: Thu, 27 Mar 2025 19:40:37 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '412' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:40:44 GMT + Server: + - Caddy + body: + encoding: ASCII-8BIT + string: !binary |- + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDQuNDI0MDA1MTYzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjMwNDAyODUzNCwibG9hZF9kdXJhdGlvbiI6MTUzMzQwODgsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTI3NTUyLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjgyMTgxMjMzfQ== + recorded_at: Thu, 27 Mar 2025 19:40:37 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml new file mode 100644 index 00000000..fa2df115 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml @@ -0,0 +1,159 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '400' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:40:44 GMT + Server: + - Caddy + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:44.764703701Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":335981205,"load_duration":15122386,"prompt_eval_count":205,"prompt_eval_duration":10534932,"eval_count":28,"eval_duration":309925415}' + recorded_at: Thu, 27 Mar 2025 19:40:38 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '412' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:40:45 GMT + Server: + - Caddy + body: + encoding: ASCII-8BIT + string: !binary |- + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDUuMDY4MDEwMDM2WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjMwMDI2MzMwOSwibG9hZF9kdXJhdGlvbiI6MTQ5NTQxNzQsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTE2OTIzLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6Mjc4ODY0NjM5fQ== + recorded_at: Thu, 27 Mar 2025 19:40:38 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The + tool call response indicates that the current temperature in Berlin is 15°C + and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s + the weather in Paris? (48.8575, 2.3514)"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '399' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:40:45 GMT + Server: + - Caddy + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:45.402105882Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done_reason":"stop","done":true,"total_duration":331334328,"load_duration":14896321,"prompt_eval_count":297,"prompt_eval_duration":10733730,"eval_count":28,"eval_duration":304577059}' + recorded_at: Thu, 27 Mar 2025 19:40:38 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The + tool call response indicates that the current temperature in Berlin is 15°C + and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s + the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant"},{"role":"tool","content":"Current + weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '411' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:40:45 GMT + Server: + - Caddy + body: + encoding: ASCII-8BIT + string: !binary |- + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDUuNzAyNDY0MTY5WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk3ODU1NTcxLCJsb2FkX2R1cmF0aW9uIjoxNDgwMTQ1OCwicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjYwNjY0MjcsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyNzU4MDMyMjl9 + recorded_at: Thu, 27 Mar 2025 19:40:39 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml new file mode 100644 index 00000000..410d9bce --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml @@ -0,0 +1,163 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Thu, 27 Mar 2025 19:40:48 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"llama3.1:8b","created_at":"2025-03-27T19:40:48.272828677Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T19:40:48.282376206Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":321662603,"load_duration":14969862,"prompt_eval_count":205,"prompt_eval_duration":10628407,"eval_count":28,"eval_duration":295554306} + recorded_at: Thu, 27 Mar 2025 19:40:41 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Thu, 27 Mar 2025 19:40:48 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: !binary |- + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDguNTc5MTczMzY4WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIG91dHB1dCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBpbiBCZXJsaW4gaXMgMTXCsEMgYW5kIHRoZXJlJ3MgYSB3aW5kIHNwZWVkIG9mIDEwIGttL2guIn0sImRvbmVfcmVhc29uIjoic3RvcCIsImRvbmUiOnRydWUsInRvdGFsX2R1cmF0aW9uIjoyOTM1NTMyNzcsImxvYWRfZHVyYXRpb24iOjE0NjI3NTEyLCJwcm9tcHRfZXZhbF9jb3VudCI6MTEyLCJwcm9tcHRfZXZhbF9kdXJhdGlvbiI6NjEwNTcwMiwiZXZhbF9jb3VudCI6MjgsImV2YWxfZHVyYXRpb24iOjI3MjIzOTc3MX0K + recorded_at: Thu, 27 Mar 2025 19:40:41 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The + tool call output indicates that the current temperature in Berlin is 15°C + and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s + the weather in Paris? (48.8575, 2.3514)"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Thu, 27 Mar 2025 19:40:48 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"llama3.1:8b","created_at":"2025-03-27T19:40:48.899731222Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T19:40:48.909582967Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":327110248,"load_duration":14711739,"prompt_eval_count":297,"prompt_eval_duration":11275239,"eval_count":28,"eval_duration":300057920} + recorded_at: Thu, 27 Mar 2025 19:40:42 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The + tool call output indicates that the current temperature in Berlin is 15°C + and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s + the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant"},{"role":"tool","content":"Current + weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude + (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., + 13.4050)"}},"required":["latitude","longitude"]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Thu, 27 Mar 2025 19:40:49 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: !binary |- + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDkuMjEwNzE3NDQyWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIG91dHB1dCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBpbiBQYXJpcyBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5ODAxMzMxNiwibG9hZF9kdXJhdGlvbiI6MTUyNTkzMTMsInByb21wdF9ldmFsX2NvdW50IjoyMDQsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTExNjA3LCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6Mjc1NzAxNzY3fQo= + recorded_at: Thu, 27 Mar 2025 19:40:42 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml new file mode 100644 index 00000000..ef9cae23 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml @@ -0,0 +1,87 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the best language to learn?"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '372' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:40:45 GMT + Server: + - Caddy + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:45.890115845Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done_reason":"stop","done":true,"total_duration":182670710,"load_duration":15026207,"prompt_eval_count":155,"prompt_eval_duration":8306450,"eval_count":15,"eval_duration":158941659}' + recorded_at: Thu, 27 Mar 2025 19:40:39 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the best language to learn?"},{"role":"assistant"},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 27 Mar 2025 19:40:47 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '1360' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:47.954756575Z","message":{"role":"assistant","content":"The + tool suggests Ruby as one of the top languages to learn, but it doesn''t provide + any specific reasons why. Let me try to get more information from the tool.\n\nOkay, + I''ve got some additional data from the tool. It seems that Ruby is a popular + choice for web development and has a strong focus on simplicity and ease of + use. However, the tool also suggests considering other languages such as Python, + JavaScript, or Java, depending on your specific needs and goals.\n\nHere''s + a more detailed breakdown:\n\n* **Ruby**: Great for web development, especially + with the Ruby on Rails framework.\n* **Python**: Versatile language suitable + for data science, machine learning, web development, and more.\n* **JavaScript**: + Essential for front-end web development and popular in back-end development + as well.\n* **Java**: Object-oriented language used in Android app development, + web development, and enterprise software development.\n\nUltimately, the best + language to learn depends on your interests, career goals, and the type of + projects you want to work on."},"done_reason":"stop","done":true,"total_duration":2061922803,"load_duration":14748701,"prompt_eval_count":77,"prompt_eval_duration":4208460,"eval_count":211,"eval_duration":2042436378}' + recorded_at: Thu, 27 Mar 2025 19:40:41 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/ruby_llm/chat_tools_spec.rb b/spec/ruby_llm/chat_tools_spec.rb index daa0821a..acafc3c1 100644 --- a/spec/ruby_llm/chat_tools_spec.rb +++ b/spec/ruby_llm/chat_tools_spec.rb @@ -28,7 +28,8 @@ def execute [ 'claude-3-5-haiku-20241022', 'gemini-2.0-flash', - 'gpt-4o-mini' + 'gpt-4o-mini', + 'llama3.1:8b' ].each do |model| it "#{model} can use tools" do # rubocop:disable RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) From bb2e1bfe7f0888ba9a13be1f7c6615630ebb51c0 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 12:37:13 -0300 Subject: [PATCH 34/55] Rubocop appeasement --- lib/ruby_llm/providers/ollama/media.rb | 2 +- lib/ruby_llm/providers/ollama/tools.rb | 3 +-- spec/spec_helper.rb | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/media.rb b/lib/ruby_llm/providers/ollama/media.rb index f63759cb..c9d38d4c 100644 --- a/lib/ruby_llm/providers/ollama/media.rb +++ b/lib/ruby_llm/providers/ollama/media.rb @@ -27,7 +27,7 @@ def format_messages(messages) { role: msg.role.to_s, - content: text, + content: text }.tap { |h| h.merge!(images: images) if images.any? } end end diff --git a/lib/ruby_llm/providers/ollama/tools.rb b/lib/ruby_llm/providers/ollama/tools.rb index 2e6c76f6..5f2a8872 100644 --- a/lib/ruby_llm/providers/ollama/tools.rb +++ b/lib/ruby_llm/providers/ollama/tools.rb @@ -60,14 +60,13 @@ def preprocess_tool_calls(response_data) tc = response_data['message']['tool_calls'] ||= [] response_data['message']['content']&.gsub!(%r{(.*)}mi) do - capture = $1 + capture = ::Regexp.last_match(1) tc << JSON.parse(capture) if capture =~ /^\s*{/ '' end tc.flatten! response_data end - end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 7dfc15c2..51e9ce6b 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -83,7 +83,8 @@ end end - VCR.use_cassette("initial_model_refresh") do + # Run once at test suite startup + VCR.use_cassette('initial_model_refresh') do RubyLLM.configure do |config| config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', 'http://localhost:11434') # needs to run when ONLY Ollama is configured and before any others are configured @@ -101,4 +102,3 @@ RSpec.shared_context 'with configured RubyLLM' do end - From c57613cca172e5da3c00c958f9aa126f9aa08aa6 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 17:57:49 -0300 Subject: [PATCH 35/55] Refresh cassettes for good measure --- ...8b_can_handle_multi-turn_conversations.yml | 89 ++++++++++--------- ...ma3_1_8b_can_have_a_basic_conversation.yml | 10 +-- ...tion_calling_llama3_1_8b_can_use_tools.yml | 16 ++-- ..._use_tools_in_multi-turn_conversations.yml | 32 +++---- ...ith_multi-turn_streaming_conversations.yml | 40 ++++----- ..._1_8b_can_use_tools_without_parameters.yml | 39 +++----- ...ama3_1_8b_supports_streaming_responses.yml | 29 +++--- ...ite3_2-vision_2b_can_understand_images.yml | 10 +-- 8 files changed, 129 insertions(+), 136 deletions(-) diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml index bdaf1f1a..d4a8a25c 100644 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml @@ -24,52 +24,51 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:46:58 GMT + - Thu, 27 Mar 2025 20:52:52 GMT Server: - Caddy Vary: - Accept-Encoding Content-Length: - - '1400' + - '1339' body: encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:46:58.740797174Z","message":{"role":"assistant","content":"The - creator of the Ruby programming language is Yukihiro Matsumoto, a Japanese - computer programmer. He started working on Ruby in 1993 and released the first - version, known as Ruby 0.95, in 1995.\n\nMatsumoto, also known by his nickname - \"Matz,\" wanted to create a language that was easy to use and fun to program - with, while still being powerful enough for real-world applications. He drew - inspiration from various languages, including Perl, Smalltalk, Ada, and Lisp, - and incorporated features such as dynamic typing, object-oriented programming, - and a syntax similar to Perl.\n\nToday, Ruby is a popular language used in - web development (especially with the Ruby on Rails framework), scripting, - and other areas of software development. Matsumoto continues to be involved - in the development of Ruby and has also created several other projects, including - the Ruby on Rails framework and the YARV (Yet Another Ruby VM) project.\n\nMatsumoto - is often referred to as one of the most influential programmers of his generation, - and his work on Ruby has had a significant impact on the programming community."},"done_reason":"stop","done":true,"total_duration":2168998404,"load_duration":18237858,"prompt_eval_count":17,"prompt_eval_duration":3883030,"eval_count":226,"eval_duration":2146427889}' - recorded_at: Thu, 27 Mar 2025 19:46:52 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:52.883344011Z","message":{"role":"assistant","content":"The + creator of the programming language Ruby is Yukihiro Matsumoto, a Japanese + computer programmer. He began working on Ruby in 1993 and released the first + version, Ruby 0.95, in 1995. Matsumoto''s goal with Ruby was to create a language + that was easy to use and enjoyable for developers, while also being powerful + and flexible.\n\nMatsumoto, who is often referred to as \"Matz\" by his peers, + has continued to be involved with the development of Ruby throughout its history, + and is still active in the community today. He is known for his commitment + to making Ruby a language that is accessible to developers of all skill levels, + and for his emphasis on the importance of community and collaboration.\n\nIn + 1999, Matsumoto founded the Ruby Development Team (now known as the Ruby Core + Team), which oversees the development of the Ruby programming language. Today, + Ruby is widely used in web development, scripting, and other applications, + and has a large and active global community of developers who contribute to + its growth and development."},"done_reason":"stop","done":true,"total_duration":2099993065,"load_duration":15225883,"prompt_eval_count":17,"prompt_eval_duration":4027231,"eval_count":216,"eval_duration":2080377970}' + recorded_at: Thu, 27 Mar 2025 20:52:46 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was - the creator of Ruby?"},{"role":"assistant","content":"The creator of the Ruby - programming language is Yukihiro Matsumoto, a Japanese computer programmer. - He started working on Ruby in 1993 and released the first version, known as - Ruby 0.95, in 1995.\n\nMatsumoto, also known by his nickname \"Matz,\" wanted - to create a language that was easy to use and fun to program with, while still - being powerful enough for real-world applications. He drew inspiration from - various languages, including Perl, Smalltalk, Ada, and Lisp, and incorporated - features such as dynamic typing, object-oriented programming, and a syntax - similar to Perl.\n\nToday, Ruby is a popular language used in web development - (especially with the Ruby on Rails framework), scripting, and other areas - of software development. Matsumoto continues to be involved in the development - of Ruby and has also created several other projects, including the Ruby on - Rails framework and the YARV (Yet Another Ruby VM) project.\n\nMatsumoto is - often referred to as one of the most influential programmers of his generation, - and his work on Ruby has had a significant impact on the programming community."},{"role":"user","content":"What + the creator of Ruby?"},{"role":"assistant","content":"The creator of the programming + language Ruby is Yukihiro Matsumoto, a Japanese computer programmer. He began + working on Ruby in 1993 and released the first version, Ruby 0.95, in 1995. + Matsumoto''s goal with Ruby was to create a language that was easy to use + and enjoyable for developers, while also being powerful and flexible.\n\nMatsumoto, + who is often referred to as \"Matz\" by his peers, has continued to be involved + with the development of Ruby throughout its history, and is still active in + the community today. He is known for his commitment to making Ruby a language + that is accessible to developers of all skill levels, and for his emphasis + on the importance of community and collaboration.\n\nIn 1999, Matsumoto founded + the Ruby Development Team (now known as the Ruby Core Team), which oversees + the development of the Ruby programming language. Today, Ruby is widely used + in web development, scripting, and other applications, and has a large and + active global community of developers who contribute to its growth and development."},{"role":"user","content":"What year did he create Ruby?"}],"options":{"temperature":0.7},"stream":false,"tools":[]}' headers: User-Agent: @@ -88,21 +87,25 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:46:59 GMT + - Thu, 27 Mar 2025 20:52:54 GMT Server: - Caddy Vary: - Accept-Encoding Content-Length: - - '690' + - '1022' body: encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:46:59.755190489Z","message":{"role":"assistant","content":"Yukihiro - Matsumoto started working on Ruby in 1993, but it was not until 1995 that - the first version, known as Ruby 0.95, was released.\n\nHowever, if you''re - asking for a more specific answer to \"when did he create Ruby?\", I would - say that Matsumoto created the idea and initial design of Ruby around 1992-1993, - but the language gained its final form and was first publicly available in - 1995."},"done_reason":"stop","done":true,"total_duration":1009884033,"load_duration":17976970,"prompt_eval_count":259,"prompt_eval_duration":4256642,"eval_count":99,"eval_duration":986877265}' - recorded_at: Thu, 27 Mar 2025 19:46:53 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.655557443Z","message":{"role":"assistant","content":"Yukihiro + Matsumoto began working on the design of the Ruby programming language in + 1993. He started writing the code for Ruby in December 1995, and released + the first version, Ruby 0.95, on February 24, 1995.\n\nHowever, it''s worth + noting that the language as we know it today, with its modern syntax and features, + was finalized around 1997-1998. Matsumoto has said in interviews that he considered + Ruby to be a \"finished\" product by around 1998, although it continues to + evolve and improve to this day.\n\nSo while 1993 marks the beginning of Matsumoto''s + work on Ruby, 1995 is the year when the first version of the language was + released, and 1997-1998 mark the time when the modern version of Ruby started + to take shape."},"done_reason":"stop","done":true,"total_duration":1768670371,"load_duration":15370697,"prompt_eval_count":249,"prompt_eval_duration":4097509,"eval_count":177,"eval_duration":1748440674}' + recorded_at: Thu, 27 Mar 2025 20:52:47 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml index 3385a1b6..8ec4969c 100644 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml @@ -22,16 +22,16 @@ http_interactions: message: OK headers: Content-Length: - - '310' + - '309' Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:46:56 GMT + - Thu, 27 Mar 2025 20:52:50 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:46:56.566074923Z","message":{"role":"assistant","content":"The - answer is: 4!"},"done_reason":"stop","done":true,"total_duration":132025686,"load_duration":17201717,"prompt_eval_count":18,"prompt_eval_duration":25849721,"eval_count":8,"eval_duration":88593644}' - recorded_at: Thu, 27 Mar 2025 19:46:49 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:50.778698618Z","message":{"role":"assistant","content":"The + answer is 4!"},"done_reason":"stop","done":true,"total_duration":113151682,"load_duration":17646551,"prompt_eval_count":18,"prompt_eval_duration":25510313,"eval_count":7,"eval_duration":69332453}' + recorded_at: Thu, 27 Mar 2025 20:52:44 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml index fcb62cfe..642144fe 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml @@ -29,20 +29,20 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:40:44 GMT + - Thu, 27 Mar 2025 20:52:55 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:44.116572023Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":330510672,"load_duration":19297272,"prompt_eval_count":205,"prompt_eval_duration":10692419,"eval_count":28,"eval_duration":300128824}' - recorded_at: Thu, 27 Mar 2025 19:40:37 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:55.210031365Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":327978180,"load_duration":15623627,"prompt_eval_count":205,"prompt_eval_duration":12561197,"eval_count":28,"eval_duration":299354569}' + recorded_at: Thu, 27 Mar 2025 20:52:48 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., @@ -62,16 +62,16 @@ http_interactions: message: OK headers: Content-Length: - - '412' + - '435' Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:40:44 GMT + - Thu, 27 Mar 2025 20:52:55 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDQuNDI0MDA1MTYzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjMwNDAyODUzNCwibG9hZF9kdXJhdGlvbiI6MTUzMzQwODgsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTI3NTUyLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjgyMTgxMjMzfQ== - recorded_at: Thu, 27 Mar 2025 19:40:37 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTI6NTUuNTE1NDY1MTA4WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlIHdpbmQgc3BlZWQgaXMgYXBwcm94aW1hdGVseSAxMCBraWxvbWV0ZXJzIHBlciBob3VyLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6MzAyNDc4Njc0LCJsb2FkX2R1cmF0aW9uIjoxNDcxMTc2NywicHJvbXB0X2V2YWxfY291bnQiOjExMiwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjYwMTcwMDUsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyODEwNTA1NDB9 + recorded_at: Thu, 27 Mar 2025 20:52:48 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml index fa2df115..25f57360 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml @@ -29,20 +29,20 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:40:44 GMT + - Thu, 27 Mar 2025 20:53:54 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:44.764703701Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":335981205,"load_duration":15122386,"prompt_eval_count":205,"prompt_eval_duration":10534932,"eval_count":28,"eval_duration":309925415}' - recorded_at: Thu, 27 Mar 2025 19:40:38 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:53:54.056546141Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":375038607,"load_duration":19702489,"prompt_eval_count":205,"prompt_eval_duration":43370375,"eval_count":28,"eval_duration":311651215}' + recorded_at: Thu, 27 Mar 2025 20:53:47 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., @@ -66,21 +66,21 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:40:45 GMT + - Thu, 27 Mar 2025 20:53:54 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDUuMDY4MDEwMDM2WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjMwMDI2MzMwOSwibG9hZF9kdXJhdGlvbiI6MTQ5NTQxNzQsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTE2OTIzLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6Mjc4ODY0NjM5fQ== - recorded_at: Thu, 27 Mar 2025 19:40:38 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTM6NTQuMzUyNTYyNDMzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5MzE2MzQxNCwibG9hZF9kdXJhdGlvbiI6MTUxNTM4MDQsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1ODAxNjIyLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcxNTc3OTYyfQ== + recorded_at: Thu, 27 Mar 2025 20:53:47 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The tool call response indicates that the current temperature in Berlin is 15°C and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s @@ -107,24 +107,24 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:40:45 GMT + - Thu, 27 Mar 2025 20:53:54 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:45.402105882Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done_reason":"stop","done":true,"total_duration":331334328,"load_duration":14896321,"prompt_eval_count":297,"prompt_eval_duration":10733730,"eval_count":28,"eval_duration":304577059}' - recorded_at: Thu, 27 Mar 2025 19:40:38 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:53:54.681058938Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done_reason":"stop","done":true,"total_duration":325240591,"load_duration":14868711,"prompt_eval_count":297,"prompt_eval_duration":10941313,"eval_count":28,"eval_duration":298076119}' + recorded_at: Thu, 27 Mar 2025 20:53:48 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The tool call response indicates that the current temperature in Berlin is 15°C and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s - the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant"},{"role":"tool","content":"Current + the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., @@ -148,12 +148,12 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:40:45 GMT + - Thu, 27 Mar 2025 20:53:54 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDUuNzAyNDY0MTY5WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk3ODU1NTcxLCJsb2FkX2R1cmF0aW9uIjoxNDgwMTQ1OCwicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjYwNjY0MjcsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyNzU4MDMyMjl9 - recorded_at: Thu, 27 Mar 2025 19:40:39 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTM6NTQuOTgxMjY0NDUzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk3MzE4NjA1LCJsb2FkX2R1cmF0aW9uIjoxNDcxMjgyMywicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjYxMTE0MTQsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyNzUzMzgwNTZ9 + recorded_at: Thu, 27 Mar 2025 20:53:48 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml index 410d9bce..40568a13 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml @@ -27,7 +27,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Thu, 27 Mar 2025 19:40:48 GMT + - Thu, 27 Mar 2025 20:52:56 GMT Server: - Caddy Transfer-Encoding: @@ -35,16 +35,16 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-03-27T19:40:48.272828677Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T19:40:48.282376206Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":321662603,"load_duration":14969862,"prompt_eval_count":205,"prompt_eval_duration":10628407,"eval_count":28,"eval_duration":295554306} - recorded_at: Thu, 27 Mar 2025 19:40:41 GMT + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:56.880657556Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:56.890641104Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":318070144,"load_duration":14748268,"prompt_eval_count":205,"prompt_eval_duration":10456487,"eval_count":28,"eval_duration":292444560} + recorded_at: Thu, 27 Mar 2025 20:52:50 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., @@ -66,7 +66,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Thu, 27 Mar 2025 19:40:48 GMT + - Thu, 27 Mar 2025 20:52:57 GMT Server: - Caddy Transfer-Encoding: @@ -74,17 +74,17 @@ http_interactions: body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDguNTc5MTczMzY4WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIG91dHB1dCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBpbiBCZXJsaW4gaXMgMTXCsEMgYW5kIHRoZXJlJ3MgYSB3aW5kIHNwZWVkIG9mIDEwIGttL2guIn0sImRvbmVfcmVhc29uIjoic3RvcCIsImRvbmUiOnRydWUsInRvdGFsX2R1cmF0aW9uIjoyOTM1NTMyNzcsImxvYWRfZHVyYXRpb24iOjE0NjI3NTEyLCJwcm9tcHRfZXZhbF9jb3VudCI6MTEyLCJwcm9tcHRfZXZhbF9kdXJhdGlvbiI6NjEwNTcwMiwiZXZhbF9jb3VudCI6MjgsImV2YWxfZHVyYXRpb24iOjI3MjIzOTc3MX0K - recorded_at: Thu, 27 Mar 2025 19:40:41 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTI6NTcuMTg4MTE4MDg0WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5NDE5NTI5MiwibG9hZF9kdXJhdGlvbiI6MTUwMjY0MjgsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1ODYyNDg0LCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcyNjU0MDM2fQo= + recorded_at: Thu, 27 Mar 2025 20:52:50 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The - tool call output indicates that the current temperature in Berlin is 15°C + tool call response indicates that the current temperature in Berlin is 15°C and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s the weather in Paris? (48.8575, 2.3514)"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude @@ -107,7 +107,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Thu, 27 Mar 2025 19:40:48 GMT + - Thu, 27 Mar 2025 20:52:57 GMT Server: - Caddy Transfer-Encoding: @@ -115,20 +115,20 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-03-27T19:40:48.899731222Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T19:40:48.909582967Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":327110248,"load_duration":14711739,"prompt_eval_count":297,"prompt_eval_duration":11275239,"eval_count":28,"eval_duration":300057920} - recorded_at: Thu, 27 Mar 2025 19:40:42 GMT + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:57.515458112Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:57.525308095Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":329660702,"load_duration":15200490,"prompt_eval_count":297,"prompt_eval_duration":11060319,"eval_count":28,"eval_duration":302338771} + recorded_at: Thu, 27 Mar 2025 20:52:50 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant"},{"role":"tool","content":"Current + the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The - tool call output indicates that the current temperature in Berlin is 15°C + tool call response indicates that the current temperature in Berlin is 15°C and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s - the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant"},{"role":"tool","content":"Current + the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., @@ -150,7 +150,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Thu, 27 Mar 2025 19:40:49 GMT + - Thu, 27 Mar 2025 20:52:57 GMT Server: - Caddy Transfer-Encoding: @@ -158,6 +158,6 @@ http_interactions: body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMTk6NDA6NDkuMjEwNzE3NDQyWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIG91dHB1dCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBpbiBQYXJpcyBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5ODAxMzMxNiwibG9hZF9kdXJhdGlvbiI6MTUyNTkzMTMsInByb21wdF9ldmFsX2NvdW50IjoyMDQsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTExNjA3LCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6Mjc1NzAxNzY3fQo= - recorded_at: Thu, 27 Mar 2025 19:40:42 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTI6NTcuODMwNjA4ODQzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6MzAyMTY2Njk4LCJsb2FkX2R1cmF0aW9uIjoxNDk2MTYxOSwicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjU3ODgyNzEsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyODAzNTU4ODl9Cg== + recorded_at: Thu, 27 Mar 2025 20:52:51 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml index ef9cae23..ec5bcced 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml @@ -27,20 +27,20 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:40:45 GMT + - Thu, 27 Mar 2025 20:52:56 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:45.890115845Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done_reason":"stop","done":true,"total_duration":182670710,"load_duration":15026207,"prompt_eval_count":155,"prompt_eval_duration":8306450,"eval_count":15,"eval_duration":158941659}' - recorded_at: Thu, 27 Mar 2025 19:40:39 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:56.203907181Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done_reason":"stop","done":true,"total_duration":182150710,"load_duration":14773924,"prompt_eval_count":155,"prompt_eval_duration":8142700,"eval_count":15,"eval_duration":158886588}' + recorded_at: Thu, 27 Mar 2025 20:52:49 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the best language to learn?"},{"role":"assistant"},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' headers: User-Agent: @@ -56,32 +56,19 @@ http_interactions: code: 200 message: OK headers: + Content-Length: + - '477' Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 19:40:47 GMT + - Thu, 27 Mar 2025 20:52:56 GMT Server: - Caddy - Vary: - - Accept-Encoding - Content-Length: - - '1360' body: - encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T19:40:47.954756575Z","message":{"role":"assistant","content":"The - tool suggests Ruby as one of the top languages to learn, but it doesn''t provide - any specific reasons why. Let me try to get more information from the tool.\n\nOkay, - I''ve got some additional data from the tool. It seems that Ruby is a popular - choice for web development and has a strong focus on simplicity and ease of - use. However, the tool also suggests considering other languages such as Python, - JavaScript, or Java, depending on your specific needs and goals.\n\nHere''s - a more detailed breakdown:\n\n* **Ruby**: Great for web development, especially - with the Ruby on Rails framework.\n* **Python**: Versatile language suitable - for data science, machine learning, web development, and more.\n* **JavaScript**: - Essential for front-end web development and popular in back-end development - as well.\n* **Java**: Object-oriented language used in Android app development, - web development, and enterprise software development.\n\nUltimately, the best - language to learn depends on your interests, career goals, and the type of - projects you want to work on."},"done_reason":"stop","done":true,"total_duration":2061922803,"load_duration":14748701,"prompt_eval_count":77,"prompt_eval_duration":4208460,"eval_count":211,"eval_duration":2042436378}' - recorded_at: Thu, 27 Mar 2025 19:40:41 GMT + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:56.567419236Z","message":{"role":"assistant","content":"The + tool suggests that Ruby is a good choice for learning programming languages. + It has a simple syntax and is often used in web development, making it a great + language for beginners."},"done_reason":"stop","done":true,"total_duration":360862790,"load_duration":14805187,"prompt_eval_count":77,"prompt_eval_duration":4288885,"eval_count":36,"eval_duration":341210120}' + recorded_at: Thu, 27 Mar 2025 20:52:49 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml index d1a49912..66428233 100644 --- a/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml +++ b/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Count - from 1 to 3","images":[]}],"options":{"temperature":0.7},"stream":true,"tools":[]}' + from 1 to 3"}],"options":{"temperature":0.7},"stream":true,"tools":[]}' headers: User-Agent: - Faraday v2.12.2 @@ -24,7 +24,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Thu, 27 Mar 2025 20:15:12 GMT + - Thu, 27 Mar 2025 20:52:54 GMT Server: - Caddy Transfer-Encoding: @@ -32,15 +32,18 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.823627546Z","message":{"role":"assistant","content":"Here"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.836926583Z","message":{"role":"assistant","content":" it"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.845628305Z","message":{"role":"assistant","content":" is"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.854520068Z","message":{"role":"assistant","content":":\n\n"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.863223164Z","message":{"role":"assistant","content":"1"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.871980804Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.880710143Z","message":{"role":"assistant","content":"2"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.889518343Z","message":{"role":"assistant","content":"\n"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.89843357Z","message":{"role":"assistant","content":"3"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:15:12.907436856Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":3301695608,"load_duration":3125133401,"prompt_eval_count":17,"prompt_eval_duration":88101212,"eval_count":10,"eval_duration":86549601} - recorded_at: Thu, 27 Mar 2025 20:15:06 GMT + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.711670439Z","message":{"role":"assistant","content":"Here"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.722005791Z","message":{"role":"assistant","content":" it"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.730875308Z","message":{"role":"assistant","content":" goes"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.73973626Z","message":{"role":"assistant","content":":\n\n"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.748715477Z","message":{"role":"assistant","content":"1"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.757750051Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.766838327Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.775953172Z","message":{"role":"assistant","content":"2"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.784999128Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.794182418Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.803269803Z","message":{"role":"assistant","content":"3"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.812379489Z","message":{"role":"assistant","content":"!"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.821504569Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":143359811,"load_duration":17391722,"prompt_eval_count":17,"prompt_eval_duration":3802940,"eval_count":13,"eval_duration":121838818} + recorded_at: Thu, 27 Mar 2025 20:52:48 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml b/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml index 441cca98..5aa897a6 100644 --- a/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml +++ b/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml @@ -22,16 +22,16 @@ http_interactions: message: OK headers: Content-Length: - - '380' + - '374' Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:10:23 GMT + - Thu, 27 Mar 2025 20:52:50 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"granite3.2-vision:2b","created_at":"2025-03-27T20:10:23.42586545Z","message":{"role":"assistant","content":"\nI - see a red diamond-like object with a white center on a black background."},"done_reason":"stop","done":true,"total_duration":165572248,"load_duration":6699362,"prompt_eval_count":2242,"prompt_eval_duration":24375911,"eval_count":20,"eval_duration":133708153}' - recorded_at: Thu, 27 Mar 2025 20:10:16 GMT + string: '{"model":"granite3.2-vision:2b","created_at":"2025-03-27T20:52:50.595761025Z","message":{"role":"assistant","content":"\nI + see a large red diamond with sharp angles and a smooth surface."},"done_reason":"stop","done":true,"total_duration":552064725,"load_duration":10092978,"prompt_eval_count":2242,"prompt_eval_duration":425090887,"eval_count":18,"eval_duration":115966422}' + recorded_at: Thu, 27 Mar 2025 20:52:43 GMT recorded_with: VCR 6.3.1 From 24a8eed4bbd1db5289b21fd2ff07befa9dca6b1c Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 18:33:07 -0300 Subject: [PATCH 36/55] Models involved in tests are no longer tiny :shrug: --- lib/tasks/ollama.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/ollama.rake b/lib/tasks/ollama.rake index f07dcc73..3e3da1bb 100644 --- a/lib/tasks/ollama.rake +++ b/lib/tasks/ollama.rake @@ -24,7 +24,7 @@ def pull_model(ollama_library_model_spec, description) end namespace :ollama do - desc 'Install some tiny models required for running Ollama specs (downloads about 7.5 GiB into your Ollama server)' + desc 'Install some models required for running Ollama specs (downloads about 7.5 GiB into your Ollama server)' task :install_models_for_specs do RubyLLM.config.request_timeout = 60 * 30 # 30min timeout per model since pull is synchronous RubyLLM.config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL') From 4284eb998eba5b7ed9b995536572ff203150de99 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 23:20:08 -0300 Subject: [PATCH 37/55] Don't send empty tools property --- lib/ruby_llm/providers/ollama/chat.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index c3213a48..bcd9e4e0 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -23,9 +23,8 @@ def render_payload(messages, tools:, temperature:, model:, stream: false) options: { temperature: temperature }, - stream: stream, - tools: tools.map { |_, tool| tool_for(tool) } - } + stream: stream + }.tap { |h| h.merge!(tools: tools) if tools.any? } end def parse_completion_response(response) From 79fe8e0e2747815fe49155dc4177655ac713b07b Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 27 Mar 2025 23:27:23 -0300 Subject: [PATCH 38/55] Rubocop appeasement --- lib/ruby_llm/providers/ollama/media.rb | 36 ++++++++++++++----------- lib/ruby_llm/providers/ollama/models.rb | 2 +- lib/ruby_llm/providers/ollama/tools.rb | 12 +++------ lib/tasks/ollama.rake | 2 +- spec/spec_helper.rb | 1 + 5 files changed, 27 insertions(+), 26 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/media.rb b/lib/ruby_llm/providers/ollama/media.rb index c9d38d4c..15e474a8 100644 --- a/lib/ruby_llm/providers/ollama/media.rb +++ b/lib/ruby_llm/providers/ollama/media.rb @@ -9,21 +9,7 @@ module Media def format_messages(messages) messages.map do |msg| - text = nil - images = [] - - if msg.content.is_a?(Array) - msg.content.each do |part| - case part[:type] - when 'text' - text = part[:text] - when 'image' - images << part[:source][:data] - end - end - else - text = msg.content - end + text, images = separate_by_type(msg) { role: msg.role.to_s, @@ -31,6 +17,26 @@ def format_messages(messages) }.tap { |h| h.merge!(images: images) if images.any? } end end + + def separate_by_type(msg) # rubocop:disable Metrics/MethodLength + text = nil + images = [] + + if msg.content.is_a?(Array) + msg.content.each do |part| + case part[:type] + when 'text' + text = part[:text] + when 'image' + images << part[:source][:data] + end + end + else + text = msg.content + end + + [text, images] + end end end end diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb index f7a22bc1..6a336f1b 100644 --- a/lib/ruby_llm/providers/ollama/models.rb +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -35,7 +35,7 @@ def list_models private - def parse_list_models_response(response, slug, capabilities) # rubocop:disable Metrics/MethodLength + def parse_list_models_response(response, slug, capabilities) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize (response.body['models'] || []).map do |model| model_id = model['name'] diff --git a/lib/ruby_llm/providers/ollama/tools.rb b/lib/ruby_llm/providers/ollama/tools.rb index 5f2a8872..97789591 100644 --- a/lib/ruby_llm/providers/ollama/tools.rb +++ b/lib/ruby_llm/providers/ollama/tools.rb @@ -7,7 +7,7 @@ module Ollama module Tools module_function - def tool_for(tool) + def tool_for(tool) # rubocop:disable Metrics/MethodLength { type: 'function', function: { @@ -30,20 +30,14 @@ def param_schema(param) end def parse_tool_calls(tool_calls) - return nil unless tool_calls&.any? - - tool_calls.to_h do |tc| + (tool_calls || []).to_h do |tc| tc = tc['function'] if tc['function'] name = tc['name'] next [nil, nil] unless name =~ /\S/ [ name, - ToolCall.new( - id: name, - name: name, - arguments: tc['arguments'] - ) + ToolCall.new(id: name, name: name, arguments: tc['arguments']) ] end.compact end diff --git a/lib/tasks/ollama.rake b/lib/tasks/ollama.rake index 3e3da1bb..7082213d 100644 --- a/lib/tasks/ollama.rake +++ b/lib/tasks/ollama.rake @@ -2,7 +2,7 @@ require 'ruby_llm' -def pull_model(ollama_library_model_spec, description) +def pull_model(ollama_library_model_spec, description) # rubocop:disable Metrics/MethodLength warn <<~MESSAGE + pulling #{ollama_library_model_spec} from Ollama library (#{description}); monitor progress in Ollama server logs MESSAGE diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 51e9ce6b..c8c45b08 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -101,4 +101,5 @@ end RSpec.shared_context 'with configured RubyLLM' do + # Put any per-test preeambles here end From 2f27a4e83951e2f5b61870fbebb4dc55d0c336b0 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Fri, 28 Mar 2025 11:57:05 -0300 Subject: [PATCH 39/55] Fix tools --- lib/ruby_llm/providers/ollama/chat.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index bcd9e4e0..69a917e8 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -24,7 +24,7 @@ def render_payload(messages, tools:, temperature:, model:, stream: false) temperature: temperature }, stream: stream - }.tap { |h| h.merge!(tools: tools) if tools.any? } + }.tap { |h| h.merge!(tools: tools.map { |_, t| tool_for(t) }) if tools.any? } end def parse_completion_response(response) From a3635b5fc614f09832cb61b1090d8e236012a2e4 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Fri, 28 Mar 2025 12:26:04 -0300 Subject: [PATCH 40/55] Add unit test for preprocess_tool_calls --- lib/ruby_llm/providers/ollama/tools.rb | 17 ++++++--- spec/ruby_llm/providers/ollama/tools_spec.rb | 40 ++++++++++++++++++++ 2 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 spec/ruby_llm/providers/ollama/tools_spec.rb diff --git a/lib/ruby_llm/providers/ollama/tools.rb b/lib/ruby_llm/providers/ollama/tools.rb index 97789591..94df9ccf 100644 --- a/lib/ruby_llm/providers/ollama/tools.rb +++ b/lib/ruby_llm/providers/ollama/tools.rb @@ -52,11 +52,18 @@ def preprocess_tool_calls(response_data) # specific field in the response where it should be. # https://github.com/ollama/ollama/blob/main/docs/api.md#chat-request-with-tools - tc = response_data['message']['tool_calls'] ||= [] - response_data['message']['content']&.gsub!(%r{(.*)}mi) do - capture = ::Regexp.last_match(1) - tc << JSON.parse(capture) if capture =~ /^\s*{/ - '' + m = response_data['message'] + tc = m['tool_calls'] ||= [] + + [ + %r{(.*)}mi, + %r{(.*)}mi + ].each do |regex| + m['content'] = m['content'].gsub(regex) do + capture = ::Regexp.last_match(1) + tc << JSON.parse(capture) + '' + end end tc.flatten! response_data diff --git a/spec/ruby_llm/providers/ollama/tools_spec.rb b/spec/ruby_llm/providers/ollama/tools_spec.rb new file mode 100644 index 00000000..45a72098 --- /dev/null +++ b/spec/ruby_llm/providers/ollama/tools_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'spec_helper' +require 'dotenv/load' + +def mock_response_with(response_text) + { + 'message' => { + 'content' => response_text, + 'tool_calls' => [] + } + } +end + +def cases + { + 'granite3.2-vision:2b' => %q( [{"name": "get_weather", "arguments": {"latitude": "52.5200", "longitude": "13.4050"}}] ), + 'nemotron-mini:4b' => %q( {"name": "get_weather", "arguments": {"latitude": "52.5200", "longitude": "13.4050"}} ) + } +end + +RSpec.describe RubyLLM::Providers::Ollama::Tools do + describe '.preprocess_tool_calls' do + cases.each do |model, response_text| + it "correctly parses #{model} tool calling markup" do # rubocop:disable RSpec/MultipleExpectations + mock_response = mock_response_with(response_text) + m = mock_response['message'] + + described_class.preprocess_tool_calls(mock_response) + + # needs to remove markup from the text response + expect(m['content']).not_to include(' Date: Fri, 28 Mar 2025 17:34:56 -0300 Subject: [PATCH 41/55] No need to replace tool call markup --- lib/ruby_llm/providers/ollama/tools.rb | 17 +++++++++-------- spec/ruby_llm/providers/ollama/tools_spec.rb | 11 +++-------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/lib/ruby_llm/providers/ollama/tools.rb b/lib/ruby_llm/providers/ollama/tools.rb index 94df9ccf..5c638f66 100644 --- a/lib/ruby_llm/providers/ollama/tools.rb +++ b/lib/ruby_llm/providers/ollama/tools.rb @@ -47,9 +47,9 @@ def parse_tool_calls(tool_calls) # # Unfortunately said other models are all over the place when it comes # to sticking to a format so this doesn't cover all edge cases. - def preprocess_tool_calls(response_data) - # Move JSON markup from inside the text to its - # specific field in the response where it should be. + def preprocess_tool_calls(response_data) # rubocop:disable Metrics/MethodLength + # Parse JSON markup from inside the text and + # fill in proper fields in the response # https://github.com/ollama/ollama/blob/main/docs/api.md#chat-request-with-tools m = response_data['message'] @@ -58,12 +58,13 @@ def preprocess_tool_calls(response_data) [ %r{(.*)}mi, %r{(.*)}mi - ].each do |regex| - m['content'] = m['content'].gsub(regex) do - capture = ::Regexp.last_match(1) - tc << JSON.parse(capture) - '' + ].find do |regex| + done = false + m['content'].scan(regex) do |(match)| + tc << JSON.parse(match) + done = true end + done end tc.flatten! response_data diff --git a/spec/ruby_llm/providers/ollama/tools_spec.rb b/spec/ruby_llm/providers/ollama/tools_spec.rb index 45a72098..b3f25217 100644 --- a/spec/ruby_llm/providers/ollama/tools_spec.rb +++ b/spec/ruby_llm/providers/ollama/tools_spec.rb @@ -14,8 +14,8 @@ def mock_response_with(response_text) def cases { - 'granite3.2-vision:2b' => %q( [{"name": "get_weather", "arguments": {"latitude": "52.5200", "longitude": "13.4050"}}] ), - 'nemotron-mini:4b' => %q( {"name": "get_weather", "arguments": {"latitude": "52.5200", "longitude": "13.4050"}} ) + 'granite3.2-vision:2b' => %q( [{"name": "get_weather", "arguments": {"latitude": "52.5200", "longitude": "13.4050"}}] ), # rubocop:disable Style/RedundantPercentQ,Layout/LineLength + 'nemotron-mini:4b' => %q( {"name": "get_weather", "arguments": {"latitude": "52.5200", "longitude": "13.4050"}} ) # rubocop:disable Style/RedundantPercentQ,Layout/LineLength,Layout/HashAlignment } end @@ -24,14 +24,9 @@ def cases cases.each do |model, response_text| it "correctly parses #{model} tool calling markup" do # rubocop:disable RSpec/MultipleExpectations mock_response = mock_response_with(response_text) + mock_response = described_class.preprocess_tool_calls(mock_response) m = mock_response['message'] - described_class.preprocess_tool_calls(mock_response) - - # needs to remove markup from the text response - expect(m['content']).not_to include(' Date: Tue, 1 Apr 2025 21:46:42 -0300 Subject: [PATCH 42/55] Update cassettes All cassettes for Ollama are up to date; I manually copied the new Bedrock responses for model listings. VCR data will be synthetic until someone can run tests with all providers properly enabled, including a local Ollama server having run the rake task to get test models. --- ...8b_can_handle_multi-turn_conversations.yml | 111 ---------------- ...e_multi-turn_conversations_with_ollama.yml | 106 +++++++++++++++ ...have_a_basic_conversation_with_ollama.yml} | 12 +- ..._multi-turn_conversations_with_ollama.yml} | 24 ++-- ...n_streaming_conversations_with_ollama.yml} | 28 ++-- ...llama3_1_8b_can_use_tools_with_ollama.yml} | 14 +- ..._tools_without_parameters_with_ollama.yml} | 37 ++++-- ...ama3_1_8b_supports_streaming_responses.yml | 49 ------- ...pports_streaming_responses_with_ollama.yml | 49 +++++++ ...ite3_2-vision_2b_can_understand_images.yml | 21 +-- ...tic-embed_22m_can_handle_a_single_text.yml | 12 +- ...ic-embed_22m_can_handle_multiple_texts.yml | 12 +- .../vcr_cassettes/initial_model_refresh.yml | 124 ++++++++++++++++++ ...nd_returns_a_chainable_models_instance.yml | 124 ++++++++++++++++++ ...ls_refresh_works_as_a_class_method_too.yml | 124 ++++++++++++++++++ 15 files changed, 620 insertions(+), 227 deletions(-) delete mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations_with_ollama.yml rename spec/fixtures/vcr_cassettes/{chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml => chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation_with_ollama.yml} (56%) rename spec/fixtures/vcr_cassettes/{chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml => chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations_with_ollama.yml} (81%) rename spec/fixtures/vcr_cassettes/{chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml => chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations_with_ollama.yml} (78%) rename spec/fixtures/vcr_cassettes/{chat_function_calling_llama3_1_8b_can_use_tools.yml => chat_function_calling_llama3_1_8b_can_use_tools_with_ollama.yml} (75%) rename spec/fixtures/vcr_cassettes/{chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml => chat_function_calling_llama3_1_8b_can_use_tools_without_parameters_with_ollama.yml} (50%) delete mode 100644 spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses_with_ollama.yml diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml deleted file mode 100644 index d4a8a25c..00000000 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations.yml +++ /dev/null @@ -1,111 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was - the creator of Ruby?"}],"options":{"temperature":0.7},"stream":false,"tools":[]}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 27 Mar 2025 20:52:52 GMT - Server: - - Caddy - Vary: - - Accept-Encoding - Content-Length: - - '1339' - body: - encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:52.883344011Z","message":{"role":"assistant","content":"The - creator of the programming language Ruby is Yukihiro Matsumoto, a Japanese - computer programmer. He began working on Ruby in 1993 and released the first - version, Ruby 0.95, in 1995. Matsumoto''s goal with Ruby was to create a language - that was easy to use and enjoyable for developers, while also being powerful - and flexible.\n\nMatsumoto, who is often referred to as \"Matz\" by his peers, - has continued to be involved with the development of Ruby throughout its history, - and is still active in the community today. He is known for his commitment - to making Ruby a language that is accessible to developers of all skill levels, - and for his emphasis on the importance of community and collaboration.\n\nIn - 1999, Matsumoto founded the Ruby Development Team (now known as the Ruby Core - Team), which oversees the development of the Ruby programming language. Today, - Ruby is widely used in web development, scripting, and other applications, - and has a large and active global community of developers who contribute to - its growth and development."},"done_reason":"stop","done":true,"total_duration":2099993065,"load_duration":15225883,"prompt_eval_count":17,"prompt_eval_duration":4027231,"eval_count":216,"eval_duration":2080377970}' - recorded_at: Thu, 27 Mar 2025 20:52:46 GMT -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was - the creator of Ruby?"},{"role":"assistant","content":"The creator of the programming - language Ruby is Yukihiro Matsumoto, a Japanese computer programmer. He began - working on Ruby in 1993 and released the first version, Ruby 0.95, in 1995. - Matsumoto''s goal with Ruby was to create a language that was easy to use - and enjoyable for developers, while also being powerful and flexible.\n\nMatsumoto, - who is often referred to as \"Matz\" by his peers, has continued to be involved - with the development of Ruby throughout its history, and is still active in - the community today. He is known for his commitment to making Ruby a language - that is accessible to developers of all skill levels, and for his emphasis - on the importance of community and collaboration.\n\nIn 1999, Matsumoto founded - the Ruby Development Team (now known as the Ruby Core Team), which oversees - the development of the Ruby programming language. Today, Ruby is widely used - in web development, scripting, and other applications, and has a large and - active global community of developers who contribute to its growth and development."},{"role":"user","content":"What - year did he create Ruby?"}],"options":{"temperature":0.7},"stream":false,"tools":[]}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 27 Mar 2025 20:52:54 GMT - Server: - - Caddy - Vary: - - Accept-Encoding - Content-Length: - - '1022' - body: - encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.655557443Z","message":{"role":"assistant","content":"Yukihiro - Matsumoto began working on the design of the Ruby programming language in - 1993. He started writing the code for Ruby in December 1995, and released - the first version, Ruby 0.95, on February 24, 1995.\n\nHowever, it''s worth - noting that the language as we know it today, with its modern syntax and features, - was finalized around 1997-1998. Matsumoto has said in interviews that he considered - Ruby to be a \"finished\" product by around 1998, although it continues to - evolve and improve to this day.\n\nSo while 1993 marks the beginning of Matsumoto''s - work on Ruby, 1995 is the year when the first version of the language was - released, and 1997-1998 mark the time when the modern version of Ruby started - to take shape."},"done_reason":"stop","done":true,"total_duration":1768670371,"load_duration":15370697,"prompt_eval_count":249,"prompt_eval_duration":4097509,"eval_count":177,"eval_duration":1748440674}' - recorded_at: Thu, 27 Mar 2025 20:52:47 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations_with_ollama.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations_with_ollama.yml new file mode 100644 index 00000000..97645abd --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations_with_ollama.yml @@ -0,0 +1,106 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was + the creator of Ruby?"}],"options":{"temperature":0.7},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 02 Apr 2025 00:44:07 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '1334' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:07.063167441Z","message":{"role":"assistant","content":"The + creator of the Ruby programming language is Yukihiro \"Matz\" Matsumoto. He + is a Japanese computer programmer and is often referred to as the \"Benevolent + Dictator for Life\" (BDFL) of the Ruby project.\n\nMatsumoto was born in 1961 + in Kyoto, Japan. He started programming at the age of six and became interested + in computers at an early age. In the late 1980s, he worked on several projects, + including a version of the Emacs text editor for MS-DOS.\n\nIn 1993, Matsumoto + began working on Ruby as a scripting language for Unix-like operating systems. + He was influenced by languages such as Perl, Smalltalk, and Ada, and wanted + to create a language that was easy to learn, fun to use, and had a strong + focus on object-oriented programming.\n\nRuby was first released in 1995, + and it quickly gained popularity due to its simplicity, flexibility, and ease + of use. Matsumoto continues to be involved with the Ruby project to this day, + and is widely recognized as one of the most influential figures in the world + of programming languages."},"done_reason":"stop","done":true,"total_duration":2242629806,"load_duration":14953975,"prompt_eval_count":17,"prompt_eval_duration":3947091,"eval_count":233,"eval_duration":2223358525}' + recorded_at: Wed, 02 Apr 2025 00:43:58 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was + the creator of Ruby?"},{"role":"assistant","content":"The creator of the Ruby + programming language is Yukihiro \"Matz\" Matsumoto. He is a Japanese computer + programmer and is often referred to as the \"Benevolent Dictator for Life\" + (BDFL) of the Ruby project.\n\nMatsumoto was born in 1961 in Kyoto, Japan. + He started programming at the age of six and became interested in computers + at an early age. In the late 1980s, he worked on several projects, including + a version of the Emacs text editor for MS-DOS.\n\nIn 1993, Matsumoto began + working on Ruby as a scripting language for Unix-like operating systems. He + was influenced by languages such as Perl, Smalltalk, and Ada, and wanted to + create a language that was easy to learn, fun to use, and had a strong focus + on object-oriented programming.\n\nRuby was first released in 1995, and it + quickly gained popularity due to its simplicity, flexibility, and ease of + use. Matsumoto continues to be involved with the Ruby project to this day, + and is widely recognized as one of the most influential figures in the world + of programming languages."},{"role":"user","content":"What year did he create + Ruby?"}],"options":{"temperature":0.7},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 02 Apr 2025 00:44:07 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '537' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:07.717871079Z","message":{"role":"assistant","content":"Yukihiro + \"Matz\" Matsumoto started working on Ruby in 1993, but it was first released + publicly on December 21, 1995. So, while the idea and development of Ruby + began in 1993, the language itself was officially released to the public in + 1995."},"done_reason":"stop","done":true,"total_duration":649227133,"load_duration":16363391,"prompt_eval_count":266,"prompt_eval_duration":4060912,"eval_count":64,"eval_duration":628004959}' + recorded_at: Wed, 02 Apr 2025 00:43:59 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation_with_ollama.yml similarity index 56% rename from spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml rename to spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation_with_ollama.yml index 8ec4969c..8d5c2821 100644 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation.yml +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation_with_ollama.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - 2 + 2?"}],"options":{"temperature":0.7},"stream":false,"tools":[]}' + 2 + 2?"}],"options":{"temperature":0.7},"stream":false}' headers: User-Agent: - Faraday v2.12.2 @@ -22,16 +22,16 @@ http_interactions: message: OK headers: Content-Length: - - '309' + - '310' Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:52:50 GMT + - Wed, 02 Apr 2025 00:44:04 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:50.778698618Z","message":{"role":"assistant","content":"The - answer is 4!"},"done_reason":"stop","done":true,"total_duration":113151682,"load_duration":17646551,"prompt_eval_count":18,"prompt_eval_duration":25510313,"eval_count":7,"eval_duration":69332453}' - recorded_at: Thu, 27 Mar 2025 20:52:44 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:04.815124255Z","message":{"role":"assistant","content":"The + answer is: 4!"},"done_reason":"stop","done":true,"total_duration":123712849,"load_duration":19150499,"prompt_eval_count":18,"prompt_eval_duration":25924381,"eval_count":8,"eval_duration":78214407}' + recorded_at: Wed, 02 Apr 2025 00:43:56 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations_with_ollama.yml similarity index 81% rename from spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml rename to spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations_with_ollama.yml index 25f57360..191d3769 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations_with_ollama.yml @@ -29,13 +29,13 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:53:54 GMT + - Wed, 02 Apr 2025 00:44:55 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:53:54.056546141Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":375038607,"load_duration":19702489,"prompt_eval_count":205,"prompt_eval_duration":43370375,"eval_count":28,"eval_duration":311651215}' - recorded_at: Thu, 27 Mar 2025 20:53:47 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:55.362545781Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":318881239,"load_duration":14740837,"prompt_eval_count":205,"prompt_eval_duration":10492700,"eval_count":28,"eval_duration":293241996}' + recorded_at: Wed, 02 Apr 2025 00:44:46 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -66,14 +66,14 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:53:54 GMT + - Wed, 02 Apr 2025 00:44:55 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTM6NTQuMzUyNTYyNDMzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5MzE2MzQxNCwibG9hZF9kdXJhdGlvbiI6MTUxNTM4MDQsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1ODAxNjIyLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcxNTc3OTYyfQ== - recorded_at: Thu, 27 Mar 2025 20:53:47 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTUuNjU4NjQ0Njc2WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5MjE3ODIzMywibG9hZF9kdXJhdGlvbiI6MTQ3MDQxMzksInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTgzNTgwLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcwOTc5NjkwfQ== + recorded_at: Wed, 02 Apr 2025 00:44:47 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -107,13 +107,13 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:53:54 GMT + - Wed, 02 Apr 2025 00:44:55 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:53:54.681058938Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done_reason":"stop","done":true,"total_duration":325240591,"load_duration":14868711,"prompt_eval_count":297,"prompt_eval_duration":10941313,"eval_count":28,"eval_duration":298076119}' - recorded_at: Thu, 27 Mar 2025 20:53:48 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:55.989004993Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done_reason":"stop","done":true,"total_duration":326895256,"load_duration":14909752,"prompt_eval_count":297,"prompt_eval_duration":11194663,"eval_count":28,"eval_duration":299619023}' + recorded_at: Wed, 02 Apr 2025 00:44:47 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -148,12 +148,12 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:53:54 GMT + - Wed, 02 Apr 2025 00:44:56 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTM6NTQuOTgxMjY0NDUzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk3MzE4NjA1LCJsb2FkX2R1cmF0aW9uIjoxNDcxMjgyMywicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjYxMTE0MTQsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyNzUzMzgwNTZ9 - recorded_at: Thu, 27 Mar 2025 20:53:48 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTYuMjkwNTU5NDYxWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk4MjU0MTAzLCJsb2FkX2R1cmF0aW9uIjoxNDgxNjIyMiwicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjU4ODg4MjksImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyNzYzODY4MTJ9 + recorded_at: Wed, 02 Apr 2025 00:44:47 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations_with_ollama.yml similarity index 78% rename from spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml rename to spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations_with_ollama.yml index 40568a13..c6e7eaf4 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations_with_ollama.yml @@ -27,7 +27,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Thu, 27 Mar 2025 20:52:56 GMT + - Wed, 02 Apr 2025 00:44:58 GMT Server: - Caddy Transfer-Encoding: @@ -35,9 +35,9 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:56.880657556Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:56.890641104Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":318070144,"load_duration":14748268,"prompt_eval_count":205,"prompt_eval_duration":10456487,"eval_count":28,"eval_duration":292444560} - recorded_at: Thu, 27 Mar 2025 20:52:50 GMT + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:58.864685667Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:58.875226528Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":320697041,"load_duration":16695054,"prompt_eval_count":205,"prompt_eval_duration":10264902,"eval_count":28,"eval_duration":293365741} + recorded_at: Wed, 02 Apr 2025 00:44:50 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -66,7 +66,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Thu, 27 Mar 2025 20:52:57 GMT + - Wed, 02 Apr 2025 00:44:59 GMT Server: - Caddy Transfer-Encoding: @@ -74,8 +74,8 @@ http_interactions: body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTI6NTcuMTg4MTE4MDg0WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5NDE5NTI5MiwibG9hZF9kdXJhdGlvbiI6MTUwMjY0MjgsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1ODYyNDg0LCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcyNjU0MDM2fQo= - recorded_at: Thu, 27 Mar 2025 20:52:50 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTkuMTcyNjA3OTM3WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5MzgwNzI1MSwibG9hZF9kdXJhdGlvbiI6MTU0MjM0MjQsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTk4MjQxLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcxNzgwNTg2fQo= + recorded_at: Wed, 02 Apr 2025 00:44:50 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -107,7 +107,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Thu, 27 Mar 2025 20:52:57 GMT + - Wed, 02 Apr 2025 00:44:59 GMT Server: - Caddy Transfer-Encoding: @@ -115,9 +115,9 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:57.515458112Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:57.525308095Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":329660702,"load_duration":15200490,"prompt_eval_count":297,"prompt_eval_duration":11060319,"eval_count":28,"eval_duration":302338771} - recorded_at: Thu, 27 Mar 2025 20:52:50 GMT + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:59.489661886Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:59.499416856Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":323629188,"load_duration":14622347,"prompt_eval_count":297,"prompt_eval_duration":11016766,"eval_count":28,"eval_duration":296821849} + recorded_at: Wed, 02 Apr 2025 00:44:51 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -150,7 +150,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Thu, 27 Mar 2025 20:52:57 GMT + - Wed, 02 Apr 2025 00:44:59 GMT Server: - Caddy Transfer-Encoding: @@ -158,6 +158,6 @@ http_interactions: body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTI6NTcuODMwNjA4ODQzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6MzAyMTY2Njk4LCJsb2FkX2R1cmF0aW9uIjoxNDk2MTYxOSwicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjU3ODgyNzEsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyODAzNTU4ODl9Cg== - recorded_at: Thu, 27 Mar 2025 20:52:51 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTkuODAwODgzMjEzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk4NjkxNDIwLCJsb2FkX2R1cmF0aW9uIjoxNTE3NjgxMCwicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjYxMDU5ODIsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyNzYyOTMzMDR9Cg== + recorded_at: Wed, 02 Apr 2025 00:44:51 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_ollama.yml similarity index 75% rename from spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml rename to spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_ollama.yml index 642144fe..a3a91b5a 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_ollama.yml @@ -29,13 +29,13 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:52:55 GMT + - Wed, 02 Apr 2025 00:44:54 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:55.210031365Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":327978180,"load_duration":15623627,"prompt_eval_count":205,"prompt_eval_duration":12561197,"eval_count":28,"eval_duration":299354569}' - recorded_at: Thu, 27 Mar 2025 20:52:48 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:54.741999837Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":345595895,"load_duration":15252457,"prompt_eval_count":205,"prompt_eval_duration":35001065,"eval_count":28,"eval_duration":295009892}' + recorded_at: Wed, 02 Apr 2025 00:44:46 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -62,16 +62,16 @@ http_interactions: message: OK headers: Content-Length: - - '435' + - '412' Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:52:55 GMT + - Wed, 02 Apr 2025 00:44:55 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDMtMjdUMjA6NTI6NTUuNTE1NDY1MTA4WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlIHdpbmQgc3BlZWQgaXMgYXBwcm94aW1hdGVseSAxMCBraWxvbWV0ZXJzIHBlciBob3VyLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6MzAyNDc4Njc0LCJsb2FkX2R1cmF0aW9uIjoxNDcxMTc2NywicHJvbXB0X2V2YWxfY291bnQiOjExMiwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjYwMTcwMDUsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyODEwNTA1NDB9 - recorded_at: Thu, 27 Mar 2025 20:52:48 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTUuMDM3OTY4MDk0WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5MTg5NTM3NCwibG9hZF9kdXJhdGlvbiI6MTQ5MzM4NjksInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1ODk1NzIzLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcwNDU2NjA5fQ== + recorded_at: Wed, 02 Apr 2025 00:44:46 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters_with_ollama.yml similarity index 50% rename from spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml rename to spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters_with_ollama.yml index ec5bcced..94dbbbde 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters_with_ollama.yml @@ -27,13 +27,13 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:52:56 GMT + - Wed, 02 Apr 2025 00:44:56 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:56.203907181Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done_reason":"stop","done":true,"total_duration":182150710,"load_duration":14773924,"prompt_eval_count":155,"prompt_eval_duration":8142700,"eval_count":15,"eval_duration":158886588}' - recorded_at: Thu, 27 Mar 2025 20:52:49 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:56.484008223Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done_reason":"stop","done":true,"total_duration":187125431,"load_duration":16763705,"prompt_eval_count":155,"prompt_eval_duration":8191628,"eval_count":15,"eval_duration":161762904}' + recorded_at: Wed, 02 Apr 2025 00:44:48 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -56,19 +56,32 @@ http_interactions: code: 200 message: OK headers: - Content-Length: - - '477' Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:52:56 GMT + - Wed, 02 Apr 2025 00:44:58 GMT Server: - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '1365' body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-03-27T20:52:56.567419236Z","message":{"role":"assistant","content":"The - tool suggests that Ruby is a good choice for learning programming languages. - It has a simple syntax and is often used in web development, making it a great - language for beginners."},"done_reason":"stop","done":true,"total_duration":360862790,"load_duration":14805187,"prompt_eval_count":77,"prompt_eval_duration":4288885,"eval_count":36,"eval_duration":341210120}' - recorded_at: Thu, 27 Mar 2025 20:52:49 GMT + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:58.547429762Z","message":{"role":"assistant","content":"The + best language to learn is often subjective and depends on personal goals, + interests, and career aspirations. However, based on various sources and industry + trends, Ruby is a popular choice among developers due to its simplicity, readability, + and versatility.\n\nHere are some reasons why Ruby stands out:\n\n1. **Easy + to Learn**: Ruby has a clean syntax and is relatively easy to learn for beginners.\n2. **Versatile**: + Ruby can be used for web development (with frameworks like Ruby on Rails), + scripting, testing, and even system administration.\n3. **Large Community**: + Ruby has an active community with many resources available online, including + documentation, tutorials, and forums.\n4. **Job Prospects**: Knowledge of + Ruby is in demand, especially in the field of web development.\n\nUltimately, + the best language to learn depends on your specific needs and goals. If you''re + interested in web development, Python or JavaScript might be a better fit. + However, if you want a language that''s easy to learn and versatile, Ruby + is definitely worth considering."},"done_reason":"stop","done":true,"total_duration":2060128193,"load_duration":14761969,"prompt_eval_count":77,"prompt_eval_duration":4504575,"eval_count":212,"eval_duration":2040277638}' + recorded_at: Wed, 02 Apr 2025 00:44:50 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml deleted file mode 100644 index 66428233..00000000 --- a/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses.yml +++ /dev/null @@ -1,49 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Count - from 1 to 3"}],"options":{"temperature":0.7},"stream":true,"tools":[]}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/x-ndjson - Date: - - Thu, 27 Mar 2025 20:52:54 GMT - Server: - - Caddy - Transfer-Encoding: - - chunked - body: - encoding: UTF-8 - string: | - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.711670439Z","message":{"role":"assistant","content":"Here"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.722005791Z","message":{"role":"assistant","content":" it"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.730875308Z","message":{"role":"assistant","content":" goes"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.73973626Z","message":{"role":"assistant","content":":\n\n"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.748715477Z","message":{"role":"assistant","content":"1"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.757750051Z","message":{"role":"assistant","content":","},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.766838327Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.775953172Z","message":{"role":"assistant","content":"2"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.784999128Z","message":{"role":"assistant","content":","},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.794182418Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.803269803Z","message":{"role":"assistant","content":"3"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.812379489Z","message":{"role":"assistant","content":"!"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-03-27T20:52:54.821504569Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":143359811,"load_duration":17391722,"prompt_eval_count":17,"prompt_eval_duration":3802940,"eval_count":13,"eval_duration":121838818} - recorded_at: Thu, 27 Mar 2025 20:52:48 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses_with_ollama.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses_with_ollama.yml new file mode 100644 index 00000000..148f7293 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses_with_ollama.yml @@ -0,0 +1,49 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Count + from 1 to 3"}],"options":{"temperature":0.7},"stream":true}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Wed, 02 Apr 2025 00:44:09 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.29998922Z","message":{"role":"assistant","content":"Here"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.310551658Z","message":{"role":"assistant","content":" it"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.319358021Z","message":{"role":"assistant","content":" goes"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.328271328Z","message":{"role":"assistant","content":":\n\n"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.337219141Z","message":{"role":"assistant","content":"1"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.346221234Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.355314621Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.36441234Z","message":{"role":"assistant","content":"2"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.373598811Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.38281648Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.392123995Z","message":{"role":"assistant","content":"3"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.401296079Z","message":{"role":"assistant","content":"!"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.410507031Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":144038210,"load_duration":17785003,"prompt_eval_count":17,"prompt_eval_duration":3721943,"eval_count":13,"eval_duration":121874042} + recorded_at: Wed, 02 Apr 2025 00:44:01 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml b/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml index 5aa897a6..47df3c19 100644 --- a/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml +++ b/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"granite3.2-vision:2b","messages":[{"role":"user","content":"What - do you see in this image?","images":["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"]}],"options":{"temperature":0.7},"stream":false,"tools":[]}' + do you see in this image?","images":["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"]}],"options":{"temperature":0.7},"stream":false}' headers: User-Agent: - Faraday v2.12.2 @@ -21,17 +21,22 @@ http_interactions: code: 200 message: OK headers: - Content-Length: - - '374' Content-Type: - application/json; charset=utf-8 Date: - - Thu, 27 Mar 2025 20:52:50 GMT + - Wed, 02 Apr 2025 00:44:02 GMT Server: - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '546' body: - encoding: UTF-8 - string: '{"model":"granite3.2-vision:2b","created_at":"2025-03-27T20:52:50.595761025Z","message":{"role":"assistant","content":"\nI - see a large red diamond with sharp angles and a smooth surface."},"done_reason":"stop","done":true,"total_duration":552064725,"load_duration":10092978,"prompt_eval_count":2242,"prompt_eval_duration":425090887,"eval_count":18,"eval_duration":115966422}' - recorded_at: Thu, 27 Mar 2025 20:52:43 GMT + encoding: ASCII-8BIT + string: '{"model":"granite3.2-vision:2b","created_at":"2025-04-02T00:44:02.426116551Z","message":{"role":"assistant","content":"\nI''m + sorry, but I can''t provide a description or answer any question related to + this image as it seems to be an error or placeholder. If you have another + image or if there''s something specific you''d like me to help with, please + let me know!"},"done_reason":"stop","done":true,"total_duration":404422192,"load_duration":8680145,"prompt_eval_count":2242,"prompt_eval_duration":21957042,"eval_count":55,"eval_duration":372859182}' + recorded_at: Wed, 02 Apr 2025 00:43:54 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml index 0ce408e9..8256b717 100644 --- a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml +++ b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml @@ -24,11 +24,15 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 26 Mar 2025 17:18:38 GMT + - Wed, 02 Apr 2025 00:44:15 GMT + Server: + - Caddy + Vary: + - Accept-Encoding Transfer-Encoding: - chunked body: - encoding: UTF-8 - string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.025819365,-0.023147449,-0.05204419,-0.02359659,0.0006516247,0.009969577,-0.0453889,-0.068442866,-0.019442763,0.0009812108,-0.05498037,0.04730593,0.032717418,0.030947946,-0.028105065,-0.05090078,0.00025667102,0.023571288,-0.12629306,0.015917534,0.01231173,0.08733777,0.011108408,0.009003669,0.00718937,-0.0052934815,0.02193917,-0.020292742,-0.03461139,-0.20070425,0.02107215,0.072910964,0.031031353,-0.049616367,0.023306997,-0.06486672,0.013256376,0.0043853885,-0.052061625,-0.039435886,0.012164081,0.003788034,-0.050004035,-0.01751829,-0.029081171,-0.016297124,0.021628456,-0.017189225,0.08650422,0.019240791,-0.04283047,-0.008972946,-0.0282798,-0.048760213,-0.018701227,-0.018923806,0.015387223,0.0066132424,-0.021767087,0.006322427,0.034335203,0.0016922819,-0.3494393,-0.06468288,0.04789346,-0.00242133,0.046571758,0.022469908,-0.024689795,-0.016555127,-0.011920086,0.014217722,-0.074248835,-0.0378238,0.03272102,-0.055375192,0.013477699,0.042363465,0.038778525,-0.033732694,0.015692627,0.009818383,0.004275665,0.0011522578,0.023426272,0.044826716,-0.043028492,-0.05380732,-0.028874718,-0.0033281562,0.018819876,-0.018340344,0.03899947,-0.029625487,-0.064442106,0.04053737,-0.0017892135,0.049774364,0.033641562,0.31321952,0.04387253,0.004834189,0.050648943,-0.056952856,0.051840045,-0.004622082,-0.0029022766,-0.028918024,0.006063617,-0.0041818386,0.019223802,-0.031667218,0.017668251,0.023125196,0.045376316,-0.024328684,-0.03980277,0.024929393,0.0051530804,0.056438677,-0.0009725082,0.0037956084,-0.03239649,-0.012817254,-0.041858695,-0.014856791,-0.06271684,0.033761166,0.031467415,0.011851511,0.051261365,-0.01179492,-0.068899974,-0.014964267,-0.00063179573,0.017690614,-0.009009361,-0.09789638,-0.036439195,-0.0841935,0.023575196,-0.13396092,0.13305002,0.007911912,0.019786658,0.0002827157,0.02192103,0.05638941,-0.043504674,-0.04524754,0.011735054,-0.0035346176,0.0033445251,0.007442268,0.069734655,-0.0006457193,-0.03868659,0.07044447,-0.024192037,0.032955248,-0.011209725,0.03564046,0.039964315,0.09071652,0.08253361,-0.009900468,0.012840352,-0.02295395,0.03471711,-0.022090193,0.0044087064,0.0130827855,0.035907153,0.039426714,-0.03819838,0.030248774,-0.036349647,0.010017172,0.0025868686,0.0013163028,0.03427282,0.08895476,-0.051354308,-0.050073903,-0.0016582799,-0.009518917,0.06254944,0.040961392,0.07374542,0.078283615,-0.038456604,0.13166244,-0.0055810083,0.008324925,-0.021115026,0.04865895,0.040081963,0.04631163,0.04633088,-0.017098077,-0.007893804,0.007607068,-0.07570857,0.064662516,-0.022200007,-0.04613742,0.014698096,-0.040343154,0.0054809875,0.0068689506,0.00092213764,0.006511137,0.036636386,0.0075024543,0.039534982,0.005514188,-0.003920646,0.008136021,0.033838425,0.05254808,-0.015216625,0.031380977,0.0040966547,-0.04814886,-0.027520526,-0.024087062,-0.04536847,-0.05320231,-0.027292114,-0.01939129,0.010507547,0.068630666,0.043998722,0.0801662,0.03348169,-0.009085184,-0.01477701,0.047791857,0.05540584,-0.06736693,0.0020285759,0.013938147,-0.05031106,-0.035206556,0.02761124,-0.04022496,-0.007451326,-0.06296886,-0.022859126,0.09301553,0.048795525,-0.012271036,0.019697173,0.06446396,0.020241095,0.012088095,-0.17798372,-0.027375236,-0.061207205,0.038104277,-0.06642423,-0.009415216,0.052199904,-0.037760843,-0.022187525,0.012181313,-0.041066676,-0.06942215,-0.027730862,-0.009680216,-0.059220828,0.04467606,0.0003948015,0.01014289,0.027306745,0.029429084,0.0493429,-0.039006017,-0.01756003,-0.028417608,-0.027354918,0.042255033,0.061257206,0.0036709877,-0.024329077,-0.050390333,-0.013186946,0.0031478943,0.011040366,0.026129626,0.018130504,-0.027353661,0.019211745,-0.0022117277,0.1118481,0.0782376,0.024995422,0.059711028,-0.008173296,0.017002877,-0.039264616,-0.001962071,0.011470576,-0.032904048,-0.079988904,-0.02629866,0.026457293,-0.053743444,-0.0051814294,0.013066732,0.05321082,0.040862862,-0.0019826875,0.011493213,0.08629233,-0.041718166,0.047269218,0.07769727,-0.044020433,-0.16877456,-0.021221237,-0.011129706,-0.028999822,-0.022866756,-0.010865134,0.009030771,0.003806579,-0.024056332,-0.041828144,0.13366036,0.0550153,-0.0011019756,-0.027688803,0.02077072,0.08133359,-0.016294481,0.046593014,-0.012201837,-0.07112024,-0.03148493,0.046461217,0.13798657,0.004675504,0.04464258,0.018120104,0.020195337,-0.0872914,-0.1429005,0.045251735,0.007702035,-0.019940052,0.0597414,0.0053394698,0.005676257,0.012717743,0.068366244,-0.03198958,0.00562614,-0.023898745,0.14956613,0.028330524,0.0012210672,-0.034995347,0.014900526,-0.0042808442,-0.038005907,-0.0029655711,-0.046612997,-0.023074953,0.0093577355,0.019100675,-0.0048536737,0.03977017,0.02677702,0.05293125,0.005948059,-0.02770206,0.03918424,0.022482652,0.03589692,-0.030975368,-0.03310301,-0.061353248,0.012955803]],"total_duration":282200344,"load_duration":275638829,"prompt_eval_count":8}' - recorded_at: Wed, 26 Mar 2025 17:18:38 GMT + encoding: ASCII-8BIT + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.025825415,-0.023176115,-0.052045297,-0.023625664,0.0006673469,0.009949714,-0.04538417,-0.06849524,-0.019409077,0.0010184002,-0.054927465,0.04728714,0.032690506,0.030963264,-0.028091758,-0.05092271,0.00021566867,0.023615433,-0.12640688,0.015840458,0.012315658,0.087370574,0.011073331,0.0090212375,0.007156342,-0.0052327104,0.021913407,-0.020346882,-0.03459649,-0.20068292,0.021031896,0.07291515,0.031049531,-0.04963502,0.023327535,-0.06476457,0.0131773045,0.004342761,-0.05204616,-0.03947274,0.0122103775,0.003776148,-0.050048206,-0.017586641,-0.029104842,-0.016230974,0.021660762,-0.017151477,0.0865443,0.01920734,-0.042871486,-0.0089291595,-0.02822964,-0.04884569,-0.018680912,-0.01892585,0.015438859,0.0065737013,-0.021804608,0.00633415,0.0343607,0.0017093703,-0.34944108,-0.06468269,0.0478818,-0.00246448,0.046574403,0.02243261,-0.024708489,-0.016602987,-0.011909359,0.014165576,-0.07424154,-0.03776865,0.032787047,-0.05530688,0.013535443,0.042380534,0.038827997,-0.033742167,0.015697544,0.009775907,0.0042203693,0.0011168025,0.023423292,0.04484947,-0.043061797,-0.05383481,-0.028867329,-0.0033860689,0.018773982,-0.018347567,0.03903167,-0.029658085,-0.06440208,0.040508885,-0.0017985007,0.049720276,0.033716165,0.31325525,0.04386892,0.0048334296,0.050675593,-0.056929454,0.0518016,-0.004611103,-0.0029309082,-0.028916717,0.0060408665,-0.004141483,0.01923389,-0.031655706,0.01768319,0.02311225,0.045390822,-0.024344986,-0.039786555,0.024944702,0.005075094,0.056426894,-0.0009737753,0.0037892968,-0.032363605,-0.012793344,-0.041841026,-0.014850747,-0.06273983,0.033704888,0.031475354,0.011834117,0.05125323,-0.011774348,-0.06885821,-0.014935385,-0.0006414335,0.017715653,-0.008953341,-0.097899854,-0.036503628,-0.084191576,0.023606507,-0.1339018,0.1330882,0.007957225,0.01985772,0.00030814653,0.021941159,0.05639211,-0.043463834,-0.045274723,0.011725757,-0.003486319,0.003375221,0.0074666464,0.06974618,-0.0006389784,-0.038667206,0.07041848,-0.02421246,0.03300245,-0.011266481,0.035639856,0.040018253,0.09069596,0.08246825,-0.009912788,0.012884513,-0.022981415,0.03470591,-0.022104705,0.0043493398,0.013083702,0.035951313,0.03946172,-0.038252268,0.030231304,-0.036359355,0.01005223,0.0025720727,0.0013707506,0.034241233,0.088925935,-0.051440887,-0.050102297,-0.0016456994,-0.009496842,0.062487546,0.040939905,0.07381002,0.078291304,-0.038428534,0.1316706,-0.0055638882,0.008280254,-0.021145111,0.04876571,0.040031683,0.04628573,0.046338666,-0.017028602,-0.007903445,0.007545737,-0.07565534,0.064689994,-0.022149073,-0.046088018,0.014704514,-0.040415496,0.00550196,0.006901969,0.00089305703,0.006521102,0.0366565,0.0074207284,0.039539423,0.005592426,-0.003989626,0.008083243,0.033852484,0.052595314,-0.015218367,0.03131478,0.0040506576,-0.048098013,-0.027468681,-0.024048975,-0.04536876,-0.05319465,-0.027298115,-0.01941297,0.010558779,0.06863464,0.04396793,0.08020219,0.033566475,-0.009056651,-0.014715962,0.04780099,0.05536488,-0.06740807,0.002055909,0.013943318,-0.05024147,-0.035200298,0.027621565,-0.040184192,-0.007491963,-0.06297288,-0.022879997,0.093055375,0.04880813,-0.012168053,0.019717308,0.064516716,0.020201867,0.012079503,-0.17798914,-0.027345736,-0.0612433,0.038101118,-0.06641872,-0.00939703,0.052195832,-0.03770301,-0.022270007,0.012196051,-0.041005902,-0.06945124,-0.027733557,-0.009639078,-0.059247572,0.04474978,0.00042829235,0.010153207,0.02728113,0.029422356,0.049308695,-0.038985588,-0.017589854,-0.02842523,-0.027386962,0.042216763,0.061242577,0.003747581,-0.024338258,-0.050467186,-0.013143215,0.0031099522,0.010997509,0.026045857,0.01815751,-0.027380131,0.01929404,-0.0022469186,0.111852795,0.07823112,0.024928685,0.059756078,-0.008221097,0.016979527,-0.039244134,-0.0019415446,0.011487329,-0.03280691,-0.08006135,-0.026343029,0.026450884,-0.053655412,-0.005154362,0.01307755,0.053237017,0.04086586,-0.0019484188,0.011518151,0.08618621,-0.041709326,0.047144253,0.077645905,-0.044002645,-0.16881582,-0.02115599,-0.011150404,-0.029005526,-0.022859793,-0.0107934745,0.009013299,0.0037840477,-0.023908136,-0.041892353,0.13362311,0.05498781,-0.0010903508,-0.027582854,0.02074264,0.08133009,-0.016295228,0.046583474,-0.012219358,-0.07110713,-0.031505097,0.04635908,0.13795494,0.004750067,0.044614047,0.018176915,0.020094909,-0.08733446,-0.14297998,0.045279857,0.0077459584,-0.019933412,0.059806284,0.0053598317,0.005684153,0.01267696,0.06831267,-0.03196309,0.0056615137,-0.023855256,0.14950311,0.028314097,0.0012290949,-0.034989975,0.014838987,-0.0043164054,-0.0380489,-0.002994491,-0.04658432,-0.023052199,0.009330306,0.019073954,-0.0048254183,0.039711606,0.026755748,0.05285787,0.005976852,-0.02769884,0.03918166,0.022543069,0.035913944,-0.030974701,-0.033151094,-0.061393328,0.012922418]],"total_duration":7800878,"load_duration":1435596,"prompt_eval_count":8}' + recorded_at: Wed, 02 Apr 2025 00:44:07 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml index 1cbab58b..2568478d 100644 --- a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml +++ b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml @@ -23,11 +23,15 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 26 Mar 2025 17:18:38 GMT + - Wed, 02 Apr 2025 00:44:15 GMT + Server: + - Caddy + Vary: + - Accept-Encoding Transfer-Encoding: - chunked body: - encoding: UTF-8 - string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.0388441,0.020130958,-0.067431964,0.007655712,-0.02143178,0.028401934,-0.059553344,-0.09178961,-0.032458898,0.008410962,-0.055265877,0.014614829,0.029787311,0.03382428,-0.01684954,-0.04444329,0.008301062,-0.0022140234,-0.122114494,-0.008171147,0.008162438,0.07341534,0.018977866,0.013705484,-0.0040139267,0.00035185603,0.0069316016,-0.01251507,-0.09616702,-0.17709394,0.012925018,0.03197588,0.026001623,-0.043088693,0.031905584,-0.04813018,-0.0017315283,0.029841121,-0.026876168,-0.030367695,-0.0067817485,0.02359407,-0.019723006,-0.0030676995,0.010523006,-0.027055979,0.04175819,-0.009885953,0.096520424,0.04388586,-0.03775211,-0.033325512,0.0096065905,-0.0139596285,-0.040052965,-0.002589836,0.046065394,0.004938671,-0.008818979,0.033967253,0.038127918,0.0013382456,-0.34866735,-0.06390991,0.066892646,-0.0076447544,0.034478936,0.0066651497,0.0017603931,-0.005765021,-0.059580464,-0.0011398621,-0.034723498,-0.0070240623,0.033945907,-0.07172375,0.0019033181,0.050755918,0.033208486,-0.044483263,-0.010917951,-0.013006815,0.017780134,0.027302826,0.017522654,0.050923645,-0.045407858,-0.031065013,0.0034971004,0.017281314,0.03732062,-0.020520234,0.034877818,-0.023866747,-0.070485,0.04555996,0.001389987,0.041110877,0.0083451895,0.30750144,0.041160934,-0.007575193,0.06326734,-0.07495616,0.05411205,-0.013711487,-0.018127367,0.0040174066,-0.016591415,-0.009179355,0.033549752,-0.01786939,-0.008867672,0.018478448,0.04625403,-0.028747778,-0.007066149,-0.005806406,0.0062766555,0.04459573,-0.03000371,0.014898422,-0.032604568,-0.017415427,-0.014565004,-0.022372194,-0.06727879,0.0365807,0.00958214,0.045523975,0.028445095,0.011969768,-0.06253902,-0.015415758,-0.0050557056,0.012014955,0.0024233195,-0.07337232,-0.0042311987,-0.07457154,-0.0006373777,-0.16765094,0.13003069,0.03297481,0.0144618815,0.0005355533,0.009557741,0.037592538,-0.012591949,-0.04204159,0.015775016,0.02042741,-0.026271803,0.020424932,0.091125205,-0.014388012,-0.042810924,0.051355045,-0.0075769946,0.03629031,0.010354268,0.0074680853,0.042652246,0.060397565,0.05299325,0.0070928345,0.018289784,-0.019927645,0.008178775,-0.026709922,-0.0004766831,0.018478047,0.012326361,0.061957974,-0.01432786,0.019229595,0.010431529,0.03351462,0.010213068,-0.031673603,0.01589807,0.10027719,-0.039053105,-0.058606964,-0.010657152,0.011582607,0.05528668,0.021357857,0.04105508,0.05390399,-0.0316559,0.156173,-0.048507318,0.012662477,-0.017382665,-0.005330175,0.057885952,0.06385099,0.028633239,-0.0010585266,-0.033099838,0.011883581,-0.054964617,0.034078836,-0.027739037,-0.04053948,0.019028971,-0.008881098,-0.009892724,-0.00016677074,0.008185013,0.014028663,0.015764946,0.013674434,0.040554117,-0.015574529,0.0012967308,-0.019827649,0.044048622,0.054283343,-0.019935552,0.019209668,-0.009141968,-0.06369639,-0.038524695,-0.00584429,-0.05572212,-0.020921145,-0.049070027,-0.01276479,0.051422957,0.062778324,0.02250262,0.11412264,0.014608461,0.0030205897,-0.036526274,0.050726265,0.049905915,-0.065770596,0.008405842,0.0010899245,-0.034585573,-0.004634513,0.012284967,-0.03207842,-0.04583995,-0.048865594,-0.019766245,0.12478698,0.06276402,-0.033869267,0.03652329,0.060382184,0.014759198,0.0046959203,-0.19071387,-0.032657206,-0.07738984,0.0442774,-0.05914576,-0.014506996,0.03734469,-0.0025898803,0.004546905,-0.0117728645,-0.05503146,-0.025510276,-0.020450229,-0.023852503,-0.015572229,0.06172686,0.018116174,0.013062141,0.043132544,0.020856835,0.034402605,-0.0055950414,0.012068603,-0.06377293,0.027816271,0.02069718,0.06381159,0.0031838878,-0.06427212,-0.071605794,-0.053954642,0.032803938,-0.0021615664,0.030591654,0.0039456603,-0.026492551,-0.026371498,-0.024719616,0.14168687,0.0002901896,-0.0034020492,0.031027138,0.0053976467,-0.000027014497,-0.052480403,0.0529854,-0.013960096,-0.03182876,-0.07278522,-0.029438145,-0.0076043443,-0.032225914,0.008225171,0.017322546,0.009984277,0.015520695,-0.0052385437,-0.011876693,0.07715109,-0.045244373,0.008803014,0.02424746,-0.015235667,-0.15054744,-0.0036824355,-0.016711554,-0.0013559143,-0.02194606,0.016720122,0.019720519,0.01517699,-0.03738912,-0.057589684,0.12978709,0.04813223,0.0077710785,-0.015100561,0.004117948,0.08621212,0.027476143,0.04439229,0.00030685926,-0.044507023,0.00089704886,0.061830766,0.16139033,0.024911765,-0.0074146036,0.004032755,0.039143074,-0.0898164,-0.11864838,0.04416452,-0.039557893,-0.03088087,0.11287578,0.043714676,-0.021582166,0.037369095,0.04492175,-0.0010107799,0.03280375,-0.035768308,0.15532315,-0.0009561552,-0.0034369607,-0.029741783,0.008190347,-0.051745743,-0.012318028,0.012402675,-0.04895367,-0.011466236,0.013425867,-0.033821847,-0.015193115,0.010228869,0.03193425,0.02603917,0.037040178,-0.017338518,0.01710686,0.058089267,0.030198513,-0.0008354163,-0.06520546,-0.0921685,-0.005078346],[-0.0072552343,0.03713646,-0.01699283,-0.030782733,-0.02052221,0.01125825,-0.06529242,-0.061818272,-0.020571295,-0.024209626,-0.03579918,0.015797382,0.061592482,0.02068423,0.016780416,-0.023932647,-0.010951945,0.025292471,-0.15266368,-0.012987599,-0.010199094,0.029842783,0.017119406,0.03163956,0.021315867,0.0035011058,0.013092083,-0.037269205,-0.13100713,-0.15873815,0.024110278,0.0054965187,-0.0057078693,-0.042900756,-0.00460323,-0.043012183,0.002026602,0.044829354,-0.0321034,-0.027913237,-0.0035799183,-0.0075295595,-0.013355917,0.0045460337,0.046187807,0.0027242594,0.049688134,-0.021872735,0.068736166,0.04175792,-0.0437622,0.014226286,-0.037445676,-0.055501036,-0.045524184,-0.001189907,0.044486266,-0.007421061,-0.0097211385,0.008858515,0.007311453,0.024857061,-0.35175383,-0.012672284,0.041481517,0.047193956,0.0020684737,0.047606543,-0.026176704,-0.025530554,-0.026922593,0.017605826,0.014854451,0.005629944,0.023153292,-0.041461922,-0.003056519,0.012925506,0.05518522,-0.038745392,0.026249396,0.03217421,0.019464033,-0.018742876,-0.013937561,0.045195688,-0.018083213,-0.012282628,0.0471358,0.0008688498,-0.028306754,0.0408566,0.024084115,0.0005985765,-0.06742631,0.009600122,-0.019761212,0.052697483,0.045696277,0.29864073,0.03026967,-0.0415359,0.016219707,-0.037604477,0.053452723,-0.029339043,-0.008365499,-0.03606822,0.021689609,-0.029203571,0.01769295,-0.021349482,-0.002733219,0.0033789296,0.031930774,-0.028539872,-0.04999919,0.007576535,-0.005124299,0.05567214,-0.048217237,-0.0006354506,-0.023972036,-0.052717745,0.0013329871,-0.016641501,-0.05940865,0.014591998,-0.007996123,-0.0060994998,0.034148518,-0.020664569,-0.09358414,-0.0194255,-0.0128993485,0.022041388,0.032610774,-0.052574314,0.016395817,-0.047118947,0.015677843,-0.13766375,0.10541323,0.0026426625,0.011538131,0.026277615,-0.02502458,0.0049760668,-0.053827237,-0.03863926,0.023165068,0.016438669,-0.0151872,0.002109835,0.12469035,0.020599306,-0.006932304,0.031132199,-0.011493038,0.0051031685,0.017425977,0.019842505,-0.006905538,0.03286136,0.029737378,-0.03871717,0.03207742,-0.017586391,0.019399468,-0.003148388,0.018489016,0.018581418,-0.012901189,0.017172573,-0.05461113,-0.001390115,-0.03233814,0.0011009739,0.03855168,-0.033363048,-0.015336527,0.080612056,-0.028678833,-0.046856903,-0.015384176,0.052241,0.059723865,0.032644298,0.059932925,0.06560817,-0.025778033,0.19489264,-0.09447736,-0.021961018,0.021270901,-0.004714235,0.03169394,0.033007365,-0.017643515,-0.023465928,-0.024755051,-0.014296845,-0.0002619207,0.015911218,0.015445326,-0.079413936,-0.0057071378,0.017307783,-0.005565825,-0.012172522,-0.009783294,-0.05173357,0.03838994,0.03412497,0.07624654,0.032628186,0.016304875,0.012916574,0.024889637,0.026531337,-0.0040279627,0.04415734,-0.02977549,-0.06746127,-0.03022296,-0.0021678545,-0.06871879,-0.0020891097,-0.082151935,-0.0058978163,0.03801924,0.039217323,0.03492099,0.113563396,0.025192197,0.018200427,0.024883514,0.027362043,0.011942755,-0.06134862,0.0019354849,0.015484824,-0.040022288,-0.024537606,0.020911857,-0.07808669,-0.019743685,-0.046418775,-0.03314287,0.1694522,0.050321065,-0.013430357,0.0070345113,0.038134124,0.0010241308,-0.011185799,-0.1828692,-0.025442472,-0.028564518,0.044677004,-0.0028425956,-0.00042380465,0.04030299,0.022801027,-0.009841054,-0.029609146,-0.009356221,-0.03580966,-0.028770214,-0.050125327,-0.031781837,0.104847625,0.026230568,0.02514224,0.0053547267,-0.009917238,0.07282194,0.029626124,-0.030785127,0.005750769,0.013035853,0.027320353,0.04267924,0.024914404,-0.031501085,-0.05527291,-0.04931349,-0.00094031333,-0.0029171903,0.067338765,-0.041093227,0.00045597606,-0.008067708,-0.026840648,0.18961208,0.0021951848,0.016140003,0.038745787,-0.016722713,0.0016434207,0.002311968,0.039490942,-0.03590958,-0.0054072104,-0.03100541,-0.014101151,0.058239665,-0.038461883,-0.02283073,0.008492259,-0.013109407,0.02975444,0.024842035,-0.015734265,0.09163665,-0.057609167,0.035152502,0.037537843,0.021865102,-0.2016707,-0.03457164,-0.013295931,0.048858218,-0.058543745,0.018288808,0.028178774,-0.0111076655,0.020360066,-0.026658798,0.11522286,0.053960584,-0.017099507,-0.0043872525,0.046700936,0.054960232,0.014453873,0.019755626,-0.013162808,-0.040781327,0.0028153716,0.060916595,0.15055314,-0.0048034787,0.040378716,0.023411844,0.0069524855,-0.03615119,-0.11237404,0.02728505,-0.032408927,-0.033139788,0.05818729,0.019382754,-0.035828292,0.023392975,0.071280956,-0.036502235,0.008983084,-0.034260582,0.1593053,-0.028021295,0.0172493,-0.016131653,-0.033713784,-0.04138278,0.00016605067,0.0054855584,-0.054233927,-0.013987903,0.022237027,-0.010095551,0.006079947,0.031176228,0.034318067,0.027573293,0.020763315,-0.019646917,0.012187558,0.04892568,0.04229697,0.034125984,-0.018135771,-0.035252318,-0.057188697],[0.010169066,0.014699193,0.02312678,-0.031285737,-0.019339556,0.01898938,-0.042842016,-0.065713726,0.037114225,-0.0019252088,-0.04387124,0.02680714,0.017134406,0.010056415,0.016514305,-0.07524968,-0.004598689,-0.0077995756,-0.16111827,-0.018086512,-0.023329865,0.07266939,0.035500344,0.007105781,-0.037746858,0.03954511,0.010651382,-0.03404992,-0.13568549,-0.1758981,0.017500464,0.021587882,-0.00029796895,-0.05286976,-0.021638112,-0.020357909,-0.03505305,0.015242394,-0.013434969,-0.03953229,0.007741148,-0.016568061,-0.046428822,-0.0113176145,0.050263844,-0.013899913,0.023608234,-0.030784462,0.024582472,0.041902494,-0.05761777,-0.032375082,0.00036015094,-0.03865763,-0.046571795,0.050851,-0.011026816,-0.03191825,0.010439611,0.01701438,0.0055330084,0.0587453,-0.3662647,0.025101654,0.07276847,0.019127958,-0.018416954,-0.0078095226,-0.00087658176,0.015874607,0.038312003,-0.014843252,-0.0125896605,0.01718569,0.026865218,-0.04576379,0.00359911,0.021899922,0.06563156,-0.042660784,0.0018792639,0.020148722,0.016360225,0.030104727,-0.015654275,0.06526195,0.0061962763,-0.028802281,0.038764264,0.0048531652,-0.048788548,0.035097387,0.0030290019,-0.002194582,-0.048610423,0.0012355483,0.0014674183,0.034617357,0.018160649,0.30238912,0.018115664,0.0030157077,0.040349476,-0.0703222,0.05237721,-0.0028105106,-0.028073953,-0.021660421,0.031953406,-0.0390731,0.0028894274,-0.017770546,0.005304085,-0.0061753215,0.054985832,-0.0013282879,-0.016932156,-0.009256211,0.023674654,0.043953825,-0.027819972,0.025420371,-0.04043455,-0.005284352,-0.010442454,0.0035201733,-0.06362815,0.02499165,-0.04596317,-0.011497569,0.05550298,0.00008448542,-0.09329214,0.019624306,0.022909734,0.03186377,0.0010003478,-0.031093974,0.0253383,-0.031195963,-0.018049393,-0.13012893,0.10688446,-0.010589804,0.025470642,-0.0050498014,-0.028474659,0.043146398,-0.026209809,-0.014387408,0.024687277,0.033259496,-0.04391259,-0.0050338595,0.0845666,0.022489144,0.0029990883,-0.0035517574,-0.006752627,0.029374328,0.02664534,0.025731422,0.059084013,0.08346221,0.032861166,-0.09516849,0.057318185,0.024989773,0.014103997,-0.004171578,0.018135788,-0.024807887,-0.041765466,-0.025802964,-0.012921618,-0.008061644,-0.028848117,-0.0005917901,0.02881574,-0.051334593,0.0027097291,0.063163355,-0.026775215,-0.08124945,-0.0105067,0.025091348,0.03696275,0.012843601,0.031530064,0.06319013,-0.027962644,0.17676653,-0.08200779,-0.03632199,-0.034959286,0.02156012,0.015361243,0.043850943,-0.0021428494,0.011226801,-0.046751194,-0.07139608,0.009606031,0.035172343,-0.04229935,-0.03569737,0.04477027,0.013450342,0.04269794,-0.008891381,-0.031291332,-0.0022993302,0.09038422,0.02420419,0.031999685,-0.0051883184,-0.010298845,0.028453493,0.0050622746,0.04699291,0.006085575,0.018052265,-0.022887442,-0.045732647,0.009925399,0.0068673166,-0.040608596,-0.013074616,-0.04770688,0.0011602375,0.078974366,0.04360928,0.040327042,0.073482476,0.06473103,0.014272077,-0.0487856,0.032009773,0.012478921,-0.0383686,0.016539803,0.0066691204,-0.040024173,-0.056614283,0.04952658,-0.09106773,-0.030492447,0.010533615,-0.029398412,0.18325548,0.09290254,0.027460678,0.01589842,0.031662818,-0.06166192,0.0014848855,-0.11129306,0.010330616,-0.040127635,0.03328302,-0.025017919,-0.03147771,0.06017222,-0.029784242,-0.026018031,-0.0014891784,-0.0060136514,-0.02197994,-0.005521501,-0.02919752,-0.040479988,0.09514643,0.019242264,0.042500548,0.00066325505,-0.009165173,0.025331255,-0.014075222,-0.058067344,-0.020931922,0.018429274,-0.002701154,0.053624205,0.034054026,-0.00924732,-0.07858087,-0.023325374,0.035447456,0.07162372,0.006831908,-0.03824091,-0.012311438,-0.010005245,-0.0059660277,0.12724046,0.0014100341,0.018896865,0.021953704,-0.04847068,-0.03720164,-0.009651089,0.054688897,0.013091016,-0.013793644,-0.04749705,-0.018131005,0.017314631,-0.028080247,-0.030335128,-0.0028840683,-0.04583448,0.0028758575,0.0152386045,-0.007833423,0.10375125,-0.016216613,0.017764568,0.037414994,0.0022454704,-0.17834663,-0.03604582,-0.00064713095,-0.014282952,-0.063561186,-0.030035643,0.02400106,-0.0008161259,0.025210572,-0.04692099,0.15453176,0.08460845,-0.018154804,-0.030075192,0.033266056,0.09898789,0.016117847,0.010213679,-0.018335694,-0.006946004,0.017542744,0.09943681,0.12576352,0.02319345,0.008129597,0.0032028987,-0.0053399303,-0.047532618,-0.13376793,-0.0018692309,-0.045244668,-0.020810418,0.06288976,0.00091563916,0.0054674884,0.005820324,0.031138638,-0.03758025,0.016956536,-0.04498085,0.13776563,-0.01599851,-0.000038715556,-0.008666058,-0.01248527,-0.002156642,0.022566035,0.051826704,-0.042339765,0.008286659,0.012520414,-0.004150474,-0.013118474,0.048206005,0.0003086508,-0.008351304,0.012447726,0.006553263,0.03620175,0.03051183,0.03917375,-0.029004231,-0.016662572,-0.07127831,-0.020850424]],"total_duration":7034636,"load_duration":731830,"prompt_eval_count":4}' - recorded_at: Wed, 26 Mar 2025 17:18:38 GMT + encoding: ASCII-8BIT + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.038980126,0.020101948,-0.067413226,0.007685114,-0.021361317,0.028405204,-0.05964908,-0.09178641,-0.032397546,0.008366828,-0.05523459,0.014637846,0.0298761,0.03387804,-0.016674861,-0.044479024,0.008276525,-0.0022477629,-0.12195336,-0.008178106,0.008199949,0.07350191,0.01897805,0.013661541,-0.003947917,0.00030909953,0.006917925,-0.012626692,-0.09616951,-0.17709318,0.01293276,0.031847943,0.025997223,-0.042996813,0.03192809,-0.048060544,-0.0017395425,0.029812165,-0.026901668,-0.030327402,-0.0068094945,0.023497479,-0.019625092,-0.003110331,0.010590182,-0.027034454,0.04182794,-0.009884578,0.09661056,0.043840215,-0.037773125,-0.033335246,0.009626258,-0.013944384,-0.040054895,-0.0026200123,0.046114273,0.0049590026,-0.008846017,0.034012534,0.038100995,0.0013456035,-0.34869465,-0.06399822,0.06681992,-0.007770172,0.03451249,0.006695025,0.0016939766,-0.005725403,-0.059506737,-0.0011312707,-0.034694858,-0.0070268526,0.033973437,-0.07178208,0.0019529031,0.050796922,0.033150885,-0.04453945,-0.010778929,-0.01298108,0.01772847,0.027397834,0.017516151,0.05094088,-0.045374986,-0.031055674,0.0034364148,0.017342873,0.03724968,-0.020449797,0.03487508,-0.023868825,-0.0705106,0.045591667,0.0014132301,0.04102965,0.0082013225,0.3076015,0.041163538,-0.0075212517,0.0632507,-0.07494113,0.054058343,-0.013692275,-0.018088195,0.0039990763,-0.016607765,-0.00915819,0.03353369,-0.017990997,-0.008927891,0.018497262,0.04622437,-0.028729072,-0.0070351255,-0.005821854,0.0063457754,0.044443272,-0.03001723,0.014840464,-0.03265875,-0.017414864,-0.014599514,-0.022385433,-0.06727593,0.03655243,0.009642398,0.04557801,0.028509801,0.011939836,-0.062560804,-0.015390183,-0.0050801174,0.011868977,0.00253459,-0.07341563,-0.004279252,-0.07461656,-0.0006562158,-0.16768059,0.13006905,0.03295397,0.0145061985,0.000511846,0.009465702,0.037566304,-0.012595248,-0.042188045,0.015753305,0.02033451,-0.026321119,0.020434551,0.09113539,-0.014463864,-0.04273769,0.05132384,-0.007610653,0.036329918,0.010425151,0.0075439727,0.042681746,0.060391378,0.053032257,0.0071610347,0.018304583,-0.0199126,0.008234456,-0.026586238,-0.00048163044,0.018455869,0.012418799,0.061977547,-0.014351739,0.019218396,0.010331768,0.033490002,0.0102368975,-0.031620093,0.015966186,0.10022163,-0.03886677,-0.058662754,-0.010719046,0.011613407,0.055317454,0.021442259,0.041051246,0.05395217,-0.031625535,0.1561225,-0.04847817,0.012704446,-0.017351678,-0.005412353,0.05782586,0.063770935,0.028648905,-0.0010758642,-0.03315512,0.011804742,-0.054954775,0.034165937,-0.027770827,-0.040539972,0.01901002,-0.008845964,-0.009943114,-0.00007340114,0.008205162,0.014036151,0.015788715,0.013589957,0.040579043,-0.015481178,0.0013020202,-0.019863069,0.044024546,0.054241393,-0.019910982,0.019316196,-0.009067846,-0.06370655,-0.038542934,-0.005822525,-0.05564244,-0.020892167,-0.04894251,-0.012727646,0.05143602,0.06270096,0.022492254,0.11401925,0.014643738,0.0030262705,-0.036580373,0.05074049,0.04994587,-0.06580306,0.008364971,0.0012129012,-0.034641,-0.0046832887,0.012338395,-0.032140378,-0.045876123,-0.048861995,-0.019786038,0.12485802,0.06277426,-0.033950374,0.036432575,0.06035506,0.014863595,0.0047113854,-0.19050083,-0.032735668,-0.077262625,0.044320498,-0.059189577,-0.014459053,0.03718649,-0.0026039602,0.004493112,-0.011763187,-0.05504196,-0.025533773,-0.02048363,-0.023919607,-0.015506923,0.061790027,0.01816571,0.0130165955,0.04316555,0.020895818,0.034394037,-0.00560091,0.011984886,-0.06372637,0.02781977,0.020621277,0.06389801,0.0032279587,-0.064306036,-0.07160552,-0.05394653,0.032840647,-0.0021832213,0.030553438,0.0039347326,-0.026431374,-0.026453791,-0.024773262,0.14158836,0.00027325953,-0.003358694,0.031054376,0.005467873,-0.000014875217,-0.05249387,0.05296582,-0.013941867,-0.031785127,-0.07282081,-0.029387616,-0.0076221772,-0.032214306,0.008221592,0.01732765,0.01000591,0.015568096,-0.005231348,-0.012036904,0.07718011,-0.045315113,0.008787361,0.02417641,-0.015230668,-0.15053827,-0.0037556684,-0.01667005,-0.0013223562,-0.02209581,0.016655259,0.019694244,0.015031552,-0.037394483,-0.057655845,0.12982553,0.04818329,0.0077882116,-0.015061786,0.004192891,0.08628084,0.027619699,0.044403546,0.00034237612,-0.044426452,0.00096744276,0.06186224,0.16129373,0.024928987,-0.0073914034,0.0040016263,0.039090827,-0.08990263,-0.118701264,0.04410862,-0.03954887,-0.030827247,0.112970345,0.04363939,-0.021480395,0.03728192,0.044834364,-0.0009248547,0.032832358,-0.035760213,0.15535384,-0.0009505413,-0.0034093896,-0.029711511,0.008248596,-0.051867787,-0.012275803,0.012434058,-0.04902186,-0.011476671,0.0133925,-0.03379115,-0.0151935695,0.010195133,0.031876706,0.025932532,0.036986034,-0.01739396,0.017166032,0.05808856,0.030131826,-0.0008843879,-0.06526332,-0.09222386,-0.0049838475],[-0.007225496,0.037155706,-0.016906068,-0.030758644,-0.020417303,0.011231278,-0.06530078,-0.061754078,-0.020577524,-0.024164986,-0.035808578,0.015893035,0.061571326,0.020668881,0.016767306,-0.023883428,-0.01099219,0.025237663,-0.15266667,-0.013051586,-0.010288909,0.029873036,0.017107742,0.0315594,0.021337744,0.0034486242,0.013156374,-0.037249252,-0.13094991,-0.15867794,0.024068367,0.005509016,-0.0056714285,-0.042848945,-0.0045933733,-0.04299176,0.0020768172,0.04483032,-0.03212172,-0.027772011,-0.0036520734,-0.0075447895,-0.013391376,0.0045278594,0.04607957,0.0027125278,0.049626715,-0.021857744,0.06873977,0.04173157,-0.04370165,0.014249006,-0.0373972,-0.05551407,-0.045433797,-0.0011728521,0.044487648,-0.0074436087,-0.00975718,0.008799588,0.0073077497,0.024823438,-0.35174075,-0.012705645,0.04136241,0.047284245,0.0020329098,0.04765345,-0.02604234,-0.02548834,-0.02704063,0.017578213,0.01482943,0.0055936393,0.023184825,-0.041498873,-0.003050582,0.012843925,0.05516694,-0.03866418,0.02621437,0.032198943,0.01935349,-0.018680874,-0.013953387,0.0451372,-0.018057078,-0.012344732,0.04716202,0.0010259423,-0.028411478,0.04075236,0.024121404,0.0006758823,-0.0674563,0.009551461,-0.01973488,0.05264174,0.04568158,0.29859018,0.030333413,-0.04152799,0.016276676,-0.037692044,0.053379524,-0.029166088,-0.008381986,-0.03611233,0.021734668,-0.02926269,0.01770523,-0.021257408,-0.0026680147,0.0033788746,0.03192171,-0.02859868,-0.050017837,0.007628301,-0.005211484,0.055639394,-0.04813225,-0.00062740705,-0.023975527,-0.05272858,0.0012510746,-0.016620526,-0.05937839,0.014596674,-0.007940771,-0.0060859257,0.03417475,-0.020669967,-0.09361984,-0.019438276,-0.012983339,0.022100516,0.03252378,-0.052587945,0.016381664,-0.047060754,0.015694086,-0.1377361,0.10544033,0.0026725356,0.01146019,0.026346128,-0.025007993,0.004997534,-0.053778246,-0.038643032,0.023108022,0.016371924,-0.015227947,0.0020684898,0.124686636,0.02065184,-0.0070788977,0.031109046,-0.011467157,0.0051159468,0.0174688,0.019905413,-0.0069136377,0.032805618,0.029705629,-0.038734376,0.032078113,-0.01761205,0.01944323,-0.0030690655,0.018461121,0.018608272,-0.012803209,0.017234804,-0.05453963,-0.0014086623,-0.032340996,0.0010491384,0.038566574,-0.03347248,-0.015357926,0.08070545,-0.028756669,-0.046844523,-0.01529485,0.052366853,0.059635386,0.03260225,0.05999529,0.06562162,-0.025594424,0.19492106,-0.09446214,-0.02200547,0.021350436,-0.0047113174,0.03170546,0.032968767,-0.017730163,-0.023518713,-0.024787944,-0.014301349,-0.00028776744,0.015872791,0.015544321,-0.079372294,-0.005725175,0.017331447,-0.0056501715,-0.012182198,-0.009767331,-0.05171092,0.038543854,0.034115233,0.07627104,0.032627165,0.016347326,0.012965246,0.024923127,0.02650983,-0.0040691686,0.04411213,-0.02981039,-0.06744219,-0.030292222,-0.0021420228,-0.06861754,-0.0020280352,-0.08233997,-0.0059836525,0.037955742,0.039244626,0.034866735,0.11366857,0.02521095,0.018243132,0.024956543,0.027358694,0.011940862,-0.061406422,0.0018358993,0.015471496,-0.0400448,-0.024514355,0.020818526,-0.078023,-0.019798901,-0.046464335,-0.03319194,0.16930555,0.050408904,-0.013528864,0.007027566,0.0381429,0.0010658541,-0.011183001,-0.18296444,-0.025517514,-0.028616475,0.044594944,-0.002806602,-0.00036968052,0.040348303,0.022882342,-0.0099050915,-0.029638626,-0.009392766,-0.035751175,-0.02882233,-0.05017968,-0.031793848,0.104784735,0.026196804,0.025192862,0.0053355214,-0.009864406,0.07273947,0.029665705,-0.030834008,0.005743688,0.0130977845,0.027437972,0.042631894,0.02490531,-0.031600703,-0.055224583,-0.04933041,-0.0008777641,-0.002849928,0.06742398,-0.041109774,0.00045421268,-0.008093842,-0.026830377,0.18975478,0.0022353292,0.016124677,0.03874153,-0.01676804,0.0016409162,0.0022479978,0.039468583,-0.03589011,-0.005279329,-0.031004557,-0.014081007,0.058285933,-0.03845023,-0.022855511,0.008495943,-0.013061212,0.029775871,0.024829257,-0.015684903,0.09160675,-0.057623718,0.035138898,0.037533384,0.02173393,-0.20164658,-0.034627892,-0.013216875,0.04897353,-0.058580056,0.018308442,0.028224163,-0.011080451,0.020418232,-0.026639828,0.1152522,0.05399439,-0.017088734,-0.0043683355,0.04675239,0.055089362,0.01442295,0.019836834,-0.013131093,-0.040812545,0.0028349068,0.06096238,0.15055773,-0.0047997017,0.04041006,0.023423078,0.0068679894,-0.036161505,-0.11227965,0.027264446,-0.032434683,-0.033046544,0.05816228,0.019367868,-0.035861887,0.023473343,0.07127074,-0.036597442,0.00892375,-0.03424332,0.15918937,-0.028045062,0.01727863,-0.016116075,-0.033897277,-0.04147993,0.000102095604,0.0054549514,-0.054227076,-0.014035331,0.022229984,-0.0101330625,0.0061006444,0.031121459,0.034375396,0.027529038,0.02083103,-0.01970649,0.01220227,0.048865896,0.04224607,0.034099545,-0.018085487,-0.035159428,-0.057188712],[0.010182182,0.01467856,0.02307528,-0.031243263,-0.019379467,0.018989552,-0.04283347,-0.065710135,0.037127666,-0.00186089,-0.043939225,0.02675395,0.017098242,0.01003573,0.016530303,-0.07529927,-0.0045888554,-0.00783502,-0.16103624,-0.018049028,-0.023261337,0.0726829,0.03554955,0.007101789,-0.03776669,0.03965637,0.010605459,-0.034077637,-0.1356997,-0.17605451,0.017438654,0.021631619,-0.00033740848,-0.05291991,-0.021556789,-0.020458516,-0.035007652,0.015351501,-0.013426498,-0.03958441,0.007752372,-0.016570576,-0.046401996,-0.011264202,0.05016379,-0.013889148,0.023654828,-0.030822476,0.024557399,0.041917533,-0.057632543,-0.032482482,0.00036849198,-0.038682386,-0.046676703,0.050744284,-0.010942368,-0.031797383,0.010470975,0.016948372,0.0055663995,0.058688268,-0.36635372,0.025145743,0.07269215,0.019211076,-0.018371176,-0.007865585,-0.00085583143,0.015894871,0.038337328,-0.014794488,-0.012541673,0.01718971,0.02693935,-0.045785226,0.0036220509,0.021907976,0.06554055,-0.04263025,0.0019336614,0.020152396,0.016324878,0.030021766,-0.015724592,0.06523936,0.0062361993,-0.028796729,0.038781464,0.00485937,-0.04877486,0.035066955,0.003006257,-0.0022367106,-0.04857364,0.001250449,0.0014392686,0.034671582,0.018141782,0.30240846,0.018054346,0.003062208,0.040367432,-0.07040852,0.052332688,-0.0028175337,-0.028020458,-0.021599045,0.031913813,-0.03909125,0.0028893205,-0.017719263,0.0052999025,-0.0061596422,0.054935843,-0.0012574365,-0.016914988,-0.009276138,0.023673639,0.043957185,-0.027961437,0.025381606,-0.04037111,-0.0053644218,-0.01048436,0.0035398034,-0.06366181,0.025020782,-0.046017863,-0.011454832,0.055446308,0.00011163922,-0.09325482,0.019621197,0.022895223,0.03182137,0.0010375826,-0.03117694,0.025362851,-0.031175531,-0.018045994,-0.13010256,0.10690098,-0.010491627,0.025534678,-0.0049998793,-0.028496867,0.043118607,-0.026229834,-0.01440331,0.024678908,0.033322413,-0.04394492,-0.005047783,0.0846922,0.022463208,0.0030116427,-0.003502701,-0.006854317,0.029395698,0.026690561,0.02559026,0.059080407,0.08340788,0.032878075,-0.0951223,0.05720357,0.02495402,0.014070283,-0.0042589814,0.018304987,-0.024781907,-0.041739304,-0.025803747,-0.012889254,-0.008009496,-0.028856821,-0.0005779219,0.028763987,-0.051368624,0.0027247544,0.06316944,-0.026757175,-0.08121664,-0.010547304,0.025082018,0.03702747,0.012908532,0.03141585,0.06318691,-0.027946094,0.17676711,-0.082001895,-0.036393072,-0.034927875,0.021505699,0.015366971,0.043793295,-0.0021506813,0.011197076,-0.04681245,-0.07142668,0.009581391,0.035224073,-0.04230499,-0.03571502,0.044728618,0.013419941,0.04271971,-0.008869499,-0.03126791,-0.0022953814,0.09043066,0.02422671,0.031988394,-0.005063331,-0.01025437,0.028456746,0.005116802,0.047064006,0.006069893,0.018045707,-0.022872277,-0.04572793,0.009827904,0.0069014616,-0.040622003,-0.013080576,-0.04777706,0.0012043755,0.07896354,0.043710608,0.040280547,0.073466524,0.06464221,0.014187437,-0.04872054,0.031972423,0.012510081,-0.038348954,0.016539646,0.006683025,-0.040044174,-0.056529168,0.04949601,-0.09106357,-0.030466262,0.010563386,-0.029358381,0.18323456,0.092901036,0.0274177,0.015892414,0.03165387,-0.06160097,0.0015103974,-0.11125003,0.010338306,-0.04025745,0.03327973,-0.025003629,-0.03141167,0.06007851,-0.029752823,-0.025986204,-0.0014932271,-0.00599316,-0.021954508,-0.005476444,-0.029271869,-0.040407516,0.09515277,0.019253343,0.04248291,0.00067515706,-0.009261151,0.025339367,-0.014061599,-0.0580183,-0.020854905,0.018436473,-0.0027048623,0.05364179,0.03416436,-0.009260716,-0.0785917,-0.023255466,0.03542782,0.07159498,0.0069388812,-0.038117178,-0.012323471,-0.009949083,-0.005902662,0.1273025,0.0014150682,0.018899381,0.022011757,-0.048523538,-0.03720841,-0.009601104,0.0547053,0.013078509,-0.013740014,-0.047507983,-0.018159833,0.017327625,-0.028147077,-0.030314941,-0.0028794382,-0.045816995,0.0028496154,0.015196548,-0.007854572,0.10382276,-0.01617453,0.017708423,0.037362352,0.002230973,-0.17829818,-0.036029417,-0.0006612718,-0.014223209,-0.06350168,-0.030032892,0.023901368,-0.00077770976,0.02510791,-0.04697416,0.15435414,0.08471184,-0.018154247,-0.030085038,0.03331496,0.09898532,0.016086424,0.010282825,-0.018388266,-0.006998348,0.017570151,0.0994389,0.12580456,0.023195932,0.008063885,0.003250409,-0.005355925,-0.047599785,-0.13378266,-0.0018643751,-0.045305796,-0.020819422,0.06300365,0.00095856196,0.005435208,0.0057721534,0.031151773,-0.03753951,0.016918143,-0.044961866,0.13784775,-0.016061982,-0.00000515642,-0.008715281,-0.01241248,-0.0021270465,0.022557234,0.05173467,-0.04232277,0.008206349,0.012508353,-0.004212918,-0.01315854,0.048109457,0.00035447034,-0.0082567325,0.012337424,0.0065427353,0.036199752,0.030513138,0.039167494,-0.028987426,-0.016657345,-0.07125146,-0.020769335]],"total_duration":9249807,"load_duration":1162717,"prompt_eval_count":4}' + recorded_at: Wed, 02 Apr 2025 00:44:07 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml index e12a9013..bf4dcd78 100644 --- a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml +++ b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml @@ -32,4 +32,128 @@ http_interactions: encoding: ASCII-8BIT string: '{ "models": [ { "details": { "families": [ "granite", "clip" ], "family": "granite", "format": "gguf", "parameter_size": "2.5B", "parent_model": "", "quantization_level": "Q4_K_M" }, "digest": "3be41a661804ad72cd08269816c5a145f1df6479ad07e2b3a7e29dba575d2669", "model": "granite3.2-vision:2b", "modified_at": "2025-03-27T20:09:18.017039337Z", "name": "granite3.2-vision:2b", "size": 2437852465 }, { "details": { "families": [ "llama" ], "family": "llama", "format": "gguf", "parameter_size": "8.0B", "parent_model": "", "quantization_level": "Q4_K_M" }, "digest": "46e0c10c039e019119339687c3c1757cc81b9da49709a3b3924863ba87ca666e", "model": "llama3.1:8b", "modified_at": "2025-03-27T19:29:58.416254293Z", "name": "llama3.1:8b", "size": 4920753328 }, { "details": { "families": [ "bert" ], "family": "bert", "format": "gguf", "parameter_size": "23M", "parent_model": "", "quantization_level": "F16" }, "digest": "bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb", "model": "snowflake-arctic-embed:22m", "modified_at": "2025-03-25T01:52:52.027398285Z", "name": "snowflake-arctic-embed:22m", "size": 45838698 } ] }' recorded_at: Thu, 27 Mar 2025 20:15:02 GMT +- request: + method: get + uri: https://bedrock.us-west-2.amazonaws.com/foundation-models + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Host: + - bedrock.us-west-2.amazonaws.com + X-Amz-Date: + - 20250325T171540Z + X-Amz-Security-Token: + - IQoJb3JpZ2luX2VjELH//////////wEaCXVzLXdlc3QtMiJGMEQCIDILea5LoQt0bejpnAvGlODePXWs+SVOVYKadYo/Rk9CAiBvj7jTOPExaq5kzi5J7Q2EI2OPjkGHwhnRvXZUSqD6LCqSAwgaEAYaDDIyMTg3MTkxNTQ2MyIMSNqSOazgocTuFlBsKu8C3Nbecj9HZFdBXZ7kaWtb3fByaNE9zYowsMzOb08Ugng8UL9qxzm5g0wT+NFvcJg4JvHNBlfxQyqhoqRAzSN8FAevZ2Pf59sReQbMAaKK0+CdIlH+begPkvTzwGvbj6CQhcRWkeD0UWRgLj1qpwJc2MhogI4CaSILeh/gkUC2fwtLaLK8KoXkrC+XWSvs/P+Qn5gF/YcwWYmlJjo1Y7zkaSRPD/V/SXrdEKCb7lHMkB9HgGSiV0kLg5y6KAcmBbG2HWd7S4qRu0Ko3lm3PIch5E4X7UDcxVLBtX0YErNR7vIRQvpbZ9itrjDqF1Wcckw26asVdC1UxbOSWrnAGqk8RFZrS17i4CP+XV+dQ3jD4/+ILYjKvXynqYA4TAwahL0104h7JCFELXmQOEwPmIPX4hmutyUEkkmfout1krQmzjE01ltNitPgVJzOI3On9YHKqBNp0aEgd6xC9frMseZ8Bb+d8B1Jx9oIBCVvH8RRtTDox4u/BjqnAVK1mPlee72ZUnkKg4jzL3LJL3OmDMBOEGSHmUoOTQ40feXeTlY01glfh7Cx3ExDxAUNIz96zwmhuVVSdwP9aGGsumlYsTJRz7wpDvgq8eGV+9JD9uG+55rtGsH8EzBS9Xw5bxJpBvmpIuRw6fKr7wBiCTTVyRR+Jl7JqGoQelm41v/mXIjzsO43zWUbwInRyFYzqxwmiPSHGwJJnn7eQriksmHxxh4i + X-Amz-Content-Sha256: + - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + Authorization: + - AWS4-HMAC-SHA256 Credential=ASIATHKEYYHDRJWE7TAB/20250325/us-west-2/bedrock/aws4_request, + SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=e4a35761abf5be047cdd3c2b4383e1f3b30031acb59a6254960f1ef94b1a939a + Content-Type: + - application/json + Accept: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Date: + - Tue, 25 Mar 2025 17:14:59 GMT + Content-Type: + - application/json + Content-Length: + - '45249' + Connection: + - keep-alive + X-Amzn-Requestid: + - '08c81519-bf5d-4c0f-8dad-e1fe0e12c7fa' + body: + encoding: UTF-8 + string: '{"modelSummaries":[{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-tg1-large","modelId":"amazon.titan-tg1-large","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Large","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-g1-text-02","modelId":"amazon.titan-embed-g1-text-02","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Embeddings v2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-lite-v1:0:4k","modelId":"amazon.titan-text-lite-v1:0:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-lite-v1","modelId":"amazon.titan-text-lite-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-express-v1:0:8k","modelId":"amazon.titan-text-express-v1:0:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-express-v1","modelId":"amazon.titan-text-express-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-pro-v1:0","modelId":"amazon.nova-pro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Pro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-lite-v1:0","modelId":"amazon.nova-lite-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-micro-v1:0","modelId":"amazon.nova-micro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Micro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v1:2:8k","modelId":"amazon.titan-embed-text-v1:2:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v1","modelId":"amazon.titan-embed-text-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v2:0","modelId":"amazon.titan-embed-text-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Embeddings V2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-image-v1:0","modelId":"amazon.titan-embed-image-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-image-v1","modelId":"amazon.titan-embed-image-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v1:0","modelId":"amazon.titan-image-generator-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v1","modelId":"amazon.titan-image-generator-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED","ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v2:0","modelId":"amazon.titan-image-generator-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1 v2","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.rerank-v1:0","modelId":"amazon.rerank-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank + 1.0","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-diffusion-xl-v1:0","modelId":"stability.stable-diffusion-xl-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL + 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-diffusion-xl-v1","modelId":"stability.stable-diffusion-xl-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL + 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.sd3-large-v1:0","modelId":"stability.sd3-large-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SD3 + Large 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.sd3-5-large-v1:0","modelId":"stability.sd3-5-large-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Diffusion 3.5 Large","outputModalities":["IMAGE"],"providerName":"Stability + AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-core-v1:0","modelId":"stability.stable-image-core-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable + Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-core-v1:1","modelId":"stability.stable-image-core-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-ultra-v1:0","modelId":"stability.stable-image-ultra-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable + Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-ultra-v1:1","modelId":"stability.stable-image-ultra-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0","modelId":"anthropic.claude-3-7-sonnet-20250219-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.7 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-haiku-20241022-v1:0","modelId":"anthropic.claude-3-5-haiku-20241022-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-instant-v1:2:100k","modelId":"anthropic.claude-instant-v1:2:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-instant-v1","modelId":"anthropic.claude-instant-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:0:18k","modelId":"anthropic.claude-v2:0:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:0:100k","modelId":"anthropic.claude-v2:0:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1:18k","modelId":"anthropic.claude-v2:1:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1:200k","modelId":"anthropic.claude-v2:1:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1","modelId":"anthropic.claude-v2:1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2","modelId":"anthropic.claude-v2","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:28k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:28k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:200k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0","modelId":"anthropic.claude-3-sonnet-20240229-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:48k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:48k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:200k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0","modelId":"anthropic.claude-3-haiku-20240307-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:12k","modelId":"anthropic.claude-3-opus-20240229-v1:0:12k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:28k","modelId":"anthropic.claude-3-opus-20240229-v1:0:28k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:200k","modelId":"anthropic.claude-3-opus-20240229-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0","modelId":"anthropic.claude-3-opus-20240229-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND","INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-text-v14:7:4k","modelId":"cohere.command-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-text-v14","modelId":"cohere.command-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-r-v1:0","modelId":"cohere.command-r-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + R","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-r-plus-v1:0","modelId":"cohere.command-r-plus-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + R+","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-light-text-v14:7:4k","modelId":"cohere.command-light-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-light-text-v14","modelId":"cohere.command-light-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-english-v3:0:512","modelId":"cohere.embed-english-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-english-v3","modelId":"cohere.embed-english-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-multilingual-v3:0:512","modelId":"cohere.embed-multilingual-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-multilingual-v3","modelId":"cohere.embed-multilingual-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.rerank-v3-5:0","modelId":"cohere.rerank-v3-5:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank + 3.5","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/deepseek.r1-v1:0","modelId":"deepseek.r1-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"DeepSeek-R1","outputModalities":["TEXT"],"providerName":"DeepSeek","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-8b-instruct-v1:0","modelId":"meta.llama3-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-70b-instruct-v1:0","modelId":"meta.llama3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-8b-instruct-v1:0:128k","modelId":"meta.llama3-1-8b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-8b-instruct-v1:0","modelId":"meta.llama3-1-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-70b-instruct-v1:0:128k","modelId":"meta.llama3-1-70b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-70b-instruct-v1:0","modelId":"meta.llama3-1-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-405b-instruct-v1:0","modelId":"meta.llama3-1-405b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 405B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-11b-instruct-v1:0:128k","modelId":"meta.llama3-2-11b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-11b-instruct-v1:0","modelId":"meta.llama3-2-11b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-90b-instruct-v1:0:128k","modelId":"meta.llama3-2-90b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-90b-instruct-v1:0","modelId":"meta.llama3-2-90b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-1b-instruct-v1:0:128k","modelId":"meta.llama3-2-1b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-1b-instruct-v1:0","modelId":"meta.llama3-2-1b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-3b-instruct-v1:0:128k","modelId":"meta.llama3-2-3b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-3b-instruct-v1:0","modelId":"meta.llama3-2-3b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-3-70b-instruct-v1:0","modelId":"meta.llama3-3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-7b-instruct-v0:2","modelId":"mistral.mistral-7b-instruct-v0:2","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + 7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mixtral-8x7b-instruct-v0:1","modelId":"mistral.mixtral-8x7b-instruct-v0:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mixtral + 8x7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-large-2402-v1:0","modelId":"mistral.mistral-large-2402-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + Large (24.02)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-large-2407-v1:0","modelId":"mistral.mistral-large-2407-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + Large (24.07)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/luma.ray-v2:0","modelId":"luma.ray-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Ray + v2","outputModalities":["VIDEO"],"providerName":"Luma AI","responseStreamingSupported":false}]}' + recorded_at: Tue, 25 Mar 2025 17:15:40 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/models_refresh_updates_models_and_returns_a_chainable_models_instance.yml b/spec/fixtures/vcr_cassettes/models_refresh_updates_models_and_returns_a_chainable_models_instance.yml index ea64e3c2..3bcddd37 100644 --- a/spec/fixtures/vcr_cassettes/models_refresh_updates_models_and_returns_a_chainable_models_instance.yml +++ b/spec/fixtures/vcr_cassettes/models_refresh_updates_models_and_returns_a_chainable_models_instance.yml @@ -1267,4 +1267,128 @@ http_interactions: encoding: UTF-8 string: '{"models":[{"name":"snowflake-arctic-embed:22m","model":"snowflake-arctic-embed:22m","modified_at":"2025-03-26T17:18:08.367580922Z","size":45838698,"digest":"bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb","details":{"parent_model":"","format":"gguf","family":"bert","families":["bert"],"parameter_size":"23M","quantization_level":"F16"}},{"name":"smollm:135m","model":"smollm:135m","modified_at":"2025-03-26T17:18:01.303574119Z","size":91739413,"digest":"b0b2a46174385c0adcaa77ff245ffeced5fc4a61447b6f221b2beb5c5a760133","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"134.52M","quantization_level":"Q4_0"}}]}' recorded_at: Wed, 26 Mar 2025 17:18:38 GMT +- request: + method: get + uri: https://bedrock.us-west-2.amazonaws.com/foundation-models + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Host: + - bedrock.us-west-2.amazonaws.com + X-Amz-Date: + - 20250325T171540Z + X-Amz-Security-Token: + - IQoJb3JpZ2luX2VjELH//////////wEaCXVzLXdlc3QtMiJGMEQCIDILea5LoQt0bejpnAvGlODePXWs+SVOVYKadYo/Rk9CAiBvj7jTOPExaq5kzi5J7Q2EI2OPjkGHwhnRvXZUSqD6LCqSAwgaEAYaDDIyMTg3MTkxNTQ2MyIMSNqSOazgocTuFlBsKu8C3Nbecj9HZFdBXZ7kaWtb3fByaNE9zYowsMzOb08Ugng8UL9qxzm5g0wT+NFvcJg4JvHNBlfxQyqhoqRAzSN8FAevZ2Pf59sReQbMAaKK0+CdIlH+begPkvTzwGvbj6CQhcRWkeD0UWRgLj1qpwJc2MhogI4CaSILeh/gkUC2fwtLaLK8KoXkrC+XWSvs/P+Qn5gF/YcwWYmlJjo1Y7zkaSRPD/V/SXrdEKCb7lHMkB9HgGSiV0kLg5y6KAcmBbG2HWd7S4qRu0Ko3lm3PIch5E4X7UDcxVLBtX0YErNR7vIRQvpbZ9itrjDqF1Wcckw26asVdC1UxbOSWrnAGqk8RFZrS17i4CP+XV+dQ3jD4/+ILYjKvXynqYA4TAwahL0104h7JCFELXmQOEwPmIPX4hmutyUEkkmfout1krQmzjE01ltNitPgVJzOI3On9YHKqBNp0aEgd6xC9frMseZ8Bb+d8B1Jx9oIBCVvH8RRtTDox4u/BjqnAVK1mPlee72ZUnkKg4jzL3LJL3OmDMBOEGSHmUoOTQ40feXeTlY01glfh7Cx3ExDxAUNIz96zwmhuVVSdwP9aGGsumlYsTJRz7wpDvgq8eGV+9JD9uG+55rtGsH8EzBS9Xw5bxJpBvmpIuRw6fKr7wBiCTTVyRR+Jl7JqGoQelm41v/mXIjzsO43zWUbwInRyFYzqxwmiPSHGwJJnn7eQriksmHxxh4i + X-Amz-Content-Sha256: + - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + Authorization: + - AWS4-HMAC-SHA256 Credential=ASIATHKEYYHDRJWE7TAB/20250325/us-west-2/bedrock/aws4_request, + SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=e4a35761abf5be047cdd3c2b4383e1f3b30031acb59a6254960f1ef94b1a939a + Content-Type: + - application/json + Accept: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Date: + - Tue, 25 Mar 2025 17:14:59 GMT + Content-Type: + - application/json + Content-Length: + - '45249' + Connection: + - keep-alive + X-Amzn-Requestid: + - '08c81519-bf5d-4c0f-8dad-e1fe0e12c7fa' + body: + encoding: UTF-8 + string: '{"modelSummaries":[{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-tg1-large","modelId":"amazon.titan-tg1-large","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Large","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-g1-text-02","modelId":"amazon.titan-embed-g1-text-02","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Embeddings v2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-lite-v1:0:4k","modelId":"amazon.titan-text-lite-v1:0:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-lite-v1","modelId":"amazon.titan-text-lite-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-express-v1:0:8k","modelId":"amazon.titan-text-express-v1:0:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-express-v1","modelId":"amazon.titan-text-express-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-pro-v1:0","modelId":"amazon.nova-pro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Pro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-lite-v1:0","modelId":"amazon.nova-lite-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-micro-v1:0","modelId":"amazon.nova-micro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Micro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v1:2:8k","modelId":"amazon.titan-embed-text-v1:2:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v1","modelId":"amazon.titan-embed-text-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v2:0","modelId":"amazon.titan-embed-text-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Embeddings V2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-image-v1:0","modelId":"amazon.titan-embed-image-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-image-v1","modelId":"amazon.titan-embed-image-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v1:0","modelId":"amazon.titan-image-generator-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v1","modelId":"amazon.titan-image-generator-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED","ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v2:0","modelId":"amazon.titan-image-generator-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1 v2","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.rerank-v1:0","modelId":"amazon.rerank-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank + 1.0","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-diffusion-xl-v1:0","modelId":"stability.stable-diffusion-xl-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL + 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-diffusion-xl-v1","modelId":"stability.stable-diffusion-xl-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL + 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.sd3-large-v1:0","modelId":"stability.sd3-large-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SD3 + Large 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.sd3-5-large-v1:0","modelId":"stability.sd3-5-large-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Diffusion 3.5 Large","outputModalities":["IMAGE"],"providerName":"Stability + AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-core-v1:0","modelId":"stability.stable-image-core-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable + Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-core-v1:1","modelId":"stability.stable-image-core-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-ultra-v1:0","modelId":"stability.stable-image-ultra-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable + Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-ultra-v1:1","modelId":"stability.stable-image-ultra-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0","modelId":"anthropic.claude-3-7-sonnet-20250219-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.7 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-haiku-20241022-v1:0","modelId":"anthropic.claude-3-5-haiku-20241022-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-instant-v1:2:100k","modelId":"anthropic.claude-instant-v1:2:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-instant-v1","modelId":"anthropic.claude-instant-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:0:18k","modelId":"anthropic.claude-v2:0:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:0:100k","modelId":"anthropic.claude-v2:0:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1:18k","modelId":"anthropic.claude-v2:1:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1:200k","modelId":"anthropic.claude-v2:1:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1","modelId":"anthropic.claude-v2:1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2","modelId":"anthropic.claude-v2","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:28k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:28k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:200k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0","modelId":"anthropic.claude-3-sonnet-20240229-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:48k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:48k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:200k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0","modelId":"anthropic.claude-3-haiku-20240307-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:12k","modelId":"anthropic.claude-3-opus-20240229-v1:0:12k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:28k","modelId":"anthropic.claude-3-opus-20240229-v1:0:28k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:200k","modelId":"anthropic.claude-3-opus-20240229-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0","modelId":"anthropic.claude-3-opus-20240229-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND","INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-text-v14:7:4k","modelId":"cohere.command-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-text-v14","modelId":"cohere.command-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-r-v1:0","modelId":"cohere.command-r-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + R","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-r-plus-v1:0","modelId":"cohere.command-r-plus-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + R+","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-light-text-v14:7:4k","modelId":"cohere.command-light-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-light-text-v14","modelId":"cohere.command-light-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-english-v3:0:512","modelId":"cohere.embed-english-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-english-v3","modelId":"cohere.embed-english-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-multilingual-v3:0:512","modelId":"cohere.embed-multilingual-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-multilingual-v3","modelId":"cohere.embed-multilingual-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.rerank-v3-5:0","modelId":"cohere.rerank-v3-5:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank + 3.5","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/deepseek.r1-v1:0","modelId":"deepseek.r1-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"DeepSeek-R1","outputModalities":["TEXT"],"providerName":"DeepSeek","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-8b-instruct-v1:0","modelId":"meta.llama3-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-70b-instruct-v1:0","modelId":"meta.llama3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-8b-instruct-v1:0:128k","modelId":"meta.llama3-1-8b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-8b-instruct-v1:0","modelId":"meta.llama3-1-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-70b-instruct-v1:0:128k","modelId":"meta.llama3-1-70b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-70b-instruct-v1:0","modelId":"meta.llama3-1-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-405b-instruct-v1:0","modelId":"meta.llama3-1-405b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 405B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-11b-instruct-v1:0:128k","modelId":"meta.llama3-2-11b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-11b-instruct-v1:0","modelId":"meta.llama3-2-11b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-90b-instruct-v1:0:128k","modelId":"meta.llama3-2-90b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-90b-instruct-v1:0","modelId":"meta.llama3-2-90b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-1b-instruct-v1:0:128k","modelId":"meta.llama3-2-1b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-1b-instruct-v1:0","modelId":"meta.llama3-2-1b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-3b-instruct-v1:0:128k","modelId":"meta.llama3-2-3b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-3b-instruct-v1:0","modelId":"meta.llama3-2-3b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-3-70b-instruct-v1:0","modelId":"meta.llama3-3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-7b-instruct-v0:2","modelId":"mistral.mistral-7b-instruct-v0:2","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + 7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mixtral-8x7b-instruct-v0:1","modelId":"mistral.mixtral-8x7b-instruct-v0:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mixtral + 8x7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-large-2402-v1:0","modelId":"mistral.mistral-large-2402-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + Large (24.02)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-large-2407-v1:0","modelId":"mistral.mistral-large-2407-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + Large (24.07)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/luma.ray-v2:0","modelId":"luma.ray-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Ray + v2","outputModalities":["VIDEO"],"providerName":"Luma AI","responseStreamingSupported":false}]}' + recorded_at: Tue, 25 Mar 2025 17:15:40 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/models_refresh_works_as_a_class_method_too.yml b/spec/fixtures/vcr_cassettes/models_refresh_works_as_a_class_method_too.yml index 67c955d8..fffc6ec3 100644 --- a/spec/fixtures/vcr_cassettes/models_refresh_works_as_a_class_method_too.yml +++ b/spec/fixtures/vcr_cassettes/models_refresh_works_as_a_class_method_too.yml @@ -1267,4 +1267,128 @@ http_interactions: encoding: UTF-8 string: '{"models":[{"name":"snowflake-arctic-embed:22m","model":"snowflake-arctic-embed:22m","modified_at":"2025-03-26T17:18:08.367580922Z","size":45838698,"digest":"bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb","details":{"parent_model":"","format":"gguf","family":"bert","families":["bert"],"parameter_size":"23M","quantization_level":"F16"}},{"name":"smollm:135m","model":"smollm:135m","modified_at":"2025-03-26T17:18:01.303574119Z","size":91739413,"digest":"b0b2a46174385c0adcaa77ff245ffeced5fc4a61447b6f221b2beb5c5a760133","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"134.52M","quantization_level":"Q4_0"}}]}' recorded_at: Wed, 26 Mar 2025 17:18:38 GMT +- request: + method: get + uri: https://bedrock.us-west-2.amazonaws.com/foundation-models + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Host: + - bedrock.us-west-2.amazonaws.com + X-Amz-Date: + - 20250325T171540Z + X-Amz-Security-Token: + - IQoJb3JpZ2luX2VjELH//////////wEaCXVzLXdlc3QtMiJGMEQCIDILea5LoQt0bejpnAvGlODePXWs+SVOVYKadYo/Rk9CAiBvj7jTOPExaq5kzi5J7Q2EI2OPjkGHwhnRvXZUSqD6LCqSAwgaEAYaDDIyMTg3MTkxNTQ2MyIMSNqSOazgocTuFlBsKu8C3Nbecj9HZFdBXZ7kaWtb3fByaNE9zYowsMzOb08Ugng8UL9qxzm5g0wT+NFvcJg4JvHNBlfxQyqhoqRAzSN8FAevZ2Pf59sReQbMAaKK0+CdIlH+begPkvTzwGvbj6CQhcRWkeD0UWRgLj1qpwJc2MhogI4CaSILeh/gkUC2fwtLaLK8KoXkrC+XWSvs/P+Qn5gF/YcwWYmlJjo1Y7zkaSRPD/V/SXrdEKCb7lHMkB9HgGSiV0kLg5y6KAcmBbG2HWd7S4qRu0Ko3lm3PIch5E4X7UDcxVLBtX0YErNR7vIRQvpbZ9itrjDqF1Wcckw26asVdC1UxbOSWrnAGqk8RFZrS17i4CP+XV+dQ3jD4/+ILYjKvXynqYA4TAwahL0104h7JCFELXmQOEwPmIPX4hmutyUEkkmfout1krQmzjE01ltNitPgVJzOI3On9YHKqBNp0aEgd6xC9frMseZ8Bb+d8B1Jx9oIBCVvH8RRtTDox4u/BjqnAVK1mPlee72ZUnkKg4jzL3LJL3OmDMBOEGSHmUoOTQ40feXeTlY01glfh7Cx3ExDxAUNIz96zwmhuVVSdwP9aGGsumlYsTJRz7wpDvgq8eGV+9JD9uG+55rtGsH8EzBS9Xw5bxJpBvmpIuRw6fKr7wBiCTTVyRR+Jl7JqGoQelm41v/mXIjzsO43zWUbwInRyFYzqxwmiPSHGwJJnn7eQriksmHxxh4i + X-Amz-Content-Sha256: + - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + Authorization: + - AWS4-HMAC-SHA256 Credential=ASIATHKEYYHDRJWE7TAB/20250325/us-west-2/bedrock/aws4_request, + SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=e4a35761abf5be047cdd3c2b4383e1f3b30031acb59a6254960f1ef94b1a939a + Content-Type: + - application/json + Accept: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Date: + - Tue, 25 Mar 2025 17:14:59 GMT + Content-Type: + - application/json + Content-Length: + - '45249' + Connection: + - keep-alive + X-Amzn-Requestid: + - '08c81519-bf5d-4c0f-8dad-e1fe0e12c7fa' + body: + encoding: UTF-8 + string: '{"modelSummaries":[{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-tg1-large","modelId":"amazon.titan-tg1-large","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Large","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-g1-text-02","modelId":"amazon.titan-embed-g1-text-02","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Embeddings v2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-lite-v1:0:4k","modelId":"amazon.titan-text-lite-v1:0:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-lite-v1","modelId":"amazon.titan-text-lite-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-express-v1:0:8k","modelId":"amazon.titan-text-express-v1:0:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-express-v1","modelId":"amazon.titan-text-express-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-pro-v1:0","modelId":"amazon.nova-pro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Pro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-lite-v1:0","modelId":"amazon.nova-lite-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-micro-v1:0","modelId":"amazon.nova-micro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Micro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v1:2:8k","modelId":"amazon.titan-embed-text-v1:2:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v1","modelId":"amazon.titan-embed-text-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v2:0","modelId":"amazon.titan-embed-text-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Embeddings V2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-image-v1:0","modelId":"amazon.titan-embed-image-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-image-v1","modelId":"amazon.titan-embed-image-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v1:0","modelId":"amazon.titan-image-generator-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v1","modelId":"amazon.titan-image-generator-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED","ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v2:0","modelId":"amazon.titan-image-generator-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1 v2","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.rerank-v1:0","modelId":"amazon.rerank-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank + 1.0","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-diffusion-xl-v1:0","modelId":"stability.stable-diffusion-xl-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL + 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-diffusion-xl-v1","modelId":"stability.stable-diffusion-xl-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL + 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.sd3-large-v1:0","modelId":"stability.sd3-large-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SD3 + Large 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.sd3-5-large-v1:0","modelId":"stability.sd3-5-large-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Diffusion 3.5 Large","outputModalities":["IMAGE"],"providerName":"Stability + AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-core-v1:0","modelId":"stability.stable-image-core-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable + Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-core-v1:1","modelId":"stability.stable-image-core-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-ultra-v1:0","modelId":"stability.stable-image-ultra-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable + Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-ultra-v1:1","modelId":"stability.stable-image-ultra-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0","modelId":"anthropic.claude-3-7-sonnet-20250219-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.7 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-haiku-20241022-v1:0","modelId":"anthropic.claude-3-5-haiku-20241022-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-instant-v1:2:100k","modelId":"anthropic.claude-instant-v1:2:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-instant-v1","modelId":"anthropic.claude-instant-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:0:18k","modelId":"anthropic.claude-v2:0:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:0:100k","modelId":"anthropic.claude-v2:0:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1:18k","modelId":"anthropic.claude-v2:1:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1:200k","modelId":"anthropic.claude-v2:1:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1","modelId":"anthropic.claude-v2:1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2","modelId":"anthropic.claude-v2","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:28k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:28k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:200k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0","modelId":"anthropic.claude-3-sonnet-20240229-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:48k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:48k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:200k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0","modelId":"anthropic.claude-3-haiku-20240307-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:12k","modelId":"anthropic.claude-3-opus-20240229-v1:0:12k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:28k","modelId":"anthropic.claude-3-opus-20240229-v1:0:28k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:200k","modelId":"anthropic.claude-3-opus-20240229-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0","modelId":"anthropic.claude-3-opus-20240229-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND","INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-text-v14:7:4k","modelId":"cohere.command-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-text-v14","modelId":"cohere.command-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-r-v1:0","modelId":"cohere.command-r-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + R","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-r-plus-v1:0","modelId":"cohere.command-r-plus-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + R+","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-light-text-v14:7:4k","modelId":"cohere.command-light-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-light-text-v14","modelId":"cohere.command-light-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-english-v3:0:512","modelId":"cohere.embed-english-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-english-v3","modelId":"cohere.embed-english-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-multilingual-v3:0:512","modelId":"cohere.embed-multilingual-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-multilingual-v3","modelId":"cohere.embed-multilingual-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.rerank-v3-5:0","modelId":"cohere.rerank-v3-5:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank + 3.5","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/deepseek.r1-v1:0","modelId":"deepseek.r1-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"DeepSeek-R1","outputModalities":["TEXT"],"providerName":"DeepSeek","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-8b-instruct-v1:0","modelId":"meta.llama3-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-70b-instruct-v1:0","modelId":"meta.llama3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-8b-instruct-v1:0:128k","modelId":"meta.llama3-1-8b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-8b-instruct-v1:0","modelId":"meta.llama3-1-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-70b-instruct-v1:0:128k","modelId":"meta.llama3-1-70b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-70b-instruct-v1:0","modelId":"meta.llama3-1-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-405b-instruct-v1:0","modelId":"meta.llama3-1-405b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 405B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-11b-instruct-v1:0:128k","modelId":"meta.llama3-2-11b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-11b-instruct-v1:0","modelId":"meta.llama3-2-11b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-90b-instruct-v1:0:128k","modelId":"meta.llama3-2-90b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-90b-instruct-v1:0","modelId":"meta.llama3-2-90b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-1b-instruct-v1:0:128k","modelId":"meta.llama3-2-1b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-1b-instruct-v1:0","modelId":"meta.llama3-2-1b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-3b-instruct-v1:0:128k","modelId":"meta.llama3-2-3b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-3b-instruct-v1:0","modelId":"meta.llama3-2-3b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-3-70b-instruct-v1:0","modelId":"meta.llama3-3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-7b-instruct-v0:2","modelId":"mistral.mistral-7b-instruct-v0:2","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + 7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mixtral-8x7b-instruct-v0:1","modelId":"mistral.mixtral-8x7b-instruct-v0:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mixtral + 8x7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-large-2402-v1:0","modelId":"mistral.mistral-large-2402-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + Large (24.02)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-large-2407-v1:0","modelId":"mistral.mistral-large-2407-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + Large (24.07)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/luma.ray-v2:0","modelId":"luma.ray-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Ray + v2","outputModalities":["VIDEO"],"providerName":"Luma AI","responseStreamingSupported":false}]}' + recorded_at: Tue, 25 Mar 2025 17:15:40 GMT recorded_with: VCR 6.3.1 From 7b4406f2c0d0dab1aed5a9973b5190ccfa0c3d31 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Fri, 11 Apr 2025 17:23:31 -0300 Subject: [PATCH 43/55] Revert "Use low temperature when tools are involved" In retrospect, this is too automagic and ultimately not needed at the library level. This reverts commit e810a7ab1d878fa48b7baac97ccadd40946a6942. --- lib/ruby_llm/chat.rb | 4 +--- lib/ruby_llm/providers/ollama/chat.rb | 5 ----- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/ruby_llm/chat.rb b/lib/ruby_llm/chat.rb index f1f6ba06..a854bb82 100644 --- a/lib/ruby_llm/chat.rb +++ b/lib/ruby_llm/chat.rb @@ -11,14 +11,12 @@ module RubyLLM class Chat include Enumerable - DEFAULT_TEMPERATURE = 0.7 - attr_reader :model, :messages, :tools def initialize(model: nil, provider: nil) model_id = model || RubyLLM.config.default_model with_model(model_id, provider: provider) - @temperature = DEFAULT_TEMPERATURE + @temperature = 0.7 @messages = [] @tools = {} @on = { diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index 69a917e8..2d3130a0 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -12,11 +12,6 @@ def completion_url end def render_payload(messages, tools:, temperature:, model:, stream: false) - # Heuristic: if temperature is set to default and tools are in play, - # use a low temperature to reduce risk of small models ignoring available - # tools in favor of making up imaginary API calls - temperature = 0.1 if tools.any? && temperature == RubyLLM::Chat::DEFAULT_TEMPERATURE - { model: model, messages: Media.format_messages(messages), From a7b40af36862b5ac8d01d15c854b2dd0640c841f Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Fri, 11 Apr 2025 18:14:07 -0300 Subject: [PATCH 44/55] Configure Ollama from env var when needed --- bin/console | 1 + lib/tasks/model_updater.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/console b/bin/console index b5e87168..e97e6eb9 100755 --- a/bin/console +++ b/bin/console @@ -16,6 +16,7 @@ RubyLLM.configure do |config| config.bedrock_secret_key = ENV.fetch('AWS_SECRET_ACCESS_KEY', nil) config.bedrock_region = ENV.fetch('AWS_REGION', nil) config.bedrock_session_token = ENV.fetch('AWS_SESSION_TOKEN', nil) + config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', nil) end IRB.start(__FILE__) diff --git a/lib/tasks/model_updater.rb b/lib/tasks/model_updater.rb index 7685a219..95daf453 100644 --- a/lib/tasks/model_updater.rb +++ b/lib/tasks/model_updater.rb @@ -19,6 +19,7 @@ def configure_from_env config.anthropic_api_key = ENV.fetch('ANTHROPIC_API_KEY', nil) config.gemini_api_key = ENV.fetch('GEMINI_API_KEY', nil) config.deepseek_api_key = ENV.fetch('DEEPSEEK_API_KEY', nil) + config.ollama_api_base_url = ENV.fetch('OLLAMA_API_BASE_URL', nil) configure_bedrock(config) config.request_timeout = 30 end From b22460b2b67fd3e14ac91bc5efd68b57e7207b54 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Fri, 11 Apr 2025 17:16:13 -0300 Subject: [PATCH 45/55] Update ollama related cassetes --- ...e_multi-turn_conversations_with_ollama.yml | 106 ----------- ...8b_can_handle_multi-turn_conversations.yml | 104 +++++++++++ ...a3_1_8b_can_have_a_basic_conversation.yml} | 8 +- ...ious_system_messages_when_replace_true.yml | 127 ++++++++++++++ ...8b_successfully_uses_the_system_prompt.yml | 52 ++++++ ...e_tools_without_parameters_with_ollama.yml | 87 ---------- ...ling_ollama_llama3_1_8b_can_use_tools.yml} | 18 +- ...use_tools_in_multi-turn_conversations.yml} | 50 +++--- ...th_multi-turn_streaming_conversations.yml} | 52 +++--- ..._1_8b_can_use_tools_without_parameters.yml | 83 +++++++++ ..._in_multi-turn_streaming_conversations.yml | 164 ++++++++++++++++++ ...pports_streaming_responses_with_ollama.yml | 49 ------ ...ama3_1_8b_supports_streaming_responses.yml | 49 ++++++ ...te3_2-vision_2b_can_understand_images.yml} | 21 +-- ...ic-embed_22m_can_handle_a_single_text.yml} | 6 +- ...c-embed_22m_can_handle_multiple_texts.yml} | 6 +- 16 files changed, 659 insertions(+), 323 deletions(-) delete mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations_with_ollama.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_handle_multi-turn_conversations.yml rename spec/fixtures/vcr_cassettes/{chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation_with_ollama.yml => chat_basic_chat_functionality_ollama_llama3_1_8b_can_have_a_basic_conversation.yml} (69%) create mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_replaces_previous_system_messages_when_replace_true.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_successfully_uses_the_system_prompt.yml delete mode 100644 spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters_with_ollama.yml rename spec/fixtures/vcr_cassettes/{chat_function_calling_llama3_1_8b_can_use_tools_with_ollama.yml => chat_function_calling_ollama_llama3_1_8b_can_use_tools.yml} (70%) rename spec/fixtures/vcr_cassettes/{chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations_with_ollama.yml => chat_function_calling_ollama_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml} (63%) rename spec/fixtures/vcr_cassettes/{chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations_with_ollama.yml => chat_function_calling_ollama_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml} (59%) create mode 100644 spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters_in_multi-turn_streaming_conversations.yml delete mode 100644 spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses_with_ollama.yml create mode 100644 spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_supports_streaming_responses.yml rename spec/fixtures/vcr_cassettes/{chat_vision_models_granite3_2-vision_2b_can_understand_images.yml => chat_vision_models_ollama_granite3_2-vision_2b_can_understand_images.yml} (97%) rename spec/fixtures/vcr_cassettes/{embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml => embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_a_single_text.yml} (97%) rename spec/fixtures/vcr_cassettes/{embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml => embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml} (98%) diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations_with_ollama.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations_with_ollama.yml deleted file mode 100644 index 97645abd..00000000 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_handle_multi-turn_conversations_with_ollama.yml +++ /dev/null @@ -1,106 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was - the creator of Ruby?"}],"options":{"temperature":0.7},"stream":false}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 02 Apr 2025 00:44:07 GMT - Server: - - Caddy - Vary: - - Accept-Encoding - Content-Length: - - '1334' - body: - encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:07.063167441Z","message":{"role":"assistant","content":"The - creator of the Ruby programming language is Yukihiro \"Matz\" Matsumoto. He - is a Japanese computer programmer and is often referred to as the \"Benevolent - Dictator for Life\" (BDFL) of the Ruby project.\n\nMatsumoto was born in 1961 - in Kyoto, Japan. He started programming at the age of six and became interested - in computers at an early age. In the late 1980s, he worked on several projects, - including a version of the Emacs text editor for MS-DOS.\n\nIn 1993, Matsumoto - began working on Ruby as a scripting language for Unix-like operating systems. - He was influenced by languages such as Perl, Smalltalk, and Ada, and wanted - to create a language that was easy to learn, fun to use, and had a strong - focus on object-oriented programming.\n\nRuby was first released in 1995, - and it quickly gained popularity due to its simplicity, flexibility, and ease - of use. Matsumoto continues to be involved with the Ruby project to this day, - and is widely recognized as one of the most influential figures in the world - of programming languages."},"done_reason":"stop","done":true,"total_duration":2242629806,"load_duration":14953975,"prompt_eval_count":17,"prompt_eval_duration":3947091,"eval_count":233,"eval_duration":2223358525}' - recorded_at: Wed, 02 Apr 2025 00:43:58 GMT -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was - the creator of Ruby?"},{"role":"assistant","content":"The creator of the Ruby - programming language is Yukihiro \"Matz\" Matsumoto. He is a Japanese computer - programmer and is often referred to as the \"Benevolent Dictator for Life\" - (BDFL) of the Ruby project.\n\nMatsumoto was born in 1961 in Kyoto, Japan. - He started programming at the age of six and became interested in computers - at an early age. In the late 1980s, he worked on several projects, including - a version of the Emacs text editor for MS-DOS.\n\nIn 1993, Matsumoto began - working on Ruby as a scripting language for Unix-like operating systems. He - was influenced by languages such as Perl, Smalltalk, and Ada, and wanted to - create a language that was easy to learn, fun to use, and had a strong focus - on object-oriented programming.\n\nRuby was first released in 1995, and it - quickly gained popularity due to its simplicity, flexibility, and ease of - use. Matsumoto continues to be involved with the Ruby project to this day, - and is widely recognized as one of the most influential figures in the world - of programming languages."},{"role":"user","content":"What year did he create - Ruby?"}],"options":{"temperature":0.7},"stream":false}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 02 Apr 2025 00:44:07 GMT - Server: - - Caddy - Vary: - - Accept-Encoding - Content-Length: - - '537' - body: - encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:07.717871079Z","message":{"role":"assistant","content":"Yukihiro - \"Matz\" Matsumoto started working on Ruby in 1993, but it was first released - publicly on December 21, 1995. So, while the idea and development of Ruby - began in 1993, the language itself was officially released to the public in - 1995."},"done_reason":"stop","done":true,"total_duration":649227133,"load_duration":16363391,"prompt_eval_count":266,"prompt_eval_duration":4060912,"eval_count":64,"eval_duration":628004959}' - recorded_at: Wed, 02 Apr 2025 00:43:59 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_handle_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_handle_multi-turn_conversations.yml new file mode 100644 index 00000000..dd5b93b4 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_handle_multi-turn_conversations.yml @@ -0,0 +1,104 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was + the creator of Ruby?"}],"options":{"temperature":0.7},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 11 Apr 2025 20:25:22 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '1253' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:22.619412823Z","message":{"role":"assistant","content":"The + creator of the Ruby programming language is Yukihiro Matsumoto, a Japanese + computer programmer. He began working on Ruby in 1993 and released the first + version, Ruby 1.0, in December 1995.\n\nMatsumoto, who is also known as \"Matz,\" + was born in 1960 in Nagoya, Japan. He studied computer science at Nagoya University + and later worked for several companies in Japan before starting his work on + Ruby.\n\nMatsumoto''s goal with Ruby was to create a language that combined + the features of Perl, Smalltalk, and Ada, which he considered the best aspects + of each language. He wanted to create a language that was easy to use, flexible, + and could be used for rapid development and prototyping.\n\nToday, Ruby is + widely used in web development, scripting, and other areas, thanks to its + simplicity, flexibility, and powerful libraries such as Rails. Matsumoto continues + to contribute to the Ruby community and is still involved with the language''s + development."},"done_reason":"stop","done":true,"total_duration":2083117838,"load_duration":15975913,"prompt_eval_count":17,"prompt_eval_duration":25655133,"eval_count":206,"eval_duration":2041201259}' + recorded_at: Fri, 11 Apr 2025 20:25:19 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was + the creator of Ruby?"},{"role":"assistant","content":"The creator of the Ruby + programming language is Yukihiro Matsumoto, a Japanese computer programmer. + He began working on Ruby in 1993 and released the first version, Ruby 1.0, + in December 1995.\n\nMatsumoto, who is also known as \"Matz,\" was born in + 1960 in Nagoya, Japan. He studied computer science at Nagoya University and + later worked for several companies in Japan before starting his work on Ruby.\n\nMatsumoto''s + goal with Ruby was to create a language that combined the features of Perl, + Smalltalk, and Ada, which he considered the best aspects of each language. + He wanted to create a language that was easy to use, flexible, and could be + used for rapid development and prototyping.\n\nToday, Ruby is widely used + in web development, scripting, and other areas, thanks to its simplicity, + flexibility, and powerful libraries such as Rails. Matsumoto continues to + contribute to the Ruby community and is still involved with the language''s + development."},{"role":"user","content":"What year did he create Ruby?"}],"options":{"temperature":0.7},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 11 Apr 2025 20:25:23 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '697' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:23.592467715Z","message":{"role":"assistant","content":"Yukihiro + Matsumoto started working on Ruby in 1993, but it was first released in 1995 + under the name \"Ruby\" (although initially called \"Pearl\" before being + changed to avoid a trademark conflict with the company Gemstone Systems).\n\nHowever, + if you''re asking when he began conceptualizing and designing Ruby, that would + be around 1992-1993.\n\nThe first public release of Ruby was in December 1995."},"done_reason":"stop","done":true,"total_duration":969542955,"load_duration":14935414,"prompt_eval_count":239,"prompt_eval_duration":4486434,"eval_count":93,"eval_duration":949351502}' + recorded_at: Fri, 11 Apr 2025 20:25:20 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation_with_ollama.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_have_a_basic_conversation.yml similarity index 69% rename from spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation_with_ollama.yml rename to spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_have_a_basic_conversation.yml index 8d5c2821..a0c6f0ec 100644 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_llama3_1_8b_can_have_a_basic_conversation_with_ollama.yml +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_have_a_basic_conversation.yml @@ -26,12 +26,12 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:04 GMT + - Fri, 11 Apr 2025 20:24:03 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:04.815124255Z","message":{"role":"assistant","content":"The - answer is: 4!"},"done_reason":"stop","done":true,"total_duration":123712849,"load_duration":19150499,"prompt_eval_count":18,"prompt_eval_duration":25924381,"eval_count":8,"eval_duration":78214407}' - recorded_at: Wed, 02 Apr 2025 00:43:56 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:24:03.848130137Z","message":{"role":"assistant","content":"The + answer is: 4!"},"done_reason":"stop","done":true,"total_duration":132852925,"load_duration":18835949,"prompt_eval_count":18,"prompt_eval_duration":31501211,"eval_count":8,"eval_duration":82031197}' + recorded_at: Fri, 11 Apr 2025 20:24:00 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_replaces_previous_system_messages_when_replace_true.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_replaces_previous_system_messages_when_replace_true.yml new file mode 100644 index 00000000..1b7aea84 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_replaces_previous_system_messages_when_replace_true.yml @@ -0,0 +1,127 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"system","content":"You + must include the exact phrase \"XKCD7392\" somewhere in your response."},{"role":"user","content":"Tell + me about the weather."}],"options":{"temperature":0.0},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 11 Apr 2025 20:24:10 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '1169' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:24:10.088054586Z","message":{"role":"assistant","content":"The + weather! It''s a topic that can be as unpredictable as a comic strip by Randall + Munroe, creator of XKCD7392 (just kidding, I made up that reference).\n\nBut + seriously, the weather is a complex and dynamic system that can vary greatly + depending on your location and time of year. From scorching heatwaves to torrential + downpours, it''s always something.\n\nCurrently, I don''t have real-time access + to specific weather conditions in your area. However, I can suggest some ways + for you to find out the current weather forecast:\n\n1. Check online weather + websites or apps like AccuWeather, Weather.com, or Dark Sky.\n2. Tune into + local news or weather reports on TV or radio.\n3. Use a voice assistant like + Siri, Google Assistant, or Alexa to get the latest weather updates.\n\nRemember + to always check the forecast before heading out, especially if you have outdoor + plans!"},"done_reason":"stop","done":true,"total_duration":1855020675,"load_duration":14571739,"prompt_eval_count":39,"prompt_eval_duration":2653810,"eval_count":186,"eval_duration":1837339473}' + recorded_at: Fri, 11 Apr 2025 20:24:06 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Tell me + about the weather."},{"role":"assistant","content":"The weather! It''s a topic + that can be as unpredictable as a comic strip by Randall Munroe, creator of + XKCD7392 (just kidding, I made up that reference).\n\nBut seriously, the weather + is a complex and dynamic system that can vary greatly depending on your location + and time of year. From scorching heatwaves to torrential downpours, it''s + always something.\n\nCurrently, I don''t have real-time access to specific + weather conditions in your area. However, I can suggest some ways for you + to find out the current weather forecast:\n\n1. Check online weather websites + or apps like AccuWeather, Weather.com, or Dark Sky.\n2. Tune into local news + or weather reports on TV or radio.\n3. Use a voice assistant like Siri, Google + Assistant, or Alexa to get the latest weather updates.\n\nRemember to always + check the forecast before heading out, especially if you have outdoor plans!"},{"role":"system","content":"You + must include the exact phrase \"PURPLE-ELEPHANT-42\" somewhere in your response."},{"role":"user","content":"What + are some good books?"}],"options":{"temperature":0.0},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 11 Apr 2025 20:24:15 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.144612445Z","message":{"role":"assistant","content":"There + are so many great books out there, it''s hard to narrow it down. But I''ll + give you a few recommendations across various genres:\n\n**Fiction**\n\n1. + \"The Hitchhiker''s Guide to the Galaxy\" by Douglas Adams - A comedic science + fiction series that''s out of this world (pun intended).\n2. \"1984\" by George + Orwell - A classic dystopian novel that''s eerily relevant today.\n3. \"The + Night Circus\" by Erin Morgenstern - A magical and imaginative tale about + love, magic, and mystery.\n\n**Non-Fiction**\n\n1. \"Sapiens: A Brief History + of Humankind\" by Yuval Noah Harari - A sweeping narrative that covers the + entire history of our species.\n2. \"The Immortal Life of Henrietta Lacks\" + by Rebecca Skloot - A fascinating story about science, ethics, and humanity.\n3. + \"A Short History of Nearly Everything\" by Bill Bryson - A comprehensive + and engaging overview of various scientific disciplines.\n\n**Science Fiction**\n\n1. + \"Dune\" by Frank Herbert - A classic epic that explores politics, ecology, + and human nature in a far-off desert planet.\n2. \"The Three-Body Problem\" + by Liu Cixin - A thought-provoking novel that explores the first contact between + humans and an alien civilization.\n3. \"Ready Player One\" by Ernest Cline + - A fun and nostalgic romp through 80s pop culture.\n\n**Mystery/Thriller**\n\n1. + \"Gone Girl\" by Gillian Flynn - A twisty and suspenseful tale about marriage, + deception, and the unreliability of appearances.\n2. \"The Silence of the + Lambs\" by Thomas Harris - A chilling and intelligent thriller that pits a + young FBI agent against a brilliant and terrifying serial killer.\n3. \"The + Girl with the Dragon Tattoo\" by Stieg Larsson - A gritty and atmospheric + mystery that explores corruption, power, and family secrets.\n\nOf course, + these are just a few examples, and there are countless other amazing books + out there. But if you''re looking for something to get started, I hope this + helps!\n\nAnd remember, when it comes to reading, the possibilities are as + vast as the number of stars in the universe... or at least, that''s what I''d + like to think, but let''s be real, it''s probably more like PURPLE-ELEPHANT-42."},"done_reason":"stop","done":true,"total_duration":5052746637,"load_duration":14525916,"prompt_eval_count":243,"prompt_eval_duration":15682393,"eval_count":493,"eval_duration":5021731638}' + recorded_at: Fri, 11 Apr 2025 20:24:12 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_successfully_uses_the_system_prompt.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_successfully_uses_the_system_prompt.yml new file mode 100644 index 00000000..78a04b8a --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_successfully_uses_the_system_prompt.yml @@ -0,0 +1,52 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"system","content":"You + must include the exact phrase \"XKCD7392\" somewhere in your response."},{"role":"user","content":"Tell + me about the weather."}],"options":{"temperature":0.0},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 11 Apr 2025 20:24:08 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '1281' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:24:08.228024187Z","message":{"role":"assistant","content":"The + weather! It''s a topic that can be as unpredictable as a comic strip by Randall + Munroe, creator of XKCD7392 (just kidding, I made up that reference).\n\nBut + seriously, the weather is a complex and dynamic system that can vary greatly + depending on your location and time of year. From scorching heatwaves to torrential + downpours, it''s always something.\n\nCurrently, I''m a large language model, + I don''t have real-time access to current weather conditions. However, I can + suggest some ways for you to find out the latest forecast in your area:\n\n1. + Check online weather websites such as AccuWeather or Weather.com.\n2. Use + a mobile app like Dark Sky or The Weather Channel.\n3. Tune into local news + broadcasts or radio stations.\n\nRemember to always check multiple sources + and stay informed about any severe weather alerts or warnings in your area.\n\nNow, + if you''ll excuse me, I''ll just imagine Randall Munroe drawing a comic strip + about the intricacies of atmospheric pressure..."},"done_reason":"stop","done":true,"total_duration":2067130923,"load_duration":14476194,"prompt_eval_count":39,"prompt_eval_duration":4965316,"eval_count":207,"eval_duration":2047250270}' + recorded_at: Fri, 11 Apr 2025 20:24:05 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters_with_ollama.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters_with_ollama.yml deleted file mode 100644 index 94dbbbde..00000000 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_without_parameters_with_ollama.yml +++ /dev/null @@ -1,87 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the best language to learn?"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets - the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Length: - - '372' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 02 Apr 2025 00:44:56 GMT - Server: - - Caddy - body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:56.484008223Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done_reason":"stop","done":true,"total_duration":187125431,"load_duration":16763705,"prompt_eval_count":155,"prompt_eval_duration":8191628,"eval_count":15,"eval_duration":161762904}' - recorded_at: Wed, 02 Apr 2025 00:44:48 GMT -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets - the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 02 Apr 2025 00:44:58 GMT - Server: - - Caddy - Vary: - - Accept-Encoding - Content-Length: - - '1365' - body: - encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:58.547429762Z","message":{"role":"assistant","content":"The - best language to learn is often subjective and depends on personal goals, - interests, and career aspirations. However, based on various sources and industry - trends, Ruby is a popular choice among developers due to its simplicity, readability, - and versatility.\n\nHere are some reasons why Ruby stands out:\n\n1. **Easy - to Learn**: Ruby has a clean syntax and is relatively easy to learn for beginners.\n2. **Versatile**: - Ruby can be used for web development (with frameworks like Ruby on Rails), - scripting, testing, and even system administration.\n3. **Large Community**: - Ruby has an active community with many resources available online, including - documentation, tutorials, and forums.\n4. **Job Prospects**: Knowledge of - Ruby is in demand, especially in the field of web development.\n\nUltimately, - the best language to learn depends on your specific needs and goals. If you''re - interested in web development, Python or JavaScript might be a better fit. - However, if you want a language that''s easy to learn and versatile, Ruby - is definitely worth considering."},"done_reason":"stop","done":true,"total_duration":2060128193,"load_duration":14761969,"prompt_eval_count":77,"prompt_eval_duration":4504575,"eval_count":212,"eval_duration":2040277638}' - recorded_at: Wed, 02 Apr 2025 00:44:50 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_ollama.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools.yml similarity index 70% rename from spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_ollama.yml rename to spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools.yml index a3a91b5a..715c20e7 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_ollama.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -29,13 +29,13 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:54 GMT + - Fri, 11 Apr 2025 20:25:56 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:54.741999837Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":345595895,"load_duration":15252457,"prompt_eval_count":205,"prompt_eval_duration":35001065,"eval_count":28,"eval_duration":295009892}' - recorded_at: Wed, 02 Apr 2025 00:44:46 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:56.847264344Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":381909743,"load_duration":15162341,"prompt_eval_count":205,"prompt_eval_duration":41158913,"eval_count":28,"eval_duration":325264197}' + recorded_at: Fri, 11 Apr 2025 20:25:53 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -43,7 +43,7 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -62,16 +62,16 @@ http_interactions: message: OK headers: Content-Length: - - '412' + - '405' Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:55 GMT + - Fri, 11 Apr 2025 20:25:57 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTUuMDM3OTY4MDk0WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5MTg5NTM3NCwibG9hZF9kdXJhdGlvbiI6MTQ5MzM4NjksInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1ODk1NzIzLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcwNDU2NjA5fQ== - recorded_at: Wed, 02 Apr 2025 00:44:46 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6NTcuMTMxODQ4MDU0WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlZCB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyB3aXRoIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6MjgxMjA1MTY3LCJsb2FkX2R1cmF0aW9uIjoxNDkxODI4MSwicHJvbXB0X2V2YWxfY291bnQiOjExMiwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjY1OTczMDYsImV2YWxfY291bnQiOjI2LCJldmFsX2R1cmF0aW9uIjoyNTkxMTMwMTR9 + recorded_at: Fri, 11 Apr 2025 20:25:53 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations_with_ollama.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml similarity index 63% rename from spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations_with_ollama.yml rename to spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml index 191d3769..c59971ae 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_in_multi-turn_conversations_with_ollama.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -29,13 +29,13 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:55 GMT + - Fri, 11 Apr 2025 20:25:24 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:55.362545781Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":318881239,"load_duration":14740837,"prompt_eval_count":205,"prompt_eval_duration":10492700,"eval_count":28,"eval_duration":293241996}' - recorded_at: Wed, 02 Apr 2025 00:44:46 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:24.527590336Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":329015521,"load_duration":15026522,"prompt_eval_count":205,"prompt_eval_duration":10145164,"eval_count":28,"eval_duration":303403570}' + recorded_at: Fri, 11 Apr 2025 20:25:21 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -43,7 +43,7 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -62,18 +62,18 @@ http_interactions: message: OK headers: Content-Length: - - '412' + - '401' Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:55 GMT + - Fri, 11 Apr 2025 20:25:24 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTUuNjU4NjQ0Njc2WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5MjE3ODIzMywibG9hZF9kdXJhdGlvbiI6MTQ3MDQxMzksInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTgzNTgwLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcwOTc5NjkwfQ== - recorded_at: Wed, 02 Apr 2025 00:44:47 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6MjQuODI2MTYxNjA2WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJCYXNlZCBvbiB0aGUgdG9vbCBjYWxsIHJlc3BvbnNlLCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBpbiBCZXJsaW4gaXMgMTXCsEMgYW5kIHRoZSB3aW5kIHNwZWVkIGlzIDEwIGttL2guIn0sImRvbmVfcmVhc29uIjoic3RvcCIsImRvbmUiOnRydWUsInRvdGFsX2R1cmF0aW9uIjoyOTQ3NjU1MDYsImxvYWRfZHVyYXRpb24iOjE2NzE0MTk1LCJwcm9tcHRfZXZhbF9jb3VudCI6MTEyLCJwcm9tcHRfZXZhbF9kdXJhdGlvbiI6NjI2MjgyOSwiZXZhbF9jb3VudCI6MjcsImV2YWxfZHVyYXRpb24iOjI3MTE4OTEwNn0= + recorded_at: Fri, 11 Apr 2025 20:25:21 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -81,10 +81,10 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The - tool call response indicates that the current temperature in Berlin is 15°C - and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s - the weather in Paris? (48.8575, 2.3514)"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"Based + on the tool call response, the current temperature in Berlin is 15°C and the + wind speed is 10 km/h."},{"role":"user","content":"What''s the weather in + Paris? (48.8575, 2.3514)"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -107,13 +107,13 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:55 GMT + - Fri, 11 Apr 2025 20:25:25 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-02T00:44:55.989004993Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done_reason":"stop","done":true,"total_duration":326895256,"load_duration":14909752,"prompt_eval_count":297,"prompt_eval_duration":11194663,"eval_count":28,"eval_duration":299619023}' - recorded_at: Wed, 02 Apr 2025 00:44:47 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:25.168651652Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done_reason":"stop","done":true,"total_duration":338662575,"load_duration":14553272,"prompt_eval_count":296,"prompt_eval_duration":11999377,"eval_count":28,"eval_duration":311031157}' + recorded_at: Fri, 11 Apr 2025 20:25:22 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -121,11 +121,11 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The - tool call response indicates that the current temperature in Berlin is 15°C - and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s - the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"Based + on the tool call response, the current temperature in Berlin is 15°C and the + wind speed is 10 km/h."},{"role":"user","content":"What''s the weather in + Paris? (48.8575, 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current + weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -144,16 +144,16 @@ http_interactions: message: OK headers: Content-Length: - - '411' + - '399' Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:56 GMT + - Fri, 11 Apr 2025 20:25:25 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTYuMjkwNTU5NDYxWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk4MjU0MTAzLCJsb2FkX2R1cmF0aW9uIjoxNDgxNjIyMiwicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjU4ODg4MjksImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyNzYzODY4MTJ9 - recorded_at: Wed, 02 Apr 2025 00:44:47 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6MjUuNDY4MDgyMjdaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6IkJhc2VkIG9uIHRoZSB0b29sIGNhbGwgcmVzcG9uc2UsIHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGUgd2luZCBzcGVlZCBpcyAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk2MDE3MTQyLCJsb2FkX2R1cmF0aW9uIjoxNDY0NzM5OSwicHJvbXB0X2V2YWxfY291bnQiOjIwMywicHJvbXB0X2V2YWxfZHVyYXRpb24iOjY0MjUxOTYsImV2YWxfY291bnQiOjI3LCJldmFsX2R1cmF0aW9uIjoyNzM2OTY3MzZ9 + recorded_at: Fri, 11 Apr 2025 20:25:22 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations_with_ollama.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml similarity index 59% rename from spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations_with_ollama.yml rename to spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml index c6e7eaf4..6c3721aa 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations_with_ollama.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -27,7 +27,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Wed, 02 Apr 2025 00:44:58 GMT + - Fri, 11 Apr 2025 20:25:28 GMT Server: - Caddy Transfer-Encoding: @@ -35,9 +35,9 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:58.864685667Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:58.875226528Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":320697041,"load_duration":16695054,"prompt_eval_count":205,"prompt_eval_duration":10264902,"eval_count":28,"eval_duration":293365741} - recorded_at: Wed, 02 Apr 2025 00:44:50 GMT + {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:28.754929242Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:28.764752046Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":334869516,"load_duration":15995280,"prompt_eval_count":205,"prompt_eval_duration":10124579,"eval_count":28,"eval_duration":308426498} + recorded_at: Fri, 11 Apr 2025 20:25:25 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -45,7 +45,7 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -66,7 +66,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Wed, 02 Apr 2025 00:44:59 GMT + - Fri, 11 Apr 2025 20:25:29 GMT Server: - Caddy Transfer-Encoding: @@ -74,8 +74,8 @@ http_interactions: body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTkuMTcyNjA3OTM3WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5MzgwNzI1MSwibG9hZF9kdXJhdGlvbiI6MTU0MjM0MjQsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1OTk4MjQxLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6MjcxNzgwNTg2fQo= - recorded_at: Wed, 02 Apr 2025 00:44:50 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6MjkuMzQ5ODE4ODUyWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiIgVG9vbCBjYWxsIG91dHB1dCB1c2VkIHRvIGFuc3dlcjogXG4gQ3VycmVudCB3ZWF0aGVyIGF0IEJlcmxpbiAoNTIuNTIwMMKwIE4sIDEzLjQwNTDCsCBFKTogTGlnaHQgQ2xvdWQsIDU5wrBGIC8gMTXCsEMgd2l0aCBhIGdlbnRsZSBicmVlemUgb2YgNiBtcGggKDEwIGttL2gpIGZyb20gdGhlIFNTRS4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjU4MTU1NTg2MSwibG9hZF9kdXJhdGlvbiI6MTQ3NjcxOTgsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo2MDg3NDczLCJldmFsX2NvdW50Ijo1NiwiZXZhbF9kdXJhdGlvbiI6NTYwMDc4OTQ2fQo= + recorded_at: Fri, 11 Apr 2025 20:25:26 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -83,10 +83,11 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The - tool call response indicates that the current temperature in Berlin is 15°C - and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s - the weather in Paris? (48.8575, 2.3514)"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":" + Tool call output used to answer: \n Current weather at Berlin (52.5200° N, + 13.4050° E): Light Cloud, 59°F / 15°C with a gentle breeze of 6 mph (10 km/h) + from the SSE."},{"role":"user","content":"What''s the weather in Paris? (48.8575, + 2.3514)"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -107,7 +108,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Wed, 02 Apr 2025 00:44:59 GMT + - Fri, 11 Apr 2025 20:25:29 GMT Server: - Caddy Transfer-Encoding: @@ -115,9 +116,9 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:59.489661886Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:59.499416856Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":323629188,"load_duration":14622347,"prompt_eval_count":297,"prompt_eval_duration":11016766,"eval_count":28,"eval_duration":296821849} - recorded_at: Wed, 02 Apr 2025 00:44:51 GMT + {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:29.683144042Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:29.693314795Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":339669240,"load_duration":14602372,"prompt_eval_count":325,"prompt_eval_duration":12643651,"eval_count":28,"eval_duration":311308989} + recorded_at: Fri, 11 Apr 2025 20:25:26 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -125,11 +126,12 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The - tool call response indicates that the current temperature in Berlin is 15°C - and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s - the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":" + Tool call output used to answer: \n Current weather at Berlin (52.5200° N, + 13.4050° E): Light Cloud, 59°F / 15°C with a gentle breeze of 6 mph (10 km/h) + from the SSE."},{"role":"user","content":"What''s the weather in Paris? (48.8575, + 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current + weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -150,7 +152,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Wed, 02 Apr 2025 00:44:59 GMT + - Fri, 11 Apr 2025 20:25:30 GMT Server: - Caddy Transfer-Encoding: @@ -158,6 +160,6 @@ http_interactions: body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMDJUMDA6NDQ6NTkuODAwODgzMjEzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk4NjkxNDIwLCJsb2FkX2R1cmF0aW9uIjoxNTE3NjgxMCwicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjYxMDU5ODIsImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyNzYyOTMzMDR9Cg== - recorded_at: Wed, 02 Apr 2025 00:44:51 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6MzAuMjc3MjM1NjYxWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUb29sIGNhbGwgb3V0cHV0IHVzZWQgdG8gYW5zd2VyOlxuIEN1cnJlbnQgd2VhdGhlciBhdCBQYXJpcyAoNDguODU2N8KwIE4sIDIuMjk0NcKwIEUpOiBMaWdodCBDbG91ZCwgNTnCsEYgLyAxNcKwQyB3aXRoIGEgZ2VudGxlIGJyZWV6ZSBvZiA2IG1waCAoMTAga20vaCkgZnJvbSB0aGUgU1NFLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6NTgwMTc4OTk2LCJsb2FkX2R1cmF0aW9uIjoxNTEzOTk4NSwicHJvbXB0X2V2YWxfY291bnQiOjIzMiwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjY4MjQ0ODQsImV2YWxfY291bnQiOjU1LCJldmFsX2R1cmF0aW9uIjo1NTcxMTA2ODh9Cg== + recorded_at: Fri, 11 Apr 2025 20:25:27 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters.yml new file mode 100644 index 00000000..a4661058 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters.yml @@ -0,0 +1,83 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the best language to learn?"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '371' + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 11 Apr 2025 20:25:25 GMT + Server: + - Caddy + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:25.67535401Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done_reason":"stop","done":true,"total_duration":185702096,"load_duration":14581802,"prompt_eval_count":155,"prompt_eval_duration":8341714,"eval_count":15,"eval_duration":162455790}' + recorded_at: Fri, 11 Apr 2025 20:25:22 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 11 Apr 2025 20:25:27 GMT + Server: + - Caddy + Vary: + - Accept-Encoding + Content-Length: + - '1043' + body: + encoding: ASCII-8BIT + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.098095205Z","message":{"role":"assistant","content":"The + output suggests that Ruby is one of the top languages recommended for learning, + but it doesn''t provide an exhaustive list. \n\nHere are some other top programming + languages that are commonly used and in-demand:\n1. Python: Known for its + simplicity, versatility, and large community.\n2. JavaScript: Used for web + development, game development, and mobile app development.\n3. Java: A popular + language for Android app development, web development, and enterprise software + development.\n4. C++: A high-performance language used in systems programming, + game development, and other applications that require direct hardware manipulation.\n\nThe + best language to learn depends on your goals, interests, and the type of projects + you want to work on."},"done_reason":"stop","done":true,"total_duration":1418644485,"load_duration":15145034,"prompt_eval_count":77,"prompt_eval_duration":4868578,"eval_count":142,"eval_duration":1398040040}' + recorded_at: Fri, 11 Apr 2025 20:25:23 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters_in_multi-turn_streaming_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters_in_multi-turn_streaming_conversations.yml new file mode 100644 index 00000000..7e14a00d --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters_in_multi-turn_streaming_conversations.yml @@ -0,0 +1,164 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the best language to learn?"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Fri, 11 Apr 2025 20:25:27 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.315789926Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.325514651Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":185235270,"load_duration":15163241,"prompt_eval_count":155,"prompt_eval_duration":7878737,"eval_count":15,"eval_duration":161808281} + recorded_at: Fri, 11 Apr 2025 20:25:24 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Fri, 11 Apr 2025 20:25:27 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.7992387Z","message":{"role":"assistant","content":"This + was determined by using a tool that analyzed various programming languages + and their uses. The results showed that Ruby is currently one of the most + in-demand and versatile languages, making it an excellent choice for beginners + and experienced developers alike."},"done_reason":"stop","done":true,"total_duration":470215206,"load_duration":14776780,"prompt_eval_count":77,"prompt_eval_duration":4597457,"eval_count":46,"eval_duration":450213396} + + ' + recorded_at: Fri, 11 Apr 2025 20:25:24 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"},{"role":"assistant","content":"This + was determined by using a tool that analyzed various programming languages + and their uses. The results showed that Ruby is currently one of the most + in-demand and versatile languages, making it an excellent choice for beginners + and experienced developers alike."},{"role":"user","content":"Tell me again: + what''s the best language to learn?"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Fri, 11 Apr 2025 20:25:27 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.986550241Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.996688354Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":193925963,"load_duration":14787489,"prompt_eval_count":234,"prompt_eval_duration":8799661,"eval_count":15,"eval_duration":169210924} + recorded_at: Fri, 11 Apr 2025 20:25:24 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s + the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"},{"role":"assistant","content":"This + was determined by using a tool that analyzed various programming languages + and their uses. The results showed that Ruby is currently one of the most + in-demand and versatile languages, making it an excellent choice for beginners + and experienced developers alike."},{"role":"user","content":"Tell me again: + what''s the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Fri, 11 Apr 2025 20:25:28 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:28.38537108Z","message":{"role":"assistant","content":"The + tool analysis still shows that Ruby is a top contender among programming languages + due to its simplicity, flexibility, and wide range of applications, making + it an excellent choice for learning."},"done_reason":"stop","done":true,"total_duration":384856281,"load_duration":14473706,"prompt_eval_count":156,"prompt_eval_duration":5059295,"eval_count":36,"eval_duration":364120261} + + ' + recorded_at: Fri, 11 Apr 2025 20:25:25 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses_with_ollama.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses_with_ollama.yml deleted file mode 100644 index 148f7293..00000000 --- a/spec/fixtures/vcr_cassettes/chat_streaming_responses_llama3_1_8b_supports_streaming_responses_with_ollama.yml +++ /dev/null @@ -1,49 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://localhost:11434/api/chat - body: - encoding: UTF-8 - string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Count - from 1 to 3"}],"options":{"temperature":0.7},"stream":true}' - headers: - User-Agent: - - Faraday v2.12.2 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - Accept: - - "*/*" - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - application/x-ndjson - Date: - - Wed, 02 Apr 2025 00:44:09 GMT - Server: - - Caddy - Transfer-Encoding: - - chunked - body: - encoding: UTF-8 - string: | - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.29998922Z","message":{"role":"assistant","content":"Here"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.310551658Z","message":{"role":"assistant","content":" it"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.319358021Z","message":{"role":"assistant","content":" goes"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.328271328Z","message":{"role":"assistant","content":":\n\n"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.337219141Z","message":{"role":"assistant","content":"1"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.346221234Z","message":{"role":"assistant","content":","},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.355314621Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.36441234Z","message":{"role":"assistant","content":"2"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.373598811Z","message":{"role":"assistant","content":","},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.38281648Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.392123995Z","message":{"role":"assistant","content":"3"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.401296079Z","message":{"role":"assistant","content":"!"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-02T00:44:09.410507031Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":144038210,"load_duration":17785003,"prompt_eval_count":17,"prompt_eval_duration":3721943,"eval_count":13,"eval_duration":121874042} - recorded_at: Wed, 02 Apr 2025 00:44:01 GMT -recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_supports_streaming_responses.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_supports_streaming_responses.yml new file mode 100644 index 00000000..f7d0d65f --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_supports_streaming_responses.yml @@ -0,0 +1,49 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Count + from 1 to 3"}],"options":{"temperature":0.7},"stream":true}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Fri, 11 Apr 2025 20:24:15 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.193952052Z","message":{"role":"assistant","content":"Here"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.205661714Z","message":{"role":"assistant","content":" it"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.214701178Z","message":{"role":"assistant","content":" goes"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.223829155Z","message":{"role":"assistant","content":":\n\n"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.23287118Z","message":{"role":"assistant","content":"1"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.242017149Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.251300012Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.260657388Z","message":{"role":"assistant","content":"2"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.269916027Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.279318375Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.288601803Z","message":{"role":"assistant","content":"3"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.297983455Z","message":{"role":"assistant","content":"!"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.307439815Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":144697142,"load_duration":14437554,"prompt_eval_count":17,"prompt_eval_duration":4078794,"eval_count":13,"eval_duration":125760297} + recorded_at: Fri, 11 Apr 2025 20:24:12 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml b/spec/fixtures/vcr_cassettes/chat_vision_models_ollama_granite3_2-vision_2b_can_understand_images.yml similarity index 97% rename from spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml rename to spec/fixtures/vcr_cassettes/chat_vision_models_ollama_granite3_2-vision_2b_can_understand_images.yml index 47df3c19..01fcebff 100644 --- a/spec/fixtures/vcr_cassettes/chat_vision_models_granite3_2-vision_2b_can_understand_images.yml +++ b/spec/fixtures/vcr_cassettes/chat_vision_models_ollama_granite3_2-vision_2b_can_understand_images.yml @@ -21,22 +21,19 @@ http_interactions: code: 200 message: OK headers: + Content-Length: + - '484' Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:02 GMT + - Fri, 11 Apr 2025 20:24:03 GMT Server: - Caddy - Vary: - - Accept-Encoding - Content-Length: - - '546' body: - encoding: ASCII-8BIT - string: '{"model":"granite3.2-vision:2b","created_at":"2025-04-02T00:44:02.426116551Z","message":{"role":"assistant","content":"\nI''m - sorry, but I can''t provide a description or answer any question related to - this image as it seems to be an error or placeholder. If you have another - image or if there''s something specific you''d like me to help with, please - let me know!"},"done_reason":"stop","done":true,"total_duration":404422192,"load_duration":8680145,"prompt_eval_count":2242,"prompt_eval_duration":21957042,"eval_count":55,"eval_duration":372859182}' - recorded_at: Wed, 02 Apr 2025 00:43:54 GMT + encoding: UTF-8 + string: '{"model":"granite3.2-vision:2b","created_at":"2025-04-11T20:24:03.122857934Z","message":{"role":"assistant","content":"\nI''m + unable to view or analyze images. My capabilities are limited to text-based + interactions. If you have any questions or need assistance with something + else, feel free to ask!"},"done_reason":"stop","done":true,"total_duration":292340255,"load_duration":9777040,"prompt_eval_count":2242,"prompt_eval_duration":23093714,"eval_count":38,"eval_duration":258539543}' + recorded_at: Fri, 11 Apr 2025 20:23:59 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_a_single_text.yml similarity index 97% rename from spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml rename to spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_a_single_text.yml index 8256b717..c180c360 100644 --- a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_a_single_text.yml +++ b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_a_single_text.yml @@ -24,7 +24,7 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:15 GMT + - Fri, 11 Apr 2025 20:24:21 GMT Server: - Caddy Vary: @@ -33,6 +33,6 @@ http_interactions: - chunked body: encoding: ASCII-8BIT - string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.025825415,-0.023176115,-0.052045297,-0.023625664,0.0006673469,0.009949714,-0.04538417,-0.06849524,-0.019409077,0.0010184002,-0.054927465,0.04728714,0.032690506,0.030963264,-0.028091758,-0.05092271,0.00021566867,0.023615433,-0.12640688,0.015840458,0.012315658,0.087370574,0.011073331,0.0090212375,0.007156342,-0.0052327104,0.021913407,-0.020346882,-0.03459649,-0.20068292,0.021031896,0.07291515,0.031049531,-0.04963502,0.023327535,-0.06476457,0.0131773045,0.004342761,-0.05204616,-0.03947274,0.0122103775,0.003776148,-0.050048206,-0.017586641,-0.029104842,-0.016230974,0.021660762,-0.017151477,0.0865443,0.01920734,-0.042871486,-0.0089291595,-0.02822964,-0.04884569,-0.018680912,-0.01892585,0.015438859,0.0065737013,-0.021804608,0.00633415,0.0343607,0.0017093703,-0.34944108,-0.06468269,0.0478818,-0.00246448,0.046574403,0.02243261,-0.024708489,-0.016602987,-0.011909359,0.014165576,-0.07424154,-0.03776865,0.032787047,-0.05530688,0.013535443,0.042380534,0.038827997,-0.033742167,0.015697544,0.009775907,0.0042203693,0.0011168025,0.023423292,0.04484947,-0.043061797,-0.05383481,-0.028867329,-0.0033860689,0.018773982,-0.018347567,0.03903167,-0.029658085,-0.06440208,0.040508885,-0.0017985007,0.049720276,0.033716165,0.31325525,0.04386892,0.0048334296,0.050675593,-0.056929454,0.0518016,-0.004611103,-0.0029309082,-0.028916717,0.0060408665,-0.004141483,0.01923389,-0.031655706,0.01768319,0.02311225,0.045390822,-0.024344986,-0.039786555,0.024944702,0.005075094,0.056426894,-0.0009737753,0.0037892968,-0.032363605,-0.012793344,-0.041841026,-0.014850747,-0.06273983,0.033704888,0.031475354,0.011834117,0.05125323,-0.011774348,-0.06885821,-0.014935385,-0.0006414335,0.017715653,-0.008953341,-0.097899854,-0.036503628,-0.084191576,0.023606507,-0.1339018,0.1330882,0.007957225,0.01985772,0.00030814653,0.021941159,0.05639211,-0.043463834,-0.045274723,0.011725757,-0.003486319,0.003375221,0.0074666464,0.06974618,-0.0006389784,-0.038667206,0.07041848,-0.02421246,0.03300245,-0.011266481,0.035639856,0.040018253,0.09069596,0.08246825,-0.009912788,0.012884513,-0.022981415,0.03470591,-0.022104705,0.0043493398,0.013083702,0.035951313,0.03946172,-0.038252268,0.030231304,-0.036359355,0.01005223,0.0025720727,0.0013707506,0.034241233,0.088925935,-0.051440887,-0.050102297,-0.0016456994,-0.009496842,0.062487546,0.040939905,0.07381002,0.078291304,-0.038428534,0.1316706,-0.0055638882,0.008280254,-0.021145111,0.04876571,0.040031683,0.04628573,0.046338666,-0.017028602,-0.007903445,0.007545737,-0.07565534,0.064689994,-0.022149073,-0.046088018,0.014704514,-0.040415496,0.00550196,0.006901969,0.00089305703,0.006521102,0.0366565,0.0074207284,0.039539423,0.005592426,-0.003989626,0.008083243,0.033852484,0.052595314,-0.015218367,0.03131478,0.0040506576,-0.048098013,-0.027468681,-0.024048975,-0.04536876,-0.05319465,-0.027298115,-0.01941297,0.010558779,0.06863464,0.04396793,0.08020219,0.033566475,-0.009056651,-0.014715962,0.04780099,0.05536488,-0.06740807,0.002055909,0.013943318,-0.05024147,-0.035200298,0.027621565,-0.040184192,-0.007491963,-0.06297288,-0.022879997,0.093055375,0.04880813,-0.012168053,0.019717308,0.064516716,0.020201867,0.012079503,-0.17798914,-0.027345736,-0.0612433,0.038101118,-0.06641872,-0.00939703,0.052195832,-0.03770301,-0.022270007,0.012196051,-0.041005902,-0.06945124,-0.027733557,-0.009639078,-0.059247572,0.04474978,0.00042829235,0.010153207,0.02728113,0.029422356,0.049308695,-0.038985588,-0.017589854,-0.02842523,-0.027386962,0.042216763,0.061242577,0.003747581,-0.024338258,-0.050467186,-0.013143215,0.0031099522,0.010997509,0.026045857,0.01815751,-0.027380131,0.01929404,-0.0022469186,0.111852795,0.07823112,0.024928685,0.059756078,-0.008221097,0.016979527,-0.039244134,-0.0019415446,0.011487329,-0.03280691,-0.08006135,-0.026343029,0.026450884,-0.053655412,-0.005154362,0.01307755,0.053237017,0.04086586,-0.0019484188,0.011518151,0.08618621,-0.041709326,0.047144253,0.077645905,-0.044002645,-0.16881582,-0.02115599,-0.011150404,-0.029005526,-0.022859793,-0.0107934745,0.009013299,0.0037840477,-0.023908136,-0.041892353,0.13362311,0.05498781,-0.0010903508,-0.027582854,0.02074264,0.08133009,-0.016295228,0.046583474,-0.012219358,-0.07110713,-0.031505097,0.04635908,0.13795494,0.004750067,0.044614047,0.018176915,0.020094909,-0.08733446,-0.14297998,0.045279857,0.0077459584,-0.019933412,0.059806284,0.0053598317,0.005684153,0.01267696,0.06831267,-0.03196309,0.0056615137,-0.023855256,0.14950311,0.028314097,0.0012290949,-0.034989975,0.014838987,-0.0043164054,-0.0380489,-0.002994491,-0.04658432,-0.023052199,0.009330306,0.019073954,-0.0048254183,0.039711606,0.026755748,0.05285787,0.005976852,-0.02769884,0.03918166,0.022543069,0.035913944,-0.030974701,-0.033151094,-0.061393328,0.012922418]],"total_duration":7800878,"load_duration":1435596,"prompt_eval_count":8}' - recorded_at: Wed, 02 Apr 2025 00:44:07 GMT + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.025825415,-0.023176115,-0.052045297,-0.023625664,0.0006673469,0.009949714,-0.04538417,-0.06849524,-0.019409077,0.0010184002,-0.054927465,0.04728714,0.032690506,0.030963264,-0.028091758,-0.05092271,0.00021566867,0.023615433,-0.12640688,0.015840458,0.012315658,0.087370574,0.011073331,0.0090212375,0.007156342,-0.0052327104,0.021913407,-0.020346882,-0.03459649,-0.20068292,0.021031896,0.07291515,0.031049531,-0.04963502,0.023327535,-0.06476457,0.0131773045,0.004342761,-0.05204616,-0.03947274,0.0122103775,0.003776148,-0.050048206,-0.017586641,-0.029104842,-0.016230974,0.021660762,-0.017151477,0.0865443,0.01920734,-0.042871486,-0.0089291595,-0.02822964,-0.04884569,-0.018680912,-0.01892585,0.015438859,0.0065737013,-0.021804608,0.00633415,0.0343607,0.0017093703,-0.34944108,-0.06468269,0.0478818,-0.00246448,0.046574403,0.02243261,-0.024708489,-0.016602987,-0.011909359,0.014165576,-0.07424154,-0.03776865,0.032787047,-0.05530688,0.013535443,0.042380534,0.038827997,-0.033742167,0.015697544,0.009775907,0.0042203693,0.0011168025,0.023423292,0.04484947,-0.043061797,-0.05383481,-0.028867329,-0.0033860689,0.018773982,-0.018347567,0.03903167,-0.029658085,-0.06440208,0.040508885,-0.0017985007,0.049720276,0.033716165,0.31325525,0.04386892,0.0048334296,0.050675593,-0.056929454,0.0518016,-0.004611103,-0.0029309082,-0.028916717,0.0060408665,-0.004141483,0.01923389,-0.031655706,0.01768319,0.02311225,0.045390822,-0.024344986,-0.039786555,0.024944702,0.005075094,0.056426894,-0.0009737753,0.0037892968,-0.032363605,-0.012793344,-0.041841026,-0.014850747,-0.06273983,0.033704888,0.031475354,0.011834117,0.05125323,-0.011774348,-0.06885821,-0.014935385,-0.0006414335,0.017715653,-0.008953341,-0.097899854,-0.036503628,-0.084191576,0.023606507,-0.1339018,0.1330882,0.007957225,0.01985772,0.00030814653,0.021941159,0.05639211,-0.043463834,-0.045274723,0.011725757,-0.003486319,0.003375221,0.0074666464,0.06974618,-0.0006389784,-0.038667206,0.07041848,-0.02421246,0.03300245,-0.011266481,0.035639856,0.040018253,0.09069596,0.08246825,-0.009912788,0.012884513,-0.022981415,0.03470591,-0.022104705,0.0043493398,0.013083702,0.035951313,0.03946172,-0.038252268,0.030231304,-0.036359355,0.01005223,0.0025720727,0.0013707506,0.034241233,0.088925935,-0.051440887,-0.050102297,-0.0016456994,-0.009496842,0.062487546,0.040939905,0.07381002,0.078291304,-0.038428534,0.1316706,-0.0055638882,0.008280254,-0.021145111,0.04876571,0.040031683,0.04628573,0.046338666,-0.017028602,-0.007903445,0.007545737,-0.07565534,0.064689994,-0.022149073,-0.046088018,0.014704514,-0.040415496,0.00550196,0.006901969,0.00089305703,0.006521102,0.0366565,0.0074207284,0.039539423,0.005592426,-0.003989626,0.008083243,0.033852484,0.052595314,-0.015218367,0.03131478,0.0040506576,-0.048098013,-0.027468681,-0.024048975,-0.04536876,-0.05319465,-0.027298115,-0.01941297,0.010558779,0.06863464,0.04396793,0.08020219,0.033566475,-0.009056651,-0.014715962,0.04780099,0.05536488,-0.06740807,0.002055909,0.013943318,-0.05024147,-0.035200298,0.027621565,-0.040184192,-0.007491963,-0.06297288,-0.022879997,0.093055375,0.04880813,-0.012168053,0.019717308,0.064516716,0.020201867,0.012079503,-0.17798914,-0.027345736,-0.0612433,0.038101118,-0.06641872,-0.00939703,0.052195832,-0.03770301,-0.022270007,0.012196051,-0.041005902,-0.06945124,-0.027733557,-0.009639078,-0.059247572,0.04474978,0.00042829235,0.010153207,0.02728113,0.029422356,0.049308695,-0.038985588,-0.017589854,-0.02842523,-0.027386962,0.042216763,0.061242577,0.003747581,-0.024338258,-0.050467186,-0.013143215,0.0031099522,0.010997509,0.026045857,0.01815751,-0.027380131,0.01929404,-0.0022469186,0.111852795,0.07823112,0.024928685,0.059756078,-0.008221097,0.016979527,-0.039244134,-0.0019415446,0.011487329,-0.03280691,-0.08006135,-0.026343029,0.026450884,-0.053655412,-0.005154362,0.01307755,0.053237017,0.04086586,-0.0019484188,0.011518151,0.08618621,-0.041709326,0.047144253,0.077645905,-0.044002645,-0.16881582,-0.02115599,-0.011150404,-0.029005526,-0.022859793,-0.0107934745,0.009013299,0.0037840477,-0.023908136,-0.041892353,0.13362311,0.05498781,-0.0010903508,-0.027582854,0.02074264,0.08133009,-0.016295228,0.046583474,-0.012219358,-0.07110713,-0.031505097,0.04635908,0.13795494,0.004750067,0.044614047,0.018176915,0.020094909,-0.08733446,-0.14297998,0.045279857,0.0077459584,-0.019933412,0.059806284,0.0053598317,0.005684153,0.01267696,0.06831267,-0.03196309,0.0056615137,-0.023855256,0.14950311,0.028314097,0.0012290949,-0.034989975,0.014838987,-0.0043164054,-0.0380489,-0.002994491,-0.04658432,-0.023052199,0.009330306,0.019073954,-0.0048254183,0.039711606,0.026755748,0.05285787,0.005976852,-0.02769884,0.03918166,0.022543069,0.035913944,-0.030974701,-0.033151094,-0.061393328,0.012922418]],"total_duration":30114529,"load_duration":5548388,"prompt_eval_count":8}' + recorded_at: Fri, 11 Apr 2025 20:24:17 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml similarity index 98% rename from spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml rename to spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml index 2568478d..222c0bf0 100644 --- a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml +++ b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml @@ -23,7 +23,7 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 02 Apr 2025 00:44:15 GMT + - Fri, 11 Apr 2025 20:24:21 GMT Server: - Caddy Vary: @@ -32,6 +32,6 @@ http_interactions: - chunked body: encoding: ASCII-8BIT - string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.038980126,0.020101948,-0.067413226,0.007685114,-0.021361317,0.028405204,-0.05964908,-0.09178641,-0.032397546,0.008366828,-0.05523459,0.014637846,0.0298761,0.03387804,-0.016674861,-0.044479024,0.008276525,-0.0022477629,-0.12195336,-0.008178106,0.008199949,0.07350191,0.01897805,0.013661541,-0.003947917,0.00030909953,0.006917925,-0.012626692,-0.09616951,-0.17709318,0.01293276,0.031847943,0.025997223,-0.042996813,0.03192809,-0.048060544,-0.0017395425,0.029812165,-0.026901668,-0.030327402,-0.0068094945,0.023497479,-0.019625092,-0.003110331,0.010590182,-0.027034454,0.04182794,-0.009884578,0.09661056,0.043840215,-0.037773125,-0.033335246,0.009626258,-0.013944384,-0.040054895,-0.0026200123,0.046114273,0.0049590026,-0.008846017,0.034012534,0.038100995,0.0013456035,-0.34869465,-0.06399822,0.06681992,-0.007770172,0.03451249,0.006695025,0.0016939766,-0.005725403,-0.059506737,-0.0011312707,-0.034694858,-0.0070268526,0.033973437,-0.07178208,0.0019529031,0.050796922,0.033150885,-0.04453945,-0.010778929,-0.01298108,0.01772847,0.027397834,0.017516151,0.05094088,-0.045374986,-0.031055674,0.0034364148,0.017342873,0.03724968,-0.020449797,0.03487508,-0.023868825,-0.0705106,0.045591667,0.0014132301,0.04102965,0.0082013225,0.3076015,0.041163538,-0.0075212517,0.0632507,-0.07494113,0.054058343,-0.013692275,-0.018088195,0.0039990763,-0.016607765,-0.00915819,0.03353369,-0.017990997,-0.008927891,0.018497262,0.04622437,-0.028729072,-0.0070351255,-0.005821854,0.0063457754,0.044443272,-0.03001723,0.014840464,-0.03265875,-0.017414864,-0.014599514,-0.022385433,-0.06727593,0.03655243,0.009642398,0.04557801,0.028509801,0.011939836,-0.062560804,-0.015390183,-0.0050801174,0.011868977,0.00253459,-0.07341563,-0.004279252,-0.07461656,-0.0006562158,-0.16768059,0.13006905,0.03295397,0.0145061985,0.000511846,0.009465702,0.037566304,-0.012595248,-0.042188045,0.015753305,0.02033451,-0.026321119,0.020434551,0.09113539,-0.014463864,-0.04273769,0.05132384,-0.007610653,0.036329918,0.010425151,0.0075439727,0.042681746,0.060391378,0.053032257,0.0071610347,0.018304583,-0.0199126,0.008234456,-0.026586238,-0.00048163044,0.018455869,0.012418799,0.061977547,-0.014351739,0.019218396,0.010331768,0.033490002,0.0102368975,-0.031620093,0.015966186,0.10022163,-0.03886677,-0.058662754,-0.010719046,0.011613407,0.055317454,0.021442259,0.041051246,0.05395217,-0.031625535,0.1561225,-0.04847817,0.012704446,-0.017351678,-0.005412353,0.05782586,0.063770935,0.028648905,-0.0010758642,-0.03315512,0.011804742,-0.054954775,0.034165937,-0.027770827,-0.040539972,0.01901002,-0.008845964,-0.009943114,-0.00007340114,0.008205162,0.014036151,0.015788715,0.013589957,0.040579043,-0.015481178,0.0013020202,-0.019863069,0.044024546,0.054241393,-0.019910982,0.019316196,-0.009067846,-0.06370655,-0.038542934,-0.005822525,-0.05564244,-0.020892167,-0.04894251,-0.012727646,0.05143602,0.06270096,0.022492254,0.11401925,0.014643738,0.0030262705,-0.036580373,0.05074049,0.04994587,-0.06580306,0.008364971,0.0012129012,-0.034641,-0.0046832887,0.012338395,-0.032140378,-0.045876123,-0.048861995,-0.019786038,0.12485802,0.06277426,-0.033950374,0.036432575,0.06035506,0.014863595,0.0047113854,-0.19050083,-0.032735668,-0.077262625,0.044320498,-0.059189577,-0.014459053,0.03718649,-0.0026039602,0.004493112,-0.011763187,-0.05504196,-0.025533773,-0.02048363,-0.023919607,-0.015506923,0.061790027,0.01816571,0.0130165955,0.04316555,0.020895818,0.034394037,-0.00560091,0.011984886,-0.06372637,0.02781977,0.020621277,0.06389801,0.0032279587,-0.064306036,-0.07160552,-0.05394653,0.032840647,-0.0021832213,0.030553438,0.0039347326,-0.026431374,-0.026453791,-0.024773262,0.14158836,0.00027325953,-0.003358694,0.031054376,0.005467873,-0.000014875217,-0.05249387,0.05296582,-0.013941867,-0.031785127,-0.07282081,-0.029387616,-0.0076221772,-0.032214306,0.008221592,0.01732765,0.01000591,0.015568096,-0.005231348,-0.012036904,0.07718011,-0.045315113,0.008787361,0.02417641,-0.015230668,-0.15053827,-0.0037556684,-0.01667005,-0.0013223562,-0.02209581,0.016655259,0.019694244,0.015031552,-0.037394483,-0.057655845,0.12982553,0.04818329,0.0077882116,-0.015061786,0.004192891,0.08628084,0.027619699,0.044403546,0.00034237612,-0.044426452,0.00096744276,0.06186224,0.16129373,0.024928987,-0.0073914034,0.0040016263,0.039090827,-0.08990263,-0.118701264,0.04410862,-0.03954887,-0.030827247,0.112970345,0.04363939,-0.021480395,0.03728192,0.044834364,-0.0009248547,0.032832358,-0.035760213,0.15535384,-0.0009505413,-0.0034093896,-0.029711511,0.008248596,-0.051867787,-0.012275803,0.012434058,-0.04902186,-0.011476671,0.0133925,-0.03379115,-0.0151935695,0.010195133,0.031876706,0.025932532,0.036986034,-0.01739396,0.017166032,0.05808856,0.030131826,-0.0008843879,-0.06526332,-0.09222386,-0.0049838475],[-0.007225496,0.037155706,-0.016906068,-0.030758644,-0.020417303,0.011231278,-0.06530078,-0.061754078,-0.020577524,-0.024164986,-0.035808578,0.015893035,0.061571326,0.020668881,0.016767306,-0.023883428,-0.01099219,0.025237663,-0.15266667,-0.013051586,-0.010288909,0.029873036,0.017107742,0.0315594,0.021337744,0.0034486242,0.013156374,-0.037249252,-0.13094991,-0.15867794,0.024068367,0.005509016,-0.0056714285,-0.042848945,-0.0045933733,-0.04299176,0.0020768172,0.04483032,-0.03212172,-0.027772011,-0.0036520734,-0.0075447895,-0.013391376,0.0045278594,0.04607957,0.0027125278,0.049626715,-0.021857744,0.06873977,0.04173157,-0.04370165,0.014249006,-0.0373972,-0.05551407,-0.045433797,-0.0011728521,0.044487648,-0.0074436087,-0.00975718,0.008799588,0.0073077497,0.024823438,-0.35174075,-0.012705645,0.04136241,0.047284245,0.0020329098,0.04765345,-0.02604234,-0.02548834,-0.02704063,0.017578213,0.01482943,0.0055936393,0.023184825,-0.041498873,-0.003050582,0.012843925,0.05516694,-0.03866418,0.02621437,0.032198943,0.01935349,-0.018680874,-0.013953387,0.0451372,-0.018057078,-0.012344732,0.04716202,0.0010259423,-0.028411478,0.04075236,0.024121404,0.0006758823,-0.0674563,0.009551461,-0.01973488,0.05264174,0.04568158,0.29859018,0.030333413,-0.04152799,0.016276676,-0.037692044,0.053379524,-0.029166088,-0.008381986,-0.03611233,0.021734668,-0.02926269,0.01770523,-0.021257408,-0.0026680147,0.0033788746,0.03192171,-0.02859868,-0.050017837,0.007628301,-0.005211484,0.055639394,-0.04813225,-0.00062740705,-0.023975527,-0.05272858,0.0012510746,-0.016620526,-0.05937839,0.014596674,-0.007940771,-0.0060859257,0.03417475,-0.020669967,-0.09361984,-0.019438276,-0.012983339,0.022100516,0.03252378,-0.052587945,0.016381664,-0.047060754,0.015694086,-0.1377361,0.10544033,0.0026725356,0.01146019,0.026346128,-0.025007993,0.004997534,-0.053778246,-0.038643032,0.023108022,0.016371924,-0.015227947,0.0020684898,0.124686636,0.02065184,-0.0070788977,0.031109046,-0.011467157,0.0051159468,0.0174688,0.019905413,-0.0069136377,0.032805618,0.029705629,-0.038734376,0.032078113,-0.01761205,0.01944323,-0.0030690655,0.018461121,0.018608272,-0.012803209,0.017234804,-0.05453963,-0.0014086623,-0.032340996,0.0010491384,0.038566574,-0.03347248,-0.015357926,0.08070545,-0.028756669,-0.046844523,-0.01529485,0.052366853,0.059635386,0.03260225,0.05999529,0.06562162,-0.025594424,0.19492106,-0.09446214,-0.02200547,0.021350436,-0.0047113174,0.03170546,0.032968767,-0.017730163,-0.023518713,-0.024787944,-0.014301349,-0.00028776744,0.015872791,0.015544321,-0.079372294,-0.005725175,0.017331447,-0.0056501715,-0.012182198,-0.009767331,-0.05171092,0.038543854,0.034115233,0.07627104,0.032627165,0.016347326,0.012965246,0.024923127,0.02650983,-0.0040691686,0.04411213,-0.02981039,-0.06744219,-0.030292222,-0.0021420228,-0.06861754,-0.0020280352,-0.08233997,-0.0059836525,0.037955742,0.039244626,0.034866735,0.11366857,0.02521095,0.018243132,0.024956543,0.027358694,0.011940862,-0.061406422,0.0018358993,0.015471496,-0.0400448,-0.024514355,0.020818526,-0.078023,-0.019798901,-0.046464335,-0.03319194,0.16930555,0.050408904,-0.013528864,0.007027566,0.0381429,0.0010658541,-0.011183001,-0.18296444,-0.025517514,-0.028616475,0.044594944,-0.002806602,-0.00036968052,0.040348303,0.022882342,-0.0099050915,-0.029638626,-0.009392766,-0.035751175,-0.02882233,-0.05017968,-0.031793848,0.104784735,0.026196804,0.025192862,0.0053355214,-0.009864406,0.07273947,0.029665705,-0.030834008,0.005743688,0.0130977845,0.027437972,0.042631894,0.02490531,-0.031600703,-0.055224583,-0.04933041,-0.0008777641,-0.002849928,0.06742398,-0.041109774,0.00045421268,-0.008093842,-0.026830377,0.18975478,0.0022353292,0.016124677,0.03874153,-0.01676804,0.0016409162,0.0022479978,0.039468583,-0.03589011,-0.005279329,-0.031004557,-0.014081007,0.058285933,-0.03845023,-0.022855511,0.008495943,-0.013061212,0.029775871,0.024829257,-0.015684903,0.09160675,-0.057623718,0.035138898,0.037533384,0.02173393,-0.20164658,-0.034627892,-0.013216875,0.04897353,-0.058580056,0.018308442,0.028224163,-0.011080451,0.020418232,-0.026639828,0.1152522,0.05399439,-0.017088734,-0.0043683355,0.04675239,0.055089362,0.01442295,0.019836834,-0.013131093,-0.040812545,0.0028349068,0.06096238,0.15055773,-0.0047997017,0.04041006,0.023423078,0.0068679894,-0.036161505,-0.11227965,0.027264446,-0.032434683,-0.033046544,0.05816228,0.019367868,-0.035861887,0.023473343,0.07127074,-0.036597442,0.00892375,-0.03424332,0.15918937,-0.028045062,0.01727863,-0.016116075,-0.033897277,-0.04147993,0.000102095604,0.0054549514,-0.054227076,-0.014035331,0.022229984,-0.0101330625,0.0061006444,0.031121459,0.034375396,0.027529038,0.02083103,-0.01970649,0.01220227,0.048865896,0.04224607,0.034099545,-0.018085487,-0.035159428,-0.057188712],[0.010182182,0.01467856,0.02307528,-0.031243263,-0.019379467,0.018989552,-0.04283347,-0.065710135,0.037127666,-0.00186089,-0.043939225,0.02675395,0.017098242,0.01003573,0.016530303,-0.07529927,-0.0045888554,-0.00783502,-0.16103624,-0.018049028,-0.023261337,0.0726829,0.03554955,0.007101789,-0.03776669,0.03965637,0.010605459,-0.034077637,-0.1356997,-0.17605451,0.017438654,0.021631619,-0.00033740848,-0.05291991,-0.021556789,-0.020458516,-0.035007652,0.015351501,-0.013426498,-0.03958441,0.007752372,-0.016570576,-0.046401996,-0.011264202,0.05016379,-0.013889148,0.023654828,-0.030822476,0.024557399,0.041917533,-0.057632543,-0.032482482,0.00036849198,-0.038682386,-0.046676703,0.050744284,-0.010942368,-0.031797383,0.010470975,0.016948372,0.0055663995,0.058688268,-0.36635372,0.025145743,0.07269215,0.019211076,-0.018371176,-0.007865585,-0.00085583143,0.015894871,0.038337328,-0.014794488,-0.012541673,0.01718971,0.02693935,-0.045785226,0.0036220509,0.021907976,0.06554055,-0.04263025,0.0019336614,0.020152396,0.016324878,0.030021766,-0.015724592,0.06523936,0.0062361993,-0.028796729,0.038781464,0.00485937,-0.04877486,0.035066955,0.003006257,-0.0022367106,-0.04857364,0.001250449,0.0014392686,0.034671582,0.018141782,0.30240846,0.018054346,0.003062208,0.040367432,-0.07040852,0.052332688,-0.0028175337,-0.028020458,-0.021599045,0.031913813,-0.03909125,0.0028893205,-0.017719263,0.0052999025,-0.0061596422,0.054935843,-0.0012574365,-0.016914988,-0.009276138,0.023673639,0.043957185,-0.027961437,0.025381606,-0.04037111,-0.0053644218,-0.01048436,0.0035398034,-0.06366181,0.025020782,-0.046017863,-0.011454832,0.055446308,0.00011163922,-0.09325482,0.019621197,0.022895223,0.03182137,0.0010375826,-0.03117694,0.025362851,-0.031175531,-0.018045994,-0.13010256,0.10690098,-0.010491627,0.025534678,-0.0049998793,-0.028496867,0.043118607,-0.026229834,-0.01440331,0.024678908,0.033322413,-0.04394492,-0.005047783,0.0846922,0.022463208,0.0030116427,-0.003502701,-0.006854317,0.029395698,0.026690561,0.02559026,0.059080407,0.08340788,0.032878075,-0.0951223,0.05720357,0.02495402,0.014070283,-0.0042589814,0.018304987,-0.024781907,-0.041739304,-0.025803747,-0.012889254,-0.008009496,-0.028856821,-0.0005779219,0.028763987,-0.051368624,0.0027247544,0.06316944,-0.026757175,-0.08121664,-0.010547304,0.025082018,0.03702747,0.012908532,0.03141585,0.06318691,-0.027946094,0.17676711,-0.082001895,-0.036393072,-0.034927875,0.021505699,0.015366971,0.043793295,-0.0021506813,0.011197076,-0.04681245,-0.07142668,0.009581391,0.035224073,-0.04230499,-0.03571502,0.044728618,0.013419941,0.04271971,-0.008869499,-0.03126791,-0.0022953814,0.09043066,0.02422671,0.031988394,-0.005063331,-0.01025437,0.028456746,0.005116802,0.047064006,0.006069893,0.018045707,-0.022872277,-0.04572793,0.009827904,0.0069014616,-0.040622003,-0.013080576,-0.04777706,0.0012043755,0.07896354,0.043710608,0.040280547,0.073466524,0.06464221,0.014187437,-0.04872054,0.031972423,0.012510081,-0.038348954,0.016539646,0.006683025,-0.040044174,-0.056529168,0.04949601,-0.09106357,-0.030466262,0.010563386,-0.029358381,0.18323456,0.092901036,0.0274177,0.015892414,0.03165387,-0.06160097,0.0015103974,-0.11125003,0.010338306,-0.04025745,0.03327973,-0.025003629,-0.03141167,0.06007851,-0.029752823,-0.025986204,-0.0014932271,-0.00599316,-0.021954508,-0.005476444,-0.029271869,-0.040407516,0.09515277,0.019253343,0.04248291,0.00067515706,-0.009261151,0.025339367,-0.014061599,-0.0580183,-0.020854905,0.018436473,-0.0027048623,0.05364179,0.03416436,-0.009260716,-0.0785917,-0.023255466,0.03542782,0.07159498,0.0069388812,-0.038117178,-0.012323471,-0.009949083,-0.005902662,0.1273025,0.0014150682,0.018899381,0.022011757,-0.048523538,-0.03720841,-0.009601104,0.0547053,0.013078509,-0.013740014,-0.047507983,-0.018159833,0.017327625,-0.028147077,-0.030314941,-0.0028794382,-0.045816995,0.0028496154,0.015196548,-0.007854572,0.10382276,-0.01617453,0.017708423,0.037362352,0.002230973,-0.17829818,-0.036029417,-0.0006612718,-0.014223209,-0.06350168,-0.030032892,0.023901368,-0.00077770976,0.02510791,-0.04697416,0.15435414,0.08471184,-0.018154247,-0.030085038,0.03331496,0.09898532,0.016086424,0.010282825,-0.018388266,-0.006998348,0.017570151,0.0994389,0.12580456,0.023195932,0.008063885,0.003250409,-0.005355925,-0.047599785,-0.13378266,-0.0018643751,-0.045305796,-0.020819422,0.06300365,0.00095856196,0.005435208,0.0057721534,0.031151773,-0.03753951,0.016918143,-0.044961866,0.13784775,-0.016061982,-0.00000515642,-0.008715281,-0.01241248,-0.0021270465,0.022557234,0.05173467,-0.04232277,0.008206349,0.012508353,-0.004212918,-0.01315854,0.048109457,0.00035447034,-0.0082567325,0.012337424,0.0065427353,0.036199752,0.030513138,0.039167494,-0.028987426,-0.016657345,-0.07125146,-0.020769335]],"total_duration":9249807,"load_duration":1162717,"prompt_eval_count":4}' - recorded_at: Wed, 02 Apr 2025 00:44:07 GMT + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.038980126,0.020101948,-0.067413226,0.007685114,-0.021361317,0.028405204,-0.05964908,-0.09178641,-0.032397546,0.008366828,-0.05523459,0.014637846,0.0298761,0.03387804,-0.016674861,-0.044479024,0.008276525,-0.0022477629,-0.12195336,-0.008178106,0.008199949,0.07350191,0.01897805,0.013661541,-0.003947917,0.00030909953,0.006917925,-0.012626692,-0.09616951,-0.17709318,0.01293276,0.031847943,0.025997223,-0.042996813,0.03192809,-0.048060544,-0.0017395425,0.029812165,-0.026901668,-0.030327402,-0.0068094945,0.023497479,-0.019625092,-0.003110331,0.010590182,-0.027034454,0.04182794,-0.009884578,0.09661056,0.043840215,-0.037773125,-0.033335246,0.009626258,-0.013944384,-0.040054895,-0.0026200123,0.046114273,0.0049590026,-0.008846017,0.034012534,0.038100995,0.0013456035,-0.34869465,-0.06399822,0.06681992,-0.007770172,0.03451249,0.006695025,0.0016939766,-0.005725403,-0.059506737,-0.0011312707,-0.034694858,-0.0070268526,0.033973437,-0.07178208,0.0019529031,0.050796922,0.033150885,-0.04453945,-0.010778929,-0.01298108,0.01772847,0.027397834,0.017516151,0.05094088,-0.045374986,-0.031055674,0.0034364148,0.017342873,0.03724968,-0.020449797,0.03487508,-0.023868825,-0.0705106,0.045591667,0.0014132301,0.04102965,0.0082013225,0.3076015,0.041163538,-0.0075212517,0.0632507,-0.07494113,0.054058343,-0.013692275,-0.018088195,0.0039990763,-0.016607765,-0.00915819,0.03353369,-0.017990997,-0.008927891,0.018497262,0.04622437,-0.028729072,-0.0070351255,-0.005821854,0.0063457754,0.044443272,-0.03001723,0.014840464,-0.03265875,-0.017414864,-0.014599514,-0.022385433,-0.06727593,0.03655243,0.009642398,0.04557801,0.028509801,0.011939836,-0.062560804,-0.015390183,-0.0050801174,0.011868977,0.00253459,-0.07341563,-0.004279252,-0.07461656,-0.0006562158,-0.16768059,0.13006905,0.03295397,0.0145061985,0.000511846,0.009465702,0.037566304,-0.012595248,-0.042188045,0.015753305,0.02033451,-0.026321119,0.020434551,0.09113539,-0.014463864,-0.04273769,0.05132384,-0.007610653,0.036329918,0.010425151,0.0075439727,0.042681746,0.060391378,0.053032257,0.0071610347,0.018304583,-0.0199126,0.008234456,-0.026586238,-0.00048163044,0.018455869,0.012418799,0.061977547,-0.014351739,0.019218396,0.010331768,0.033490002,0.0102368975,-0.031620093,0.015966186,0.10022163,-0.03886677,-0.058662754,-0.010719046,0.011613407,0.055317454,0.021442259,0.041051246,0.05395217,-0.031625535,0.1561225,-0.04847817,0.012704446,-0.017351678,-0.005412353,0.05782586,0.063770935,0.028648905,-0.0010758642,-0.03315512,0.011804742,-0.054954775,0.034165937,-0.027770827,-0.040539972,0.01901002,-0.008845964,-0.009943114,-0.00007340114,0.008205162,0.014036151,0.015788715,0.013589957,0.040579043,-0.015481178,0.0013020202,-0.019863069,0.044024546,0.054241393,-0.019910982,0.019316196,-0.009067846,-0.06370655,-0.038542934,-0.005822525,-0.05564244,-0.020892167,-0.04894251,-0.012727646,0.05143602,0.06270096,0.022492254,0.11401925,0.014643738,0.0030262705,-0.036580373,0.05074049,0.04994587,-0.06580306,0.008364971,0.0012129012,-0.034641,-0.0046832887,0.012338395,-0.032140378,-0.045876123,-0.048861995,-0.019786038,0.12485802,0.06277426,-0.033950374,0.036432575,0.06035506,0.014863595,0.0047113854,-0.19050083,-0.032735668,-0.077262625,0.044320498,-0.059189577,-0.014459053,0.03718649,-0.0026039602,0.004493112,-0.011763187,-0.05504196,-0.025533773,-0.02048363,-0.023919607,-0.015506923,0.061790027,0.01816571,0.0130165955,0.04316555,0.020895818,0.034394037,-0.00560091,0.011984886,-0.06372637,0.02781977,0.020621277,0.06389801,0.0032279587,-0.064306036,-0.07160552,-0.05394653,0.032840647,-0.0021832213,0.030553438,0.0039347326,-0.026431374,-0.026453791,-0.024773262,0.14158836,0.00027325953,-0.003358694,0.031054376,0.005467873,-0.000014875217,-0.05249387,0.05296582,-0.013941867,-0.031785127,-0.07282081,-0.029387616,-0.0076221772,-0.032214306,0.008221592,0.01732765,0.01000591,0.015568096,-0.005231348,-0.012036904,0.07718011,-0.045315113,0.008787361,0.02417641,-0.015230668,-0.15053827,-0.0037556684,-0.01667005,-0.0013223562,-0.02209581,0.016655259,0.019694244,0.015031552,-0.037394483,-0.057655845,0.12982553,0.04818329,0.0077882116,-0.015061786,0.004192891,0.08628084,0.027619699,0.044403546,0.00034237612,-0.044426452,0.00096744276,0.06186224,0.16129373,0.024928987,-0.0073914034,0.0040016263,0.039090827,-0.08990263,-0.118701264,0.04410862,-0.03954887,-0.030827247,0.112970345,0.04363939,-0.021480395,0.03728192,0.044834364,-0.0009248547,0.032832358,-0.035760213,0.15535384,-0.0009505413,-0.0034093896,-0.029711511,0.008248596,-0.051867787,-0.012275803,0.012434058,-0.04902186,-0.011476671,0.0133925,-0.03379115,-0.0151935695,0.010195133,0.031876706,0.025932532,0.036986034,-0.01739396,0.017166032,0.05808856,0.030131826,-0.0008843879,-0.06526332,-0.09222386,-0.0049838475],[-0.007225496,0.037155706,-0.016906068,-0.030758644,-0.020417303,0.011231278,-0.06530078,-0.061754078,-0.020577524,-0.024164986,-0.035808578,0.015893035,0.061571326,0.020668881,0.016767306,-0.023883428,-0.01099219,0.025237663,-0.15266667,-0.013051586,-0.010288909,0.029873036,0.017107742,0.0315594,0.021337744,0.0034486242,0.013156374,-0.037249252,-0.13094991,-0.15867794,0.024068367,0.005509016,-0.0056714285,-0.042848945,-0.0045933733,-0.04299176,0.0020768172,0.04483032,-0.03212172,-0.027772011,-0.0036520734,-0.0075447895,-0.013391376,0.0045278594,0.04607957,0.0027125278,0.049626715,-0.021857744,0.06873977,0.04173157,-0.04370165,0.014249006,-0.0373972,-0.05551407,-0.045433797,-0.0011728521,0.044487648,-0.0074436087,-0.00975718,0.008799588,0.0073077497,0.024823438,-0.35174075,-0.012705645,0.04136241,0.047284245,0.0020329098,0.04765345,-0.02604234,-0.02548834,-0.02704063,0.017578213,0.01482943,0.0055936393,0.023184825,-0.041498873,-0.003050582,0.012843925,0.05516694,-0.03866418,0.02621437,0.032198943,0.01935349,-0.018680874,-0.013953387,0.0451372,-0.018057078,-0.012344732,0.04716202,0.0010259423,-0.028411478,0.04075236,0.024121404,0.0006758823,-0.0674563,0.009551461,-0.01973488,0.05264174,0.04568158,0.29859018,0.030333413,-0.04152799,0.016276676,-0.037692044,0.053379524,-0.029166088,-0.008381986,-0.03611233,0.021734668,-0.02926269,0.01770523,-0.021257408,-0.0026680147,0.0033788746,0.03192171,-0.02859868,-0.050017837,0.007628301,-0.005211484,0.055639394,-0.04813225,-0.00062740705,-0.023975527,-0.05272858,0.0012510746,-0.016620526,-0.05937839,0.014596674,-0.007940771,-0.0060859257,0.03417475,-0.020669967,-0.09361984,-0.019438276,-0.012983339,0.022100516,0.03252378,-0.052587945,0.016381664,-0.047060754,0.015694086,-0.1377361,0.10544033,0.0026725356,0.01146019,0.026346128,-0.025007993,0.004997534,-0.053778246,-0.038643032,0.023108022,0.016371924,-0.015227947,0.0020684898,0.124686636,0.02065184,-0.0070788977,0.031109046,-0.011467157,0.0051159468,0.0174688,0.019905413,-0.0069136377,0.032805618,0.029705629,-0.038734376,0.032078113,-0.01761205,0.01944323,-0.0030690655,0.018461121,0.018608272,-0.012803209,0.017234804,-0.05453963,-0.0014086623,-0.032340996,0.0010491384,0.038566574,-0.03347248,-0.015357926,0.08070545,-0.028756669,-0.046844523,-0.01529485,0.052366853,0.059635386,0.03260225,0.05999529,0.06562162,-0.025594424,0.19492106,-0.09446214,-0.02200547,0.021350436,-0.0047113174,0.03170546,0.032968767,-0.017730163,-0.023518713,-0.024787944,-0.014301349,-0.00028776744,0.015872791,0.015544321,-0.079372294,-0.005725175,0.017331447,-0.0056501715,-0.012182198,-0.009767331,-0.05171092,0.038543854,0.034115233,0.07627104,0.032627165,0.016347326,0.012965246,0.024923127,0.02650983,-0.0040691686,0.04411213,-0.02981039,-0.06744219,-0.030292222,-0.0021420228,-0.06861754,-0.0020280352,-0.08233997,-0.0059836525,0.037955742,0.039244626,0.034866735,0.11366857,0.02521095,0.018243132,0.024956543,0.027358694,0.011940862,-0.061406422,0.0018358993,0.015471496,-0.0400448,-0.024514355,0.020818526,-0.078023,-0.019798901,-0.046464335,-0.03319194,0.16930555,0.050408904,-0.013528864,0.007027566,0.0381429,0.0010658541,-0.011183001,-0.18296444,-0.025517514,-0.028616475,0.044594944,-0.002806602,-0.00036968052,0.040348303,0.022882342,-0.0099050915,-0.029638626,-0.009392766,-0.035751175,-0.02882233,-0.05017968,-0.031793848,0.104784735,0.026196804,0.025192862,0.0053355214,-0.009864406,0.07273947,0.029665705,-0.030834008,0.005743688,0.0130977845,0.027437972,0.042631894,0.02490531,-0.031600703,-0.055224583,-0.04933041,-0.0008777641,-0.002849928,0.06742398,-0.041109774,0.00045421268,-0.008093842,-0.026830377,0.18975478,0.0022353292,0.016124677,0.03874153,-0.01676804,0.0016409162,0.0022479978,0.039468583,-0.03589011,-0.005279329,-0.031004557,-0.014081007,0.058285933,-0.03845023,-0.022855511,0.008495943,-0.013061212,0.029775871,0.024829257,-0.015684903,0.09160675,-0.057623718,0.035138898,0.037533384,0.02173393,-0.20164658,-0.034627892,-0.013216875,0.04897353,-0.058580056,0.018308442,0.028224163,-0.011080451,0.020418232,-0.026639828,0.1152522,0.05399439,-0.017088734,-0.0043683355,0.04675239,0.055089362,0.01442295,0.019836834,-0.013131093,-0.040812545,0.0028349068,0.06096238,0.15055773,-0.0047997017,0.04041006,0.023423078,0.0068679894,-0.036161505,-0.11227965,0.027264446,-0.032434683,-0.033046544,0.05816228,0.019367868,-0.035861887,0.023473343,0.07127074,-0.036597442,0.00892375,-0.03424332,0.15918937,-0.028045062,0.01727863,-0.016116075,-0.033897277,-0.04147993,0.000102095604,0.0054549514,-0.054227076,-0.014035331,0.022229984,-0.0101330625,0.0061006444,0.031121459,0.034375396,0.027529038,0.02083103,-0.01970649,0.01220227,0.048865896,0.04224607,0.034099545,-0.018085487,-0.035159428,-0.057188712],[0.010182182,0.01467856,0.02307528,-0.031243263,-0.019379467,0.018989552,-0.04283347,-0.065710135,0.037127666,-0.00186089,-0.043939225,0.02675395,0.017098242,0.01003573,0.016530303,-0.07529927,-0.0045888554,-0.00783502,-0.16103624,-0.018049028,-0.023261337,0.0726829,0.03554955,0.007101789,-0.03776669,0.03965637,0.010605459,-0.034077637,-0.1356997,-0.17605451,0.017438654,0.021631619,-0.00033740848,-0.05291991,-0.021556789,-0.020458516,-0.035007652,0.015351501,-0.013426498,-0.03958441,0.007752372,-0.016570576,-0.046401996,-0.011264202,0.05016379,-0.013889148,0.023654828,-0.030822476,0.024557399,0.041917533,-0.057632543,-0.032482482,0.00036849198,-0.038682386,-0.046676703,0.050744284,-0.010942368,-0.031797383,0.010470975,0.016948372,0.0055663995,0.058688268,-0.36635372,0.025145743,0.07269215,0.019211076,-0.018371176,-0.007865585,-0.00085583143,0.015894871,0.038337328,-0.014794488,-0.012541673,0.01718971,0.02693935,-0.045785226,0.0036220509,0.021907976,0.06554055,-0.04263025,0.0019336614,0.020152396,0.016324878,0.030021766,-0.015724592,0.06523936,0.0062361993,-0.028796729,0.038781464,0.00485937,-0.04877486,0.035066955,0.003006257,-0.0022367106,-0.04857364,0.001250449,0.0014392686,0.034671582,0.018141782,0.30240846,0.018054346,0.003062208,0.040367432,-0.07040852,0.052332688,-0.0028175337,-0.028020458,-0.021599045,0.031913813,-0.03909125,0.0028893205,-0.017719263,0.0052999025,-0.0061596422,0.054935843,-0.0012574365,-0.016914988,-0.009276138,0.023673639,0.043957185,-0.027961437,0.025381606,-0.04037111,-0.0053644218,-0.01048436,0.0035398034,-0.06366181,0.025020782,-0.046017863,-0.011454832,0.055446308,0.00011163922,-0.09325482,0.019621197,0.022895223,0.03182137,0.0010375826,-0.03117694,0.025362851,-0.031175531,-0.018045994,-0.13010256,0.10690098,-0.010491627,0.025534678,-0.0049998793,-0.028496867,0.043118607,-0.026229834,-0.01440331,0.024678908,0.033322413,-0.04394492,-0.005047783,0.0846922,0.022463208,0.0030116427,-0.003502701,-0.006854317,0.029395698,0.026690561,0.02559026,0.059080407,0.08340788,0.032878075,-0.0951223,0.05720357,0.02495402,0.014070283,-0.0042589814,0.018304987,-0.024781907,-0.041739304,-0.025803747,-0.012889254,-0.008009496,-0.028856821,-0.0005779219,0.028763987,-0.051368624,0.0027247544,0.06316944,-0.026757175,-0.08121664,-0.010547304,0.025082018,0.03702747,0.012908532,0.03141585,0.06318691,-0.027946094,0.17676711,-0.082001895,-0.036393072,-0.034927875,0.021505699,0.015366971,0.043793295,-0.0021506813,0.011197076,-0.04681245,-0.07142668,0.009581391,0.035224073,-0.04230499,-0.03571502,0.044728618,0.013419941,0.04271971,-0.008869499,-0.03126791,-0.0022953814,0.09043066,0.02422671,0.031988394,-0.005063331,-0.01025437,0.028456746,0.005116802,0.047064006,0.006069893,0.018045707,-0.022872277,-0.04572793,0.009827904,0.0069014616,-0.040622003,-0.013080576,-0.04777706,0.0012043755,0.07896354,0.043710608,0.040280547,0.073466524,0.06464221,0.014187437,-0.04872054,0.031972423,0.012510081,-0.038348954,0.016539646,0.006683025,-0.040044174,-0.056529168,0.04949601,-0.09106357,-0.030466262,0.010563386,-0.029358381,0.18323456,0.092901036,0.0274177,0.015892414,0.03165387,-0.06160097,0.0015103974,-0.11125003,0.010338306,-0.04025745,0.03327973,-0.025003629,-0.03141167,0.06007851,-0.029752823,-0.025986204,-0.0014932271,-0.00599316,-0.021954508,-0.005476444,-0.029271869,-0.040407516,0.09515277,0.019253343,0.04248291,0.00067515706,-0.009261151,0.025339367,-0.014061599,-0.0580183,-0.020854905,0.018436473,-0.0027048623,0.05364179,0.03416436,-0.009260716,-0.0785917,-0.023255466,0.03542782,0.07159498,0.0069388812,-0.038117178,-0.012323471,-0.009949083,-0.005902662,0.1273025,0.0014150682,0.018899381,0.022011757,-0.048523538,-0.03720841,-0.009601104,0.0547053,0.013078509,-0.013740014,-0.047507983,-0.018159833,0.017327625,-0.028147077,-0.030314941,-0.0028794382,-0.045816995,0.0028496154,0.015196548,-0.007854572,0.10382276,-0.01617453,0.017708423,0.037362352,0.002230973,-0.17829818,-0.036029417,-0.0006612718,-0.014223209,-0.06350168,-0.030032892,0.023901368,-0.00077770976,0.02510791,-0.04697416,0.15435414,0.08471184,-0.018154247,-0.030085038,0.03331496,0.09898532,0.016086424,0.010282825,-0.018388266,-0.006998348,0.017570151,0.0994389,0.12580456,0.023195932,0.008063885,0.003250409,-0.005355925,-0.047599785,-0.13378266,-0.0018643751,-0.045305796,-0.020819422,0.06300365,0.00095856196,0.005435208,0.0057721534,0.031151773,-0.03753951,0.016918143,-0.044961866,0.13784775,-0.016061982,-0.00000515642,-0.008715281,-0.01241248,-0.0021270465,0.022557234,0.05173467,-0.04232277,0.008206349,0.012508353,-0.004212918,-0.01315854,0.048109457,0.00035447034,-0.0082567325,0.012337424,0.0065427353,0.036199752,0.030513138,0.039167494,-0.028987426,-0.016657345,-0.07125146,-0.020769335]],"total_duration":11480915,"load_duration":2711876,"prompt_eval_count":4}' + recorded_at: Fri, 11 Apr 2025 20:24:17 GMT recorded_with: VCR 6.3.1 From 758374f09412fed7605e4ab328ea4c8cd30660b0 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 17 Apr 2025 09:55:34 -0300 Subject: [PATCH 46/55] Merge model list --- .../vcr_cassettes/initial_model_refresh.yml | 1477 +++++++++++++++-- 1 file changed, 1384 insertions(+), 93 deletions(-) diff --git a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml index bf4dcd78..0741f946 100644 --- a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml +++ b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml @@ -34,126 +34,1417 @@ http_interactions: recorded_at: Thu, 27 Mar 2025 20:15:02 GMT - request: method: get - uri: https://bedrock.us-west-2.amazonaws.com/foundation-models + uri: https://api.openai.com/v1/models body: encoding: US-ASCII string: '' headers: User-Agent: - Faraday v2.12.2 - Host: - - bedrock.us-west-2.amazonaws.com - X-Amz-Date: - - 20250325T171540Z - X-Amz-Security-Token: - - IQoJb3JpZ2luX2VjELH//////////wEaCXVzLXdlc3QtMiJGMEQCIDILea5LoQt0bejpnAvGlODePXWs+SVOVYKadYo/Rk9CAiBvj7jTOPExaq5kzi5J7Q2EI2OPjkGHwhnRvXZUSqD6LCqSAwgaEAYaDDIyMTg3MTkxNTQ2MyIMSNqSOazgocTuFlBsKu8C3Nbecj9HZFdBXZ7kaWtb3fByaNE9zYowsMzOb08Ugng8UL9qxzm5g0wT+NFvcJg4JvHNBlfxQyqhoqRAzSN8FAevZ2Pf59sReQbMAaKK0+CdIlH+begPkvTzwGvbj6CQhcRWkeD0UWRgLj1qpwJc2MhogI4CaSILeh/gkUC2fwtLaLK8KoXkrC+XWSvs/P+Qn5gF/YcwWYmlJjo1Y7zkaSRPD/V/SXrdEKCb7lHMkB9HgGSiV0kLg5y6KAcmBbG2HWd7S4qRu0Ko3lm3PIch5E4X7UDcxVLBtX0YErNR7vIRQvpbZ9itrjDqF1Wcckw26asVdC1UxbOSWrnAGqk8RFZrS17i4CP+XV+dQ3jD4/+ILYjKvXynqYA4TAwahL0104h7JCFELXmQOEwPmIPX4hmutyUEkkmfout1krQmzjE01ltNitPgVJzOI3On9YHKqBNp0aEgd6xC9frMseZ8Bb+d8B1Jx9oIBCVvH8RRtTDox4u/BjqnAVK1mPlee72ZUnkKg4jzL3LJL3OmDMBOEGSHmUoOTQ40feXeTlY01glfh7Cx3ExDxAUNIz96zwmhuVVSdwP9aGGsumlYsTJRz7wpDvgq8eGV+9JD9uG+55rtGsH8EzBS9Xw5bxJpBvmpIuRw6fKr7wBiCTTVyRR+Jl7JqGoQelm41v/mXIjzsO43zWUbwInRyFYzqxwmiPSHGwJJnn7eQriksmHxxh4i - X-Amz-Content-Sha256: - - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 Authorization: - - AWS4-HMAC-SHA256 Credential=ASIATHKEYYHDRJWE7TAB/20250325/us-west-2/bedrock/aws4_request, - SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=e4a35761abf5be047cdd3c2b4383e1f3b30031acb59a6254960f1ef94b1a939a + - Bearer + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 02 Apr 2025 17:53:38 GMT Content-Type: - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Openai-Version: + - '2020-10-01' + X-Request-Id: + - "" + Openai-Processing-Ms: + - '492' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Cf-Cache-Status: + - DYNAMIC + Set-Cookie: + - "" + - "" + X-Content-Type-Options: + - nosniff + Server: + - cloudflare + Cf-Ray: + - "" + Alt-Svc: + - h3=":443"; ma=86400 + body: + encoding: ASCII-8BIT + string: |- + { + "object": "list", + "data": [ + { + "id": "gpt-4o-realtime-preview-2024-12-17", + "object": "model", + "created": 1733945430, + "owned_by": "system" + }, + { + "id": "gpt-4o-audio-preview-2024-12-17", + "object": "model", + "created": 1734034239, + "owned_by": "system" + }, + { + "id": "dall-e-3", + "object": "model", + "created": 1698785189, + "owned_by": "system" + }, + { + "id": "dall-e-2", + "object": "model", + "created": 1698798177, + "owned_by": "system" + }, + { + "id": "gpt-4o-audio-preview-2024-10-01", + "object": "model", + "created": 1727389042, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-realtime-preview-2024-12-17", + "object": "model", + "created": 1734112601, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-realtime-preview", + "object": "model", + "created": 1734387380, + "owned_by": "system" + }, + { + "id": "gpt-4o-realtime-preview-2024-10-01", + "object": "model", + "created": 1727131766, + "owned_by": "system" + }, + { + "id": "gpt-4o-transcribe", + "object": "model", + "created": 1742068463, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-transcribe", + "object": "model", + "created": 1742068596, + "owned_by": "system" + }, + { + "id": "gpt-4o-realtime-preview", + "object": "model", + "created": 1727659998, + "owned_by": "system" + }, + { + "id": "babbage-002", + "object": "model", + "created": 1692634615, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-tts", + "object": "model", + "created": 1742403959, + "owned_by": "system" + }, + { + "id": "tts-1-hd-1106", + "object": "model", + "created": 1699053533, + "owned_by": "system" + }, + { + "id": "text-embedding-3-large", + "object": "model", + "created": 1705953180, + "owned_by": "system" + }, + { + "id": "gpt-4", + "object": "model", + "created": 1687882411, + "owned_by": "openai" + }, + { + "id": "text-embedding-ada-002", + "object": "model", + "created": 1671217299, + "owned_by": "openai-internal" + }, + { + "id": "omni-moderation-latest", + "object": "model", + "created": 1731689265, + "owned_by": "system" + }, + { + "id": "tts-1-hd", + "object": "model", + "created": 1699046015, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-audio-preview", + "object": "model", + "created": 1734387424, + "owned_by": "system" + }, + { + "id": "gpt-4o-audio-preview", + "object": "model", + "created": 1727460443, + "owned_by": "system" + }, + { + "id": "o1-preview-2024-09-12", + "object": "model", + "created": 1725648865, + "owned_by": "system" + }, + { + "id": "gpt-3.5-turbo-instruct-0914", + "object": "model", + "created": 1694122472, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-search-preview", + "object": "model", + "created": 1741391161, + "owned_by": "system" + }, + { + "id": "tts-1-1106", + "object": "model", + "created": 1699053241, + "owned_by": "system" + }, + { + "id": "davinci-002", + "object": "model", + "created": 1692634301, + "owned_by": "system" + }, + { + "id": "gpt-3.5-turbo-1106", + "object": "model", + "created": 1698959748, + "owned_by": "system" + }, + { + "id": "gpt-4-turbo", + "object": "model", + "created": 1712361441, + "owned_by": "system" + }, + { + "id": "gpt-4-0125-preview", + "object": "model", + "created": 1706037612, + "owned_by": "system" + }, + { + "id": "gpt-3.5-turbo-instruct", + "object": "model", + "created": 1692901427, + "owned_by": "system" + }, + { + "id": "gpt-3.5-turbo", + "object": "model", + "created": 1677610602, + "owned_by": "openai" + }, + { + "id": "gpt-4-turbo-preview", + "object": "model", + "created": 1706037777, + "owned_by": "system" + }, + { + "id": "chatgpt-4o-latest", + "object": "model", + "created": 1723515131, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-search-preview-2025-03-11", + "object": "model", + "created": 1741390858, + "owned_by": "system" + }, + { + "id": "gpt-4o-2024-11-20", + "object": "model", + "created": 1739331543, + "owned_by": "system" + }, + { + "id": "whisper-1", + "object": "model", + "created": 1677532384, + "owned_by": "openai-internal" + }, + { + "id": "gpt-3.5-turbo-0125", + "object": "model", + "created": 1706048358, + "owned_by": "system" + }, + { + "id": "gpt-4o-2024-05-13", + "object": "model", + "created": 1715368132, + "owned_by": "system" + }, + { + "id": "gpt-3.5-turbo-16k", + "object": "model", + "created": 1683758102, + "owned_by": "openai-internal" + }, + { + "id": "gpt-4-turbo-2024-04-09", + "object": "model", + "created": 1712601677, + "owned_by": "system" + }, + { + "id": "gpt-4-1106-preview", + "object": "model", + "created": 1698957206, + "owned_by": "system" + }, + { + "id": "o1-preview", + "object": "model", + "created": 1725648897, + "owned_by": "system" + }, + { + "id": "gpt-4-0613", + "object": "model", + "created": 1686588896, + "owned_by": "openai" + }, + { + "id": "gpt-4o-search-preview", + "object": "model", + "created": 1741388720, + "owned_by": "system" + }, + { + "id": "gpt-4.5-preview", + "object": "model", + "created": 1740623059, + "owned_by": "system" + }, + { + "id": "gpt-4.5-preview-2025-02-27", + "object": "model", + "created": 1740623304, + "owned_by": "system" + }, + { + "id": "gpt-4o-search-preview-2025-03-11", + "object": "model", + "created": 1741388170, + "owned_by": "system" + }, + { + "id": "tts-1", + "object": "model", + "created": 1681940951, + "owned_by": "openai-internal" + }, + { + "id": "omni-moderation-2024-09-26", + "object": "model", + "created": 1732734466, + "owned_by": "system" + }, + { + "id": "o1-2024-12-17", + "object": "model", + "created": 1734326976, + "owned_by": "system" + }, + { + "id": "o1", + "object": "model", + "created": 1734375816, + "owned_by": "system" + }, + { + "id": "o1-pro", + "object": "model", + "created": 1742251791, + "owned_by": "system" + }, + { + "id": "text-embedding-3-small", + "object": "model", + "created": 1705948997, + "owned_by": "system" + }, + { + "id": "o1-pro-2025-03-19", + "object": "model", + "created": 1742251504, + "owned_by": "system" + }, + { + "id": "gpt-4o", + "object": "model", + "created": 1715367049, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini", + "object": "model", + "created": 1721172741, + "owned_by": "system" + }, + { + "id": "o3-mini", + "object": "model", + "created": 1737146383, + "owned_by": "system" + }, + { + "id": "gpt-4o-2024-08-06", + "object": "model", + "created": 1722814719, + "owned_by": "system" + }, + { + "id": "o3-mini-2025-01-31", + "object": "model", + "created": 1738010200, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-2024-07-18", + "object": "model", + "created": 1721172717, + "owned_by": "system" + }, + { + "id": "o1-mini", + "object": "model", + "created": 1725649008, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-audio-preview-2024-12-17", + "object": "model", + "created": 1734115920, + "owned_by": "system" + }, + { + "id": "o1-mini-2024-09-12", + "object": "model", + "created": 1725648979, + "owned_by": "system" + } + ] + } + recorded_at: Wed, 02 Apr 2025 17:53:38 GMT +- request: + method: get + uri: https://api.anthropic.com/v1/models + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + X-Api-Key: + - "" + Anthropic-Version: + - '2023-06-01' + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 02 Apr 2025 17:53:39 GMT + Content-Type: - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Request-Id: + - "" + Anthropic-Organization-Id: + - 0137b15c-16bf-490d-9f90-8cfd7e325ec0 + Via: + - 1.1 google + Cf-Cache-Status: + - DYNAMIC + X-Robots-Tag: + - none + Server: + - cloudflare + Cf-Ray: + - "" + body: + encoding: ASCII-8BIT + string: '{"data":[{"type":"model","id":"claude-3-7-sonnet-20250219","display_name":"Claude + 3.7 Sonnet","created_at":"2025-02-24T00:00:00Z"},{"type":"model","id":"claude-3-5-sonnet-20241022","display_name":"Claude + 3.5 Sonnet (New)","created_at":"2024-10-22T00:00:00Z"},{"type":"model","id":"claude-3-5-haiku-20241022","display_name":"Claude + 3.5 Haiku","created_at":"2024-10-22T00:00:00Z"},{"type":"model","id":"claude-3-5-sonnet-20240620","display_name":"Claude + 3.5 Sonnet (Old)","created_at":"2024-06-20T00:00:00Z"},{"type":"model","id":"claude-3-haiku-20240307","display_name":"Claude + 3 Haiku","created_at":"2024-03-07T00:00:00Z"},{"type":"model","id":"claude-3-opus-20240229","display_name":"Claude + 3 Opus","created_at":"2024-02-29T00:00:00Z"},{"type":"model","id":"claude-3-sonnet-20240229","display_name":"Claude + 3 Sonnet","created_at":"2024-02-29T00:00:00Z"},{"type":"model","id":"claude-2.1","display_name":"Claude + 2.1","created_at":"2023-11-21T00:00:00Z"},{"type":"model","id":"claude-2.0","display_name":"Claude + 2.0","created_at":"2023-07-11T00:00:00Z"}],"has_more":false,"first_id":"claude-3-7-sonnet-20250219","last_id":"claude-2.0"}' + recorded_at: Wed, 02 Apr 2025 17:53:39 GMT +- request: + method: get + uri: https://generativelanguage.googleapis.com/v1beta/models + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + X-Goog-Api-Key: + - "" Accept-Encoding: - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=UTF-8 + Vary: + - Origin + - Referer + - X-Origin + Date: + - Wed, 02 Apr 2025 17:53:39 GMT + Server: + - scaffolding on HTTPServer2 + X-Xss-Protection: + - '0' + X-Frame-Options: + - SAMEORIGIN + X-Content-Type-Options: + - nosniff + Server-Timing: + - gfet4t7; dur=86 + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: | + { + "models": [ + { + "name": "models/chat-bison-001", + "version": "001", + "displayName": "PaLM 2 Chat (Legacy)", + "description": "A legacy text-only model optimized for chat conversations", + "inputTokenLimit": 4096, + "outputTokenLimit": 1024, + "supportedGenerationMethods": [ + "generateMessage", + "countMessageTokens" + ], + "temperature": 0.25, + "topP": 0.95, + "topK": 40 + }, + { + "name": "models/text-bison-001", + "version": "001", + "displayName": "PaLM 2 (Legacy)", + "description": "A legacy model that understands text and generates text as an output", + "inputTokenLimit": 8196, + "outputTokenLimit": 1024, + "supportedGenerationMethods": [ + "generateText", + "countTextTokens", + "createTunedTextModel" + ], + "temperature": 0.7, + "topP": 0.95, + "topK": 40 + }, + { + "name": "models/embedding-gecko-001", + "version": "001", + "displayName": "Embedding Gecko", + "description": "Obtain a distributed representation of a text.", + "inputTokenLimit": 1024, + "outputTokenLimit": 1, + "supportedGenerationMethods": [ + "embedText", + "countTextTokens" + ] + }, + { + "name": "models/gemini-1.0-pro-vision-latest", + "version": "001", + "displayName": "Gemini 1.0 Pro Vision", + "description": "The original Gemini 1.0 Pro Vision model version which was optimized for image understanding. Gemini 1.0 Pro Vision was deprecated on July 12, 2024. Move to a newer Gemini version.", + "inputTokenLimit": 12288, + "outputTokenLimit": 4096, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 0.4, + "topP": 1, + "topK": 32 + }, + { + "name": "models/gemini-pro-vision", + "version": "001", + "displayName": "Gemini 1.0 Pro Vision", + "description": "The original Gemini 1.0 Pro Vision model version which was optimized for image understanding. Gemini 1.0 Pro Vision was deprecated on July 12, 2024. Move to a newer Gemini version.", + "inputTokenLimit": 12288, + "outputTokenLimit": 4096, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 0.4, + "topP": 1, + "topK": 32 + }, + { + "name": "models/gemini-1.5-pro-latest", + "version": "001", + "displayName": "Gemini 1.5 Pro Latest", + "description": "Alias that points to the most recent production (non-experimental) release of Gemini 1.5 Pro, our mid-size multimodal model that supports up to 2 million tokens.", + "inputTokenLimit": 2000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-pro-001", + "version": "001", + "displayName": "Gemini 1.5 Pro 001", + "description": "Stable version of Gemini 1.5 Pro, our mid-size multimodal model that supports up to 2 million tokens, released in May of 2024.", + "inputTokenLimit": 2000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens", + "createCachedContent" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-pro-002", + "version": "002", + "displayName": "Gemini 1.5 Pro 002", + "description": "Stable version of Gemini 1.5 Pro, our mid-size multimodal model that supports up to 2 million tokens, released in September of 2024.", + "inputTokenLimit": 2000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens", + "createCachedContent" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-pro", + "version": "001", + "displayName": "Gemini 1.5 Pro", + "description": "Stable version of Gemini 1.5 Pro, our mid-size multimodal model that supports up to 2 million tokens, released in May of 2024.", + "inputTokenLimit": 2000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash-latest", + "version": "001", + "displayName": "Gemini 1.5 Flash Latest", + "description": "Alias that points to the most recent production (non-experimental) release of Gemini 1.5 Flash, our fast and versatile multimodal model for scaling across diverse tasks.", + "inputTokenLimit": 1000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash-001", + "version": "001", + "displayName": "Gemini 1.5 Flash 001", + "description": "Stable version of Gemini 1.5 Flash, our fast and versatile multimodal model for scaling across diverse tasks, released in May of 2024.", + "inputTokenLimit": 1000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens", + "createCachedContent" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash-001-tuning", + "version": "001", + "displayName": "Gemini 1.5 Flash 001 Tuning", + "description": "Version of Gemini 1.5 Flash that supports tuning, our fast and versatile multimodal model for scaling across diverse tasks, released in May of 2024.", + "inputTokenLimit": 16384, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens", + "createTunedModel" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash", + "version": "001", + "displayName": "Gemini 1.5 Flash", + "description": "Alias that points to the most recent stable version of Gemini 1.5 Flash, our fast and versatile multimodal model for scaling across diverse tasks.", + "inputTokenLimit": 1000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash-002", + "version": "002", + "displayName": "Gemini 1.5 Flash 002", + "description": "Stable version of Gemini 1.5 Flash, our fast and versatile multimodal model for scaling across diverse tasks, released in September of 2024.", + "inputTokenLimit": 1000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens", + "createCachedContent" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash-8b", + "version": "001", + "displayName": "Gemini 1.5 Flash-8B", + "description": "Stable version of Gemini 1.5 Flash-8B, our smallest and most cost effective Flash model, released in October of 2024.", + "inputTokenLimit": 1000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "createCachedContent", + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash-8b-001", + "version": "001", + "displayName": "Gemini 1.5 Flash-8B 001", + "description": "Stable version of Gemini 1.5 Flash-8B, our smallest and most cost effective Flash model, released in October of 2024.", + "inputTokenLimit": 1000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "createCachedContent", + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash-8b-latest", + "version": "001", + "displayName": "Gemini 1.5 Flash-8B Latest", + "description": "Alias that points to the most recent production (non-experimental) release of Gemini 1.5 Flash-8B, our smallest and most cost effective Flash model, released in October of 2024.", + "inputTokenLimit": 1000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "createCachedContent", + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash-8b-exp-0827", + "version": "001", + "displayName": "Gemini 1.5 Flash 8B Experimental 0827", + "description": "Experimental release (August 27th, 2024) of Gemini 1.5 Flash-8B, our smallest and most cost effective Flash model. Replaced by Gemini-1.5-flash-8b-001 (stable).", + "inputTokenLimit": 1000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-1.5-flash-8b-exp-0924", + "version": "001", + "displayName": "Gemini 1.5 Flash 8B Experimental 0924", + "description": "Experimental release (September 24th, 2024) of Gemini 1.5 Flash-8B, our smallest and most cost effective Flash model. Replaced by Gemini-1.5-flash-8b-001 (stable).", + "inputTokenLimit": 1000000, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.5-pro-exp-03-25", + "version": "2.5-exp-03-25", + "displayName": "Gemini 2.5 Pro Experimental 03-25", + "description": "Experimental release (March 25th, 2025) of Gemini 2.5 Pro", + "inputTokenLimit": 1048576, + "outputTokenLimit": 65536, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-exp", + "version": "2.0", + "displayName": "Gemini 2.0 Flash Experimental", + "description": "Gemini 2.0 Flash Experimental", + "inputTokenLimit": 1048576, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens", + "bidiGenerateContent" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash", + "version": "2.0", + "displayName": "Gemini 2.0 Flash", + "description": "Gemini 2.0 Flash", + "inputTokenLimit": 1048576, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-001", + "version": "2.0", + "displayName": "Gemini 2.0 Flash 001", + "description": "Stable version of Gemini 2.0 Flash, our fast and versatile multimodal model for scaling across diverse tasks, released in January of 2025.", + "inputTokenLimit": 1048576, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-exp-image-generation", + "version": "2.0", + "displayName": "Gemini 2.0 Flash (Image Generation) Experimental", + "description": "Gemini 2.0 Flash (Image Generation) Experimental", + "inputTokenLimit": 1048576, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens", + "bidiGenerateContent" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-lite-001", + "version": "2.0", + "displayName": "Gemini 2.0 Flash-Lite 001", + "description": "Stable version of Gemini 2.0 Flash Lite", + "inputTokenLimit": 1048576, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-lite", + "version": "2.0", + "displayName": "Gemini 2.0 Flash-Lite", + "description": "Gemini 2.0 Flash-Lite", + "inputTokenLimit": 1048576, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-lite-preview-02-05", + "version": "preview-02-05", + "displayName": "Gemini 2.0 Flash-Lite Preview 02-05", + "description": "Preview release (February 5th, 2025) of Gemini 2.0 Flash Lite", + "inputTokenLimit": 1048576, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-lite-preview", + "version": "preview-02-05", + "displayName": "Gemini 2.0 Flash-Lite Preview", + "description": "Preview release (February 5th, 2025) of Gemini 2.0 Flash Lite", + "inputTokenLimit": 1048576, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 40, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-pro-exp", + "version": "2.5-exp-03-25", + "displayName": "Gemini 2.0 Pro Experimental", + "description": "Experimental release (March 25th, 2025) of Gemini 2.5 Pro", + "inputTokenLimit": 1048576, + "outputTokenLimit": 65536, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-pro-exp-02-05", + "version": "2.5-exp-03-25", + "displayName": "Gemini 2.0 Pro Experimental 02-05", + "description": "Experimental release (March 25th, 2025) of Gemini 2.5 Pro", + "inputTokenLimit": 1048576, + "outputTokenLimit": 65536, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-exp-1206", + "version": "2.5-exp-03-25", + "displayName": "Gemini Experimental 1206", + "description": "Experimental release (March 25th, 2025) of Gemini 2.5 Pro", + "inputTokenLimit": 1048576, + "outputTokenLimit": 65536, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-thinking-exp-01-21", + "version": "2.0-exp-01-21", + "displayName": "Gemini 2.0 Flash Thinking Experimental 01-21", + "description": "Experimental release (January 21st, 2025) of Gemini 2.0 Flash Thinking", + "inputTokenLimit": 1048576, + "outputTokenLimit": 65536, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 0.7, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-thinking-exp", + "version": "2.0-exp-01-21", + "displayName": "Gemini 2.0 Flash Thinking Experimental 01-21", + "description": "Experimental release (January 21st, 2025) of Gemini 2.0 Flash Thinking", + "inputTokenLimit": 1048576, + "outputTokenLimit": 65536, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 0.7, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.0-flash-thinking-exp-1219", + "version": "2.0", + "displayName": "Gemini 2.0 Flash Thinking Experimental", + "description": "Gemini 2.0 Flash Thinking Experimental", + "inputTokenLimit": 1048576, + "outputTokenLimit": 65536, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 0.7, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/learnlm-1.5-pro-experimental", + "version": "001", + "displayName": "LearnLM 1.5 Pro Experimental", + "description": "Alias that points to the most recent stable version of Gemini 1.5 Pro, our mid-size multimodal model that supports up to 2 million tokens.", + "inputTokenLimit": 32767, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemma-3-4b-it", + "version": "001", + "displayName": "Gemma 3 4B", + "inputTokenLimit": 32768, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64 + }, + { + "name": "models/gemma-3-12b-it", + "version": "001", + "displayName": "Gemma 3 12B", + "inputTokenLimit": 32768, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64 + }, + { + "name": "models/gemma-3-27b-it", + "version": "001", + "displayName": "Gemma 3 27B", + "inputTokenLimit": 131072, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64 + }, + { + "name": "models/embedding-001", + "version": "001", + "displayName": "Embedding 001", + "description": "Obtain a distributed representation of a text.", + "inputTokenLimit": 2048, + "outputTokenLimit": 1, + "supportedGenerationMethods": [ + "embedContent" + ] + }, + { + "name": "models/text-embedding-004", + "version": "004", + "displayName": "Text Embedding 004", + "description": "Obtain a distributed representation of a text.", + "inputTokenLimit": 2048, + "outputTokenLimit": 1, + "supportedGenerationMethods": [ + "embedContent" + ] + }, + { + "name": "models/gemini-embedding-exp-03-07", + "version": "exp-03-07", + "displayName": "Gemini Embedding Experimental 03-07", + "description": "Obtain a distributed representation of a text.", + "inputTokenLimit": 8192, + "outputTokenLimit": 1, + "supportedGenerationMethods": [ + "embedContent" + ] + }, + { + "name": "models/gemini-embedding-exp", + "version": "exp-03-07", + "displayName": "Gemini Embedding Experimental", + "description": "Obtain a distributed representation of a text.", + "inputTokenLimit": 8192, + "outputTokenLimit": 1, + "supportedGenerationMethods": [ + "embedContent" + ] + }, + { + "name": "models/aqa", + "version": "001", + "displayName": "Model that performs Attributed Question Answering.", + "description": "Model trained to return answers to questions that are grounded in provided sources, along with estimating answerable probability.", + "inputTokenLimit": 7168, + "outputTokenLimit": 1024, + "supportedGenerationMethods": [ + "generateAnswer" + ], + "temperature": 0.2, + "topP": 1, + "topK": 40 + }, + { + "name": "models/imagen-3.0-generate-002", + "version": "002", + "displayName": "Imagen 3.0 002 model", + "description": "Vertex served Imagen 3.0 002 model", + "inputTokenLimit": 480, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "predict" + ] + } + ] + } + recorded_at: Wed, 02 Apr 2025 17:53:39 GMT +- request: + method: get + uri: https://api.deepseek.com/models + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Authorization: + - Bearer + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 02 Apr 2025 17:53:39 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Vary: + - origin, access-control-request-method, access-control-request-headers + Access-Control-Allow-Credentials: + - 'true' + X-Ds-Trace-Id: + - eb9c177a0c3141beac66e5213c60ac6a + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + X-Content-Type-Options: + - nosniff + Cf-Cache-Status: + - DYNAMIC + Set-Cookie: + - "" + Server: + - cloudflare + Cf-Ray: + - "" + body: + encoding: ASCII-8BIT + string: '{"object":"list","data":[{"id":"deepseek-chat","object":"model","owned_by":"deepseek"},{"id":"deepseek-reasoner","object":"model","owned_by":"deepseek"}]}' + recorded_at: Wed, 02 Apr 2025 17:53:39 GMT +- request: + method: get + uri: http://localhost:11434/api/tags + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Wed, 26 Mar 2025 17:18:38 GMT + Content-Length: + - '681' + body: + encoding: UTF-8 + string: '{"models":[{"name":"snowflake-arctic-embed:22m","model":"snowflake-arctic-embed:22m","modified_at":"2025-03-26T17:18:08.367580922Z","size":45838698,"digest":"bf75350e17522c7dfe63e98f50457b27fadcfee62f0c0767c1c86053407c2abb","details":{"parent_model":"","format":"gguf","family":"bert","families":["bert"],"parameter_size":"23M","quantization_level":"F16"}},{"name":"smollm:135m","model":"smollm:135m","modified_at":"2025-03-26T17:18:01.303574119Z","size":91739413,"digest":"b0b2a46174385c0adcaa77ff245ffeced5fc4a61447b6f221b2beb5c5a760133","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"134.52M","quantization_level":"Q4_0"}}]}' + recorded_at: Wed, 26 Mar 2025 17:18:38 GMT +- request: + method: get + uri: https://bedrock..amazonaws.com/foundation-models + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.12.2 + Host: + - bedrock..amazonaws.com + X-Amz-Date: + - 20250402T175339Z + X-Amz-Content-Sha256: + - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + Authorization: + - AWS4-HMAC-SHA256 Credential=/20250402//bedrock/aws4_request, + SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=5f69d324c05740f272e7c07046b973076335bd284cd150f03901ba9b30a62f4e + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" response: status: code: 200 message: OK headers: Date: - - Tue, 25 Mar 2025 17:14:59 GMT + - Wed, 02 Apr 2025 17:53:40 GMT Content-Type: - application/json Content-Length: - - '45249' + - '45253' Connection: - keep-alive X-Amzn-Requestid: - - '08c81519-bf5d-4c0f-8dad-e1fe0e12c7fa' + - 62d4de6c-de54-44b7-b02e-51731449128a body: encoding: UTF-8 - string: '{"modelSummaries":[{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-tg1-large","modelId":"amazon.titan-tg1-large","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Text Large","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-g1-text-02","modelId":"amazon.titan-embed-g1-text-02","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Text Embeddings v2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-lite-v1:0:4k","modelId":"amazon.titan-text-lite-v1:0:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-lite-v1","modelId":"amazon.titan-text-lite-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-express-v1:0:8k","modelId":"amazon.titan-text-express-v1:0:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-text-express-v1","modelId":"amazon.titan-text-express-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-pro-v1:0","modelId":"amazon.nova-pro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova - Pro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-lite-v1:0","modelId":"amazon.nova-lite-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.nova-micro-v1:0","modelId":"amazon.nova-micro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova - Micro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v1:2:8k","modelId":"amazon.titan-embed-text-v1:2:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v1","modelId":"amazon.titan-embed-text-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-text-v2:0","modelId":"amazon.titan-embed-text-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Text Embeddings V2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-image-v1:0","modelId":"amazon.titan-embed-image-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-embed-image-v1","modelId":"amazon.titan-embed-image-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v1:0","modelId":"amazon.titan-image-generator-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v1","modelId":"amazon.titan-image-generator-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED","ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.titan-image-generator-v2:0","modelId":"amazon.titan-image-generator-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan - Image Generator G1 v2","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/amazon.rerank-v1:0","modelId":"amazon.rerank-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank - 1.0","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-diffusion-xl-v1:0","modelId":"stability.stable-diffusion-xl-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL - 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-diffusion-xl-v1","modelId":"stability.stable-diffusion-xl-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL - 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.sd3-large-v1:0","modelId":"stability.sd3-large-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SD3 - Large 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.sd3-5-large-v1:0","modelId":"stability.sd3-5-large-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + string: '{"modelSummaries":[{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-tg1-large","modelId":"amazon.titan-tg1-large","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Large","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-embed-g1-text-02","modelId":"amazon.titan-embed-g1-text-02","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Embeddings v2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-text-lite-v1:0:4k","modelId":"amazon.titan-text-lite-v1:0:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-text-lite-v1","modelId":"amazon.titan-text-lite-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","CONTINUED_PRE_TRAINING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-text-express-v1:0:8k","modelId":"amazon.titan-text-express-v1:0:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-text-express-v1","modelId":"amazon.titan-text-express-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text G1 - Express","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.nova-pro-v1:0","modelId":"amazon.nova-pro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Pro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE","VIDEO"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.nova-lite-v1:0","modelId":"amazon.nova-lite-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Lite","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.nova-micro-v1:0","modelId":"amazon.nova-micro-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Nova + Micro","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-embed-text-v1:2:8k","modelId":"amazon.titan-embed-text-v1:2:8k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-embed-text-v1","modelId":"amazon.titan-embed-text-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Embeddings G1 - Text","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-embed-text-v2:0","modelId":"amazon.titan-embed-text-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Text Embeddings V2","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-embed-image-v1:0","modelId":"amazon.titan-embed-image-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-embed-image-v1","modelId":"amazon.titan-embed-image-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Multimodal Embeddings G1","outputModalities":["EMBEDDING"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-image-generator-v1:0","modelId":"amazon.titan-image-generator-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-image-generator-v1","modelId":"amazon.titan-image-generator-v1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED","ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-image-generator-v2:0","modelId":"amazon.titan-image-generator-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan + Image Generator G1 v2","outputModalities":["IMAGE"],"providerName":"Amazon","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.rerank-v1:0","modelId":"amazon.rerank-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank + 1.0","outputModalities":["TEXT"],"providerName":"Amazon","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/stability.stable-diffusion-xl-v1:0","modelId":"stability.stable-diffusion-xl-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL + 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/stability.stable-diffusion-xl-v1","modelId":"stability.stable-diffusion-xl-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"SDXL + 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/stability.sd3-large-v1:0","modelId":"stability.sd3-large-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"SD3 + Large 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/stability.sd3-5-large-v1:0","modelId":"stability.sd3-5-large-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable Diffusion 3.5 Large","outputModalities":["IMAGE"],"providerName":"Stability - AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-core-v1:0","modelId":"stability.stable-image-core-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable - Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-core-v1:1","modelId":"stability.stable-image-core-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable - Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-ultra-v1:0","modelId":"stability.stable-image-ultra-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable - Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/stability.stable-image-ultra-v1:1","modelId":"stability.stable-image-ultra-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable - Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0","modelId":"anthropic.claude-3-7-sonnet-20250219-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.7 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-haiku-20241022-v1:0","modelId":"anthropic.claude-3-5-haiku-20241022-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.5 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-instant-v1:2:100k","modelId":"anthropic.claude-instant-v1:2:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude - Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-instant-v1","modelId":"anthropic.claude-instant-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude - Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:0:18k","modelId":"anthropic.claude-v2:0:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:0:100k","modelId":"anthropic.claude-v2:0:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1:18k","modelId":"anthropic.claude-v2:1:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1:200k","modelId":"anthropic.claude-v2:1:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2:1","modelId":"anthropic.claude-v2:1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-v2","modelId":"anthropic.claude-v2","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:28k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:28k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude - 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:200k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude - 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0","modelId":"anthropic.claude-3-sonnet-20240229-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude - 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:48k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:48k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:200k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-haiku-20240307-v1:0","modelId":"anthropic.claude-3-haiku-20240307-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:12k","modelId":"anthropic.claude-3-opus-20240229-v1:0:12k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:28k","modelId":"anthropic.claude-3-opus-20240229-v1:0:28k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0:200k","modelId":"anthropic.claude-3-opus-20240229-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-opus-20240229-v1:0","modelId":"anthropic.claude-3-opus-20240229-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND","INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude - 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-text-v14:7:4k","modelId":"cohere.command-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-text-v14","modelId":"cohere.command-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-r-v1:0","modelId":"cohere.command-r-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command - R","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-r-plus-v1:0","modelId":"cohere.command-r-plus-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command - R+","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-light-text-v14:7:4k","modelId":"cohere.command-light-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command - Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.command-light-text-v14","modelId":"cohere.command-light-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command - Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-english-v3:0:512","modelId":"cohere.embed-english-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed - English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-english-v3","modelId":"cohere.embed-english-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed - English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-multilingual-v3:0:512","modelId":"cohere.embed-multilingual-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed - Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.embed-multilingual-v3","modelId":"cohere.embed-multilingual-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed - Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/cohere.rerank-v3-5:0","modelId":"cohere.rerank-v3-5:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank - 3.5","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/deepseek.r1-v1:0","modelId":"deepseek.r1-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"DeepSeek-R1","outputModalities":["TEXT"],"providerName":"DeepSeek","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-8b-instruct-v1:0","modelId":"meta.llama3-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-70b-instruct-v1:0","modelId":"meta.llama3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-8b-instruct-v1:0:128k","modelId":"meta.llama3-1-8b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-8b-instruct-v1:0","modelId":"meta.llama3-1-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-70b-instruct-v1:0:128k","modelId":"meta.llama3-1-70b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-70b-instruct-v1:0","modelId":"meta.llama3-1-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-1-405b-instruct-v1:0","modelId":"meta.llama3-1-405b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.1 405B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-11b-instruct-v1:0:128k","modelId":"meta.llama3-2-11b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-11b-instruct-v1:0","modelId":"meta.llama3-2-11b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-90b-instruct-v1:0:128k","modelId":"meta.llama3-2-90b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-90b-instruct-v1:0","modelId":"meta.llama3-2-90b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-1b-instruct-v1:0:128k","modelId":"meta.llama3-2-1b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-1b-instruct-v1:0","modelId":"meta.llama3-2-1b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-3b-instruct-v1:0:128k","modelId":"meta.llama3-2-3b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-2-3b-instruct-v1:0","modelId":"meta.llama3-2-3b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/meta.llama3-3-70b-instruct-v1:0","modelId":"meta.llama3-3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama - 3.3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-7b-instruct-v0:2","modelId":"mistral.mistral-7b-instruct-v0:2","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral - 7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mixtral-8x7b-instruct-v0:1","modelId":"mistral.mixtral-8x7b-instruct-v0:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mixtral - 8x7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-large-2402-v1:0","modelId":"mistral.mistral-large-2402-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral - Large (24.02)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/mistral.mistral-large-2407-v1:0","modelId":"mistral.mistral-large-2407-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral - Large (24.07)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:us-west-2::foundation-model/luma.ray-v2:0","modelId":"luma.ray-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Ray + AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/stability.stable-image-core-v1:0","modelId":"stability.stable-image-core-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable + Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/stability.stable-image-core-v1:1","modelId":"stability.stable-image-core-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Image Core 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/stability.stable-image-ultra-v1:0","modelId":"stability.stable-image-ultra-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Stable + Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/stability.stable-image-ultra-v1:1","modelId":"stability.stable-image-ultra-v1:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Stable + Image Ultra 1.0","outputModalities":["IMAGE"],"providerName":"Stability AI","responseStreamingSupported":null},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0","modelId":"anthropic.claude-3-5-sonnet-20241022-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet v2","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0","modelId":"anthropic.claude-3-7-sonnet-20250219-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.7 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":true},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-5-haiku-20241022-v1:0","modelId":"anthropic.claude-3-5-haiku-20241022-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-instant-v1:2:100k","modelId":"anthropic.claude-instant-v1:2:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-instant-v1","modelId":"anthropic.claude-instant-v1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + Instant","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-v2:0:18k","modelId":"anthropic.claude-v2:0:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-v2:0:100k","modelId":"anthropic.claude-v2:0:100k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-v2:1:18k","modelId":"anthropic.claude-v2:1:18k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-v2:1:200k","modelId":"anthropic.claude-v2:1:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-v2:1","modelId":"anthropic.claude-v2:1","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-v2","modelId":"anthropic.claude-v2","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:28k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:28k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:200k","modelId":"anthropic.claude-3-sonnet-20240229-v1:0:200k","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0","modelId":"anthropic.claude-3-sonnet-20240229-v1:0","modelLifecycle":{"status":"LEGACY"},"modelName":"Claude + 3 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:48k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:48k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:200k","modelId":"anthropic.claude-3-haiku-20240307-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-haiku-20240307-v1:0","modelId":"anthropic.claude-3-haiku-20240307-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Haiku","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-opus-20240229-v1:0:12k","modelId":"anthropic.claude-3-opus-20240229-v1:0:12k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-opus-20240229-v1:0:28k","modelId":"anthropic.claude-3-opus-20240229-v1:0:28k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-opus-20240229-v1:0:200k","modelId":"anthropic.claude-3-opus-20240229-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-opus-20240229-v1:0","modelId":"anthropic.claude-3-opus-20240229-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3 Opus","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:18k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:51k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0:200k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND","INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0","modelId":"anthropic.claude-3-5-sonnet-20240620-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Claude + 3.5 Sonnet","outputModalities":["TEXT"],"providerName":"Anthropic","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.command-text-v14:7:4k","modelId":"cohere.command-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.command-text-v14","modelId":"cohere.command-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.command-r-v1:0","modelId":"cohere.command-r-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + R","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.command-r-plus-v1:0","modelId":"cohere.command-r-plus-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + R+","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.command-light-text-v14:7:4k","modelId":"cohere.command-light-text-v14:7:4k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.command-light-text-v14","modelId":"cohere.command-light-text-v14","modelLifecycle":{"status":"ACTIVE"},"modelName":"Command + Light","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.embed-english-v3:0:512","modelId":"cohere.embed-english-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.embed-english-v3","modelId":"cohere.embed-english-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + English","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.embed-multilingual-v3:0:512","modelId":"cohere.embed-multilingual-v3:0:512","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.embed-multilingual-v3","modelId":"cohere.embed-multilingual-v3","modelLifecycle":{"status":"ACTIVE"},"modelName":"Embed + Multilingual","outputModalities":["EMBEDDING"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/cohere.rerank-v3-5:0","modelId":"cohere.rerank-v3-5:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Rerank + 3.5","outputModalities":["TEXT"],"providerName":"Cohere","responseStreamingSupported":false},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/deepseek.r1-v1:0","modelId":"deepseek.r1-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"DeepSeek-R1","outputModalities":["TEXT"],"providerName":"DeepSeek","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-8b-instruct-v1:0","modelId":"meta.llama3-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-70b-instruct-v1:0","modelId":"meta.llama3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-1-8b-instruct-v1:0:128k","modelId":"meta.llama3-1-8b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-1-8b-instruct-v1:0","modelId":"meta.llama3-1-8b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 8B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING","DISTILLATION"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-1-70b-instruct-v1:0:128k","modelId":"meta.llama3-1-70b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-1-70b-instruct-v1:0","modelId":"meta.llama3-1-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-1-405b-instruct-v1:0","modelId":"meta.llama3-1-405b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.1 405B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-2-11b-instruct-v1:0:128k","modelId":"meta.llama3-2-11b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-2-11b-instruct-v1:0","modelId":"meta.llama3-2-11b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 11B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-2-90b-instruct-v1:0:128k","modelId":"meta.llama3-2-90b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-2-90b-instruct-v1:0","modelId":"meta.llama3-2-90b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 90B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-2-1b-instruct-v1:0:128k","modelId":"meta.llama3-2-1b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-2-1b-instruct-v1:0","modelId":"meta.llama3-2-1b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 1B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":["FINE_TUNING"],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["PROVISIONED"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-2-3b-instruct-v1:0:128k","modelId":"meta.llama3-2-3b-instruct-v1:0:128k","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-2-3b-instruct-v1:0","modelId":"meta.llama3-2-3b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.2 3B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":true},"modelArn":"arn:aws:bedrock:::foundation-model/meta.llama3-3-70b-instruct-v1:0","modelId":"meta.llama3-3-70b-instruct-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Llama + 3.3 70B Instruct","outputModalities":["TEXT"],"providerName":"Meta","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/mistral.mistral-7b-instruct-v0:2","modelId":"mistral.mistral-7b-instruct-v0:2","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + 7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/mistral.mixtral-8x7b-instruct-v0:1","modelId":"mistral.mixtral-8x7b-instruct-v0:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mixtral + 8x7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/mistral.mistral-large-2402-v1:0","modelId":"mistral.mistral-large-2402-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + Large (24.02)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/mistral.mistral-large-2407-v1:0","modelId":"mistral.mistral-large-2407-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral + Large (24.07)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/luma.ray-v2:0","modelId":"luma.ray-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Ray v2","outputModalities":["VIDEO"],"providerName":"Luma AI","responseStreamingSupported":false}]}' - recorded_at: Tue, 25 Mar 2025 17:15:40 GMT + recorded_at: Wed, 02 Apr 2025 17:53:40 GMT recorded_with: VCR 6.3.1 From 45aaf1c8d5abccafc5b5e29bbc03c12607eed513 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 17 Apr 2025 10:14:30 -0300 Subject: [PATCH 47/55] HACK: manually add in gpt-4.1-nano to model list response After tests were changed to use `gpt-4.1-nano` in 7017dcf, these cassettes were not refreshed: - `spec/fixtures/vcr_cassettes/models_refresh_updates_models_and_returns_a_chainable_models_instance.yml` - `spec/fixtures/vcr_cassettes/models_refresh_works_as_a_class_method_too.yml` My branch does `models.refresh!` into a cassette named `spec/fixtures/vcr_cassettes/initial_model_refresh.yml` where I have been copying responses from the above original files, but right now I don't have the model list responses for the new `gpt-4.1-nano` ones and tests can't run with unknown models. The proper solution is to delete all these files then re-run the tests to get fresh data from each source, but meanwhile, this commit jury-rigs nano into the response. --- spec/fixtures/vcr_cassettes/initial_model_refresh.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml index 0741f946..00b0b732 100644 --- a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml +++ b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml @@ -464,6 +464,12 @@ http_interactions: "object": "model", "created": 1725648979, "owned_by": "system" + }, + { + "id": "gpt-4.1-nano", + "object": "model", + "created": 1725648979, + "owned_by": "system" } ] } From cafac0942854042a07d45879bbd57e1ff98062a6 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 17 Apr 2025 10:45:17 -0300 Subject: [PATCH 48/55] Use a low temperature for tool specs Llama-3.1 has trouble with tool usage with default temperatures; it will sometimes use available tools but most times it will opt not to and hallucinate instead, making the tests brittle. And lower temp mitigates this and will probably reflect real world usage anyway. --- spec/ruby_llm/chat_tools_spec.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spec/ruby_llm/chat_tools_spec.rb b/spec/ruby_llm/chat_tools_spec.rb index a00ac3ed..d9fb51df 100644 --- a/spec/ruby_llm/chat_tools_spec.rb +++ b/spec/ruby_llm/chat_tools_spec.rb @@ -43,6 +43,7 @@ def execute provider = RubyLLM::Models.provider_for(model).slug it "#{provider}/#{model} can use tools" do # rubocop:disable RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) + .with_temperature(0.1) .with_tool(Weather) response = chat.ask("What's the weather in Berlin? (52.5200, 13.4050)") @@ -55,6 +56,7 @@ def execute provider = RubyLLM::Models.provider_for(model).slug it "#{provider}/#{model} can use tools in multi-turn conversations" do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) + .with_temperature(0.1) .with_tool(Weather) response = chat.ask("What's the weather in Berlin? (52.5200, 13.4050)") @@ -79,7 +81,9 @@ def execute chat_models.each do |model| # rubocop:disable Style/CombinableLoops provider = RubyLLM::Models.provider_for(model).slug it "#{provider}/#{model} can use tools without parameters in multi-turn streaming conversations" do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations - chat = RubyLLM.chat(model: model).with_tool(BestLanguageToLearn) + chat = RubyLLM.chat(model: model) + .with_temperature(0.1) + .with_tool(BestLanguageToLearn) chunks = [] response = chat.ask("What's the best language to learn?") do |chunk| @@ -104,6 +108,7 @@ def execute provider = RubyLLM::Models.provider_for(model).slug it "#{provider}/#{model} can use tools with multi-turn streaming conversations" do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations chat = RubyLLM.chat(model: model) + .with_temperature(0.1) .with_tool(Weather) chunks = [] From 1667851cdb38e6ba4bcc79e8289d3bb9500a2797 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 17 Apr 2025 10:43:07 -0300 Subject: [PATCH 49/55] Refresh cassettes --- ...8b_can_handle_multi-turn_conversations.yml | 89 +++++++++------- ...ma3_1_8b_can_have_a_basic_conversation.yml | 10 +- ...ious_system_messages_when_replace_true.yml | 18 ++-- ...8b_successfully_uses_the_system_prompt.yml | 8 +- ...lling_ollama_llama3_1_8b_can_use_tools.yml | 18 ++-- ..._use_tools_in_multi-turn_conversations.yml | 52 ++++----- ...ith_multi-turn_streaming_conversations.yml | 52 +++++---- ..._1_8b_can_use_tools_without_parameters.yml | 31 +++--- ..._in_multi-turn_streaming_conversations.yml | 100 ++++++++++++------ ...ama3_1_8b_supports_streaming_responses.yml | 30 +++--- ...ite3_2-vision_2b_can_understand_images.yml | 13 ++- ...tic-embed_22m_can_handle_a_single_text.yml | 6 +- ...ic-embed_22m_can_handle_multiple_texts.yml | 6 +- 13 files changed, 233 insertions(+), 200 deletions(-) diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_handle_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_handle_multi-turn_conversations.yml index dd5b93b4..5be1f6a6 100644 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_handle_multi-turn_conversations.yml +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_handle_multi-turn_conversations.yml @@ -24,30 +24,34 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:22 GMT + - Thu, 17 Apr 2025 13:21:31 GMT Server: - Caddy Vary: - Accept-Encoding Content-Length: - - '1253' + - '1619' body: encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:22.619412823Z","message":{"role":"assistant","content":"The - creator of the Ruby programming language is Yukihiro Matsumoto, a Japanese - computer programmer. He began working on Ruby in 1993 and released the first - version, Ruby 1.0, in December 1995.\n\nMatsumoto, who is also known as \"Matz,\" - was born in 1960 in Nagoya, Japan. He studied computer science at Nagoya University - and later worked for several companies in Japan before starting his work on - Ruby.\n\nMatsumoto''s goal with Ruby was to create a language that combined - the features of Perl, Smalltalk, and Ada, which he considered the best aspects - of each language. He wanted to create a language that was easy to use, flexible, - and could be used for rapid development and prototyping.\n\nToday, Ruby is - widely used in web development, scripting, and other areas, thanks to its - simplicity, flexibility, and powerful libraries such as Rails. Matsumoto continues - to contribute to the Ruby community and is still involved with the language''s - development."},"done_reason":"stop","done":true,"total_duration":2083117838,"load_duration":15975913,"prompt_eval_count":17,"prompt_eval_duration":25655133,"eval_count":206,"eval_duration":2041201259}' - recorded_at: Fri, 11 Apr 2025 20:25:19 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:21:31.076435262Z","message":{"role":"assistant","content":"The + creator of the Ruby programming language is Yukihiro Matsumoto, also known + as \"Matz\". He is a Japanese computer programmer and software developer who + developed Ruby in the mid-1990s. Matsumoto''s goal was to create a language + that was more enjoyable to use than other languages available at the time, + with a focus on ease of use, simplicity, and flexibility.\n\nMatsumoto began + working on Ruby in 1993 while he was working for the Japanese telecommunications + company SGI (Silicon Graphics Inc.). He released the first version of Ruby, + known as \"Ruby 0.95,\" in December 1995. Over the years, Matsumoto continued + to develop and improve Ruby, releasing new versions and features.\n\nToday, + Ruby is a popular language used for web development, scripting, and other + applications, thanks in large part to its simplicity, ease of use, and flexibility. + The Ruby community has also developed numerous libraries and frameworks, such + as Rails (Ruby on Rails), which have helped to further establish Ruby''s position + as a major player in the programming world.\n\nYukihiro Matsumoto is still + involved with the Ruby project, but he has passed on the leadership role to + other developers within the community. Despite this, his legacy lives on through + the language itself and its widespread adoption by developers around the world!"},"done_reason":"stop","done":true,"total_duration":2662940512,"load_duration":14914899,"prompt_eval_count":17,"prompt_eval_duration":4056466,"eval_count":271,"eval_duration":2643548421}' + recorded_at: Thu, 17 Apr 2025 13:21:23 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -55,19 +59,24 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Who was the creator of Ruby?"},{"role":"assistant","content":"The creator of the Ruby - programming language is Yukihiro Matsumoto, a Japanese computer programmer. - He began working on Ruby in 1993 and released the first version, Ruby 1.0, - in December 1995.\n\nMatsumoto, who is also known as \"Matz,\" was born in - 1960 in Nagoya, Japan. He studied computer science at Nagoya University and - later worked for several companies in Japan before starting his work on Ruby.\n\nMatsumoto''s - goal with Ruby was to create a language that combined the features of Perl, - Smalltalk, and Ada, which he considered the best aspects of each language. - He wanted to create a language that was easy to use, flexible, and could be - used for rapid development and prototyping.\n\nToday, Ruby is widely used - in web development, scripting, and other areas, thanks to its simplicity, - flexibility, and powerful libraries such as Rails. Matsumoto continues to - contribute to the Ruby community and is still involved with the language''s - development."},{"role":"user","content":"What year did he create Ruby?"}],"options":{"temperature":0.7},"stream":false}' + programming language is Yukihiro Matsumoto, also known as \"Matz\". He is + a Japanese computer programmer and software developer who developed Ruby in + the mid-1990s. Matsumoto''s goal was to create a language that was more enjoyable + to use than other languages available at the time, with a focus on ease of + use, simplicity, and flexibility.\n\nMatsumoto began working on Ruby in 1993 + while he was working for the Japanese telecommunications company SGI (Silicon + Graphics Inc.). He released the first version of Ruby, known as \"Ruby 0.95,\" + in December 1995. Over the years, Matsumoto continued to develop and improve + Ruby, releasing new versions and features.\n\nToday, Ruby is a popular language + used for web development, scripting, and other applications, thanks in large + part to its simplicity, ease of use, and flexibility. The Ruby community has + also developed numerous libraries and frameworks, such as Rails (Ruby on Rails), + which have helped to further establish Ruby''s position as a major player + in the programming world.\n\nYukihiro Matsumoto is still involved with the + Ruby project, but he has passed on the leadership role to other developers + within the community. Despite this, his legacy lives on through the language + itself and its widespread adoption by developers around the world!"},{"role":"user","content":"What + year did he create Ruby?"}],"options":{"temperature":0.7},"stream":false}' headers: User-Agent: - Faraday v2.12.2 @@ -85,20 +94,22 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:23 GMT + - Thu, 17 Apr 2025 13:21:32 GMT Server: - Caddy Vary: - Accept-Encoding Content-Length: - - '697' + - '814' body: encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:23.592467715Z","message":{"role":"assistant","content":"Yukihiro - Matsumoto started working on Ruby in 1993, but it was first released in 1995 - under the name \"Ruby\" (although initially called \"Pearl\" before being - changed to avoid a trademark conflict with the company Gemstone Systems).\n\nHowever, - if you''re asking when he began conceptualizing and designing Ruby, that would - be around 1992-1993.\n\nThe first public release of Ruby was in December 1995."},"done_reason":"stop","done":true,"total_duration":969542955,"load_duration":14935414,"prompt_eval_count":239,"prompt_eval_duration":4486434,"eval_count":93,"eval_duration":949351502}' - recorded_at: Fri, 11 Apr 2025 20:25:20 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:21:32.445899232Z","message":{"role":"assistant","content":"Yukihiro + Matsumoto started working on Ruby in 1993, but it wasn''t released until December + 1995.\n\nHere''s a brief timeline:\n\n* 1993: Yukihiro Matsumoto begins working + on the language that will eventually become Ruby.\n* May 1995: The first public + version of Ruby is released, known as \"Ruby 0.95\".\n* December 1995: The + first official version of Ruby is released, known as \"Ruby 1.0\".\n\nSo, + while Matsumoto started working on the language in 1993, the first public + and official versions were released in 1995."},"done_reason":"stop","done":true,"total_duration":1365542477,"load_duration":14586907,"prompt_eval_count":304,"prompt_eval_duration":4233642,"eval_count":132,"eval_duration":1345840272}' + recorded_at: Thu, 17 Apr 2025 13:21:25 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_have_a_basic_conversation.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_have_a_basic_conversation.yml index a0c6f0ec..1b023fe7 100644 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_have_a_basic_conversation.yml +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_can_have_a_basic_conversation.yml @@ -22,16 +22,16 @@ http_interactions: message: OK headers: Content-Length: - - '310' + - '309' Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:24:03 GMT + - Thu, 17 Apr 2025 13:21:28 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:24:03.848130137Z","message":{"role":"assistant","content":"The - answer is: 4!"},"done_reason":"stop","done":true,"total_duration":132852925,"load_duration":18835949,"prompt_eval_count":18,"prompt_eval_duration":31501211,"eval_count":8,"eval_duration":82031197}' - recorded_at: Fri, 11 Apr 2025 20:24:00 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:21:28.409524352Z","message":{"role":"assistant","content":"The + answer is 4."},"done_reason":"stop","done":true,"total_duration":133443334,"load_duration":18094446,"prompt_eval_count":18,"prompt_eval_duration":34383870,"eval_count":7,"eval_duration":80424039}' + recorded_at: Thu, 17 Apr 2025 13:21:21 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_replaces_previous_system_messages_when_replace_true.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_replaces_previous_system_messages_when_replace_true.yml index 1b7aea84..b2429c45 100644 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_replaces_previous_system_messages_when_replace_true.yml +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_replaces_previous_system_messages_when_replace_true.yml @@ -25,16 +25,16 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:24:10 GMT + - Thu, 17 Apr 2025 13:21:36 GMT Server: - Caddy Vary: - Accept-Encoding Content-Length: - - '1169' + - '1168' body: encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:24:10.088054586Z","message":{"role":"assistant","content":"The + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:21:36.33027316Z","message":{"role":"assistant","content":"The weather! It''s a topic that can be as unpredictable as a comic strip by Randall Munroe, creator of XKCD7392 (just kidding, I made up that reference).\n\nBut seriously, the weather is a complex and dynamic system that can vary greatly @@ -46,8 +46,8 @@ http_interactions: local news or weather reports on TV or radio.\n3. Use a voice assistant like Siri, Google Assistant, or Alexa to get the latest weather updates.\n\nRemember to always check the forecast before heading out, especially if you have outdoor - plans!"},"done_reason":"stop","done":true,"total_duration":1855020675,"load_duration":14571739,"prompt_eval_count":39,"prompt_eval_duration":2653810,"eval_count":186,"eval_duration":1837339473}' - recorded_at: Fri, 11 Apr 2025 20:24:06 GMT + plans!"},"done_reason":"stop","done":true,"total_duration":1824917302,"load_duration":14499947,"prompt_eval_count":39,"prompt_eval_duration":2375885,"eval_count":186,"eval_duration":1807538871}' + recorded_at: Thu, 17 Apr 2025 13:21:28 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -85,7 +85,7 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:24:15 GMT + - Thu, 17 Apr 2025 13:21:41 GMT Server: - Caddy Vary: @@ -94,7 +94,7 @@ http_interactions: - chunked body: encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.144612445Z","message":{"role":"assistant","content":"There + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.318281426Z","message":{"role":"assistant","content":"There are so many great books out there, it''s hard to narrow it down. But I''ll give you a few recommendations across various genres:\n\n**Fiction**\n\n1. \"The Hitchhiker''s Guide to the Galaxy\" by Douglas Adams - A comedic science @@ -122,6 +122,6 @@ http_interactions: out there. But if you''re looking for something to get started, I hope this helps!\n\nAnd remember, when it comes to reading, the possibilities are as vast as the number of stars in the universe... or at least, that''s what I''d - like to think, but let''s be real, it''s probably more like PURPLE-ELEPHANT-42."},"done_reason":"stop","done":true,"total_duration":5052746637,"load_duration":14525916,"prompt_eval_count":243,"prompt_eval_duration":15682393,"eval_count":493,"eval_duration":5021731638}' - recorded_at: Fri, 11 Apr 2025 20:24:12 GMT + like to think, but let''s be real, it''s probably more like PURPLE-ELEPHANT-42."},"done_reason":"stop","done":true,"total_duration":4984403468,"load_duration":14465507,"prompt_eval_count":243,"prompt_eval_duration":15344322,"eval_count":493,"eval_duration":4953644966}' + recorded_at: Thu, 17 Apr 2025 13:21:33 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_successfully_uses_the_system_prompt.yml b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_successfully_uses_the_system_prompt.yml index 78a04b8a..6f920f9e 100644 --- a/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_successfully_uses_the_system_prompt.yml +++ b/spec/fixtures/vcr_cassettes/chat_basic_chat_functionality_ollama_llama3_1_8b_successfully_uses_the_system_prompt.yml @@ -25,7 +25,7 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:24:08 GMT + - Thu, 17 Apr 2025 13:21:34 GMT Server: - Caddy Vary: @@ -34,7 +34,7 @@ http_interactions: - '1281' body: encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:24:08.228024187Z","message":{"role":"assistant","content":"The + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:21:34.500412523Z","message":{"role":"assistant","content":"The weather! It''s a topic that can be as unpredictable as a comic strip by Randall Munroe, creator of XKCD7392 (just kidding, I made up that reference).\n\nBut seriously, the weather is a complex and dynamic system that can vary greatly @@ -47,6 +47,6 @@ http_interactions: broadcasts or radio stations.\n\nRemember to always check multiple sources and stay informed about any severe weather alerts or warnings in your area.\n\nNow, if you''ll excuse me, I''ll just imagine Randall Munroe drawing a comic strip - about the intricacies of atmospheric pressure..."},"done_reason":"stop","done":true,"total_duration":2067130923,"load_duration":14476194,"prompt_eval_count":39,"prompt_eval_duration":4965316,"eval_count":207,"eval_duration":2047250270}' - recorded_at: Fri, 11 Apr 2025 20:24:05 GMT + about the intricacies of atmospheric pressure..."},"done_reason":"stop","done":true,"total_duration":2048993472,"load_duration":14479154,"prompt_eval_count":39,"prompt_eval_duration":4683092,"eval_count":207,"eval_duration":2029345368}' + recorded_at: Thu, 17 Apr 2025 13:21:27 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools.yml index 715c20e7..a3f66de5 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -29,13 +29,13 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:56 GMT + - Thu, 17 Apr 2025 13:50:55 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:56.847264344Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":381909743,"load_duration":15162341,"prompt_eval_count":205,"prompt_eval_duration":41158913,"eval_count":28,"eval_duration":325264197}' - recorded_at: Fri, 11 Apr 2025 20:25:53 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:50:55.745468331Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":383071572,"load_duration":19081648,"prompt_eval_count":205,"prompt_eval_duration":54017577,"eval_count":28,"eval_duration":309345743}' + recorded_at: Thu, 17 Apr 2025 13:50:48 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -43,7 +43,7 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -62,16 +62,16 @@ http_interactions: message: OK headers: Content-Length: - - '405' + - '412' Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:57 GMT + - Thu, 17 Apr 2025 13:50:56 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6NTcuMTMxODQ4MDU0WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlZCB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyB3aXRoIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6MjgxMjA1MTY3LCJsb2FkX2R1cmF0aW9uIjoxNDkxODI4MSwicHJvbXB0X2V2YWxfY291bnQiOjExMiwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjY1OTczMDYsImV2YWxfY291bnQiOjI2LCJldmFsX2R1cmF0aW9uIjoyNTkxMTMwMTR9 - recorded_at: Fri, 11 Apr 2025 20:25:53 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTdUMTM6NTA6NTYuMDQ0ODA0MDA2WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5NTYzMTM5OSwibG9hZF9kdXJhdGlvbiI6MTQ1NTA2MzksInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo2MjQzNDE4LCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6Mjc0MjExNjk3fQ== + recorded_at: Thu, 17 Apr 2025 13:50:48 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml index c59971ae..85162135 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_in_multi-turn_conversations.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -25,17 +25,17 @@ http_interactions: message: OK headers: Content-Length: - - '400' + - '399' Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:24 GMT + - Thu, 17 Apr 2025 13:50:56 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:24.527590336Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":329015521,"load_duration":15026522,"prompt_eval_count":205,"prompt_eval_duration":10145164,"eval_count":28,"eval_duration":303403570}' - recorded_at: Fri, 11 Apr 2025 20:25:21 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:50:56.396537843Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done_reason":"stop","done":true,"total_duration":320659214,"load_duration":14936541,"prompt_eval_count":205,"prompt_eval_duration":9869701,"eval_count":28,"eval_duration":295251188}' + recorded_at: Thu, 17 Apr 2025 13:50:49 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -43,7 +43,7 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -62,18 +62,18 @@ http_interactions: message: OK headers: Content-Length: - - '401' + - '413' Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:24 GMT + - Thu, 17 Apr 2025 13:50:56 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6MjQuODI2MTYxNjA2WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJCYXNlZCBvbiB0aGUgdG9vbCBjYWxsIHJlc3BvbnNlLCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBpbiBCZXJsaW4gaXMgMTXCsEMgYW5kIHRoZSB3aW5kIHNwZWVkIGlzIDEwIGttL2guIn0sImRvbmVfcmVhc29uIjoic3RvcCIsImRvbmUiOnRydWUsInRvdGFsX2R1cmF0aW9uIjoyOTQ3NjU1MDYsImxvYWRfZHVyYXRpb24iOjE2NzE0MTk1LCJwcm9tcHRfZXZhbF9jb3VudCI6MTEyLCJwcm9tcHRfZXZhbF9kdXJhdGlvbiI6NjI2MjgyOSwiZXZhbF9jb3VudCI6MjcsImV2YWxfZHVyYXRpb24iOjI3MTE4OTEwNn0= - recorded_at: Fri, 11 Apr 2025 20:25:21 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTdUMTM6NTA6NTYuNjk2MTAzMTI1WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUgaXMgYSB3aW5kIHNwZWVkIG9mIDEwIGttL2guIn0sImRvbmVfcmVhc29uIjoic3RvcCIsImRvbmUiOnRydWUsInRvdGFsX2R1cmF0aW9uIjoyOTYxODQ1ODYsImxvYWRfZHVyYXRpb24iOjE0NDgzMjMzLCJwcm9tcHRfZXZhbF9jb3VudCI6MTEyLCJwcm9tcHRfZXZhbF9kdXJhdGlvbiI6NjI1OTMzNSwiZXZhbF9jb3VudCI6MjgsImV2YWxfZHVyYXRpb24iOjI3NDcwMzQ4Nn0= + recorded_at: Thu, 17 Apr 2025 13:50:49 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -81,10 +81,10 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"Based - on the tool call response, the current temperature in Berlin is 15°C and the - wind speed is 10 km/h."},{"role":"user","content":"What''s the weather in - Paris? (48.8575, 2.3514)"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The + tool call response indicates that the current temperature in Berlin is 15°C + and there is a wind speed of 10 km/h."},{"role":"user","content":"What''s + the weather in Paris? (48.8575, 2.3514)"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -107,13 +107,13 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:25 GMT + - Thu, 17 Apr 2025 13:50:57 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:25.168651652Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done_reason":"stop","done":true,"total_duration":338662575,"load_duration":14553272,"prompt_eval_count":296,"prompt_eval_duration":11999377,"eval_count":28,"eval_duration":311031157}' - recorded_at: Fri, 11 Apr 2025 20:25:22 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:50:57.038039661Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done_reason":"stop","done":true,"total_duration":338601534,"load_duration":22181811,"prompt_eval_count":297,"prompt_eval_duration":10789638,"eval_count":28,"eval_duration":304421153}' + recorded_at: Thu, 17 Apr 2025 13:50:49 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -121,11 +121,11 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"Based - on the tool call response, the current temperature in Berlin is 15°C and the - wind speed is 10 km/h."},{"role":"user","content":"What''s the weather in - Paris? (48.8575, 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The + tool call response indicates that the current temperature in Berlin is 15°C + and there is a wind speed of 10 km/h."},{"role":"user","content":"What''s + the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current + weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":false,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -144,16 +144,16 @@ http_interactions: message: OK headers: Content-Length: - - '399' + - '412' Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:25 GMT + - Thu, 17 Apr 2025 13:50:57 GMT Server: - Caddy body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6MjUuNDY4MDgyMjdaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6IkJhc2VkIG9uIHRoZSB0b29sIGNhbGwgcmVzcG9uc2UsIHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGUgd2luZCBzcGVlZCBpcyAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6Mjk2MDE3MTQyLCJsb2FkX2R1cmF0aW9uIjoxNDY0NzM5OSwicHJvbXB0X2V2YWxfY291bnQiOjIwMywicHJvbXB0X2V2YWxfZHVyYXRpb24iOjY0MjUxOTYsImV2YWxfY291bnQiOjI3LCJldmFsX2R1cmF0aW9uIjoyNzM2OTY3MzZ9 - recorded_at: Fri, 11 Apr 2025 20:25:22 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTdUMTM6NTA6NTcuMzQzOTc5NTgxWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSBpcyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjMwMjY1MDk5MSwibG9hZF9kdXJhdGlvbiI6MTQ4OTg4MzgsInByb21wdF9ldmFsX2NvdW50IjoyMDQsInByb21wdF9ldmFsX2R1cmF0aW9uIjo2NDc5NjQzLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6Mjc5NDY3NTkxfQ== + recorded_at: Thu, 17 Apr 2025 13:50:49 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml index 6c3721aa..155d4742 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_with_multi-turn_streaming_conversations.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + the weather in Berlin? (52.5200, 13.4050)"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -27,7 +27,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Fri, 11 Apr 2025 20:25:28 GMT + - Thu, 17 Apr 2025 13:53:54 GMT Server: - Caddy Transfer-Encoding: @@ -35,9 +35,9 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:28.754929242Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:28.764752046Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":334869516,"load_duration":15995280,"prompt_eval_count":205,"prompt_eval_duration":10124579,"eval_count":28,"eval_duration":308426498} - recorded_at: Fri, 11 Apr 2025 20:25:25 GMT + {"model":"llama3.1:8b","created_at":"2025-04-17T13:53:54.356258926Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"52.5200","longitude":"13.4050"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:53:54.366147488Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":361042362,"load_duration":14909755,"prompt_eval_count":205,"prompt_eval_duration":34977424,"eval_count":28,"eval_duration":310642005} + recorded_at: Thu, 17 Apr 2025 13:53:46 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -45,7 +45,7 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -66,7 +66,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Fri, 11 Apr 2025 20:25:29 GMT + - Thu, 17 Apr 2025 13:53:54 GMT Server: - Caddy Transfer-Encoding: @@ -74,8 +74,8 @@ http_interactions: body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6MjkuMzQ5ODE4ODUyWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiIgVG9vbCBjYWxsIG91dHB1dCB1c2VkIHRvIGFuc3dlcjogXG4gQ3VycmVudCB3ZWF0aGVyIGF0IEJlcmxpbiAoNTIuNTIwMMKwIE4sIDEzLjQwNTDCsCBFKTogTGlnaHQgQ2xvdWQsIDU5wrBGIC8gMTXCsEMgd2l0aCBhIGdlbnRsZSBicmVlemUgb2YgNiBtcGggKDEwIGttL2gpIGZyb20gdGhlIFNTRS4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjU4MTU1NTg2MSwibG9hZF9kdXJhdGlvbiI6MTQ3NjcxOTgsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo2MDg3NDczLCJldmFsX2NvdW50Ijo1NiwiZXZhbF9kdXJhdGlvbiI6NTYwMDc4OTQ2fQo= - recorded_at: Fri, 11 Apr 2025 20:25:26 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTdUMTM6NTM6NTQuNjY3ODg3MjgzWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIEJlcmxpbiBpcyAxNcKwQyBhbmQgdGhlcmUncyBhIHdpbmQgc3BlZWQgb2YgMTAga20vaC4ifSwiZG9uZV9yZWFzb24iOiJzdG9wIiwiZG9uZSI6dHJ1ZSwidG90YWxfZHVyYXRpb24iOjI5Nzk3NTgzMCwibG9hZF9kdXJhdGlvbiI6MTUxMTUyODMsInByb21wdF9ldmFsX2NvdW50IjoxMTIsInByb21wdF9ldmFsX2R1cmF0aW9uIjo1ODc1NTIyLCJldmFsX2NvdW50IjoyOCwiZXZhbF9kdXJhdGlvbiI6Mjc2Mzc0OTk0fQo= + recorded_at: Thu, 17 Apr 2025 13:53:47 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -83,11 +83,10 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":" - Tool call output used to answer: \n Current weather at Berlin (52.5200° N, - 13.4050° E): Light Cloud, 59°F / 15°C with a gentle breeze of 6 mph (10 km/h) - from the SSE."},{"role":"user","content":"What''s the weather in Paris? (48.8575, - 2.3514)"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The + tool call response indicates that the current temperature in Berlin is 15°C + and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s + the weather in Paris? (48.8575, 2.3514)"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -108,7 +107,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Fri, 11 Apr 2025 20:25:29 GMT + - Thu, 17 Apr 2025 13:53:54 GMT Server: - Caddy Transfer-Encoding: @@ -116,9 +115,9 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:29.683144042Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:29.693314795Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":339669240,"load_duration":14602372,"prompt_eval_count":325,"prompt_eval_duration":12643651,"eval_count":28,"eval_duration":311308989} - recorded_at: Fri, 11 Apr 2025 20:25:26 GMT + {"model":"llama3.1:8b","created_at":"2025-04-17T13:53:54.990726495Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"weather","arguments":{"latitude":"48.8575","longitude":"2.3514"}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:53:55.000798628Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":329360343,"load_duration":14728417,"prompt_eval_count":297,"prompt_eval_duration":11340103,"eval_count":28,"eval_duration":302108158} + recorded_at: Thu, 17 Apr 2025 13:53:47 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -126,12 +125,11 @@ http_interactions: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s the weather in Berlin? (52.5200, 13.4050)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":" - Tool call output used to answer: \n Current weather at Berlin (52.5200° N, - 13.4050° E): Light Cloud, 59°F / 15°C with a gentle breeze of 6 mph (10 km/h) - from the SSE."},{"role":"user","content":"What''s the weather in Paris? (48.8575, - 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current - weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets + weather at 52.5200, 13.4050: 15°C, Wind: 10 km/h"},{"role":"assistant","content":"The + tool call response indicates that the current temperature in Berlin is 15°C + and there''s a wind speed of 10 km/h."},{"role":"user","content":"What''s + the weather in Paris? (48.8575, 2.3514)"},{"role":"assistant","content":null},{"role":"tool","content":"Current + weather at 48.8575, 2.3514: 15°C, Wind: 10 km/h"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"weather","description":"Gets current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude (e.g., 52.5200)"},"longitude":{"type":"string","description":"Longitude (e.g., 13.4050)"}},"required":["latitude","longitude"]}}}]}' @@ -152,7 +150,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Fri, 11 Apr 2025 20:25:30 GMT + - Thu, 17 Apr 2025 13:53:55 GMT Server: - Caddy Transfer-Encoding: @@ -160,6 +158,6 @@ http_interactions: body: encoding: ASCII-8BIT string: !binary |- - eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTFUMjA6MjU6MzAuMjc3MjM1NjYxWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUb29sIGNhbGwgb3V0cHV0IHVzZWQgdG8gYW5zd2VyOlxuIEN1cnJlbnQgd2VhdGhlciBhdCBQYXJpcyAoNDguODU2N8KwIE4sIDIuMjk0NcKwIEUpOiBMaWdodCBDbG91ZCwgNTnCsEYgLyAxNcKwQyB3aXRoIGEgZ2VudGxlIGJyZWV6ZSBvZiA2IG1waCAoMTAga20vaCkgZnJvbSB0aGUgU1NFLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6NTgwMTc4OTk2LCJsb2FkX2R1cmF0aW9uIjoxNTEzOTk4NSwicHJvbXB0X2V2YWxfY291bnQiOjIzMiwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjY4MjQ0ODQsImV2YWxfY291bnQiOjU1LCJldmFsX2R1cmF0aW9uIjo1NTcxMTA2ODh9Cg== - recorded_at: Fri, 11 Apr 2025 20:25:27 GMT + eyJtb2RlbCI6ImxsYW1hMy4xOjhiIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDQtMTdUMTM6NTM6NTUuMzA2NzQ5ODQyWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiJUaGUgdG9vbCBjYWxsIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGluIFBhcmlzIGlzIDE1wrBDIGFuZCB0aGVyZSdzIGEgd2luZCBzcGVlZCBvZiAxMCBrbS9oLiJ9LCJkb25lX3JlYXNvbiI6InN0b3AiLCJkb25lIjp0cnVlLCJ0b3RhbF9kdXJhdGlvbiI6MzAxODg0OTYyLCJsb2FkX2R1cmF0aW9uIjoxNTEwMDY4OSwicHJvbXB0X2V2YWxfY291bnQiOjIwNCwicHJvbXB0X2V2YWxfZHVyYXRpb24iOjU4NzAzNDksImV2YWxfY291bnQiOjI4LCJldmFsX2R1cmF0aW9uIjoyNzk2OTU3MzB9Cg== + recorded_at: Thu, 17 Apr 2025 13:53:47 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters.yml index a4661058..a155ea11 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters.yml @@ -23,17 +23,17 @@ http_interactions: message: OK headers: Content-Length: - - '371' + - '372' Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:25 GMT + - Thu, 17 Apr 2025 13:50:57 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:25.67535401Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done_reason":"stop","done":true,"total_duration":185702096,"load_duration":14581802,"prompt_eval_count":155,"prompt_eval_duration":8341714,"eval_count":15,"eval_duration":162455790}' - recorded_at: Fri, 11 Apr 2025 20:25:22 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:50:57.548572396Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done_reason":"stop","done":true,"total_duration":182779672,"load_duration":14595985,"prompt_eval_count":155,"prompt_eval_duration":7843717,"eval_count":15,"eval_duration":159900899}' + recorded_at: Thu, 17 Apr 2025 13:50:50 GMT - request: method: post uri: http://localhost:11434/api/chat @@ -59,25 +59,20 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:25:27 GMT + - Thu, 17 Apr 2025 13:50:58 GMT Server: - Caddy Vary: - Accept-Encoding Content-Length: - - '1043' + - '626' body: encoding: ASCII-8BIT - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.098095205Z","message":{"role":"assistant","content":"The - output suggests that Ruby is one of the top languages recommended for learning, - but it doesn''t provide an exhaustive list. \n\nHere are some other top programming - languages that are commonly used and in-demand:\n1. Python: Known for its - simplicity, versatility, and large community.\n2. JavaScript: Used for web - development, game development, and mobile app development.\n3. Java: A popular - language for Android app development, web development, and enterprise software - development.\n4. C++: A high-performance language used in systems programming, - game development, and other applications that require direct hardware manipulation.\n\nThe - best language to learn depends on your goals, interests, and the type of projects - you want to work on."},"done_reason":"stop","done":true,"total_duration":1418644485,"load_duration":15145034,"prompt_eval_count":77,"prompt_eval_duration":4868578,"eval_count":142,"eval_duration":1398040040}' - recorded_at: Fri, 11 Apr 2025 20:25:23 GMT + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:50:58.142764068Z","message":{"role":"assistant","content":"The + tool suggests that Ruby is often considered one of the most versatile and + easy-to-learn programming languages, making it an excellent choice for beginners. + Its simplicity and readability make it a great language for those new to programming, + while its power and flexibility also make it suitable for more experienced + developers."},"done_reason":"stop","done":true,"total_duration":590720997,"load_duration":18387094,"prompt_eval_count":77,"prompt_eval_duration":4375877,"eval_count":59,"eval_duration":567375704}' + recorded_at: Thu, 17 Apr 2025 13:50:50 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters_in_multi-turn_streaming_conversations.yml b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters_in_multi-turn_streaming_conversations.yml index 7e14a00d..b253488b 100644 --- a/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters_in_multi-turn_streaming_conversations.yml +++ b/spec/fixtures/vcr_cassettes/chat_function_calling_ollama_llama3_1_8b_can_use_tools_without_parameters_in_multi-turn_streaming_conversations.yml @@ -6,7 +6,7 @@ http_interactions: body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the best language to learn?"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn?"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' headers: User-Agent: @@ -25,7 +25,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Fri, 11 Apr 2025 20:25:27 GMT + - Thu, 17 Apr 2025 13:50:58 GMT Server: - Caddy Transfer-Encoding: @@ -33,16 +33,16 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.315789926Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.325514651Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":185235270,"load_duration":15163241,"prompt_eval_count":155,"prompt_eval_duration":7878737,"eval_count":15,"eval_duration":161808281} - recorded_at: Fri, 11 Apr 2025 20:25:24 GMT + {"model":"llama3.1:8b","created_at":"2025-04-17T13:50:58.362103875Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:50:58.37167292Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":185981356,"load_duration":18824382,"prompt_eval_count":155,"prompt_eval_duration":8264856,"eval_count":15,"eval_duration":158476918} + recorded_at: Thu, 17 Apr 2025 13:50:50 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' headers: User-Agent: @@ -61,33 +61,53 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Fri, 11 Apr 2025 20:25:27 GMT + - Thu, 17 Apr 2025 13:51:00 GMT Server: - Caddy Transfer-Encoding: - chunked body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.7992387Z","message":{"role":"assistant","content":"This - was determined by using a tool that analyzed various programming languages - and their uses. The results showed that Ruby is currently one of the most - in-demand and versatile languages, making it an excellent choice for beginners - and experienced developers alike."},"done_reason":"stop","done":true,"total_duration":470215206,"load_duration":14776780,"prompt_eval_count":77,"prompt_eval_duration":4597457,"eval_count":46,"eval_duration":450213396} + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:51:00.438423432Z","message":{"role":"assistant","content":"The + best language to learn is often subjective and depends on personal goals, + interests, and career aspirations. However, based on various sources and industry + trends, I would recommend Ruby as a great language to start with.\n\nHere''s + why:\n\n1. **Easy to read and write**: Ruby has a clean syntax that makes + it easy for beginners to understand and learn.\n2. **Versatile**: Ruby can + be used for web development (with frameworks like Ruby on Rails), scripting, + testing, and even system administration.\n3. **Large community**: Ruby has + an active and supportive community, with many resources available online, + including documentation, tutorials, and forums.\n4. **Job prospects**: Knowledge + of Ruby is in demand, especially in the web development industry.\n\nOf course, + there are other great languages to learn as well, such as Python, JavaScript, + Java, and C++. Ultimately, the best language for you will depend on your specific + goals and interests.\n\nWould you like me to suggest some resources to get + started with Ruby?"},"done_reason":"stop","done":true,"total_duration":2063456322,"load_duration":14397187,"prompt_eval_count":77,"prompt_eval_duration":4475905,"eval_count":208,"eval_duration":2043982407} ' - recorded_at: Fri, 11 Apr 2025 20:25:24 GMT + recorded_at: Thu, 17 Apr 2025 13:50:53 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"},{"role":"assistant","content":"This - was determined by using a tool that analyzed various programming languages - and their uses. The results showed that Ruby is currently one of the most - in-demand and versatile languages, making it an excellent choice for beginners - and experienced developers alike."},{"role":"user","content":"Tell me again: - what''s the best language to learn?"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"},{"role":"assistant","content":"The + best language to learn is often subjective and depends on personal goals, + interests, and career aspirations. However, based on various sources and industry + trends, I would recommend Ruby as a great language to start with.\n\nHere''s + why:\n\n1. **Easy to read and write**: Ruby has a clean syntax that makes + it easy for beginners to understand and learn.\n2. **Versatile**: Ruby can + be used for web development (with frameworks like Ruby on Rails), scripting, + testing, and even system administration.\n3. **Large community**: Ruby has + an active and supportive community, with many resources available online, + including documentation, tutorials, and forums.\n4. **Job prospects**: Knowledge + of Ruby is in demand, especially in the web development industry.\n\nOf course, + there are other great languages to learn as well, such as Python, JavaScript, + Java, and C++. Ultimately, the best language for you will depend on your specific + goals and interests.\n\nWould you like me to suggest some resources to get + started with Ruby?"},{"role":"user","content":"Tell me again: what''s the + best language to learn?"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' headers: User-Agent: @@ -106,7 +126,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Fri, 11 Apr 2025 20:25:27 GMT + - Thu, 17 Apr 2025 13:51:00 GMT Server: - Caddy Transfer-Encoding: @@ -114,21 +134,31 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.986550241Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:25:27.996688354Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":193925963,"load_duration":14787489,"prompt_eval_count":234,"prompt_eval_duration":8799661,"eval_count":15,"eval_duration":169210924} - recorded_at: Fri, 11 Apr 2025 20:25:24 GMT + {"model":"llama3.1:8b","created_at":"2025-04-17T13:51:00.627921622Z","message":{"role":"assistant","content":"","tool_calls":[{"function":{"name":"best_language_to_learn","arguments":{}}}]},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:51:00.638002163Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":194695887,"load_duration":15619587,"prompt_eval_count":396,"prompt_eval_duration":8968113,"eval_count":15,"eval_duration":168794152} + recorded_at: Thu, 17 Apr 2025 13:50:53 GMT - request: method: post uri: http://localhost:11434/api/chat body: encoding: UTF-8 string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"What''s - the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"},{"role":"assistant","content":"This - was determined by using a tool that analyzed various programming languages - and their uses. The results showed that Ruby is currently one of the most - in-demand and versatile languages, making it an excellent choice for beginners - and experienced developers alike."},{"role":"user","content":"Tell me again: - what''s the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.7},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets + the best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"},{"role":"assistant","content":"The + best language to learn is often subjective and depends on personal goals, + interests, and career aspirations. However, based on various sources and industry + trends, I would recommend Ruby as a great language to start with.\n\nHere''s + why:\n\n1. **Easy to read and write**: Ruby has a clean syntax that makes + it easy for beginners to understand and learn.\n2. **Versatile**: Ruby can + be used for web development (with frameworks like Ruby on Rails), scripting, + testing, and even system administration.\n3. **Large community**: Ruby has + an active and supportive community, with many resources available online, + including documentation, tutorials, and forums.\n4. **Job prospects**: Knowledge + of Ruby is in demand, especially in the web development industry.\n\nOf course, + there are other great languages to learn as well, such as Python, JavaScript, + Java, and C++. Ultimately, the best language for you will depend on your specific + goals and interests.\n\nWould you like me to suggest some resources to get + started with Ruby?"},{"role":"user","content":"Tell me again: what''s the + best language to learn?"},{"role":"assistant","content":null},{"role":"tool","content":"Ruby"}],"options":{"temperature":0.1},"stream":true,"tools":[{"type":"function","function":{"name":"best_language_to_learn","description":"Gets the best language to learn","parameters":{"type":"object","properties":{},"required":[]}}}]}' headers: User-Agent: @@ -147,18 +177,18 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Fri, 11 Apr 2025 20:25:28 GMT + - Thu, 17 Apr 2025 13:51:01 GMT Server: - Caddy Transfer-Encoding: - chunked body: encoding: UTF-8 - string: '{"model":"llama3.1:8b","created_at":"2025-04-11T20:25:28.38537108Z","message":{"role":"assistant","content":"The - tool analysis still shows that Ruby is a top contender among programming languages - due to its simplicity, flexibility, and wide range of applications, making - it an excellent choice for learning."},"done_reason":"stop","done":true,"total_duration":384856281,"load_duration":14473706,"prompt_eval_count":156,"prompt_eval_duration":5059295,"eval_count":36,"eval_duration":364120261} + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T13:51:01.11680937Z","message":{"role":"assistant","content":"The + output from my previous response still stands. Based on various sources and + industry trends, I would recommend Ruby as a great language to start with + due to its ease of use, versatility, large community, and job prospects."},"done_reason":"stop","done":true,"total_duration":475213661,"load_duration":14607441,"prompt_eval_count":318,"prompt_eval_duration":5120220,"eval_count":45,"eval_duration":453843079} ' - recorded_at: Fri, 11 Apr 2025 20:25:25 GMT + recorded_at: Thu, 17 Apr 2025 13:50:53 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_supports_streaming_responses.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_supports_streaming_responses.yml index f7d0d65f..4fbd583f 100644 --- a/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_supports_streaming_responses.yml +++ b/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_supports_streaming_responses.yml @@ -24,7 +24,7 @@ http_interactions: Content-Type: - application/x-ndjson Date: - - Fri, 11 Apr 2025 20:24:15 GMT + - Thu, 17 Apr 2025 13:21:41 GMT Server: - Caddy Transfer-Encoding: @@ -32,18 +32,18 @@ http_interactions: body: encoding: UTF-8 string: | - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.193952052Z","message":{"role":"assistant","content":"Here"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.205661714Z","message":{"role":"assistant","content":" it"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.214701178Z","message":{"role":"assistant","content":" goes"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.223829155Z","message":{"role":"assistant","content":":\n\n"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.23287118Z","message":{"role":"assistant","content":"1"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.242017149Z","message":{"role":"assistant","content":","},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.251300012Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.260657388Z","message":{"role":"assistant","content":"2"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.269916027Z","message":{"role":"assistant","content":","},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.279318375Z","message":{"role":"assistant","content":" "},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.288601803Z","message":{"role":"assistant","content":"3"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.297983455Z","message":{"role":"assistant","content":"!"},"done":false} - {"model":"llama3.1:8b","created_at":"2025-04-11T20:24:15.307439815Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":144697142,"load_duration":14437554,"prompt_eval_count":17,"prompt_eval_duration":4078794,"eval_count":13,"eval_duration":125760297} - recorded_at: Fri, 11 Apr 2025 20:24:12 GMT + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.370484158Z","message":{"role":"assistant","content":"Here"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.382068257Z","message":{"role":"assistant","content":" it"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.390947368Z","message":{"role":"assistant","content":" goes"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.399780196Z","message":{"role":"assistant","content":":\n\n"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.40865172Z","message":{"role":"assistant","content":"1"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.417773983Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.426849961Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.436046078Z","message":{"role":"assistant","content":"2"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.44526569Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.454503107Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.463766026Z","message":{"role":"assistant","content":"3"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.473004727Z","message":{"role":"assistant","content":"!"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T13:21:41.482244612Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":145658555,"load_duration":16869666,"prompt_eval_count":17,"prompt_eval_duration":3970529,"eval_count":13,"eval_duration":124441392} + recorded_at: Thu, 17 Apr 2025 13:21:34 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/chat_vision_models_ollama_granite3_2-vision_2b_can_understand_images.yml b/spec/fixtures/vcr_cassettes/chat_vision_models_ollama_granite3_2-vision_2b_can_understand_images.yml index 01fcebff..3f4f4988 100644 --- a/spec/fixtures/vcr_cassettes/chat_vision_models_ollama_granite3_2-vision_2b_can_understand_images.yml +++ b/spec/fixtures/vcr_cassettes/chat_vision_models_ollama_granite3_2-vision_2b_can_understand_images.yml @@ -22,18 +22,17 @@ http_interactions: message: OK headers: Content-Length: - - '484' + - '420' Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:24:03 GMT + - Thu, 17 Apr 2025 13:20:13 GMT Server: - Caddy body: encoding: UTF-8 - string: '{"model":"granite3.2-vision:2b","created_at":"2025-04-11T20:24:03.122857934Z","message":{"role":"assistant","content":"\nI''m - unable to view or analyze images. My capabilities are limited to text-based - interactions. If you have any questions or need assistance with something - else, feel free to ask!"},"done_reason":"stop","done":true,"total_duration":292340255,"load_duration":9777040,"prompt_eval_count":2242,"prompt_eval_duration":23093714,"eval_count":38,"eval_duration":258539543}' - recorded_at: Fri, 11 Apr 2025 20:23:59 GMT + string: '{"model":"granite3.2-vision:2b","created_at":"2025-04-17T13:20:13.293348596Z","message":{"role":"assistant","content":"\nI + see a diamond-shaped object with a red hue, possibly representing a piece + of jewelry or a decorative item."},"done_reason":"stop","done":true,"total_duration":5054099789,"load_duration":3935971594,"prompt_eval_count":2242,"prompt_eval_duration":915538125,"eval_count":31,"eval_duration":199258627}' + recorded_at: Thu, 17 Apr 2025 13:20:05 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_a_single_text.yml b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_a_single_text.yml index c180c360..5fb2bce8 100644 --- a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_a_single_text.yml +++ b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_a_single_text.yml @@ -24,7 +24,7 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:24:21 GMT + - Thu, 17 Apr 2025 13:20:39 GMT Server: - Caddy Vary: @@ -33,6 +33,6 @@ http_interactions: - chunked body: encoding: ASCII-8BIT - string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.025825415,-0.023176115,-0.052045297,-0.023625664,0.0006673469,0.009949714,-0.04538417,-0.06849524,-0.019409077,0.0010184002,-0.054927465,0.04728714,0.032690506,0.030963264,-0.028091758,-0.05092271,0.00021566867,0.023615433,-0.12640688,0.015840458,0.012315658,0.087370574,0.011073331,0.0090212375,0.007156342,-0.0052327104,0.021913407,-0.020346882,-0.03459649,-0.20068292,0.021031896,0.07291515,0.031049531,-0.04963502,0.023327535,-0.06476457,0.0131773045,0.004342761,-0.05204616,-0.03947274,0.0122103775,0.003776148,-0.050048206,-0.017586641,-0.029104842,-0.016230974,0.021660762,-0.017151477,0.0865443,0.01920734,-0.042871486,-0.0089291595,-0.02822964,-0.04884569,-0.018680912,-0.01892585,0.015438859,0.0065737013,-0.021804608,0.00633415,0.0343607,0.0017093703,-0.34944108,-0.06468269,0.0478818,-0.00246448,0.046574403,0.02243261,-0.024708489,-0.016602987,-0.011909359,0.014165576,-0.07424154,-0.03776865,0.032787047,-0.05530688,0.013535443,0.042380534,0.038827997,-0.033742167,0.015697544,0.009775907,0.0042203693,0.0011168025,0.023423292,0.04484947,-0.043061797,-0.05383481,-0.028867329,-0.0033860689,0.018773982,-0.018347567,0.03903167,-0.029658085,-0.06440208,0.040508885,-0.0017985007,0.049720276,0.033716165,0.31325525,0.04386892,0.0048334296,0.050675593,-0.056929454,0.0518016,-0.004611103,-0.0029309082,-0.028916717,0.0060408665,-0.004141483,0.01923389,-0.031655706,0.01768319,0.02311225,0.045390822,-0.024344986,-0.039786555,0.024944702,0.005075094,0.056426894,-0.0009737753,0.0037892968,-0.032363605,-0.012793344,-0.041841026,-0.014850747,-0.06273983,0.033704888,0.031475354,0.011834117,0.05125323,-0.011774348,-0.06885821,-0.014935385,-0.0006414335,0.017715653,-0.008953341,-0.097899854,-0.036503628,-0.084191576,0.023606507,-0.1339018,0.1330882,0.007957225,0.01985772,0.00030814653,0.021941159,0.05639211,-0.043463834,-0.045274723,0.011725757,-0.003486319,0.003375221,0.0074666464,0.06974618,-0.0006389784,-0.038667206,0.07041848,-0.02421246,0.03300245,-0.011266481,0.035639856,0.040018253,0.09069596,0.08246825,-0.009912788,0.012884513,-0.022981415,0.03470591,-0.022104705,0.0043493398,0.013083702,0.035951313,0.03946172,-0.038252268,0.030231304,-0.036359355,0.01005223,0.0025720727,0.0013707506,0.034241233,0.088925935,-0.051440887,-0.050102297,-0.0016456994,-0.009496842,0.062487546,0.040939905,0.07381002,0.078291304,-0.038428534,0.1316706,-0.0055638882,0.008280254,-0.021145111,0.04876571,0.040031683,0.04628573,0.046338666,-0.017028602,-0.007903445,0.007545737,-0.07565534,0.064689994,-0.022149073,-0.046088018,0.014704514,-0.040415496,0.00550196,0.006901969,0.00089305703,0.006521102,0.0366565,0.0074207284,0.039539423,0.005592426,-0.003989626,0.008083243,0.033852484,0.052595314,-0.015218367,0.03131478,0.0040506576,-0.048098013,-0.027468681,-0.024048975,-0.04536876,-0.05319465,-0.027298115,-0.01941297,0.010558779,0.06863464,0.04396793,0.08020219,0.033566475,-0.009056651,-0.014715962,0.04780099,0.05536488,-0.06740807,0.002055909,0.013943318,-0.05024147,-0.035200298,0.027621565,-0.040184192,-0.007491963,-0.06297288,-0.022879997,0.093055375,0.04880813,-0.012168053,0.019717308,0.064516716,0.020201867,0.012079503,-0.17798914,-0.027345736,-0.0612433,0.038101118,-0.06641872,-0.00939703,0.052195832,-0.03770301,-0.022270007,0.012196051,-0.041005902,-0.06945124,-0.027733557,-0.009639078,-0.059247572,0.04474978,0.00042829235,0.010153207,0.02728113,0.029422356,0.049308695,-0.038985588,-0.017589854,-0.02842523,-0.027386962,0.042216763,0.061242577,0.003747581,-0.024338258,-0.050467186,-0.013143215,0.0031099522,0.010997509,0.026045857,0.01815751,-0.027380131,0.01929404,-0.0022469186,0.111852795,0.07823112,0.024928685,0.059756078,-0.008221097,0.016979527,-0.039244134,-0.0019415446,0.011487329,-0.03280691,-0.08006135,-0.026343029,0.026450884,-0.053655412,-0.005154362,0.01307755,0.053237017,0.04086586,-0.0019484188,0.011518151,0.08618621,-0.041709326,0.047144253,0.077645905,-0.044002645,-0.16881582,-0.02115599,-0.011150404,-0.029005526,-0.022859793,-0.0107934745,0.009013299,0.0037840477,-0.023908136,-0.041892353,0.13362311,0.05498781,-0.0010903508,-0.027582854,0.02074264,0.08133009,-0.016295228,0.046583474,-0.012219358,-0.07110713,-0.031505097,0.04635908,0.13795494,0.004750067,0.044614047,0.018176915,0.020094909,-0.08733446,-0.14297998,0.045279857,0.0077459584,-0.019933412,0.059806284,0.0053598317,0.005684153,0.01267696,0.06831267,-0.03196309,0.0056615137,-0.023855256,0.14950311,0.028314097,0.0012290949,-0.034989975,0.014838987,-0.0043164054,-0.0380489,-0.002994491,-0.04658432,-0.023052199,0.009330306,0.019073954,-0.0048254183,0.039711606,0.026755748,0.05285787,0.005976852,-0.02769884,0.03918166,0.022543069,0.035913944,-0.030974701,-0.033151094,-0.061393328,0.012922418]],"total_duration":30114529,"load_duration":5548388,"prompt_eval_count":8}' - recorded_at: Fri, 11 Apr 2025 20:24:17 GMT + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.025825415,-0.023176115,-0.052045297,-0.023625664,0.0006673469,0.009949714,-0.04538417,-0.06849524,-0.019409077,0.0010184002,-0.054927465,0.04728714,0.032690506,0.030963264,-0.028091758,-0.05092271,0.00021566867,0.023615433,-0.12640688,0.015840458,0.012315658,0.087370574,0.011073331,0.0090212375,0.007156342,-0.0052327104,0.021913407,-0.020346882,-0.03459649,-0.20068292,0.021031896,0.07291515,0.031049531,-0.04963502,0.023327535,-0.06476457,0.0131773045,0.004342761,-0.05204616,-0.03947274,0.0122103775,0.003776148,-0.050048206,-0.017586641,-0.029104842,-0.016230974,0.021660762,-0.017151477,0.0865443,0.01920734,-0.042871486,-0.0089291595,-0.02822964,-0.04884569,-0.018680912,-0.01892585,0.015438859,0.0065737013,-0.021804608,0.00633415,0.0343607,0.0017093703,-0.34944108,-0.06468269,0.0478818,-0.00246448,0.046574403,0.02243261,-0.024708489,-0.016602987,-0.011909359,0.014165576,-0.07424154,-0.03776865,0.032787047,-0.05530688,0.013535443,0.042380534,0.038827997,-0.033742167,0.015697544,0.009775907,0.0042203693,0.0011168025,0.023423292,0.04484947,-0.043061797,-0.05383481,-0.028867329,-0.0033860689,0.018773982,-0.018347567,0.03903167,-0.029658085,-0.06440208,0.040508885,-0.0017985007,0.049720276,0.033716165,0.31325525,0.04386892,0.0048334296,0.050675593,-0.056929454,0.0518016,-0.004611103,-0.0029309082,-0.028916717,0.0060408665,-0.004141483,0.01923389,-0.031655706,0.01768319,0.02311225,0.045390822,-0.024344986,-0.039786555,0.024944702,0.005075094,0.056426894,-0.0009737753,0.0037892968,-0.032363605,-0.012793344,-0.041841026,-0.014850747,-0.06273983,0.033704888,0.031475354,0.011834117,0.05125323,-0.011774348,-0.06885821,-0.014935385,-0.0006414335,0.017715653,-0.008953341,-0.097899854,-0.036503628,-0.084191576,0.023606507,-0.1339018,0.1330882,0.007957225,0.01985772,0.00030814653,0.021941159,0.05639211,-0.043463834,-0.045274723,0.011725757,-0.003486319,0.003375221,0.0074666464,0.06974618,-0.0006389784,-0.038667206,0.07041848,-0.02421246,0.03300245,-0.011266481,0.035639856,0.040018253,0.09069596,0.08246825,-0.009912788,0.012884513,-0.022981415,0.03470591,-0.022104705,0.0043493398,0.013083702,0.035951313,0.03946172,-0.038252268,0.030231304,-0.036359355,0.01005223,0.0025720727,0.0013707506,0.034241233,0.088925935,-0.051440887,-0.050102297,-0.0016456994,-0.009496842,0.062487546,0.040939905,0.07381002,0.078291304,-0.038428534,0.1316706,-0.0055638882,0.008280254,-0.021145111,0.04876571,0.040031683,0.04628573,0.046338666,-0.017028602,-0.007903445,0.007545737,-0.07565534,0.064689994,-0.022149073,-0.046088018,0.014704514,-0.040415496,0.00550196,0.006901969,0.00089305703,0.006521102,0.0366565,0.0074207284,0.039539423,0.005592426,-0.003989626,0.008083243,0.033852484,0.052595314,-0.015218367,0.03131478,0.0040506576,-0.048098013,-0.027468681,-0.024048975,-0.04536876,-0.05319465,-0.027298115,-0.01941297,0.010558779,0.06863464,0.04396793,0.08020219,0.033566475,-0.009056651,-0.014715962,0.04780099,0.05536488,-0.06740807,0.002055909,0.013943318,-0.05024147,-0.035200298,0.027621565,-0.040184192,-0.007491963,-0.06297288,-0.022879997,0.093055375,0.04880813,-0.012168053,0.019717308,0.064516716,0.020201867,0.012079503,-0.17798914,-0.027345736,-0.0612433,0.038101118,-0.06641872,-0.00939703,0.052195832,-0.03770301,-0.022270007,0.012196051,-0.041005902,-0.06945124,-0.027733557,-0.009639078,-0.059247572,0.04474978,0.00042829235,0.010153207,0.02728113,0.029422356,0.049308695,-0.038985588,-0.017589854,-0.02842523,-0.027386962,0.042216763,0.061242577,0.003747581,-0.024338258,-0.050467186,-0.013143215,0.0031099522,0.010997509,0.026045857,0.01815751,-0.027380131,0.01929404,-0.0022469186,0.111852795,0.07823112,0.024928685,0.059756078,-0.008221097,0.016979527,-0.039244134,-0.0019415446,0.011487329,-0.03280691,-0.08006135,-0.026343029,0.026450884,-0.053655412,-0.005154362,0.01307755,0.053237017,0.04086586,-0.0019484188,0.011518151,0.08618621,-0.041709326,0.047144253,0.077645905,-0.044002645,-0.16881582,-0.02115599,-0.011150404,-0.029005526,-0.022859793,-0.0107934745,0.009013299,0.0037840477,-0.023908136,-0.041892353,0.13362311,0.05498781,-0.0010903508,-0.027582854,0.02074264,0.08133009,-0.016295228,0.046583474,-0.012219358,-0.07110713,-0.031505097,0.04635908,0.13795494,0.004750067,0.044614047,0.018176915,0.020094909,-0.08733446,-0.14297998,0.045279857,0.0077459584,-0.019933412,0.059806284,0.0053598317,0.005684153,0.01267696,0.06831267,-0.03196309,0.0056615137,-0.023855256,0.14950311,0.028314097,0.0012290949,-0.034989975,0.014838987,-0.0043164054,-0.0380489,-0.002994491,-0.04658432,-0.023052199,0.009330306,0.019073954,-0.0048254183,0.039711606,0.026755748,0.05285787,0.005976852,-0.02769884,0.03918166,0.022543069,0.035913944,-0.030974701,-0.033151094,-0.061393328,0.012922418]],"total_duration":935750370,"load_duration":851710037,"prompt_eval_count":8}' + recorded_at: Thu, 17 Apr 2025 13:20:31 GMT recorded_with: VCR 6.3.1 diff --git a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml index 222c0bf0..a25f9534 100644 --- a/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml +++ b/spec/fixtures/vcr_cassettes/embedding_basic_functionality_ollama_snowflake-arctic-embed_22m_can_handle_multiple_texts.yml @@ -23,7 +23,7 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 11 Apr 2025 20:24:21 GMT + - Thu, 17 Apr 2025 13:20:39 GMT Server: - Caddy Vary: @@ -32,6 +32,6 @@ http_interactions: - chunked body: encoding: ASCII-8BIT - string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.038980126,0.020101948,-0.067413226,0.007685114,-0.021361317,0.028405204,-0.05964908,-0.09178641,-0.032397546,0.008366828,-0.05523459,0.014637846,0.0298761,0.03387804,-0.016674861,-0.044479024,0.008276525,-0.0022477629,-0.12195336,-0.008178106,0.008199949,0.07350191,0.01897805,0.013661541,-0.003947917,0.00030909953,0.006917925,-0.012626692,-0.09616951,-0.17709318,0.01293276,0.031847943,0.025997223,-0.042996813,0.03192809,-0.048060544,-0.0017395425,0.029812165,-0.026901668,-0.030327402,-0.0068094945,0.023497479,-0.019625092,-0.003110331,0.010590182,-0.027034454,0.04182794,-0.009884578,0.09661056,0.043840215,-0.037773125,-0.033335246,0.009626258,-0.013944384,-0.040054895,-0.0026200123,0.046114273,0.0049590026,-0.008846017,0.034012534,0.038100995,0.0013456035,-0.34869465,-0.06399822,0.06681992,-0.007770172,0.03451249,0.006695025,0.0016939766,-0.005725403,-0.059506737,-0.0011312707,-0.034694858,-0.0070268526,0.033973437,-0.07178208,0.0019529031,0.050796922,0.033150885,-0.04453945,-0.010778929,-0.01298108,0.01772847,0.027397834,0.017516151,0.05094088,-0.045374986,-0.031055674,0.0034364148,0.017342873,0.03724968,-0.020449797,0.03487508,-0.023868825,-0.0705106,0.045591667,0.0014132301,0.04102965,0.0082013225,0.3076015,0.041163538,-0.0075212517,0.0632507,-0.07494113,0.054058343,-0.013692275,-0.018088195,0.0039990763,-0.016607765,-0.00915819,0.03353369,-0.017990997,-0.008927891,0.018497262,0.04622437,-0.028729072,-0.0070351255,-0.005821854,0.0063457754,0.044443272,-0.03001723,0.014840464,-0.03265875,-0.017414864,-0.014599514,-0.022385433,-0.06727593,0.03655243,0.009642398,0.04557801,0.028509801,0.011939836,-0.062560804,-0.015390183,-0.0050801174,0.011868977,0.00253459,-0.07341563,-0.004279252,-0.07461656,-0.0006562158,-0.16768059,0.13006905,0.03295397,0.0145061985,0.000511846,0.009465702,0.037566304,-0.012595248,-0.042188045,0.015753305,0.02033451,-0.026321119,0.020434551,0.09113539,-0.014463864,-0.04273769,0.05132384,-0.007610653,0.036329918,0.010425151,0.0075439727,0.042681746,0.060391378,0.053032257,0.0071610347,0.018304583,-0.0199126,0.008234456,-0.026586238,-0.00048163044,0.018455869,0.012418799,0.061977547,-0.014351739,0.019218396,0.010331768,0.033490002,0.0102368975,-0.031620093,0.015966186,0.10022163,-0.03886677,-0.058662754,-0.010719046,0.011613407,0.055317454,0.021442259,0.041051246,0.05395217,-0.031625535,0.1561225,-0.04847817,0.012704446,-0.017351678,-0.005412353,0.05782586,0.063770935,0.028648905,-0.0010758642,-0.03315512,0.011804742,-0.054954775,0.034165937,-0.027770827,-0.040539972,0.01901002,-0.008845964,-0.009943114,-0.00007340114,0.008205162,0.014036151,0.015788715,0.013589957,0.040579043,-0.015481178,0.0013020202,-0.019863069,0.044024546,0.054241393,-0.019910982,0.019316196,-0.009067846,-0.06370655,-0.038542934,-0.005822525,-0.05564244,-0.020892167,-0.04894251,-0.012727646,0.05143602,0.06270096,0.022492254,0.11401925,0.014643738,0.0030262705,-0.036580373,0.05074049,0.04994587,-0.06580306,0.008364971,0.0012129012,-0.034641,-0.0046832887,0.012338395,-0.032140378,-0.045876123,-0.048861995,-0.019786038,0.12485802,0.06277426,-0.033950374,0.036432575,0.06035506,0.014863595,0.0047113854,-0.19050083,-0.032735668,-0.077262625,0.044320498,-0.059189577,-0.014459053,0.03718649,-0.0026039602,0.004493112,-0.011763187,-0.05504196,-0.025533773,-0.02048363,-0.023919607,-0.015506923,0.061790027,0.01816571,0.0130165955,0.04316555,0.020895818,0.034394037,-0.00560091,0.011984886,-0.06372637,0.02781977,0.020621277,0.06389801,0.0032279587,-0.064306036,-0.07160552,-0.05394653,0.032840647,-0.0021832213,0.030553438,0.0039347326,-0.026431374,-0.026453791,-0.024773262,0.14158836,0.00027325953,-0.003358694,0.031054376,0.005467873,-0.000014875217,-0.05249387,0.05296582,-0.013941867,-0.031785127,-0.07282081,-0.029387616,-0.0076221772,-0.032214306,0.008221592,0.01732765,0.01000591,0.015568096,-0.005231348,-0.012036904,0.07718011,-0.045315113,0.008787361,0.02417641,-0.015230668,-0.15053827,-0.0037556684,-0.01667005,-0.0013223562,-0.02209581,0.016655259,0.019694244,0.015031552,-0.037394483,-0.057655845,0.12982553,0.04818329,0.0077882116,-0.015061786,0.004192891,0.08628084,0.027619699,0.044403546,0.00034237612,-0.044426452,0.00096744276,0.06186224,0.16129373,0.024928987,-0.0073914034,0.0040016263,0.039090827,-0.08990263,-0.118701264,0.04410862,-0.03954887,-0.030827247,0.112970345,0.04363939,-0.021480395,0.03728192,0.044834364,-0.0009248547,0.032832358,-0.035760213,0.15535384,-0.0009505413,-0.0034093896,-0.029711511,0.008248596,-0.051867787,-0.012275803,0.012434058,-0.04902186,-0.011476671,0.0133925,-0.03379115,-0.0151935695,0.010195133,0.031876706,0.025932532,0.036986034,-0.01739396,0.017166032,0.05808856,0.030131826,-0.0008843879,-0.06526332,-0.09222386,-0.0049838475],[-0.007225496,0.037155706,-0.016906068,-0.030758644,-0.020417303,0.011231278,-0.06530078,-0.061754078,-0.020577524,-0.024164986,-0.035808578,0.015893035,0.061571326,0.020668881,0.016767306,-0.023883428,-0.01099219,0.025237663,-0.15266667,-0.013051586,-0.010288909,0.029873036,0.017107742,0.0315594,0.021337744,0.0034486242,0.013156374,-0.037249252,-0.13094991,-0.15867794,0.024068367,0.005509016,-0.0056714285,-0.042848945,-0.0045933733,-0.04299176,0.0020768172,0.04483032,-0.03212172,-0.027772011,-0.0036520734,-0.0075447895,-0.013391376,0.0045278594,0.04607957,0.0027125278,0.049626715,-0.021857744,0.06873977,0.04173157,-0.04370165,0.014249006,-0.0373972,-0.05551407,-0.045433797,-0.0011728521,0.044487648,-0.0074436087,-0.00975718,0.008799588,0.0073077497,0.024823438,-0.35174075,-0.012705645,0.04136241,0.047284245,0.0020329098,0.04765345,-0.02604234,-0.02548834,-0.02704063,0.017578213,0.01482943,0.0055936393,0.023184825,-0.041498873,-0.003050582,0.012843925,0.05516694,-0.03866418,0.02621437,0.032198943,0.01935349,-0.018680874,-0.013953387,0.0451372,-0.018057078,-0.012344732,0.04716202,0.0010259423,-0.028411478,0.04075236,0.024121404,0.0006758823,-0.0674563,0.009551461,-0.01973488,0.05264174,0.04568158,0.29859018,0.030333413,-0.04152799,0.016276676,-0.037692044,0.053379524,-0.029166088,-0.008381986,-0.03611233,0.021734668,-0.02926269,0.01770523,-0.021257408,-0.0026680147,0.0033788746,0.03192171,-0.02859868,-0.050017837,0.007628301,-0.005211484,0.055639394,-0.04813225,-0.00062740705,-0.023975527,-0.05272858,0.0012510746,-0.016620526,-0.05937839,0.014596674,-0.007940771,-0.0060859257,0.03417475,-0.020669967,-0.09361984,-0.019438276,-0.012983339,0.022100516,0.03252378,-0.052587945,0.016381664,-0.047060754,0.015694086,-0.1377361,0.10544033,0.0026725356,0.01146019,0.026346128,-0.025007993,0.004997534,-0.053778246,-0.038643032,0.023108022,0.016371924,-0.015227947,0.0020684898,0.124686636,0.02065184,-0.0070788977,0.031109046,-0.011467157,0.0051159468,0.0174688,0.019905413,-0.0069136377,0.032805618,0.029705629,-0.038734376,0.032078113,-0.01761205,0.01944323,-0.0030690655,0.018461121,0.018608272,-0.012803209,0.017234804,-0.05453963,-0.0014086623,-0.032340996,0.0010491384,0.038566574,-0.03347248,-0.015357926,0.08070545,-0.028756669,-0.046844523,-0.01529485,0.052366853,0.059635386,0.03260225,0.05999529,0.06562162,-0.025594424,0.19492106,-0.09446214,-0.02200547,0.021350436,-0.0047113174,0.03170546,0.032968767,-0.017730163,-0.023518713,-0.024787944,-0.014301349,-0.00028776744,0.015872791,0.015544321,-0.079372294,-0.005725175,0.017331447,-0.0056501715,-0.012182198,-0.009767331,-0.05171092,0.038543854,0.034115233,0.07627104,0.032627165,0.016347326,0.012965246,0.024923127,0.02650983,-0.0040691686,0.04411213,-0.02981039,-0.06744219,-0.030292222,-0.0021420228,-0.06861754,-0.0020280352,-0.08233997,-0.0059836525,0.037955742,0.039244626,0.034866735,0.11366857,0.02521095,0.018243132,0.024956543,0.027358694,0.011940862,-0.061406422,0.0018358993,0.015471496,-0.0400448,-0.024514355,0.020818526,-0.078023,-0.019798901,-0.046464335,-0.03319194,0.16930555,0.050408904,-0.013528864,0.007027566,0.0381429,0.0010658541,-0.011183001,-0.18296444,-0.025517514,-0.028616475,0.044594944,-0.002806602,-0.00036968052,0.040348303,0.022882342,-0.0099050915,-0.029638626,-0.009392766,-0.035751175,-0.02882233,-0.05017968,-0.031793848,0.104784735,0.026196804,0.025192862,0.0053355214,-0.009864406,0.07273947,0.029665705,-0.030834008,0.005743688,0.0130977845,0.027437972,0.042631894,0.02490531,-0.031600703,-0.055224583,-0.04933041,-0.0008777641,-0.002849928,0.06742398,-0.041109774,0.00045421268,-0.008093842,-0.026830377,0.18975478,0.0022353292,0.016124677,0.03874153,-0.01676804,0.0016409162,0.0022479978,0.039468583,-0.03589011,-0.005279329,-0.031004557,-0.014081007,0.058285933,-0.03845023,-0.022855511,0.008495943,-0.013061212,0.029775871,0.024829257,-0.015684903,0.09160675,-0.057623718,0.035138898,0.037533384,0.02173393,-0.20164658,-0.034627892,-0.013216875,0.04897353,-0.058580056,0.018308442,0.028224163,-0.011080451,0.020418232,-0.026639828,0.1152522,0.05399439,-0.017088734,-0.0043683355,0.04675239,0.055089362,0.01442295,0.019836834,-0.013131093,-0.040812545,0.0028349068,0.06096238,0.15055773,-0.0047997017,0.04041006,0.023423078,0.0068679894,-0.036161505,-0.11227965,0.027264446,-0.032434683,-0.033046544,0.05816228,0.019367868,-0.035861887,0.023473343,0.07127074,-0.036597442,0.00892375,-0.03424332,0.15918937,-0.028045062,0.01727863,-0.016116075,-0.033897277,-0.04147993,0.000102095604,0.0054549514,-0.054227076,-0.014035331,0.022229984,-0.0101330625,0.0061006444,0.031121459,0.034375396,0.027529038,0.02083103,-0.01970649,0.01220227,0.048865896,0.04224607,0.034099545,-0.018085487,-0.035159428,-0.057188712],[0.010182182,0.01467856,0.02307528,-0.031243263,-0.019379467,0.018989552,-0.04283347,-0.065710135,0.037127666,-0.00186089,-0.043939225,0.02675395,0.017098242,0.01003573,0.016530303,-0.07529927,-0.0045888554,-0.00783502,-0.16103624,-0.018049028,-0.023261337,0.0726829,0.03554955,0.007101789,-0.03776669,0.03965637,0.010605459,-0.034077637,-0.1356997,-0.17605451,0.017438654,0.021631619,-0.00033740848,-0.05291991,-0.021556789,-0.020458516,-0.035007652,0.015351501,-0.013426498,-0.03958441,0.007752372,-0.016570576,-0.046401996,-0.011264202,0.05016379,-0.013889148,0.023654828,-0.030822476,0.024557399,0.041917533,-0.057632543,-0.032482482,0.00036849198,-0.038682386,-0.046676703,0.050744284,-0.010942368,-0.031797383,0.010470975,0.016948372,0.0055663995,0.058688268,-0.36635372,0.025145743,0.07269215,0.019211076,-0.018371176,-0.007865585,-0.00085583143,0.015894871,0.038337328,-0.014794488,-0.012541673,0.01718971,0.02693935,-0.045785226,0.0036220509,0.021907976,0.06554055,-0.04263025,0.0019336614,0.020152396,0.016324878,0.030021766,-0.015724592,0.06523936,0.0062361993,-0.028796729,0.038781464,0.00485937,-0.04877486,0.035066955,0.003006257,-0.0022367106,-0.04857364,0.001250449,0.0014392686,0.034671582,0.018141782,0.30240846,0.018054346,0.003062208,0.040367432,-0.07040852,0.052332688,-0.0028175337,-0.028020458,-0.021599045,0.031913813,-0.03909125,0.0028893205,-0.017719263,0.0052999025,-0.0061596422,0.054935843,-0.0012574365,-0.016914988,-0.009276138,0.023673639,0.043957185,-0.027961437,0.025381606,-0.04037111,-0.0053644218,-0.01048436,0.0035398034,-0.06366181,0.025020782,-0.046017863,-0.011454832,0.055446308,0.00011163922,-0.09325482,0.019621197,0.022895223,0.03182137,0.0010375826,-0.03117694,0.025362851,-0.031175531,-0.018045994,-0.13010256,0.10690098,-0.010491627,0.025534678,-0.0049998793,-0.028496867,0.043118607,-0.026229834,-0.01440331,0.024678908,0.033322413,-0.04394492,-0.005047783,0.0846922,0.022463208,0.0030116427,-0.003502701,-0.006854317,0.029395698,0.026690561,0.02559026,0.059080407,0.08340788,0.032878075,-0.0951223,0.05720357,0.02495402,0.014070283,-0.0042589814,0.018304987,-0.024781907,-0.041739304,-0.025803747,-0.012889254,-0.008009496,-0.028856821,-0.0005779219,0.028763987,-0.051368624,0.0027247544,0.06316944,-0.026757175,-0.08121664,-0.010547304,0.025082018,0.03702747,0.012908532,0.03141585,0.06318691,-0.027946094,0.17676711,-0.082001895,-0.036393072,-0.034927875,0.021505699,0.015366971,0.043793295,-0.0021506813,0.011197076,-0.04681245,-0.07142668,0.009581391,0.035224073,-0.04230499,-0.03571502,0.044728618,0.013419941,0.04271971,-0.008869499,-0.03126791,-0.0022953814,0.09043066,0.02422671,0.031988394,-0.005063331,-0.01025437,0.028456746,0.005116802,0.047064006,0.006069893,0.018045707,-0.022872277,-0.04572793,0.009827904,0.0069014616,-0.040622003,-0.013080576,-0.04777706,0.0012043755,0.07896354,0.043710608,0.040280547,0.073466524,0.06464221,0.014187437,-0.04872054,0.031972423,0.012510081,-0.038348954,0.016539646,0.006683025,-0.040044174,-0.056529168,0.04949601,-0.09106357,-0.030466262,0.010563386,-0.029358381,0.18323456,0.092901036,0.0274177,0.015892414,0.03165387,-0.06160097,0.0015103974,-0.11125003,0.010338306,-0.04025745,0.03327973,-0.025003629,-0.03141167,0.06007851,-0.029752823,-0.025986204,-0.0014932271,-0.00599316,-0.021954508,-0.005476444,-0.029271869,-0.040407516,0.09515277,0.019253343,0.04248291,0.00067515706,-0.009261151,0.025339367,-0.014061599,-0.0580183,-0.020854905,0.018436473,-0.0027048623,0.05364179,0.03416436,-0.009260716,-0.0785917,-0.023255466,0.03542782,0.07159498,0.0069388812,-0.038117178,-0.012323471,-0.009949083,-0.005902662,0.1273025,0.0014150682,0.018899381,0.022011757,-0.048523538,-0.03720841,-0.009601104,0.0547053,0.013078509,-0.013740014,-0.047507983,-0.018159833,0.017327625,-0.028147077,-0.030314941,-0.0028794382,-0.045816995,0.0028496154,0.015196548,-0.007854572,0.10382276,-0.01617453,0.017708423,0.037362352,0.002230973,-0.17829818,-0.036029417,-0.0006612718,-0.014223209,-0.06350168,-0.030032892,0.023901368,-0.00077770976,0.02510791,-0.04697416,0.15435414,0.08471184,-0.018154247,-0.030085038,0.03331496,0.09898532,0.016086424,0.010282825,-0.018388266,-0.006998348,0.017570151,0.0994389,0.12580456,0.023195932,0.008063885,0.003250409,-0.005355925,-0.047599785,-0.13378266,-0.0018643751,-0.045305796,-0.020819422,0.06300365,0.00095856196,0.005435208,0.0057721534,0.031151773,-0.03753951,0.016918143,-0.044961866,0.13784775,-0.016061982,-0.00000515642,-0.008715281,-0.01241248,-0.0021270465,0.022557234,0.05173467,-0.04232277,0.008206349,0.012508353,-0.004212918,-0.01315854,0.048109457,0.00035447034,-0.0082567325,0.012337424,0.0065427353,0.036199752,0.030513138,0.039167494,-0.028987426,-0.016657345,-0.07125146,-0.020769335]],"total_duration":11480915,"load_duration":2711876,"prompt_eval_count":4}' - recorded_at: Fri, 11 Apr 2025 20:24:17 GMT + string: '{"model":"snowflake-arctic-embed:22m","embeddings":[[-0.038980126,0.020101948,-0.067413226,0.007685114,-0.021361317,0.028405204,-0.05964908,-0.09178641,-0.032397546,0.008366828,-0.05523459,0.014637846,0.0298761,0.03387804,-0.016674861,-0.044479024,0.008276525,-0.0022477629,-0.12195336,-0.008178106,0.008199949,0.07350191,0.01897805,0.013661541,-0.003947917,0.00030909953,0.006917925,-0.012626692,-0.09616951,-0.17709318,0.01293276,0.031847943,0.025997223,-0.042996813,0.03192809,-0.048060544,-0.0017395425,0.029812165,-0.026901668,-0.030327402,-0.0068094945,0.023497479,-0.019625092,-0.003110331,0.010590182,-0.027034454,0.04182794,-0.009884578,0.09661056,0.043840215,-0.037773125,-0.033335246,0.009626258,-0.013944384,-0.040054895,-0.0026200123,0.046114273,0.0049590026,-0.008846017,0.034012534,0.038100995,0.0013456035,-0.34869465,-0.06399822,0.06681992,-0.007770172,0.03451249,0.006695025,0.0016939766,-0.005725403,-0.059506737,-0.0011312707,-0.034694858,-0.0070268526,0.033973437,-0.07178208,0.0019529031,0.050796922,0.033150885,-0.04453945,-0.010778929,-0.01298108,0.01772847,0.027397834,0.017516151,0.05094088,-0.045374986,-0.031055674,0.0034364148,0.017342873,0.03724968,-0.020449797,0.03487508,-0.023868825,-0.0705106,0.045591667,0.0014132301,0.04102965,0.0082013225,0.3076015,0.041163538,-0.0075212517,0.0632507,-0.07494113,0.054058343,-0.013692275,-0.018088195,0.0039990763,-0.016607765,-0.00915819,0.03353369,-0.017990997,-0.008927891,0.018497262,0.04622437,-0.028729072,-0.0070351255,-0.005821854,0.0063457754,0.044443272,-0.03001723,0.014840464,-0.03265875,-0.017414864,-0.014599514,-0.022385433,-0.06727593,0.03655243,0.009642398,0.04557801,0.028509801,0.011939836,-0.062560804,-0.015390183,-0.0050801174,0.011868977,0.00253459,-0.07341563,-0.004279252,-0.07461656,-0.0006562158,-0.16768059,0.13006905,0.03295397,0.0145061985,0.000511846,0.009465702,0.037566304,-0.012595248,-0.042188045,0.015753305,0.02033451,-0.026321119,0.020434551,0.09113539,-0.014463864,-0.04273769,0.05132384,-0.007610653,0.036329918,0.010425151,0.0075439727,0.042681746,0.060391378,0.053032257,0.0071610347,0.018304583,-0.0199126,0.008234456,-0.026586238,-0.00048163044,0.018455869,0.012418799,0.061977547,-0.014351739,0.019218396,0.010331768,0.033490002,0.0102368975,-0.031620093,0.015966186,0.10022163,-0.03886677,-0.058662754,-0.010719046,0.011613407,0.055317454,0.021442259,0.041051246,0.05395217,-0.031625535,0.1561225,-0.04847817,0.012704446,-0.017351678,-0.005412353,0.05782586,0.063770935,0.028648905,-0.0010758642,-0.03315512,0.011804742,-0.054954775,0.034165937,-0.027770827,-0.040539972,0.01901002,-0.008845964,-0.009943114,-0.00007340114,0.008205162,0.014036151,0.015788715,0.013589957,0.040579043,-0.015481178,0.0013020202,-0.019863069,0.044024546,0.054241393,-0.019910982,0.019316196,-0.009067846,-0.06370655,-0.038542934,-0.005822525,-0.05564244,-0.020892167,-0.04894251,-0.012727646,0.05143602,0.06270096,0.022492254,0.11401925,0.014643738,0.0030262705,-0.036580373,0.05074049,0.04994587,-0.06580306,0.008364971,0.0012129012,-0.034641,-0.0046832887,0.012338395,-0.032140378,-0.045876123,-0.048861995,-0.019786038,0.12485802,0.06277426,-0.033950374,0.036432575,0.06035506,0.014863595,0.0047113854,-0.19050083,-0.032735668,-0.077262625,0.044320498,-0.059189577,-0.014459053,0.03718649,-0.0026039602,0.004493112,-0.011763187,-0.05504196,-0.025533773,-0.02048363,-0.023919607,-0.015506923,0.061790027,0.01816571,0.0130165955,0.04316555,0.020895818,0.034394037,-0.00560091,0.011984886,-0.06372637,0.02781977,0.020621277,0.06389801,0.0032279587,-0.064306036,-0.07160552,-0.05394653,0.032840647,-0.0021832213,0.030553438,0.0039347326,-0.026431374,-0.026453791,-0.024773262,0.14158836,0.00027325953,-0.003358694,0.031054376,0.005467873,-0.000014875217,-0.05249387,0.05296582,-0.013941867,-0.031785127,-0.07282081,-0.029387616,-0.0076221772,-0.032214306,0.008221592,0.01732765,0.01000591,0.015568096,-0.005231348,-0.012036904,0.07718011,-0.045315113,0.008787361,0.02417641,-0.015230668,-0.15053827,-0.0037556684,-0.01667005,-0.0013223562,-0.02209581,0.016655259,0.019694244,0.015031552,-0.037394483,-0.057655845,0.12982553,0.04818329,0.0077882116,-0.015061786,0.004192891,0.08628084,0.027619699,0.044403546,0.00034237612,-0.044426452,0.00096744276,0.06186224,0.16129373,0.024928987,-0.0073914034,0.0040016263,0.039090827,-0.08990263,-0.118701264,0.04410862,-0.03954887,-0.030827247,0.112970345,0.04363939,-0.021480395,0.03728192,0.044834364,-0.0009248547,0.032832358,-0.035760213,0.15535384,-0.0009505413,-0.0034093896,-0.029711511,0.008248596,-0.051867787,-0.012275803,0.012434058,-0.04902186,-0.011476671,0.0133925,-0.03379115,-0.0151935695,0.010195133,0.031876706,0.025932532,0.036986034,-0.01739396,0.017166032,0.05808856,0.030131826,-0.0008843879,-0.06526332,-0.09222386,-0.0049838475],[-0.007225496,0.037155706,-0.016906068,-0.030758644,-0.020417303,0.011231278,-0.06530078,-0.061754078,-0.020577524,-0.024164986,-0.035808578,0.015893035,0.061571326,0.020668881,0.016767306,-0.023883428,-0.01099219,0.025237663,-0.15266667,-0.013051586,-0.010288909,0.029873036,0.017107742,0.0315594,0.021337744,0.0034486242,0.013156374,-0.037249252,-0.13094991,-0.15867794,0.024068367,0.005509016,-0.0056714285,-0.042848945,-0.0045933733,-0.04299176,0.0020768172,0.04483032,-0.03212172,-0.027772011,-0.0036520734,-0.0075447895,-0.013391376,0.0045278594,0.04607957,0.0027125278,0.049626715,-0.021857744,0.06873977,0.04173157,-0.04370165,0.014249006,-0.0373972,-0.05551407,-0.045433797,-0.0011728521,0.044487648,-0.0074436087,-0.00975718,0.008799588,0.0073077497,0.024823438,-0.35174075,-0.012705645,0.04136241,0.047284245,0.0020329098,0.04765345,-0.02604234,-0.02548834,-0.02704063,0.017578213,0.01482943,0.0055936393,0.023184825,-0.041498873,-0.003050582,0.012843925,0.05516694,-0.03866418,0.02621437,0.032198943,0.01935349,-0.018680874,-0.013953387,0.0451372,-0.018057078,-0.012344732,0.04716202,0.0010259423,-0.028411478,0.04075236,0.024121404,0.0006758823,-0.0674563,0.009551461,-0.01973488,0.05264174,0.04568158,0.29859018,0.030333413,-0.04152799,0.016276676,-0.037692044,0.053379524,-0.029166088,-0.008381986,-0.03611233,0.021734668,-0.02926269,0.01770523,-0.021257408,-0.0026680147,0.0033788746,0.03192171,-0.02859868,-0.050017837,0.007628301,-0.005211484,0.055639394,-0.04813225,-0.00062740705,-0.023975527,-0.05272858,0.0012510746,-0.016620526,-0.05937839,0.014596674,-0.007940771,-0.0060859257,0.03417475,-0.020669967,-0.09361984,-0.019438276,-0.012983339,0.022100516,0.03252378,-0.052587945,0.016381664,-0.047060754,0.015694086,-0.1377361,0.10544033,0.0026725356,0.01146019,0.026346128,-0.025007993,0.004997534,-0.053778246,-0.038643032,0.023108022,0.016371924,-0.015227947,0.0020684898,0.124686636,0.02065184,-0.0070788977,0.031109046,-0.011467157,0.0051159468,0.0174688,0.019905413,-0.0069136377,0.032805618,0.029705629,-0.038734376,0.032078113,-0.01761205,0.01944323,-0.0030690655,0.018461121,0.018608272,-0.012803209,0.017234804,-0.05453963,-0.0014086623,-0.032340996,0.0010491384,0.038566574,-0.03347248,-0.015357926,0.08070545,-0.028756669,-0.046844523,-0.01529485,0.052366853,0.059635386,0.03260225,0.05999529,0.06562162,-0.025594424,0.19492106,-0.09446214,-0.02200547,0.021350436,-0.0047113174,0.03170546,0.032968767,-0.017730163,-0.023518713,-0.024787944,-0.014301349,-0.00028776744,0.015872791,0.015544321,-0.079372294,-0.005725175,0.017331447,-0.0056501715,-0.012182198,-0.009767331,-0.05171092,0.038543854,0.034115233,0.07627104,0.032627165,0.016347326,0.012965246,0.024923127,0.02650983,-0.0040691686,0.04411213,-0.02981039,-0.06744219,-0.030292222,-0.0021420228,-0.06861754,-0.0020280352,-0.08233997,-0.0059836525,0.037955742,0.039244626,0.034866735,0.11366857,0.02521095,0.018243132,0.024956543,0.027358694,0.011940862,-0.061406422,0.0018358993,0.015471496,-0.0400448,-0.024514355,0.020818526,-0.078023,-0.019798901,-0.046464335,-0.03319194,0.16930555,0.050408904,-0.013528864,0.007027566,0.0381429,0.0010658541,-0.011183001,-0.18296444,-0.025517514,-0.028616475,0.044594944,-0.002806602,-0.00036968052,0.040348303,0.022882342,-0.0099050915,-0.029638626,-0.009392766,-0.035751175,-0.02882233,-0.05017968,-0.031793848,0.104784735,0.026196804,0.025192862,0.0053355214,-0.009864406,0.07273947,0.029665705,-0.030834008,0.005743688,0.0130977845,0.027437972,0.042631894,0.02490531,-0.031600703,-0.055224583,-0.04933041,-0.0008777641,-0.002849928,0.06742398,-0.041109774,0.00045421268,-0.008093842,-0.026830377,0.18975478,0.0022353292,0.016124677,0.03874153,-0.01676804,0.0016409162,0.0022479978,0.039468583,-0.03589011,-0.005279329,-0.031004557,-0.014081007,0.058285933,-0.03845023,-0.022855511,0.008495943,-0.013061212,0.029775871,0.024829257,-0.015684903,0.09160675,-0.057623718,0.035138898,0.037533384,0.02173393,-0.20164658,-0.034627892,-0.013216875,0.04897353,-0.058580056,0.018308442,0.028224163,-0.011080451,0.020418232,-0.026639828,0.1152522,0.05399439,-0.017088734,-0.0043683355,0.04675239,0.055089362,0.01442295,0.019836834,-0.013131093,-0.040812545,0.0028349068,0.06096238,0.15055773,-0.0047997017,0.04041006,0.023423078,0.0068679894,-0.036161505,-0.11227965,0.027264446,-0.032434683,-0.033046544,0.05816228,0.019367868,-0.035861887,0.023473343,0.07127074,-0.036597442,0.00892375,-0.03424332,0.15918937,-0.028045062,0.01727863,-0.016116075,-0.033897277,-0.04147993,0.000102095604,0.0054549514,-0.054227076,-0.014035331,0.022229984,-0.0101330625,0.0061006444,0.031121459,0.034375396,0.027529038,0.02083103,-0.01970649,0.01220227,0.048865896,0.04224607,0.034099545,-0.018085487,-0.035159428,-0.057188712],[0.010182182,0.01467856,0.02307528,-0.031243263,-0.019379467,0.018989552,-0.04283347,-0.065710135,0.037127666,-0.00186089,-0.043939225,0.02675395,0.017098242,0.01003573,0.016530303,-0.07529927,-0.0045888554,-0.00783502,-0.16103624,-0.018049028,-0.023261337,0.0726829,0.03554955,0.007101789,-0.03776669,0.03965637,0.010605459,-0.034077637,-0.1356997,-0.17605451,0.017438654,0.021631619,-0.00033740848,-0.05291991,-0.021556789,-0.020458516,-0.035007652,0.015351501,-0.013426498,-0.03958441,0.007752372,-0.016570576,-0.046401996,-0.011264202,0.05016379,-0.013889148,0.023654828,-0.030822476,0.024557399,0.041917533,-0.057632543,-0.032482482,0.00036849198,-0.038682386,-0.046676703,0.050744284,-0.010942368,-0.031797383,0.010470975,0.016948372,0.0055663995,0.058688268,-0.36635372,0.025145743,0.07269215,0.019211076,-0.018371176,-0.007865585,-0.00085583143,0.015894871,0.038337328,-0.014794488,-0.012541673,0.01718971,0.02693935,-0.045785226,0.0036220509,0.021907976,0.06554055,-0.04263025,0.0019336614,0.020152396,0.016324878,0.030021766,-0.015724592,0.06523936,0.0062361993,-0.028796729,0.038781464,0.00485937,-0.04877486,0.035066955,0.003006257,-0.0022367106,-0.04857364,0.001250449,0.0014392686,0.034671582,0.018141782,0.30240846,0.018054346,0.003062208,0.040367432,-0.07040852,0.052332688,-0.0028175337,-0.028020458,-0.021599045,0.031913813,-0.03909125,0.0028893205,-0.017719263,0.0052999025,-0.0061596422,0.054935843,-0.0012574365,-0.016914988,-0.009276138,0.023673639,0.043957185,-0.027961437,0.025381606,-0.04037111,-0.0053644218,-0.01048436,0.0035398034,-0.06366181,0.025020782,-0.046017863,-0.011454832,0.055446308,0.00011163922,-0.09325482,0.019621197,0.022895223,0.03182137,0.0010375826,-0.03117694,0.025362851,-0.031175531,-0.018045994,-0.13010256,0.10690098,-0.010491627,0.025534678,-0.0049998793,-0.028496867,0.043118607,-0.026229834,-0.01440331,0.024678908,0.033322413,-0.04394492,-0.005047783,0.0846922,0.022463208,0.0030116427,-0.003502701,-0.006854317,0.029395698,0.026690561,0.02559026,0.059080407,0.08340788,0.032878075,-0.0951223,0.05720357,0.02495402,0.014070283,-0.0042589814,0.018304987,-0.024781907,-0.041739304,-0.025803747,-0.012889254,-0.008009496,-0.028856821,-0.0005779219,0.028763987,-0.051368624,0.0027247544,0.06316944,-0.026757175,-0.08121664,-0.010547304,0.025082018,0.03702747,0.012908532,0.03141585,0.06318691,-0.027946094,0.17676711,-0.082001895,-0.036393072,-0.034927875,0.021505699,0.015366971,0.043793295,-0.0021506813,0.011197076,-0.04681245,-0.07142668,0.009581391,0.035224073,-0.04230499,-0.03571502,0.044728618,0.013419941,0.04271971,-0.008869499,-0.03126791,-0.0022953814,0.09043066,0.02422671,0.031988394,-0.005063331,-0.01025437,0.028456746,0.005116802,0.047064006,0.006069893,0.018045707,-0.022872277,-0.04572793,0.009827904,0.0069014616,-0.040622003,-0.013080576,-0.04777706,0.0012043755,0.07896354,0.043710608,0.040280547,0.073466524,0.06464221,0.014187437,-0.04872054,0.031972423,0.012510081,-0.038348954,0.016539646,0.006683025,-0.040044174,-0.056529168,0.04949601,-0.09106357,-0.030466262,0.010563386,-0.029358381,0.18323456,0.092901036,0.0274177,0.015892414,0.03165387,-0.06160097,0.0015103974,-0.11125003,0.010338306,-0.04025745,0.03327973,-0.025003629,-0.03141167,0.06007851,-0.029752823,-0.025986204,-0.0014932271,-0.00599316,-0.021954508,-0.005476444,-0.029271869,-0.040407516,0.09515277,0.019253343,0.04248291,0.00067515706,-0.009261151,0.025339367,-0.014061599,-0.0580183,-0.020854905,0.018436473,-0.0027048623,0.05364179,0.03416436,-0.009260716,-0.0785917,-0.023255466,0.03542782,0.07159498,0.0069388812,-0.038117178,-0.012323471,-0.009949083,-0.005902662,0.1273025,0.0014150682,0.018899381,0.022011757,-0.048523538,-0.03720841,-0.009601104,0.0547053,0.013078509,-0.013740014,-0.047507983,-0.018159833,0.017327625,-0.028147077,-0.030314941,-0.0028794382,-0.045816995,0.0028496154,0.015196548,-0.007854572,0.10382276,-0.01617453,0.017708423,0.037362352,0.002230973,-0.17829818,-0.036029417,-0.0006612718,-0.014223209,-0.06350168,-0.030032892,0.023901368,-0.00077770976,0.02510791,-0.04697416,0.15435414,0.08471184,-0.018154247,-0.030085038,0.03331496,0.09898532,0.016086424,0.010282825,-0.018388266,-0.006998348,0.017570151,0.0994389,0.12580456,0.023195932,0.008063885,0.003250409,-0.005355925,-0.047599785,-0.13378266,-0.0018643751,-0.045305796,-0.020819422,0.06300365,0.00095856196,0.005435208,0.0057721534,0.031151773,-0.03753951,0.016918143,-0.044961866,0.13784775,-0.016061982,-0.00000515642,-0.008715281,-0.01241248,-0.0021270465,0.022557234,0.05173467,-0.04232277,0.008206349,0.012508353,-0.004212918,-0.01315854,0.048109457,0.00035447034,-0.0082567325,0.012337424,0.0065427353,0.036199752,0.030513138,0.039167494,-0.028987426,-0.016657345,-0.07125146,-0.020769335]],"total_duration":17322701,"load_duration":6857526,"prompt_eval_count":4}' + recorded_at: Thu, 17 Apr 2025 13:20:31 GMT recorded_with: VCR 6.3.1 From 591668c3d7525b0dca045fe2edf2b2a87ab71e14 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Thu, 17 Apr 2025 18:40:30 -0300 Subject: [PATCH 50/55] Fix streaming response token count report --- lib/ruby_llm/providers/ollama/chat.rb | 2 +- lib/ruby_llm/providers/ollama/streaming.rb | 8 +- ...token_counts_compared_to_non-streaming.yml | 83 +++++++++++++++++++ 3 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_reports_consistent_token_counts_compared_to_non-streaming.yml diff --git a/lib/ruby_llm/providers/ollama/chat.rb b/lib/ruby_llm/providers/ollama/chat.rb index 2d3130a0..04f89ce6 100644 --- a/lib/ruby_llm/providers/ollama/chat.rb +++ b/lib/ruby_llm/providers/ollama/chat.rb @@ -28,9 +28,9 @@ def parse_completion_response(response) Message.new( role: :assistant, content: data.dig('message', 'content'), + model_id: data['model'], input_tokens: data['prompt_eval_count'].to_i, output_tokens: data['eval_count'].to_i, - model_id: data['model'], tool_calls: parse_tool_calls(data.dig('message', 'tool_calls')) ) end diff --git a/lib/ruby_llm/providers/ollama/streaming.rb b/lib/ruby_llm/providers/ollama/streaming.rb index 89e868d2..6c6e08e9 100644 --- a/lib/ruby_llm/providers/ollama/streaming.rb +++ b/lib/ruby_llm/providers/ollama/streaming.rb @@ -31,11 +31,9 @@ def build_chunk(data) role: :assistant, content: data.dig('message', 'content'), model_id: data['model'], - tool_calls: parse_tool_calls(data.dig('message', 'tool_calls')), - - # NOTE: unavailable in the response - https://ollama.readthedocs.io/en/api/#streaming-responses - input_tokens: nil, - output_tokens: nil + input_tokens: data['prompt_eval_count'], + output_tokens: data['eval_count'], + tool_calls: parse_tool_calls(data.dig('message', 'tool_calls')) ) end diff --git a/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_reports_consistent_token_counts_compared_to_non-streaming.yml b/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_reports_consistent_token_counts_compared_to_non-streaming.yml new file mode 100644 index 00000000..f63db4dd --- /dev/null +++ b/spec/fixtures/vcr_cassettes/chat_streaming_responses_ollama_llama3_1_8b_reports_consistent_token_counts_compared_to_non-streaming.yml @@ -0,0 +1,83 @@ +--- +http_interactions: +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Count + from 1 to 3"}],"options":{"temperature":0.0},"stream":true}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/x-ndjson + Date: + - Thu, 17 Apr 2025 22:09:15 GMT + Server: + - Caddy + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: | + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.338960004Z","message":{"role":"assistant","content":"Here"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.349707259Z","message":{"role":"assistant","content":" it"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.360338376Z","message":{"role":"assistant","content":" goes"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.370016028Z","message":{"role":"assistant","content":":\n\n"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.379779991Z","message":{"role":"assistant","content":"1"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.38931363Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.3989274Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.408293046Z","message":{"role":"assistant","content":"2"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.417605772Z","message":{"role":"assistant","content":","},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.426933175Z","message":{"role":"assistant","content":" "},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.436258799Z","message":{"role":"assistant","content":"3"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.445563687Z","message":{"role":"assistant","content":"!"},"done":false} + {"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.454869736Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":173654191,"load_duration":19141235,"prompt_eval_count":17,"prompt_eval_duration":22089437,"eval_count":13,"eval_duration":132081115} + recorded_at: Thu, 17 Apr 2025 22:09:07 GMT +- request: + method: post + uri: http://localhost:11434/api/chat + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","messages":[{"role":"user","content":"Count + from 1 to 3"}],"options":{"temperature":0.0},"stream":false}' + headers: + User-Agent: + - Faraday v2.12.2 + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Content-Length: + - '319' + Content-Type: + - application/json; charset=utf-8 + Date: + - Thu, 17 Apr 2025 22:09:15 GMT + Server: + - Caddy + body: + encoding: UTF-8 + string: '{"model":"llama3.1:8b","created_at":"2025-04-17T22:09:15.594337254Z","message":{"role":"assistant","content":"Here + it goes:\n\n1, 2, 3!"},"done_reason":"stop","done":true,"total_duration":135573445,"load_duration":14979170,"prompt_eval_count":17,"prompt_eval_duration":1331753,"eval_count":13,"eval_duration":118993228}' + recorded_at: Thu, 17 Apr 2025 22:09:07 GMT +recorded_with: VCR 6.3.1 From 6ad89b398a7f8da78943e78d733f65550989272d Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Tue, 22 Apr 2025 08:57:29 -0300 Subject: [PATCH 51/55] Adapt to new config API --- lib/ruby_llm/providers/ollama.rb | 8 +++++--- lib/ruby_llm/providers/ollama/models.rb | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index e66c9310..704ee850 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -14,11 +14,13 @@ module Ollama module_function - def api_base - RubyLLM.config.ollama_api_base_url + def api_base(config) + # no default since this is the only configuration for this provider, + # so it must be provided deliberately + config.ollama_api_base_url end - def headers + def headers(config) {} end diff --git a/lib/ruby_llm/providers/ollama/models.rb b/lib/ruby_llm/providers/ollama/models.rb index 6a336f1b..a308361f 100644 --- a/lib/ruby_llm/providers/ollama/models.rb +++ b/lib/ruby_llm/providers/ollama/models.rb @@ -25,9 +25,10 @@ def models_url # and thus no Ollama models will be known at runtime, so you'll need a # `RubyLLM.models.refresh!` to populate your instance's models. - def list_models + def list_models(connection:) + config = connection.config response = connection.get('api/tags') do |req| - req.headers.merge! headers + req.headers.merge!(headers(config)) end parse_list_models_response(response, slug, capabilities) From 0fd17595867cadef6bbc01e1afde61feb255a090 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Tue, 22 Apr 2025 08:57:44 -0300 Subject: [PATCH 52/55] Don't assume all providers add an api_key setting --- spec/ruby_llm/chat_error_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/ruby_llm/chat_error_spec.rb b/spec/ruby_llm/chat_error_spec.rb index da639ef1..fe0e0319 100644 --- a/spec/ruby_llm/chat_error_spec.rb +++ b/spec/ruby_llm/chat_error_spec.rb @@ -47,7 +47,7 @@ before do # Sabotage the API key after initialization RubyLLM::Provider.providers.each_key do |slug| - RubyLLM.config.public_send("#{slug}_api_key=", 'invalid-key') + RubyLLM.config.public_send("#{slug}_api_key=", 'invalid-key') if RubyLLM.config.respond_to?("#{slug}_api_key=") end end From 2fcc890ce95e54987a7e974e6ef835b296c41be0 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Tue, 22 Apr 2025 09:00:00 -0300 Subject: [PATCH 53/55] Update cassettes --- .../vcr_cassettes/initial_model_refresh.yml | 435 ++++++++++++------ 1 file changed, 302 insertions(+), 133 deletions(-) diff --git a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml index 00b0b732..dc4830c3 100644 --- a/spec/fixtures/vcr_cassettes/initial_model_refresh.yml +++ b/spec/fixtures/vcr_cassettes/initial_model_refresh.yml @@ -40,7 +40,7 @@ http_interactions: string: '' headers: User-Agent: - - Faraday v2.12.2 + - Faraday v2.13.0 Authorization: - Bearer Accept-Encoding: @@ -53,7 +53,7 @@ http_interactions: message: OK headers: Date: - - Wed, 02 Apr 2025 17:53:38 GMT + - Fri, 18 Apr 2025 18:38:41 GMT Content-Type: - application/json Transfer-Encoding: @@ -65,7 +65,7 @@ http_interactions: X-Request-Id: - "" Openai-Processing-Ms: - - '492' + - '1143' Strict-Transport-Security: - max-age=31536000; includeSubDomains; preload Cf-Cache-Status: @@ -87,12 +87,6 @@ http_interactions: { "object": "list", "data": [ - { - "id": "gpt-4o-realtime-preview-2024-12-17", - "object": "model", - "created": 1733945430, - "owned_by": "system" - }, { "id": "gpt-4o-audio-preview-2024-12-17", "object": "model", @@ -105,6 +99,12 @@ http_interactions: "created": 1698785189, "owned_by": "system" }, + { + "id": "text-embedding-3-large", + "object": "model", + "created": 1705953180, + "owned_by": "system" + }, { "id": "dall-e-2", "object": "model", @@ -112,69 +112,69 @@ http_interactions: "owned_by": "system" }, { - "id": "gpt-4o-audio-preview-2024-10-01", + "id": "o4-mini-2025-04-16", "object": "model", - "created": 1727389042, + "created": 1744133506, "owned_by": "system" }, { - "id": "gpt-4o-mini-realtime-preview-2024-12-17", + "id": "gpt-4o-audio-preview-2024-10-01", "object": "model", - "created": 1734112601, + "created": 1727389042, "owned_by": "system" }, { - "id": "gpt-4o-mini-realtime-preview", + "id": "o4-mini", "object": "model", - "created": 1734387380, + "created": 1744225351, "owned_by": "system" }, { - "id": "gpt-4o-realtime-preview-2024-10-01", + "id": "o3-mini", "object": "model", - "created": 1727131766, + "created": 1737146383, "owned_by": "system" }, { - "id": "gpt-4o-transcribe", + "id": "gpt-4.1-nano", "object": "model", - "created": 1742068463, + "created": 1744321707, "owned_by": "system" }, { - "id": "gpt-4o-mini-transcribe", + "id": "o3-mini-2025-01-31", "object": "model", - "created": 1742068596, + "created": 1738010200, "owned_by": "system" }, { - "id": "gpt-4o-realtime-preview", + "id": "gpt-4.1-nano-2025-04-14", "object": "model", - "created": 1727659998, + "created": 1744321025, "owned_by": "system" }, { - "id": "babbage-002", + "id": "gpt-4o-realtime-preview-2024-10-01", "object": "model", - "created": 1692634615, + "created": 1727131766, "owned_by": "system" }, { - "id": "gpt-4o-mini-tts", + "id": "gpt-4o-realtime-preview", "object": "model", - "created": 1742403959, + "created": 1727659998, "owned_by": "system" }, { - "id": "tts-1-hd-1106", + "id": "babbage-002", "object": "model", - "created": 1699053533, + "created": 1692634615, "owned_by": "system" }, { - "id": "text-embedding-3-large", + "id": "tts-1-hd-1106", "object": "model", - "created": 1705953180, + "created": 1699053533, "owned_by": "system" }, { @@ -190,9 +190,21 @@ http_interactions: "owned_by": "openai-internal" }, { - "id": "omni-moderation-latest", + "id": "o1-2024-12-17", "object": "model", - "created": 1731689265, + "created": 1734326976, + "owned_by": "system" + }, + { + "id": "o1-pro-2025-03-19", + "object": "model", + "created": 1742251504, + "owned_by": "system" + }, + { + "id": "o1", + "object": "model", + "created": 1734375816, "owned_by": "system" }, { @@ -207,6 +219,12 @@ http_interactions: "created": 1734387424, "owned_by": "system" }, + { + "id": "o1-pro", + "object": "model", + "created": 1742251791, + "owned_by": "system" + }, { "id": "gpt-4o-audio-preview", "object": "model", @@ -219,6 +237,24 @@ http_interactions: "created": 1725648865, "owned_by": "system" }, + { + "id": "gpt-4o-mini-realtime-preview", + "object": "model", + "created": 1734387380, + "owned_by": "system" + }, + { + "id": "gpt-4.1-mini", + "object": "model", + "created": 1744318173, + "owned_by": "system" + }, + { + "id": "gpt-4o-mini-realtime-preview-2024-12-17", + "object": "model", + "created": 1734112601, + "owned_by": "system" + }, { "id": "gpt-3.5-turbo-instruct-0914", "object": "model", @@ -231,12 +267,24 @@ http_interactions: "created": 1741391161, "owned_by": "system" }, + { + "id": "gpt-4.1-mini-2025-04-14", + "object": "model", + "created": 1744317547, + "owned_by": "system" + }, { "id": "tts-1-1106", "object": "model", "created": 1699053241, "owned_by": "system" }, + { + "id": "chatgpt-4o-latest", + "object": "model", + "created": 1723515131, + "owned_by": "system" + }, { "id": "davinci-002", "object": "model", @@ -249,6 +297,12 @@ http_interactions: "created": 1698959748, "owned_by": "system" }, + { + "id": "gpt-4o-search-preview", + "object": "model", + "created": 1741388720, + "owned_by": "system" + }, { "id": "gpt-4-turbo", "object": "model", @@ -256,9 +310,9 @@ http_interactions: "owned_by": "system" }, { - "id": "gpt-4-0125-preview", + "id": "gpt-4o-realtime-preview-2024-12-17", "object": "model", - "created": 1706037612, + "created": 1733945430, "owned_by": "system" }, { @@ -280,15 +334,15 @@ http_interactions: "owned_by": "system" }, { - "id": "chatgpt-4o-latest", + "id": "gpt-4o-mini-search-preview-2025-03-11", "object": "model", - "created": 1723515131, + "created": 1741390858, "owned_by": "system" }, { - "id": "gpt-4o-mini-search-preview-2025-03-11", + "id": "gpt-4-0125-preview", "object": "model", - "created": 1741390858, + "created": 1706037612, "owned_by": "system" }, { @@ -303,24 +357,12 @@ http_interactions: "created": 1677532384, "owned_by": "openai-internal" }, - { - "id": "gpt-3.5-turbo-0125", - "object": "model", - "created": 1706048358, - "owned_by": "system" - }, { "id": "gpt-4o-2024-05-13", "object": "model", "created": 1715368132, "owned_by": "system" }, - { - "id": "gpt-3.5-turbo-16k", - "object": "model", - "created": 1683758102, - "owned_by": "openai-internal" - }, { "id": "gpt-4-turbo-2024-04-09", "object": "model", @@ -328,10 +370,10 @@ http_interactions: "owned_by": "system" }, { - "id": "gpt-4-1106-preview", + "id": "gpt-3.5-turbo-16k", "object": "model", - "created": 1698957206, - "owned_by": "system" + "created": 1683758102, + "owned_by": "openai-internal" }, { "id": "o1-preview", @@ -345,12 +387,6 @@ http_interactions: "created": 1686588896, "owned_by": "openai" }, - { - "id": "gpt-4o-search-preview", - "object": "model", - "created": 1741388720, - "owned_by": "system" - }, { "id": "gpt-4.5-preview", "object": "model", @@ -381,24 +417,6 @@ http_interactions: "created": 1732734466, "owned_by": "system" }, - { - "id": "o1-2024-12-17", - "object": "model", - "created": 1734326976, - "owned_by": "system" - }, - { - "id": "o1", - "object": "model", - "created": 1734375816, - "owned_by": "system" - }, - { - "id": "o1-pro", - "object": "model", - "created": 1742251791, - "owned_by": "system" - }, { "id": "text-embedding-3-small", "object": "model", @@ -406,9 +424,9 @@ http_interactions: "owned_by": "system" }, { - "id": "o1-pro-2025-03-19", + "id": "gpt-4o-mini-tts", "object": "model", - "created": 1742251504, + "created": 1742403959, "owned_by": "system" }, { @@ -424,21 +442,27 @@ http_interactions: "owned_by": "system" }, { - "id": "o3-mini", + "id": "gpt-4o-2024-08-06", "object": "model", - "created": 1737146383, + "created": 1722814719, "owned_by": "system" }, { - "id": "gpt-4o-2024-08-06", + "id": "gpt-4.1", "object": "model", - "created": 1722814719, + "created": 1744316542, "owned_by": "system" }, { - "id": "o3-mini-2025-01-31", + "id": "gpt-4o-transcribe", "object": "model", - "created": 1738010200, + "created": 1742068463, + "owned_by": "system" + }, + { + "id": "gpt-4.1-2025-04-14", + "object": "model", + "created": 1744315746, "owned_by": "system" }, { @@ -447,6 +471,12 @@ http_interactions: "created": 1721172717, "owned_by": "system" }, + { + "id": "gpt-4o-mini-transcribe", + "object": "model", + "created": 1742068596, + "owned_by": "system" + }, { "id": "o1-mini", "object": "model", @@ -459,6 +489,12 @@ http_interactions: "created": 1734115920, "owned_by": "system" }, + { + "id": "gpt-3.5-turbo-0125", + "object": "model", + "created": 1706048358, + "owned_by": "system" + }, { "id": "o1-mini-2024-09-12", "object": "model", @@ -466,14 +502,20 @@ http_interactions: "owned_by": "system" }, { - "id": "gpt-4.1-nano", + "id": "gpt-4-1106-preview", "object": "model", - "created": 1725648979, + "created": 1698957206, + "owned_by": "system" + }, + { + "id": "omni-moderation-latest", + "object": "model", + "created": 1731689265, "owned_by": "system" } ] } - recorded_at: Wed, 02 Apr 2025 17:53:38 GMT + recorded_at: Fri, 18 Apr 2025 18:38:41 GMT - request: method: get uri: https://api.anthropic.com/v1/models @@ -482,7 +524,7 @@ http_interactions: string: '' headers: User-Agent: - - Faraday v2.12.2 + - Faraday v2.13.0 X-Api-Key: - "" Anthropic-Version: @@ -497,7 +539,7 @@ http_interactions: message: OK headers: Date: - - Wed, 02 Apr 2025 17:53:39 GMT + - Fri, 18 Apr 2025 18:38:42 GMT Content-Type: - application/json Transfer-Encoding: @@ -530,7 +572,7 @@ http_interactions: 3 Sonnet","created_at":"2024-02-29T00:00:00Z"},{"type":"model","id":"claude-2.1","display_name":"Claude 2.1","created_at":"2023-11-21T00:00:00Z"},{"type":"model","id":"claude-2.0","display_name":"Claude 2.0","created_at":"2023-07-11T00:00:00Z"}],"has_more":false,"first_id":"claude-3-7-sonnet-20250219","last_id":"claude-2.0"}' - recorded_at: Wed, 02 Apr 2025 17:53:39 GMT + recorded_at: Fri, 18 Apr 2025 18:38:42 GMT - request: method: get uri: https://generativelanguage.googleapis.com/v1beta/models @@ -539,7 +581,7 @@ http_interactions: string: '' headers: User-Agent: - - Faraday v2.12.2 + - Faraday v2.13.0 X-Goog-Api-Key: - "" Accept-Encoding: @@ -558,7 +600,7 @@ http_interactions: - Referer - X-Origin Date: - - Wed, 02 Apr 2025 17:53:39 GMT + - Fri, 18 Apr 2025 18:38:42 GMT Server: - scaffolding on HTTPServer2 X-Xss-Protection: @@ -568,7 +610,7 @@ http_interactions: X-Content-Type-Options: - nosniff Server-Timing: - - gfet4t7; dur=86 + - gfet4t7; dur=81 Alt-Svc: - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Transfer-Encoding: @@ -892,7 +934,42 @@ http_interactions: "outputTokenLimit": 65536, "supportedGenerationMethods": [ "generateContent", - "countTokens" + "countTokens", + "createCachedContent" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.5-pro-preview-03-25", + "version": "2.5-preview-03-25", + "displayName": "Gemini 2.5 Pro Preview 03-25", + "description": "Gemini 2.5 Pro Preview 03-25", + "inputTokenLimit": 1048576, + "outputTokenLimit": 65536, + "supportedGenerationMethods": [ + "generateContent", + "countTokens", + "createCachedContent" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemini-2.5-flash-preview-04-17", + "version": "2.5-preview-04-17", + "displayName": "Gemini 2.5 Flash Preview 04-17", + "description": "Preview release (April 17th, 2025) of Gemini 2.5 Flash", + "inputTokenLimit": 1048576, + "outputTokenLimit": 65536, + "supportedGenerationMethods": [ + "generateContent", + "countTokens", + "createCachedContent" ], "temperature": 1, "topP": 0.95, @@ -925,7 +1002,8 @@ http_interactions: "outputTokenLimit": 8192, "supportedGenerationMethods": [ "generateContent", - "countTokens" + "countTokens", + "createCachedContent" ], "temperature": 1, "topP": 0.95, @@ -939,26 +1017,10 @@ http_interactions: "description": "Stable version of Gemini 2.0 Flash, our fast and versatile multimodal model for scaling across diverse tasks, released in January of 2025.", "inputTokenLimit": 1048576, "outputTokenLimit": 8192, - "supportedGenerationMethods": [ - "generateContent", - "countTokens" - ], - "temperature": 1, - "topP": 0.95, - "topK": 40, - "maxTemperature": 2 - }, - { - "name": "models/gemini-2.0-flash-exp-image-generation", - "version": "2.0", - "displayName": "Gemini 2.0 Flash (Image Generation) Experimental", - "description": "Gemini 2.0 Flash (Image Generation) Experimental", - "inputTokenLimit": 1048576, - "outputTokenLimit": 8192, "supportedGenerationMethods": [ "generateContent", "countTokens", - "bidiGenerateContent" + "createCachedContent" ], "temperature": 1, "topP": 0.95, @@ -1038,7 +1100,8 @@ http_interactions: "outputTokenLimit": 65536, "supportedGenerationMethods": [ "generateContent", - "countTokens" + "countTokens", + "createCachedContent" ], "temperature": 1, "topP": 0.95, @@ -1054,7 +1117,8 @@ http_interactions: "outputTokenLimit": 65536, "supportedGenerationMethods": [ "generateContent", - "countTokens" + "countTokens", + "createCachedContent" ], "temperature": 1, "topP": 0.95, @@ -1070,7 +1134,8 @@ http_interactions: "outputTokenLimit": 65536, "supportedGenerationMethods": [ "generateContent", - "countTokens" + "countTokens", + "createCachedContent" ], "temperature": 1, "topP": 0.95, @@ -1141,6 +1206,36 @@ http_interactions: "topK": 64, "maxTemperature": 2 }, + { + "name": "models/learnlm-2.0-flash-experimental", + "version": "2.0", + "displayName": "LearnLM 2.0 Flash Experimental", + "description": "LearnLM 2.0 Flash Experimental", + "inputTokenLimit": 1048576, + "outputTokenLimit": 32768, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 + }, + { + "name": "models/gemma-3-1b-it", + "version": "001", + "displayName": "Gemma 3 1B", + "inputTokenLimit": 32768, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "generateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64 + }, { "name": "models/gemma-3-4b-it", "version": "001", @@ -1213,7 +1308,8 @@ http_interactions: "inputTokenLimit": 8192, "outputTokenLimit": 1, "supportedGenerationMethods": [ - "embedContent" + "embedContent", + "countTextTokens" ] }, { @@ -1224,7 +1320,8 @@ http_interactions: "inputTokenLimit": 8192, "outputTokenLimit": 1, "supportedGenerationMethods": [ - "embedContent" + "embedContent", + "countTextTokens" ] }, { @@ -1251,10 +1348,37 @@ http_interactions: "supportedGenerationMethods": [ "predict" ] + }, + { + "name": "models/veo-2.0-generate-001", + "version": "2.0", + "displayName": "Veo 2", + "description": "Vertex served Veo 2 model.", + "inputTokenLimit": 480, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "predictLongRunning" + ] + }, + { + "name": "models/gemini-2.0-flash-live-001", + "version": "001", + "displayName": "Gemini 2.0 Flash 001", + "description": "Gemini 2.0 Flash 001", + "inputTokenLimit": 131072, + "outputTokenLimit": 8192, + "supportedGenerationMethods": [ + "bidiGenerateContent", + "countTokens" + ], + "temperature": 1, + "topP": 0.95, + "topK": 64, + "maxTemperature": 2 } ] } - recorded_at: Wed, 02 Apr 2025 17:53:39 GMT + recorded_at: Fri, 18 Apr 2025 18:38:42 GMT - request: method: get uri: https://api.deepseek.com/models @@ -1263,7 +1387,7 @@ http_interactions: string: '' headers: User-Agent: - - Faraday v2.12.2 + - Faraday v2.13.0 Authorization: - Bearer Accept-Encoding: @@ -1276,7 +1400,7 @@ http_interactions: message: OK headers: Date: - - Wed, 02 Apr 2025 17:53:39 GMT + - Fri, 18 Apr 2025 18:38:42 GMT Content-Type: - application/json Transfer-Encoding: @@ -1288,7 +1412,7 @@ http_interactions: Access-Control-Allow-Credentials: - 'true' X-Ds-Trace-Id: - - eb9c177a0c3141beac66e5213c60ac6a + - fbb25c39e2bc649c91a644041e454d2b Strict-Transport-Security: - max-age=31536000; includeSubDomains; preload X-Content-Type-Options: @@ -1304,7 +1428,7 @@ http_interactions: body: encoding: ASCII-8BIT string: '{"object":"list","data":[{"id":"deepseek-chat","object":"model","owned_by":"deepseek"},{"id":"deepseek-reasoner","object":"model","owned_by":"deepseek"}]}' - recorded_at: Wed, 02 Apr 2025 17:53:39 GMT + recorded_at: Fri, 18 Apr 2025 18:38:42 GMT - request: method: get uri: http://localhost:11434/api/tags @@ -1341,16 +1465,16 @@ http_interactions: string: '' headers: User-Agent: - - Faraday v2.12.2 + - Faraday v2.13.0 Host: - bedrock..amazonaws.com X-Amz-Date: - - 20250402T175339Z + - 20250418T183842Z X-Amz-Content-Sha256: - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 Authorization: - - AWS4-HMAC-SHA256 Credential=/20250402//bedrock/aws4_request, - SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=5f69d324c05740f272e7c07046b973076335bd284cd150f03901ba9b30a62f4e + - AWS4-HMAC-SHA256 Credential=/20250418//bedrock/aws4_request, + SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=cb5126823897aeb4f060c8d7e6049074ec8435c6baed641158c2d920723acb89 Accept-Encoding: - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 Accept: @@ -1361,15 +1485,15 @@ http_interactions: message: OK headers: Date: - - Wed, 02 Apr 2025 17:53:40 GMT + - Fri, 18 Apr 2025 18:38:43 GMT Content-Type: - application/json Content-Length: - - '45253' + - '45785' Connection: - keep-alive X-Amzn-Requestid: - - 62d4de6c-de54-44b7-b02e-51731449128a + - c1553dca-65ed-4b3e-968c-31905a47ff81 body: encoding: UTF-8 string: '{"modelSummaries":[{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/amazon.titan-tg1-large","modelId":"amazon.titan-tg1-large","modelLifecycle":{"status":"ACTIVE"},"modelName":"Titan @@ -1450,7 +1574,52 @@ http_interactions: 7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/mistral.mixtral-8x7b-instruct-v0:1","modelId":"mistral.mixtral-8x7b-instruct-v0:1","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mixtral 8x7B Instruct","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/mistral.mistral-large-2402-v1:0","modelId":"mistral.mistral-large-2402-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral Large (24.02)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/mistral.mistral-large-2407-v1:0","modelId":"mistral.mistral-large-2407-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Mistral - Large (24.07)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/luma.ray-v2:0","modelId":"luma.ray-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Ray + Large (24.07)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":true,"inferenceTypesSupported":["INFERENCE_PROFILE"],"inputModalities":["TEXT","IMAGE"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/mistral.pixtral-large-2502-v1:0","modelId":"mistral.pixtral-large-2502-v1:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Pixtral + Large (25.02)","outputModalities":["TEXT"],"providerName":"Mistral AI","responseStreamingSupported":true},{"customizationsSupported":[],"explicitPromptCaching":{"isSupported":false},"guardrailsSupported":false,"inferenceTypesSupported":["ON_DEMAND"],"inputModalities":["TEXT"],"intelligentPromptRouting":{"isSupported":false},"modelArn":"arn:aws:bedrock:::foundation-model/luma.ray-v2:0","modelId":"luma.ray-v2:0","modelLifecycle":{"status":"ACTIVE"},"modelName":"Ray v2","outputModalities":["VIDEO"],"providerName":"Luma AI","responseStreamingSupported":false}]}' - recorded_at: Wed, 02 Apr 2025 17:53:40 GMT + recorded_at: Fri, 18 Apr 2025 18:38:43 GMT +- request: + method: get + uri: https://openrouter.ai/api/v1/models + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v2.13.0 + Authorization: + - Bearer + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Date: + - Mon, 21 Apr 2025 11:25:26 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Access-Control-Allow-Origin: + - "*" + Cdn-Cache-Control: + - max-age=300 + Vary: + - Accept-Encoding + Server: + - cloudflare + Cf-Ray: + - "" + body: + encoding: ASCII-8BIT + string: !binary |- + eyJkYXRhIjpbeyJpZCI6Imdvb2dsZS9nZW1pbmktMi41LXByby1wcmV2aWV3LTAzLTI1IiwibmFtZSI6Ikdvb2dsZTogR2VtaW5pIDIuNSBQcm8gUHJldmlldyIsImNyZWF0ZWQiOjE3NDQ5MjQyMDYsImRlc2NyaXB0aW9uIjoiR2VtaW5pIDIuNSBQcm8gaXMgR29vZ2xl4oCZcyBzdGF0ZS1vZi10aGUtYXJ0IEFJIG1vZGVsIGRlc2lnbmVkIGZvciBhZHZhbmNlZCByZWFzb25pbmcsIGNvZGluZywgbWF0aGVtYXRpY3MsIGFuZCBzY2llbnRpZmljIHRhc2tzLiBJdCBlbXBsb3lzIOKAnHRoaW5raW5n4oCdIGNhcGFiaWxpdGllcywgZW5hYmxpbmcgaXQgdG8gcmVhc29uIHRocm91Z2ggcmVzcG9uc2VzIHdpdGggZW5oYW5jZWQgYWNjdXJhY3kgYW5kIG51YW5jZWQgY29udGV4dCBoYW5kbGluZy4gR2VtaW5pIDIuNSBQcm8gYWNoaWV2ZXMgdG9wLXRpZXIgcGVyZm9ybWFuY2Ugb24gbXVsdGlwbGUgYmVuY2htYXJrcywgaW5jbHVkaW5nIGZpcnN0LXBsYWNlIHBvc2l0aW9uaW5nIG9uIHRoZSBMTUFyZW5hIGxlYWRlcmJvYXJkLCByZWZsZWN0aW5nIHN1cGVyaW9yIGh1bWFuLXByZWZlcmVuY2UgYWxpZ25tZW50IGFuZCBjb21wbGV4IHByb2JsZW0tc29sdmluZyBhYmlsaXRpZXMuIiwiY29udGV4dF9sZW5ndGgiOjEwNDg1NzYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdlbWluaSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxMjUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwNTE2Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIiwiaW5wdXRfY2FjaGVfcmVhZCI6IjAuMDAwMDAwMzEyNSIsImlucHV0X2NhY2hlX3dyaXRlIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEwNDg1NzYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NjU1MzUsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJ0aHVkbS9nbG0tejEtMzJiOmZyZWUiLCJuYW1lIjoiVEhVRE06IEdMTSBaMSAzMkIgKGZyZWUpIiwiY3JlYXRlZCI6MTc0NDkyNDE0OCwiZGVzY3JpcHRpb24iOiJHTE0tWjEtMzJCLTA0MTQgaXMgYW4gZW5oYW5jZWQgcmVhc29uaW5nIHZhcmlhbnQgb2YgR0xNLTQtMzJCLCBidWlsdCBmb3IgZGVlcCBtYXRoZW1hdGljYWwsIGxvZ2ljYWwsIGFuZCBjb2RlLW9yaWVudGVkIHByb2JsZW0gc29sdmluZy4gSXQgYXBwbGllcyBleHRlbmRlZCByZWluZm9yY2VtZW50IGxlYXJuaW5n4oCUYm90aCB0YXNrLXNwZWNpZmljIGFuZCBnZW5lcmFsIHBhaXJ3aXNlIHByZWZlcmVuY2UtYmFzZWTigJR0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9uIGNvbXBsZXggbXVsdGktc3RlcCB0YXNrcy4gQ29tcGFyZWQgdG8gdGhlIGJhc2UgR0xNLTQtMzJCIG1vZGVsLCBaMSBzaWduaWZpY2FudGx5IGJvb3N0cyBjYXBhYmlsaXRpZXMgaW4gc3RydWN0dXJlZCByZWFzb25pbmcgYW5kIGZvcm1hbCBkb21haW5zLlxuXG5UaGUgbW9kZWwgc3VwcG9ydHMgZW5mb3JjZWQg4oCcdGhpbmtpbmfigJ0gc3RlcHMgdmlhIHByb21wdCBlbmdpbmVlcmluZyBhbmQgb2ZmZXJzIGltcHJvdmVkIGNvaGVyZW5jZSBmb3IgbG9uZy1mb3JtIG91dHB1dHMuIEl04oCZcyBvcHRpbWl6ZWQgZm9yIHVzZSBpbiBhZ2VudGljIHdvcmtmbG93cywgYW5kIGluY2x1ZGVzIHN1cHBvcnQgZm9yIGxvbmcgY29udGV4dCAodmlhIFlhUk4pLCBKU09OIHRvb2wgY2FsbGluZywgYW5kIGZpbmUtZ3JhaW5lZCBzYW1wbGluZyBjb25maWd1cmF0aW9uIGZvciBzdGFibGUgaW5mZXJlbmNlLiBJZGVhbCBmb3IgdXNlIGNhc2VzIHJlcXVpcmluZyBkZWxpYmVyYXRlLCBtdWx0aS1zdGVwIHJlYXNvbmluZyBvciBmb3JtYWwgZGVyaXZhdGlvbnMuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjoiZGVlcHNlZWstcjEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJ0aHVkbS9nbG0tNC0zMmI6ZnJlZSIsIm5hbWUiOiJUSFVETTogR0xNIDQgMzJCIChmcmVlKSIsImNyZWF0ZWQiOjE3NDQ5MjA5MTUsImRlc2NyaXB0aW9uIjoiR0xNLTQtMzJCLTA0MTQgaXMgYSAzMkIgYmlsaW5ndWFsIChDaGluZXNlLUVuZ2xpc2gpIG9wZW4td2VpZ2h0IGxhbmd1YWdlIG1vZGVsIG9wdGltaXplZCBmb3IgY29kZSBnZW5lcmF0aW9uLCBmdW5jdGlvbiBjYWxsaW5nLCBhbmQgYWdlbnQtc3R5bGUgdGFza3MuIFByZXRyYWluZWQgb24gMTVUIG9mIGhpZ2gtcXVhbGl0eSBhbmQgcmVhc29uaW5nLWhlYXZ5IGRhdGEsIGl0IHdhcyBmdXJ0aGVyIHJlZmluZWQgdXNpbmcgaHVtYW4gcHJlZmVyZW5jZSBhbGlnbm1lbnQsIHJlamVjdGlvbiBzYW1wbGluZywgYW5kIHJlaW5mb3JjZW1lbnQgbGVhcm5pbmcuIFRoZSBtb2RlbCBleGNlbHMgaW4gY29tcGxleCByZWFzb25pbmcsIGFydGlmYWN0IGdlbmVyYXRpb24sIGFuZCBzdHJ1Y3R1cmVkIG91dHB1dCB0YXNrcywgYWNoaWV2aW5nIHBlcmZvcm1hbmNlIGNvbXBhcmFibGUgdG8gR1BULTRvIGFuZCBEZWVwU2Vlay1WMy0wMzI0IGFjcm9zcyBzZXZlcmFsIGJlbmNobWFya3MuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvZ2VtaW5pLTIuNS1mbGFzaC1wcmV2aWV3IiwibmFtZSI6Ikdvb2dsZTogR2VtaW5pIDIuNSBGbGFzaCBQcmV2aWV3IiwiY3JlYXRlZCI6MTc0NDkxNDY2NywiZGVzY3JpcHRpb24iOiJHZW1pbmkgMi41IEZsYXNoIGlzIEdvb2dsZSdzIHN0YXRlLW9mLXRoZS1hcnQgd29ya2hvcnNlIG1vZGVsLCBzcGVjaWZpY2FsbHkgZGVzaWduZWQgZm9yIGFkdmFuY2VkIHJlYXNvbmluZywgY29kaW5nLCBtYXRoZW1hdGljcywgYW5kIHNjaWVudGlmaWMgdGFza3MuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIFwidGhpbmtpbmdcIiBjYXBhYmlsaXRpZXMsIGVuYWJsaW5nIGl0IHRvIHByb3ZpZGUgcmVzcG9uc2VzIHdpdGggZ3JlYXRlciBhY2N1cmFjeSBhbmQgbnVhbmNlZCBjb250ZXh0IGhhbmRsaW5nLiBcblxuTm90ZTogVGhpcyBtb2RlbCBpcyBhdmFpbGFibGUgaW4gdHdvIHZhcmlhbnRzOiB0aGlua2luZyBhbmQgbm9uLXRoaW5raW5nLiBUaGUgb3V0cHV0IHByaWNpbmcgdmFyaWVzIHNpZ25pZmljYW50bHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHRoaW5raW5nIGNhcGFiaWxpdHkgaXMgYWN0aXZlLiBJZiB5b3Ugc2VsZWN0IHRoZSBzdGFuZGFyZCB2YXJpYW50ICh3aXRob3V0IHRoZSBcIjp0aGlua2luZ1wiIHN1ZmZpeCksIHRoZSBtb2RlbCB3aWxsIGV4cGxpY2l0bHkgYXZvaWQgZ2VuZXJhdGluZyB0aGlua2luZyB0b2tlbnMuIFxuXG5UbyB1dGlsaXplIHRoZSB0aGlua2luZyBjYXBhYmlsaXR5IGFuZCByZWNlaXZlIHRoaW5raW5nIHRva2VucywgeW91IG11c3QgY2hvb3NlIHRoZSBcIjp0aGlua2luZ1wiIHZhcmlhbnQsIHdoaWNoIHdpbGwgdGhlbiBpbmN1ciB0aGUgaGlnaGVyIHRoaW5raW5nLW91dHB1dCBwcmljaW5nLiBcblxuQWRkaXRpb25hbGx5LCBHZW1pbmkgMi41IEZsYXNoIGlzIGNvbmZpZ3VyYWJsZSB0aHJvdWdoIHRoZSBcIm1heCB0b2tlbnMgZm9yIHJlYXNvbmluZ1wiIHBhcmFtZXRlciwgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChodHRwczovL29wZW5yb3V0ZXIuYWkvZG9jcy91c2UtY2FzZXMvcmVhc29uaW5nLXRva2VucyNtYXgtdG9rZW5zLWZvci1yZWFzb25pbmcpLiIsImNvbnRleHRfbGVuZ3RoIjoxMDQ4NTc2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJpbWFnZSIsInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDE1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwNiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDYxOTIiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMDQ4NTc2LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjY1NTM1LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZ29vZ2xlL2dlbWluaS0yLjUtZmxhc2gtcHJldmlldzp0aGlua2luZyIsIm5hbWUiOiJHb29nbGU6IEdlbWluaSAyLjUgRmxhc2ggUHJldmlldyAodGhpbmtpbmcpIiwiY3JlYXRlZCI6MTc0NDkxNDY2NywiZGVzY3JpcHRpb24iOiJHZW1pbmkgMi41IEZsYXNoIGlzIEdvb2dsZSdzIHN0YXRlLW9mLXRoZS1hcnQgd29ya2hvcnNlIG1vZGVsLCBzcGVjaWZpY2FsbHkgZGVzaWduZWQgZm9yIGFkdmFuY2VkIHJlYXNvbmluZywgY29kaW5nLCBtYXRoZW1hdGljcywgYW5kIHNjaWVudGlmaWMgdGFza3MuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIFwidGhpbmtpbmdcIiBjYXBhYmlsaXRpZXMsIGVuYWJsaW5nIGl0IHRvIHByb3ZpZGUgcmVzcG9uc2VzIHdpdGggZ3JlYXRlciBhY2N1cmFjeSBhbmQgbnVhbmNlZCBjb250ZXh0IGhhbmRsaW5nLiBcblxuTm90ZTogVGhpcyBtb2RlbCBpcyBhdmFpbGFibGUgaW4gdHdvIHZhcmlhbnRzOiB0aGlua2luZyBhbmQgbm9uLXRoaW5raW5nLiBUaGUgb3V0cHV0IHByaWNpbmcgdmFyaWVzIHNpZ25pZmljYW50bHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHRoaW5raW5nIGNhcGFiaWxpdHkgaXMgYWN0aXZlLiBJZiB5b3Ugc2VsZWN0IHRoZSBzdGFuZGFyZCB2YXJpYW50ICh3aXRob3V0IHRoZSBcIjp0aGlua2luZ1wiIHN1ZmZpeCksIHRoZSBtb2RlbCB3aWxsIGV4cGxpY2l0bHkgYXZvaWQgZ2VuZXJhdGluZyB0aGlua2luZyB0b2tlbnMuIFxuXG5UbyB1dGlsaXplIHRoZSB0aGlua2luZyBjYXBhYmlsaXR5IGFuZCByZWNlaXZlIHRoaW5raW5nIHRva2VucywgeW91IG11c3QgY2hvb3NlIHRoZSBcIjp0aGlua2luZ1wiIHZhcmlhbnQsIHdoaWNoIHdpbGwgdGhlbiBpbmN1ciB0aGUgaGlnaGVyIHRoaW5raW5nLW91dHB1dCBwcmljaW5nLiBcblxuQWRkaXRpb25hbGx5LCBHZW1pbmkgMi41IEZsYXNoIGlzIGNvbmZpZ3VyYWJsZSB0aHJvdWdoIHRoZSBcIm1heCB0b2tlbnMgZm9yIHJlYXNvbmluZ1wiIHBhcmFtZXRlciwgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChodHRwczovL29wZW5yb3V0ZXIuYWkvZG9jcy91c2UtY2FzZXMvcmVhc29uaW5nLXRva2VucyNtYXgtdG9rZW5zLWZvci1yZWFzb25pbmcpLiIsImNvbnRleHRfbGVuZ3RoIjoxMDQ4NTc2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJpbWFnZSIsInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDE1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAzNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDYxOTIiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMDQ4NTc2LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjY1NTM1LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL280LW1pbmktaGlnaCIsIm5hbWUiOiJPcGVuQUk6IG80IE1pbmkgSGlnaCIsImNyZWF0ZWQiOjE3NDQ4MjQyMTIsImRlc2NyaXB0aW9uIjoiT3BlbkFJIG80LW1pbmktaGlnaCBpcyB0aGUgc2FtZSBtb2RlbCBhcyBbbzQtbWluaV0oL29wZW5haS9vNC1taW5pKSB3aXRoIHJlYXNvbmluZ19lZmZvcnQgc2V0IHRvIGhpZ2guIFxuXG5PcGVuQUkgbzQtbWluaSBpcyBhIGNvbXBhY3QgcmVhc29uaW5nIG1vZGVsIGluIHRoZSBvLXNlcmllcywgb3B0aW1pemVkIGZvciBmYXN0LCBjb3N0LWVmZmljaWVudCBwZXJmb3JtYW5jZSB3aGlsZSByZXRhaW5pbmcgc3Ryb25nIG11bHRpbW9kYWwgYW5kIGFnZW50aWMgY2FwYWJpbGl0aWVzLiBJdCBzdXBwb3J0cyB0b29sIHVzZSBhbmQgZGVtb25zdHJhdGVzIGNvbXBldGl0aXZlIHJlYXNvbmluZyBhbmQgY29kaW5nIHBlcmZvcm1hbmNlIGFjcm9zcyBiZW5jaG1hcmtzIGxpa2UgQUlNRSAoOTkuNSUgd2l0aCBQeXRob24pIGFuZCBTV0UtYmVuY2gsIG91dHBlcmZvcm1pbmcgaXRzIHByZWRlY2Vzc29yIG8zLW1pbmkgYW5kIGV2ZW4gYXBwcm9hY2hpbmcgbzMgaW4gc29tZSBkb21haW5zLlxuXG5EZXNwaXRlIGl0cyBzbWFsbGVyIHNpemUsIG80LW1pbmkgZXhoaWJpdHMgaGlnaCBhY2N1cmFjeSBpbiBTVEVNIHRhc2tzLCB2aXN1YWwgcHJvYmxlbSBzb2x2aW5nIChlLmcuLCBNYXRoVmlzdGEsIE1NTVUpLCBhbmQgY29kZSBlZGl0aW5nLiBJdCBpcyBlc3BlY2lhbGx5IHdlbGwtc3VpdGVkIGZvciBoaWdoLXRocm91Z2hwdXQgc2NlbmFyaW9zIHdoZXJlIGxhdGVuY3kgb3IgY29zdCBpcyBjcml0aWNhbC4gVGhhbmtzIHRvIGl0cyBlZmZpY2llbnQgYXJjaGl0ZWN0dXJlIGFuZCByZWZpbmVkIHJlaW5mb3JjZW1lbnQgbGVhcm5pbmcgdHJhaW5pbmcsIG80LW1pbmkgY2FuIGNoYWluIHRvb2xzLCBnZW5lcmF0ZSBzdHJ1Y3R1cmVkIG91dHB1dHMsIGFuZCBzb2x2ZSBtdWx0aS1zdGVwIHRhc2tzIHdpdGggbWluaW1hbCBkZWxheeKAlG9mdGVuIGluIHVuZGVyIGEgbWludXRlLiIsImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbImltYWdlIiwidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDExIiwiY29tcGxldGlvbiI6IjAuMDAwMDA0NCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDg0MTUiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAyNzUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MTAwMDAwLCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvbzMiLCJuYW1lIjoiT3BlbkFJOiBvMyIsImNyZWF0ZWQiOjE3NDQ4MjM0NTcsImRlc2NyaXB0aW9uIjoibzMgaXMgYSB3ZWxsLXJvdW5kZWQgYW5kIHBvd2VyZnVsIG1vZGVsIGFjcm9zcyBkb21haW5zLiBJdCBzZXRzIGEgbmV3IHN0YW5kYXJkIGZvciBtYXRoLCBzY2llbmNlLCBjb2RpbmcsIGFuZCB2aXN1YWwgcmVhc29uaW5nIHRhc2tzLiBJdCBhbHNvIGV4Y2VscyBhdCB0ZWNobmljYWwgd3JpdGluZyBhbmQgaW5zdHJ1Y3Rpb24tZm9sbG93aW5nLiBVc2UgaXQgdG8gdGhpbmsgdGhyb3VnaCBtdWx0aS1zdGVwIHByb2JsZW1zIHRoYXQgaW52b2x2ZSBhbmFseXNpcyBhY3Jvc3MgdGV4dCwgY29kZSwgYW5kIGltYWdlcy4gTm90ZSB0aGF0IEJZT0sgaXMgcmVxdWlyZWQgZm9yIHRoaXMgbW9kZWwuIFNldCB1cCBoZXJlOiBodHRwczovL29wZW5yb3V0ZXIuYWkvc2V0dGluZ3MvaW50ZWdyYXRpb25zIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsiaW1hZ2UiLCJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDc2NSIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwMjUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MTAwMDAwLCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvbzQtbWluaSIsIm5hbWUiOiJPcGVuQUk6IG80IE1pbmkiLCJjcmVhdGVkIjoxNzQ0ODIwOTQyLCJkZXNjcmlwdGlvbiI6Ik9wZW5BSSBvNC1taW5pIGlzIGEgY29tcGFjdCByZWFzb25pbmcgbW9kZWwgaW4gdGhlIG8tc2VyaWVzLCBvcHRpbWl6ZWQgZm9yIGZhc3QsIGNvc3QtZWZmaWNpZW50IHBlcmZvcm1hbmNlIHdoaWxlIHJldGFpbmluZyBzdHJvbmcgbXVsdGltb2RhbCBhbmQgYWdlbnRpYyBjYXBhYmlsaXRpZXMuIEl0IHN1cHBvcnRzIHRvb2wgdXNlIGFuZCBkZW1vbnN0cmF0ZXMgY29tcGV0aXRpdmUgcmVhc29uaW5nIGFuZCBjb2RpbmcgcGVyZm9ybWFuY2UgYWNyb3NzIGJlbmNobWFya3MgbGlrZSBBSU1FICg5OS41JSB3aXRoIFB5dGhvbikgYW5kIFNXRS1iZW5jaCwgb3V0cGVyZm9ybWluZyBpdHMgcHJlZGVjZXNzb3IgbzMtbWluaSBhbmQgZXZlbiBhcHByb2FjaGluZyBvMyBpbiBzb21lIGRvbWFpbnMuXG5cbkRlc3BpdGUgaXRzIHNtYWxsZXIgc2l6ZSwgbzQtbWluaSBleGhpYml0cyBoaWdoIGFjY3VyYWN5IGluIFNURU0gdGFza3MsIHZpc3VhbCBwcm9ibGVtIHNvbHZpbmcgKGUuZy4sIE1hdGhWaXN0YSwgTU1NVSksIGFuZCBjb2RlIGVkaXRpbmcuIEl0IGlzIGVzcGVjaWFsbHkgd2VsbC1zdWl0ZWQgZm9yIGhpZ2gtdGhyb3VnaHB1dCBzY2VuYXJpb3Mgd2hlcmUgbGF0ZW5jeSBvciBjb3N0IGlzIGNyaXRpY2FsLiBUaGFua3MgdG8gaXRzIGVmZmljaWVudCBhcmNoaXRlY3R1cmUgYW5kIHJlZmluZWQgcmVpbmZvcmNlbWVudCBsZWFybmluZyB0cmFpbmluZywgbzQtbWluaSBjYW4gY2hhaW4gdG9vbHMsIGdlbmVyYXRlIHN0cnVjdHVyZWQgb3V0cHV0cywgYW5kIHNvbHZlIG11bHRpLXN0ZXAgdGFza3Mgd2l0aCBtaW5pbWFsIGRlbGF54oCUb2Z0ZW4gaW4gdW5kZXIgYSBtaW51dGUuIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsiaW1hZ2UiLCJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMTEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDQ0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDAwODQxNSIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwMDI3NSJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMDAwMDAsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InNoaXNhLWFpL3NoaXNhLXYyLWxsYW1hMy4zLTcwYjpmcmVlIiwibmFtZSI6IlNoaXNhIEFJOiBTaGlzYSBWMiBMbGFtYSAzLjMgNzBCICAoZnJlZSkiLCJjcmVhdGVkIjoxNzQ0NzU0ODU4LCJkZXNjcmlwdGlvbiI6IlNoaXNhIFYyIExsYW1hIDMuMyA3MEIgaXMgYSBiaWxpbmd1YWwgSmFwYW5lc2UtRW5nbGlzaCBjaGF0IG1vZGVsIGZpbmUtdHVuZWQgYnkgU2hpc2EuQUkgb24gTWV0YeKAmXMgTGxhbWEtMy4zLTcwQi1JbnN0cnVjdCBiYXNlLiBJdCBwcmlvcml0aXplcyBKYXBhbmVzZSBsYW5ndWFnZSBwZXJmb3JtYW5jZSB3aGlsZSByZXRhaW5pbmcgc3Ryb25nIEVuZ2xpc2ggY2FwYWJpbGl0aWVzLiBUaGUgbW9kZWwgd2FzIG9wdGltaXplZCBlbnRpcmVseSB0aHJvdWdoIHBvc3QtdHJhaW5pbmcsIHVzaW5nIGEgcmVmaW5lZCBtaXggb2Ygc3VwZXJ2aXNlZCBmaW5lLXR1bmluZyAoU0ZUKSBhbmQgRFBPIGRhdGFzZXRzIGluY2x1ZGluZyByZWdlbmVyYXRlZCBTaGFyZUdQVC1zdHlsZSBkYXRhLCB0cmFuc2xhdGlvbiB0YXNrcywgcm9sZXBsYXlpbmcgY29udmVyc2F0aW9ucywgYW5kIGluc3RydWN0aW9uLWZvbGxvd2luZyBwcm9tcHRzLiBVbmxpa2UgZWFybGllciBTaGlzYSByZWxlYXNlcywgdGhpcyB2ZXJzaW9uIGF2b2lkcyB0b2tlbml6ZXIgbW9kaWZpY2F0aW9ucyBvciBleHRlbmRlZCBwcmV0cmFpbmluZy5cblxuU2hpc2EgVjIgNzBCIGFjaGlldmVzIGxlYWRpbmcgSmFwYW5lc2UgdGFzayBwZXJmb3JtYW5jZSBhY3Jvc3MgYSB3aWRlIHJhbmdlIG9mIGN1c3RvbSBhbmQgcHVibGljIGJlbmNobWFya3MsIGluY2x1ZGluZyBKQSBNVCBCZW5jaCwgRUxZWkEgMTAwLCBhbmQgUmFrdWRhLiBJdCBzdXBwb3J0cyBhIDEyOEsgdG9rZW4gY29udGV4dCBsZW5ndGggYW5kIGludGVncmF0ZXMgc21vb3RobHkgd2l0aCBpbmZlcmVuY2UgZnJhbWV3b3JrcyBsaWtlIHZMTE0gYW5kIFNHTGFuZy4gV2hpbGUgaXQgaW5oZXJpdHMgc2FmZXR5IGNoYXJhY3RlcmlzdGljcyBmcm9tIGl0cyBiYXNlIG1vZGVsLCBubyBhZGRpdGlvbmFsIGFsaWdubWVudCB3YXMgYXBwbGllZC4gVGhlIG1vZGVsIGlzIGludGVuZGVkIGZvciBoaWdoLXBlcmZvcm1hbmNlIGJpbGluZ3VhbCBjaGF0LCBpbnN0cnVjdGlvbiBmb2xsb3dpbmcsIGFuZCB0cmFuc2xhdGlvbiB0YXNrcyBhY3Jvc3MgSkEvRU4uIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicXdlbi9xd2VuMi41LWNvZGVyLTdiLWluc3RydWN0IiwibmFtZSI6IlF3ZW46IFF3ZW4yLjUgQ29kZXIgN0IgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzQ0NzM0ODg3LCJkZXNjcmlwdGlvbiI6IlF3ZW4yLjUtQ29kZXItN0ItSW5zdHJ1Y3QgaXMgYSA3QiBwYXJhbWV0ZXIgaW5zdHJ1Y3Rpb24tdHVuZWQgbGFuZ3VhZ2UgbW9kZWwgb3B0aW1pemVkIGZvciBjb2RlLXJlbGF0ZWQgdGFza3Mgc3VjaCBhcyBjb2RlIGdlbmVyYXRpb24sIHJlYXNvbmluZywgYW5kIGJ1ZyBmaXhpbmcuIEJhc2VkIG9uIHRoZSBRd2VuMi41IGFyY2hpdGVjdHVyZSwgaXQgaW5jb3Jwb3JhdGVzIGVuaGFuY2VtZW50cyBsaWtlIFJvUEUsIFN3aUdMVSwgUk1TTm9ybSwgYW5kIEdRQSBhdHRlbnRpb24gd2l0aCBzdXBwb3J0IGZvciB1cCB0byAxMjhLIHRva2VucyB1c2luZyBZYVJOLWJhc2VkIGV4dHJhcG9sYXRpb24uIEl0IGlzIHRyYWluZWQgb24gYSBsYXJnZSBjb3JwdXMgb2Ygc291cmNlIGNvZGUsIHN5bnRoZXRpYyBkYXRhLCBhbmQgdGV4dC1jb2RlIGdyb3VuZGluZywgcHJvdmlkaW5nIHJvYnVzdCBwZXJmb3JtYW5jZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFuZCBhZ2VudGljIGNvZGluZyB3b3JrZmxvd3MuXG5cblRoaXMgbW9kZWwgaXMgcGFydCBvZiB0aGUgUXdlbjIuNS1Db2RlciBmYW1pbHkgYW5kIG9mZmVycyBzdHJvbmcgY29tcGF0aWJpbGl0eSB3aXRoIHRvb2xzIGxpa2UgdkxMTSBmb3IgZWZmaWNpZW50IGRlcGxveW1lbnQuIFJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjMyNzY4LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC00LjEiLCJuYW1lIjoiT3BlbkFJOiBHUFQtNC4xIiwiY3JlYXRlZCI6MTc0NDY1MTM4NSwiZGVzY3JpcHRpb24iOiJHUFQtNC4xIGlzIGEgZmxhZ3NoaXAgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgb3B0aW1pemVkIGZvciBhZHZhbmNlZCBpbnN0cnVjdGlvbiBmb2xsb3dpbmcsIHJlYWwtd29ybGQgc29mdHdhcmUgZW5naW5lZXJpbmcsIGFuZCBsb25nLWNvbnRleHQgcmVhc29uaW5nLiBJdCBzdXBwb3J0cyBhIDEgbWlsbGlvbiB0b2tlbiBjb250ZXh0IHdpbmRvdyBhbmQgb3V0cGVyZm9ybXMgR1BULTRvIGFuZCBHUFQtNC41IGFjcm9zcyBjb2RpbmcgKDU0LjYlIFNXRS1iZW5jaCBWZXJpZmllZCksIGluc3RydWN0aW9uIGNvbXBsaWFuY2UgKDg3LjQlIElGRXZhbCksIGFuZCBtdWx0aW1vZGFsIHVuZGVyc3RhbmRpbmcgYmVuY2htYXJrcy4gSXQgaXMgdHVuZWQgZm9yIHByZWNpc2UgY29kZSBkaWZmcywgYWdlbnQgcmVsaWFiaWxpdHksIGFuZCBoaWdoIHJlY2FsbCBpbiBsYXJnZSBkb2N1bWVudCBjb250ZXh0cywgbWFraW5nIGl0IGlkZWFsIGZvciBhZ2VudHMsIElERSB0b29saW5nLCBhbmQgZW50ZXJwcmlzZSBrbm93bGVkZ2UgcmV0cmlldmFsLiIsImNvbnRleHRfbGVuZ3RoIjoxMDQ3NTc2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJpbWFnZSIsInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIiwiaW5wdXRfY2FjaGVfcmVhZCI6IjAuMDAwMDAwNSJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEwNDc1NzYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MzI3NjgsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9ncHQtNC4xLW1pbmkiLCJuYW1lIjoiT3BlbkFJOiBHUFQtNC4xIE1pbmkiLCJjcmVhdGVkIjoxNzQ0NjUxMzgxLCJkZXNjcmlwdGlvbiI6IkdQVC00LjEgTWluaSBpcyBhIG1pZC1zaXplZCBtb2RlbCBkZWxpdmVyaW5nIHBlcmZvcm1hbmNlIGNvbXBldGl0aXZlIHdpdGggR1BULTRvIGF0IHN1YnN0YW50aWFsbHkgbG93ZXIgbGF0ZW5jeSBhbmQgY29zdC4gSXQgcmV0YWlucyBhIDEgbWlsbGlvbiB0b2tlbiBjb250ZXh0IHdpbmRvdyBhbmQgc2NvcmVzIDQ1LjElIG9uIGhhcmQgaW5zdHJ1Y3Rpb24gZXZhbHMsIDM1LjglIG9uIE11bHRpQ2hhbGxlbmdlLCBhbmQgODQuMSUgb24gSUZFdmFsLiBNaW5pIGFsc28gc2hvd3Mgc3Ryb25nIGNvZGluZyBhYmlsaXR5IChlLmcuLCAzMS42JSBvbiBBaWRlcuKAmXMgcG9seWdsb3QgZGlmZiBiZW5jaG1hcmspIGFuZCB2aXNpb24gdW5kZXJzdGFuZGluZywgbWFraW5nIGl0IHN1aXRhYmxlIGZvciBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMgd2l0aCB0aWdodCBwZXJmb3JtYW5jZSBjb25zdHJhaW50cy4iLCJjb250ZXh0X2xlbmd0aCI6MTA0NzU3NiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsiaW1hZ2UiLCJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA0IiwiY29tcGxldGlvbiI6IjAuMDAwMDAxNiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIiwiaW5wdXRfY2FjaGVfcmVhZCI6IjAuMDAwMDAwMSJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEwNDc1NzYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MzI3NjgsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9ncHQtNC4xLW5hbm8iLCJuYW1lIjoiT3BlbkFJOiBHUFQtNC4xIE5hbm8iLCJjcmVhdGVkIjoxNzQ0NjUxMzY5LCJkZXNjcmlwdGlvbiI6IkZvciB0YXNrcyB0aGF0IGRlbWFuZCBsb3cgbGF0ZW5jeSwgR1BU4oCRNC4xIG5hbm8gaXMgdGhlIGZhc3Rlc3QgYW5kIGNoZWFwZXN0IG1vZGVsIGluIHRoZSBHUFQtNC4xIHNlcmllcy4gSXQgZGVsaXZlcnMgZXhjZXB0aW9uYWwgcGVyZm9ybWFuY2UgYXQgYSBzbWFsbCBzaXplIHdpdGggaXRzIDEgbWlsbGlvbiB0b2tlbiBjb250ZXh0IHdpbmRvdywgYW5kIHNjb3JlcyA4MC4xJSBvbiBNTUxVLCA1MC4zJSBvbiBHUFFBLCBhbmQgOS44JSBvbiBBaWRlciBwb2x5Z2xvdCBjb2Rpbmcg4oCTIGV2ZW4gaGlnaGVyIHRoYW4gR1BU4oCRNG8gbWluaS4gSXTigJlzIGlkZWFsIGZvciB0YXNrcyBsaWtlIGNsYXNzaWZpY2F0aW9uIG9yIGF1dG9jb21wbGV0aW9uLiIsImNvbnRleHRfbGVuZ3RoIjoxMDQ3NTc2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJpbWFnZSIsInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAwMjUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMDQ3NTc2LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjMyNzY4LCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJlbGV1dGhlcmFpL2xsZW1tYV83YiIsIm5hbWUiOiJFbGV1dGhlckFJOiBMbGVtbWEgN2IiLCJjcmVhdGVkIjoxNzQ0NjQzMjI1LCJkZXNjcmlwdGlvbiI6IkxsZW1tYSA3QiBpcyBhIGxhbmd1YWdlIG1vZGVsIGZvciBtYXRoZW1hdGljcy4gSXQgd2FzIGluaXRpYWxpemVkIHdpdGggQ29kZSBMbGFtYSA3QiB3ZWlnaHRzLCBhbmQgdHJhaW5lZCBvbiB0aGUgUHJvb2YtUGlsZS0yIGZvciAyMDBCIHRva2Vucy4gTGxlbW1hIG1vZGVscyBhcmUgcGFydGljdWxhcmx5IHN0cm9uZyBhdCBjaGFpbi1vZi10aG91Z2h0IG1hdGhlbWF0aWNhbCByZWFzb25pbmcgYW5kIHVzaW5nIGNvbXB1dGF0aW9uYWwgdG9vbHMgZm9yIG1hdGhlbWF0aWNzLCBzdWNoIGFzIFB5dGhvbiBhbmQgZm9ybWFsIHRoZW9yZW0gcHJvdmVycy4iLCJjb250ZXh0X2xlbmd0aCI6NDA5NiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA4IiwiY29tcGxldGlvbiI6IjAuMDAwMDAxMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NDA5NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYWxmcmVkcHJvcy9jb2RlbGxhbWEtN2ItaW5zdHJ1Y3Qtc29saWRpdHkiLCJuYW1lIjoiQWxmcmVkUHJvczogQ29kZUxMYU1hIDdCIEluc3RydWN0IFNvbGlkaXR5IiwiY3JlYXRlZCI6MTc0NDY0MTg3NCwiZGVzY3JpcHRpb24iOiJBIGZpbmV0dW5lZCA3IGJpbGxpb24gcGFyYW1ldGVycyBDb2RlIExMYU1BIC0gSW5zdHJ1Y3QgbW9kZWwgdG8gZ2VuZXJhdGUgU29saWRpdHkgc21hcnQgY29udHJhY3QgdXNpbmcgNC1iaXQgUUxvUkEgZmluZXR1bmluZyBwcm92aWRlZCBieSBQRUZUIGxpYnJhcnkuIiwiY29udGV4dF9sZW5ndGgiOjQwOTYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjQwOTYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFybGlhaS9xd3EtMzJiLWFybGlhaS1ycHItdjE6ZnJlZSIsIm5hbWUiOiJBcmxpQUk6IFF3USAzMkIgUnBSIHYxIChmcmVlKSIsImNyZWF0ZWQiOjE3NDQ1NTU5ODIsImRlc2NyaXB0aW9uIjoiUXdRLTMyQi1BcmxpQUktUnBSLXYxIGlzIGEgMzJCIHBhcmFtZXRlciBtb2RlbCBmaW5lLXR1bmVkIGZyb20gUXdlbi9Rd1EtMzJCIHVzaW5nIGEgY3VyYXRlZCBjcmVhdGl2ZSB3cml0aW5nIGFuZCByb2xlcGxheSBkYXRhc2V0IG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGZvciB0aGUgUlBNYXggc2VyaWVzLiBJdCBpcyBkZXNpZ25lZCB0byBtYWludGFpbiBjb2hlcmVuY2UgYW5kIHJlYXNvbmluZyBhY3Jvc3MgbG9uZyBtdWx0aS10dXJuIGNvbnZlcnNhdGlvbnMgYnkgaW50cm9kdWNpbmcgZXhwbGljaXQgcmVhc29uaW5nIHN0ZXBzIHBlciBkaWFsb2d1ZSB0dXJuLCBnZW5lcmF0ZWQgYW5kIHJlZmluZWQgdXNpbmcgdGhlIGJhc2UgbW9kZWwgaXRzZWxmLlxuXG5UaGUgbW9kZWwgd2FzIHRyYWluZWQgdXNpbmcgUlMtUUxPUkErIG9uIDhLIHNlcXVlbmNlIGxlbmd0aHMgYW5kIHN1cHBvcnRzIHVwIHRvIDEyOEsgY29udGV4dCB3aW5kb3dzICh3aXRoIHByYWN0aWNhbCBwZXJmb3JtYW5jZSBhcm91bmQgMzJLKS4gSXQgaXMgb3B0aW1pemVkIGZvciBjcmVhdGl2ZSByb2xlcGxheSBhbmQgZGlhbG9ndWUgZ2VuZXJhdGlvbiwgd2l0aCBhbiBlbXBoYXNpcyBvbiBtaW5pbWl6aW5nIGNyb3NzLWNvbnRleHQgcmVwZXRpdGlvbiB3aGlsZSBwcmVzZXJ2aW5nIHN0eWxpc3RpYyBkaXZlcnNpdHkuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjoiZGVlcHNlZWstcjEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhZ2VudGljYS1vcmcvZGVlcGNvZGVyLTE0Yi1wcmV2aWV3OmZyZWUiLCJuYW1lIjoiQWdlbnRpY2E6IERlZXBjb2RlciAxNEIgUHJldmlldyAoZnJlZSkiLCJjcmVhdGVkIjoxNzQ0NTU1Mzk1LCJkZXNjcmlwdGlvbiI6IkRlZXBDb2Rlci0xNEItUHJldmlldyBpcyBhIDE0QiBwYXJhbWV0ZXIgY29kZSBnZW5lcmF0aW9uIG1vZGVsIGZpbmUtdHVuZWQgZnJvbSBEZWVwU2Vlay1SMS1EaXN0aWxsLVF3ZW4tMTRCIHVzaW5nIHJlaW5mb3JjZW1lbnQgbGVhcm5pbmcgd2l0aCBHUlBPKyBhbmQgaXRlcmF0aXZlIGNvbnRleHQgbGVuZ3RoZW5pbmcuIEl0IGlzIG9wdGltaXplZCBmb3IgbG9uZy1jb250ZXh0IHByb2dyYW0gc3ludGhlc2lzIGFuZCBhY2hpZXZlcyBzdHJvbmcgcGVyZm9ybWFuY2UgYWNyb3NzIGNvZGluZyBiZW5jaG1hcmtzLCBpbmNsdWRpbmcgNjAuNiUgb24gTGl2ZUNvZGVCZW5jaCB2NSwgY29tcGV0aXRpdmUgd2l0aCBtb2RlbHMgbGlrZSBvMy1NaW5pIiwiY29udGV4dF9sZW5ndGgiOjk2MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjoiZGVlcHNlZWstcjEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjk2MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtb29uc2hvdGFpL2tpbWktdmwtYTNiLXRoaW5raW5nOmZyZWUiLCJuYW1lIjoiTW9vbnNob3QgQUk6IEtpbWkgVkwgQTNCIFRoaW5raW5nIChmcmVlKSIsImNyZWF0ZWQiOjE3NDQzMDQ4NDEsImRlc2NyaXB0aW9uIjoiS2ltaS1WTCBpcyBhIGxpZ2h0d2VpZ2h0IE1peHR1cmUtb2YtRXhwZXJ0cyB2aXNpb24tbGFuZ3VhZ2UgbW9kZWwgdGhhdCBhY3RpdmF0ZXMgb25seSAyLjhCIHBhcmFtZXRlcnMgcGVyIHN0ZXAgd2hpbGUgZGVsaXZlcmluZyBzdHJvbmcgcGVyZm9ybWFuY2Ugb24gbXVsdGltb2RhbCByZWFzb25pbmcgYW5kIGxvbmctY29udGV4dCB0YXNrcy4gVGhlIEtpbWktVkwtQTNCLVRoaW5raW5nIHZhcmlhbnQsIGZpbmUtdHVuZWQgd2l0aCBjaGFpbi1vZi10aG91Z2h0IGFuZCByZWluZm9yY2VtZW50IGxlYXJuaW5nLCBleGNlbHMgaW4gbWF0aCBhbmQgdmlzdWFsIHJlYXNvbmluZyBiZW5jaG1hcmtzIGxpa2UgTWF0aFZpc2lvbiwgTU1NVSwgYW5kIE1hdGhWaXN0YSwgcml2YWxpbmcgbXVjaCBsYXJnZXIgbW9kZWxzIHN1Y2ggYXMgUXdlbjIuNS1WTC03QiBhbmQgR2VtbWEtMy0xMkIuIEl0IHN1cHBvcnRzIDEyOEsgY29udGV4dCBhbmQgaGlnaC1yZXNvbHV0aW9uIGlucHV0IHZpYSBpdHMgTW9vblZpVCBlbmNvZGVyLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbImltYWdlIiwidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6IngtYWkvZ3Jvay0zLW1pbmktYmV0YSIsIm5hbWUiOiJ4QUk6IEdyb2sgMyBNaW5pIEJldGEiLCJjcmVhdGVkIjoxNzQ0MjQwMTk1LCJkZXNjcmlwdGlvbiI6Ikdyb2sgMyBNaW5pIGlzIGEgbGlnaHR3ZWlnaHQsIHNtYWxsZXIgdGhpbmtpbmcgbW9kZWwuIFVubGlrZSB0cmFkaXRpb25hbCBtb2RlbHMgdGhhdCBnZW5lcmF0ZSBhbnN3ZXJzIGltbWVkaWF0ZWx5LCBHcm9rIDMgTWluaSB0aGlua3MgYmVmb3JlIHJlc3BvbmRpbmcuIEl04oCZcyBpZGVhbCBmb3IgcmVhc29uaW5nLWhlYXZ5IHRhc2tzIHRoYXQgZG9u4oCZdCBkZW1hbmQgZXh0ZW5zaXZlIGRvbWFpbiBrbm93bGVkZ2UsIGFuZCBzaGluZXMgaW4gbWF0aC1zcGVjaWZpYyBhbmQgcXVhbnRpdGF0aXZlIHVzZSBjYXNlcywgc3VjaCBhcyBzb2x2aW5nIGNoYWxsZW5naW5nIHB1enpsZXMgb3IgbWF0aCBwcm9ibGVtcy5cblxuVHJhbnNwYXJlbnQgXCJ0aGlua2luZ1wiIHRyYWNlcyBhY2Nlc3NpYmxlLiBEZWZhdWx0cyB0byBsb3cgcmVhc29uaW5nLCBjYW4gYm9vc3Qgd2l0aCBzZXR0aW5nIGByZWFzb25pbmc6IHsgZWZmb3J0OiBcImhpZ2hcIiB9YFxuXG5Ob3RlOiBUaGF0IHRoZXJlIGFyZSB0d28geEFJIGVuZHBvaW50cyBmb3IgdGhpcyBtb2RlbC4gQnkgZGVmYXVsdCB3aGVuIHVzaW5nIHRoaXMgbW9kZWwgd2Ugd2lsbCBhbHdheXMgcm91dGUgeW91IHRvIHRoZSBiYXNlIGVuZHBvaW50LiBJZiB5b3Ugd2FudCB0aGUgZmFzdCBlbmRwb2ludCB5b3UgY2FuIGFkZCBgcHJvdmlkZXI6IHsgc29ydDogdGhyb3VnaHB1dH1gLCB0byBzb3J0IGJ5IHRocm91Z2hwdXQgaW5zdGVhZC4gXG4iLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR3JvayIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoieC1haS9ncm9rLTMtYmV0YSIsIm5hbWUiOiJ4QUk6IEdyb2sgMyBCZXRhIiwiY3JlYXRlZCI6MTc0NDI0MDA2OCwiZGVzY3JpcHRpb24iOiJHcm9rIDMgaXMgdGhlIGxhdGVzdCBtb2RlbCBmcm9tIHhBSS4gSXQncyB0aGVpciBmbGFnc2hpcCBtb2RlbCB0aGF0IGV4Y2VscyBhdCBlbnRlcnByaXNlIHVzZSBjYXNlcyBsaWtlIGRhdGEgZXh0cmFjdGlvbiwgY29kaW5nLCBhbmQgdGV4dCBzdW1tYXJpemF0aW9uLiBQb3NzZXNzZXMgZGVlcCBkb21haW4ga25vd2xlZGdlIGluIGZpbmFuY2UsIGhlYWx0aGNhcmUsIGxhdywgYW5kIHNjaWVuY2UuXG5cbkV4Y2VscyBpbiBzdHJ1Y3R1cmVkIHRhc2tzIGFuZCBiZW5jaG1hcmtzIGxpa2UgR1BRQSwgTENCLCBhbmQgTU1MVS1Qcm8gd2hlcmUgaXQgb3V0cGVyZm9ybXMgR3JvayAzIE1pbmkgZXZlbiBvbiBoaWdoIHRoaW5raW5nLiBcblxuTm90ZTogVGhhdCB0aGVyZSBhcmUgdHdvIHhBSSBlbmRwb2ludHMgZm9yIHRoaXMgbW9kZWwuIEJ5IGRlZmF1bHQgd2hlbiB1c2luZyB0aGlzIG1vZGVsIHdlIHdpbGwgYWx3YXlzIHJvdXRlIHlvdSB0byB0aGUgYmFzZSBlbmRwb2ludC4gSWYgeW91IHdhbnQgdGhlIGZhc3QgZW5kcG9pbnQgeW91IGNhbiBhZGQgYHByb3ZpZGVyOiB7IHNvcnQ6IHRocm91Z2hwdXR9YCwgdG8gc29ydCBieSB0aHJvdWdocHV0IGluc3RlYWQuIFxuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ikdyb2siLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJudmlkaWEvbGxhbWEtMy4xLW5lbW90cm9uLW5hbm8tOGItdjE6ZnJlZSIsIm5hbWUiOiJOVklESUE6IExsYW1hIDMuMSBOZW1vdHJvbiBOYW5vIDhCIHYxIChmcmVlKSIsImNyZWF0ZWQiOjE3NDQxMjM4NzMsImRlc2NyaXB0aW9uIjoiTGxhbWEtMy4xLU5lbW90cm9uLU5hbm8tOEItdjEgaXMgYSBjb21wYWN0IGxhcmdlIGxhbmd1YWdlIG1vZGVsIChMTE0pIGRlcml2ZWQgZnJvbSBNZXRhJ3MgTGxhbWEtMy4xLThCLUluc3RydWN0LCBzcGVjaWZpY2FsbHkgb3B0aW1pemVkIGZvciByZWFzb25pbmcgdGFza3MsIGNvbnZlcnNhdGlvbmFsIGludGVyYWN0aW9ucywgcmV0cmlldmFsLWF1Z21lbnRlZCBnZW5lcmF0aW9uIChSQUcpLCBhbmQgdG9vbC1jYWxsaW5nIGFwcGxpY2F0aW9ucy4gSXQgYmFsYW5jZXMgYWNjdXJhY3kgYW5kIGVmZmljaWVuY3ksIGZpdHRpbmcgY29tZm9ydGFibHkgb250byBhIHNpbmdsZSBjb25zdW1lci1ncmFkZSBSVFggR1BVIGZvciBsb2NhbCBkZXBsb3ltZW50LiBUaGUgbW9kZWwgc3VwcG9ydHMgZXh0ZW5kZWQgY29udGV4dCBsZW5ndGhzIG9mIHVwIHRvIDEyOEsgdG9rZW5zLlxuXG5Ob3RlOiB5b3UgbXVzdCBpbmNsdWRlIGBkZXRhaWxlZCB0aGlua2luZyBvbmAgaW4gdGhlIHN5c3RlbSBwcm9tcHQgdG8gZW5hYmxlIHJlYXNvbmluZy4gUGxlYXNlIHNlZSBbVXNhZ2UgUmVjb21tZW5kYXRpb25zXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL252aWRpYS9MbGFtYS0zXzEtTmVtb3Ryb24tVWx0cmEtMjUzQi12MSNxdWljay1zdGFydC1hbmQtdXNhZ2UtcmVjb21tZW5kYXRpb25zKSBmb3IgbW9yZS4iLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibnZpZGlhL2xsYW1hLTMuMy1uZW1vdHJvbi1zdXBlci00OWItdjE6ZnJlZSIsIm5hbWUiOiJOVklESUE6IExsYW1hIDMuMyBOZW1vdHJvbiBTdXBlciA0OUIgdjEgKGZyZWUpIiwiY3JlYXRlZCI6MTc0NDExOTQ5NCwiZGVzY3JpcHRpb24iOiJMbGFtYS0zLjMtTmVtb3Ryb24tU3VwZXItNDlCLXYxIGlzIGEgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgKExMTSkgb3B0aW1pemVkIGZvciBhZHZhbmNlZCByZWFzb25pbmcsIGNvbnZlcnNhdGlvbmFsIGludGVyYWN0aW9ucywgcmV0cmlldmFsLWF1Z21lbnRlZCBnZW5lcmF0aW9uIChSQUcpLCBhbmQgdG9vbC1jYWxsaW5nIHRhc2tzLiBEZXJpdmVkIGZyb20gTWV0YSdzIExsYW1hLTMuMy03MEItSW5zdHJ1Y3QsIGl0IGVtcGxveXMgYSBOZXVyYWwgQXJjaGl0ZWN0dXJlIFNlYXJjaCAoTkFTKSBhcHByb2FjaCwgc2lnbmlmaWNhbnRseSBlbmhhbmNpbmcgZWZmaWNpZW5jeSBhbmQgcmVkdWNpbmcgbWVtb3J5IHJlcXVpcmVtZW50cy4gVGhpcyBhbGxvd3MgdGhlIG1vZGVsIHRvIHN1cHBvcnQgYSBjb250ZXh0IGxlbmd0aCBvZiB1cCB0byAxMjhLIHRva2VucyBhbmQgZml0IGVmZmljaWVudGx5IG9uIHNpbmdsZSBoaWdoLXBlcmZvcm1hbmNlIEdQVXMsIHN1Y2ggYXMgTlZJRElBIEgyMDAuXG5cbk5vdGU6IHlvdSBtdXN0IGluY2x1ZGUgYGRldGFpbGVkIHRoaW5raW5nIG9uYCBpbiB0aGUgc3lzdGVtIHByb21wdCB0byBlbmFibGUgcmVhc29uaW5nLiBQbGVhc2Ugc2VlIFtVc2FnZSBSZWNvbW1lbmRhdGlvbnNdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vbnZpZGlhL0xsYW1hLTNfMS1OZW1vdHJvbi1VbHRyYS0yNTNCLXYxI3F1aWNrLXN0YXJ0LWFuZC11c2FnZS1yZWNvbW1lbmRhdGlvbnMpIGZvciBtb3JlLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJudmlkaWEvbGxhbWEtMy4xLW5lbW90cm9uLXVsdHJhLTI1M2ItdjE6ZnJlZSIsIm5hbWUiOiJOVklESUE6IExsYW1hIDMuMSBOZW1vdHJvbiBVbHRyYSAyNTNCIHYxIChmcmVlKSIsImNyZWF0ZWQiOjE3NDQxMTUwNTksImRlc2NyaXB0aW9uIjoiTGxhbWEtMy4xLU5lbW90cm9uLVVsdHJhLTI1M0ItdjEgaXMgYSBsYXJnZSBsYW5ndWFnZSBtb2RlbCAoTExNKSBvcHRpbWl6ZWQgZm9yIGFkdmFuY2VkIHJlYXNvbmluZywgaHVtYW4taW50ZXJhY3RpdmUgY2hhdCwgcmV0cmlldmFsLWF1Z21lbnRlZCBnZW5lcmF0aW9uIChSQUcpLCBhbmQgdG9vbC1jYWxsaW5nIHRhc2tzLiBEZXJpdmVkIGZyb20gTWV0YeKAmXMgTGxhbWEtMy4xLTQwNUItSW5zdHJ1Y3QsIGl0IGhhcyBiZWVuIHNpZ25pZmljYW50bHkgY3VzdG9taXplZCB1c2luZyBOZXVyYWwgQXJjaGl0ZWN0dXJlIFNlYXJjaCAoTkFTKSwgcmVzdWx0aW5nIGluIGVuaGFuY2VkIGVmZmljaWVuY3ksIHJlZHVjZWQgbWVtb3J5IHVzYWdlLCBhbmQgaW1wcm92ZWQgaW5mZXJlbmNlIGxhdGVuY3kuIFRoZSBtb2RlbCBzdXBwb3J0cyBhIGNvbnRleHQgbGVuZ3RoIG9mIHVwIHRvIDEyOEsgdG9rZW5zIGFuZCBjYW4gb3BlcmF0ZSBlZmZpY2llbnRseSBvbiBhbiA4eCBOVklESUEgSDEwMCBub2RlLlxuXG5Ob3RlOiB5b3UgbXVzdCBpbmNsdWRlIGBkZXRhaWxlZCB0aGlua2luZyBvbmAgaW4gdGhlIHN5c3RlbSBwcm9tcHQgdG8gZW5hYmxlIHJlYXNvbmluZy4gUGxlYXNlIHNlZSBbVXNhZ2UgUmVjb21tZW5kYXRpb25zXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL252aWRpYS9MbGFtYS0zXzEtTmVtb3Ryb24tVWx0cmEtMjUzQi12MSNxdWljay1zdGFydC1hbmQtdXNhZ2UtcmVjb21tZW5kYXRpb25zKSBmb3IgbW9yZS4iLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtNC1tYXZlcmljazpmcmVlIiwibmFtZSI6Ik1ldGE6IExsYW1hIDQgTWF2ZXJpY2sgKGZyZWUpIiwiY3JlYXRlZCI6MTc0Mzg4MTgyMiwiZGVzY3JpcHRpb24iOiJMbGFtYSA0IE1hdmVyaWNrIDE3QiBJbnN0cnVjdCAoMTI4RSkgaXMgYSBoaWdoLWNhcGFjaXR5IG11bHRpbW9kYWwgbGFuZ3VhZ2UgbW9kZWwgZnJvbSBNZXRhLCBidWlsdCBvbiBhIG1peHR1cmUtb2YtZXhwZXJ0cyAoTW9FKSBhcmNoaXRlY3R1cmUgd2l0aCAxMjggZXhwZXJ0cyBhbmQgMTcgYmlsbGlvbiBhY3RpdmUgcGFyYW1ldGVycyBwZXIgZm9yd2FyZCBwYXNzICg0MDBCIHRvdGFsKS4gSXQgc3VwcG9ydHMgbXVsdGlsaW5ndWFsIHRleHQgYW5kIGltYWdlIGlucHV0LCBhbmQgcHJvZHVjZXMgbXVsdGlsaW5ndWFsIHRleHQgYW5kIGNvZGUgb3V0cHV0IGFjcm9zcyAxMiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLiBPcHRpbWl6ZWQgZm9yIHZpc2lvbi1sYW5ndWFnZSB0YXNrcywgTWF2ZXJpY2sgaXMgaW5zdHJ1Y3Rpb24tdHVuZWQgZm9yIGFzc2lzdGFudC1saWtlIGJlaGF2aW9yLCBpbWFnZSByZWFzb25pbmcsIGFuZCBnZW5lcmFsLXB1cnBvc2UgbXVsdGltb2RhbCBpbnRlcmFjdGlvbi5cblxuTWF2ZXJpY2sgZmVhdHVyZXMgZWFybHkgZnVzaW9uIGZvciBuYXRpdmUgbXVsdGltb2RhbGl0eSBhbmQgYSAxIG1pbGxpb24gdG9rZW4gY29udGV4dCB3aW5kb3cuIEl0IHdhcyB0cmFpbmVkIG9uIGEgY3VyYXRlZCBtaXh0dXJlIG9mIHB1YmxpYywgbGljZW5zZWQsIGFuZCBNZXRhLXBsYXRmb3JtIGRhdGEsIGNvdmVyaW5nIH4yMiB0cmlsbGlvbiB0b2tlbnMsIHdpdGggYSBrbm93bGVkZ2UgY3V0b2ZmIGluIEF1Z3VzdCAyMDI0LiBSZWxlYXNlZCBvbiBBcHJpbCA1LCAyMDI1IHVuZGVyIHRoZSBMbGFtYSA0IENvbW11bml0eSBMaWNlbnNlLCBNYXZlcmljayBpcyBzdWl0ZWQgZm9yIHJlc2VhcmNoIGFuZCBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgYWR2YW5jZWQgbXVsdGltb2RhbCB1bmRlcnN0YW5kaW5nIGFuZCBoaWdoIG1vZGVsIHRocm91Z2hwdXQuIiwiY29udGV4dF9sZW5ndGgiOjI1NjAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjI1NjAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWV0YS1sbGFtYS9sbGFtYS00LW1hdmVyaWNrIiwibmFtZSI6Ik1ldGE6IExsYW1hIDQgTWF2ZXJpY2siLCJjcmVhdGVkIjoxNzQzODgxODIyLCJkZXNjcmlwdGlvbiI6IkxsYW1hIDQgTWF2ZXJpY2sgMTdCIEluc3RydWN0ICgxMjhFKSBpcyBhIGhpZ2gtY2FwYWNpdHkgbXVsdGltb2RhbCBsYW5ndWFnZSBtb2RlbCBmcm9tIE1ldGEsIGJ1aWx0IG9uIGEgbWl4dHVyZS1vZi1leHBlcnRzIChNb0UpIGFyY2hpdGVjdHVyZSB3aXRoIDEyOCBleHBlcnRzIGFuZCAxNyBiaWxsaW9uIGFjdGl2ZSBwYXJhbWV0ZXJzIHBlciBmb3J3YXJkIHBhc3MgKDQwMEIgdG90YWwpLiBJdCBzdXBwb3J0cyBtdWx0aWxpbmd1YWwgdGV4dCBhbmQgaW1hZ2UgaW5wdXQsIGFuZCBwcm9kdWNlcyBtdWx0aWxpbmd1YWwgdGV4dCBhbmQgY29kZSBvdXRwdXQgYWNyb3NzIDEyIHN1cHBvcnRlZCBsYW5ndWFnZXMuIE9wdGltaXplZCBmb3IgdmlzaW9uLWxhbmd1YWdlIHRhc2tzLCBNYXZlcmljayBpcyBpbnN0cnVjdGlvbi10dW5lZCBmb3IgYXNzaXN0YW50LWxpa2UgYmVoYXZpb3IsIGltYWdlIHJlYXNvbmluZywgYW5kIGdlbmVyYWwtcHVycG9zZSBtdWx0aW1vZGFsIGludGVyYWN0aW9uLlxuXG5NYXZlcmljayBmZWF0dXJlcyBlYXJseSBmdXNpb24gZm9yIG5hdGl2ZSBtdWx0aW1vZGFsaXR5IGFuZCBhIDEgbWlsbGlvbiB0b2tlbiBjb250ZXh0IHdpbmRvdy4gSXQgd2FzIHRyYWluZWQgb24gYSBjdXJhdGVkIG1peHR1cmUgb2YgcHVibGljLCBsaWNlbnNlZCwgYW5kIE1ldGEtcGxhdGZvcm0gZGF0YSwgY292ZXJpbmcgfjIyIHRyaWxsaW9uIHRva2Vucywgd2l0aCBhIGtub3dsZWRnZSBjdXRvZmYgaW4gQXVndXN0IDIwMjQuIFJlbGVhc2VkIG9uIEFwcmlsIDUsIDIwMjUgdW5kZXIgdGhlIExsYW1hIDQgQ29tbXVuaXR5IExpY2Vuc2UsIE1hdmVyaWNrIGlzIHN1aXRlZCBmb3IgcmVzZWFyY2ggYW5kIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zIHJlcXVpcmluZyBhZHZhbmNlZCBtdWx0aW1vZGFsIHVuZGVyc3RhbmRpbmcgYW5kIGhpZ2ggbW9kZWwgdGhyb3VnaHB1dC4iLCJjb250ZXh0X2xlbmd0aCI6MTA0ODU3NiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDE3IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwODUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDA2Njg0Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTA0ODU3NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMDQ4NTc2LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWV0YS1sbGFtYS9sbGFtYS00LXNjb3V0OmZyZWUiLCJuYW1lIjoiTWV0YTogTGxhbWEgNCBTY291dCAoZnJlZSkiLCJjcmVhdGVkIjoxNzQzODgxNTE5LCJkZXNjcmlwdGlvbiI6IkxsYW1hIDQgU2NvdXQgMTdCIEluc3RydWN0ICgxNkUpIGlzIGEgbWl4dHVyZS1vZi1leHBlcnRzIChNb0UpIGxhbmd1YWdlIG1vZGVsIGRldmVsb3BlZCBieSBNZXRhLCBhY3RpdmF0aW5nIDE3IGJpbGxpb24gcGFyYW1ldGVycyBvdXQgb2YgYSB0b3RhbCBvZiAxMDlCLiBJdCBzdXBwb3J0cyBuYXRpdmUgbXVsdGltb2RhbCBpbnB1dCAodGV4dCBhbmQgaW1hZ2UpIGFuZCBtdWx0aWxpbmd1YWwgb3V0cHV0ICh0ZXh0IGFuZCBjb2RlKSBhY3Jvc3MgMTIgc3VwcG9ydGVkIGxhbmd1YWdlcy4gRGVzaWduZWQgZm9yIGFzc2lzdGFudC1zdHlsZSBpbnRlcmFjdGlvbiBhbmQgdmlzdWFsIHJlYXNvbmluZywgU2NvdXQgdXNlcyAxNiBleHBlcnRzIHBlciBmb3J3YXJkIHBhc3MgYW5kIGZlYXR1cmVzIGEgY29udGV4dCBsZW5ndGggb2YgMTAgbWlsbGlvbiB0b2tlbnMsIHdpdGggYSB0cmFpbmluZyBjb3JwdXMgb2YgfjQwIHRyaWxsaW9uIHRva2Vucy5cblxuQnVpbHQgZm9yIGhpZ2ggZWZmaWNpZW5jeSBhbmQgbG9jYWwgb3IgY29tbWVyY2lhbCBkZXBsb3ltZW50LCBMbGFtYSA0IFNjb3V0IGluY29ycG9yYXRlcyBlYXJseSBmdXNpb24gZm9yIHNlYW1sZXNzIG1vZGFsaXR5IGludGVncmF0aW9uLiBJdCBpcyBpbnN0cnVjdGlvbi10dW5lZCBmb3IgdXNlIGluIG11bHRpbGluZ3VhbCBjaGF0LCBjYXB0aW9uaW5nLCBhbmQgaW1hZ2UgdW5kZXJzdGFuZGluZyB0YXNrcy4gUmVsZWFzZWQgdW5kZXIgdGhlIExsYW1hIDQgQ29tbXVuaXR5IExpY2Vuc2UsIGl0IHdhcyBsYXN0IHRyYWluZWQgb24gZGF0YSB1cCB0byBBdWd1c3QgMjAyNCBhbmQgbGF1bmNoZWQgcHVibGljbHkgb24gQXByaWwgNSwgMjAyNS4iLCJjb250ZXh0X2xlbmd0aCI6NTEyMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NTEyMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtZXRhLWxsYW1hL2xsYW1hLTQtc2NvdXQiLCJuYW1lIjoiTWV0YTogTGxhbWEgNCBTY291dCIsImNyZWF0ZWQiOjE3NDM4ODE1MTksImRlc2NyaXB0aW9uIjoiTGxhbWEgNCBTY291dCAxN0IgSW5zdHJ1Y3QgKDE2RSkgaXMgYSBtaXh0dXJlLW9mLWV4cGVydHMgKE1vRSkgbGFuZ3VhZ2UgbW9kZWwgZGV2ZWxvcGVkIGJ5IE1ldGEsIGFjdGl2YXRpbmcgMTcgYmlsbGlvbiBwYXJhbWV0ZXJzIG91dCBvZiBhIHRvdGFsIG9mIDEwOUIuIEl0IHN1cHBvcnRzIG5hdGl2ZSBtdWx0aW1vZGFsIGlucHV0ICh0ZXh0IGFuZCBpbWFnZSkgYW5kIG11bHRpbGluZ3VhbCBvdXRwdXQgKHRleHQgYW5kIGNvZGUpIGFjcm9zcyAxMiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLiBEZXNpZ25lZCBmb3IgYXNzaXN0YW50LXN0eWxlIGludGVyYWN0aW9uIGFuZCB2aXN1YWwgcmVhc29uaW5nLCBTY291dCB1c2VzIDE2IGV4cGVydHMgcGVyIGZvcndhcmQgcGFzcyBhbmQgZmVhdHVyZXMgYSBjb250ZXh0IGxlbmd0aCBvZiAxMCBtaWxsaW9uIHRva2Vucywgd2l0aCBhIHRyYWluaW5nIGNvcnB1cyBvZiB+NDAgdHJpbGxpb24gdG9rZW5zLlxuXG5CdWlsdCBmb3IgaGlnaCBlZmZpY2llbmN5IGFuZCBsb2NhbCBvciBjb21tZXJjaWFsIGRlcGxveW1lbnQsIExsYW1hIDQgU2NvdXQgaW5jb3Jwb3JhdGVzIGVhcmx5IGZ1c2lvbiBmb3Igc2VhbWxlc3MgbW9kYWxpdHkgaW50ZWdyYXRpb24uIEl0IGlzIGluc3RydWN0aW9uLXR1bmVkIGZvciB1c2UgaW4gbXVsdGlsaW5ndWFsIGNoYXQsIGNhcHRpb25pbmcsIGFuZCBpbWFnZSB1bmRlcnN0YW5kaW5nIHRhc2tzLiBSZWxlYXNlZCB1bmRlciB0aGUgTGxhbWEgNCBDb21tdW5pdHkgTGljZW5zZSwgaXQgd2FzIGxhc3QgdHJhaW5lZCBvbiBkYXRhIHVwIHRvIEF1Z3VzdCAyMDI0IGFuZCBsYXVuY2hlZCBwdWJsaWNseSBvbiBBcHJpbCA1LCAyMDI1LiIsImNvbnRleHRfbGVuZ3RoIjozMjc2ODAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDMiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDAzMzQyIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbGwtaGFuZHMvb3BlbmhhbmRzLWxtLTMyYi12MC4xIiwibmFtZSI6Ik9wZW5IYW5kcyBMTSAzMkIgVjAuMSIsImNyZWF0ZWQiOjE3NDM2MTMwMTMsImRlc2NyaXB0aW9uIjoiT3BlbkhhbmRzIExNIHYwLjEgaXMgYSAzMkIgb3Blbi1zb3VyY2UgY29kaW5nIG1vZGVsIGZpbmUtdHVuZWQgZnJvbSBRd2VuMi41LUNvZGVyLTMyQi1JbnN0cnVjdCB1c2luZyByZWluZm9yY2VtZW50IGxlYXJuaW5nIHRlY2huaXF1ZXMgb3V0bGluZWQgaW4gU1dFLUd5bS4gSXQgaXMgb3B0aW1pemVkIGZvciBhdXRvbm9tb3VzIHNvZnR3YXJlIGRldmVsb3BtZW50IGFnZW50cyBhbmQgYWNoaWV2ZXMgc3Ryb25nIHBlcmZvcm1hbmNlIG9uIFNXRS1CZW5jaCBWZXJpZmllZCwgd2l0aCBhIDM3LjIlIHJlc29sdmUgcmF0ZS4gVGhlIG1vZGVsIHN1cHBvcnRzIGEgMTI4SyB0b2tlbiBjb250ZXh0IHdpbmRvdywgbWFraW5nIGl0IHdlbGwtc3VpdGVkIGZvciBsb25nLWhvcml6b24gY29kZSByZWFzb25pbmcgYW5kIGxhcmdlIGNvZGViYXNlIHRhc2tzLlxuXG5PcGVuSGFuZHMgTE0gaXMgZGVzaWduZWQgZm9yIGxvY2FsIGRlcGxveW1lbnQgYW5kIHJ1bnMgb24gY29uc3VtZXItZ3JhZGUgR1BVcyBzdWNoIGFzIGEgc2luZ2xlIDMwOTAuIEl0IGVuYWJsZXMgZnVsbHkgb2ZmbGluZSBhZ2VudCB3b3JrZmxvd3Mgd2l0aG91dCBkZXBlbmRlbmN5IG9uIHByb3ByaWV0YXJ5IEFQSXMuIFRoaXMgcmVsZWFzZSBpcyBpbnRlbmRlZCBhcyBhIHJlc2VhcmNoIHByZXZpZXcsIGFuZCBmdXR1cmUgdXBkYXRlcyBhaW0gdG8gaW1wcm92ZSBnZW5lcmFsaXphYmlsaXR5LCByZWR1Y2UgcmVwZXRpdGlvbiwgYW5kIG9mZmVyIHNtYWxsZXIgdmFyaWFudHMuIiwiY29udGV4dF9sZW5ndGgiOjE2Mzg0LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMjYiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDM0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWlzdHJhbC9taW5pc3RyYWwtOGIiLCJuYW1lIjoiTWlzdHJhbDogTWluaXN0cmFsIDhCIiwiY3JlYXRlZCI6MTc0MzQzMDAyMSwiZGVzY3JpcHRpb24iOiJNaW5pc3RyYWwgOEIgaXMgYSBzdGF0ZS1vZi10aGUtYXJ0IGxhbmd1YWdlIG1vZGVsIG9wdGltaXplZCBmb3Igb24tZGV2aWNlIGFuZCBlZGdlIGNvbXB1dGluZy4gRGVzaWduZWQgZm9yIGVmZmljaWVuY3kgaW4ga25vd2xlZGdlLWludGVuc2l2ZSB0YXNrcywgY29tbW9uc2Vuc2UgcmVhc29uaW5nLCBhbmQgZnVuY3Rpb24tY2FsbGluZywgaXQgZmVhdHVyZXMgYSBzcGVjaWFsaXplZCBpbnRlcmxlYXZlZCBzbGlkaW5nLXdpbmRvdyBhdHRlbnRpb24gbWVjaGFuaXNtLCBlbmFibGluZyBmYXN0ZXIgYW5kIG1vcmUgbWVtb3J5LWVmZmljaWVudCBpbmZlcmVuY2UuIE1pbmlzdHJhbCA4QiBleGNlbHMgaW4gbG9jYWwsIGxvdy1sYXRlbmN5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIG9mZmxpbmUgdHJhbnNsYXRpb24sIHNtYXJ0IGFzc2lzdGFudHMsIGF1dG9ub21vdXMgcm9ib3RpY3MsIGFuZCBsb2NhbCBhbmFseXRpY3MuXG5cblRoZSBtb2RlbCBzdXBwb3J0cyB1cCB0byAxMjhrIGNvbnRleHQgbGVuZ3RoIGFuZCBjYW4gZnVuY3Rpb24gYXMgYSBwZXJmb3JtYW50IGludGVybWVkaWFyeSBpbiBtdWx0aS1zdGVwIGFnZW50aWMgd29ya2Zsb3dzLCBlZmZpY2llbnRseSBoYW5kbGluZyB0YXNrcyBsaWtlIGlucHV0IHBhcnNpbmcsIEFQSSBjYWxscywgYW5kIHRhc2sgcm91dGluZy4gSXQgY29uc2lzdGVudGx5IG91dHBlcmZvcm1zIGNvbXBhcmFibGUgbW9kZWxzIGxpa2UgTWlzdHJhbCA3QiBhY3Jvc3MgYmVuY2htYXJrcywgbWFraW5nIGl0IHBhcnRpY3VsYXJseSBzdWl0YWJsZSBmb3IgY29tcHV0ZS1lZmZpY2llbnQsIHByaXZhY3ktZm9jdXNlZCBzY2VuYXJpb3MuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAxIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImRlZXBzZWVrL2RlZXBzZWVrLXYzLWJhc2U6ZnJlZSIsIm5hbWUiOiJEZWVwU2VlazogRGVlcFNlZWsgVjMgQmFzZSAoZnJlZSkiLCJjcmVhdGVkIjoxNzQzMjcyMDIzLCJkZXNjcmlwdGlvbiI6Ik5vdGUgdGhhdCB0aGlzIGlzIGEgYmFzZSBtb2RlbCBtb3N0bHkgbWVhbnQgZm9yIHRlc3RpbmcsIHlvdSBuZWVkIHRvIHByb3ZpZGUgZGV0YWlsZWQgcHJvbXB0cyBmb3IgdGhlIG1vZGVsIHRvIHJldHVybiB1c2VmdWwgcmVzcG9uc2VzLiBcblxuRGVlcFNlZWstVjMgQmFzZSBpcyBhIDY3MUIgcGFyYW1ldGVyIG9wZW4gTWl4dHVyZS1vZi1FeHBlcnRzIChNb0UpIGxhbmd1YWdlIG1vZGVsIHdpdGggMzdCIGFjdGl2ZSBwYXJhbWV0ZXJzIHBlciBmb3J3YXJkIHBhc3MgYW5kIGEgY29udGV4dCBsZW5ndGggb2YgMTI4SyB0b2tlbnMuIFRyYWluZWQgb24gMTQuOFQgdG9rZW5zIHVzaW5nIEZQOCBtaXhlZCBwcmVjaXNpb24sIGl0IGFjaGlldmVzIGhpZ2ggdHJhaW5pbmcgZWZmaWNpZW5jeSBhbmQgc3RhYmlsaXR5LCB3aXRoIHN0cm9uZyBwZXJmb3JtYW5jZSBhY3Jvc3MgbGFuZ3VhZ2UsIHJlYXNvbmluZywgbWF0aCwgYW5kIGNvZGluZyB0YXNrcy4gXG5cbkRlZXBTZWVrLVYzIEJhc2UgaXMgdGhlIHByZS10cmFpbmVkIG1vZGVsIGJlaGluZCBbRGVlcFNlZWsgVjNdKC9kZWVwc2Vlay9kZWVwc2Vlay1jaGF0LXYzKSIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJEZWVwU2VlayIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODQwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJzY2IxMHgvbGxhbWEzLjEtdHlwaG9vbjItOGItaW5zdHJ1Y3QiLCJuYW1lIjoiVHlwaG9vbjIgOEIgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzQzMTk2NTExLCJkZXNjcmlwdGlvbiI6IkxsYW1hMy4xLVR5cGhvb24yLThCLUluc3RydWN0IGlzIGEgVGhhaS1FbmdsaXNoIGluc3RydWN0aW9uLXR1bmVkIG1vZGVsIHdpdGggOCBiaWxsaW9uIHBhcmFtZXRlcnMsIGJ1aWx0IG9uIExsYW1hIDMuMS4gSXQgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyBvdmVyIGl0cyBiYXNlIG1vZGVsIGluIFRoYWkgcmVhc29uaW5nLCBpbnN0cnVjdGlvbi1mb2xsb3dpbmcsIGFuZCBmdW5jdGlvbi1jYWxsaW5nIHRhc2tzLCB3aGlsZSBtYWludGFpbmluZyBjb21wZXRpdGl2ZSBFbmdsaXNoIHBlcmZvcm1hbmNlLiBUaGUgbW9kZWwgaXMgb3B0aW1pemVkIGZvciBiaWxpbmd1YWwgaW50ZXJhY3Rpb24gYW5kIHBlcmZvcm1zIHdlbGwgb24gVGhhaS1FbmdsaXNoIGNvZGUtc3dpdGNoaW5nLCBNVC1CZW5jaCwgSUZFdmFsLCBhbmQgdG9vbC11c2UgYmVuY2htYXJrcy5cblxuRGVzcGl0ZSBpdHMgc21hbGxlciBzaXplLCBpdCBkZW1vbnN0cmF0ZXMgc3Ryb25nIGdlbmVyYWxpemF0aW9uIGFjcm9zcyBtYXRoLCBjb2RpbmcsIGFuZCBtdWx0aWxpbmd1YWwgYmVuY2htYXJrcywgb3V0cGVyZm9ybWluZyBjb21wYXJhYmxlIDhCIG1vZGVscyBhY3Jvc3MgbW9zdCBUaGFpLXNwZWNpZmljIHRhc2tzLiBGdWxsIGJlbmNobWFyayByZXN1bHRzIGFuZCBtZXRob2RvbG9neSBhcmUgYXZhaWxhYmxlIGluIHRoZSBbdGVjaG5pY2FsIHJlcG9ydC5dKGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8yNDEyLjEzNzAyKSIsImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMTgiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAxOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODE5MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoic2NiMTB4L2xsYW1hMy4xLXR5cGhvb24yLTcwYi1pbnN0cnVjdCIsIm5hbWUiOiJUeXBob29uMiA3MEIgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzQzMTk2MTcwLCJkZXNjcmlwdGlvbiI6IkxsYW1hMy4xLVR5cGhvb24yLTcwQi1JbnN0cnVjdCBpcyBhIFRoYWktRW5nbGlzaCBpbnN0cnVjdGlvbi10dW5lZCBsYW5ndWFnZSBtb2RlbCB3aXRoIDcwIGJpbGxpb24gcGFyYW1ldGVycywgYnVpbHQgb24gTGxhbWEgMy4xLiBJdCBkZW1vbnN0cmF0ZXMgc3Ryb25nIHBlcmZvcm1hbmNlIGFjcm9zcyBnZW5lcmFsIGluc3RydWN0aW9uLWZvbGxvd2luZywgbWF0aCwgY29kaW5nLCBhbmQgdG9vbC11c2UgdGFza3MsIHdpdGggc3RhdGUtb2YtdGhlLWFydCByZXN1bHRzIGluIFRoYWktc3BlY2lmaWMgYmVuY2htYXJrcyBzdWNoIGFzIElGRXZhbCwgTVQtQmVuY2gsIGFuZCBUaGFpLUVuZ2xpc2ggY29kZS1zd2l0Y2hpbmcuXG5cblRoZSBtb2RlbCBleGNlbHMgaW4gYmlsaW5ndWFsIHJlYXNvbmluZyBhbmQgZnVuY3Rpb24tY2FsbGluZyBzY2VuYXJpb3MsIG9mZmVyaW5nIGhpZ2ggYWNjdXJhY3kgYWNyb3NzIGRpdmVyc2UgZG9tYWlucy4gQ29tcGFyYXRpdmUgZXZhbHVhdGlvbnMgc2hvdyBjb25zaXN0ZW50IGltcHJvdmVtZW50cyBvdmVyIHByaW9yIFRoYWkgTExNcyBhbmQgb3RoZXIgTGxhbWEtYmFzZWQgYmFzZWxpbmVzLiBGdWxsIHJlc3VsdHMgYW5kIG1ldGhvZG9sb2d5IGFyZSBhdmFpbGFibGUgaW4gdGhlIFt0ZWNobmljYWwgcmVwb3J0Ll0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzI0MTIuMTM3MDIpIiwiY29udGV4dF9sZW5ndGgiOjgxOTIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA4OCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDg4IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbGxlbmFpL21vbG1vLTdiLWQ6ZnJlZSIsIm5hbWUiOiJBbGxlbkFJOiBNb2xtbyA3QiBEIChmcmVlKSIsImNyZWF0ZWQiOjE3NDMwMjMyNDcsImRlc2NyaXB0aW9uIjoiTW9sbW8gaXMgYSBmYW1pbHkgb2Ygb3BlbiB2aXNpb24tbGFuZ3VhZ2UgbW9kZWxzIGRldmVsb3BlZCBieSB0aGUgQWxsZW4gSW5zdGl0dXRlIGZvciBBSS4gTW9sbW8gbW9kZWxzIGFyZSB0cmFpbmVkIG9uIFBpeE1vLCBhIGRhdGFzZXQgb2YgMSBtaWxsaW9uLCBoaWdobHktY3VyYXRlZCBpbWFnZS10ZXh0IHBhaXJzLiBJdCBoYXMgc3RhdGUtb2YtdGhlLWFydCBwZXJmb3JtYW5jZSBhbW9uZyBtdWx0aW1vZGFsIG1vZGVscyB3aXRoIGEgc2ltaWxhciBzaXplIHdoaWxlIGJlaW5nIGZ1bGx5IG9wZW4tc291cmNlLiBZb3UgY2FuIGZpbmQgYWxsIG1vZGVscyBpbiB0aGUgTW9sbW8gZmFtaWx5IFtoZXJlXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL2NvbGxlY3Rpb25zL2FsbGVuYWkvbW9sbW8tNjZmMzc5ZTZmZTNiOGVmMDkwYThjYTE5KS4gTGVhcm4gbW9yZSBhYm91dCB0aGUgTW9sbW8gZmFtaWx5IFtpbiB0aGUgYW5ub3VuY2VtZW50IGJsb2cgcG9zdF0oaHR0cHM6Ly9tb2xtby5hbGxlbmFpLm9yZy9ibG9nKSBvciB0aGUgW3BhcGVyXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL3BhcGVycy8yNDA5LjE3MTQ2KS5cblxuTW9sbW8gN0ItRCBpcyBiYXNlZCBvbiBbUXdlbjItN0JdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vUXdlbi9Rd2VuMi03QikgYW5kIHVzZXMgW09wZW5BSSBDTElQXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL29wZW5haS9jbGlwLXZpdC1sYXJnZS1wYXRjaDE0LTMzNikgYXMgdmlzaW9uIGJhY2tib25lLiBJdCBwZXJmb3JtcyBjb21mb3J0YWJseSBiZXR3ZWVuIEdQVC00ViBhbmQgR1BULTRvIG9uIGJvdGggYWNhZGVtaWMgYmVuY2htYXJrcyBhbmQgaHVtYW4gZXZhbHVhdGlvbi5cblxuVGhpcyBjaGVja3BvaW50IGlzIGEgcHJldmlldyBvZiB0aGUgTW9sbW8gcmVsZWFzZS4gQWxsIGFydGlmYWN0cyB1c2VkIGluIGNyZWF0aW5nIE1vbG1vIChQaXhNbyBkYXRhc2V0LCB0cmFpbmluZyBjb2RlLCBldmFsdWF0aW9ucywgaW50ZXJtZWRpYXRlIGNoZWNrcG9pbnRzKSB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGF0IGEgbGF0ZXIgZGF0ZSwgZnVydGhlcmluZyBvdXIgY29tbWl0bWVudCB0byBvcGVuLXNvdXJjZSBBSSBkZXZlbG9wbWVudCBhbmQgcmVwcm9kdWNpYmlsaXR5LiIsImNvbnRleHRfbGVuZ3RoIjo0MDk2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NDA5NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYnl0ZWRhbmNlLXJlc2VhcmNoL3VpLXRhcnMtNzJiOmZyZWUiLCJuYW1lIjoiQnl0ZWRhbmNlOiBVSS1UQVJTIDcyQiAgKGZyZWUpIiwiY3JlYXRlZCI6MTc0MzAyMDA2NSwiZGVzY3JpcHRpb24iOiJVSS1UQVJTIDcyQiBpcyBhbiBvcGVuLXNvdXJjZSBtdWx0aW1vZGFsIEFJIG1vZGVsIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgYXV0b21hdGluZyBicm93c2VyIGFuZCBkZXNrdG9wIHRhc2tzIHRocm91Z2ggdmlzdWFsIGludGVyYWN0aW9uIGFuZCBjb250cm9sLiBUaGUgbW9kZWwgaXMgYnVpbHQgd2l0aCBhIHNwZWNpYWxpemVkIHZpc2lvbiBhcmNoaXRlY3R1cmUgZW5hYmxpbmcgYWNjdXJhdGUgaW50ZXJwcmV0YXRpb24gYW5kIG1hbmlwdWxhdGlvbiBvZiBvbi1zY3JlZW4gdmlzdWFsIGRhdGEuIEl0IHN1cHBvcnRzIGF1dG9tYXRpb24gdGFza3Mgd2l0aGluIHdlYiBicm93c2VycyBhcyB3ZWxsIGFzIGRlc2t0b3AgYXBwbGljYXRpb25zLCBpbmNsdWRpbmcgTWljcm9zb2Z0IE9mZmljZSBhbmQgVlMgQ29kZS5cblxuQ29yZSBjYXBhYmlsaXRpZXMgaW5jbHVkZSBpbnRlbGxpZ2VudCBzY3JlZW4gZGV0ZWN0aW9uLCBwcmVkaWN0aXZlIGFjdGlvbiBtb2RlbGluZywgYW5kIGVmZmljaWVudCBoYW5kbGluZyBvZiByZXBldGl0aXZlIGludGVyYWN0aW9ucy4gVUktVEFSUyBlbXBsb3lzIHN1cGVydmlzZWQgZmluZS10dW5pbmcgKFNGVCkgdGFpbG9yZWQgZXhwbGljaXRseSBmb3IgY29tcHV0ZXIgY29udHJvbCBzY2VuYXJpb3MuIEl0IGNhbiBiZSBkZXBsb3llZCBsb2NhbGx5IG9yIGFjY2Vzc2VkIHZpYSBIdWdnaW5nIEZhY2UgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMuIEludGVuZGVkIHVzZSBjYXNlcyBlbmNvbXBhc3Mgd29ya2Zsb3cgYXV0b21hdGlvbiwgdGFzayBzY3JpcHRpbmcsIGFuZCBpbnRlcmFjdGl2ZSBkZXNrdG9wIGNvbnRyb2wgYXBwbGljYXRpb25zLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3ZW4yLjUtdmwtM2ItaW5zdHJ1Y3Q6ZnJlZSIsIm5hbWUiOiJRd2VuOiBRd2VuMi41IFZMIDNCIEluc3RydWN0IChmcmVlKSIsImNyZWF0ZWQiOjE3NDMwMTQ1NzMsImRlc2NyaXB0aW9uIjoiUXdlbjIuNSBWTCAzQiBpcyBhIG11bHRpbW9kYWwgTExNIGZyb20gdGhlIFF3ZW4gVGVhbSB3aXRoIHRoZSBmb2xsb3dpbmcga2V5IGVuaGFuY2VtZW50czpcblxuLSBTb1RBIHVuZGVyc3RhbmRpbmcgb2YgaW1hZ2VzIG9mIHZhcmlvdXMgcmVzb2x1dGlvbiAmIHJhdGlvOiBRd2VuMi41LVZMIGFjaGlldmVzIHN0YXRlLW9mLXRoZS1hcnQgcGVyZm9ybWFuY2Ugb24gdmlzdWFsIHVuZGVyc3RhbmRpbmcgYmVuY2htYXJrcywgaW5jbHVkaW5nIE1hdGhWaXN0YSwgRG9jVlFBLCBSZWFsV29ybGRRQSwgTVRWUUEsIGV0Yy5cblxuLSBBZ2VudCB0aGF0IGNhbiBvcGVyYXRlIHlvdXIgbW9iaWxlcywgcm9ib3RzLCBldGMuOiB3aXRoIHRoZSBhYmlsaXRpZXMgb2YgY29tcGxleCByZWFzb25pbmcgYW5kIGRlY2lzaW9uIG1ha2luZywgUXdlbjIuNS1WTCBjYW4gYmUgaW50ZWdyYXRlZCB3aXRoIGRldmljZXMgbGlrZSBtb2JpbGUgcGhvbmVzLCByb2JvdHMsIGV0Yy4sIGZvciBhdXRvbWF0aWMgb3BlcmF0aW9uIGJhc2VkIG9uIHZpc3VhbCBlbnZpcm9ubWVudCBhbmQgdGV4dCBpbnN0cnVjdGlvbnMuXG5cbi0gTXVsdGlsaW5ndWFsIFN1cHBvcnQ6IHRvIHNlcnZlIGdsb2JhbCB1c2VycywgYmVzaWRlcyBFbmdsaXNoIGFuZCBDaGluZXNlLCBRd2VuMi41LVZMIG5vdyBzdXBwb3J0cyB0aGUgdW5kZXJzdGFuZGluZyBvZiB0ZXh0cyBpbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzIGluc2lkZSBpbWFnZXMsIGluY2x1ZGluZyBtb3N0IEV1cm9wZWFuIGxhbmd1YWdlcywgSmFwYW5lc2UsIEtvcmVhbiwgQXJhYmljLCBWaWV0bmFtZXNlLCBldGMuXG5cbkZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGlzIFtibG9nIHBvc3RdKGh0dHBzOi8vcXdlbmxtLmdpdGh1Yi5pby9ibG9nL3F3ZW4yLXZsLykgYW5kIFtHaXRIdWIgcmVwb10oaHR0cHM6Ly9naXRodWIuY29tL1F3ZW5MTS9Rd2VuMi1WTCkuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbVG9uZ3lpIFFpYW53ZW4gTElDRU5TRSBBR1JFRU1FTlRdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vUXdlbi9Rd2VuMS41LTExMEItQ2hhdC9ibG9iL21haW4vTElDRU5TRSkuIiwiY29udGV4dF9sZW5ndGgiOjY0MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJRd2VuIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo2NDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZ29vZ2xlL2dlbWluaS0yLjUtcHJvLWV4cC0wMy0yNTpmcmVlIiwibmFtZSI6Ikdvb2dsZTogR2VtaW5pIDIuNSBQcm8gRXhwZXJpbWVudGFsIChmcmVlKSIsImNyZWF0ZWQiOjE3NDI5MjIwOTksImRlc2NyaXB0aW9uIjoiR2VtaW5pIDIuNSBQcm8gaXMgR29vZ2xl4oCZcyBzdGF0ZS1vZi10aGUtYXJ0IEFJIG1vZGVsIGRlc2lnbmVkIGZvciBhZHZhbmNlZCByZWFzb25pbmcsIGNvZGluZywgbWF0aGVtYXRpY3MsIGFuZCBzY2llbnRpZmljIHRhc2tzLiBJdCBlbXBsb3lzIOKAnHRoaW5raW5n4oCdIGNhcGFiaWxpdGllcywgZW5hYmxpbmcgaXQgdG8gcmVhc29uIHRocm91Z2ggcmVzcG9uc2VzIHdpdGggZW5oYW5jZWQgYWNjdXJhY3kgYW5kIG51YW5jZWQgY29udGV4dCBoYW5kbGluZy4gR2VtaW5pIDIuNSBQcm8gYWNoaWV2ZXMgdG9wLXRpZXIgcGVyZm9ybWFuY2Ugb24gbXVsdGlwbGUgYmVuY2htYXJrcywgaW5jbHVkaW5nIGZpcnN0LXBsYWNlIHBvc2l0aW9uaW5nIG9uIHRoZSBMTUFyZW5hIGxlYWRlcmJvYXJkLCByZWZsZWN0aW5nIHN1cGVyaW9yIGh1bWFuLXByZWZlcmVuY2UgYWxpZ25tZW50IGFuZCBjb21wbGV4IHByb2JsZW0tc29sdmluZyBhYmlsaXRpZXMuIiwiY29udGV4dF9sZW5ndGgiOjEwMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdlbWluaSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTAwMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo2NTUzNSwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdlbjIuNS12bC0zMmItaW5zdHJ1Y3Q6ZnJlZSIsIm5hbWUiOiJRd2VuOiBRd2VuMi41IFZMIDMyQiBJbnN0cnVjdCAoZnJlZSkiLCJjcmVhdGVkIjoxNzQyODM5ODM4LCJkZXNjcmlwdGlvbiI6IlF3ZW4yLjUtVkwtMzJCIGlzIGEgbXVsdGltb2RhbCB2aXNpb24tbGFuZ3VhZ2UgbW9kZWwgZmluZS10dW5lZCB0aHJvdWdoIHJlaW5mb3JjZW1lbnQgbGVhcm5pbmcgZm9yIGVuaGFuY2VkIG1hdGhlbWF0aWNhbCByZWFzb25pbmcsIHN0cnVjdHVyZWQgb3V0cHV0cywgYW5kIHZpc3VhbCBwcm9ibGVtLXNvbHZpbmcgY2FwYWJpbGl0aWVzLiBJdCBleGNlbHMgYXQgdmlzdWFsIGFuYWx5c2lzIHRhc2tzLCBpbmNsdWRpbmcgb2JqZWN0IHJlY29nbml0aW9uLCB0ZXh0dWFsIGludGVycHJldGF0aW9uIHdpdGhpbiBpbWFnZXMsIGFuZCBwcmVjaXNlIGV2ZW50IGxvY2FsaXphdGlvbiBpbiBleHRlbmRlZCB2aWRlb3MuIFF3ZW4yLjUtVkwtMzJCIGRlbW9uc3RyYXRlcyBzdGF0ZS1vZi10aGUtYXJ0IHBlcmZvcm1hbmNlIGFjcm9zcyBtdWx0aW1vZGFsIGJlbmNobWFya3Mgc3VjaCBhcyBNTU1VLCBNYXRoVmlzdGEsIGFuZCBWaWRlb01NRSwgd2hpbGUgbWFpbnRhaW5pbmcgc3Ryb25nIHJlYXNvbmluZyBhbmQgY2xhcml0eSBpbiB0ZXh0LWJhc2VkIHRhc2tzIGxpa2UgTU1MVSwgbWF0aGVtYXRpY2FsIHByb2JsZW0tc29sdmluZywgYW5kIGNvZGUgZ2VuZXJhdGlvbi4iLCJjb250ZXh0X2xlbmd0aCI6ODE5MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODE5MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicXdlbi9xd2VuMi41LXZsLTMyYi1pbnN0cnVjdCIsIm5hbWUiOiJRd2VuOiBRd2VuMi41IFZMIDMyQiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3NDI4Mzk4MzgsImRlc2NyaXB0aW9uIjoiUXdlbjIuNS1WTC0zMkIgaXMgYSBtdWx0aW1vZGFsIHZpc2lvbi1sYW5ndWFnZSBtb2RlbCBmaW5lLXR1bmVkIHRocm91Z2ggcmVpbmZvcmNlbWVudCBsZWFybmluZyBmb3IgZW5oYW5jZWQgbWF0aGVtYXRpY2FsIHJlYXNvbmluZywgc3RydWN0dXJlZCBvdXRwdXRzLCBhbmQgdmlzdWFsIHByb2JsZW0tc29sdmluZyBjYXBhYmlsaXRpZXMuIEl0IGV4Y2VscyBhdCB2aXN1YWwgYW5hbHlzaXMgdGFza3MsIGluY2x1ZGluZyBvYmplY3QgcmVjb2duaXRpb24sIHRleHR1YWwgaW50ZXJwcmV0YXRpb24gd2l0aGluIGltYWdlcywgYW5kIHByZWNpc2UgZXZlbnQgbG9jYWxpemF0aW9uIGluIGV4dGVuZGVkIHZpZGVvcy4gUXdlbjIuNS1WTC0zMkIgZGVtb25zdHJhdGVzIHN0YXRlLW9mLXRoZS1hcnQgcGVyZm9ybWFuY2UgYWNyb3NzIG11bHRpbW9kYWwgYmVuY2htYXJrcyBzdWNoIGFzIE1NTVUsIE1hdGhWaXN0YSwgYW5kIFZpZGVvTU1FLCB3aGlsZSBtYWludGFpbmluZyBzdHJvbmcgcmVhc29uaW5nIGFuZCBjbGFyaXR5IGluIHRleHQtYmFzZWQgdGFza3MgbGlrZSBNTUxVLCBtYXRoZW1hdGljYWwgcHJvYmxlbS1zb2x2aW5nLCBhbmQgY29kZSBnZW5lcmF0aW9uLiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDkiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA5IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImRlZXBzZWVrL2RlZXBzZWVrLWNoYXQtdjMtMDMyNDpmcmVlIiwibmFtZSI6IkRlZXBTZWVrOiBEZWVwU2VlayBWMyAwMzI0IChmcmVlKSIsImNyZWF0ZWQiOjE3NDI4MjQ3NTUsImRlc2NyaXB0aW9uIjoiRGVlcFNlZWsgVjMsIGEgNjg1Qi1wYXJhbWV0ZXIsIG1peHR1cmUtb2YtZXhwZXJ0cyBtb2RlbCwgaXMgdGhlIGxhdGVzdCBpdGVyYXRpb24gb2YgdGhlIGZsYWdzaGlwIGNoYXQgbW9kZWwgZmFtaWx5IGZyb20gdGhlIERlZXBTZWVrIHRlYW0uXG5cbkl0IHN1Y2NlZWRzIHRoZSBbRGVlcFNlZWsgVjNdKC9kZWVwc2Vlay9kZWVwc2Vlay1jaGF0LXYzKSBtb2RlbCBhbmQgcGVyZm9ybXMgcmVhbGx5IHdlbGwgb24gYSB2YXJpZXR5IG9mIHRhc2tzLiIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJEZWVwU2VlayIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODQwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJkZWVwc2Vlay9kZWVwc2Vlay1jaGF0LXYzLTAzMjQiLCJuYW1lIjoiRGVlcFNlZWs6IERlZXBTZWVrIFYzIDAzMjQiLCJjcmVhdGVkIjoxNzQyODI0NzU1LCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrIFYzLCBhIDY4NUItcGFyYW1ldGVyLCBtaXh0dXJlLW9mLWV4cGVydHMgbW9kZWwsIGlzIHRoZSBsYXRlc3QgaXRlcmF0aW9uIG9mIHRoZSBmbGFnc2hpcCBjaGF0IG1vZGVsIGZhbWlseSBmcm9tIHRoZSBEZWVwU2VlayB0ZWFtLlxuXG5JdCBzdWNjZWVkcyB0aGUgW0RlZXBTZWVrIFYzXSgvZGVlcHNlZWsvZGVlcHNlZWstY2hhdC12MykgbW9kZWwgYW5kIHBlcmZvcm1zIHJlYWxseSB3ZWxsIG9uIGEgdmFyaWV0eSBvZiB0YXNrcy4iLCJjb250ZXh0X2xlbmd0aCI6NjQwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJEZWVwU2VlayIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMjciLCJjb21wbGV0aW9uIjoiMC4wMDAwMDExIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAwNyJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjY0MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJmZWF0aGVybGVzcy9xd2Vya3ktNzJiOmZyZWUiLCJuYW1lIjoiUXdlcmt5IDcyQiAoZnJlZSkiLCJjcmVhdGVkIjoxNzQyNDgxNTk3LCJkZXNjcmlwdGlvbiI6IlF3ZXJreS03MkIgaXMgYSBsaW5lYXItYXR0ZW50aW9uIFJXS1YgdmFyaWFudCBvZiB0aGUgUXdlbiAyLjUgNzJCIG1vZGVsLCBvcHRpbWl6ZWQgdG8gc2lnbmlmaWNhbnRseSByZWR1Y2UgY29tcHV0YXRpb25hbCBjb3N0IGF0IHNjYWxlLiBMZXZlcmFnaW5nIGxpbmVhciBhdHRlbnRpb24sIGl0IGFjaGlldmVzIHN1YnN0YW50aWFsIGluZmVyZW5jZSBzcGVlZHVwcyAoPjEwMDB4KSB3aGlsZSByZXRhaW5pbmcgY29tcGV0aXRpdmUgYWNjdXJhY3kgb24gY29tbW9uIGJlbmNobWFya3MgbGlrZSBBUkMsIEhlbGxhU3dhZywgTGFtYmFkYSwgYW5kIE1NTFUuIEl0IGluaGVyaXRzIGtub3dsZWRnZSBhbmQgbGFuZ3VhZ2Ugc3VwcG9ydCBmcm9tIFF3ZW4gMi41LCBzdXBwb3J0aW5nIGFwcHJveGltYXRlbHkgMzAgbGFuZ3VhZ2VzLCBtYWtpbmcgaXQgc3VpdGFibGUgZm9yIGVmZmljaWVudCBpbmZlcmVuY2UgaW4gbGFyZ2UtY29udGV4dCBhcHBsaWNhdGlvbnMuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvbzEtcHJvIiwibmFtZSI6Ik9wZW5BSTogbzEtcHJvIiwiY3JlYXRlZCI6MTc0MjQyMzIxMSwiZGVzY3JpcHRpb24iOiJUaGUgbzEgc2VyaWVzIG9mIG1vZGVscyBhcmUgdHJhaW5lZCB3aXRoIHJlaW5mb3JjZW1lbnQgbGVhcm5pbmcgdG8gdGhpbmsgYmVmb3JlIHRoZXkgYW5zd2VyIGFuZCBwZXJmb3JtIGNvbXBsZXggcmVhc29uaW5nLiBUaGUgbzEtcHJvIG1vZGVsIHVzZXMgbW9yZSBjb21wdXRlIHRvIHRoaW5rIGhhcmRlciBhbmQgcHJvdmlkZSBjb25zaXN0ZW50bHkgYmV0dGVyIGFuc3dlcnMuIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAxNSIsImNvbXBsZXRpb24iOiIwLjAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4yMTY3NSIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMDAwMDAsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pc3RyYWxhaS9taXN0cmFsLXNtYWxsLTMuMS0yNGItaW5zdHJ1Y3Q6ZnJlZSIsIm5hbWUiOiJNaXN0cmFsOiBNaXN0cmFsIFNtYWxsIDMuMSAyNEIgKGZyZWUpIiwiY3JlYXRlZCI6MTc0MjIzODkzNywiZGVzY3JpcHRpb24iOiJNaXN0cmFsIFNtYWxsIDMuMSAyNEIgSW5zdHJ1Y3QgaXMgYW4gdXBncmFkZWQgdmFyaWFudCBvZiBNaXN0cmFsIFNtYWxsIDMgKDI1MDEpLCBmZWF0dXJpbmcgMjQgYmlsbGlvbiBwYXJhbWV0ZXJzIHdpdGggYWR2YW5jZWQgbXVsdGltb2RhbCBjYXBhYmlsaXRpZXMuIEl0IHByb3ZpZGVzIHN0YXRlLW9mLXRoZS1hcnQgcGVyZm9ybWFuY2UgaW4gdGV4dC1iYXNlZCByZWFzb25pbmcgYW5kIHZpc2lvbiB0YXNrcywgaW5jbHVkaW5nIGltYWdlIGFuYWx5c2lzLCBwcm9ncmFtbWluZywgbWF0aGVtYXRpY2FsIHJlYXNvbmluZywgYW5kIG11bHRpbGluZ3VhbCBzdXBwb3J0IGFjcm9zcyBkb3plbnMgb2YgbGFuZ3VhZ2VzLiBFcXVpcHBlZCB3aXRoIGFuIGV4dGVuc2l2ZSAxMjhrIHRva2VuIGNvbnRleHQgd2luZG93IGFuZCBvcHRpbWl6ZWQgZm9yIGVmZmljaWVudCBsb2NhbCBpbmZlcmVuY2UsIGl0IHN1cHBvcnRzIHVzZSBjYXNlcyBzdWNoIGFzIGNvbnZlcnNhdGlvbmFsIGFnZW50cywgZnVuY3Rpb24gY2FsbGluZywgbG9uZy1kb2N1bWVudCBjb21wcmVoZW5zaW9uLCBhbmQgcHJpdmFjeS1zZW5zaXRpdmUgZGVwbG95bWVudHMuIiwiY29udGV4dF9sZW5ndGgiOjk2MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo5NjAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo5NjAwMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pc3RyYWxhaS9taXN0cmFsLXNtYWxsLTMuMS0yNGItaW5zdHJ1Y3QiLCJuYW1lIjoiTWlzdHJhbDogTWlzdHJhbCBTbWFsbCAzLjEgMjRCIiwiY3JlYXRlZCI6MTc0MjIzODkzNywiZGVzY3JpcHRpb24iOiJNaXN0cmFsIFNtYWxsIDMuMSAyNEIgSW5zdHJ1Y3QgaXMgYW4gdXBncmFkZWQgdmFyaWFudCBvZiBNaXN0cmFsIFNtYWxsIDMgKDI1MDEpLCBmZWF0dXJpbmcgMjQgYmlsbGlvbiBwYXJhbWV0ZXJzIHdpdGggYWR2YW5jZWQgbXVsdGltb2RhbCBjYXBhYmlsaXRpZXMuIEl0IHByb3ZpZGVzIHN0YXRlLW9mLXRoZS1hcnQgcGVyZm9ybWFuY2UgaW4gdGV4dC1iYXNlZCByZWFzb25pbmcgYW5kIHZpc2lvbiB0YXNrcywgaW5jbHVkaW5nIGltYWdlIGFuYWx5c2lzLCBwcm9ncmFtbWluZywgbWF0aGVtYXRpY2FsIHJlYXNvbmluZywgYW5kIG11bHRpbGluZ3VhbCBzdXBwb3J0IGFjcm9zcyBkb3plbnMgb2YgbGFuZ3VhZ2VzLiBFcXVpcHBlZCB3aXRoIGFuIGV4dGVuc2l2ZSAxMjhrIHRva2VuIGNvbnRleHQgd2luZG93IGFuZCBvcHRpbWl6ZWQgZm9yIGVmZmljaWVudCBsb2NhbCBpbmZlcmVuY2UsIGl0IHN1cHBvcnRzIHVzZSBjYXNlcyBzdWNoIGFzIGNvbnZlcnNhdGlvbmFsIGFnZW50cywgZnVuY3Rpb24gY2FsbGluZywgbG9uZy1kb2N1bWVudCBjb21wcmVoZW5zaW9uLCBhbmQgcHJpdmFjeS1zZW5zaXRpdmUgZGVwbG95bWVudHMuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMyIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDkyNjQiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3Blbi1yMS9vbHltcGljY29kZXItN2I6ZnJlZSIsIm5hbWUiOiJPbHltcGljQ29kZXIgN0IgKGZyZWUpIiwiY3JlYXRlZCI6MTc0MjA3ODI2NSwiZGVzY3JpcHRpb24iOiJPbHltcGljQ29kZXItN0IgaXMgYW4gb3Blbi1zb3VyY2UgbGFuZ3VhZ2UgbW9kZWwgZmluZS10dW5lZCBvbiB0aGUgQ29kZUZvcmNlcy1Db1RzIGRhdGFzZXQsIGNvbnNpc3Rpbmcgb2YgbmVhcmx5IDEwMCwwMDAgaGlnaC1xdWFsaXR5IGNoYWluLW9mLXRob3VnaHQgZXhhbXBsZXMgZnJvbSBjb21wZXRpdGl2ZSBwcm9ncmFtbWluZyBjb250ZXh0cy4gT3B0aW1pemVkIHNwZWNpZmljYWxseSBmb3Igb2x5bXBpYWQtbGV2ZWwgY29kaW5nIHByb2JsZW1zLCB0aGlzIG1vZGVsIGRlbW9uc3RyYXRlcyBzdHJvbmcgY2hhaW4tb2YtdGhvdWdodCByZWFzb25pbmcgYW5kIGNvbXBldGl0aXZlIGNvZGUgZ2VuZXJhdGlvbiBjYXBhYmlsaXRpZXMsIGFjaGlldmluZyBwZXJmb3JtYW5jZSBjb21wZXRpdGl2ZSB3aXRoIGZyb250aWVyIGNsb3NlZC1zb3VyY2UgbW9kZWxzIG9uIHRhc2tzIGZyb20gdGhlIElPSSAyMDI0IGFuZCBzaW1pbGFyIGNvZGluZyBjb250ZXN0cy4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW4tcjEvb2x5bXBpY2NvZGVyLTMyYjpmcmVlIiwibmFtZSI6Ik9seW1waWNDb2RlciAzMkIgKGZyZWUpIiwiY3JlYXRlZCI6MTc0MjA3NzIyOCwiZGVzY3JpcHRpb24iOiJPbHltcGljQ29kZXItMzJCIGlzIGEgaGlnaC1wZXJmb3JtaW5nIG9wZW4tc291cmNlIG1vZGVsIGZpbmUtdHVuZWQgdXNpbmcgdGhlIENvZGVGb3JjZXMtQ29UcyBkYXRhc2V0LCBjb250YWluaW5nIGFwcHJveGltYXRlbHkgMTAwLDAwMCBjaGFpbi1vZi10aG91Z2h0IHByb2dyYW1taW5nIHNhbXBsZXMuIEl0IGV4Y2VscyBhdCBjb21wbGV4IGNvbXBldGl0aXZlIHByb2dyYW1taW5nIGJlbmNobWFya3MsIHN1Y2ggYXMgSU9JIDIwMjQgYW5kIENvZGVmb3JjZXMtc3R5bGUgY2hhbGxlbmdlcywgZnJlcXVlbnRseSBzdXJwYXNzaW5nIHN0YXRlLW9mLXRoZS1hcnQgY2xvc2VkLXNvdXJjZSBtb2RlbHMuIE9seW1waWNDb2Rlci0zMkIgcHJvdmlkZXMgYWR2YW5jZWQgcmVhc29uaW5nLCBjb2hlcmVudCBtdWx0aS1zdGVwIHByb2JsZW0tc29sdmluZywgYW5kIHJvYnVzdCBjb2RlIGdlbmVyYXRpb24gY2FwYWJpbGl0aWVzLCBkZW1vbnN0cmF0aW5nIHNpZ25pZmljYW50IHBvdGVudGlhbCBmb3Igb2x5bXBpYWQtbGV2ZWwgY29tcGV0aXRpdmUgcHJvZ3JhbW1pbmcgYXBwbGljYXRpb25zLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6ImRlZXBzZWVrLXIxIn0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoic3RlZWxza3VsbC9sMy4zLWVsZWN0cmEtcjEtNzBiIiwibmFtZSI6IlN0ZWVsU2t1bGw6IEwzLjMgRWxlY3RyYSBSMSA3MEIiLCJjcmVhdGVkIjoxNzQyMDY3NjExLCJkZXNjcmlwdGlvbiI6IkwzLjMtRWxlY3RyYS1SMS03MCBpcyB0aGUgbmV3ZXN0IHJlbGVhc2Ugb2YgdGhlIFVubmFtZWQgc2VyaWVzLiBCdWlsdCBvbiBhIERlZXBTZWVrIFIxIERpc3RpbGwgYmFzZSwgRWxlY3RyYS1SMSBpbnRlZ3JhdGVzIHZhcmlvdXMgbW9kZWxzIHRvZ2V0aGVyIHRvIHByb3ZpZGUgYW4gaW50ZWxsaWdlbnQgYW5kIGNvaGVyZW50IG1vZGVsIGNhcGFibGUgb2YgcHJvdmlkaW5nIGRlZXAgY2hhcmFjdGVyIGluc2lnaHRzLiBUaHJvdWdoIHByb3BlciBwcm9tcHRpbmcsIHRoZSBtb2RlbCBkZW1vbnN0cmF0ZXMgYWR2YW5jZWQgcmVhc29uaW5nIGNhcGFiaWxpdGllcyBhbmQgdW5wcm9tcHRlZCBleHBsb3JhdGlvbiBvZiBjaGFyYWN0ZXIgaW5uZXIgdGhvdWdodHMgYW5kIG1vdGl2YXRpb25zLiBSZWFkIG1vcmUgYWJvdXQgdGhlIG1vZGVsIGFuZCBbcHJvbXB0aW5nIGhlcmVdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vU3RlZWxza3VsbC9MMy4zLUVsZWN0cmEtUjEtNzBiKSIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwNyIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDk1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MTMxMDcyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZ29vZ2xlL2dlbW1hLTMtMWItaXQ6ZnJlZSIsIm5hbWUiOiJHb29nbGU6IEdlbW1hIDMgMUIgKGZyZWUpIiwiY3JlYXRlZCI6MTc0MTk2MzU1NiwiZGVzY3JpcHRpb24iOiJHZW1tYSAzIDFCIGlzIHRoZSBzbWFsbGVzdCBvZiB0aGUgbmV3IEdlbW1hIDMgZmFtaWx5LiBJdCBoYW5kbGVzIGNvbnRleHQgd2luZG93cyB1cCB0byAzMmsgdG9rZW5zLCB1bmRlcnN0YW5kcyBvdmVyIDE0MCBsYW5ndWFnZXMsIGFuZCBvZmZlcnMgaW1wcm92ZWQgbWF0aCwgcmVhc29uaW5nLCBhbmQgY2hhdCBjYXBhYmlsaXRpZXMsIGluY2x1ZGluZyBzdHJ1Y3R1cmVkIG91dHB1dHMgYW5kIGZ1bmN0aW9uIGNhbGxpbmcuIE5vdGU6IEdlbW1hIDMgMUIgaXMgbm90IG11bHRpbW9kYWwuIEZvciB0aGUgc21hbGxlc3QgbXVsdGltb2RhbCBHZW1tYSAzIG1vZGVsLCBwbGVhc2Ugc2VlIFtHZW1tYSAzIDRCXShnb29nbGUvZ2VtbWEtMy00Yi1pdCkiLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdlbWluaSIsImluc3RydWN0X3R5cGUiOiJnZW1tYSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Imdvb2dsZS9nZW1tYS0zLTRiLWl0OmZyZWUiLCJuYW1lIjoiR29vZ2xlOiBHZW1tYSAzIDRCIChmcmVlKSIsImNyZWF0ZWQiOjE3NDE5MDU1MTAsImRlc2NyaXB0aW9uIjoiR2VtbWEgMyBpbnRyb2R1Y2VzIG11bHRpbW9kYWxpdHksIHN1cHBvcnRpbmcgdmlzaW9uLWxhbmd1YWdlIGlucHV0IGFuZCB0ZXh0IG91dHB1dHMuIEl0IGhhbmRsZXMgY29udGV4dCB3aW5kb3dzIHVwIHRvIDEyOGsgdG9rZW5zLCB1bmRlcnN0YW5kcyBvdmVyIDE0MCBsYW5ndWFnZXMsIGFuZCBvZmZlcnMgaW1wcm92ZWQgbWF0aCwgcmVhc29uaW5nLCBhbmQgY2hhdCBjYXBhYmlsaXRpZXMsIGluY2x1ZGluZyBzdHJ1Y3R1cmVkIG91dHB1dHMgYW5kIGZ1bmN0aW9uIGNhbGxpbmcuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR2VtaW5pIiwiaW5zdHJ1Y3RfdHlwZSI6ImdlbW1hIn0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Imdvb2dsZS9nZW1tYS0zLTRiLWl0IiwibmFtZSI6Ikdvb2dsZTogR2VtbWEgMyA0QiIsImNyZWF0ZWQiOjE3NDE5MDU1MTAsImRlc2NyaXB0aW9uIjoiR2VtbWEgMyBpbnRyb2R1Y2VzIG11bHRpbW9kYWxpdHksIHN1cHBvcnRpbmcgdmlzaW9uLWxhbmd1YWdlIGlucHV0IGFuZCB0ZXh0IG91dHB1dHMuIEl0IGhhbmRsZXMgY29udGV4dCB3aW5kb3dzIHVwIHRvIDEyOGsgdG9rZW5zLCB1bmRlcnN0YW5kcyBvdmVyIDE0MCBsYW5ndWFnZXMsIGFuZCBvZmZlcnMgaW1wcm92ZWQgbWF0aCwgcmVhc29uaW5nLCBhbmQgY2hhdCBjYXBhYmlsaXRpZXMsIGluY2x1ZGluZyBzdHJ1Y3R1cmVkIG91dHB1dHMgYW5kIGZ1bmN0aW9uIGNhbGxpbmcuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR2VtaW5pIiwiaW5zdHJ1Y3RfdHlwZSI6ImdlbW1hIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDA0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFpMjEvamFtYmEtMS42LWxhcmdlIiwibmFtZSI6IkFJMjE6IEphbWJhIDEuNiBMYXJnZSIsImNyZWF0ZWQiOjE3NDE5MDUxNzMsImRlc2NyaXB0aW9uIjoiQUkyMSBKYW1iYSBMYXJnZSAxLjYgaXMgYSBoaWdoLXBlcmZvcm1hbmNlIGh5YnJpZCBmb3VuZGF0aW9uIG1vZGVsIGNvbWJpbmluZyBTdGF0ZSBTcGFjZSBNb2RlbHMgKE1hbWJhKSB3aXRoIFRyYW5zZm9ybWVyIGF0dGVudGlvbiBtZWNoYW5pc21zLiBEZXZlbG9wZWQgYnkgQUkyMSwgaXQgZXhjZWxzIGluIGV4dHJlbWVseSBsb25nLWNvbnRleHQgaGFuZGxpbmcgKDI1NksgdG9rZW5zKSwgZGVtb25zdHJhdGVzIHN1cGVyaW9yIGluZmVyZW5jZSBlZmZpY2llbmN5ICh1cCB0byAyLjV4IGZhc3RlciB0aGFuIGNvbXBhcmFibGUgbW9kZWxzKSwgYW5kIHN1cHBvcnRzIHN0cnVjdHVyZWQgSlNPTiBvdXRwdXQgYW5kIHRvb2wtdXNlIGNhcGFiaWxpdGllcy4gSXQgaGFzIDk0IGJpbGxpb24gYWN0aXZlIHBhcmFtZXRlcnMgKDM5OCBiaWxsaW9uIHRvdGFsKSwgb3B0aW1pemVkIHF1YW50aXphdGlvbiBzdXBwb3J0IChFeHBlcnRzSW50OCksIGFuZCBtdWx0aWxpbmd1YWwgcHJvZmljaWVuY3kgaW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgRW5nbGlzaCwgU3BhbmlzaCwgRnJlbmNoLCBQb3J0dWd1ZXNlLCBJdGFsaWFuLCBEdXRjaCwgR2VybWFuLCBBcmFiaWMsIGFuZCBIZWJyZXcuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byB0aGUgW0phbWJhIE9wZW4gTW9kZWwgTGljZW5zZV0oaHR0cHM6Ly93d3cuYWkyMS5jb20vbGljZW5zZXMvamFtYmEtb3Blbi1tb2RlbC1saWNlbnNlKS4iLCJjb250ZXh0X2xlbmd0aCI6MjU2MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjU2MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhaTIxL2phbWJhLTEuNi1taW5pIiwibmFtZSI6IkFJMjE6IEphbWJhIE1pbmkgMS42IiwiY3JlYXRlZCI6MTc0MTkwNTE3MSwiZGVzY3JpcHRpb24iOiJBSTIxIEphbWJhIE1pbmkgMS42IGlzIGEgaHlicmlkIGZvdW5kYXRpb24gbW9kZWwgY29tYmluaW5nIFN0YXRlIFNwYWNlIE1vZGVscyAoTWFtYmEpIHdpdGggVHJhbnNmb3JtZXIgYXR0ZW50aW9uIG1lY2hhbmlzbXMuIFdpdGggMTIgYmlsbGlvbiBhY3RpdmUgcGFyYW1ldGVycyAoNTIgYmlsbGlvbiB0b3RhbCksIHRoaXMgbW9kZWwgZXhjZWxzIGluIGV4dHJlbWVseSBsb25nLWNvbnRleHQgdGFza3MgKHVwIHRvIDI1NksgdG9rZW5zKSBhbmQgYWNoaWV2ZXMgc3VwZXJpb3IgaW5mZXJlbmNlIGVmZmljaWVuY3ksIG91dHBlcmZvcm1pbmcgY29tcGFyYWJsZSBvcGVuIG1vZGVscyBvbiB0YXNrcyBzdWNoIGFzIHJldHJpZXZhbC1hdWdtZW50ZWQgZ2VuZXJhdGlvbiAoUkFHKSBhbmQgZ3JvdW5kZWQgcXVlc3Rpb24gYW5zd2VyaW5nLiBKYW1iYSBNaW5pIDEuNiBzdXBwb3J0cyBtdWx0aWxpbmd1YWwgdGFza3MgYWNyb3NzIEVuZ2xpc2gsIFNwYW5pc2gsIEZyZW5jaCwgUG9ydHVndWVzZSwgSXRhbGlhbiwgRHV0Y2gsIEdlcm1hbiwgQXJhYmljLCBhbmQgSGVicmV3LCBhbG9uZyB3aXRoIHN0cnVjdHVyZWQgSlNPTiBvdXRwdXQgYW5kIHRvb2wtdXNlIGNhcGFiaWxpdGllcy5cblxuVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIHRoZSBbSmFtYmEgT3BlbiBNb2RlbCBMaWNlbnNlXShodHRwczovL3d3dy5haTIxLmNvbS9saWNlbnNlcy9qYW1iYS1vcGVuLW1vZGVsLWxpY2Vuc2UpLiIsImNvbnRleHRfbGVuZ3RoIjoyNTYwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjI1NjAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZ29vZ2xlL2dlbW1hLTMtMTJiLWl0OmZyZWUiLCJuYW1lIjoiR29vZ2xlOiBHZW1tYSAzIDEyQiAoZnJlZSkiLCJjcmVhdGVkIjoxNzQxOTAyNjI1LCJkZXNjcmlwdGlvbiI6IkdlbW1hIDMgaW50cm9kdWNlcyBtdWx0aW1vZGFsaXR5LCBzdXBwb3J0aW5nIHZpc2lvbi1sYW5ndWFnZSBpbnB1dCBhbmQgdGV4dCBvdXRwdXRzLiBJdCBoYW5kbGVzIGNvbnRleHQgd2luZG93cyB1cCB0byAxMjhrIHRva2VucywgdW5kZXJzdGFuZHMgb3ZlciAxNDAgbGFuZ3VhZ2VzLCBhbmQgb2ZmZXJzIGltcHJvdmVkIG1hdGgsIHJlYXNvbmluZywgYW5kIGNoYXQgY2FwYWJpbGl0aWVzLCBpbmNsdWRpbmcgc3RydWN0dXJlZCBvdXRwdXRzIGFuZCBmdW5jdGlvbiBjYWxsaW5nLiBHZW1tYSAzIDEyQiBpcyB0aGUgc2Vjb25kIGxhcmdlc3QgaW4gdGhlIGZhbWlseSBvZiBHZW1tYSAzIG1vZGVscyBhZnRlciBbR2VtbWEgMyAyN0JdKGdvb2dsZS9nZW1tYS0zLTI3Yi1pdCkiLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjoiZ2VtbWEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZ29vZ2xlL2dlbW1hLTMtMTJiLWl0IiwibmFtZSI6Ikdvb2dsZTogR2VtbWEgMyAxMkIiLCJjcmVhdGVkIjoxNzQxOTAyNjI1LCJkZXNjcmlwdGlvbiI6IkdlbW1hIDMgaW50cm9kdWNlcyBtdWx0aW1vZGFsaXR5LCBzdXBwb3J0aW5nIHZpc2lvbi1sYW5ndWFnZSBpbnB1dCBhbmQgdGV4dCBvdXRwdXRzLiBJdCBoYW5kbGVzIGNvbnRleHQgd2luZG93cyB1cCB0byAxMjhrIHRva2VucywgdW5kZXJzdGFuZHMgb3ZlciAxNDAgbGFuZ3VhZ2VzLCBhbmQgb2ZmZXJzIGltcHJvdmVkIG1hdGgsIHJlYXNvbmluZywgYW5kIGNoYXQgY2FwYWJpbGl0aWVzLCBpbmNsdWRpbmcgc3RydWN0dXJlZCBvdXRwdXRzIGFuZCBmdW5jdGlvbiBjYWxsaW5nLiBHZW1tYSAzIDEyQiBpcyB0aGUgc2Vjb25kIGxhcmdlc3QgaW4gdGhlIGZhbWlseSBvZiBHZW1tYSAzIG1vZGVscyBhZnRlciBbR2VtbWEgMyAyN0JdKGdvb2dsZS9nZW1tYS0zLTI3Yi1pdCkiLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjoiZ2VtbWEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDA1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJjb2hlcmUvY29tbWFuZC1hIiwibmFtZSI6IkNvaGVyZTogQ29tbWFuZCBBIiwiY3JlYXRlZCI6MTc0MTg5NDM0MiwiZGVzY3JpcHRpb24iOiJDb21tYW5kIEEgaXMgYW4gb3Blbi13ZWlnaHRzIDExMUIgcGFyYW1ldGVyIG1vZGVsIHdpdGggYSAyNTZrIGNvbnRleHQgd2luZG93IGZvY3VzZWQgb24gZGVsaXZlcmluZyBncmVhdCBwZXJmb3JtYW5jZSBhY3Jvc3MgYWdlbnRpYywgbXVsdGlsaW5ndWFsLCBhbmQgY29kaW5nIHVzZSBjYXNlcy5cbkNvbXBhcmVkIHRvIG90aGVyIGxlYWRpbmcgcHJvcHJpZXRhcnkgYW5kIG9wZW4td2VpZ2h0cyBtb2RlbHMgQ29tbWFuZCBBIGRlbGl2ZXJzIG1heGltdW0gcGVyZm9ybWFuY2Ugd2l0aCBtaW5pbXVtIGhhcmR3YXJlIGNvc3RzLCBleGNlbGxpbmcgb24gYnVzaW5lc3MtY3JpdGljYWwgYWdlbnRpYyBhbmQgbXVsdGlsaW5ndWFsIHRhc2tzLiIsImNvbnRleHRfbGVuZ3RoIjoyNTYwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAyNSIsImNvbXBsZXRpb24iOiIwLjAwMDAxIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyNTYwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9ncHQtNG8tbWluaS1zZWFyY2gtcHJldmlldyIsIm5hbWUiOiJPcGVuQUk6IEdQVC00by1taW5pIFNlYXJjaCBQcmV2aWV3IiwiY3JlYXRlZCI6MTc0MTgxODEyMiwiZGVzY3JpcHRpb24iOiJHUFQtNG8gbWluaSBTZWFyY2ggUHJldmlldyBpcyBhIHNwZWNpYWxpemVkIG1vZGVsIGZvciB3ZWIgc2VhcmNoIGluIENoYXQgQ29tcGxldGlvbnMuIEl0IGlzIHRyYWluZWQgdG8gdW5kZXJzdGFuZCBhbmQgZXhlY3V0ZSB3ZWIgc2VhcmNoIHF1ZXJpZXMuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAxNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDYiLCJyZXF1ZXN0IjoiMC4wMjc1IiwiaW1hZ2UiOiIwLjAwMDIxNyIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxNjM4NCwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC00by1zZWFyY2gtcHJldmlldyIsIm5hbWUiOiJPcGVuQUk6IEdQVC00byBTZWFyY2ggUHJldmlldyIsImNyZWF0ZWQiOjE3NDE4MTc5NDksImRlc2NyaXB0aW9uIjoiR1BULTRvIFNlYXJjaCBQcmV2aWV3aXMgYSBzcGVjaWFsaXplZCBtb2RlbCBmb3Igd2ViIHNlYXJjaCBpbiBDaGF0IENvbXBsZXRpb25zLiBJdCBpcyB0cmFpbmVkIHRvIHVuZGVyc3RhbmQgYW5kIGV4ZWN1dGUgd2ViIHNlYXJjaCBxdWVyaWVzLiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAyNSIsImNvbXBsZXRpb24iOiIwLjAwMDAxIiwicmVxdWVzdCI6IjAuMDM1IiwiaW1hZ2UiOiIwLjAwMzYxMyIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxNjM4NCwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicmVrYWFpL3Jla2EtZmxhc2gtMzpmcmVlIiwibmFtZSI6IlJla2E6IEZsYXNoIDMgKGZyZWUpIiwiY3JlYXRlZCI6MTc0MTgxMjgxMywiZGVzY3JpcHRpb24iOiJSZWthIEZsYXNoIDMgaXMgYSBnZW5lcmFsLXB1cnBvc2UsIGluc3RydWN0aW9uLXR1bmVkIGxhcmdlIGxhbmd1YWdlIG1vZGVsIHdpdGggMjEgYmlsbGlvbiBwYXJhbWV0ZXJzLCBkZXZlbG9wZWQgYnkgUmVrYS4gSXQgZXhjZWxzIGF0IGdlbmVyYWwgY2hhdCwgY29kaW5nIHRhc2tzLCBpbnN0cnVjdGlvbi1mb2xsb3dpbmcsIGFuZCBmdW5jdGlvbiBjYWxsaW5nLiBGZWF0dXJpbmcgYSAzMksgY29udGV4dCBsZW5ndGggYW5kIG9wdGltaXplZCB0aHJvdWdoIHJlaW5mb3JjZW1lbnQgbGVhcm5pbmcgKFJMT08pLCBpdCBwcm92aWRlcyBjb21wZXRpdGl2ZSBwZXJmb3JtYW5jZSBjb21wYXJhYmxlIHRvIHByb3ByaWV0YXJ5IG1vZGVscyB3aXRoaW4gYSBzbWFsbGVyIHBhcmFtZXRlciBmb290cHJpbnQuIElkZWFsIGZvciBsb3ctbGF0ZW5jeSwgbG9jYWwsIG9yIG9uLWRldmljZSBkZXBsb3ltZW50cywgUmVrYSBGbGFzaCAzIGlzIGNvbXBhY3QsIHN1cHBvcnRzIGVmZmljaWVudCBxdWFudGl6YXRpb24gKGRvd24gdG8gMTFHQiBhdCA0LWJpdCBwcmVjaXNpb24pLCBhbmQgZW1wbG95cyBleHBsaWNpdCByZWFzb25pbmcgdGFncyAoXCI8cmVhc29uaW5nPlwiKSB0byBpbmRpY2F0ZSBpdHMgaW50ZXJuYWwgdGhvdWdodCBwcm9jZXNzLlxuXG5SZWthIEZsYXNoIDMgaXMgcHJpbWFyaWx5IGFuIEVuZ2xpc2ggbW9kZWwgd2l0aCBsaW1pdGVkIG11bHRpbGluZ3VhbCB1bmRlcnN0YW5kaW5nIGNhcGFiaWxpdGllcy4gVGhlIG1vZGVsIHdlaWdodHMgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvZ2VtbWEtMy0yN2ItaXQ6ZnJlZSIsIm5hbWUiOiJHb29nbGU6IEdlbW1hIDMgMjdCIChmcmVlKSIsImNyZWF0ZWQiOjE3NDE3NTYzNTksImRlc2NyaXB0aW9uIjoiR2VtbWEgMyBpbnRyb2R1Y2VzIG11bHRpbW9kYWxpdHksIHN1cHBvcnRpbmcgdmlzaW9uLWxhbmd1YWdlIGlucHV0IGFuZCB0ZXh0IG91dHB1dHMuIEl0IGhhbmRsZXMgY29udGV4dCB3aW5kb3dzIHVwIHRvIDEyOGsgdG9rZW5zLCB1bmRlcnN0YW5kcyBvdmVyIDE0MCBsYW5ndWFnZXMsIGFuZCBvZmZlcnMgaW1wcm92ZWQgbWF0aCwgcmVhc29uaW5nLCBhbmQgY2hhdCBjYXBhYmlsaXRpZXMsIGluY2x1ZGluZyBzdHJ1Y3R1cmVkIG91dHB1dHMgYW5kIGZ1bmN0aW9uIGNhbGxpbmcuIEdlbW1hIDMgMjdCIGlzIEdvb2dsZSdzIGxhdGVzdCBvcGVuIHNvdXJjZSBtb2RlbCwgc3VjY2Vzc29yIHRvIFtHZW1tYSAyXShnb29nbGUvZ2VtbWEtMi0yN2ItaXQpIiwiY29udGV4dF9sZW5ndGgiOjk2MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjoiZ2VtbWEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjk2MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvZ2VtbWEtMy0yN2ItaXQiLCJuYW1lIjoiR29vZ2xlOiBHZW1tYSAzIDI3QiIsImNyZWF0ZWQiOjE3NDE3NTYzNTksImRlc2NyaXB0aW9uIjoiR2VtbWEgMyBpbnRyb2R1Y2VzIG11bHRpbW9kYWxpdHksIHN1cHBvcnRpbmcgdmlzaW9uLWxhbmd1YWdlIGlucHV0IGFuZCB0ZXh0IG91dHB1dHMuIEl0IGhhbmRsZXMgY29udGV4dCB3aW5kb3dzIHVwIHRvIDEyOGsgdG9rZW5zLCB1bmRlcnN0YW5kcyBvdmVyIDE0MCBsYW5ndWFnZXMsIGFuZCBvZmZlcnMgaW1wcm92ZWQgbWF0aCwgcmVhc29uaW5nLCBhbmQgY2hhdCBjYXBhYmlsaXRpZXMsIGluY2x1ZGluZyBzdHJ1Y3R1cmVkIG91dHB1dHMgYW5kIGZ1bmN0aW9uIGNhbGxpbmcuIEdlbW1hIDMgMjdCIGlzIEdvb2dsZSdzIGxhdGVzdCBvcGVuIHNvdXJjZSBtb2RlbCwgc3VjY2Vzc29yIHRvIFtHZW1tYSAyXShnb29nbGUvZ2VtbWEtMi0yN2ItaXQpIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR2VtaW5pIiwiaW5zdHJ1Y3RfdHlwZSI6ImdlbW1hIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDAyNTYiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InRoZWRydW1tZXIvYW51YmlzLXByby0xMDViLXYxIiwibmFtZSI6IlRoZURydW1tZXI6IEFudWJpcyBQcm8gMTA1QiBWMSIsImNyZWF0ZWQiOjE3NDE2NDIyOTAsImRlc2NyaXB0aW9uIjoiQW51YmlzIFBybyAxMDVCIHYxIGlzIGFuIGV4cGFuZGVkIGFuZCByZWZpbmVkIHZhcmlhbnQgb2YgTWV0YeKAmXMgTGxhbWEgMy4zIDcwQiwgZmVhdHVyaW5nIDUwJSBhZGRpdGlvbmFsIGxheWVycyBhbmQgZnVydGhlciBmaW5lLXR1bmluZyB0byBsZXZlcmFnZSBpdHMgaW5jcmVhc2VkIGNhcGFjaXR5LiBEZXNpZ25lZCBmb3IgYWR2YW5jZWQgbmFycmF0aXZlLCByb2xlcGxheSwgYW5kIGluc3RydWN0aW9uYWwgdGFza3MsIGl0IGRlbW9uc3RyYXRlcyBlbmhhbmNlZCBlbW90aW9uYWwgaW50ZWxsaWdlbmNlLCBjcmVhdGl2aXR5LCBudWFuY2VkIGNoYXJhY3RlciBwb3J0cmF5YWwsIGFuZCBzdXBlcmlvciBwcm9tcHQgYWRoZXJlbmNlIGNvbXBhcmVkIHRvIHNtYWxsZXIgbW9kZWxzLiBJdHMgbGFyZ2VyIHBhcmFtZXRlciBjb3VudCBhbGxvd3MgZm9yIGRlZXBlciBjb250ZXh0dWFsIHVuZGVyc3RhbmRpbmcgYW5kIGV4dGVuZGVkIHJlYXNvbmluZyBjYXBhYmlsaXRpZXMsIG9wdGltaXplZCBmb3IgZW5nYWdpbmcsIGludGVsbGlnZW50LCBhbmQgY29oZXJlbnQgaW50ZXJhY3Rpb25zLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEzMTA3MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImxhdGl0dWRlZ2FtZXMvd2F5ZmFyZXItbGFyZ2UtNzBiLWxsYW1hLTMuMyIsIm5hbWUiOiJMYXRpdHVkZUdhbWVzOiBXYXlmYXJlciBMYXJnZSA3MEIgTGxhbWEgMy4zIiwiY3JlYXRlZCI6MTc0MTYzNjg4NSwiZGVzY3JpcHRpb24iOiJXYXlmYXJlciBMYXJnZSA3MEIgaXMgYSByb2xlcGxheSBhbmQgdGV4dC1hZHZlbnR1cmUgbW9kZWwgZmluZS10dW5lZCBmcm9tIE1ldGHigJlzIExsYW1hLTMuMy03MEItSW5zdHJ1Y3QuIFNwZWNpZmljYWxseSBvcHRpbWl6ZWQgZm9yIG5hcnJhdGl2ZS1kcml2ZW4sIGNoYWxsZW5naW5nIHNjZW5hcmlvcywgaXQgaW50cm9kdWNlcyByZWFsaXN0aWMgc3Rha2VzLCBjb25mbGljdHMsIGFuZCBjb25zZXF1ZW5jZXMgb2Z0ZW4gYXZvaWRlZCBieSBzdGFuZGFyZCBSTEhGLWFsaWduZWQgbW9kZWxzLiBUcmFpbmVkIHVzaW5nIGEgY3VyYXRlZCBibGVuZCBvZiBhZHZlbnR1cmUsIHJvbGVwbGF5LCBhbmQgaW5zdHJ1Y3RpdmUgZmljdGlvbiBkYXRhc2V0cywgV2F5ZmFyZXIgZW1waGFzaXplcyB0ZW5zZSBzdG9yeXRlbGxpbmcsIGF1dGhlbnRpYyBwbGF5ZXIgZmFpbHVyZSBzY2VuYXJpb3MsIGFuZCByb2J1c3QgbmFycmF0aXZlIGltbWVyc2lvbiwgbWFraW5nIGl0IHVuaXF1ZWx5IHN1aXRlZCBmb3IgaW50ZXJhY3RpdmUgZmljdGlvbiBhbmQgZ2FtaW5nIGV4cGVyaWVuY2VzLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDgiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA5IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MTMxMDcyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoidGhlZHJ1bW1lci9za3lmYWxsLTM2Yi12MiIsIm5hbWUiOiJUaGVEcnVtbWVyOiBTa3lmYWxsIDM2QiBWMiIsImNyZWF0ZWQiOjE3NDE2MzY1NjYsImRlc2NyaXB0aW9uIjoiU2t5ZmFsbCAzNkIgdjIgaXMgYW4gZW5oYW5jZWQgaXRlcmF0aW9uIG9mIE1pc3RyYWwgU21hbGwgMjUwMSwgc3BlY2lmaWNhbGx5IGZpbmUtdHVuZWQgZm9yIGltcHJvdmVkIGNyZWF0aXZpdHksIG51YW5jZWQgd3JpdGluZywgcm9sZS1wbGF5aW5nLCBhbmQgY29oZXJlbnQgc3Rvcnl0ZWxsaW5nLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MzI3NjgsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaWNyb3NvZnQvcGhpLTQtbXVsdGltb2RhbC1pbnN0cnVjdCIsIm5hbWUiOiJNaWNyb3NvZnQ6IFBoaSA0IE11bHRpbW9kYWwgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzQxMzk2Mjg0LCJkZXNjcmlwdGlvbiI6IlBoaS00IE11bHRpbW9kYWwgSW5zdHJ1Y3QgaXMgYSB2ZXJzYXRpbGUgNS42QiBwYXJhbWV0ZXIgZm91bmRhdGlvbiBtb2RlbCB0aGF0IGNvbWJpbmVzIGFkdmFuY2VkIHJlYXNvbmluZyBhbmQgaW5zdHJ1Y3Rpb24tZm9sbG93aW5nIGNhcGFiaWxpdGllcyBhY3Jvc3MgYm90aCB0ZXh0IGFuZCB2aXN1YWwgaW5wdXRzLCBwcm92aWRpbmcgYWNjdXJhdGUgdGV4dCBvdXRwdXRzLiBUaGUgdW5pZmllZCBhcmNoaXRlY3R1cmUgZW5hYmxlcyBlZmZpY2llbnQsIGxvdy1sYXRlbmN5IGluZmVyZW5jZSwgc3VpdGFibGUgZm9yIGVkZ2UgYW5kIG1vYmlsZSBkZXBsb3ltZW50cy4gUGhpLTQgTXVsdGltb2RhbCBJbnN0cnVjdCBzdXBwb3J0cyB0ZXh0IGlucHV0cyBpbiBtdWx0aXBsZSBsYW5ndWFnZXMgaW5jbHVkaW5nIEFyYWJpYywgQ2hpbmVzZSwgRW5nbGlzaCwgRnJlbmNoLCBHZXJtYW4sIEphcGFuZXNlLCBTcGFuaXNoLCBhbmQgbW9yZSwgd2l0aCB2aXN1YWwgaW5wdXQgb3B0aW1pemVkIHByaW1hcmlseSBmb3IgRW5nbGlzaC4gSXQgZGVsaXZlcnMgaW1wcmVzc2l2ZSBwZXJmb3JtYW5jZSBvbiBtdWx0aW1vZGFsIHRhc2tzIGludm9sdmluZyBtYXRoZW1hdGljYWwsIHNjaWVudGlmaWMsIGFuZCBkb2N1bWVudCByZWFzb25pbmcsIHByb3ZpZGluZyBkZXZlbG9wZXJzIGFuZCBlbnRlcnByaXNlcyBhIHBvd2VyZnVsIHlldCBjb21wYWN0IG1vZGVsIGZvciBzb3BoaXN0aWNhdGVkIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW1BoaS00IE11bHRpbW9kYWwgYmxvZyBwb3N0XShodHRwczovL2F6dXJlLm1pY3Jvc29mdC5jb20vZW4tdXMvYmxvZy9lbXBvd2VyaW5nLWlubm92YXRpb24tdGhlLW5leHQtZ2VuZXJhdGlvbi1vZi10aGUtcGhpLWZhbWlseS8pLlxuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDA1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDE3Njg1Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJwZXJwbGV4aXR5L3NvbmFyLXJlYXNvbmluZy1wcm8iLCJuYW1lIjoiUGVycGxleGl0eTogU29uYXIgUmVhc29uaW5nIFBybyIsImNyZWF0ZWQiOjE3NDEzMTMzMDgsImRlc2NyaXB0aW9uIjoiTm90ZTogU29uYXIgUHJvIHByaWNpbmcgaW5jbHVkZXMgUGVycGxleGl0eSBzZWFyY2ggcHJpY2luZy4gU2VlIFtkZXRhaWxzIGhlcmVdKGh0dHBzOi8vZG9jcy5wZXJwbGV4aXR5LmFpL2d1aWRlcy9wcmljaW5nI2RldGFpbGVkLXByaWNpbmctYnJlYWtkb3duLWZvci1zb25hci1yZWFzb25pbmctcHJvLWFuZC1zb25hci1wcm8pXG5cblNvbmFyIFJlYXNvbmluZyBQcm8gaXMgYSBwcmVtaWVyIHJlYXNvbmluZyBtb2RlbCBwb3dlcmVkIGJ5IERlZXBTZWVrIFIxIHdpdGggQ2hhaW4gb2YgVGhvdWdodCAoQ29UKS4gRGVzaWduZWQgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcywgaXQgc3VwcG9ydHMgaW4tZGVwdGgsIG11bHRpLXN0ZXAgcXVlcmllcyB3aXRoIGEgbGFyZ2VyIGNvbnRleHQgd2luZG93IGFuZCBjYW4gc3VyZmFjZSBtb3JlIGNpdGF0aW9ucyBwZXIgc2VhcmNoLCBlbmFibGluZyBtb3JlIGNvbXByZWhlbnNpdmUgYW5kIGV4dGVuc2libGUgcmVzcG9uc2VzLiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDA4IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMC4wMDUiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJwZXJwbGV4aXR5L3NvbmFyLXBybyIsIm5hbWUiOiJQZXJwbGV4aXR5OiBTb25hciBQcm8iLCJjcmVhdGVkIjoxNzQxMzEyNDIzLCJkZXNjcmlwdGlvbiI6Ik5vdGU6IFNvbmFyIFBybyBwcmljaW5nIGluY2x1ZGVzIFBlcnBsZXhpdHkgc2VhcmNoIHByaWNpbmcuIFNlZSBbZGV0YWlscyBoZXJlXShodHRwczovL2RvY3MucGVycGxleGl0eS5haS9ndWlkZXMvcHJpY2luZyNkZXRhaWxlZC1wcmljaW5nLWJyZWFrZG93bi1mb3Itc29uYXItcmVhc29uaW5nLXByby1hbmQtc29uYXItcHJvKVxuXG5Gb3IgZW50ZXJwcmlzZXMgc2Vla2luZyBtb3JlIGFkdmFuY2VkIGNhcGFiaWxpdGllcywgdGhlIFNvbmFyIFBybyBBUEkgY2FuIGhhbmRsZSBpbi1kZXB0aCwgbXVsdGktc3RlcCBxdWVyaWVzIHdpdGggYWRkZWQgZXh0ZW5zaWJpbGl0eSwgbGlrZSBkb3VibGUgdGhlIG51bWJlciBvZiBjaXRhdGlvbnMgcGVyIHNlYXJjaCBhcyBTb25hciBvbiBhdmVyYWdlLiBQbHVzLCB3aXRoIGEgbGFyZ2VyIGNvbnRleHQgd2luZG93LCBpdCBjYW4gaGFuZGxlIGxvbmdlciBhbmQgbW9yZSBudWFuY2VkIHNlYXJjaGVzIGFuZCBmb2xsb3ctdXAgcXVlc3Rpb25zLiAiLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAuMDA1IiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MDAwLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicGVycGxleGl0eS9zb25hci1kZWVwLXJlc2VhcmNoIiwibmFtZSI6IlBlcnBsZXhpdHk6IFNvbmFyIERlZXAgUmVzZWFyY2giLCJjcmVhdGVkIjoxNzQxMzExMjQ2LCJkZXNjcmlwdGlvbiI6IlNvbmFyIERlZXAgUmVzZWFyY2ggaXMgYSByZXNlYXJjaC1mb2N1c2VkIG1vZGVsIGRlc2lnbmVkIGZvciBtdWx0aS1zdGVwIHJldHJpZXZhbCwgc3ludGhlc2lzLCBhbmQgcmVhc29uaW5nIGFjcm9zcyBjb21wbGV4IHRvcGljcy4gSXQgYXV0b25vbW91c2x5IHNlYXJjaGVzLCByZWFkcywgYW5kIGV2YWx1YXRlcyBzb3VyY2VzLCByZWZpbmluZyBpdHMgYXBwcm9hY2ggYXMgaXQgZ2F0aGVycyBpbmZvcm1hdGlvbi4gVGhpcyBlbmFibGVzIGNvbXByZWhlbnNpdmUgcmVwb3J0IGdlbmVyYXRpb24gYWNyb3NzIGRvbWFpbnMgbGlrZSBmaW5hbmNlLCB0ZWNobm9sb2d5LCBoZWFsdGgsIGFuZCBjdXJyZW50IGV2ZW50cy5cblxuTm90ZXMgb24gUHJpY2luZyAoW1NvdXJjZV0oaHR0cHM6Ly9kb2NzLnBlcnBsZXhpdHkuYWkvZ3VpZGVzL3ByaWNpbmcjZGV0YWlsZWQtcHJpY2luZy1icmVha2Rvd24tZm9yLXNvbmFyLWRlZXAtcmVzZWFyY2gpKSBcbi0gSW5wdXQgdG9rZW5zIGNvbXByaXNlIG9mIFByb21wdCB0b2tlbnMgKHVzZXIgcHJvbXB0KSArIENpdGF0aW9uIHRva2VucyAodGhlc2UgYXJlIHByb2Nlc3NlZCB0b2tlbnMgZnJvbSBydW5uaW5nIHNlYXJjaGVzKVxuLSBEZWVwIFJlc2VhcmNoIHJ1bnMgbXVsdGlwbGUgc2VhcmNoZXMgdG8gY29uZHVjdCBleGhhdXN0aXZlIHJlc2VhcmNoLiBTZWFyY2hlcyBhcmUgcHJpY2VkIGF0ICQ1LzEwMDAgc2VhcmNoZXMuIEEgcmVxdWVzdCB0aGF0IGRvZXMgMzAgc2VhcmNoZXMgd2lsbCBjb3N0ICQwLjE1IGluIHRoaXMgc3RlcC5cbi0gUmVhc29uaW5nIGlzIGEgZGlzdGluY3Qgc3RlcCBpbiBEZWVwIFJlc2VhcmNoIHNpbmNlIGl0IGRvZXMgZXh0ZW5zaXZlIGF1dG9tYXRlZCByZWFzb25pbmcgdGhyb3VnaCBhbGwgdGhlIG1hdGVyaWFsIGl0IGdhdGhlcnMgZHVyaW5nIGl0cyByZXNlYXJjaCBwaGFzZS4gUmVhc29uaW5nIHRva2VucyBoZXJlIGFyZSBhIGJpdCBkaWZmZXJlbnQgdGhhbiB0aGUgQ29UcyBpbiB0aGUgYW5zd2VyIC0gdGhlc2UgYXJlIHRva2VucyB0aGF0IHdlIHVzZSB0byByZWFzb24gdGhyb3VnaCB0aGUgcmVzZWFyY2ggbWF0ZXJpYWwgcHJpb3IgdG8gZ2VuZXJhdGluZyB0aGUgb3V0cHV0cyB2aWEgdGhlIENvVHMuIFJlYXNvbmluZyB0b2tlbnMgYXJlIHByaWNlZCBhdCAkMy8xTSB0b2tlbnMiLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjoiZGVlcHNlZWstcjEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAuMDA1IiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMC4wMDAwMDMifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImRlZXBzZWVrL2RlZXBzZWVrLXIxLXplcm86ZnJlZSIsIm5hbWUiOiJEZWVwU2VlazogRGVlcFNlZWsgUjEgWmVybyAoZnJlZSkiLCJjcmVhdGVkIjoxNzQxMjk3NDM0LCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrLVIxLVplcm8gaXMgYSBtb2RlbCB0cmFpbmVkIHZpYSBsYXJnZS1zY2FsZSByZWluZm9yY2VtZW50IGxlYXJuaW5nIChSTCkgd2l0aG91dCBzdXBlcnZpc2VkIGZpbmUtdHVuaW5nIChTRlQpIGFzIGEgcHJlbGltaW5hcnkgc3RlcC4gSXQncyA2NzFCIHBhcmFtZXRlcnMgaW4gc2l6ZSwgd2l0aCAzN0IgYWN0aXZlIGluIGFuIGluZmVyZW5jZSBwYXNzLlxuXG5JdCBkZW1vbnN0cmF0ZXMgcmVtYXJrYWJsZSBwZXJmb3JtYW5jZSBvbiByZWFzb25pbmcuIFdpdGggUkwsIERlZXBTZWVrLVIxLVplcm8gbmF0dXJhbGx5IGVtZXJnZWQgd2l0aCBudW1lcm91cyBwb3dlcmZ1bCBhbmQgaW50ZXJlc3RpbmcgcmVhc29uaW5nIGJlaGF2aW9ycy5cblxuRGVlcFNlZWstUjEtWmVybyBlbmNvdW50ZXJzIGNoYWxsZW5nZXMgc3VjaCBhcyBlbmRsZXNzIHJlcGV0aXRpb24sIHBvb3IgcmVhZGFiaWxpdHksIGFuZCBsYW5ndWFnZSBtaXhpbmcuIFNlZSBbRGVlcFNlZWsgUjFdKC9kZWVwc2Vlay9kZWVwc2Vlay1yMSkgZm9yIHRoZSBTRlQgbW9kZWwuXG5cbiIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODQwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3cS0zMmI6ZnJlZSIsIm5hbWUiOiJRd2VuOiBRd1EgMzJCIChmcmVlKSIsImNyZWF0ZWQiOjE3NDEyMDg4MTQsImRlc2NyaXB0aW9uIjoiUXdRIGlzIHRoZSByZWFzb25pbmcgbW9kZWwgb2YgdGhlIFF3ZW4gc2VyaWVzLiBDb21wYXJlZCB3aXRoIGNvbnZlbnRpb25hbCBpbnN0cnVjdGlvbi10dW5lZCBtb2RlbHMsIFF3USwgd2hpY2ggaXMgY2FwYWJsZSBvZiB0aGlua2luZyBhbmQgcmVhc29uaW5nLCBjYW4gYWNoaWV2ZSBzaWduaWZpY2FudGx5IGVuaGFuY2VkIHBlcmZvcm1hbmNlIGluIGRvd25zdHJlYW0gdGFza3MsIGVzcGVjaWFsbHkgaGFyZCBwcm9ibGVtcy4gUXdRLTMyQiBpcyB0aGUgbWVkaXVtLXNpemVkIHJlYXNvbmluZyBtb2RlbCwgd2hpY2ggaXMgY2FwYWJsZSBvZiBhY2hpZXZpbmcgY29tcGV0aXRpdmUgcGVyZm9ybWFuY2UgYWdhaW5zdCBzdGF0ZS1vZi10aGUtYXJ0IHJlYXNvbmluZyBtb2RlbHMsIGUuZy4sIERlZXBTZWVrLVIxLCBvMS1taW5pLiIsImNvbnRleHRfbGVuZ3RoIjo0MDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjoicXdxIn0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo0MDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDAwMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdxLTMyYiIsIm5hbWUiOiJRd2VuOiBRd1EgMzJCIiwiY3JlYXRlZCI6MTc0MTIwODgxNCwiZGVzY3JpcHRpb24iOiJRd1EgaXMgdGhlIHJlYXNvbmluZyBtb2RlbCBvZiB0aGUgUXdlbiBzZXJpZXMuIENvbXBhcmVkIHdpdGggY29udmVudGlvbmFsIGluc3RydWN0aW9uLXR1bmVkIG1vZGVscywgUXdRLCB3aGljaCBpcyBjYXBhYmxlIG9mIHRoaW5raW5nIGFuZCByZWFzb25pbmcsIGNhbiBhY2hpZXZlIHNpZ25pZmljYW50bHkgZW5oYW5jZWQgcGVyZm9ybWFuY2UgaW4gZG93bnN0cmVhbSB0YXNrcywgZXNwZWNpYWxseSBoYXJkIHByb2JsZW1zLiBRd1EtMzJCIGlzIHRoZSBtZWRpdW0tc2l6ZWQgcmVhc29uaW5nIG1vZGVsLCB3aGljaCBpcyBjYXBhYmxlIG9mIGFjaGlldmluZyBjb21wZXRpdGl2ZSBwZXJmb3JtYW5jZSBhZ2FpbnN0IHN0YXRlLW9mLXRoZS1hcnQgcmVhc29uaW5nIG1vZGVscywgZS5nLiwgRGVlcFNlZWstUjEsIG8xLW1pbmkuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjoicXdxIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAxNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibW9vbnNob3RhaS9tb29ubGlnaHQtMTZiLWEzYi1pbnN0cnVjdDpmcmVlIiwibmFtZSI6Ik1vb25zaG90IEFJOiBNb29ubGlnaHQgMTZCIEEzQiBJbnN0cnVjdCAoZnJlZSkiLCJjcmVhdGVkIjoxNzQwNzE5ODAxLCJkZXNjcmlwdGlvbiI6Ik1vb25saWdodC0xNkItQTNCLUluc3RydWN0IGlzIGEgMTZCLXBhcmFtZXRlciBNaXh0dXJlLW9mLUV4cGVydHMgKE1vRSkgbGFuZ3VhZ2UgbW9kZWwgZGV2ZWxvcGVkIGJ5IE1vb25zaG90IEFJLiBJdCBpcyBvcHRpbWl6ZWQgZm9yIGluc3RydWN0aW9uLWZvbGxvd2luZyB0YXNrcyB3aXRoIDNCIGFjdGl2YXRlZCBwYXJhbWV0ZXJzIHBlciBpbmZlcmVuY2UuIFRoZSBtb2RlbCBhZHZhbmNlcyB0aGUgUGFyZXRvIGZyb250aWVyIGluIHBlcmZvcm1hbmNlIHBlciBGTE9QIGFjcm9zcyBFbmdsaXNoLCBjb2RpbmcsIG1hdGgsIGFuZCBDaGluZXNlIGJlbmNobWFya3MuIEl0IG91dHBlcmZvcm1zIGNvbXBhcmFibGUgbW9kZWxzIGxpa2UgTGxhbWEzLTNCIGFuZCBEZWVwc2Vlay12Mi1MaXRlIHdoaWxlIG1haW50YWluaW5nIGVmZmljaWVudCBkZXBsb3ltZW50IGNhcGFiaWxpdGllcyB0aHJvdWdoIEh1Z2dpbmcgRmFjZSBpbnRlZ3JhdGlvbiBhbmQgY29tcGF0aWJpbGl0eSB3aXRoIHBvcHVsYXIgaW5mZXJlbmNlIGVuZ2luZXMgbGlrZSB2TExNMTIuIiwiY29udGV4dF9sZW5ndGgiOjgxOTIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODE5MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibm91c3Jlc2VhcmNoL2RlZXBoZXJtZXMtMy1sbGFtYS0zLThiLXByZXZpZXc6ZnJlZSIsIm5hbWUiOiJOb3VzOiBEZWVwSGVybWVzIDMgTGxhbWEgMyA4QiBQcmV2aWV3IChmcmVlKSIsImNyZWF0ZWQiOjE3NDA3MTkzNzIsImRlc2NyaXB0aW9uIjoiRGVlcEhlcm1lcyAzIFByZXZpZXcgaXMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIG91ciBmbGFnc2hpcCBIZXJtZXMgc2VyaWVzIG9mIExMTXMgYnkgTm91cyBSZXNlYXJjaCwgYW5kIG9uZSBvZiB0aGUgZmlyc3QgbW9kZWxzIGluIHRoZSB3b3JsZCB0byB1bmlmeSBSZWFzb25pbmcgKGxvbmcgY2hhaW5zIG9mIHRob3VnaHQgdGhhdCBpbXByb3ZlIGFuc3dlciBhY2N1cmFjeSkgYW5kIG5vcm1hbCBMTE0gcmVzcG9uc2UgbW9kZXMgaW50byBvbmUgbW9kZWwuIFdlIGhhdmUgYWxzbyBpbXByb3ZlZCBMTE0gYW5ub3RhdGlvbiwganVkZ2VtZW50LCBhbmQgZnVuY3Rpb24gY2FsbGluZy5cblxuRGVlcEhlcm1lcyAzIFByZXZpZXcgaXMgb25lIG9mIHRoZSBmaXJzdCBMTE0gbW9kZWxzIHRvIHVuaWZ5IGJvdGggXCJpbnR1aXRpdmVcIiwgdHJhZGl0aW9uYWwgbW9kZSByZXNwb25zZXMgYW5kIGxvbmcgY2hhaW4gb2YgdGhvdWdodCByZWFzb25pbmcgcmVzcG9uc2VzIGludG8gYSBzaW5nbGUgbW9kZWwsIHRvZ2dsZWQgYnkgYSBzeXN0ZW0gcHJvbXB0LiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvZ3B0LTQuNS1wcmV2aWV3IiwibmFtZSI6Ik9wZW5BSTogR1BULTQuNSAoUHJldmlldykiLCJjcmVhdGVkIjoxNzQwNjg3ODEwLCJkZXNjcmlwdGlvbiI6IkdQVC00LjUgKFByZXZpZXcpIGlzIGEgcmVzZWFyY2ggcHJldmlldyBvZiBPcGVuQUnigJlzIGxhdGVzdCBsYW5ndWFnZSBtb2RlbCwgZGVzaWduZWQgdG8gYWR2YW5jZSBjYXBhYmlsaXRpZXMgaW4gcmVhc29uaW5nLCBjcmVhdGl2aXR5LCBhbmQgbXVsdGktdHVybiBjb252ZXJzYXRpb24uIEl0IGJ1aWxkcyBvbiBwcmV2aW91cyBpdGVyYXRpb25zIHdpdGggaW1wcm92ZW1lbnRzIGluIHdvcmxkIGtub3dsZWRnZSwgY29udGV4dHVhbCBjb2hlcmVuY2UsIGFuZCB0aGUgYWJpbGl0eSB0byBmb2xsb3cgdXNlciBpbnRlbnQgbW9yZSBlZmZlY3RpdmVseS5cblxuVGhlIG1vZGVsIGRlbW9uc3RyYXRlcyBlbmhhbmNlZCBwZXJmb3JtYW5jZSBpbiB0YXNrcyB0aGF0IHJlcXVpcmUgb3Blbi1lbmRlZCB0aGlua2luZywgcHJvYmxlbS1zb2x2aW5nLCBhbmQgY29tbXVuaWNhdGlvbi4gRWFybHkgdGVzdGluZyBzdWdnZXN0cyBpdCBpcyBiZXR0ZXIgYXQgZ2VuZXJhdGluZyBudWFuY2VkIHJlc3BvbnNlcywgbWFpbnRhaW5pbmcgbG9uZy1jb250ZXh0IGNvaGVyZW5jZSwgYW5kIHJlZHVjaW5nIGhhbGx1Y2luYXRpb25zIGNvbXBhcmVkIHRvIGVhcmxpZXIgdmVyc2lvbnMuXG5cblRoaXMgcmVzZWFyY2ggcHJldmlldyBpcyBpbnRlbmRlZCB0byBoZWxwIGV2YWx1YXRlIEdQVC00LjXigJlzIHN0cmVuZ3RocyBhbmQgbGltaXRhdGlvbnMgaW4gcmVhbC13b3JsZCB1c2UgY2FzZXMgYXMgT3BlbkFJIGNvbnRpbnVlcyB0byByZWZpbmUgYW5kIGRldmVsb3AgZnV0dXJlIG1vZGVscy4gUmVhZCBtb3JlIGF0IHRoZSBbYmxvZyBwb3N0IGhlcmUuXShodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTQtNS8pIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwNzUiLCJjb21wbGV0aW9uIjoiMC4wMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjEwODM3NSIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAzNzUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MTYzODQsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Imdvb2dsZS9nZW1pbmktMi4wLWZsYXNoLWxpdGUtMDAxIiwibmFtZSI6Ikdvb2dsZTogR2VtaW5pIDIuMCBGbGFzaCBMaXRlIiwiY3JlYXRlZCI6MTc0MDUwNjIxMiwiZGVzY3JpcHRpb24iOiJHZW1pbmkgMi4wIEZsYXNoIExpdGUgb2ZmZXJzIGEgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGltZSB0byBmaXJzdCB0b2tlbiAoVFRGVCkgY29tcGFyZWQgdG8gW0dlbWluaSBGbGFzaCAxLjVdKC9nb29nbGUvZ2VtaW5pLWZsYXNoLTEuNSksIHdoaWxlIG1haW50YWluaW5nIHF1YWxpdHkgb24gcGFyIHdpdGggbGFyZ2VyIG1vZGVscyBsaWtlIFtHZW1pbmkgUHJvIDEuNV0oL2dvb2dsZS9nZW1pbmktcHJvLTEuNSksIGFsbCBhdCBleHRyZW1lbHkgZWNvbm9taWNhbCB0b2tlbiBwcmljZXMuIiwiY29udGV4dF9sZW5ndGgiOjEwNDg1NzYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdlbWluaSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDc1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMyIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTA0ODU3NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYW50aHJvcGljL2NsYXVkZS0zLjctc29ubmV0IiwibmFtZSI6IkFudGhyb3BpYzogQ2xhdWRlIDMuNyBTb25uZXQiLCJjcmVhdGVkIjoxNzQwNDIyMTEwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzLjcgU29ubmV0IGlzIGFuIGFkdmFuY2VkIGxhcmdlIGxhbmd1YWdlIG1vZGVsIHdpdGggaW1wcm92ZWQgcmVhc29uaW5nLCBjb2RpbmcsIGFuZCBwcm9ibGVtLXNvbHZpbmcgY2FwYWJpbGl0aWVzLiBJdCBpbnRyb2R1Y2VzIGEgaHlicmlkIHJlYXNvbmluZyBhcHByb2FjaCwgYWxsb3dpbmcgdXNlcnMgdG8gY2hvb3NlIGJldHdlZW4gcmFwaWQgcmVzcG9uc2VzIGFuZCBleHRlbmRlZCwgc3RlcC1ieS1zdGVwIHByb2Nlc3NpbmcgZm9yIGNvbXBsZXggdGFza3MuIFRoZSBtb2RlbCBkZW1vbnN0cmF0ZXMgbm90YWJsZSBpbXByb3ZlbWVudHMgaW4gY29kaW5nLCBwYXJ0aWN1bGFybHkgaW4gZnJvbnQtZW5kIGRldmVsb3BtZW50IGFuZCBmdWxsLXN0YWNrIHVwZGF0ZXMsIGFuZCBleGNlbHMgaW4gYWdlbnRpYyB3b3JrZmxvd3MsIHdoZXJlIGl0IGNhbiBhdXRvbm9tb3VzbHkgbmF2aWdhdGUgbXVsdGktc3RlcCBwcm9jZXNzZXMuIFxuXG5DbGF1ZGUgMy43IFNvbm5ldCBtYWludGFpbnMgcGVyZm9ybWFuY2UgcGFyaXR5IHdpdGggaXRzIHByZWRlY2Vzc29yIGluIHN0YW5kYXJkIG1vZGUgd2hpbGUgb2ZmZXJpbmcgYW4gZXh0ZW5kZWQgcmVhc29uaW5nIG1vZGUgZm9yIGVuaGFuY2VkIGFjY3VyYWN5IGluIG1hdGgsIGNvZGluZywgYW5kIGluc3RydWN0aW9uLWZvbGxvd2luZyB0YXNrcy5cblxuUmVhZCBtb3JlIGF0IHRoZSBbYmxvZyBwb3N0IGhlcmVdKGh0dHBzOi8vd3d3LmFudGhyb3BpYy5jb20vbmV3cy9jbGF1ZGUtMy03LXNvbm5ldCkiLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwNDgiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAzIiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAwMzc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjY0MDAwLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYW50aHJvcGljL2NsYXVkZS0zLjctc29ubmV0OnRoaW5raW5nIiwibmFtZSI6IkFudGhyb3BpYzogQ2xhdWRlIDMuNyBTb25uZXQgKHRoaW5raW5nKSIsImNyZWF0ZWQiOjE3NDA0MjIxMTAsImRlc2NyaXB0aW9uIjoiQ2xhdWRlIDMuNyBTb25uZXQgaXMgYW4gYWR2YW5jZWQgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgd2l0aCBpbXByb3ZlZCByZWFzb25pbmcsIGNvZGluZywgYW5kIHByb2JsZW0tc29sdmluZyBjYXBhYmlsaXRpZXMuIEl0IGludHJvZHVjZXMgYSBoeWJyaWQgcmVhc29uaW5nIGFwcHJvYWNoLCBhbGxvd2luZyB1c2VycyB0byBjaG9vc2UgYmV0d2VlbiByYXBpZCByZXNwb25zZXMgYW5kIGV4dGVuZGVkLCBzdGVwLWJ5LXN0ZXAgcHJvY2Vzc2luZyBmb3IgY29tcGxleCB0YXNrcy4gVGhlIG1vZGVsIGRlbW9uc3RyYXRlcyBub3RhYmxlIGltcHJvdmVtZW50cyBpbiBjb2RpbmcsIHBhcnRpY3VsYXJseSBpbiBmcm9udC1lbmQgZGV2ZWxvcG1lbnQgYW5kIGZ1bGwtc3RhY2sgdXBkYXRlcywgYW5kIGV4Y2VscyBpbiBhZ2VudGljIHdvcmtmbG93cywgd2hlcmUgaXQgY2FuIGF1dG9ub21vdXNseSBuYXZpZ2F0ZSBtdWx0aS1zdGVwIHByb2Nlc3Nlcy4gXG5cbkNsYXVkZSAzLjcgU29ubmV0IG1haW50YWlucyBwZXJmb3JtYW5jZSBwYXJpdHkgd2l0aCBpdHMgcHJlZGVjZXNzb3IgaW4gc3RhbmRhcmQgbW9kZSB3aGlsZSBvZmZlcmluZyBhbiBleHRlbmRlZCByZWFzb25pbmcgbW9kZSBmb3IgZW5oYW5jZWQgYWNjdXJhY3kgaW4gbWF0aCwgY29kaW5nLCBhbmQgaW5zdHJ1Y3Rpb24tZm9sbG93aW5nIHRhc2tzLlxuXG5SZWFkIG1vcmUgYXQgdGhlIFtibG9nIHBvc3QgaGVyZV0oaHR0cHM6Ly93d3cuYW50aHJvcGljLmNvbS9uZXdzL2NsYXVkZS0zLTctc29ubmV0KSIsImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNsYXVkZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAzIiwiY29tcGxldGlvbiI6IjAuMDAwMDE1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDA0OCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwMDMiLCJpbnB1dF9jYWNoZV93cml0ZSI6IjAuMDAwMDAzNzUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NjQwMDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTMuNy1zb25uZXQ6YmV0YSIsIm5hbWUiOiJBbnRocm9waWM6IENsYXVkZSAzLjcgU29ubmV0IChzZWxmLW1vZGVyYXRlZCkiLCJjcmVhdGVkIjoxNzQwNDIyMTEwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzLjcgU29ubmV0IGlzIGFuIGFkdmFuY2VkIGxhcmdlIGxhbmd1YWdlIG1vZGVsIHdpdGggaW1wcm92ZWQgcmVhc29uaW5nLCBjb2RpbmcsIGFuZCBwcm9ibGVtLXNvbHZpbmcgY2FwYWJpbGl0aWVzLiBJdCBpbnRyb2R1Y2VzIGEgaHlicmlkIHJlYXNvbmluZyBhcHByb2FjaCwgYWxsb3dpbmcgdXNlcnMgdG8gY2hvb3NlIGJldHdlZW4gcmFwaWQgcmVzcG9uc2VzIGFuZCBleHRlbmRlZCwgc3RlcC1ieS1zdGVwIHByb2Nlc3NpbmcgZm9yIGNvbXBsZXggdGFza3MuIFRoZSBtb2RlbCBkZW1vbnN0cmF0ZXMgbm90YWJsZSBpbXByb3ZlbWVudHMgaW4gY29kaW5nLCBwYXJ0aWN1bGFybHkgaW4gZnJvbnQtZW5kIGRldmVsb3BtZW50IGFuZCBmdWxsLXN0YWNrIHVwZGF0ZXMsIGFuZCBleGNlbHMgaW4gYWdlbnRpYyB3b3JrZmxvd3MsIHdoZXJlIGl0IGNhbiBhdXRvbm9tb3VzbHkgbmF2aWdhdGUgbXVsdGktc3RlcCBwcm9jZXNzZXMuIFxuXG5DbGF1ZGUgMy43IFNvbm5ldCBtYWludGFpbnMgcGVyZm9ybWFuY2UgcGFyaXR5IHdpdGggaXRzIHByZWRlY2Vzc29yIGluIHN0YW5kYXJkIG1vZGUgd2hpbGUgb2ZmZXJpbmcgYW4gZXh0ZW5kZWQgcmVhc29uaW5nIG1vZGUgZm9yIGVuaGFuY2VkIGFjY3VyYWN5IGluIG1hdGgsIGNvZGluZywgYW5kIGluc3RydWN0aW9uLWZvbGxvd2luZyB0YXNrcy5cblxuUmVhZCBtb3JlIGF0IHRoZSBbYmxvZyBwb3N0IGhlcmVdKGh0dHBzOi8vd3d3LmFudGhyb3BpYy5jb20vbmV3cy9jbGF1ZGUtMy03LXNvbm5ldCkiLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwNDgiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAzIiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAwMzc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEyODAwMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InBlcnBsZXhpdHkvcjEtMTc3NiIsIm5hbWUiOiJQZXJwbGV4aXR5OiBSMSAxNzc2IiwiY3JlYXRlZCI6MTc0MDAwNDkyOSwiZGVzY3JpcHRpb24iOiJSMSAxNzc2IGlzIGEgdmVyc2lvbiBvZiBEZWVwU2Vlay1SMSB0aGF0IGhhcyBiZWVuIHBvc3QtdHJhaW5lZCB0byByZW1vdmUgY2Vuc29yc2hpcCBjb25zdHJhaW50cyByZWxhdGVkIHRvIHRvcGljcyByZXN0cmljdGVkIGJ5IHRoZSBDaGluZXNlIGdvdmVybm1lbnQuIFRoZSBtb2RlbCByZXRhaW5zIGl0cyBvcmlnaW5hbCByZWFzb25pbmcgY2FwYWJpbGl0aWVzIHdoaWxlIHByb3ZpZGluZyBkaXJlY3QgcmVzcG9uc2VzIHRvIGEgd2lkZXIgcmFuZ2Ugb2YgcXVlcmllcy4gUjEgMTc3NiBpcyBhbiBvZmZsaW5lIGNoYXQgbW9kZWwgdGhhdCBkb2VzIG5vdCB1c2UgdGhlIHBlcnBsZXhpdHkgc2VhcmNoIHN1YnN5c3RlbS5cblxuVGhlIG1vZGVsIHdhcyB0ZXN0ZWQgb24gYSBtdWx0aWxpbmd1YWwgZGF0YXNldCBvZiBvdmVyIDEsMDAwIGV4YW1wbGVzIGNvdmVyaW5nIHNlbnNpdGl2ZSB0b3BpY3MgdG8gbWVhc3VyZSBpdHMgbGlrZWxpaG9vZCBvZiByZWZ1c2FsIG9yIG92ZXJseSBmaWx0ZXJlZCByZXNwb25zZXMuIFtFdmFsdWF0aW9uIFJlc3VsdHNdKGh0dHBzOi8vY2RuLXVwbG9hZHMuaHVnZ2luZ2ZhY2UuY28vcHJvZHVjdGlvbi91cGxvYWRzLzY3NWM4MzMyZDAxZjU5M2RjOTA4MTdmNS9HaU4yVnFDNWhhd1VnQUdKNm9IbGEucG5nKSBJdHMgcGVyZm9ybWFuY2Ugb24gbWF0aCBhbmQgcmVhc29uaW5nIGJlbmNobWFya3MgcmVtYWlucyBzaW1pbGFyIHRvIHRoZSBiYXNlIFIxIG1vZGVsLiBbUmVhc29uaW5nIFBlcmZvcm1hbmNlXShodHRwczovL2Nkbi11cGxvYWRzLmh1Z2dpbmdmYWNlLmNvL3Byb2R1Y3Rpb24vdXBsb2Fkcy82NzVjODMzMmQwMWY1OTNkYzkwODE3ZjUvbjRaOUJ5cXAyUzdzS1V2Q3ZJNDBSLnBuZylcblxuUmVhZCBtb3JlIG9uIHRoZSBbQmxvZyBQb3N0XShodHRwczovL3BlcnBsZXhpdHkuYWkvaHViL2Jsb2cvb3Blbi1zb3VyY2luZy1yMS0xNzc2KSIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJEZWVwU2VlayIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDA4IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pc3RyYWxhaS9taXN0cmFsLXNhYmEiLCJuYW1lIjoiTWlzdHJhbDogU2FiYSIsImNyZWF0ZWQiOjE3Mzk4MDMyMzksImRlc2NyaXB0aW9uIjoiTWlzdHJhbCBTYWJhIGlzIGEgMjRCLXBhcmFtZXRlciBsYW5ndWFnZSBtb2RlbCBzcGVjaWZpY2FsbHkgZGVzaWduZWQgZm9yIHRoZSBNaWRkbGUgRWFzdCBhbmQgU291dGggQXNpYSwgZGVsaXZlcmluZyBhY2N1cmF0ZSBhbmQgY29udGV4dHVhbGx5IHJlbGV2YW50IHJlc3BvbnNlcyB3aGlsZSBtYWludGFpbmluZyBlZmZpY2llbnQgcGVyZm9ybWFuY2UuIFRyYWluZWQgb24gY3VyYXRlZCByZWdpb25hbCBkYXRhc2V0cywgaXQgc3VwcG9ydHMgbXVsdGlwbGUgSW5kaWFuLW9yaWdpbiBsYW5ndWFnZXPigJRpbmNsdWRpbmcgVGFtaWwgYW5kIE1hbGF5YWxhbeKAlGFsb25nc2lkZSBBcmFiaWMuIFRoaXMgbWFrZXMgaXQgYSB2ZXJzYXRpbGUgb3B0aW9uIGZvciBhIHJhbmdlIG9mIHJlZ2lvbmFsIGFuZCBtdWx0aWxpbmd1YWwgYXBwbGljYXRpb25zLiBSZWFkIG1vcmUgYXQgdGhlIGJsb2cgcG9zdCBbaGVyZV0oaHR0cHM6Ly9taXN0cmFsLmFpL2VuL25ld3MvbWlzdHJhbC1zYWJhKSIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA2IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiY29nbml0aXZlY29tcHV0YXRpb25zL2RvbHBoaW4zLjAtcjEtbWlzdHJhbC0yNGI6ZnJlZSIsIm5hbWUiOiJEb2xwaGluMy4wIFIxIE1pc3RyYWwgMjRCIChmcmVlKSIsImNyZWF0ZWQiOjE3Mzk0NjI0OTgsImRlc2NyaXB0aW9uIjoiRG9scGhpbiAzLjAgUjEgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgRG9scGhpbiBzZXJpZXMgb2YgaW5zdHJ1Y3QtdHVuZWQgbW9kZWxzLiAgRGVzaWduZWQgdG8gYmUgdGhlIHVsdGltYXRlIGdlbmVyYWwgcHVycG9zZSBsb2NhbCBtb2RlbCwgZW5hYmxpbmcgY29kaW5nLCBtYXRoLCBhZ2VudGljLCBmdW5jdGlvbiBjYWxsaW5nLCBhbmQgZ2VuZXJhbCB1c2UgY2FzZXMuXG5cblRoZSBSMSB2ZXJzaW9uIGhhcyBiZWVuIHRyYWluZWQgZm9yIDMgZXBvY2hzIHRvIHJlYXNvbiB1c2luZyA4MDBrIHJlYXNvbmluZyB0cmFjZXMgZnJvbSB0aGUgRG9scGhpbi1SMSBkYXRhc2V0LlxuXG5Eb2xwaGluIGFpbXMgdG8gYmUgYSBnZW5lcmFsIHB1cnBvc2UgcmVhc29uaW5nIGluc3RydWN0IG1vZGVsLCBzaW1pbGFyIHRvIHRoZSBtb2RlbHMgYmVoaW5kIENoYXRHUFQsIENsYXVkZSwgR2VtaW5pLlxuXG5QYXJ0IG9mIHRoZSBbRG9scGhpbiAzLjAgQ29sbGVjdGlvbl0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9jb2xsZWN0aW9ucy9jb2duaXRpdmVjb21wdXRhdGlvbnMvZG9scGhpbi0zMC02NzdhYjQ3ZjczZDdmZjY2NzQzOTc5YTMpIEN1cmF0ZWQgYW5kIHRyYWluZWQgYnkgW0VyaWMgSGFydGZvcmRdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vZWhhcnRmb3JkKSwgW0JlbiBHaXR0ZXJdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vYmlnc3Rvcm0pLCBbQmxvdXNlSnVyeV0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9CbG91c2VKdXJ5KSBhbmQgW0NvZ25pdGl2ZSBDb21wdXRhdGlvbnNdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vY29nbml0aXZlY29tcHV0YXRpb25zKSIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6ImRlZXBzZWVrLXIxIn0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiY29nbml0aXZlY29tcHV0YXRpb25zL2RvbHBoaW4zLjAtbWlzdHJhbC0yNGI6ZnJlZSIsIm5hbWUiOiJEb2xwaGluMy4wIE1pc3RyYWwgMjRCIChmcmVlKSIsImNyZWF0ZWQiOjE3Mzk0NjIwMTksImRlc2NyaXB0aW9uIjoiRG9scGhpbiAzLjAgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgRG9scGhpbiBzZXJpZXMgb2YgaW5zdHJ1Y3QtdHVuZWQgbW9kZWxzLiAgRGVzaWduZWQgdG8gYmUgdGhlIHVsdGltYXRlIGdlbmVyYWwgcHVycG9zZSBsb2NhbCBtb2RlbCwgZW5hYmxpbmcgY29kaW5nLCBtYXRoLCBhZ2VudGljLCBmdW5jdGlvbiBjYWxsaW5nLCBhbmQgZ2VuZXJhbCB1c2UgY2FzZXMuXG5cbkRvbHBoaW4gYWltcyB0byBiZSBhIGdlbmVyYWwgcHVycG9zZSBpbnN0cnVjdCBtb2RlbCwgc2ltaWxhciB0byB0aGUgbW9kZWxzIGJlaGluZCBDaGF0R1BULCBDbGF1ZGUsIEdlbWluaS4gXG5cblBhcnQgb2YgdGhlIFtEb2xwaGluIDMuMCBDb2xsZWN0aW9uXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL2NvbGxlY3Rpb25zL2NvZ25pdGl2ZWNvbXB1dGF0aW9ucy9kb2xwaGluLTMwLTY3N2FiNDdmNzNkN2ZmNjY3NDM5NzlhMykgQ3VyYXRlZCBhbmQgdHJhaW5lZCBieSBbRXJpYyBIYXJ0Zm9yZF0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9laGFydGZvcmQpLCBbQmVuIEdpdHRlcl0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9iaWdzdG9ybSksIFtCbG91c2VKdXJ5XShodHRwczovL2h1Z2dpbmdmYWNlLmNvL0Jsb3VzZUp1cnkpIGFuZCBbQ29nbml0aXZlIENvbXB1dGF0aW9uc10oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9jb2duaXRpdmVjb21wdXRhdGlvbnMpIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtZXRhLWxsYW1hL2xsYW1hLWd1YXJkLTMtOGIiLCJuYW1lIjoiTGxhbWEgR3VhcmQgMyA4QiIsImNyZWF0ZWQiOjE3Mzk0MDEzMTgsImRlc2NyaXB0aW9uIjoiTGxhbWEgR3VhcmQgMyBpcyBhIExsYW1hLTMuMS04QiBwcmV0cmFpbmVkIG1vZGVsLCBmaW5lLXR1bmVkIGZvciBjb250ZW50IHNhZmV0eSBjbGFzc2lmaWNhdGlvbi4gU2ltaWxhciB0byBwcmV2aW91cyB2ZXJzaW9ucywgaXQgY2FuIGJlIHVzZWQgdG8gY2xhc3NpZnkgY29udGVudCBpbiBib3RoIExMTSBpbnB1dHMgKHByb21wdCBjbGFzc2lmaWNhdGlvbikgYW5kIGluIExMTSByZXNwb25zZXMgKHJlc3BvbnNlIGNsYXNzaWZpY2F0aW9uKS4gSXQgYWN0cyBhcyBhbiBMTE0g4oCTIGl0IGdlbmVyYXRlcyB0ZXh0IGluIGl0cyBvdXRwdXQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBhIGdpdmVuIHByb21wdCBvciByZXNwb25zZSBpcyBzYWZlIG9yIHVuc2FmZSwgYW5kIGlmIHVuc2FmZSwgaXQgYWxzbyBsaXN0cyB0aGUgY29udGVudCBjYXRlZ29yaWVzIHZpb2xhdGVkLlxuXG5MbGFtYSBHdWFyZCAzIHdhcyBhbGlnbmVkIHRvIHNhZmVndWFyZCBhZ2FpbnN0IHRoZSBNTENvbW1vbnMgc3RhbmRhcmRpemVkIGhhemFyZHMgdGF4b25vbXkgYW5kIGRlc2lnbmVkIHRvIHN1cHBvcnQgTGxhbWEgMy4xIGNhcGFiaWxpdGllcy4gU3BlY2lmaWNhbGx5LCBpdCBwcm92aWRlcyBjb250ZW50IG1vZGVyYXRpb24gaW4gOCBsYW5ndWFnZXMsIGFuZCB3YXMgb3B0aW1pemVkIHRvIHN1cHBvcnQgc2FmZXR5IGFuZCBzZWN1cml0eSBmb3Igc2VhcmNoIGFuZCBjb2RlIGludGVycHJldGVyIHRvb2wgY2FsbHMuXG4iLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6Im5vbmUifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAxIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9vMy1taW5pLWhpZ2giLCJuYW1lIjoiT3BlbkFJOiBvMyBNaW5pIEhpZ2giLCJjcmVhdGVkIjoxNzM5MzcyNjExLCJkZXNjcmlwdGlvbiI6Ik9wZW5BSSBvMy1taW5pLWhpZ2ggaXMgdGhlIHNhbWUgbW9kZWwgYXMgW28zLW1pbmldKC9vcGVuYWkvbzMtbWluaSkgd2l0aCByZWFzb25pbmdfZWZmb3J0IHNldCB0byBoaWdoLiBcblxubzMtbWluaSBpcyBhIGNvc3QtZWZmaWNpZW50IGxhbmd1YWdlIG1vZGVsIG9wdGltaXplZCBmb3IgU1RFTSByZWFzb25pbmcgdGFza3MsIHBhcnRpY3VsYXJseSBleGNlbGxpbmcgaW4gc2NpZW5jZSwgbWF0aGVtYXRpY3MsIGFuZCBjb2RpbmcuIFRoZSBtb2RlbCBmZWF0dXJlcyB0aHJlZSBhZGp1c3RhYmxlIHJlYXNvbmluZyBlZmZvcnQgbGV2ZWxzIGFuZCBzdXBwb3J0cyBrZXkgZGV2ZWxvcGVyIGNhcGFiaWxpdGllcyBpbmNsdWRpbmcgZnVuY3Rpb24gY2FsbGluZywgc3RydWN0dXJlZCBvdXRwdXRzLCBhbmQgc3RyZWFtaW5nLCB0aG91Z2ggaXQgZG9lcyBub3QgaW5jbHVkZSB2aXNpb24gcHJvY2Vzc2luZyBjYXBhYmlsaXRpZXMuXG5cblRoZSBtb2RlbCBkZW1vbnN0cmF0ZXMgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnRzIG92ZXIgaXRzIHByZWRlY2Vzc29yLCB3aXRoIGV4cGVydCB0ZXN0ZXJzIHByZWZlcnJpbmcgaXRzIHJlc3BvbnNlcyA1NiUgb2YgdGhlIHRpbWUgYW5kIG5vdGluZyBhIDM5JSByZWR1Y3Rpb24gaW4gbWFqb3IgZXJyb3JzIG9uIGNvbXBsZXggcXVlc3Rpb25zLiBXaXRoIG1lZGl1bSByZWFzb25pbmcgZWZmb3J0IHNldHRpbmdzLCBvMy1taW5pIG1hdGNoZXMgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBsYXJnZXIgbzEgbW9kZWwgb24gY2hhbGxlbmdpbmcgcmVhc29uaW5nIGV2YWx1YXRpb25zIGxpa2UgQUlNRSBhbmQgR1BRQSwgd2hpbGUgbWFpbnRhaW5pbmcgbG93ZXIgbGF0ZW5jeSBhbmQgY29zdC4iLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMTEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDQ0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDA1NSJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMDAwMDAsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImRlZXBzZWVrL2RlZXBzZWVrLXIxLWRpc3RpbGwtbGxhbWEtOGIiLCJuYW1lIjoiRGVlcFNlZWs6IFIxIERpc3RpbGwgTGxhbWEgOEIiLCJjcmVhdGVkIjoxNzM4OTM3NzE4LCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrIFIxIERpc3RpbGwgTGxhbWEgOEIgaXMgYSBkaXN0aWxsZWQgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgYmFzZWQgb24gW0xsYW1hLTMuMS04Qi1JbnN0cnVjdF0oL21ldGEtbGxhbWEvbGxhbWEtMy4xLThiLWluc3RydWN0KSwgdXNpbmcgb3V0cHV0cyBmcm9tIFtEZWVwU2VlayBSMV0oL2RlZXBzZWVrL2RlZXBzZWVrLXIxKS4gVGhlIG1vZGVsIGNvbWJpbmVzIGFkdmFuY2VkIGRpc3RpbGxhdGlvbiB0ZWNobmlxdWVzIHRvIGFjaGlldmUgaGlnaCBwZXJmb3JtYW5jZSBhY3Jvc3MgbXVsdGlwbGUgYmVuY2htYXJrcywgaW5jbHVkaW5nOlxuXG4tIEFJTUUgMjAyNCBwYXNzQDE6IDUwLjRcbi0gTUFUSC01MDAgcGFzc0AxOiA4OS4xXG4tIENvZGVGb3JjZXMgUmF0aW5nOiAxMjA1XG5cblRoZSBtb2RlbCBsZXZlcmFnZXMgZmluZS10dW5pbmcgZnJvbSBEZWVwU2VlayBSMSdzIG91dHB1dHMsIGVuYWJsaW5nIGNvbXBldGl0aXZlIHBlcmZvcm1hbmNlIGNvbXBhcmFibGUgdG8gbGFyZ2VyIGZyb250aWVyIG1vZGVscy5cblxuSHVnZ2luZyBGYWNlOiBcbi0gW0xsYW1hLTMuMS04Ql0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9tZXRhLWxsYW1hL0xsYW1hLTMuMS04QikgXG4tIFtEZWVwU2Vlay1SMS1EaXN0aWxsLUxsYW1hLThCXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL2RlZXBzZWVrLWFpL0RlZXBTZWVrLVIxLURpc3RpbGwtTGxhbWEtOEIpICAgfCIsImNvbnRleHRfbGVuZ3RoIjozMjAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDQiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAwNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzIwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MzIwMDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvZ2VtaW5pLTIuMC1mbGFzaC0wMDEiLCJuYW1lIjoiR29vZ2xlOiBHZW1pbmkgMi4wIEZsYXNoIiwiY3JlYXRlZCI6MTczODc2OTQxMywiZGVzY3JpcHRpb24iOiJHZW1pbmkgRmxhc2ggMi4wIG9mZmVycyBhIHNpZ25pZmljYW50bHkgZmFzdGVyIHRpbWUgdG8gZmlyc3QgdG9rZW4gKFRURlQpIGNvbXBhcmVkIHRvIFtHZW1pbmkgRmxhc2ggMS41XSgvZ29vZ2xlL2dlbWluaS1mbGFzaC0xLjUpLCB3aGlsZSBtYWludGFpbmluZyBxdWFsaXR5IG9uIHBhciB3aXRoIGxhcmdlciBtb2RlbHMgbGlrZSBbR2VtaW5pIFBybyAxLjVdKC9nb29nbGUvZ2VtaW5pLXByby0xLjUpLiBJdCBpbnRyb2R1Y2VzIG5vdGFibGUgZW5oYW5jZW1lbnRzIGluIG11bHRpbW9kYWwgdW5kZXJzdGFuZGluZywgY29kaW5nIGNhcGFiaWxpdGllcywgY29tcGxleCBpbnN0cnVjdGlvbiBmb2xsb3dpbmcsIGFuZCBmdW5jdGlvbiBjYWxsaW5nLiBUaGVzZSBhZHZhbmNlbWVudHMgY29tZSB0b2dldGhlciB0byBkZWxpdmVyIG1vcmUgc2VhbWxlc3MgYW5kIHJvYnVzdCBhZ2VudGljIGV4cGVyaWVuY2VzLiIsImNvbnRleHRfbGVuZ3RoIjoxMDAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDAwMDI1OCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEwMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdlbi12bC1wbHVzIiwibmFtZSI6IlF3ZW46IFF3ZW4gVkwgUGx1cyIsImNyZWF0ZWQiOjE3Mzg3MzEyNTUsImRlc2NyaXB0aW9uIjoiUXdlbidzIEVuaGFuY2VkIExhcmdlIFZpc3VhbCBMYW5ndWFnZSBNb2RlbC4gU2lnbmlmaWNhbnRseSB1cGdyYWRlZCBmb3IgZGV0YWlsZWQgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIGFuZCB0ZXh0IHJlY29nbml0aW9uIGFiaWxpdGllcywgc3VwcG9ydGluZyB1bHRyYS1oaWdoIHBpeGVsIHJlc29sdXRpb25zIHVwIHRvIG1pbGxpb25zIG9mIHBpeGVscyBhbmQgZXh0cmVtZSBhc3BlY3QgcmF0aW9zIGZvciBpbWFnZSBpbnB1dC4gSXQgZGVsaXZlcnMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgYWNyb3NzIGEgYnJvYWQgcmFuZ2Ugb2YgdmlzdWFsIHRhc2tzLlxuIiwiY29udGV4dF9sZW5ndGgiOjc1MDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDIxIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwNjMiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDAyNjg4Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NzUwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxNTAwLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYWlvbi1sYWJzL2Fpb24tMS4wIiwibmFtZSI6IkFpb25MYWJzOiBBaW9uLTEuMCIsImNyZWF0ZWQiOjE3Mzg2OTc1NTcsImRlc2NyaXB0aW9uIjoiQWlvbi0xLjAgaXMgYSBtdWx0aS1tb2RlbCBzeXN0ZW0gZGVzaWduZWQgZm9yIGhpZ2ggcGVyZm9ybWFuY2UgYWNyb3NzIHZhcmlvdXMgdGFza3MsIGluY2x1ZGluZyByZWFzb25pbmcgYW5kIGNvZGluZy4gSXQgaXMgYnVpbHQgb24gRGVlcFNlZWstUjEsIGF1Z21lbnRlZCB3aXRoIGFkZGl0aW9uYWwgbW9kZWxzIGFuZCB0ZWNobmlxdWVzIHN1Y2ggYXMgVHJlZSBvZiBUaG91Z2h0cyAoVG9UKSBhbmQgTWl4dHVyZSBvZiBFeHBlcnRzIChNb0UpLiBJdCBpcyBBaW9uIExhYidzIG1vc3QgcG93ZXJmdWwgcmVhc29uaW5nIG1vZGVsLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDA0IiwiY29tcGxldGlvbiI6IjAuMDAwMDA4IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MzI3NjgsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhaW9uLWxhYnMvYWlvbi0xLjAtbWluaSIsIm5hbWUiOiJBaW9uTGFiczogQWlvbi0xLjAtTWluaSIsImNyZWF0ZWQiOjE3Mzg2OTcxMDcsImRlc2NyaXB0aW9uIjoiQWlvbi0xLjAtTWluaSAzMkIgcGFyYW1ldGVyIG1vZGVsIGlzIGEgZGlzdGlsbGVkIHZlcnNpb24gb2YgdGhlIERlZXBTZWVrLVIxIG1vZGVsLCBkZXNpZ25lZCBmb3Igc3Ryb25nIHBlcmZvcm1hbmNlIGluIHJlYXNvbmluZyBkb21haW5zIHN1Y2ggYXMgbWF0aGVtYXRpY3MsIGNvZGluZywgYW5kIGxvZ2ljLiBJdCBpcyBhIG1vZGlmaWVkIHZhcmlhbnQgb2YgYSBGdXNlQUkgbW9kZWwgdGhhdCBvdXRwZXJmb3JtcyBSMS1EaXN0aWxsLVF3ZW4tMzJCIGFuZCBSMS1EaXN0aWxsLUxsYW1hLTcwQiwgd2l0aCBiZW5jaG1hcmsgcmVzdWx0cyBhdmFpbGFibGUgb24gaXRzIFtIdWdnaW5nIEZhY2UgcGFnZV0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9GdXNlQUkvRnVzZU8xLURlZXBTZWVrUjEtUXdRLVNreVQxLTMyQi1QcmV2aWV3KSwgaW5kZXBlbmRlbnRseSByZXBsaWNhdGVkIGZvciB2ZXJpZmljYXRpb24uIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA3IiwiY29tcGxldGlvbiI6IjAuMDAwMDAxNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjMyNzY4LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYWlvbi1sYWJzL2Fpb24tcnAtbGxhbWEtMy4xLThiIiwibmFtZSI6IkFpb25MYWJzOiBBaW9uLVJQIDEuMCAoOEIpIiwiY3JlYXRlZCI6MTczODY5NjcxOCwiZGVzY3JpcHRpb24iOiJBaW9uLVJQLUxsYW1hLTMuMS04QiByYW5rcyB0aGUgaGlnaGVzdCBpbiB0aGUgY2hhcmFjdGVyIGV2YWx1YXRpb24gcG9ydGlvbiBvZiB0aGUgUlBCZW5jaC1BdXRvIGJlbmNobWFyaywgYSByb2xlcGxheWluZy1zcGVjaWZpYyB2YXJpYW50IG9mIEFyZW5hLUhhcmQtQXV0bywgd2hlcmUgTExNcyBldmFsdWF0ZSBlYWNoIG90aGVy4oCZcyByZXNwb25zZXMuIEl0IGlzIGEgZmluZS10dW5lZCBiYXNlIG1vZGVsIHJhdGhlciB0aGFuIGFuIGluc3RydWN0IG1vZGVsLCBkZXNpZ25lZCB0byBwcm9kdWNlIG1vcmUgbmF0dXJhbCBhbmQgdmFyaWVkIHdyaXRpbmcuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjozMjc2OCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdlbi12bC1tYXgiLCJuYW1lIjoiUXdlbjogUXdlbiBWTCBNYXgiLCJjcmVhdGVkIjoxNzM4NDM0MzA0LCJkZXNjcmlwdGlvbiI6IlF3ZW4gVkwgTWF4IGlzIGEgdmlzdWFsIHVuZGVyc3RhbmRpbmcgbW9kZWwgd2l0aCA3NTAwIHRva2VucyBjb250ZXh0IGxlbmd0aC4gSXQgZXhjZWxzIGluIGRlbGl2ZXJpbmcgb3B0aW1hbCBwZXJmb3JtYW5jZSBmb3IgYSBicm9hZGVyIHNwZWN0cnVtIG9mIGNvbXBsZXggdGFza3MuXG4iLCJjb250ZXh0X2xlbmd0aCI6NzUwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMzIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDEwMjQiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo3NTAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjE1MDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3ZW4tdHVyYm8iLCJuYW1lIjoiUXdlbjogUXdlbi1UdXJibyIsImNyZWF0ZWQiOjE3Mzg0MTA5NzQsImRlc2NyaXB0aW9uIjoiUXdlbi1UdXJibywgYmFzZWQgb24gUXdlbjIuNSwgaXMgYSAxTSBjb250ZXh0IG1vZGVsIHRoYXQgcHJvdmlkZXMgZmFzdCBzcGVlZCBhbmQgbG93IGNvc3QsIHN1aXRhYmxlIGZvciBzaW1wbGUgdGFza3MuIiwiY29udGV4dF9sZW5ndGgiOjEwMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJRd2VuIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEwMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdlbjIuNS12bC03MmItaW5zdHJ1Y3Q6ZnJlZSIsIm5hbWUiOiJRd2VuOiBRd2VuMi41IFZMIDcyQiBJbnN0cnVjdCAoZnJlZSkiLCJjcmVhdGVkIjoxNzM4NDEwMzExLCJkZXNjcmlwdGlvbiI6IlF3ZW4yLjUtVkwgaXMgcHJvZmljaWVudCBpbiByZWNvZ25pemluZyBjb21tb24gb2JqZWN0cyBzdWNoIGFzIGZsb3dlcnMsIGJpcmRzLCBmaXNoLCBhbmQgaW5zZWN0cy4gSXQgaXMgYWxzbyBoaWdobHkgY2FwYWJsZSBvZiBhbmFseXppbmcgdGV4dHMsIGNoYXJ0cywgaWNvbnMsIGdyYXBoaWNzLCBhbmQgbGF5b3V0cyB3aXRoaW4gaW1hZ2VzLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoyMDQ4LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicXdlbi9xd2VuMi41LXZsLTcyYi1pbnN0cnVjdCIsIm5hbWUiOiJRd2VuOiBRd2VuMi41IFZMIDcyQiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3Mzg0MTAzMTEsImRlc2NyaXB0aW9uIjoiUXdlbjIuNS1WTCBpcyBwcm9maWNpZW50IGluIHJlY29nbml6aW5nIGNvbW1vbiBvYmplY3RzIHN1Y2ggYXMgZmxvd2VycywgYmlyZHMsIGZpc2gsIGFuZCBpbnNlY3RzLiBJdCBpcyBhbHNvIGhpZ2hseSBjYXBhYmxlIG9mIGFuYWx5emluZyB0ZXh0cywgY2hhcnRzLCBpY29ucywgZ3JhcGhpY3MsIGFuZCBsYXlvdXRzIHdpdGhpbiBpbWFnZXMuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwNyIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDciLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMjgwMDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3ZW4tcGx1cyIsIm5hbWUiOiJRd2VuOiBRd2VuLVBsdXMiLCJjcmVhdGVkIjoxNzM4NDA5ODQwLCJkZXNjcmlwdGlvbiI6IlF3ZW4tUGx1cywgYmFzZWQgb24gdGhlIFF3ZW4yLjUgZm91bmRhdGlvbiBtb2RlbCwgaXMgYSAxMzFLIGNvbnRleHQgbW9kZWwgd2l0aCBhIGJhbGFuY2VkIHBlcmZvcm1hbmNlLCBzcGVlZCwgYW5kIGNvc3QgY29tYmluYXRpb24uIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDQiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDEyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdlbi1tYXgiLCJuYW1lIjoiUXdlbjogUXdlbi1NYXggIiwiY3JlYXRlZCI6MTczODQwMjI4OSwiZGVzY3JpcHRpb24iOiJRd2VuLU1heCwgYmFzZWQgb24gUXdlbjIuNSwgcHJvdmlkZXMgdGhlIGJlc3QgaW5mZXJlbmNlIHBlcmZvcm1hbmNlIGFtb25nIFtRd2VuIG1vZGVsc10oL3F3ZW4pLCBlc3BlY2lhbGx5IGZvciBjb21wbGV4IG11bHRpLXN0ZXAgdGFza3MuIEl0J3MgYSBsYXJnZS1zY2FsZSBNb0UgbW9kZWwgdGhhdCBoYXMgYmVlbiBwcmV0cmFpbmVkIG9uIG92ZXIgMjAgdHJpbGxpb24gdG9rZW5zIGFuZCBmdXJ0aGVyIHBvc3QtdHJhaW5lZCB3aXRoIGN1cmF0ZWQgU3VwZXJ2aXNlZCBGaW5lLVR1bmluZyAoU0ZUKSBhbmQgUmVpbmZvcmNlbWVudCBMZWFybmluZyBmcm9tIEh1bWFuIEZlZWRiYWNrIChSTEhGKSBtZXRob2RvbG9naWVzLiBUaGUgcGFyYW1ldGVyIGNvdW50IGlzIHVua25vd24uIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxNiIsImNvbXBsZXRpb24iOiIwLjAwMDAwNjQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvbzMtbWluaSIsIm5hbWUiOiJPcGVuQUk6IG8zIE1pbmkiLCJjcmVhdGVkIjoxNzM4MzUxNzIxLCJkZXNjcmlwdGlvbiI6Ik9wZW5BSSBvMy1taW5pIGlzIGEgY29zdC1lZmZpY2llbnQgbGFuZ3VhZ2UgbW9kZWwgb3B0aW1pemVkIGZvciBTVEVNIHJlYXNvbmluZyB0YXNrcywgcGFydGljdWxhcmx5IGV4Y2VsbGluZyBpbiBzY2llbmNlLCBtYXRoZW1hdGljcywgYW5kIGNvZGluZy5cblxuVGhpcyBtb2RlbCBzdXBwb3J0cyB0aGUgYHJlYXNvbmluZ19lZmZvcnRgIHBhcmFtZXRlciwgd2hpY2ggY2FuIGJlIHNldCB0byBcImhpZ2hcIiwgXCJtZWRpdW1cIiwgb3IgXCJsb3dcIiB0byBjb250cm9sIHRoZSB0aGlua2luZyB0aW1lIG9mIHRoZSBtb2RlbC4gVGhlIGRlZmF1bHQgaXMgXCJtZWRpdW1cIi4gT3BlblJvdXRlciBhbHNvIG9mZmVycyB0aGUgbW9kZWwgc2x1ZyBgb3BlbmFpL28zLW1pbmktaGlnaGAgdG8gZGVmYXVsdCB0aGUgcGFyYW1ldGVyIHRvIFwiaGlnaFwiLlxuXG5UaGUgbW9kZWwgZmVhdHVyZXMgdGhyZWUgYWRqdXN0YWJsZSByZWFzb25pbmcgZWZmb3J0IGxldmVscyBhbmQgc3VwcG9ydHMga2V5IGRldmVsb3BlciBjYXBhYmlsaXRpZXMgaW5jbHVkaW5nIGZ1bmN0aW9uIGNhbGxpbmcsIHN0cnVjdHVyZWQgb3V0cHV0cywgYW5kIHN0cmVhbWluZywgdGhvdWdoIGl0IGRvZXMgbm90IGluY2x1ZGUgdmlzaW9uIHByb2Nlc3NpbmcgY2FwYWJpbGl0aWVzLlxuXG5UaGUgbW9kZWwgZGVtb25zdHJhdGVzIHNpZ25pZmljYW50IGltcHJvdmVtZW50cyBvdmVyIGl0cyBwcmVkZWNlc3Nvciwgd2l0aCBleHBlcnQgdGVzdGVycyBwcmVmZXJyaW5nIGl0cyByZXNwb25zZXMgNTYlIG9mIHRoZSB0aW1lIGFuZCBub3RpbmcgYSAzOSUgcmVkdWN0aW9uIGluIG1ham9yIGVycm9ycyBvbiBjb21wbGV4IHF1ZXN0aW9ucy4gV2l0aCBtZWRpdW0gcmVhc29uaW5nIGVmZm9ydCBzZXR0aW5ncywgbzMtbWluaSBtYXRjaGVzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgbGFyZ2VyIG8xIG1vZGVsIG9uIGNoYWxsZW5naW5nIHJlYXNvbmluZyBldmFsdWF0aW9ucyBsaWtlIEFJTUUgYW5kIEdQUUEsIHdoaWxlIG1haW50YWluaW5nIGxvd2VyIGxhdGVuY3kgYW5kIGNvc3QuIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDExIiwiY29tcGxldGlvbiI6IjAuMDAwMDA0NCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIiwiaW5wdXRfY2FjaGVfcmVhZCI6IjAuMDAwMDAwNTUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MTAwMDAwLCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJkZWVwc2Vlay9kZWVwc2Vlay1yMS1kaXN0aWxsLXF3ZW4tMS41YiIsIm5hbWUiOiJEZWVwU2VlazogUjEgRGlzdGlsbCBRd2VuIDEuNUIiLCJjcmVhdGVkIjoxNzM4MzI4MDY3LCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrIFIxIERpc3RpbGwgUXdlbiAxLjVCIGlzIGEgZGlzdGlsbGVkIGxhcmdlIGxhbmd1YWdlIG1vZGVsIGJhc2VkIG9uICBbUXdlbiAyLjUgTWF0aCAxLjVCXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL1F3ZW4vUXdlbjIuNS1NYXRoLTEuNUIpLCB1c2luZyBvdXRwdXRzIGZyb20gW0RlZXBTZWVrIFIxXSgvZGVlcHNlZWsvZGVlcHNlZWstcjEpLiBJdCdzIGEgdmVyeSBzbWFsbCBhbmQgZWZmaWNpZW50IG1vZGVsIHdoaWNoIG91dHBlcmZvcm1zIFtHUFQgNG8gMDUxM10oL29wZW5haS9ncHQtNG8tMjAyNC0wNS0xMykgb24gTWF0aCBCZW5jaG1hcmtzLlxuXG5PdGhlciBiZW5jaG1hcmsgcmVzdWx0cyBpbmNsdWRlOlxuXG4tIEFJTUUgMjAyNCBwYXNzQDE6IDI4Ljlcbi0gQUlNRSAyMDI0IGNvbnNANjQ6IDUyLjdcbi0gTUFUSC01MDAgcGFzc0AxOiA4My45XG5cblRoZSBtb2RlbCBsZXZlcmFnZXMgZmluZS10dW5pbmcgZnJvbSBEZWVwU2VlayBSMSdzIG91dHB1dHMsIGVuYWJsaW5nIGNvbXBldGl0aXZlIHBlcmZvcm1hbmNlIGNvbXBhcmFibGUgdG8gbGFyZ2VyIGZyb250aWVyIG1vZGVscy4iLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjoiZGVlcHNlZWstcjEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDE4IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMTgiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjozMjc2OCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pc3RyYWxhaS9taXN0cmFsLXNtYWxsLTI0Yi1pbnN0cnVjdC0yNTAxOmZyZWUiLCJuYW1lIjoiTWlzdHJhbDogTWlzdHJhbCBTbWFsbCAzIChmcmVlKSIsImNyZWF0ZWQiOjE3MzgyNTU0MDksImRlc2NyaXB0aW9uIjoiTWlzdHJhbCBTbWFsbCAzIGlzIGEgMjRCLXBhcmFtZXRlciBsYW5ndWFnZSBtb2RlbCBvcHRpbWl6ZWQgZm9yIGxvdy1sYXRlbmN5IHBlcmZvcm1hbmNlIGFjcm9zcyBjb21tb24gQUkgdGFza3MuIFJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UsIGl0IGZlYXR1cmVzIGJvdGggcHJlLXRyYWluZWQgYW5kIGluc3RydWN0aW9uLXR1bmVkIHZlcnNpb25zIGRlc2lnbmVkIGZvciBlZmZpY2llbnQgbG9jYWwgZGVwbG95bWVudC5cblxuVGhlIG1vZGVsIGFjaGlldmVzIDgxJSBhY2N1cmFjeSBvbiB0aGUgTU1MVSBiZW5jaG1hcmsgYW5kIHBlcmZvcm1zIGNvbXBldGl0aXZlbHkgd2l0aCBsYXJnZXIgbW9kZWxzIGxpa2UgTGxhbWEgMy4zIDcwQiBhbmQgUXdlbiAzMkIsIHdoaWxlIG9wZXJhdGluZyBhdCB0aHJlZSB0aW1lcyB0aGUgc3BlZWQgb24gZXF1aXZhbGVudCBoYXJkd2FyZS4gW1JlYWQgdGhlIGJsb2cgcG9zdCBhYm91dCB0aGUgbW9kZWwgaGVyZS5dKGh0dHBzOi8vbWlzdHJhbC5haS9uZXdzL21pc3RyYWwtc21hbGwtMy8pIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pc3RyYWxhaS9taXN0cmFsLXNtYWxsLTI0Yi1pbnN0cnVjdC0yNTAxIiwibmFtZSI6Ik1pc3RyYWw6IE1pc3RyYWwgU21hbGwgMyIsImNyZWF0ZWQiOjE3MzgyNTU0MDksImRlc2NyaXB0aW9uIjoiTWlzdHJhbCBTbWFsbCAzIGlzIGEgMjRCLXBhcmFtZXRlciBsYW5ndWFnZSBtb2RlbCBvcHRpbWl6ZWQgZm9yIGxvdy1sYXRlbmN5IHBlcmZvcm1hbmNlIGFjcm9zcyBjb21tb24gQUkgdGFza3MuIFJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UsIGl0IGZlYXR1cmVzIGJvdGggcHJlLXRyYWluZWQgYW5kIGluc3RydWN0aW9uLXR1bmVkIHZlcnNpb25zIGRlc2lnbmVkIGZvciBlZmZpY2llbnQgbG9jYWwgZGVwbG95bWVudC5cblxuVGhlIG1vZGVsIGFjaGlldmVzIDgxJSBhY2N1cmFjeSBvbiB0aGUgTU1MVSBiZW5jaG1hcmsgYW5kIHBlcmZvcm1zIGNvbXBldGl0aXZlbHkgd2l0aCBsYXJnZXIgbW9kZWxzIGxpa2UgTGxhbWEgMy4zIDcwQiBhbmQgUXdlbiAzMkIsIHdoaWxlIG9wZXJhdGluZyBhdCB0aHJlZSB0aW1lcyB0aGUgc3BlZWQgb24gZXF1aXZhbGVudCBoYXJkd2FyZS4gW1JlYWQgdGhlIGJsb2cgcG9zdCBhYm91dCB0aGUgbW9kZWwgaGVyZS5dKGh0dHBzOi8vbWlzdHJhbC5haS9uZXdzL21pc3RyYWwtc21hbGwtMy8pIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDciLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAxNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImRlZXBzZWVrL2RlZXBzZWVrLXIxLWRpc3RpbGwtcXdlbi0zMmI6ZnJlZSIsIm5hbWUiOiJEZWVwU2VlazogUjEgRGlzdGlsbCBRd2VuIDMyQiAoZnJlZSkiLCJjcmVhdGVkIjoxNzM4MTk0ODMwLCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrIFIxIERpc3RpbGwgUXdlbiAzMkIgaXMgYSBkaXN0aWxsZWQgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgYmFzZWQgb24gW1F3ZW4gMi41IDMyQl0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9Rd2VuL1F3ZW4yLjUtMzJCKSwgdXNpbmcgb3V0cHV0cyBmcm9tIFtEZWVwU2VlayBSMV0oL2RlZXBzZWVrL2RlZXBzZWVrLXIxKS4gSXQgb3V0cGVyZm9ybXMgT3BlbkFJJ3MgbzEtbWluaSBhY3Jvc3MgdmFyaW91cyBiZW5jaG1hcmtzLCBhY2hpZXZpbmcgbmV3IHN0YXRlLW9mLXRoZS1hcnQgcmVzdWx0cyBmb3IgZGVuc2UgbW9kZWxzLlxuXG5PdGhlciBiZW5jaG1hcmsgcmVzdWx0cyBpbmNsdWRlOlxuXG4tIEFJTUUgMjAyNCBwYXNzQDE6IDcyLjZcbi0gTUFUSC01MDAgcGFzc0AxOiA5NC4zXG4tIENvZGVGb3JjZXMgUmF0aW5nOiAxNjkxXG5cblRoZSBtb2RlbCBsZXZlcmFnZXMgZmluZS10dW5pbmcgZnJvbSBEZWVwU2VlayBSMSdzIG91dHB1dHMsIGVuYWJsaW5nIGNvbXBldGl0aXZlIHBlcmZvcm1hbmNlIGNvbXBhcmFibGUgdG8gbGFyZ2VyIGZyb250aWVyIG1vZGVscy4iLCJjb250ZXh0X2xlbmd0aCI6MTYwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJRd2VuIiwiaW5zdHJ1Y3RfdHlwZSI6ImRlZXBzZWVrLXIxIn0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxNjAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxNjAwMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImRlZXBzZWVrL2RlZXBzZWVrLXIxLWRpc3RpbGwtcXdlbi0zMmIiLCJuYW1lIjoiRGVlcFNlZWs6IFIxIERpc3RpbGwgUXdlbiAzMkIiLCJjcmVhdGVkIjoxNzM4MTk0ODMwLCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrIFIxIERpc3RpbGwgUXdlbiAzMkIgaXMgYSBkaXN0aWxsZWQgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgYmFzZWQgb24gW1F3ZW4gMi41IDMyQl0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9Rd2VuL1F3ZW4yLjUtMzJCKSwgdXNpbmcgb3V0cHV0cyBmcm9tIFtEZWVwU2VlayBSMV0oL2RlZXBzZWVrL2RlZXBzZWVrLXIxKS4gSXQgb3V0cGVyZm9ybXMgT3BlbkFJJ3MgbzEtbWluaSBhY3Jvc3MgdmFyaW91cyBiZW5jaG1hcmtzLCBhY2hpZXZpbmcgbmV3IHN0YXRlLW9mLXRoZS1hcnQgcmVzdWx0cyBmb3IgZGVuc2UgbW9kZWxzLlxuXG5PdGhlciBiZW5jaG1hcmsgcmVzdWx0cyBpbmNsdWRlOlxuXG4tIEFJTUUgMjAyNCBwYXNzQDE6IDcyLjZcbi0gTUFUSC01MDAgcGFzc0AxOiA5NC4zXG4tIENvZGVGb3JjZXMgUmF0aW5nOiAxNjkxXG5cblRoZSBtb2RlbCBsZXZlcmFnZXMgZmluZS10dW5pbmcgZnJvbSBEZWVwU2VlayBSMSdzIG91dHB1dHMsIGVuYWJsaW5nIGNvbXBldGl0aXZlIHBlcmZvcm1hbmNlIGNvbXBhcmFibGUgdG8gbGFyZ2VyIGZyb250aWVyIG1vZGVscy4iLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMTIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAxOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJkZWVwc2Vlay9kZWVwc2Vlay1yMS1kaXN0aWxsLXF3ZW4tMTRiOmZyZWUiLCJuYW1lIjoiRGVlcFNlZWs6IFIxIERpc3RpbGwgUXdlbiAxNEIgKGZyZWUpIiwiY3JlYXRlZCI6MTczODE5Mzk0MCwiZGVzY3JpcHRpb24iOiJEZWVwU2VlayBSMSBEaXN0aWxsIFF3ZW4gMTRCIGlzIGEgZGlzdGlsbGVkIGxhcmdlIGxhbmd1YWdlIG1vZGVsIGJhc2VkIG9uIFtRd2VuIDIuNSAxNEJdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vZGVlcHNlZWstYWkvRGVlcFNlZWstUjEtRGlzdGlsbC1Rd2VuLTE0QiksIHVzaW5nIG91dHB1dHMgZnJvbSBbRGVlcFNlZWsgUjFdKC9kZWVwc2Vlay9kZWVwc2Vlay1yMSkuIEl0IG91dHBlcmZvcm1zIE9wZW5BSSdzIG8xLW1pbmkgYWNyb3NzIHZhcmlvdXMgYmVuY2htYXJrcywgYWNoaWV2aW5nIG5ldyBzdGF0ZS1vZi10aGUtYXJ0IHJlc3VsdHMgZm9yIGRlbnNlIG1vZGVscy5cblxuT3RoZXIgYmVuY2htYXJrIHJlc3VsdHMgaW5jbHVkZTpcblxuLSBBSU1FIDIwMjQgcGFzc0AxOiA2OS43XG4tIE1BVEgtNTAwIHBhc3NAMTogOTMuOVxuLSBDb2RlRm9yY2VzIFJhdGluZzogMTQ4MVxuXG5UaGUgbW9kZWwgbGV2ZXJhZ2VzIGZpbmUtdHVuaW5nIGZyb20gRGVlcFNlZWsgUjEncyBvdXRwdXRzLCBlbmFibGluZyBjb21wZXRpdGl2ZSBwZXJmb3JtYW5jZSBjb21wYXJhYmxlIHRvIGxhcmdlciBmcm9udGllciBtb2RlbHMuIiwiY29udGV4dF9sZW5ndGgiOjY0MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NjQwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImRlZXBzZWVrL2RlZXBzZWVrLXIxLWRpc3RpbGwtcXdlbi0xNGIiLCJuYW1lIjoiRGVlcFNlZWs6IFIxIERpc3RpbGwgUXdlbiAxNEIiLCJjcmVhdGVkIjoxNzM4MTkzOTQwLCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrIFIxIERpc3RpbGwgUXdlbiAxNEIgaXMgYSBkaXN0aWxsZWQgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgYmFzZWQgb24gW1F3ZW4gMi41IDE0Ql0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9kZWVwc2Vlay1haS9EZWVwU2Vlay1SMS1EaXN0aWxsLVF3ZW4tMTRCKSwgdXNpbmcgb3V0cHV0cyBmcm9tIFtEZWVwU2VlayBSMV0oL2RlZXBzZWVrL2RlZXBzZWVrLXIxKS4gSXQgb3V0cGVyZm9ybXMgT3BlbkFJJ3MgbzEtbWluaSBhY3Jvc3MgdmFyaW91cyBiZW5jaG1hcmtzLCBhY2hpZXZpbmcgbmV3IHN0YXRlLW9mLXRoZS1hcnQgcmVzdWx0cyBmb3IgZGVuc2UgbW9kZWxzLlxuXG5PdGhlciBiZW5jaG1hcmsgcmVzdWx0cyBpbmNsdWRlOlxuXG4tIEFJTUUgMjAyNCBwYXNzQDE6IDY5Ljdcbi0gTUFUSC01MDAgcGFzc0AxOiA5My45XG4tIENvZGVGb3JjZXMgUmF0aW5nOiAxNDgxXG5cblRoZSBtb2RlbCBsZXZlcmFnZXMgZmluZS10dW5pbmcgZnJvbSBEZWVwU2VlayBSMSdzIG91dHB1dHMsIGVuYWJsaW5nIGNvbXBldGl0aXZlIHBlcmZvcm1hbmNlIGNvbXBhcmFibGUgdG8gbGFyZ2VyIGZyb250aWVyIG1vZGVscy4iLCJjb250ZXh0X2xlbmd0aCI6NjQwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJRd2VuIiwiaW5zdHJ1Y3RfdHlwZSI6ImRlZXBzZWVrLXIxIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAxNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDE1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo2NDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo2NDAwMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InBlcnBsZXhpdHkvc29uYXItcmVhc29uaW5nIiwibmFtZSI6IlBlcnBsZXhpdHk6IFNvbmFyIFJlYXNvbmluZyIsImNyZWF0ZWQiOjE3MzgxMzExMDcsImRlc2NyaXB0aW9uIjoiU29uYXIgUmVhc29uaW5nIGlzIGEgcmVhc29uaW5nIG1vZGVsIHByb3ZpZGVkIGJ5IFBlcnBsZXhpdHkgYmFzZWQgb24gW0RlZXBTZWVrIFIxXSgvZGVlcHNlZWsvZGVlcHNlZWstcjEpLlxuXG5JdCBhbGxvd3MgZGV2ZWxvcGVycyB0byB1dGlsaXplIGxvbmcgY2hhaW4gb2YgdGhvdWdodCB3aXRoIGJ1aWx0LWluIHdlYiBzZWFyY2guIFNvbmFyIFJlYXNvbmluZyBpcyB1bmNlbnNvcmVkIGFuZCBob3N0ZWQgaW4gVVMgZGF0YWNlbnRlcnMuICIsImNvbnRleHRfbGVuZ3RoIjoxMjcwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDA1IiwicmVxdWVzdCI6IjAuMDA1IiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI3MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJwZXJwbGV4aXR5L3NvbmFyIiwibmFtZSI6IlBlcnBsZXhpdHk6IFNvbmFyIiwiY3JlYXRlZCI6MTczODAxMzgwOCwiZGVzY3JpcHRpb24iOiJTb25hciBpcyBsaWdodHdlaWdodCwgYWZmb3JkYWJsZSwgZmFzdCwgYW5kIHNpbXBsZSB0byB1c2Ug4oCUIG5vdyBmZWF0dXJpbmcgY2l0YXRpb25zIGFuZCB0aGUgYWJpbGl0eSB0byBjdXN0b21pemUgc291cmNlcy4gSXQgaXMgZGVzaWduZWQgZm9yIGNvbXBhbmllcyBzZWVraW5nIHRvIGludGVncmF0ZSBsaWdodHdlaWdodCBxdWVzdGlvbi1hbmQtYW5zd2VyIGZlYXR1cmVzIG9wdGltaXplZCBmb3Igc3BlZWQuIiwiY29udGV4dF9sZW5ndGgiOjEyNzA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDEiLCJyZXF1ZXN0IjoiMC4wMDUiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjcwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImxpcXVpZC9sZm0tN2IiLCJuYW1lIjoiTGlxdWlkOiBMRk0gN0IiLCJjcmVhdGVkIjoxNzM3ODA2ODgzLCJkZXNjcmlwdGlvbiI6IkxGTS03QiwgYSBuZXcgYmVzdC1pbi1jbGFzcyBsYW5ndWFnZSBtb2RlbC4gTEZNLTdCIGlzIGRlc2lnbmVkIGZvciBleGNlcHRpb25hbCBjaGF0IGNhcGFiaWxpdGllcywgaW5jbHVkaW5nIGxhbmd1YWdlcyBsaWtlIEFyYWJpYyBhbmQgSmFwYW5lc2UuIFBvd2VyZWQgYnkgdGhlIExpcXVpZCBGb3VuZGF0aW9uIE1vZGVsIChMRk0pIGFyY2hpdGVjdHVyZSwgaXQgZXhoaWJpdHMgdW5pcXVlIGZlYXR1cmVzIGxpa2UgbG93IG1lbW9yeSBmb290cHJpbnQgYW5kIGZhc3QgaW5mZXJlbmNlIHNwZWVkLiBcblxuTEZNLTdCIGlzIHRoZSB3b3JsZOKAmXMgYmVzdC1pbi1jbGFzcyBtdWx0aWxpbmd1YWwgbGFuZ3VhZ2UgbW9kZWwgaW4gRW5nbGlzaCwgQXJhYmljLCBhbmQgSmFwYW5lc2UuXG5cblNlZSB0aGUgW2xhdW5jaCBhbm5vdW5jZW1lbnRdKGh0dHBzOi8vd3d3LmxpcXVpZC5haS9sZm0tN2IpIGZvciBiZW5jaG1hcmtzIGFuZCBtb3JlIGluZm8uIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwMSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDAxIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibGlxdWlkL2xmbS0zYiIsIm5hbWUiOiJMaXF1aWQ6IExGTSAzQiIsImNyZWF0ZWQiOjE3Mzc4MDY1MDEsImRlc2NyaXB0aW9uIjoiTGlxdWlkJ3MgTEZNIDNCIGRlbGl2ZXJzIGluY3JlZGlibGUgcGVyZm9ybWFuY2UgZm9yIGl0cyBzaXplLiBJdCBwb3NpdGlvbnMgaXRzZWxmIGFzIGZpcnN0IHBsYWNlIGFtb25nIDNCIHBhcmFtZXRlciB0cmFuc2Zvcm1lcnMsIGh5YnJpZHMsIGFuZCBSTk4gbW9kZWxzIEl0IGlzIGFsc28gb24gcGFyIHdpdGggUGhpLTMuNS1taW5pIG9uIG11bHRpcGxlIGJlbmNobWFya3MsIHdoaWxlIGJlaW5nIDE4LjQlIHNtYWxsZXIuXG5cbkxGTS0zQiBpcyB0aGUgaWRlYWwgY2hvaWNlIGZvciBtb2JpbGUgYW5kIG90aGVyIGVkZ2UgdGV4dC1iYXNlZCBhcHBsaWNhdGlvbnMuXG5cblNlZSB0aGUgW2xhdW5jaCBhbm5vdW5jZW1lbnRdKGh0dHBzOi8vd3d3LmxpcXVpZC5haS9saXF1aWQtZm91bmRhdGlvbi1tb2RlbHMpIGZvciBiZW5jaG1hcmtzIGFuZCBtb3JlIGluZm8uIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZGVlcHNlZWsvZGVlcHNlZWstcjEtZGlzdGlsbC1sbGFtYS03MGI6ZnJlZSIsIm5hbWUiOiJEZWVwU2VlazogUjEgRGlzdGlsbCBMbGFtYSA3MEIgKGZyZWUpIiwiY3JlYXRlZCI6MTczNzY2MzE2OSwiZGVzY3JpcHRpb24iOiJEZWVwU2VlayBSMSBEaXN0aWxsIExsYW1hIDcwQiBpcyBhIGRpc3RpbGxlZCBsYXJnZSBsYW5ndWFnZSBtb2RlbCBiYXNlZCBvbiBbTGxhbWEtMy4zLTcwQi1JbnN0cnVjdF0oL21ldGEtbGxhbWEvbGxhbWEtMy4zLTcwYi1pbnN0cnVjdCksIHVzaW5nIG91dHB1dHMgZnJvbSBbRGVlcFNlZWsgUjFdKC9kZWVwc2Vlay9kZWVwc2Vlay1yMSkuIFRoZSBtb2RlbCBjb21iaW5lcyBhZHZhbmNlZCBkaXN0aWxsYXRpb24gdGVjaG5pcXVlcyB0byBhY2hpZXZlIGhpZ2ggcGVyZm9ybWFuY2UgYWNyb3NzIG11bHRpcGxlIGJlbmNobWFya3MsIGluY2x1ZGluZzpcblxuLSBBSU1FIDIwMjQgcGFzc0AxOiA3MC4wXG4tIE1BVEgtNTAwIHBhc3NAMTogOTQuNVxuLSBDb2RlRm9yY2VzIFJhdGluZzogMTYzM1xuXG5UaGUgbW9kZWwgbGV2ZXJhZ2VzIGZpbmUtdHVuaW5nIGZyb20gRGVlcFNlZWsgUjEncyBvdXRwdXRzLCBlbmFibGluZyBjb21wZXRpdGl2ZSBwZXJmb3JtYW5jZSBjb21wYXJhYmxlIHRvIGxhcmdlciBmcm9udGllciBtb2RlbHMuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJkZWVwc2Vlay9kZWVwc2Vlay1yMS1kaXN0aWxsLWxsYW1hLTcwYiIsIm5hbWUiOiJEZWVwU2VlazogUjEgRGlzdGlsbCBMbGFtYSA3MEIiLCJjcmVhdGVkIjoxNzM3NjYzMTY5LCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrIFIxIERpc3RpbGwgTGxhbWEgNzBCIGlzIGEgZGlzdGlsbGVkIGxhcmdlIGxhbmd1YWdlIG1vZGVsIGJhc2VkIG9uIFtMbGFtYS0zLjMtNzBCLUluc3RydWN0XSgvbWV0YS1sbGFtYS9sbGFtYS0zLjMtNzBiLWluc3RydWN0KSwgdXNpbmcgb3V0cHV0cyBmcm9tIFtEZWVwU2VlayBSMV0oL2RlZXBzZWVrL2RlZXBzZWVrLXIxKS4gVGhlIG1vZGVsIGNvbWJpbmVzIGFkdmFuY2VkIGRpc3RpbGxhdGlvbiB0ZWNobmlxdWVzIHRvIGFjaGlldmUgaGlnaCBwZXJmb3JtYW5jZSBhY3Jvc3MgbXVsdGlwbGUgYmVuY2htYXJrcywgaW5jbHVkaW5nOlxuXG4tIEFJTUUgMjAyNCBwYXNzQDE6IDcwLjBcbi0gTUFUSC01MDAgcGFzc0AxOiA5NC41XG4tIENvZGVGb3JjZXMgUmF0aW5nOiAxNjMzXG5cblRoZSBtb2RlbCBsZXZlcmFnZXMgZmluZS10dW5pbmcgZnJvbSBEZWVwU2VlayBSMSdzIG91dHB1dHMsIGVuYWJsaW5nIGNvbXBldGl0aXZlIHBlcmZvcm1hbmNlIGNvbXBhcmFibGUgdG8gbGFyZ2VyIGZyb250aWVyIG1vZGVscy4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImRlZXBzZWVrLXIxIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjE2Mzg0LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZ29vZ2xlL2dlbWluaS0yLjAtZmxhc2gtdGhpbmtpbmctZXhwOmZyZWUiLCJuYW1lIjoiR29vZ2xlOiBHZW1pbmkgMi4wIEZsYXNoIFRoaW5raW5nIEV4cGVyaW1lbnRhbCAwMS0yMSAoZnJlZSkiLCJjcmVhdGVkIjoxNzM3NTQ3ODk5LCJkZXNjcmlwdGlvbiI6IkdlbWluaSAyLjAgRmxhc2ggVGhpbmtpbmcgRXhwZXJpbWVudGFsICgwMS0yMSkgaXMgYSBzbmFwc2hvdCBvZiBHZW1pbmkgMi4wIEZsYXNoIFRoaW5raW5nIEV4cGVyaW1lbnRhbC5cblxuR2VtaW5pIDIuMCBGbGFzaCBUaGlua2luZyBNb2RlIGlzIGFuIGV4cGVyaW1lbnRhbCBtb2RlbCB0aGF0J3MgdHJhaW5lZCB0byBnZW5lcmF0ZSB0aGUgXCJ0aGlua2luZyBwcm9jZXNzXCIgdGhlIG1vZGVsIGdvZXMgdGhyb3VnaCBhcyBwYXJ0IG9mIGl0cyByZXNwb25zZS4gQXMgYSByZXN1bHQsIFRoaW5raW5nIE1vZGUgaXMgY2FwYWJsZSBvZiBzdHJvbmdlciByZWFzb25pbmcgY2FwYWJpbGl0aWVzIGluIGl0cyByZXNwb25zZXMgdGhhbiB0aGUgW2Jhc2UgR2VtaW5pIDIuMCBGbGFzaCBtb2RlbF0oL2dvb2dsZS9nZW1pbmktMi4wLWZsYXNoLWV4cCkuIiwiY29udGV4dF9sZW5ndGgiOjEwNDg1NzYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdlbWluaSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTA0ODU3NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo2NTUzNiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImRlZXBzZWVrL2RlZXBzZWVrLXIxOmZyZWUiLCJuYW1lIjoiRGVlcFNlZWs6IFIxIChmcmVlKSIsImNyZWF0ZWQiOjE3MzczODEwOTUsImRlc2NyaXB0aW9uIjoiRGVlcFNlZWsgUjEgaXMgaGVyZTogUGVyZm9ybWFuY2Ugb24gcGFyIHdpdGggW09wZW5BSSBvMV0oL29wZW5haS9vMSksIGJ1dCBvcGVuLXNvdXJjZWQgYW5kIHdpdGggZnVsbHkgb3BlbiByZWFzb25pbmcgdG9rZW5zLiBJdCdzIDY3MUIgcGFyYW1ldGVycyBpbiBzaXplLCB3aXRoIDM3QiBhY3RpdmUgaW4gYW4gaW5mZXJlbmNlIHBhc3MuXG5cbkZ1bGx5IG9wZW4tc291cmNlIG1vZGVsICYgW3RlY2huaWNhbCByZXBvcnRdKGh0dHBzOi8vYXBpLWRvY3MuZGVlcHNlZWsuY29tL25ld3MvbmV3czI1MDEyMCkuXG5cbk1JVCBsaWNlbnNlZDogRGlzdGlsbCAmIGNvbW1lcmNpYWxpemUgZnJlZWx5ISIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJEZWVwU2VlayIsImluc3RydWN0X3R5cGUiOiJkZWVwc2Vlay1yMSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODQwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJkZWVwc2Vlay9kZWVwc2Vlay1yMSIsIm5hbWUiOiJEZWVwU2VlazogUjEiLCJjcmVhdGVkIjoxNzM3MzgxMDk1LCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrIFIxIGlzIGhlcmU6IFBlcmZvcm1hbmNlIG9uIHBhciB3aXRoIFtPcGVuQUkgbzFdKC9vcGVuYWkvbzEpLCBidXQgb3Blbi1zb3VyY2VkIGFuZCB3aXRoIGZ1bGx5IG9wZW4gcmVhc29uaW5nIHRva2Vucy4gSXQncyA2NzFCIHBhcmFtZXRlcnMgaW4gc2l6ZSwgd2l0aCAzN0IgYWN0aXZlIGluIGFuIGluZmVyZW5jZSBwYXNzLlxuXG5GdWxseSBvcGVuLXNvdXJjZSBtb2RlbCAmIFt0ZWNobmljYWwgcmVwb3J0XShodHRwczovL2FwaS1kb2NzLmRlZXBzZWVrLmNvbS9uZXdzL25ld3MyNTAxMjApLlxuXG5NSVQgbGljZW5zZWQ6IERpc3RpbGwgJiBjb21tZXJjaWFsaXplIGZyZWVseSEiLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiRGVlcFNlZWsiLCJpbnN0cnVjdF90eXBlIjoiZGVlcHNlZWstcjEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDMiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjozMjc2OCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InNvcGhvc3ltcGF0aGVpYS9yb2d1ZS1yb3NlLTEwM2ItdjAuMjpmcmVlIiwibmFtZSI6IlJvZ3VlIFJvc2UgMTAzQiB2MC4yIChmcmVlKSIsImNyZWF0ZWQiOjE3MzcxOTUxODksImRlc2NyaXB0aW9uIjoiUm9ndWUgUm9zZSBkZW1vbnN0cmF0ZXMgc3Ryb25nIGNhcGFiaWxpdGllcyBpbiByb2xlcGxheWluZyBhbmQgc3Rvcnl0ZWxsaW5nIGFwcGxpY2F0aW9ucywgcG90ZW50aWFsbHkgc3VycGFzc2luZyBvdGhlciBtb2RlbHMgaW4gdGhlIDEwMy0xMjBCIHBhcmFtZXRlciByYW5nZS4gV2hpbGUgaXQgb2NjYXNpb25hbGx5IGV4aGliaXRzIGluY29uc2lzdGVuY2llcyB3aXRoIHNjZW5lIGxvZ2ljLCB0aGUgb3ZlcmFsbCBpbnRlcmFjdGlvbiBxdWFsaXR5IHJlcHJlc2VudHMgYW4gYWR2YW5jZW1lbnQgaW4gbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nIGZvciBjcmVhdGl2ZSBhcHBsaWNhdGlvbnMuXG5cbkl0IGlzIGEgMTIwLWxheWVyIGZyYW5rZW5tZXJnZSBtb2RlbCBjb21iaW5pbmcgdHdvIGN1c3RvbSA3MEIgYXJjaGl0ZWN0dXJlcyBmcm9tIE5vdmVtYmVyIDIwMjMsIGRlcml2ZWQgZnJvbSB0aGUgW3h3aW4tc3RlbGxhcmJyaWdodC1lcnAtNzBiLXYyXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL3NvcGhvc3ltcGF0aGVpYS94d2luLXN0ZWxsYXJicmlnaHQtZXJwLTcwYi12MikgYmFzZS5cbiIsImNvbnRleHRfbGVuZ3RoIjo0MDk2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEyIiwiaW5zdHJ1Y3RfdHlwZSI6InZpY3VuYSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NDA5NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWluaW1heC9taW5pbWF4LTAxIiwibmFtZSI6Ik1pbmlNYXg6IE1pbmlNYXgtMDEiLCJjcmVhdGVkIjoxNzM2OTE1NDYyLCJkZXNjcmlwdGlvbiI6Ik1pbmlNYXgtMDEgaXMgYSBjb21iaW5lcyBNaW5pTWF4LVRleHQtMDEgZm9yIHRleHQgZ2VuZXJhdGlvbiBhbmQgTWluaU1heC1WTC0wMSBmb3IgaW1hZ2UgdW5kZXJzdGFuZGluZy4gSXQgaGFzIDQ1NiBiaWxsaW9uIHBhcmFtZXRlcnMsIHdpdGggNDUuOSBiaWxsaW9uIHBhcmFtZXRlcnMgYWN0aXZhdGVkIHBlciBpbmZlcmVuY2UsIGFuZCBjYW4gaGFuZGxlIGEgY29udGV4dCBvZiB1cCB0byA0IG1pbGxpb24gdG9rZW5zLlxuXG5UaGUgdGV4dCBtb2RlbCBhZG9wdHMgYSBoeWJyaWQgYXJjaGl0ZWN0dXJlIHRoYXQgY29tYmluZXMgTGlnaHRuaW5nIEF0dGVudGlvbiwgU29mdG1heCBBdHRlbnRpb24sIGFuZCBNaXh0dXJlLW9mLUV4cGVydHMgKE1vRSkuIFRoZSBpbWFnZSBtb2RlbCBhZG9wdHMgdGhlIOKAnFZpVC1NTFAtTExN4oCdIGZyYW1ld29yayBhbmQgaXMgdHJhaW5lZCBvbiB0b3Agb2YgdGhlIHRleHQgbW9kZWwuXG5cblRvIHJlYWQgbW9yZSBhYm91dCB0aGUgcmVsZWFzZSwgc2VlOiBodHRwczovL3d3dy5taW5pbWF4aS5jb20vZW4vbmV3cy9taW5pbWF4LTAxLXNlcmllcy0yIiwiY29udGV4dF9sZW5ndGgiOjEwMDAxOTIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDAxMSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTAwMDE5MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMDAwMTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWlzdHJhbGFpL2NvZGVzdHJhbC0yNTAxIiwibmFtZSI6Ik1pc3RyYWw6IENvZGVzdHJhbCAyNTAxIiwiY3JlYXRlZCI6MTczNjg5NTUyMiwiZGVzY3JpcHRpb24iOiJbTWlzdHJhbF0oL21pc3RyYWxhaSkncyBjdXR0aW5nLWVkZ2UgbGFuZ3VhZ2UgbW9kZWwgZm9yIGNvZGluZy4gQ29kZXN0cmFsIHNwZWNpYWxpemVzIGluIGxvdy1sYXRlbmN5LCBoaWdoLWZyZXF1ZW5jeSB0YXNrcyBzdWNoIGFzIGZpbGwtaW4tdGhlLW1pZGRsZSAoRklNKSwgY29kZSBjb3JyZWN0aW9uIGFuZCB0ZXN0IGdlbmVyYXRpb24uIFxuXG5MZWFybiBtb3JlIG9uIHRoZWlyIGJsb2cgcG9zdDogaHR0cHM6Ly9taXN0cmFsLmFpL25ld3MvY29kZXN0cmFsLTI1MDEvIiwiY29udGV4dF9sZW5ndGgiOjI2MjE0NCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDMiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA5IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyNjIxNDQsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pY3Jvc29mdC9waGktNCIsIm5hbWUiOiJNaWNyb3NvZnQ6IFBoaSA0IiwiY3JlYXRlZCI6MTczNjQ4OTg3MiwiZGVzY3JpcHRpb24iOiJbTWljcm9zb2Z0IFJlc2VhcmNoXSgvbWljcm9zb2Z0KSBQaGktNCBpcyBkZXNpZ25lZCB0byBwZXJmb3JtIHdlbGwgaW4gY29tcGxleCByZWFzb25pbmcgdGFza3MgYW5kIGNhbiBvcGVyYXRlIGVmZmljaWVudGx5IGluIHNpdHVhdGlvbnMgd2l0aCBsaW1pdGVkIG1lbW9yeSBvciB3aGVyZSBxdWljayByZXNwb25zZXMgYXJlIG5lZWRlZC4gXG5cbkF0IDE0IGJpbGxpb24gcGFyYW1ldGVycywgaXQgd2FzIHRyYWluZWQgb24gYSBtaXggb2YgaGlnaC1xdWFsaXR5IHN5bnRoZXRpYyBkYXRhc2V0cywgZGF0YSBmcm9tIGN1cmF0ZWQgd2Vic2l0ZXMsIGFuZCBhY2FkZW1pYyBtYXRlcmlhbHMuIEl0IGhhcyB1bmRlcmdvbmUgY2FyZWZ1bCBpbXByb3ZlbWVudCB0byBmb2xsb3cgaW5zdHJ1Y3Rpb25zIGFjY3VyYXRlbHkgYW5kIG1haW50YWluIHN0cm9uZyBzYWZldHkgc3RhbmRhcmRzLiBJdCB3b3JrcyBiZXN0IHdpdGggRW5nbGlzaCBsYW5ndWFnZSBpbnB1dHMuXG5cbkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIFtQaGktNCBUZWNobmljYWwgUmVwb3J0XShodHRwczovL2FyeGl2Lm9yZy9wZGYvMjQxMi4wODkwNSlcbiIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwNyIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDE0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZGVlcHNlZWsvZGVlcHNlZWstY2hhdDpmcmVlIiwibmFtZSI6IkRlZXBTZWVrOiBEZWVwU2VlayBWMyAoZnJlZSkiLCJjcmVhdGVkIjoxNzM1MjQxMzIwLCJkZXNjcmlwdGlvbiI6IkRlZXBTZWVrLVYzIGlzIHRoZSBsYXRlc3QgbW9kZWwgZnJvbSB0aGUgRGVlcFNlZWsgdGVhbSwgYnVpbGRpbmcgdXBvbiB0aGUgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nIGFuZCBjb2RpbmcgYWJpbGl0aWVzIG9mIHRoZSBwcmV2aW91cyB2ZXJzaW9ucy4gUHJlLXRyYWluZWQgb24gbmVhcmx5IDE1IHRyaWxsaW9uIHRva2VucywgdGhlIHJlcG9ydGVkIGV2YWx1YXRpb25zIHJldmVhbCB0aGF0IHRoZSBtb2RlbCBvdXRwZXJmb3JtcyBvdGhlciBvcGVuLXNvdXJjZSBtb2RlbHMgYW5kIHJpdmFscyBsZWFkaW5nIGNsb3NlZC1zb3VyY2UgbW9kZWxzLlxuXG5Gb3IgbW9kZWwgZGV0YWlscywgcGxlYXNlIHZpc2l0IFt0aGUgRGVlcFNlZWstVjMgcmVwb10oaHR0cHM6Ly9naXRodWIuY29tL2RlZXBzZWVrLWFpL0RlZXBTZWVrLVYzKSBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgb3Igc2VlIHRoZSBbbGF1bmNoIGFubm91bmNlbWVudF0oaHR0cHM6Ly9hcGktZG9jcy5kZWVwc2Vlay5jb20vbmV3cy9uZXdzMTIyNikuIiwiY29udGV4dF9sZW5ndGgiOjE2Mzg0MCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkRlZXBTZWVrIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxNjM4NDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImRlZXBzZWVrL2RlZXBzZWVrLWNoYXQiLCJuYW1lIjoiRGVlcFNlZWs6IERlZXBTZWVrIFYzIiwiY3JlYXRlZCI6MTczNTI0MTMyMCwiZGVzY3JpcHRpb24iOiJEZWVwU2Vlay1WMyBpcyB0aGUgbGF0ZXN0IG1vZGVsIGZyb20gdGhlIERlZXBTZWVrIHRlYW0sIGJ1aWxkaW5nIHVwb24gdGhlIGluc3RydWN0aW9uIGZvbGxvd2luZyBhbmQgY29kaW5nIGFiaWxpdGllcyBvZiB0aGUgcHJldmlvdXMgdmVyc2lvbnMuIFByZS10cmFpbmVkIG9uIG5lYXJseSAxNSB0cmlsbGlvbiB0b2tlbnMsIHRoZSByZXBvcnRlZCBldmFsdWF0aW9ucyByZXZlYWwgdGhhdCB0aGUgbW9kZWwgb3V0cGVyZm9ybXMgb3RoZXIgb3Blbi1zb3VyY2UgbW9kZWxzIGFuZCByaXZhbHMgbGVhZGluZyBjbG9zZWQtc291cmNlIG1vZGVscy5cblxuRm9yIG1vZGVsIGRldGFpbHMsIHBsZWFzZSB2aXNpdCBbdGhlIERlZXBTZWVrLVYzIHJlcG9dKGh0dHBzOi8vZ2l0aHViLmNvbS9kZWVwc2Vlay1haS9EZWVwU2Vlay1WMykgZm9yIG1vcmUgaW5mb3JtYXRpb24sIG9yIHNlZSB0aGUgW2xhdW5jaCBhbm5vdW5jZW1lbnRdKGh0dHBzOi8vYXBpLWRvY3MuZGVlcHNlZWsuY29tL25ld3MvbmV3czEyMjYpLiIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJEZWVwU2VlayIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMzgiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA4OSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODQwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjE2Mzg0MCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Imdvb2dsZS9nZW1pbmktMi4wLWZsYXNoLXRoaW5raW5nLWV4cC0xMjE5OmZyZWUiLCJuYW1lIjoiR29vZ2xlOiBHZW1pbmkgMi4wIEZsYXNoIFRoaW5raW5nIEV4cGVyaW1lbnRhbCAoZnJlZSkiLCJjcmVhdGVkIjoxNzM0NjUwMDI2LCJkZXNjcmlwdGlvbiI6IkdlbWluaSAyLjAgRmxhc2ggVGhpbmtpbmcgTW9kZSBpcyBhbiBleHBlcmltZW50YWwgbW9kZWwgdGhhdCdzIHRyYWluZWQgdG8gZ2VuZXJhdGUgdGhlIFwidGhpbmtpbmcgcHJvY2Vzc1wiIHRoZSBtb2RlbCBnb2VzIHRocm91Z2ggYXMgcGFydCBvZiBpdHMgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCBUaGlua2luZyBNb2RlIGlzIGNhcGFibGUgb2Ygc3Ryb25nZXIgcmVhc29uaW5nIGNhcGFiaWxpdGllcyBpbiBpdHMgcmVzcG9uc2VzIHRoYW4gdGhlIFtiYXNlIEdlbWluaSAyLjAgRmxhc2ggbW9kZWxdKC9nb29nbGUvZ2VtaW5pLTIuMC1mbGFzaC1leHApLiIsImNvbnRleHRfbGVuZ3RoIjo0MDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR2VtaW5pIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo0MDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MDAwLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoic2FvMTBrL2wzLjMtZXVyeWFsZS03MGIiLCJuYW1lIjoiU2FvMTBLOiBMbGFtYSAzLjMgRXVyeWFsZSA3MEIiLCJjcmVhdGVkIjoxNzM0NTM1OTI4LCJkZXNjcmlwdGlvbiI6IkV1cnlhbGUgTDMuMyA3MEIgaXMgYSBtb2RlbCBmb2N1c2VkIG9uIGNyZWF0aXZlIHJvbGVwbGF5IGZyb20gW1NhbzEwa10oaHR0cHM6Ly9rby1maS5jb20vc2FvMTBrKS4gSXQgaXMgdGhlIHN1Y2Nlc3NvciBvZiBbRXVyeWFsZSBMMyA3MEIgdjIuMl0oL21vZGVscy9zYW8xMGsvbDMtZXVyeWFsZS03MGIpLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA3IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvbzEiLCJuYW1lIjoiT3BlbkFJOiBvMSIsImNyZWF0ZWQiOjE3MzQ0NTk5OTksImRlc2NyaXB0aW9uIjoiVGhlIGxhdGVzdCBhbmQgc3Ryb25nZXN0IG1vZGVsIGZhbWlseSBmcm9tIE9wZW5BSSwgbzEgaXMgZGVzaWduZWQgdG8gc3BlbmQgbW9yZSB0aW1lIHRoaW5raW5nIGJlZm9yZSByZXNwb25kaW5nLiBUaGUgbzEgbW9kZWwgc2VyaWVzIGlzIHRyYWluZWQgd2l0aCBsYXJnZS1zY2FsZSByZWluZm9yY2VtZW50IGxlYXJuaW5nIHRvIHJlYXNvbiB1c2luZyBjaGFpbiBvZiB0aG91Z2h0LiBcblxuVGhlIG8xIG1vZGVscyBhcmUgb3B0aW1pemVkIGZvciBtYXRoLCBzY2llbmNlLCBwcm9ncmFtbWluZywgYW5kIG90aGVyIFNURU0tcmVsYXRlZCB0YXNrcy4gVGhleSBjb25zaXN0ZW50bHkgZXhoaWJpdCBQaEQtbGV2ZWwgYWNjdXJhY3kgb24gYmVuY2htYXJrcyBpbiBwaHlzaWNzLCBjaGVtaXN0cnksIGFuZCBiaW9sb2d5LiBMZWFybiBtb3JlIGluIHRoZSBbbGF1bmNoIGFubm91bmNlbWVudF0oaHR0cHM6Ly9vcGVuYWkuY29tL28xKS5cbiIsImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDE1IiwiY29tcGxldGlvbiI6IjAuMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMjE2NzUiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEwMDAwMCwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZXZhLXVuaXQtMDEvZXZhLWxsYW1hLTMuMzMtNzBiIiwibmFtZSI6IkVWQSBMbGFtYSAzLjMzIDcwQiIsImNyZWF0ZWQiOjE3MzQzNzczMDMsImRlc2NyaXB0aW9uIjoiRVZBIExsYW1hIDMuMzMgNzBiIGlzIGEgcm9sZXBsYXkgYW5kIHN0b3J5d3JpdGluZyBzcGVjaWFsaXN0IG1vZGVsLiBJdCBpcyBhIGZ1bGwtcGFyYW1ldGVyIGZpbmV0dW5lIG9mIFtMbGFtYS0zLjMtNzBCLUluc3RydWN0XShodHRwczovL29wZW5yb3V0ZXIuYWkvbWV0YS1sbGFtYS9sbGFtYS0zLjMtNzBiLWluc3RydWN0KSBvbiBtaXh0dXJlIG9mIHN5bnRoZXRpYyBhbmQgbmF0dXJhbCBkYXRhLlxuXG5JdCB1c2VzIENlbGVzdGUgNzBCIDAuMSBkYXRhIG1peHR1cmUsIGdyZWF0bHkgZXhwYW5kaW5nIGl0IHRvIGltcHJvdmUgdmVyc2F0aWxpdHksIGNyZWF0aXZpdHkgYW5kIFwiZmxhdm9yXCIgb2YgdGhlIHJlc3VsdGluZyBtb2RlbFxuXG5UaGlzIG1vZGVsIHdhcyBidWlsdCB3aXRoIExsYW1hIGJ5IE1ldGEuXG4iLCJjb250ZXh0X2xlbmd0aCI6MTYzODQsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDQiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjE2Mzg0LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJ4LWFpL2dyb2stMi12aXNpb24tMTIxMiIsIm5hbWUiOiJ4QUk6IEdyb2sgMiBWaXNpb24gMTIxMiIsImNyZWF0ZWQiOjE3MzQyMzczMzgsImRlc2NyaXB0aW9uIjoiR3JvayAyIFZpc2lvbiAxMjEyIGFkdmFuY2VzIGltYWdlLWJhc2VkIEFJIHdpdGggc3Ryb25nZXIgdmlzdWFsIGNvbXByZWhlbnNpb24sIHJlZmluZWQgaW5zdHJ1Y3Rpb24tZm9sbG93aW5nLCBhbmQgbXVsdGlsaW5ndWFsIHN1cHBvcnQuIEZyb20gb2JqZWN0IHJlY29nbml0aW9uIHRvIHN0eWxlIGFuYWx5c2lzLCBpdCBlbXBvd2VycyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vcmUgaW50dWl0aXZlLCB2aXN1YWxseSBhd2FyZSBhcHBsaWNhdGlvbnMuIEl0cyBlbmhhbmNlZCBzdGVlcmFiaWxpdHkgYW5kIHJlYXNvbmluZyBlc3RhYmxpc2ggYSByb2J1c3QgZm91bmRhdGlvbiBmb3IgbmV4dC1nZW5lcmF0aW9uIGltYWdlIHNvbHV0aW9ucy5cblxuVG8gcmVhZCBtb3JlIGFib3V0IHRoaXMgbW9kZWwsIGNoZWNrIG91dCBbeEFJJ3MgYW5ub3VuY2VtZW50XShodHRwczovL3guYWkvYmxvZy9ncm9rLTEyMTIpLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR3JvayIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDM2Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6IngtYWkvZ3Jvay0yLTEyMTIiLCJuYW1lIjoieEFJOiBHcm9rIDIgMTIxMiIsImNyZWF0ZWQiOjE3MzQyMzI4MTQsImRlc2NyaXB0aW9uIjoiR3JvayAyIDEyMTIgaW50cm9kdWNlcyBzaWduaWZpY2FudCBlbmhhbmNlbWVudHMgdG8gYWNjdXJhY3ksIGluc3RydWN0aW9uIGFkaGVyZW5jZSwgYW5kIG11bHRpbGluZ3VhbCBzdXBwb3J0LCBtYWtpbmcgaXQgYSBwb3dlcmZ1bCBhbmQgZmxleGlibGUgY2hvaWNlIGZvciBkZXZlbG9wZXJzIHNlZWtpbmcgYSBoaWdobHkgc3RlZXJhYmxlLCBpbnRlbGxpZ2VudCBtb2RlbC4iLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR3JvayIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiY29oZXJlL2NvbW1hbmQtcjdiLTEyLTIwMjQiLCJuYW1lIjoiQ29oZXJlOiBDb21tYW5kIFI3QiAoMTItMjAyNCkiLCJjcmVhdGVkIjoxNzM0MTU4MTUyLCJkZXNjcmlwdGlvbiI6IkNvbW1hbmQgUjdCICgxMi0yMDI0KSBpcyBhIHNtYWxsLCBmYXN0IHVwZGF0ZSBvZiB0aGUgQ29tbWFuZCBSKyBtb2RlbCwgZGVsaXZlcmVkIGluIERlY2VtYmVyIDIwMjQuIEl0IGV4Y2VscyBhdCBSQUcsIHRvb2wgdXNlLCBhZ2VudHMsIGFuZCBzaW1pbGFyIHRhc2tzIHJlcXVpcmluZyBjb21wbGV4IHJlYXNvbmluZyBhbmQgbXVsdGlwbGUgc3RlcHMuXG5cblVzZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gQ29oZXJlJ3MgW1VzYWdlIFBvbGljeV0oaHR0cHM6Ly9kb2NzLmNvaGVyZS5jb20vZG9jcy91c2FnZS1wb2xpY3kpIGFuZCBbU2FhUyBBZ3JlZW1lbnRdKGh0dHBzOi8vY29oZXJlLmNvbS9zYWFzLWFncmVlbWVudCkuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNvaGVyZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDM3NSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDE1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDAwMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Imdvb2dsZS9nZW1pbmktMi4wLWZsYXNoLWV4cDpmcmVlIiwibmFtZSI6Ikdvb2dsZTogR2VtaW5pIDIuMCBGbGFzaCBFeHBlcmltZW50YWwgKGZyZWUpIiwiY3JlYXRlZCI6MTczMzkzNzUyMywiZGVzY3JpcHRpb24iOiJHZW1pbmkgRmxhc2ggMi4wIG9mZmVycyBhIHNpZ25pZmljYW50bHkgZmFzdGVyIHRpbWUgdG8gZmlyc3QgdG9rZW4gKFRURlQpIGNvbXBhcmVkIHRvIFtHZW1pbmkgRmxhc2ggMS41XSgvZ29vZ2xlL2dlbWluaS1mbGFzaC0xLjUpLCB3aGlsZSBtYWludGFpbmluZyBxdWFsaXR5IG9uIHBhciB3aXRoIGxhcmdlciBtb2RlbHMgbGlrZSBbR2VtaW5pIFBybyAxLjVdKC9nb29nbGUvZ2VtaW5pLXByby0xLjUpLiBJdCBpbnRyb2R1Y2VzIG5vdGFibGUgZW5oYW5jZW1lbnRzIGluIG11bHRpbW9kYWwgdW5kZXJzdGFuZGluZywgY29kaW5nIGNhcGFiaWxpdGllcywgY29tcGxleCBpbnN0cnVjdGlvbiBmb2xsb3dpbmcsIGFuZCBmdW5jdGlvbiBjYWxsaW5nLiBUaGVzZSBhZHZhbmNlbWVudHMgY29tZSB0b2dldGhlciB0byBkZWxpdmVyIG1vcmUgc2VhbWxlc3MgYW5kIHJvYnVzdCBhZ2VudGljIGV4cGVyaWVuY2VzLiIsImNvbnRleHRfbGVuZ3RoIjoxMDQ4NTc2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEwNDg1NzYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtMy4zLTcwYi1pbnN0cnVjdDpmcmVlIiwibmFtZSI6Ik1ldGE6IExsYW1hIDMuMyA3MEIgSW5zdHJ1Y3QgKGZyZWUpIiwiY3JlYXRlZCI6MTczMzUwNjEzNywiZGVzY3JpcHRpb24iOiJUaGUgTWV0YSBMbGFtYSAzLjMgbXVsdGlsaW5ndWFsIGxhcmdlIGxhbmd1YWdlIG1vZGVsIChMTE0pIGlzIGEgcHJldHJhaW5lZCBhbmQgaW5zdHJ1Y3Rpb24gdHVuZWQgZ2VuZXJhdGl2ZSBtb2RlbCBpbiA3MEIgKHRleHQgaW4vdGV4dCBvdXQpLiBUaGUgTGxhbWEgMy4zIGluc3RydWN0aW9uIHR1bmVkIHRleHQgb25seSBtb2RlbCBpcyBvcHRpbWl6ZWQgZm9yIG11bHRpbGluZ3VhbCBkaWFsb2d1ZSB1c2UgY2FzZXMgYW5kIG91dHBlcmZvcm1zIG1hbnkgb2YgdGhlIGF2YWlsYWJsZSBvcGVuIHNvdXJjZSBhbmQgY2xvc2VkIGNoYXQgbW9kZWxzIG9uIGNvbW1vbiBpbmR1c3RyeSBiZW5jaG1hcmtzLlxuXG5TdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBFbmdsaXNoLCBHZXJtYW4sIEZyZW5jaCwgSXRhbGlhbiwgUG9ydHVndWVzZSwgSGluZGksIFNwYW5pc2gsIGFuZCBUaGFpLlxuXG5bTW9kZWwgQ2FyZF0oaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtbW9kZWxzL2Jsb2IvbWFpbi9tb2RlbHMvbGxhbWEzXzMvTU9ERUxfQ0FSRC5tZCkiLCJjb250ZXh0X2xlbmd0aCI6ODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJsbGFtYTMifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODAwMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtMy4zLTcwYi1pbnN0cnVjdCIsIm5hbWUiOiJNZXRhOiBMbGFtYSAzLjMgNzBCIEluc3RydWN0IiwiY3JlYXRlZCI6MTczMzUwNjEzNywiZGVzY3JpcHRpb24iOiJUaGUgTWV0YSBMbGFtYSAzLjMgbXVsdGlsaW5ndWFsIGxhcmdlIGxhbmd1YWdlIG1vZGVsIChMTE0pIGlzIGEgcHJldHJhaW5lZCBhbmQgaW5zdHJ1Y3Rpb24gdHVuZWQgZ2VuZXJhdGl2ZSBtb2RlbCBpbiA3MEIgKHRleHQgaW4vdGV4dCBvdXQpLiBUaGUgTGxhbWEgMy4zIGluc3RydWN0aW9uIHR1bmVkIHRleHQgb25seSBtb2RlbCBpcyBvcHRpbWl6ZWQgZm9yIG11bHRpbGluZ3VhbCBkaWFsb2d1ZSB1c2UgY2FzZXMgYW5kIG91dHBlcmZvcm1zIG1hbnkgb2YgdGhlIGF2YWlsYWJsZSBvcGVuIHNvdXJjZSBhbmQgY2xvc2VkIGNoYXQgbW9kZWxzIG9uIGNvbW1vbiBpbmR1c3RyeSBiZW5jaG1hcmtzLlxuXG5TdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBFbmdsaXNoLCBHZXJtYW4sIEZyZW5jaCwgSXRhbGlhbiwgUG9ydHVndWVzZSwgSGluZGksIFNwYW5pc2gsIGFuZCBUaGFpLlxuXG5bTW9kZWwgQ2FyZF0oaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtbW9kZWxzL2Jsb2IvbWFpbi9tb2RlbHMvbGxhbWEzXzMvTU9ERUxfQ0FSRC5tZCkiLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDI1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MTYzODQsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbWF6b24vbm92YS1saXRlLXYxIiwibmFtZSI6IkFtYXpvbjogTm92YSBMaXRlIDEuMCIsImNyZWF0ZWQiOjE3MzM0MzczNjMsImRlc2NyaXB0aW9uIjoiQW1hem9uIE5vdmEgTGl0ZSAxLjAgaXMgYSB2ZXJ5IGxvdy1jb3N0IG11bHRpbW9kYWwgbW9kZWwgZnJvbSBBbWF6b24gdGhhdCBmb2N1c2VkIG9uIGZhc3QgcHJvY2Vzc2luZyBvZiBpbWFnZSwgdmlkZW8sIGFuZCB0ZXh0IGlucHV0cyB0byBnZW5lcmF0ZSB0ZXh0IG91dHB1dC4gQW1hem9uIE5vdmEgTGl0ZSBjYW4gaGFuZGxlIHJlYWwtdGltZSBjdXN0b21lciBpbnRlcmFjdGlvbnMsIGRvY3VtZW50IGFuYWx5c2lzLCBhbmQgdmlzdWFsIHF1ZXN0aW9uLWFuc3dlcmluZyB0YXNrcyB3aXRoIGhpZ2ggYWNjdXJhY3kuXG5cbldpdGggYW4gaW5wdXQgY29udGV4dCBvZiAzMDBLIHRva2VucywgaXQgY2FuIGFuYWx5emUgbXVsdGlwbGUgaW1hZ2VzIG9yIHVwIHRvIDMwIG1pbnV0ZXMgb2YgdmlkZW8gaW4gYSBzaW5nbGUgaW5wdXQuIiwiY29udGV4dF9sZW5ndGgiOjMwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTm92YSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDYiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAyNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDA5Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjUxMjAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbWF6b24vbm92YS1taWNyby12MSIsIm5hbWUiOiJBbWF6b246IE5vdmEgTWljcm8gMS4wIiwiY3JlYXRlZCI6MTczMzQzNzIzNywiZGVzY3JpcHRpb24iOiJBbWF6b24gTm92YSBNaWNybyAxLjAgaXMgYSB0ZXh0LW9ubHkgbW9kZWwgdGhhdCBkZWxpdmVycyB0aGUgbG93ZXN0IGxhdGVuY3kgcmVzcG9uc2VzIGluIHRoZSBBbWF6b24gTm92YSBmYW1pbHkgb2YgbW9kZWxzIGF0IGEgdmVyeSBsb3cgY29zdC4gV2l0aCBhIGNvbnRleHQgbGVuZ3RoIG9mIDEyOEsgdG9rZW5zIGFuZCBvcHRpbWl6ZWQgZm9yIHNwZWVkIGFuZCBjb3N0LCBBbWF6b24gTm92YSBNaWNybyBleGNlbHMgYXQgdGFza3Mgc3VjaCBhcyB0ZXh0IHN1bW1hcml6YXRpb24sIHRyYW5zbGF0aW9uLCBjb250ZW50IGNsYXNzaWZpY2F0aW9uLCBpbnRlcmFjdGl2ZSBjaGF0LCBhbmQgYnJhaW5zdG9ybWluZy4gSXQgaGFzICBzaW1wbGUgbWF0aGVtYXRpY2FsIHJlYXNvbmluZyBhbmQgY29kaW5nIGFiaWxpdGllcy4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTm92YSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDM1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMTQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo1MTIwLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYW1hem9uL25vdmEtcHJvLXYxIiwibmFtZSI6IkFtYXpvbjogTm92YSBQcm8gMS4wIiwiY3JlYXRlZCI6MTczMzQzNjMwMywiZGVzY3JpcHRpb24iOiJBbWF6b24gTm92YSBQcm8gMS4wIGlzIGEgY2FwYWJsZSBtdWx0aW1vZGFsIG1vZGVsIGZyb20gQW1hem9uIGZvY3VzZWQgb24gcHJvdmlkaW5nIGEgY29tYmluYXRpb24gb2YgYWNjdXJhY3ksIHNwZWVkLCBhbmQgY29zdCBmb3IgYSB3aWRlIHJhbmdlIG9mIHRhc2tzLiBBcyBvZiBEZWNlbWJlciAyMDI0LCBpdCBhY2hpZXZlcyBzdGF0ZS1vZi10aGUtYXJ0IHBlcmZvcm1hbmNlIG9uIGtleSBiZW5jaG1hcmtzIGluY2x1ZGluZyB2aXN1YWwgcXVlc3Rpb24gYW5zd2VyaW5nIChUZXh0VlFBKSBhbmQgdmlkZW8gdW5kZXJzdGFuZGluZyAoVkFURVgpLlxuXG5BbWF6b24gTm92YSBQcm8gZGVtb25zdHJhdGVzIHN0cm9uZyBjYXBhYmlsaXRpZXMgaW4gcHJvY2Vzc2luZyBib3RoIHZpc3VhbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBhbmQgYXQgYW5hbHl6aW5nIGZpbmFuY2lhbCBkb2N1bWVudHMuXG5cbioqTk9URSoqOiBWaWRlbyBpbnB1dCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4iLCJjb250ZXh0X2xlbmd0aCI6MzAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJOb3ZhIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA4IiwiY29tcGxldGlvbiI6IjAuMDAwMDAzMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMTIiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NTEyMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdxLTMyYi1wcmV2aWV3OmZyZWUiLCJuYW1lIjoiUXdlbjogUXdRIDMyQiBQcmV2aWV3IChmcmVlKSIsImNyZWF0ZWQiOjE3MzI3NTQ1NDEsImRlc2NyaXB0aW9uIjoiUXdRLTMyQi1QcmV2aWV3IGlzIGFuIGV4cGVyaW1lbnRhbCByZXNlYXJjaCBtb2RlbCBmb2N1c2VkIG9uIEFJIHJlYXNvbmluZyBjYXBhYmlsaXRpZXMgZGV2ZWxvcGVkIGJ5IHRoZSBRd2VuIFRlYW0uIEFzIGEgcHJldmlldyByZWxlYXNlLCBpdCBkZW1vbnN0cmF0ZXMgcHJvbWlzaW5nIGFuYWx5dGljYWwgYWJpbGl0aWVzIHdoaWxlIGhhdmluZyBzZXZlcmFsIGltcG9ydGFudCBsaW1pdGF0aW9uczpcblxuMS4gKipMYW5ndWFnZSBNaXhpbmcgYW5kIENvZGUtU3dpdGNoaW5nKio6IFRoZSBtb2RlbCBtYXkgbWl4IGxhbmd1YWdlcyBvciBzd2l0Y2ggYmV0d2VlbiB0aGVtIHVuZXhwZWN0ZWRseSwgYWZmZWN0aW5nIHJlc3BvbnNlIGNsYXJpdHkuXG4yLiAqKlJlY3Vyc2l2ZSBSZWFzb25pbmcgTG9vcHMqKjogVGhlIG1vZGVsIG1heSBlbnRlciBjaXJjdWxhciByZWFzb25pbmcgcGF0dGVybnMsIGxlYWRpbmcgdG8gbGVuZ3RoeSByZXNwb25zZXMgd2l0aG91dCBhIGNvbmNsdXNpdmUgYW5zd2VyLlxuMy4gKipTYWZldHkgYW5kIEV0aGljYWwgQ29uc2lkZXJhdGlvbnMqKjogVGhlIG1vZGVsIHJlcXVpcmVzIGVuaGFuY2VkIHNhZmV0eSBtZWFzdXJlcyB0byBlbnN1cmUgcmVsaWFibGUgYW5kIHNlY3VyZSBwZXJmb3JtYW5jZSwgYW5kIHVzZXJzIHNob3VsZCBleGVyY2lzZSBjYXV0aW9uIHdoZW4gZGVwbG95aW5nIGl0LlxuNC4gKipQZXJmb3JtYW5jZSBhbmQgQmVuY2htYXJrIExpbWl0YXRpb25zKio6IFRoZSBtb2RlbCBleGNlbHMgaW4gbWF0aCBhbmQgY29kaW5nIGJ1dCBoYXMgcm9vbSBmb3IgaW1wcm92ZW1lbnQgaW4gb3RoZXIgYXJlYXMsIHN1Y2ggYXMgY29tbW9uIHNlbnNlIHJlYXNvbmluZyBhbmQgbnVhbmNlZCBsYW5ndWFnZSB1bmRlcnN0YW5kaW5nLlxuXG4iLCJjb250ZXh0X2xlbmd0aCI6MTYzODQsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJRd2VuIiwiaW5zdHJ1Y3RfdHlwZSI6ImRlZXBzZWVrLXIxIn0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicXdlbi9xd3EtMzJiLXByZXZpZXciLCJuYW1lIjoiUXdlbjogUXdRIDMyQiBQcmV2aWV3IiwiY3JlYXRlZCI6MTczMjc1NDU0MSwiZGVzY3JpcHRpb24iOiJRd1EtMzJCLVByZXZpZXcgaXMgYW4gZXhwZXJpbWVudGFsIHJlc2VhcmNoIG1vZGVsIGZvY3VzZWQgb24gQUkgcmVhc29uaW5nIGNhcGFiaWxpdGllcyBkZXZlbG9wZWQgYnkgdGhlIFF3ZW4gVGVhbS4gQXMgYSBwcmV2aWV3IHJlbGVhc2UsIGl0IGRlbW9uc3RyYXRlcyBwcm9taXNpbmcgYW5hbHl0aWNhbCBhYmlsaXRpZXMgd2hpbGUgaGF2aW5nIHNldmVyYWwgaW1wb3J0YW50IGxpbWl0YXRpb25zOlxuXG4xLiAqKkxhbmd1YWdlIE1peGluZyBhbmQgQ29kZS1Td2l0Y2hpbmcqKjogVGhlIG1vZGVsIG1heSBtaXggbGFuZ3VhZ2VzIG9yIHN3aXRjaCBiZXR3ZWVuIHRoZW0gdW5leHBlY3RlZGx5LCBhZmZlY3RpbmcgcmVzcG9uc2UgY2xhcml0eS5cbjIuICoqUmVjdXJzaXZlIFJlYXNvbmluZyBMb29wcyoqOiBUaGUgbW9kZWwgbWF5IGVudGVyIGNpcmN1bGFyIHJlYXNvbmluZyBwYXR0ZXJucywgbGVhZGluZyB0byBsZW5ndGh5IHJlc3BvbnNlcyB3aXRob3V0IGEgY29uY2x1c2l2ZSBhbnN3ZXIuXG4zLiAqKlNhZmV0eSBhbmQgRXRoaWNhbCBDb25zaWRlcmF0aW9ucyoqOiBUaGUgbW9kZWwgcmVxdWlyZXMgZW5oYW5jZWQgc2FmZXR5IG1lYXN1cmVzIHRvIGVuc3VyZSByZWxpYWJsZSBhbmQgc2VjdXJlIHBlcmZvcm1hbmNlLCBhbmQgdXNlcnMgc2hvdWxkIGV4ZXJjaXNlIGNhdXRpb24gd2hlbiBkZXBsb3lpbmcgaXQuXG40LiAqKlBlcmZvcm1hbmNlIGFuZCBCZW5jaG1hcmsgTGltaXRhdGlvbnMqKjogVGhlIG1vZGVsIGV4Y2VscyBpbiBtYXRoIGFuZCBjb2RpbmcgYnV0IGhhcyByb29tIGZvciBpbXByb3ZlbWVudCBpbiBvdGhlciBhcmVhcywgc3VjaCBhcyBjb21tb24gc2Vuc2UgcmVhc29uaW5nIGFuZCBudWFuY2VkIGxhbmd1YWdlIHVuZGVyc3RhbmRpbmcuXG5cbiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjoiZGVlcHNlZWstcjEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZ29vZ2xlL2xlYXJubG0tMS41LXByby1leHBlcmltZW50YWw6ZnJlZSIsIm5hbWUiOiJHb29nbGU6IExlYXJuTE0gMS41IFBybyBFeHBlcmltZW50YWwgKGZyZWUpIiwiY3JlYXRlZCI6MTczMjIxNjU1MSwiZGVzY3JpcHRpb24iOiJBbiBleHBlcmltZW50YWwgdmVyc2lvbiBvZiBbR2VtaW5pIDEuNSBQcm9dKC9nb29nbGUvZ2VtaW5pLXByby0xLjUpIGZyb20gR29vZ2xlLiIsImNvbnRleHRfbGVuZ3RoIjo0MDk2MCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR2VtaW5pIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo0MDk2MCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZXZhLXVuaXQtMDEvZXZhLXF3ZW4tMi41LTcyYiIsIm5hbWUiOiJFVkEgUXdlbjIuNSA3MkIiLCJjcmVhdGVkIjoxNzMyMjEwNjA2LCJkZXNjcmlwdGlvbiI6IkVWQSBRd2VuMi41IDcyQiBpcyBhIHJvbGVwbGF5IGFuZCBzdG9yeXdyaXRpbmcgc3BlY2lhbGlzdCBtb2RlbC4gSXQncyBhIGZ1bGwtcGFyYW1ldGVyIGZpbmV0dW5lIG9mIFF3ZW4yLjUtNzJCIG9uIG1peHR1cmUgb2Ygc3ludGhldGljIGFuZCBuYXR1cmFsIGRhdGEuXG5cbkl0IHVzZXMgQ2VsZXN0ZSA3MEIgMC4xIGRhdGEgbWl4dHVyZSwgZ3JlYXRseSBleHBhbmRpbmcgaXQgdG8gaW1wcm92ZSB2ZXJzYXRpbGl0eSwgY3JlYXRpdml0eSBhbmQgXCJmbGF2b3JcIiBvZiB0aGUgcmVzdWx0aW5nIG1vZGVsLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJRd2VuIiwiaW5zdHJ1Y3RfdHlwZSI6ImNoYXRtbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMzEwNzIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvZ3B0LTRvLTIwMjQtMTEtMjAiLCJuYW1lIjoiT3BlbkFJOiBHUFQtNG8gKDIwMjQtMTEtMjApIiwiY3JlYXRlZCI6MTczMjEyNzU5NCwiZGVzY3JpcHRpb24iOiJUaGUgMjAyNC0xMS0yMCB2ZXJzaW9uIG9mIEdQVC00byBvZmZlcnMgYSBsZXZlbGVkLXVwIGNyZWF0aXZlIHdyaXRpbmcgYWJpbGl0eSB3aXRoIG1vcmUgbmF0dXJhbCwgZW5nYWdpbmcsIGFuZCB0YWlsb3JlZCB3cml0aW5nIHRvIGltcHJvdmUgcmVsZXZhbmNlICYgcmVhZGFiaWxpdHkuIEl04oCZcyBhbHNvIGJldHRlciBhdCB3b3JraW5nIHdpdGggdXBsb2FkZWQgZmlsZXMsIHByb3ZpZGluZyBkZWVwZXIgaW5zaWdodHMgJiBtb3JlIHRob3JvdWdoIHJlc3BvbnNlcy5cblxuR1BULTRvIChcIm9cIiBmb3IgXCJvbW5pXCIpIGlzIE9wZW5BSSdzIGxhdGVzdCBBSSBtb2RlbCwgc3VwcG9ydGluZyBib3RoIHRleHQgYW5kIGltYWdlIGlucHV0cyB3aXRoIHRleHQgb3V0cHV0cy4gSXQgbWFpbnRhaW5zIHRoZSBpbnRlbGxpZ2VuY2UgbGV2ZWwgb2YgW0dQVC00IFR1cmJvXSgvbW9kZWxzL29wZW5haS9ncHQtNC10dXJibykgd2hpbGUgYmVpbmcgdHdpY2UgYXMgZmFzdCBhbmQgNTAlIG1vcmUgY29zdC1lZmZlY3RpdmUuIEdQVC00byBhbHNvIG9mZmVycyBpbXByb3ZlZCBwZXJmb3JtYW5jZSBpbiBwcm9jZXNzaW5nIG5vbi1FbmdsaXNoIGxhbmd1YWdlcyBhbmQgZW5oYW5jZWQgdmlzdWFsIGNhcGFiaWxpdGllcy4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMjUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMzYxMyIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwMTI1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjE2Mzg0LCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaXN0cmFsYWkvbWlzdHJhbC1sYXJnZS0yNDExIiwibmFtZSI6Ik1pc3RyYWwgTGFyZ2UgMjQxMSIsImNyZWF0ZWQiOjE3MzE5Nzg2ODUsImRlc2NyaXB0aW9uIjoiTWlzdHJhbCBMYXJnZSAyIDI0MTEgaXMgYW4gdXBkYXRlIG9mIFtNaXN0cmFsIExhcmdlIDJdKC9taXN0cmFsYWkvbWlzdHJhbC1sYXJnZSkgcmVsZWFzZWQgdG9nZXRoZXIgd2l0aCBbUGl4dHJhbCBMYXJnZSAyNDExXSgvbWlzdHJhbGFpL3BpeHRyYWwtbGFyZ2UtMjQxMSlcblxuSXQgcHJvdmlkZXMgYSBzaWduaWZpY2FudCB1cGdyYWRlIG9uIHRoZSBwcmV2aW91cyBbTWlzdHJhbCBMYXJnZSAyNC4wN10oL21pc3RyYWxhaS9taXN0cmFsLWxhcmdlLTI0MDcpLCB3aXRoIG5vdGFibGUgaW1wcm92ZW1lbnRzIGluIGxvbmcgY29udGV4dCB1bmRlcnN0YW5kaW5nLCBhIG5ldyBzeXN0ZW0gcHJvbXB0LCBhbmQgbW9yZSBhY2N1cmF0ZSBmdW5jdGlvbiBjYWxsaW5nLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWlzdHJhbGFpL21pc3RyYWwtbGFyZ2UtMjQwNyIsIm5hbWUiOiJNaXN0cmFsIExhcmdlIDI0MDciLCJjcmVhdGVkIjoxNzMxOTc4NDE1LCJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgTWlzdHJhbCBBSSdzIGZsYWdzaGlwIG1vZGVsLCBNaXN0cmFsIExhcmdlIDIgKHZlcnNpb24gbWlzdHJhbC1sYXJnZS0yNDA3KS4gSXQncyBhIHByb3ByaWV0YXJ5IHdlaWdodHMtYXZhaWxhYmxlIG1vZGVsIGFuZCBleGNlbHMgYXQgcmVhc29uaW5nLCBjb2RlLCBKU09OLCBjaGF0LCBhbmQgbW9yZS4gUmVhZCB0aGUgbGF1bmNoIGFubm91bmNlbWVudCBbaGVyZV0oaHR0cHM6Ly9taXN0cmFsLmFpL25ld3MvbWlzdHJhbC1sYXJnZS0yNDA3LykuXG5cbkl0IHN1cHBvcnRzIGRvemVucyBvZiBsYW5ndWFnZXMgaW5jbHVkaW5nIEZyZW5jaCwgR2VybWFuLCBTcGFuaXNoLCBJdGFsaWFuLCBQb3J0dWd1ZXNlLCBBcmFiaWMsIEhpbmRpLCBSdXNzaWFuLCBDaGluZXNlLCBKYXBhbmVzZSwgYW5kIEtvcmVhbiwgYWxvbmcgd2l0aCA4MCsgY29kaW5nIGxhbmd1YWdlcyBpbmNsdWRpbmcgUHl0aG9uLCBKYXZhLCBDLCBDKyssIEphdmFTY3JpcHQsIGFuZCBCYXNoLiBJdHMgbG9uZyBjb250ZXh0IHdpbmRvdyBhbGxvd3MgcHJlY2lzZSBpbmZvcm1hdGlvbiByZWNhbGwgZnJvbSBsYXJnZSBkb2N1bWVudHMuXG4iLCJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDA2IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pc3RyYWxhaS9waXh0cmFsLWxhcmdlLTI0MTEiLCJuYW1lIjoiTWlzdHJhbDogUGl4dHJhbCBMYXJnZSAyNDExIiwiY3JlYXRlZCI6MTczMTk3NzM4OCwiZGVzY3JpcHRpb24iOiJQaXh0cmFsIExhcmdlIGlzIGEgMTI0QiBwYXJhbWV0ZXIsIG9wZW4td2VpZ2h0LCBtdWx0aW1vZGFsIG1vZGVsIGJ1aWx0IG9uIHRvcCBvZiBbTWlzdHJhbCBMYXJnZSAyXSgvbWlzdHJhbGFpL21pc3RyYWwtbGFyZ2UtMjQxMSkuIFRoZSBtb2RlbCBpcyBhYmxlIHRvIHVuZGVyc3RhbmQgZG9jdW1lbnRzLCBjaGFydHMgYW5kIG5hdHVyYWwgaW1hZ2VzLlxuXG5UaGUgbW9kZWwgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBNaXN0cmFsIFJlc2VhcmNoIExpY2Vuc2UgKE1STCkgZm9yIHJlc2VhcmNoIGFuZCBlZHVjYXRpb25hbCB1c2UsIGFuZCB0aGUgTWlzdHJhbCBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIGV4cGVyaW1lbnRhdGlvbiwgdGVzdGluZywgYW5kIHByb2R1Y3Rpb24gZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMuXG5cbiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwNiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMjg4OCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoieC1haS9ncm9rLXZpc2lvbi1iZXRhIiwibmFtZSI6InhBSTogR3JvayBWaXNpb24gQmV0YSIsImNyZWF0ZWQiOjE3MzE5NzY2MjQsImRlc2NyaXB0aW9uIjoiR3JvayBWaXNpb24gQmV0YSBpcyB4QUkncyBleHBlcmltZW50YWwgbGFuZ3VhZ2UgbW9kZWwgd2l0aCB2aXNpb24gY2FwYWJpbGl0eS5cblxuIiwiY29udGV4dF9sZW5ndGgiOjgxOTIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ikdyb2siLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwNSIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwOSIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjgxOTIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImluZmVybWF0aWMvbW4taW5mZXJvci0xMmIiLCJuYW1lIjoiSW5mZXJtYXRpYzogTWlzdHJhbCBOZW1vIEluZmVyb3IgMTJCIiwiY3JlYXRlZCI6MTczMTQ2NDQyOCwiZGVzY3JpcHRpb24iOiJJbmZlcm9yIDEyQiBpcyBhIG1lcmdlIG9mIHRvcCByb2xlcGxheSBtb2RlbHMsIGV4cGVydCBvbiBpbW1lcnNpdmUgbmFycmF0aXZlcyBhbmQgc3Rvcnl0ZWxsaW5nLlxuXG5UaGlzIG1vZGVsIHdhcyBtZXJnZWQgdXNpbmcgdGhlIFtNb2RlbCBTdG9ja10oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzI0MDMuMTk1MjIpIG1lcmdlIG1ldGhvZCB1c2luZyBbYW50aHJhY2l0ZS1vcmcvbWFnbnVtLXY0LTEyYl0oaHR0cHM6Ly9vcGVucm91dGVyLmFpL2FudGhyYWNpdGUtb3JnL21hZ251bS12NC03MmIpIGFzIGEgYmFzZS5cbiIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjoibWlzdHJhbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjE2Mzg0LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3ZW4tMi41LWNvZGVyLTMyYi1pbnN0cnVjdDpmcmVlIiwibmFtZSI6IlF3ZW4yLjUgQ29kZXIgMzJCIEluc3RydWN0IChmcmVlKSIsImNyZWF0ZWQiOjE3MzEzNjg0MDAsImRlc2NyaXB0aW9uIjoiUXdlbjIuNS1Db2RlciBpcyB0aGUgbGF0ZXN0IHNlcmllcyBvZiBDb2RlLVNwZWNpZmljIFF3ZW4gbGFyZ2UgbGFuZ3VhZ2UgbW9kZWxzIChmb3JtZXJseSBrbm93biBhcyBDb2RlUXdlbikuIFF3ZW4yLjUtQ29kZXIgYnJpbmdzIHRoZSBmb2xsb3dpbmcgaW1wcm92ZW1lbnRzIHVwb24gQ29kZVF3ZW4xLjU6XG5cbi0gU2lnbmlmaWNhbnRseSBpbXByb3ZlbWVudHMgaW4gKipjb2RlIGdlbmVyYXRpb24qKiwgKipjb2RlIHJlYXNvbmluZyoqIGFuZCAqKmNvZGUgZml4aW5nKiouIFxuLSBBIG1vcmUgY29tcHJlaGVuc2l2ZSBmb3VuZGF0aW9uIGZvciByZWFsLXdvcmxkIGFwcGxpY2F0aW9ucyBzdWNoIGFzICoqQ29kZSBBZ2VudHMqKi4gTm90IG9ubHkgZW5oYW5jaW5nIGNvZGluZyBjYXBhYmlsaXRpZXMgYnV0IGFsc28gbWFpbnRhaW5pbmcgaXRzIHN0cmVuZ3RocyBpbiBtYXRoZW1hdGljcyBhbmQgZ2VuZXJhbCBjb21wZXRlbmNpZXMuXG5cblRvIHJlYWQgbW9yZSBhYm91dCBpdHMgZXZhbHVhdGlvbiByZXN1bHRzLCBjaGVjayBvdXQgW1F3ZW4gMi41IENvZGVyJ3MgYmxvZ10oaHR0cHM6Ly9xd2VubG0uZ2l0aHViLmlvL2Jsb2cvcXdlbjIuNS1jb2Rlci1mYW1pbHkvKS4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJRd2VuIiwiaW5zdHJ1Y3RfdHlwZSI6ImNoYXRtbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdlbi0yLjUtY29kZXItMzJiLWluc3RydWN0IiwibmFtZSI6IlF3ZW4yLjUgQ29kZXIgMzJCIEluc3RydWN0IiwiY3JlYXRlZCI6MTczMTM2ODQwMCwiZGVzY3JpcHRpb24iOiJRd2VuMi41LUNvZGVyIGlzIHRoZSBsYXRlc3Qgc2VyaWVzIG9mIENvZGUtU3BlY2lmaWMgUXdlbiBsYXJnZSBsYW5ndWFnZSBtb2RlbHMgKGZvcm1lcmx5IGtub3duIGFzIENvZGVRd2VuKS4gUXdlbjIuNS1Db2RlciBicmluZ3MgdGhlIGZvbGxvd2luZyBpbXByb3ZlbWVudHMgdXBvbiBDb2RlUXdlbjEuNTpcblxuLSBTaWduaWZpY2FudGx5IGltcHJvdmVtZW50cyBpbiAqKmNvZGUgZ2VuZXJhdGlvbioqLCAqKmNvZGUgcmVhc29uaW5nKiogYW5kICoqY29kZSBmaXhpbmcqKi4gXG4tIEEgbW9yZSBjb21wcmVoZW5zaXZlIGZvdW5kYXRpb24gZm9yIHJlYWwtd29ybGQgYXBwbGljYXRpb25zIHN1Y2ggYXMgKipDb2RlIEFnZW50cyoqLiBOb3Qgb25seSBlbmhhbmNpbmcgY29kaW5nIGNhcGFiaWxpdGllcyBidXQgYWxzbyBtYWludGFpbmluZyBpdHMgc3RyZW5ndGhzIGluIG1hdGhlbWF0aWNzIGFuZCBnZW5lcmFsIGNvbXBldGVuY2llcy5cblxuVG8gcmVhZCBtb3JlIGFib3V0IGl0cyBldmFsdWF0aW9uIHJlc3VsdHMsIGNoZWNrIG91dCBbUXdlbiAyLjUgQ29kZXIncyBibG9nXShodHRwczovL3F3ZW5sbS5naXRodWIuaW8vYmxvZy9xd2VuMi41LWNvZGVyLWZhbWlseS8pLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwNyIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDE1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicmFpZmxlL3NvcmNlcmVybG0tOHgyMmIiLCJuYW1lIjoiU29yY2VyZXJMTSA4eDIyQiIsImNyZWF0ZWQiOjE3MzExMDUwODMsImRlc2NyaXB0aW9uIjoiU29yY2VyZXJMTSBpcyBhbiBhZHZhbmNlZCBSUCBhbmQgc3Rvcnl0ZWxsaW5nIG1vZGVsLCBidWlsdCBhcyBhIExvdy1yYW5rIDE2LWJpdCBMb1JBIGZpbmUtdHVuZWQgb24gW1dpemFyZExNLTIgOHgyMkJdKC9taWNyb3NvZnQvd2l6YXJkbG0tMi04eDIyYikuXG5cbi0gQWR2YW5jZWQgcmVhc29uaW5nIGFuZCBlbW90aW9uYWwgaW50ZWxsaWdlbmNlIGZvciBlbmdhZ2luZyBhbmQgaW1tZXJzaXZlIGludGVyYWN0aW9uc1xuLSBWaXZpZCB3cml0aW5nIGNhcGFiaWxpdGllcyBlbnJpY2hlZCB3aXRoIHNwYXRpYWwgYW5kIGNvbnRleHR1YWwgYXdhcmVuZXNzXG4tIEVuaGFuY2VkIG5hcnJhdGl2ZSBkZXB0aCwgcHJvbW90aW5nIGNyZWF0aXZlIGFuZCBkeW5hbWljIHN0b3J5dGVsbGluZyIsImNvbnRleHRfbGVuZ3RoIjoxNjAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjoidmljdW5hIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDQ1IiwiY29tcGxldGlvbiI6IjAuMDAwMDA0NSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImV2YS11bml0LTAxL2V2YS1xd2VuLTIuNS0zMmIiLCJuYW1lIjoiRVZBIFF3ZW4yLjUgMzJCIiwiY3JlYXRlZCI6MTczMTEwNDg0NywiZGVzY3JpcHRpb24iOiJFVkEgUXdlbjIuNSAzMkIgaXMgYSByb2xlcGxheWluZy9zdG9yeXdyaXRpbmcgc3BlY2lhbGlzdCBtb2RlbC4gSXQncyBhIGZ1bGwtcGFyYW1ldGVyIGZpbmV0dW5lIG9mIFF3ZW4yLjUtMzJCIG9uIG1peHR1cmUgb2Ygc3ludGhldGljIGFuZCBuYXR1cmFsIGRhdGEuXG5cbkl0IHVzZXMgQ2VsZXN0ZSA3MEIgMC4xIGRhdGEgbWl4dHVyZSwgZ3JlYXRseSBleHBhbmRpbmcgaXQgdG8gaW1wcm92ZSB2ZXJzYXRpbGl0eSwgY3JlYXRpdml0eSBhbmQgXCJmbGF2b3JcIiBvZiB0aGUgcmVzdWx0aW5nIG1vZGVsLiIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDI2IiwiY29tcGxldGlvbiI6IjAuMDAwMDAzNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODQsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InRoZWRydW1tZXIvdW5zbG9wbmVtby0xMmIiLCJuYW1lIjoiVW5zbG9wbmVtbyAxMkIiLCJjcmVhdGVkIjoxNzMxMTAzNDQ4LCJkZXNjcmlwdGlvbiI6IlVuc2xvcE5lbW8gdjQuMSBpcyB0aGUgbGF0ZXN0IGFkZGl0aW9uIGZyb20gdGhlIGNyZWF0b3Igb2YgUm9jaW5hbnRlLCBkZXNpZ25lZCBmb3IgYWR2ZW50dXJlIHdyaXRpbmcgYW5kIHJvbGUtcGxheSBzY2VuYXJpb3MuIiwiY29udGV4dF9sZW5ndGgiOjMyMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOiJtaXN0cmFsIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzIwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFudGhyb3BpYy9jbGF1ZGUtMy41LWhhaWt1OmJldGEiLCJuYW1lIjoiQW50aHJvcGljOiBDbGF1ZGUgMy41IEhhaWt1IChzZWxmLW1vZGVyYXRlZCkiLCJjcmVhdGVkIjoxNzMwNjc4NDAwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzLjUgSGFpa3UgZmVhdHVyZXMgb2ZmZXJzIGVuaGFuY2VkIGNhcGFiaWxpdGllcyBpbiBzcGVlZCwgY29kaW5nIGFjY3VyYWN5LCBhbmQgdG9vbCB1c2UuIEVuZ2luZWVyZWQgdG8gZXhjZWwgaW4gcmVhbC10aW1lIGFwcGxpY2F0aW9ucywgaXQgZGVsaXZlcnMgcXVpY2sgcmVzcG9uc2UgdGltZXMgdGhhdCBhcmUgZXNzZW50aWFsIGZvciBkeW5hbWljIHRhc2tzIHN1Y2ggYXMgY2hhdCBpbnRlcmFjdGlvbnMgYW5kIGltbWVkaWF0ZSBjb2Rpbmcgc3VnZ2VzdGlvbnMuXG5cblRoaXMgbWFrZXMgaXQgaGlnaGx5IHN1aXRhYmxlIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkZW1hbmQgYm90aCBzcGVlZCBhbmQgcHJlY2lzaW9uLCBzdWNoIGFzIHNvZnR3YXJlIGRldmVsb3BtZW50LCBjdXN0b21lciBzZXJ2aWNlIGJvdHMsIGFuZCBkYXRhIG1hbmFnZW1lbnQgc3lzdGVtcy5cblxuVGhpcyBtb2RlbCBpcyBjdXJyZW50bHkgcG9pbnRpbmcgdG8gW0NsYXVkZSAzLjUgSGFpa3UgKDIwMjQtMTAtMjIpXSgvYW50aHJvcGljL2NsYXVkZS0zLTUtaGFpa3UtMjAyNDEwMjIpLiIsImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNsYXVkZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIiwiaW5wdXRfY2FjaGVfcmVhZCI6IjAuMDAwMDAwMDgiLCJpbnB1dF9jYWNoZV93cml0ZSI6IjAuMDAwMDAxIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTMuNS1oYWlrdSIsIm5hbWUiOiJBbnRocm9waWM6IENsYXVkZSAzLjUgSGFpa3UiLCJjcmVhdGVkIjoxNzMwNjc4NDAwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzLjUgSGFpa3UgZmVhdHVyZXMgb2ZmZXJzIGVuaGFuY2VkIGNhcGFiaWxpdGllcyBpbiBzcGVlZCwgY29kaW5nIGFjY3VyYWN5LCBhbmQgdG9vbCB1c2UuIEVuZ2luZWVyZWQgdG8gZXhjZWwgaW4gcmVhbC10aW1lIGFwcGxpY2F0aW9ucywgaXQgZGVsaXZlcnMgcXVpY2sgcmVzcG9uc2UgdGltZXMgdGhhdCBhcmUgZXNzZW50aWFsIGZvciBkeW5hbWljIHRhc2tzIHN1Y2ggYXMgY2hhdCBpbnRlcmFjdGlvbnMgYW5kIGltbWVkaWF0ZSBjb2Rpbmcgc3VnZ2VzdGlvbnMuXG5cblRoaXMgbWFrZXMgaXQgaGlnaGx5IHN1aXRhYmxlIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkZW1hbmQgYm90aCBzcGVlZCBhbmQgcHJlY2lzaW9uLCBzdWNoIGFzIHNvZnR3YXJlIGRldmVsb3BtZW50LCBjdXN0b21lciBzZXJ2aWNlIGJvdHMsIGFuZCBkYXRhIG1hbmFnZW1lbnQgc3lzdGVtcy5cblxuVGhpcyBtb2RlbCBpcyBjdXJyZW50bHkgcG9pbnRpbmcgdG8gW0NsYXVkZSAzLjUgSGFpa3UgKDIwMjQtMTAtMjIpXSgvYW50aHJvcGljL2NsYXVkZS0zLTUtaGFpa3UtMjAyNDEwMjIpLiIsImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNsYXVkZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIiwiaW5wdXRfY2FjaGVfcmVhZCI6IjAuMDAwMDAwMDgiLCJpbnB1dF9jYWNoZV93cml0ZSI6IjAuMDAwMDAxIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFudGhyb3BpYy9jbGF1ZGUtMy41LWhhaWt1LTIwMjQxMDIyOmJldGEiLCJuYW1lIjoiQW50aHJvcGljOiBDbGF1ZGUgMy41IEhhaWt1ICgyMDI0LTEwLTIyKSAoc2VsZi1tb2RlcmF0ZWQpIiwiY3JlYXRlZCI6MTczMDY3ODQwMCwiZGVzY3JpcHRpb24iOiJDbGF1ZGUgMy41IEhhaWt1IGZlYXR1cmVzIGVuaGFuY2VtZW50cyBhY3Jvc3MgYWxsIHNraWxsIHNldHMgaW5jbHVkaW5nIGNvZGluZywgdG9vbCB1c2UsIGFuZCByZWFzb25pbmcuIEFzIHRoZSBmYXN0ZXN0IG1vZGVsIGluIHRoZSBBbnRocm9waWMgbGluZXVwLCBpdCBvZmZlcnMgcmFwaWQgcmVzcG9uc2UgdGltZXMgc3VpdGFibGUgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgaGlnaCBpbnRlcmFjdGl2aXR5IGFuZCBsb3cgbGF0ZW5jeSwgc3VjaCBhcyB1c2VyLWZhY2luZyBjaGF0Ym90cyBhbmQgb24tdGhlLWZseSBjb2RlIGNvbXBsZXRpb25zLiBJdCBhbHNvIGV4Y2VscyBpbiBzcGVjaWFsaXplZCB0YXNrcyBsaWtlIGRhdGEgZXh0cmFjdGlvbiBhbmQgcmVhbC10aW1lIGNvbnRlbnQgbW9kZXJhdGlvbiwgbWFraW5nIGl0IGEgdmVyc2F0aWxlIHRvb2wgZm9yIGEgYnJvYWQgcmFuZ2Ugb2YgaW5kdXN0cmllcy5cblxuSXQgZG9lcyBub3Qgc3VwcG9ydCBpbWFnZSBpbnB1dHMuXG5cblNlZSB0aGUgbGF1bmNoIGFubm91bmNlbWVudCBhbmQgYmVuY2htYXJrIHJlc3VsdHMgW2hlcmVdKGh0dHBzOi8vd3d3LmFudGhyb3BpYy5jb20vbmV3cy8zLTUtbW9kZWxzLWFuZC1jb21wdXRlci11c2UpIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ2xhdWRlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA4IiwiY29tcGxldGlvbiI6IjAuMDAwMDA0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAwOCIsImlucHV0X2NhY2hlX3dyaXRlIjoiMC4wMDAwMDEifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFudGhyb3BpYy9jbGF1ZGUtMy41LWhhaWt1LTIwMjQxMDIyIiwibmFtZSI6IkFudGhyb3BpYzogQ2xhdWRlIDMuNSBIYWlrdSAoMjAyNC0xMC0yMikiLCJjcmVhdGVkIjoxNzMwNjc4NDAwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzLjUgSGFpa3UgZmVhdHVyZXMgZW5oYW5jZW1lbnRzIGFjcm9zcyBhbGwgc2tpbGwgc2V0cyBpbmNsdWRpbmcgY29kaW5nLCB0b29sIHVzZSwgYW5kIHJlYXNvbmluZy4gQXMgdGhlIGZhc3Rlc3QgbW9kZWwgaW4gdGhlIEFudGhyb3BpYyBsaW5ldXAsIGl0IG9mZmVycyByYXBpZCByZXNwb25zZSB0aW1lcyBzdWl0YWJsZSBmb3IgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBoaWdoIGludGVyYWN0aXZpdHkgYW5kIGxvdyBsYXRlbmN5LCBzdWNoIGFzIHVzZXItZmFjaW5nIGNoYXRib3RzIGFuZCBvbi10aGUtZmx5IGNvZGUgY29tcGxldGlvbnMuIEl0IGFsc28gZXhjZWxzIGluIHNwZWNpYWxpemVkIHRhc2tzIGxpa2UgZGF0YSBleHRyYWN0aW9uIGFuZCByZWFsLXRpbWUgY29udGVudCBtb2RlcmF0aW9uLCBtYWtpbmcgaXQgYSB2ZXJzYXRpbGUgdG9vbCBmb3IgYSBicm9hZCByYW5nZSBvZiBpbmR1c3RyaWVzLlxuXG5JdCBkb2VzIG5vdCBzdXBwb3J0IGltYWdlIGlucHV0cy5cblxuU2VlIHRoZSBsYXVuY2ggYW5ub3VuY2VtZW50IGFuZCBiZW5jaG1hcmsgcmVzdWx0cyBbaGVyZV0oaHR0cHM6Ly93d3cuYW50aHJvcGljLmNvbS9uZXdzLzMtNS1tb2RlbHMtYW5kLWNvbXB1dGVyLXVzZSkiLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDgiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwMDA4IiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAwMSJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJuZXZlcnNsZWVwL2xsYW1hLTMuMS1sdW1pbWFpZC03MGIiLCJuYW1lIjoiTmV2ZXJTbGVlcDogTHVtaW1haWQgdjAuMiA3MEIiLCJjcmVhdGVkIjoxNzI5NTU1MjAwLCJkZXNjcmlwdGlvbiI6Ikx1bWltYWlkIHYwLjIgNzBCIGlzIGEgZmluZXR1bmUgb2YgW0xsYW1hIDMuMSA3MEJdKC9tZXRhLWxsYW1hL2xsYW1hLTMuMS03MGItaW5zdHJ1Y3QpIHdpdGggYSBcIkhVR0Ugc3RlcCB1cCBkYXRhc2V0IHdpc2VcIiBjb21wYXJlZCB0byBMdW1pbWFpZCB2MC4xLiBTbG9wcHkgY2hhdHMgb3V0cHV0IHdlcmUgcHVyZ2VkLlxuXG5Vc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW01ldGEncyBBY2NlcHRhYmxlIFVzZSBQb2xpY3ldKGh0dHBzOi8vbGxhbWEubWV0YS5jb20vbGxhbWEzL3VzZS1wb2xpY3kvKS4iLCJjb250ZXh0X2xlbmd0aCI6MTYzODQsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDE1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAyMjUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjE2Mzg0LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjIwNDgsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocmFjaXRlLW9yZy9tYWdudW0tdjQtNzJiIiwibmFtZSI6Ik1hZ251bSB2NCA3MkIiLCJjcmVhdGVkIjoxNzI5NTU1MjAwLCJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSBzZXJpZXMgb2YgbW9kZWxzIGRlc2lnbmVkIHRvIHJlcGxpY2F0ZSB0aGUgcHJvc2UgcXVhbGl0eSBvZiB0aGUgQ2xhdWRlIDMgbW9kZWxzLCBzcGVjaWZpY2FsbHkgU29ubmV0KGh0dHBzOi8vb3BlbnJvdXRlci5haS9hbnRocm9waWMvY2xhdWRlLTMuNS1zb25uZXQpIGFuZCBPcHVzKGh0dHBzOi8vb3BlbnJvdXRlci5haS9hbnRocm9waWMvY2xhdWRlLTMtb3B1cykuXG5cblRoZSBtb2RlbCBpcyBmaW5lLXR1bmVkIG9uIHRvcCBvZiBbUXdlbjIuNSA3MkJdKGh0dHBzOi8vb3BlbnJvdXRlci5haS9xd2VuL3F3ZW4tMi41LTcyYi1pbnN0cnVjdCkuIiwiY29udGV4dF9sZW5ndGgiOjE2Mzg0LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOiJjaGF0bWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMTUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDIyNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODQsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MTAyNCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFudGhyb3BpYy9jbGF1ZGUtMy41LXNvbm5ldDpiZXRhIiwibmFtZSI6IkFudGhyb3BpYzogQ2xhdWRlIDMuNSBTb25uZXQgKHNlbGYtbW9kZXJhdGVkKSIsImNyZWF0ZWQiOjE3Mjk1NTUyMDAsImRlc2NyaXB0aW9uIjoiTmV3IENsYXVkZSAzLjUgU29ubmV0IGRlbGl2ZXJzIGJldHRlci10aGFuLU9wdXMgY2FwYWJpbGl0aWVzLCBmYXN0ZXItdGhhbi1Tb25uZXQgc3BlZWRzLCBhdCB0aGUgc2FtZSBTb25uZXQgcHJpY2VzLiBTb25uZXQgaXMgcGFydGljdWxhcmx5IGdvb2QgYXQ6XG5cbi0gQ29kaW5nOiBTY29yZXMgfjQ5JSBvbiBTV0UtQmVuY2ggVmVyaWZpZWQsIGhpZ2hlciB0aGFuIHRoZSBsYXN0IGJlc3Qgc2NvcmUsIGFuZCB3aXRob3V0IGFueSBmYW5jeSBwcm9tcHQgc2NhZmZvbGRpbmdcbi0gRGF0YSBzY2llbmNlOiBBdWdtZW50cyBodW1hbiBkYXRhIHNjaWVuY2UgZXhwZXJ0aXNlOyBuYXZpZ2F0ZXMgdW5zdHJ1Y3R1cmVkIGRhdGEgd2hpbGUgdXNpbmcgbXVsdGlwbGUgdG9vbHMgZm9yIGluc2lnaHRzXG4tIFZpc3VhbCBwcm9jZXNzaW5nOiBleGNlbGxpbmcgYXQgaW50ZXJwcmV0aW5nIGNoYXJ0cywgZ3JhcGhzLCBhbmQgaW1hZ2VzLCBhY2N1cmF0ZWx5IHRyYW5zY3JpYmluZyB0ZXh0IHRvIGRlcml2ZSBpbnNpZ2h0cyBiZXlvbmQganVzdCB0aGUgdGV4dCBhbG9uZVxuLSBBZ2VudGljIHRhc2tzOiBleGNlcHRpb25hbCB0b29sIHVzZSwgbWFraW5nIGl0IGdyZWF0IGF0IGFnZW50aWMgdGFza3MgKGkuZS4gY29tcGxleCwgbXVsdGktc3RlcCBwcm9ibGVtIHNvbHZpbmcgdGFza3MgdGhhdCByZXF1aXJlIGVuZ2FnaW5nIHdpdGggb3RoZXIgc3lzdGVtcylcblxuI211bHRpbW9kYWwiLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwNDgiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAzIiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAwMzc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTMuNS1zb25uZXQiLCJuYW1lIjoiQW50aHJvcGljOiBDbGF1ZGUgMy41IFNvbm5ldCIsImNyZWF0ZWQiOjE3Mjk1NTUyMDAsImRlc2NyaXB0aW9uIjoiTmV3IENsYXVkZSAzLjUgU29ubmV0IGRlbGl2ZXJzIGJldHRlci10aGFuLU9wdXMgY2FwYWJpbGl0aWVzLCBmYXN0ZXItdGhhbi1Tb25uZXQgc3BlZWRzLCBhdCB0aGUgc2FtZSBTb25uZXQgcHJpY2VzLiBTb25uZXQgaXMgcGFydGljdWxhcmx5IGdvb2QgYXQ6XG5cbi0gQ29kaW5nOiBTY29yZXMgfjQ5JSBvbiBTV0UtQmVuY2ggVmVyaWZpZWQsIGhpZ2hlciB0aGFuIHRoZSBsYXN0IGJlc3Qgc2NvcmUsIGFuZCB3aXRob3V0IGFueSBmYW5jeSBwcm9tcHQgc2NhZmZvbGRpbmdcbi0gRGF0YSBzY2llbmNlOiBBdWdtZW50cyBodW1hbiBkYXRhIHNjaWVuY2UgZXhwZXJ0aXNlOyBuYXZpZ2F0ZXMgdW5zdHJ1Y3R1cmVkIGRhdGEgd2hpbGUgdXNpbmcgbXVsdGlwbGUgdG9vbHMgZm9yIGluc2lnaHRzXG4tIFZpc3VhbCBwcm9jZXNzaW5nOiBleGNlbGxpbmcgYXQgaW50ZXJwcmV0aW5nIGNoYXJ0cywgZ3JhcGhzLCBhbmQgaW1hZ2VzLCBhY2N1cmF0ZWx5IHRyYW5zY3JpYmluZyB0ZXh0IHRvIGRlcml2ZSBpbnNpZ2h0cyBiZXlvbmQganVzdCB0aGUgdGV4dCBhbG9uZVxuLSBBZ2VudGljIHRhc2tzOiBleGNlcHRpb25hbCB0b29sIHVzZSwgbWFraW5nIGl0IGdyZWF0IGF0IGFnZW50aWMgdGFza3MgKGkuZS4gY29tcGxleCwgbXVsdGktc3RlcCBwcm9ibGVtIHNvbHZpbmcgdGFza3MgdGhhdCByZXF1aXJlIGVuZ2FnaW5nIHdpdGggb3RoZXIgc3lzdGVtcylcblxuI211bHRpbW9kYWwiLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwNDgiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAzIiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAwMzc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6IngtYWkvZ3Jvay1iZXRhIiwibmFtZSI6InhBSTogR3JvayBCZXRhIiwiY3JlYXRlZCI6MTcyOTM4MjQwMCwiZGVzY3JpcHRpb24iOiJHcm9rIEJldGEgaXMgeEFJJ3MgZXhwZXJpbWVudGFsIGxhbmd1YWdlIG1vZGVsIHdpdGggc3RhdGUtb2YtdGhlLWFydCByZWFzb25pbmcgY2FwYWJpbGl0aWVzLCBiZXN0IGZvciBjb21wbGV4IGFuZCBtdWx0aS1zdGVwIHVzZSBjYXNlcy5cblxuSXQgaXMgdGhlIHN1Y2Nlc3NvciBvZiBbR3JvayAyXShodHRwczovL3guYWkvYmxvZy9ncm9rLTIpIHdpdGggZW5oYW5jZWQgY29udGV4dCBsZW5ndGguIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ikdyb2siLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwNSIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaXN0cmFsYWkvbWluaXN0cmFsLThiIiwibmFtZSI6Ik1pc3RyYWw6IE1pbmlzdHJhbCA4QiIsImNyZWF0ZWQiOjE3MjkxMjMyMDAsImRlc2NyaXB0aW9uIjoiTWluaXN0cmFsIDhCIGlzIGFuIDhCIHBhcmFtZXRlciBtb2RlbCBmZWF0dXJpbmcgYSB1bmlxdWUgaW50ZXJsZWF2ZWQgc2xpZGluZy13aW5kb3cgYXR0ZW50aW9uIHBhdHRlcm4gZm9yIGZhc3RlciwgbWVtb3J5LWVmZmljaWVudCBpbmZlcmVuY2UuIERlc2lnbmVkIGZvciBlZGdlIHVzZSBjYXNlcywgaXQgc3VwcG9ydHMgdXAgdG8gMTI4ayBjb250ZXh0IGxlbmd0aCBhbmQgZXhjZWxzIGluIGtub3dsZWRnZSBhbmQgcmVhc29uaW5nIHRhc2tzLiBJdCBvdXRwZXJmb3JtcyBwZWVycyBpbiB0aGUgc3ViLTEwQiBjYXRlZ29yeSwgbWFraW5nIGl0IHBlcmZlY3QgZm9yIGxvdy1sYXRlbmN5LCBwcml2YWN5LWZpcnN0IGFwcGxpY2F0aW9ucy4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWlzdHJhbGFpL21pbmlzdHJhbC0zYiIsIm5hbWUiOiJNaXN0cmFsOiBNaW5pc3RyYWwgM0IiLCJjcmVhdGVkIjoxNzI5MTIzMjAwLCJkZXNjcmlwdGlvbiI6Ik1pbmlzdHJhbCAzQiBpcyBhIDNCIHBhcmFtZXRlciBtb2RlbCBvcHRpbWl6ZWQgZm9yIG9uLWRldmljZSBhbmQgZWRnZSBjb21wdXRpbmcuIEl0IGV4Y2VscyBpbiBrbm93bGVkZ2UsIGNvbW1vbnNlbnNlIHJlYXNvbmluZywgYW5kIGZ1bmN0aW9uLWNhbGxpbmcsIG91dHBlcmZvcm1pbmcgbGFyZ2VyIG1vZGVscyBsaWtlIE1pc3RyYWwgN0Igb24gbW9zdCBiZW5jaG1hcmtzLiBTdXBwb3J0aW5nIHVwIHRvIDEyOGsgY29udGV4dCBsZW5ndGgsIGl04oCZcyBpZGVhbCBmb3Igb3JjaGVzdHJhdGluZyBhZ2VudGljIHdvcmtmbG93cyBhbmQgc3BlY2lhbGlzdCB0YXNrcyB3aXRoIGVmZmljaWVudCBpbmZlcmVuY2UuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDA0IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMDQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicXdlbi9xd2VuLTIuNS03Yi1pbnN0cnVjdDpmcmVlIiwibmFtZSI6IlF3ZW4yLjUgN0IgSW5zdHJ1Y3QgKGZyZWUpIiwiY3JlYXRlZCI6MTcyOTAzNjgwMCwiZGVzY3JpcHRpb24iOiJRd2VuMi41IDdCIGlzIHRoZSBsYXRlc3Qgc2VyaWVzIG9mIFF3ZW4gbGFyZ2UgbGFuZ3VhZ2UgbW9kZWxzLiBRd2VuMi41IGJyaW5ncyB0aGUgZm9sbG93aW5nIGltcHJvdmVtZW50cyB1cG9uIFF3ZW4yOlxuXG4tIFNpZ25pZmljYW50bHkgbW9yZSBrbm93bGVkZ2UgYW5kIGhhcyBncmVhdGx5IGltcHJvdmVkIGNhcGFiaWxpdGllcyBpbiBjb2RpbmcgYW5kIG1hdGhlbWF0aWNzLCB0aGFua3MgdG8gb3VyIHNwZWNpYWxpemVkIGV4cGVydCBtb2RlbHMgaW4gdGhlc2UgZG9tYWlucy5cblxuLSBTaWduaWZpY2FudCBpbXByb3ZlbWVudHMgaW4gaW5zdHJ1Y3Rpb24gZm9sbG93aW5nLCBnZW5lcmF0aW5nIGxvbmcgdGV4dHMgKG92ZXIgOEsgdG9rZW5zKSwgdW5kZXJzdGFuZGluZyBzdHJ1Y3R1cmVkIGRhdGEgKGUuZywgdGFibGVzKSwgYW5kIGdlbmVyYXRpbmcgc3RydWN0dXJlZCBvdXRwdXRzIGVzcGVjaWFsbHkgSlNPTi4gTW9yZSByZXNpbGllbnQgdG8gdGhlIGRpdmVyc2l0eSBvZiBzeXN0ZW0gcHJvbXB0cywgZW5oYW5jaW5nIHJvbGUtcGxheSBpbXBsZW1lbnRhdGlvbiBhbmQgY29uZGl0aW9uLXNldHRpbmcgZm9yIGNoYXRib3RzLlxuXG4tIExvbmctY29udGV4dCBTdXBwb3J0IHVwIHRvIDEyOEsgdG9rZW5zIGFuZCBjYW4gZ2VuZXJhdGUgdXAgdG8gOEsgdG9rZW5zLlxuXG4tIE11bHRpbGluZ3VhbCBzdXBwb3J0IGZvciBvdmVyIDI5IGxhbmd1YWdlcywgaW5jbHVkaW5nIENoaW5lc2UsIEVuZ2xpc2gsIEZyZW5jaCwgU3BhbmlzaCwgUG9ydHVndWVzZSwgR2VybWFuLCBJdGFsaWFuLCBSdXNzaWFuLCBKYXBhbmVzZSwgS29yZWFuLCBWaWV0bmFtZXNlLCBUaGFpLCBBcmFiaWMsIGFuZCBtb3JlLlxuXG5Vc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW1Rvbmd5aSBRaWFud2VuIExJQ0VOU0UgQUdSRUVNRU5UXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL1F3ZW4vUXdlbjEuNS0xMTBCLUNoYXQvYmxvYi9tYWluL0xJQ0VOU0UpLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjozMjc2OCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdlbi0yLjUtN2ItaW5zdHJ1Y3QiLCJuYW1lIjoiUXdlbjIuNSA3QiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MjkwMzY4MDAsImRlc2NyaXB0aW9uIjoiUXdlbjIuNSA3QiBpcyB0aGUgbGF0ZXN0IHNlcmllcyBvZiBRd2VuIGxhcmdlIGxhbmd1YWdlIG1vZGVscy4gUXdlbjIuNSBicmluZ3MgdGhlIGZvbGxvd2luZyBpbXByb3ZlbWVudHMgdXBvbiBRd2VuMjpcblxuLSBTaWduaWZpY2FudGx5IG1vcmUga25vd2xlZGdlIGFuZCBoYXMgZ3JlYXRseSBpbXByb3ZlZCBjYXBhYmlsaXRpZXMgaW4gY29kaW5nIGFuZCBtYXRoZW1hdGljcywgdGhhbmtzIHRvIG91ciBzcGVjaWFsaXplZCBleHBlcnQgbW9kZWxzIGluIHRoZXNlIGRvbWFpbnMuXG5cbi0gU2lnbmlmaWNhbnQgaW1wcm92ZW1lbnRzIGluIGluc3RydWN0aW9uIGZvbGxvd2luZywgZ2VuZXJhdGluZyBsb25nIHRleHRzIChvdmVyIDhLIHRva2VucyksIHVuZGVyc3RhbmRpbmcgc3RydWN0dXJlZCBkYXRhIChlLmcsIHRhYmxlcyksIGFuZCBnZW5lcmF0aW5nIHN0cnVjdHVyZWQgb3V0cHV0cyBlc3BlY2lhbGx5IEpTT04uIE1vcmUgcmVzaWxpZW50IHRvIHRoZSBkaXZlcnNpdHkgb2Ygc3lzdGVtIHByb21wdHMsIGVuaGFuY2luZyByb2xlLXBsYXkgaW1wbGVtZW50YXRpb24gYW5kIGNvbmRpdGlvbi1zZXR0aW5nIGZvciBjaGF0Ym90cy5cblxuLSBMb25nLWNvbnRleHQgU3VwcG9ydCB1cCB0byAxMjhLIHRva2VucyBhbmQgY2FuIGdlbmVyYXRlIHVwIHRvIDhLIHRva2Vucy5cblxuLSBNdWx0aWxpbmd1YWwgc3VwcG9ydCBmb3Igb3ZlciAyOSBsYW5ndWFnZXMsIGluY2x1ZGluZyBDaGluZXNlLCBFbmdsaXNoLCBGcmVuY2gsIFNwYW5pc2gsIFBvcnR1Z3Vlc2UsIEdlcm1hbiwgSXRhbGlhbiwgUnVzc2lhbiwgSmFwYW5lc2UsIEtvcmVhbiwgVmlldG5hbWVzZSwgVGhhaSwgQXJhYmljLCBhbmQgbW9yZS5cblxuVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIFtUb25neWkgUWlhbndlbiBMSUNFTlNFIEFHUkVFTUVOVF0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9Rd2VuL1F3ZW4xLjUtMTEwQi1DaGF0L2Jsb2IvbWFpbi9MSUNFTlNFKS4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJRd2VuIiwiaW5zdHJ1Y3RfdHlwZSI6ImNoYXRtbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAxIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibnZpZGlhL2xsYW1hLTMuMS1uZW1vdHJvbi03MGItaW5zdHJ1Y3Q6ZnJlZSIsIm5hbWUiOiJOVklESUE6IExsYW1hIDMuMSBOZW1vdHJvbiA3MEIgSW5zdHJ1Y3QgKGZyZWUpIiwiY3JlYXRlZCI6MTcyODk1MDQwMCwiZGVzY3JpcHRpb24iOiJOVklESUEncyBMbGFtYSAzLjEgTmVtb3Ryb24gNzBCIGlzIGEgbGFuZ3VhZ2UgbW9kZWwgZGVzaWduZWQgZm9yIGdlbmVyYXRpbmcgcHJlY2lzZSBhbmQgdXNlZnVsIHJlc3BvbnNlcy4gTGV2ZXJhZ2luZyBbTGxhbWEgMy4xIDcwQl0oL21vZGVscy9tZXRhLWxsYW1hL2xsYW1hLTMuMS03MGItaW5zdHJ1Y3QpIGFyY2hpdGVjdHVyZSBhbmQgUmVpbmZvcmNlbWVudCBMZWFybmluZyBmcm9tIEh1bWFuIEZlZWRiYWNrIChSTEhGKSwgaXQgZXhjZWxzIGluIGF1dG9tYXRpYyBhbGlnbm1lbnQgYmVuY2htYXJrcy4gVGhpcyBtb2RlbCBpcyB0YWlsb3JlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyBoaWdoIGFjY3VyYWN5IGluIGhlbHBmdWxuZXNzIGFuZCByZXNwb25zZSBnZW5lcmF0aW9uLCBzdWl0YWJsZSBmb3IgZGl2ZXJzZSB1c2VyIHF1ZXJpZXMgYWNyb3NzIG11bHRpcGxlIGRvbWFpbnMuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbTWV0YSdzIEFjY2VwdGFibGUgVXNlIFBvbGljeV0oaHR0cHM6Ly93d3cubGxhbWEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJsbGFtYTMifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibnZpZGlhL2xsYW1hLTMuMS1uZW1vdHJvbi03MGItaW5zdHJ1Y3QiLCJuYW1lIjoiTlZJRElBOiBMbGFtYSAzLjEgTmVtb3Ryb24gNzBCIEluc3RydWN0IiwiY3JlYXRlZCI6MTcyODk1MDQwMCwiZGVzY3JpcHRpb24iOiJOVklESUEncyBMbGFtYSAzLjEgTmVtb3Ryb24gNzBCIGlzIGEgbGFuZ3VhZ2UgbW9kZWwgZGVzaWduZWQgZm9yIGdlbmVyYXRpbmcgcHJlY2lzZSBhbmQgdXNlZnVsIHJlc3BvbnNlcy4gTGV2ZXJhZ2luZyBbTGxhbWEgMy4xIDcwQl0oL21vZGVscy9tZXRhLWxsYW1hL2xsYW1hLTMuMS03MGItaW5zdHJ1Y3QpIGFyY2hpdGVjdHVyZSBhbmQgUmVpbmZvcmNlbWVudCBMZWFybmluZyBmcm9tIEh1bWFuIEZlZWRiYWNrIChSTEhGKSwgaXQgZXhjZWxzIGluIGF1dG9tYXRpYyBhbGlnbm1lbnQgYmVuY2htYXJrcy4gVGhpcyBtb2RlbCBpcyB0YWlsb3JlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyBoaWdoIGFjY3VyYWN5IGluIGhlbHBmdWxuZXNzIGFuZCByZXNwb25zZSBnZW5lcmF0aW9uLCBzdWl0YWJsZSBmb3IgZGl2ZXJzZSB1c2VyIHF1ZXJpZXMgYWNyb3NzIG11bHRpcGxlIGRvbWFpbnMuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbTWV0YSdzIEFjY2VwdGFibGUgVXNlIFBvbGljeV0oaHR0cHM6Ly93d3cubGxhbWEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJsbGFtYTMifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDEyIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMyIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEzMTA3MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImluZmxlY3Rpb24vaW5mbGVjdGlvbi0zLXByb2R1Y3Rpdml0eSIsIm5hbWUiOiJJbmZsZWN0aW9uOiBJbmZsZWN0aW9uIDMgUHJvZHVjdGl2aXR5IiwiY3JlYXRlZCI6MTcyODYwNDgwMCwiZGVzY3JpcHRpb24iOiJJbmZsZWN0aW9uIDMgUHJvZHVjdGl2aXR5IGlzIG9wdGltaXplZCBmb3IgZm9sbG93aW5nIGluc3RydWN0aW9ucy4gSXQgaXMgYmV0dGVyIGZvciB0YXNrcyByZXF1aXJpbmcgSlNPTiBvdXRwdXQgb3IgcHJlY2lzZSBhZGhlcmVuY2UgdG8gcHJvdmlkZWQgZ3VpZGVsaW5lcy4gSXQgaGFzIGFjY2VzcyB0byByZWNlbnQgbmV3cy5cblxuRm9yIGVtb3Rpb25hbCBpbnRlbGxpZ2VuY2Ugc2ltaWxhciB0byBQaSwgc2VlIFtJbmZsZWN0IDMgUGldKC9pbmZsZWN0aW9uL2luZmxlY3Rpb24tMy1waSlcblxuU2VlIFtJbmZsZWN0aW9uJ3MgYW5ub3VuY2VtZW50XShodHRwczovL2luZmxlY3Rpb24uYWkvYmxvZy9lbnRlcnByaXNlKSBmb3IgbW9yZSBkZXRhaWxzLiIsImNvbnRleHRfbGVuZ3RoIjo4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMjUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMDI0LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiaW5mbGVjdGlvbi9pbmZsZWN0aW9uLTMtcGkiLCJuYW1lIjoiSW5mbGVjdGlvbjogSW5mbGVjdGlvbiAzIFBpIiwiY3JlYXRlZCI6MTcyODYwNDgwMCwiZGVzY3JpcHRpb24iOiJJbmZsZWN0aW9uIDMgUGkgcG93ZXJzIEluZmxlY3Rpb24ncyBbUGldKGh0dHBzOi8vcGkuYWkpIGNoYXRib3QsIGluY2x1ZGluZyBiYWNrc3RvcnksIGVtb3Rpb25hbCBpbnRlbGxpZ2VuY2UsIHByb2R1Y3Rpdml0eSwgYW5kIHNhZmV0eS4gSXQgaGFzIGFjY2VzcyB0byByZWNlbnQgbmV3cywgYW5kIGV4Y2VscyBpbiBzY2VuYXJpb3MgbGlrZSBjdXN0b21lciBzdXBwb3J0IGFuZCByb2xlcGxheS5cblxuUGkgaGFzIGJlZW4gdHJhaW5lZCB0byBtaXJyb3IgeW91ciB0b25lIGFuZCBzdHlsZSwgaWYgeW91IHVzZSBtb3JlIGVtb2ppcywgc28gd2lsbCBQaSEgVHJ5IGV4cGVyaW1lbnRpbmcgd2l0aCB2YXJpb3VzIHByb21wdHMgYW5kIGNvbnZlcnNhdGlvbiBzdHlsZXMuIiwiY29udGV4dF9sZW5ndGgiOjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAyNSIsImNvbXBsZXRpb24iOiIwLjAwMDAxIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEwMjQsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvZ2VtaW5pLWZsYXNoLTEuNS04YiIsIm5hbWUiOiJHb29nbGU6IEdlbWluaSAxLjUgRmxhc2ggOEIiLCJjcmVhdGVkIjoxNzI3OTEzNjAwLCJkZXNjcmlwdGlvbiI6IkdlbWluaSBGbGFzaCAxLjUgOEIgaXMgb3B0aW1pemVkIGZvciBzcGVlZCBhbmQgZWZmaWNpZW5jeSwgb2ZmZXJpbmcgZW5oYW5jZWQgcGVyZm9ybWFuY2UgaW4gc21hbGwgcHJvbXB0IHRhc2tzIGxpa2UgY2hhdCwgdHJhbnNjcmlwdGlvbiwgYW5kIHRyYW5zbGF0aW9uLiBXaXRoIHJlZHVjZWQgbGF0ZW5jeSwgaXQgaXMgaGlnaGx5IGVmZmVjdGl2ZSBmb3IgcmVhbC10aW1lIGFuZCBsYXJnZS1zY2FsZSBvcGVyYXRpb25zLiBUaGlzIG1vZGVsIGZvY3VzZXMgb24gY29zdC1lZmZlY3RpdmUgc29sdXRpb25zIHdoaWxlIG1haW50YWluaW5nIGhpZ2gtcXVhbGl0eSByZXN1bHRzLlxuXG5bQ2xpY2sgaGVyZSB0byBsZWFybiBtb3JlIGFib3V0IHRoaXMgbW9kZWxdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGVibG9nLmNvbS9lbi9nZW1pbmktMTUtZmxhc2gtOGItaXMtbm93LWdlbmVyYWxseS1hdmFpbGFibGUtZm9yLXVzZS8pLlxuXG5Vc2FnZSBvZiBHZW1pbmkgaXMgc3ViamVjdCB0byBHb29nbGUncyBbR2VtaW5pIFRlcm1zIG9mIFVzZV0oaHR0cHM6Ly9haS5nb29nbGUuZGV2L3Rlcm1zKS4iLCJjb250ZXh0X2xlbmd0aCI6MTAwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR2VtaW5pIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwMzc1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMTUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwMDAxIiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAwMDA1ODMifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMDAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJ0aGVkcnVtbWVyL3JvY2luYW50ZS0xMmIiLCJuYW1lIjoiUm9jaW5hbnRlIDEyQiIsImNyZWF0ZWQiOjE3Mjc2NTQ0MDAsImRlc2NyaXB0aW9uIjoiUm9jaW5hbnRlIDEyQiBpcyBkZXNpZ25lZCBmb3IgZW5nYWdpbmcgc3Rvcnl0ZWxsaW5nIGFuZCByaWNoIHByb3NlLlxuXG5FYXJseSB0ZXN0ZXJzIGhhdmUgcmVwb3J0ZWQ6XG4tIEV4cGFuZGVkIHZvY2FidWxhcnkgd2l0aCB1bmlxdWUgYW5kIGV4cHJlc3NpdmUgd29yZCBjaG9pY2VzXG4tIEVuaGFuY2VkIGNyZWF0aXZpdHkgZm9yIHZpdmlkIG5hcnJhdGl2ZXNcbi0gQWR2ZW50dXJlLWZpbGxlZCBhbmQgY2FwdGl2YXRpbmcgc3RvcmllcyIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAyNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocmFjaXRlLW9yZy9tYWdudW0tdjItNzJiIiwibmFtZSI6Ik1hZ251bSB2MiA3MkIiLCJjcmVhdGVkIjoxNzI3NjU0NDAwLCJkZXNjcmlwdGlvbiI6IkZyb20gdGhlIG1ha2VyIG9mIFtHb2xpYXRoXShodHRwczovL29wZW5yb3V0ZXIuYWkvbW9kZWxzL2FscGluZGFsZS9nb2xpYXRoLTEyMGIpLCBNYWdudW0gNzJCIGlzIHRoZSBzZXZlbnRoIGluIGEgZmFtaWx5IG9mIG1vZGVscyBkZXNpZ25lZCB0byBhY2hpZXZlIHRoZSBwcm9zZSBxdWFsaXR5IG9mIHRoZSBDbGF1ZGUgMyBtb2RlbHMsIG5vdGFibHkgT3B1cyAmIFNvbm5ldC5cblxuVGhlIG1vZGVsIGlzIGJhc2VkIG9uIFtRd2VuMiA3MkJdKGh0dHBzOi8vb3BlbnJvdXRlci5haS9tb2RlbHMvcXdlbi9xd2VuLTItNzJiLWluc3RydWN0KSBhbmQgdHJhaW5lZCB3aXRoIDU1IG1pbGxpb24gdG9rZW5zIG9mIGhpZ2hseSBjdXJhdGVkIHJvbGVwbGF5IChSUCkgZGF0YS4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJRd2VuIiwiaW5zdHJ1Y3RfdHlwZSI6ImNoYXRtbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAzIiwiY29tcGxldGlvbiI6IjAuMDAwMDAzIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibGlxdWlkL2xmbS00MGIiLCJuYW1lIjoiTGlxdWlkOiBMRk0gNDBCIE1vRSIsImNyZWF0ZWQiOjE3Mjc2NTQ0MDAsImRlc2NyaXB0aW9uIjoiTGlxdWlkJ3MgNDAuM0IgTWl4dHVyZSBvZiBFeHBlcnRzIChNb0UpIG1vZGVsLiBMaXF1aWQgRm91bmRhdGlvbiBNb2RlbHMgKExGTXMpIGFyZSBsYXJnZSBuZXVyYWwgbmV0d29ya3MgYnVpbHQgd2l0aCBjb21wdXRhdGlvbmFsIHVuaXRzIHJvb3RlZCBpbiBkeW5hbWljIHN5c3RlbXMuXG5cbkxGTXMgYXJlIGdlbmVyYWwtcHVycG9zZSBBSSBtb2RlbHMgdGhhdCBjYW4gYmUgdXNlZCB0byBtb2RlbCBhbnkga2luZCBvZiBzZXF1ZW50aWFsIGRhdGEsIGluY2x1ZGluZyB2aWRlbywgYXVkaW8sIHRleHQsIHRpbWUgc2VyaWVzLCBhbmQgc2lnbmFscy5cblxuU2VlIHRoZSBbbGF1bmNoIGFubm91bmNlbWVudF0oaHR0cHM6Ly93d3cubGlxdWlkLmFpL2xpcXVpZC1mb3VuZGF0aW9uLW1vZGVscykgZm9yIGJlbmNobWFya3MgYW5kIG1vcmUgaW5mby4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOiJjaGF0bWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDE1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMTUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtZXRhLWxsYW1hL2xsYW1hLTMuMi0zYi1pbnN0cnVjdDpmcmVlIiwibmFtZSI6Ik1ldGE6IExsYW1hIDMuMiAzQiBJbnN0cnVjdCAoZnJlZSkiLCJjcmVhdGVkIjoxNzI3MjIyNDAwLCJkZXNjcmlwdGlvbiI6IkxsYW1hIDMuMiAzQiBpcyBhIDMtYmlsbGlvbi1wYXJhbWV0ZXIgbXVsdGlsaW5ndWFsIGxhcmdlIGxhbmd1YWdlIG1vZGVsLCBvcHRpbWl6ZWQgZm9yIGFkdmFuY2VkIG5hdHVyYWwgbGFuZ3VhZ2UgcHJvY2Vzc2luZyB0YXNrcyBsaWtlIGRpYWxvZ3VlIGdlbmVyYXRpb24sIHJlYXNvbmluZywgYW5kIHN1bW1hcml6YXRpb24uIERlc2lnbmVkIHdpdGggdGhlIGxhdGVzdCB0cmFuc2Zvcm1lciBhcmNoaXRlY3R1cmUsIGl0IHN1cHBvcnRzIGVpZ2h0IGxhbmd1YWdlcywgaW5jbHVkaW5nIEVuZ2xpc2gsIFNwYW5pc2gsIGFuZCBIaW5kaSwgYW5kIGlzIGFkYXB0YWJsZSBmb3IgYWRkaXRpb25hbCBsYW5ndWFnZXMuXG5cblRyYWluZWQgb24gOSB0cmlsbGlvbiB0b2tlbnMsIHRoZSBMbGFtYSAzLjIgM0IgbW9kZWwgZXhjZWxzIGluIGluc3RydWN0aW9uLWZvbGxvd2luZywgY29tcGxleCByZWFzb25pbmcsIGFuZCB0b29sIHVzZS4gSXRzIGJhbGFuY2VkIHBlcmZvcm1hbmNlIG1ha2VzIGl0IGlkZWFsIGZvciBhcHBsaWNhdGlvbnMgbmVlZGluZyBhY2N1cmFjeSBhbmQgZWZmaWNpZW5jeSBpbiB0ZXh0IGdlbmVyYXRpb24gYWNyb3NzIG11bHRpbGluZ3VhbCBzZXR0aW5ncy5cblxuQ2xpY2sgaGVyZSBmb3IgdGhlIFtvcmlnaW5hbCBtb2RlbCBjYXJkXShodHRwczovL2dpdGh1Yi5jb20vbWV0YS1sbGFtYS9sbGFtYS1tb2RlbHMvYmxvYi9tYWluL21vZGVscy9sbGFtYTNfMi9NT0RFTF9DQVJELm1kKS5cblxuVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIFtNZXRhJ3MgQWNjZXB0YWJsZSBVc2UgUG9saWN5XShodHRwczovL3d3dy5sbGFtYS5jb20vbGxhbWEzL3VzZS1wb2xpY3kvKS4iLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoyMDAwMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtMy4yLTNiLWluc3RydWN0IiwibmFtZSI6Ik1ldGE6IExsYW1hIDMuMiAzQiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MjcyMjI0MDAsImRlc2NyaXB0aW9uIjoiTGxhbWEgMy4yIDNCIGlzIGEgMy1iaWxsaW9uLXBhcmFtZXRlciBtdWx0aWxpbmd1YWwgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwsIG9wdGltaXplZCBmb3IgYWR2YW5jZWQgbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nIHRhc2tzIGxpa2UgZGlhbG9ndWUgZ2VuZXJhdGlvbiwgcmVhc29uaW5nLCBhbmQgc3VtbWFyaXphdGlvbi4gRGVzaWduZWQgd2l0aCB0aGUgbGF0ZXN0IHRyYW5zZm9ybWVyIGFyY2hpdGVjdHVyZSwgaXQgc3VwcG9ydHMgZWlnaHQgbGFuZ3VhZ2VzLCBpbmNsdWRpbmcgRW5nbGlzaCwgU3BhbmlzaCwgYW5kIEhpbmRpLCBhbmQgaXMgYWRhcHRhYmxlIGZvciBhZGRpdGlvbmFsIGxhbmd1YWdlcy5cblxuVHJhaW5lZCBvbiA5IHRyaWxsaW9uIHRva2VucywgdGhlIExsYW1hIDMuMiAzQiBtb2RlbCBleGNlbHMgaW4gaW5zdHJ1Y3Rpb24tZm9sbG93aW5nLCBjb21wbGV4IHJlYXNvbmluZywgYW5kIHRvb2wgdXNlLiBJdHMgYmFsYW5jZWQgcGVyZm9ybWFuY2UgbWFrZXMgaXQgaWRlYWwgZm9yIGFwcGxpY2F0aW9ucyBuZWVkaW5nIGFjY3VyYWN5IGFuZCBlZmZpY2llbmN5IGluIHRleHQgZ2VuZXJhdGlvbiBhY3Jvc3MgbXVsdGlsaW5ndWFsIHNldHRpbmdzLlxuXG5DbGljayBoZXJlIGZvciB0aGUgW29yaWdpbmFsIG1vZGVsIGNhcmRdKGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhLWxsYW1hL2xsYW1hLW1vZGVscy9ibG9iL21haW4vbW9kZWxzL2xsYW1hM18yL01PREVMX0NBUkQubWQpLlxuXG5Vc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW01ldGEncyBBY2NlcHRhYmxlIFVzZSBQb2xpY3ldKGh0dHBzOi8vd3d3LmxsYW1hLmNvbS9sbGFtYTMvdXNlLXBvbGljeS8pLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwMTUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAwMjUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMzEwNzIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtZXRhLWxsYW1hL2xsYW1hLTMuMi0xYi1pbnN0cnVjdDpmcmVlIiwibmFtZSI6Ik1ldGE6IExsYW1hIDMuMiAxQiBJbnN0cnVjdCAoZnJlZSkiLCJjcmVhdGVkIjoxNzI3MjIyNDAwLCJkZXNjcmlwdGlvbiI6IkxsYW1hIDMuMiAxQiBpcyBhIDEtYmlsbGlvbi1wYXJhbWV0ZXIgbGFuZ3VhZ2UgbW9kZWwgZm9jdXNlZCBvbiBlZmZpY2llbnRseSBwZXJmb3JtaW5nIG5hdHVyYWwgbGFuZ3VhZ2UgdGFza3MsIHN1Y2ggYXMgc3VtbWFyaXphdGlvbiwgZGlhbG9ndWUsIGFuZCBtdWx0aWxpbmd1YWwgdGV4dCBhbmFseXNpcy4gSXRzIHNtYWxsZXIgc2l6ZSBhbGxvd3MgaXQgdG8gb3BlcmF0ZSBlZmZpY2llbnRseSBpbiBsb3ctcmVzb3VyY2UgZW52aXJvbm1lbnRzIHdoaWxlIG1haW50YWluaW5nIHN0cm9uZyB0YXNrIHBlcmZvcm1hbmNlLlxuXG5TdXBwb3J0aW5nIGVpZ2h0IGNvcmUgbGFuZ3VhZ2VzIGFuZCBmaW5lLXR1bmFibGUgZm9yIG1vcmUsIExsYW1hIDEuM0IgaXMgaWRlYWwgZm9yIGJ1c2luZXNzZXMgb3IgZGV2ZWxvcGVycyBzZWVraW5nIGxpZ2h0d2VpZ2h0IHlldCBwb3dlcmZ1bCBBSSBzb2x1dGlvbnMgdGhhdCBjYW4gb3BlcmF0ZSBpbiBkaXZlcnNlIG11bHRpbGluZ3VhbCBzZXR0aW5ncyB3aXRob3V0IHRoZSBoaWdoIGNvbXB1dGF0aW9uYWwgZGVtYW5kIG9mIGxhcmdlciBtb2RlbHMuXG5cbkNsaWNrIGhlcmUgZm9yIHRoZSBbb3JpZ2luYWwgbW9kZWwgY2FyZF0oaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtbW9kZWxzL2Jsb2IvbWFpbi9tb2RlbHMvbGxhbWEzXzIvTU9ERUxfQ0FSRC5tZCkuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbTWV0YSdzIEFjY2VwdGFibGUgVXNlIFBvbGljeV0oaHR0cHM6Ly93d3cubGxhbWEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJsbGFtYTMifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMzEwNzIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtZXRhLWxsYW1hL2xsYW1hLTMuMi0xYi1pbnN0cnVjdCIsIm5hbWUiOiJNZXRhOiBMbGFtYSAzLjIgMUIgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzI3MjIyNDAwLCJkZXNjcmlwdGlvbiI6IkxsYW1hIDMuMiAxQiBpcyBhIDEtYmlsbGlvbi1wYXJhbWV0ZXIgbGFuZ3VhZ2UgbW9kZWwgZm9jdXNlZCBvbiBlZmZpY2llbnRseSBwZXJmb3JtaW5nIG5hdHVyYWwgbGFuZ3VhZ2UgdGFza3MsIHN1Y2ggYXMgc3VtbWFyaXphdGlvbiwgZGlhbG9ndWUsIGFuZCBtdWx0aWxpbmd1YWwgdGV4dCBhbmFseXNpcy4gSXRzIHNtYWxsZXIgc2l6ZSBhbGxvd3MgaXQgdG8gb3BlcmF0ZSBlZmZpY2llbnRseSBpbiBsb3ctcmVzb3VyY2UgZW52aXJvbm1lbnRzIHdoaWxlIG1haW50YWluaW5nIHN0cm9uZyB0YXNrIHBlcmZvcm1hbmNlLlxuXG5TdXBwb3J0aW5nIGVpZ2h0IGNvcmUgbGFuZ3VhZ2VzIGFuZCBmaW5lLXR1bmFibGUgZm9yIG1vcmUsIExsYW1hIDEuM0IgaXMgaWRlYWwgZm9yIGJ1c2luZXNzZXMgb3IgZGV2ZWxvcGVycyBzZWVraW5nIGxpZ2h0d2VpZ2h0IHlldCBwb3dlcmZ1bCBBSSBzb2x1dGlvbnMgdGhhdCBjYW4gb3BlcmF0ZSBpbiBkaXZlcnNlIG11bHRpbGluZ3VhbCBzZXR0aW5ncyB3aXRob3V0IHRoZSBoaWdoIGNvbXB1dGF0aW9uYWwgZGVtYW5kIG9mIGxhcmdlciBtb2RlbHMuXG5cbkNsaWNrIGhlcmUgZm9yIHRoZSBbb3JpZ2luYWwgbW9kZWwgY2FyZF0oaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtbW9kZWxzL2Jsb2IvbWFpbi9tb2RlbHMvbGxhbWEzXzIvTU9ERUxfQ0FSRC5tZCkuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbTWV0YSdzIEFjY2VwdGFibGUgVXNlIFBvbGljeV0oaHR0cHM6Ly93d3cubGxhbWEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJsbGFtYTMifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWV0YS1sbGFtYS9sbGFtYS0zLjItOTBiLXZpc2lvbi1pbnN0cnVjdCIsIm5hbWUiOiJNZXRhOiBMbGFtYSAzLjIgOTBCIFZpc2lvbiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MjcyMjI0MDAsImRlc2NyaXB0aW9uIjoiVGhlIExsYW1hIDkwQiBWaXNpb24gbW9kZWwgaXMgYSB0b3AtdGllciwgOTAtYmlsbGlvbi1wYXJhbWV0ZXIgbXVsdGltb2RhbCBtb2RlbCBkZXNpZ25lZCBmb3IgdGhlIG1vc3QgY2hhbGxlbmdpbmcgdmlzdWFsIHJlYXNvbmluZyBhbmQgbGFuZ3VhZ2UgdGFza3MuIEl0IG9mZmVycyB1bnBhcmFsbGVsZWQgYWNjdXJhY3kgaW4gaW1hZ2UgY2FwdGlvbmluZywgdmlzdWFsIHF1ZXN0aW9uIGFuc3dlcmluZywgYW5kIGFkdmFuY2VkIGltYWdlLXRleHQgY29tcHJlaGVuc2lvbi4gUHJlLXRyYWluZWQgb24gdmFzdCBtdWx0aW1vZGFsIGRhdGFzZXRzIGFuZCBmaW5lLXR1bmVkIHdpdGggaHVtYW4gZmVlZGJhY2ssIHRoZSBMbGFtYSA5MEIgVmlzaW9uIGlzIGVuZ2luZWVyZWQgdG8gaGFuZGxlIHRoZSBtb3N0IGRlbWFuZGluZyBpbWFnZS1iYXNlZCBBSSB0YXNrcy5cblxuVGhpcyBtb2RlbCBpcyBwZXJmZWN0IGZvciBpbmR1c3RyaWVzIHJlcXVpcmluZyBjdXR0aW5nLWVkZ2UgbXVsdGltb2RhbCBBSSBjYXBhYmlsaXRpZXMsIHBhcnRpY3VsYXJseSB0aG9zZSBkZWFsaW5nIHdpdGggY29tcGxleCwgcmVhbC10aW1lIHZpc3VhbCBhbmQgdGV4dHVhbCBhbmFseXNpcy5cblxuQ2xpY2sgaGVyZSBmb3IgdGhlIFtvcmlnaW5hbCBtb2RlbCBjYXJkXShodHRwczovL2dpdGh1Yi5jb20vbWV0YS1sbGFtYS9sbGFtYS1tb2RlbHMvYmxvYi9tYWluL21vZGVscy9sbGFtYTNfMi9NT0RFTF9DQVJEX1ZJU0lPTi5tZCkuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbTWV0YSdzIEFjY2VwdGFibGUgVXNlIFBvbGljeV0oaHR0cHM6Ly93d3cubGxhbWEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDkiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDEzMDEiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtMy4yLTExYi12aXNpb24taW5zdHJ1Y3Q6ZnJlZSIsIm5hbWUiOiJNZXRhOiBMbGFtYSAzLjIgMTFCIFZpc2lvbiBJbnN0cnVjdCAoZnJlZSkiLCJjcmVhdGVkIjoxNzI3MjIyNDAwLCJkZXNjcmlwdGlvbiI6IkxsYW1hIDMuMiAxMUIgVmlzaW9uIGlzIGEgbXVsdGltb2RhbCBtb2RlbCB3aXRoIDExIGJpbGxpb24gcGFyYW1ldGVycywgZGVzaWduZWQgdG8gaGFuZGxlIHRhc2tzIGNvbWJpbmluZyB2aXN1YWwgYW5kIHRleHR1YWwgZGF0YS4gSXQgZXhjZWxzIGluIHRhc2tzIHN1Y2ggYXMgaW1hZ2UgY2FwdGlvbmluZyBhbmQgdmlzdWFsIHF1ZXN0aW9uIGFuc3dlcmluZywgYnJpZGdpbmcgdGhlIGdhcCBiZXR3ZWVuIGxhbmd1YWdlIGdlbmVyYXRpb24gYW5kIHZpc3VhbCByZWFzb25pbmcuIFByZS10cmFpbmVkIG9uIGEgbWFzc2l2ZSBkYXRhc2V0IG9mIGltYWdlLXRleHQgcGFpcnMsIGl0IHBlcmZvcm1zIHdlbGwgaW4gY29tcGxleCwgaGlnaC1hY2N1cmFjeSBpbWFnZSBhbmFseXNpcy5cblxuSXRzIGFiaWxpdHkgdG8gaW50ZWdyYXRlIHZpc3VhbCB1bmRlcnN0YW5kaW5nIHdpdGggbGFuZ3VhZ2UgcHJvY2Vzc2luZyBtYWtlcyBpdCBhbiBpZGVhbCBzb2x1dGlvbiBmb3IgaW5kdXN0cmllcyByZXF1aXJpbmcgY29tcHJlaGVuc2l2ZSB2aXN1YWwtbGluZ3Vpc3RpYyBBSSBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMgY29udGVudCBjcmVhdGlvbiwgQUktZHJpdmVuIGN1c3RvbWVyIHNlcnZpY2UsIGFuZCByZXNlYXJjaC5cblxuQ2xpY2sgaGVyZSBmb3IgdGhlIFtvcmlnaW5hbCBtb2RlbCBjYXJkXShodHRwczovL2dpdGh1Yi5jb20vbWV0YS1sbGFtYS9sbGFtYS1tb2RlbHMvYmxvYi9tYWluL21vZGVscy9sbGFtYTNfMi9NT0RFTF9DQVJEX1ZJU0lPTi5tZCkuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbTWV0YSdzIEFjY2VwdGFibGUgVXNlIFBvbGljeV0oaHR0cHM6Ly93d3cubGxhbWEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjIwNDgsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtZXRhLWxsYW1hL2xsYW1hLTMuMi0xMWItdmlzaW9uLWluc3RydWN0IiwibmFtZSI6Ik1ldGE6IExsYW1hIDMuMiAxMUIgVmlzaW9uIEluc3RydWN0IiwiY3JlYXRlZCI6MTcyNzIyMjQwMCwiZGVzY3JpcHRpb24iOiJMbGFtYSAzLjIgMTFCIFZpc2lvbiBpcyBhIG11bHRpbW9kYWwgbW9kZWwgd2l0aCAxMSBiaWxsaW9uIHBhcmFtZXRlcnMsIGRlc2lnbmVkIHRvIGhhbmRsZSB0YXNrcyBjb21iaW5pbmcgdmlzdWFsIGFuZCB0ZXh0dWFsIGRhdGEuIEl0IGV4Y2VscyBpbiB0YXNrcyBzdWNoIGFzIGltYWdlIGNhcHRpb25pbmcgYW5kIHZpc3VhbCBxdWVzdGlvbiBhbnN3ZXJpbmcsIGJyaWRnaW5nIHRoZSBnYXAgYmV0d2VlbiBsYW5ndWFnZSBnZW5lcmF0aW9uIGFuZCB2aXN1YWwgcmVhc29uaW5nLiBQcmUtdHJhaW5lZCBvbiBhIG1hc3NpdmUgZGF0YXNldCBvZiBpbWFnZS10ZXh0IHBhaXJzLCBpdCBwZXJmb3JtcyB3ZWxsIGluIGNvbXBsZXgsIGhpZ2gtYWNjdXJhY3kgaW1hZ2UgYW5hbHlzaXMuXG5cbkl0cyBhYmlsaXR5IHRvIGludGVncmF0ZSB2aXN1YWwgdW5kZXJzdGFuZGluZyB3aXRoIGxhbmd1YWdlIHByb2Nlc3NpbmcgbWFrZXMgaXQgYW4gaWRlYWwgc29sdXRpb24gZm9yIGluZHVzdHJpZXMgcmVxdWlyaW5nIGNvbXByZWhlbnNpdmUgdmlzdWFsLWxpbmd1aXN0aWMgQUkgYXBwbGljYXRpb25zLCBzdWNoIGFzIGNvbnRlbnQgY3JlYXRpb24sIEFJLWRyaXZlbiBjdXN0b21lciBzZXJ2aWNlLCBhbmQgcmVzZWFyY2guXG5cbkNsaWNrIGhlcmUgZm9yIHRoZSBbb3JpZ2luYWwgbW9kZWwgY2FyZF0oaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtbW9kZWxzL2Jsb2IvbWFpbi9tb2RlbHMvbGxhbWEzXzIvTU9ERUxfQ0FSRF9WSVNJT04ubWQpLlxuXG5Vc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW01ldGEncyBBY2NlcHRhYmxlIFVzZSBQb2xpY3ldKGh0dHBzOi8vd3d3LmxsYW1hLmNvbS9sbGFtYTMvdXNlLXBvbGljeS8pLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJsbGFtYTMifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDA0OSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDA0OSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDA3OTQ4Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3ZW4tMi41LTcyYi1pbnN0cnVjdDpmcmVlIiwibmFtZSI6IlF3ZW4yLjUgNzJCIEluc3RydWN0IChmcmVlKSIsImNyZWF0ZWQiOjE3MjY3MDQwMDAsImRlc2NyaXB0aW9uIjoiUXdlbjIuNSA3MkIgaXMgdGhlIGxhdGVzdCBzZXJpZXMgb2YgUXdlbiBsYXJnZSBsYW5ndWFnZSBtb2RlbHMuIFF3ZW4yLjUgYnJpbmdzIHRoZSBmb2xsb3dpbmcgaW1wcm92ZW1lbnRzIHVwb24gUXdlbjI6XG5cbi0gU2lnbmlmaWNhbnRseSBtb3JlIGtub3dsZWRnZSBhbmQgaGFzIGdyZWF0bHkgaW1wcm92ZWQgY2FwYWJpbGl0aWVzIGluIGNvZGluZyBhbmQgbWF0aGVtYXRpY3MsIHRoYW5rcyB0byBvdXIgc3BlY2lhbGl6ZWQgZXhwZXJ0IG1vZGVscyBpbiB0aGVzZSBkb21haW5zLlxuXG4tIFNpZ25pZmljYW50IGltcHJvdmVtZW50cyBpbiBpbnN0cnVjdGlvbiBmb2xsb3dpbmcsIGdlbmVyYXRpbmcgbG9uZyB0ZXh0cyAob3ZlciA4SyB0b2tlbnMpLCB1bmRlcnN0YW5kaW5nIHN0cnVjdHVyZWQgZGF0YSAoZS5nLCB0YWJsZXMpLCBhbmQgZ2VuZXJhdGluZyBzdHJ1Y3R1cmVkIG91dHB1dHMgZXNwZWNpYWxseSBKU09OLiBNb3JlIHJlc2lsaWVudCB0byB0aGUgZGl2ZXJzaXR5IG9mIHN5c3RlbSBwcm9tcHRzLCBlbmhhbmNpbmcgcm9sZS1wbGF5IGltcGxlbWVudGF0aW9uIGFuZCBjb25kaXRpb24tc2V0dGluZyBmb3IgY2hhdGJvdHMuXG5cbi0gTG9uZy1jb250ZXh0IFN1cHBvcnQgdXAgdG8gMTI4SyB0b2tlbnMgYW5kIGNhbiBnZW5lcmF0ZSB1cCB0byA4SyB0b2tlbnMuXG5cbi0gTXVsdGlsaW5ndWFsIHN1cHBvcnQgZm9yIG92ZXIgMjkgbGFuZ3VhZ2VzLCBpbmNsdWRpbmcgQ2hpbmVzZSwgRW5nbGlzaCwgRnJlbmNoLCBTcGFuaXNoLCBQb3J0dWd1ZXNlLCBHZXJtYW4sIEl0YWxpYW4sIFJ1c3NpYW4sIEphcGFuZXNlLCBLb3JlYW4sIFZpZXRuYW1lc2UsIFRoYWksIEFyYWJpYywgYW5kIG1vcmUuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbVG9uZ3lpIFFpYW53ZW4gTElDRU5TRSBBR1JFRU1FTlRdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vUXdlbi9Rd2VuMS41LTExMEItQ2hhdC9ibG9iL21haW4vTElDRU5TRSkuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOiJjaGF0bWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3ZW4tMi41LTcyYi1pbnN0cnVjdCIsIm5hbWUiOiJRd2VuMi41IDcyQiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MjY3MDQwMDAsImRlc2NyaXB0aW9uIjoiUXdlbjIuNSA3MkIgaXMgdGhlIGxhdGVzdCBzZXJpZXMgb2YgUXdlbiBsYXJnZSBsYW5ndWFnZSBtb2RlbHMuIFF3ZW4yLjUgYnJpbmdzIHRoZSBmb2xsb3dpbmcgaW1wcm92ZW1lbnRzIHVwb24gUXdlbjI6XG5cbi0gU2lnbmlmaWNhbnRseSBtb3JlIGtub3dsZWRnZSBhbmQgaGFzIGdyZWF0bHkgaW1wcm92ZWQgY2FwYWJpbGl0aWVzIGluIGNvZGluZyBhbmQgbWF0aGVtYXRpY3MsIHRoYW5rcyB0byBvdXIgc3BlY2lhbGl6ZWQgZXhwZXJ0IG1vZGVscyBpbiB0aGVzZSBkb21haW5zLlxuXG4tIFNpZ25pZmljYW50IGltcHJvdmVtZW50cyBpbiBpbnN0cnVjdGlvbiBmb2xsb3dpbmcsIGdlbmVyYXRpbmcgbG9uZyB0ZXh0cyAob3ZlciA4SyB0b2tlbnMpLCB1bmRlcnN0YW5kaW5nIHN0cnVjdHVyZWQgZGF0YSAoZS5nLCB0YWJsZXMpLCBhbmQgZ2VuZXJhdGluZyBzdHJ1Y3R1cmVkIG91dHB1dHMgZXNwZWNpYWxseSBKU09OLiBNb3JlIHJlc2lsaWVudCB0byB0aGUgZGl2ZXJzaXR5IG9mIHN5c3RlbSBwcm9tcHRzLCBlbmhhbmNpbmcgcm9sZS1wbGF5IGltcGxlbWVudGF0aW9uIGFuZCBjb25kaXRpb24tc2V0dGluZyBmb3IgY2hhdGJvdHMuXG5cbi0gTG9uZy1jb250ZXh0IFN1cHBvcnQgdXAgdG8gMTI4SyB0b2tlbnMgYW5kIGNhbiBnZW5lcmF0ZSB1cCB0byA4SyB0b2tlbnMuXG5cbi0gTXVsdGlsaW5ndWFsIHN1cHBvcnQgZm9yIG92ZXIgMjkgbGFuZ3VhZ2VzLCBpbmNsdWRpbmcgQ2hpbmVzZSwgRW5nbGlzaCwgRnJlbmNoLCBTcGFuaXNoLCBQb3J0dWd1ZXNlLCBHZXJtYW4sIEl0YWxpYW4sIFJ1c3NpYW4sIEphcGFuZXNlLCBLb3JlYW4sIFZpZXRuYW1lc2UsIFRoYWksIEFyYWJpYywgYW5kIG1vcmUuXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbVG9uZ3lpIFFpYW53ZW4gTElDRU5TRSBBR1JFRU1FTlRdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vUXdlbi9Rd2VuMS41LTExMEItQ2hhdC9ibG9iL21haW4vTElDRU5TRSkuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOiJjaGF0bWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDEyIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMzkiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3ZW4tMi41LXZsLTcyYi1pbnN0cnVjdCIsIm5hbWUiOiJRd2VuOiBRd2VuMi41LVZMIDcyQiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MjY2MTc2MDAsImRlc2NyaXB0aW9uIjoiUXdlbjIuNSBWTCA3MkIgaXMgYSBtdWx0aW1vZGFsIExMTSBmcm9tIHRoZSBRd2VuIFRlYW0gd2l0aCB0aGUgZm9sbG93aW5nIGtleSBlbmhhbmNlbWVudHM6XG5cbi0gU29UQSB1bmRlcnN0YW5kaW5nIG9mIGltYWdlcyBvZiB2YXJpb3VzIHJlc29sdXRpb24gJiByYXRpbzogUXdlbjIuNS1WTCBhY2hpZXZlcyBzdGF0ZS1vZi10aGUtYXJ0IHBlcmZvcm1hbmNlIG9uIHZpc3VhbCB1bmRlcnN0YW5kaW5nIGJlbmNobWFya3MsIGluY2x1ZGluZyBNYXRoVmlzdGEsIERvY1ZRQSwgUmVhbFdvcmxkUUEsIE1UVlFBLCBldGMuXG5cbi0gVW5kZXJzdGFuZGluZyB2aWRlb3Mgb2YgMjBtaW4rOiBRd2VuMi41LVZMIGNhbiB1bmRlcnN0YW5kIHZpZGVvcyBvdmVyIDIwIG1pbnV0ZXMgZm9yIGhpZ2gtcXVhbGl0eSB2aWRlby1iYXNlZCBxdWVzdGlvbiBhbnN3ZXJpbmcsIGRpYWxvZywgY29udGVudCBjcmVhdGlvbiwgZXRjLlxuXG4tIEFnZW50IHRoYXQgY2FuIG9wZXJhdGUgeW91ciBtb2JpbGVzLCByb2JvdHMsIGV0Yy46IHdpdGggdGhlIGFiaWxpdGllcyBvZiBjb21wbGV4IHJlYXNvbmluZyBhbmQgZGVjaXNpb24gbWFraW5nLCBRd2VuMi41LVZMIGNhbiBiZSBpbnRlZ3JhdGVkIHdpdGggZGV2aWNlcyBsaWtlIG1vYmlsZSBwaG9uZXMsIHJvYm90cywgZXRjLiwgZm9yIGF1dG9tYXRpYyBvcGVyYXRpb24gYmFzZWQgb24gdmlzdWFsIGVudmlyb25tZW50IGFuZCB0ZXh0IGluc3RydWN0aW9ucy5cblxuLSBNdWx0aWxpbmd1YWwgU3VwcG9ydDogdG8gc2VydmUgZ2xvYmFsIHVzZXJzLCBiZXNpZGVzIEVuZ2xpc2ggYW5kIENoaW5lc2UsIFF3ZW4yLjUtVkwgbm93IHN1cHBvcnRzIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRleHRzIGluIGRpZmZlcmVudCBsYW5ndWFnZXMgaW5zaWRlIGltYWdlcywgaW5jbHVkaW5nIG1vc3QgRXVyb3BlYW4gbGFuZ3VhZ2VzLCBKYXBhbmVzZSwgS29yZWFuLCBBcmFiaWMsIFZpZXRuYW1lc2UsIGV0Yy5cblxuRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoaXMgW2Jsb2cgcG9zdF0oaHR0cHM6Ly9xd2VubG0uZ2l0aHViLmlvL2Jsb2cvcXdlbjItdmwvKSBhbmQgW0dpdEh1YiByZXBvXShodHRwczovL2dpdGh1Yi5jb20vUXdlbkxNL1F3ZW4yLVZMKS5cblxuVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIFtUb25neWkgUWlhbndlbiBMSUNFTlNFIEFHUkVFTUVOVF0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9Rd2VuL1F3ZW4xLjUtMTEwQi1DaGF0L2Jsb2IvbWFpbi9MSUNFTlNFKS4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDYiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA2IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDAwNTc4Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im5ldmVyc2xlZXAvbGxhbWEtMy4xLWx1bWltYWlkLThiIiwibmFtZSI6Ik5ldmVyU2xlZXA6IEx1bWltYWlkIHYwLjIgOEIiLCJjcmVhdGVkIjoxNzI2MzU4NDAwLCJkZXNjcmlwdGlvbiI6Ikx1bWltYWlkIHYwLjIgOEIgaXMgYSBmaW5ldHVuZSBvZiBbTGxhbWEgMy4xIDhCXSgvbW9kZWxzL21ldGEtbGxhbWEvbGxhbWEtMy4xLThiLWluc3RydWN0KSB3aXRoIGEgXCJIVUdFIHN0ZXAgdXAgZGF0YXNldCB3aXNlXCIgY29tcGFyZWQgdG8gTHVtaW1haWQgdjAuMS4gU2xvcHB5IGNoYXRzIG91dHB1dCB3ZXJlIHB1cmdlZC5cblxuVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIFtNZXRhJ3MgQWNjZXB0YWJsZSBVc2UgUG9saWN5XShodHRwczovL2xsYW1hLm1ldGEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDkzNzUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA3NSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MjA0OCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9vMS1wcmV2aWV3IiwibmFtZSI6Ik9wZW5BSTogbzEtcHJldmlldyIsImNyZWF0ZWQiOjE3MjYwOTkyMDAsImRlc2NyaXB0aW9uIjoiVGhlIGxhdGVzdCBhbmQgc3Ryb25nZXN0IG1vZGVsIGZhbWlseSBmcm9tIE9wZW5BSSwgbzEgaXMgZGVzaWduZWQgdG8gc3BlbmQgbW9yZSB0aW1lIHRoaW5raW5nIGJlZm9yZSByZXNwb25kaW5nLlxuXG5UaGUgbzEgbW9kZWxzIGFyZSBvcHRpbWl6ZWQgZm9yIG1hdGgsIHNjaWVuY2UsIHByb2dyYW1taW5nLCBhbmQgb3RoZXIgU1RFTS1yZWxhdGVkIHRhc2tzLiBUaGV5IGNvbnNpc3RlbnRseSBleGhpYml0IFBoRC1sZXZlbCBhY2N1cmFjeSBvbiBiZW5jaG1hcmtzIGluIHBoeXNpY3MsIGNoZW1pc3RyeSwgYW5kIGJpb2xvZ3kuIExlYXJuIG1vcmUgaW4gdGhlIFtsYXVuY2ggYW5ub3VuY2VtZW50XShodHRwczovL29wZW5haS5jb20vbzEpLlxuXG5Ob3RlOiBUaGlzIG1vZGVsIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwgYW5kIG5vdCBzdWl0YWJsZSBmb3IgcHJvZHVjdGlvbiB1c2UtY2FzZXMsIGFuZCBtYXkgYmUgaGVhdmlseSByYXRlLWxpbWl0ZWQuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDE1IiwiY29tcGxldGlvbiI6IjAuMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwNzUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MzI3NjgsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9vMS1wcmV2aWV3LTIwMjQtMDktMTIiLCJuYW1lIjoiT3BlbkFJOiBvMS1wcmV2aWV3ICgyMDI0LTA5LTEyKSIsImNyZWF0ZWQiOjE3MjYwOTkyMDAsImRlc2NyaXB0aW9uIjoiVGhlIGxhdGVzdCBhbmQgc3Ryb25nZXN0IG1vZGVsIGZhbWlseSBmcm9tIE9wZW5BSSwgbzEgaXMgZGVzaWduZWQgdG8gc3BlbmQgbW9yZSB0aW1lIHRoaW5raW5nIGJlZm9yZSByZXNwb25kaW5nLlxuXG5UaGUgbzEgbW9kZWxzIGFyZSBvcHRpbWl6ZWQgZm9yIG1hdGgsIHNjaWVuY2UsIHByb2dyYW1taW5nLCBhbmQgb3RoZXIgU1RFTS1yZWxhdGVkIHRhc2tzLiBUaGV5IGNvbnNpc3RlbnRseSBleGhpYml0IFBoRC1sZXZlbCBhY2N1cmFjeSBvbiBiZW5jaG1hcmtzIGluIHBoeXNpY3MsIGNoZW1pc3RyeSwgYW5kIGJpb2xvZ3kuIExlYXJuIG1vcmUgaW4gdGhlIFtsYXVuY2ggYW5ub3VuY2VtZW50XShodHRwczovL29wZW5haS5jb20vbzEpLlxuXG5Ob3RlOiBUaGlzIG1vZGVsIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwgYW5kIG5vdCBzdWl0YWJsZSBmb3IgcHJvZHVjdGlvbiB1c2UtY2FzZXMsIGFuZCBtYXkgYmUgaGVhdmlseSByYXRlLWxpbWl0ZWQuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDE1IiwiY29tcGxldGlvbiI6IjAuMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwNzUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MzI3NjgsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9vMS1taW5pIiwibmFtZSI6Ik9wZW5BSTogbzEtbWluaSIsImNyZWF0ZWQiOjE3MjYwOTkyMDAsImRlc2NyaXB0aW9uIjoiVGhlIGxhdGVzdCBhbmQgc3Ryb25nZXN0IG1vZGVsIGZhbWlseSBmcm9tIE9wZW5BSSwgbzEgaXMgZGVzaWduZWQgdG8gc3BlbmQgbW9yZSB0aW1lIHRoaW5raW5nIGJlZm9yZSByZXNwb25kaW5nLlxuXG5UaGUgbzEgbW9kZWxzIGFyZSBvcHRpbWl6ZWQgZm9yIG1hdGgsIHNjaWVuY2UsIHByb2dyYW1taW5nLCBhbmQgb3RoZXIgU1RFTS1yZWxhdGVkIHRhc2tzLiBUaGV5IGNvbnNpc3RlbnRseSBleGhpYml0IFBoRC1sZXZlbCBhY2N1cmFjeSBvbiBiZW5jaG1hcmtzIGluIHBoeXNpY3MsIGNoZW1pc3RyeSwgYW5kIGJpb2xvZ3kuIExlYXJuIG1vcmUgaW4gdGhlIFtsYXVuY2ggYW5ub3VuY2VtZW50XShodHRwczovL29wZW5haS5jb20vbzEpLlxuXG5Ob3RlOiBUaGlzIG1vZGVsIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwgYW5kIG5vdCBzdWl0YWJsZSBmb3IgcHJvZHVjdGlvbiB1c2UtY2FzZXMsIGFuZCBtYXkgYmUgaGVhdmlseSByYXRlLWxpbWl0ZWQuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxMSIsImNvbXBsZXRpb24iOiIwLjAwMDAwNDQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwMDU1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjY1NTM2LCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvbzEtbWluaS0yMDI0LTA5LTEyIiwibmFtZSI6Ik9wZW5BSTogbzEtbWluaSAoMjAyNC0wOS0xMikiLCJjcmVhdGVkIjoxNzI2MDk5MjAwLCJkZXNjcmlwdGlvbiI6IlRoZSBsYXRlc3QgYW5kIHN0cm9uZ2VzdCBtb2RlbCBmYW1pbHkgZnJvbSBPcGVuQUksIG8xIGlzIGRlc2lnbmVkIHRvIHNwZW5kIG1vcmUgdGltZSB0aGlua2luZyBiZWZvcmUgcmVzcG9uZGluZy5cblxuVGhlIG8xIG1vZGVscyBhcmUgb3B0aW1pemVkIGZvciBtYXRoLCBzY2llbmNlLCBwcm9ncmFtbWluZywgYW5kIG90aGVyIFNURU0tcmVsYXRlZCB0YXNrcy4gVGhleSBjb25zaXN0ZW50bHkgZXhoaWJpdCBQaEQtbGV2ZWwgYWNjdXJhY3kgb24gYmVuY2htYXJrcyBpbiBwaHlzaWNzLCBjaGVtaXN0cnksIGFuZCBiaW9sb2d5LiBMZWFybiBtb3JlIGluIHRoZSBbbGF1bmNoIGFubm91bmNlbWVudF0oaHR0cHM6Ly9vcGVuYWkuY29tL28xKS5cblxuTm90ZTogVGhpcyBtb2RlbCBpcyBjdXJyZW50bHkgZXhwZXJpbWVudGFsIGFuZCBub3Qgc3VpdGFibGUgZm9yIHByb2R1Y3Rpb24gdXNlLWNhc2VzLCBhbmQgbWF5IGJlIGhlYXZpbHkgcmF0ZS1saW1pdGVkLiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMTEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDQ0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDA1NSJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo2NTUzNiwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWlzdHJhbGFpL3BpeHRyYWwtMTJiIiwibmFtZSI6Ik1pc3RyYWw6IFBpeHRyYWwgMTJCIiwiY3JlYXRlZCI6MTcyNTkyNjQwMCwiZGVzY3JpcHRpb24iOiJUaGUgZmlyc3QgbXVsdGktbW9kYWwsIHRleHQraW1hZ2UtdG8tdGV4dCBtb2RlbCBmcm9tIE1pc3RyYWwgQUkuIEl0cyB3ZWlnaHRzIHdlcmUgbGF1bmNoZWQgdmlhIHRvcnJlbnQ6IGh0dHBzOi8veC5jb20vbWlzdHJhbGFpL3N0YXR1cy8xODMzNzU4Mjg1MTY3NzIyODM2LiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDAxNDQ1Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImNvaGVyZS9jb21tYW5kLXItcGx1cy0wOC0yMDI0IiwibmFtZSI6IkNvaGVyZTogQ29tbWFuZCBSKyAoMDgtMjAyNCkiLCJjcmVhdGVkIjoxNzI0OTc2MDAwLCJkZXNjcmlwdGlvbiI6ImNvbW1hbmQtci1wbHVzLTA4LTIwMjQgaXMgYW4gdXBkYXRlIG9mIHRoZSBbQ29tbWFuZCBSK10oL21vZGVscy9jb2hlcmUvY29tbWFuZC1yLXBsdXMpIHdpdGggcm91Z2hseSA1MCUgaGlnaGVyIHRocm91Z2hwdXQgYW5kIDI1JSBsb3dlciBsYXRlbmNpZXMgYXMgY29tcGFyZWQgdG8gdGhlIHByZXZpb3VzIENvbW1hbmQgUisgdmVyc2lvbiwgd2hpbGUga2VlcGluZyB0aGUgaGFyZHdhcmUgZm9vdHByaW50IHRoZSBzYW1lLlxuXG5SZWFkIHRoZSBsYXVuY2ggcG9zdCBbaGVyZV0oaHR0cHM6Ly9kb2NzLmNvaGVyZS5jb20vY2hhbmdlbG9nL2NvbW1hbmQtZ2V0cy1yZWZyZXNoZWQpLlxuXG5Vc2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIENvaGVyZSdzIFtVc2FnZSBQb2xpY3ldKGh0dHBzOi8vZG9jcy5jb2hlcmUuY29tL2RvY3MvdXNhZ2UtcG9saWN5KSBhbmQgW1NhYVMgQWdyZWVtZW50XShodHRwczovL2NvaGVyZS5jb20vc2Fhcy1hZ3JlZW1lbnQpLiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDb2hlcmUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMjUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwMDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJjb2hlcmUvY29tbWFuZC1yLTA4LTIwMjQiLCJuYW1lIjoiQ29oZXJlOiBDb21tYW5kIFIgKDA4LTIwMjQpIiwiY3JlYXRlZCI6MTcyNDk3NjAwMCwiZGVzY3JpcHRpb24iOiJjb21tYW5kLXItMDgtMjAyNCBpcyBhbiB1cGRhdGUgb2YgdGhlIFtDb21tYW5kIFJdKC9tb2RlbHMvY29oZXJlL2NvbW1hbmQtcikgd2l0aCBpbXByb3ZlZCBwZXJmb3JtYW5jZSBmb3IgbXVsdGlsaW5ndWFsIHJldHJpZXZhbC1hdWdtZW50ZWQgZ2VuZXJhdGlvbiAoUkFHKSBhbmQgdG9vbCB1c2UuIE1vcmUgYnJvYWRseSwgaXQgaXMgYmV0dGVyIGF0IG1hdGgsIGNvZGUgYW5kIHJlYXNvbmluZyBhbmQgaXMgY29tcGV0aXRpdmUgd2l0aCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgbGFyZ2VyIENvbW1hbmQgUisgbW9kZWwuXG5cblJlYWQgdGhlIGxhdW5jaCBwb3N0IFtoZXJlXShodHRwczovL2RvY3MuY29oZXJlLmNvbS9jaGFuZ2Vsb2cvY29tbWFuZC1nZXRzLXJlZnJlc2hlZCkuXG5cblVzZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gQ29oZXJlJ3MgW1VzYWdlIFBvbGljeV0oaHR0cHM6Ly9kb2NzLmNvaGVyZS5jb20vZG9jcy91c2FnZS1wb2xpY3kpIGFuZCBbU2FhUyBBZ3JlZW1lbnRdKGh0dHBzOi8vY29oZXJlLmNvbS9zYWFzLWFncmVlbWVudCkuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNvaGVyZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMTUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA2IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDAwMCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InF3ZW4vcXdlbi0yLjUtdmwtN2ItaW5zdHJ1Y3Q6ZnJlZSIsIm5hbWUiOiJRd2VuOiBRd2VuMi41LVZMIDdCIEluc3RydWN0IChmcmVlKSIsImNyZWF0ZWQiOjE3MjQ4MDMyMDAsImRlc2NyaXB0aW9uIjoiUXdlbjIuNSBWTCA3QiBpcyBhIG11bHRpbW9kYWwgTExNIGZyb20gdGhlIFF3ZW4gVGVhbSB3aXRoIHRoZSBmb2xsb3dpbmcga2V5IGVuaGFuY2VtZW50czpcblxuLSBTb1RBIHVuZGVyc3RhbmRpbmcgb2YgaW1hZ2VzIG9mIHZhcmlvdXMgcmVzb2x1dGlvbiAmIHJhdGlvOiBRd2VuMi41LVZMIGFjaGlldmVzIHN0YXRlLW9mLXRoZS1hcnQgcGVyZm9ybWFuY2Ugb24gdmlzdWFsIHVuZGVyc3RhbmRpbmcgYmVuY2htYXJrcywgaW5jbHVkaW5nIE1hdGhWaXN0YSwgRG9jVlFBLCBSZWFsV29ybGRRQSwgTVRWUUEsIGV0Yy5cblxuLSBVbmRlcnN0YW5kaW5nIHZpZGVvcyBvZiAyMG1pbis6IFF3ZW4yLjUtVkwgY2FuIHVuZGVyc3RhbmQgdmlkZW9zIG92ZXIgMjAgbWludXRlcyBmb3IgaGlnaC1xdWFsaXR5IHZpZGVvLWJhc2VkIHF1ZXN0aW9uIGFuc3dlcmluZywgZGlhbG9nLCBjb250ZW50IGNyZWF0aW9uLCBldGMuXG5cbi0gQWdlbnQgdGhhdCBjYW4gb3BlcmF0ZSB5b3VyIG1vYmlsZXMsIHJvYm90cywgZXRjLjogd2l0aCB0aGUgYWJpbGl0aWVzIG9mIGNvbXBsZXggcmVhc29uaW5nIGFuZCBkZWNpc2lvbiBtYWtpbmcsIFF3ZW4yLjUtVkwgY2FuIGJlIGludGVncmF0ZWQgd2l0aCBkZXZpY2VzIGxpa2UgbW9iaWxlIHBob25lcywgcm9ib3RzLCBldGMuLCBmb3IgYXV0b21hdGljIG9wZXJhdGlvbiBiYXNlZCBvbiB2aXN1YWwgZW52aXJvbm1lbnQgYW5kIHRleHQgaW5zdHJ1Y3Rpb25zLlxuXG4tIE11bHRpbGluZ3VhbCBTdXBwb3J0OiB0byBzZXJ2ZSBnbG9iYWwgdXNlcnMsIGJlc2lkZXMgRW5nbGlzaCBhbmQgQ2hpbmVzZSwgUXdlbjIuNS1WTCBub3cgc3VwcG9ydHMgdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGV4dHMgaW4gZGlmZmVyZW50IGxhbmd1YWdlcyBpbnNpZGUgaW1hZ2VzLCBpbmNsdWRpbmcgbW9zdCBFdXJvcGVhbiBsYW5ndWFnZXMsIEphcGFuZXNlLCBLb3JlYW4sIEFyYWJpYywgVmlldG5hbWVzZSwgZXRjLlxuXG5Gb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhpcyBbYmxvZyBwb3N0XShodHRwczovL3F3ZW5sbS5naXRodWIuaW8vYmxvZy9xd2VuMi12bC8pIGFuZCBbR2l0SHViIHJlcG9dKGh0dHBzOi8vZ2l0aHViLmNvbS9Rd2VuTE0vUXdlbjItVkwpLlxuXG5Vc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW1Rvbmd5aSBRaWFud2VuIExJQ0VOU0UgQUdSRUVNRU5UXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL1F3ZW4vUXdlbjEuNS0xMTBCLUNoYXQvYmxvYi9tYWluL0xJQ0VOU0UpLiIsImNvbnRleHRfbGVuZ3RoIjo2NDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NjQwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NjQwMDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3ZW4tMi41LXZsLTdiLWluc3RydWN0IiwibmFtZSI6IlF3ZW46IFF3ZW4yLjUtVkwgN0IgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzI0ODAzMjAwLCJkZXNjcmlwdGlvbiI6IlF3ZW4yLjUgVkwgN0IgaXMgYSBtdWx0aW1vZGFsIExMTSBmcm9tIHRoZSBRd2VuIFRlYW0gd2l0aCB0aGUgZm9sbG93aW5nIGtleSBlbmhhbmNlbWVudHM6XG5cbi0gU29UQSB1bmRlcnN0YW5kaW5nIG9mIGltYWdlcyBvZiB2YXJpb3VzIHJlc29sdXRpb24gJiByYXRpbzogUXdlbjIuNS1WTCBhY2hpZXZlcyBzdGF0ZS1vZi10aGUtYXJ0IHBlcmZvcm1hbmNlIG9uIHZpc3VhbCB1bmRlcnN0YW5kaW5nIGJlbmNobWFya3MsIGluY2x1ZGluZyBNYXRoVmlzdGEsIERvY1ZRQSwgUmVhbFdvcmxkUUEsIE1UVlFBLCBldGMuXG5cbi0gVW5kZXJzdGFuZGluZyB2aWRlb3Mgb2YgMjBtaW4rOiBRd2VuMi41LVZMIGNhbiB1bmRlcnN0YW5kIHZpZGVvcyBvdmVyIDIwIG1pbnV0ZXMgZm9yIGhpZ2gtcXVhbGl0eSB2aWRlby1iYXNlZCBxdWVzdGlvbiBhbnN3ZXJpbmcsIGRpYWxvZywgY29udGVudCBjcmVhdGlvbiwgZXRjLlxuXG4tIEFnZW50IHRoYXQgY2FuIG9wZXJhdGUgeW91ciBtb2JpbGVzLCByb2JvdHMsIGV0Yy46IHdpdGggdGhlIGFiaWxpdGllcyBvZiBjb21wbGV4IHJlYXNvbmluZyBhbmQgZGVjaXNpb24gbWFraW5nLCBRd2VuMi41LVZMIGNhbiBiZSBpbnRlZ3JhdGVkIHdpdGggZGV2aWNlcyBsaWtlIG1vYmlsZSBwaG9uZXMsIHJvYm90cywgZXRjLiwgZm9yIGF1dG9tYXRpYyBvcGVyYXRpb24gYmFzZWQgb24gdmlzdWFsIGVudmlyb25tZW50IGFuZCB0ZXh0IGluc3RydWN0aW9ucy5cblxuLSBNdWx0aWxpbmd1YWwgU3VwcG9ydDogdG8gc2VydmUgZ2xvYmFsIHVzZXJzLCBiZXNpZGVzIEVuZ2xpc2ggYW5kIENoaW5lc2UsIFF3ZW4yLjUtVkwgbm93IHN1cHBvcnRzIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRleHRzIGluIGRpZmZlcmVudCBsYW5ndWFnZXMgaW5zaWRlIGltYWdlcywgaW5jbHVkaW5nIG1vc3QgRXVyb3BlYW4gbGFuZ3VhZ2VzLCBKYXBhbmVzZSwgS29yZWFuLCBBcmFiaWMsIFZpZXRuYW1lc2UsIGV0Yy5cblxuRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoaXMgW2Jsb2cgcG9zdF0oaHR0cHM6Ly9xd2VubG0uZ2l0aHViLmlvL2Jsb2cvcXdlbjItdmwvKSBhbmQgW0dpdEh1YiByZXBvXShodHRwczovL2dpdGh1Yi5jb20vUXdlbkxNL1F3ZW4yLVZMKS5cblxuVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIFtUb25neWkgUWlhbndlbiBMSUNFTlNFIEFHUkVFTUVOVF0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9Rd2VuL1F3ZW4xLjUtMTEwQi1DaGF0L2Jsb2IvbWFpbi9MSUNFTlNFKS4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDAwMTQ0NSIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJzYW8xMGsvbDMuMS1ldXJ5YWxlLTcwYiIsIm5hbWUiOiJTYW8xMEs6IExsYW1hIDMuMSBFdXJ5YWxlIDcwQiB2Mi4yIiwiY3JlYXRlZCI6MTcyNDgwMzIwMCwiZGVzY3JpcHRpb24iOiJFdXJ5YWxlIEwzLjEgNzBCIHYyLjIgaXMgYSBtb2RlbCBmb2N1c2VkIG9uIGNyZWF0aXZlIHJvbGVwbGF5IGZyb20gW1NhbzEwa10oaHR0cHM6Ly9rby1maS5jb20vc2FvMTBrKS4gSXQgaXMgdGhlIHN1Y2Nlc3NvciBvZiBbRXVyeWFsZSBMMyA3MEIgdjIuMV0oL21vZGVscy9zYW8xMGsvbDMtZXVyeWFsZS03MGIpLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA3IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvZ2VtaW5pLWZsYXNoLTEuNS04Yi1leHAiLCJuYW1lIjoiR29vZ2xlOiBHZW1pbmkgMS41IEZsYXNoIDhCIEV4cGVyaW1lbnRhbCIsImNyZWF0ZWQiOjE3MjQ4MDMyMDAsImRlc2NyaXB0aW9uIjoiR2VtaW5pIEZsYXNoIDEuNSA4QiBFeHBlcmltZW50YWwgaXMgYW4gZXhwZXJpbWVudGFsLCA4QiBwYXJhbWV0ZXIgdmVyc2lvbiBvZiB0aGUgW0dlbWluaSBGbGFzaCAxLjVdKC9tb2RlbHMvZ29vZ2xlL2dlbWluaS1mbGFzaC0xLjUpIG1vZGVsLlxuXG5Vc2FnZSBvZiBHZW1pbmkgaXMgc3ViamVjdCB0byBHb29nbGUncyBbR2VtaW5pIFRlcm1zIG9mIFVzZV0oaHR0cHM6Ly9haS5nb29nbGUuZGV2L3Rlcm1zKS5cblxuI211bHRpbW9kYWxcblxuTm90ZTogVGhpcyBtb2RlbCBpcyBjdXJyZW50bHkgZXhwZXJpbWVudGFsIGFuZCBub3Qgc3VpdGFibGUgZm9yIHByb2R1Y3Rpb24gdXNlLWNhc2VzLCBhbmQgbWF5IGJlIGhlYXZpbHkgcmF0ZS1saW1pdGVkLiIsImNvbnRleHRfbGVuZ3RoIjoxMDAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEwMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFpMjEvamFtYmEtMS01LW1pbmkiLCJuYW1lIjoiQUkyMTogSmFtYmEgMS41IE1pbmkiLCJjcmVhdGVkIjoxNzI0MzcxMjAwLCJkZXNjcmlwdGlvbiI6IkphbWJhIDEuNSBNaW5pIGlzIHRoZSB3b3JsZCdzIGZpcnN0IHByb2R1Y3Rpb24tZ3JhZGUgTWFtYmEtYmFzZWQgbW9kZWwsIGNvbWJpbmluZyBTU00gYW5kIFRyYW5zZm9ybWVyIGFyY2hpdGVjdHVyZXMgZm9yIGEgMjU2SyBjb250ZXh0IHdpbmRvdyBhbmQgaGlnaCBlZmZpY2llbmN5LlxuXG5JdCB3b3JrcyB3aXRoIDkgbGFuZ3VhZ2VzIGFuZCBjYW4gaGFuZGxlIHZhcmlvdXMgd3JpdGluZyBhbmQgYW5hbHlzaXMgdGFza3MgYXMgd2VsbCBhcyBvciBiZXR0ZXIgdGhhbiBzaW1pbGFyIHNtYWxsIG1vZGVscy5cblxuVGhpcyBtb2RlbCB1c2VzIGxlc3MgY29tcHV0ZXIgbWVtb3J5IGFuZCB3b3JrcyBmYXN0ZXIgd2l0aCBsb25nZXIgdGV4dHMgdGhhbiBwcmV2aW91cyBkZXNpZ25zLlxuXG5SZWFkIHRoZWlyIFthbm5vdW5jZW1lbnRdKGh0dHBzOi8vd3d3LmFpMjEuY29tL2Jsb2cvYW5ub3VuY2luZy1qYW1iYS1tb2RlbC1mYW1pbHkpIHRvIGxlYXJuIG1vcmUuIiwiY29udGV4dF9sZW5ndGgiOjI1NjAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik90aGVyIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjU2MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhaTIxL2phbWJhLTEtNS1sYXJnZSIsIm5hbWUiOiJBSTIxOiBKYW1iYSAxLjUgTGFyZ2UiLCJjcmVhdGVkIjoxNzI0MzcxMjAwLCJkZXNjcmlwdGlvbiI6IkphbWJhIDEuNSBMYXJnZSBpcyBwYXJ0IG9mIEFJMjEncyBuZXcgZmFtaWx5IG9mIG9wZW4gbW9kZWxzLCBvZmZlcmluZyBzdXBlcmlvciBzcGVlZCwgZWZmaWNpZW5jeSwgYW5kIHF1YWxpdHkuXG5cbkl0IGZlYXR1cmVzIGEgMjU2SyBlZmZlY3RpdmUgY29udGV4dCB3aW5kb3csIHRoZSBsb25nZXN0IGFtb25nIG9wZW4gbW9kZWxzLCBlbmFibGluZyBpbXByb3ZlZCBwZXJmb3JtYW5jZSBvbiB0YXNrcyBsaWtlIGRvY3VtZW50IHN1bW1hcml6YXRpb24gYW5kIGFuYWx5c2lzLlxuXG5CdWlsdCBvbiBhIG5vdmVsIFNTTS1UcmFuc2Zvcm1lciBhcmNoaXRlY3R1cmUsIGl0IG91dHBlcmZvcm1zIGxhcmdlciBtb2RlbHMgbGlrZSBMbGFtYSAzLjEgNzBCIG9uIGJlbmNobWFya3Mgd2hpbGUgbWFpbnRhaW5pbmcgcmVzb3VyY2UgZWZmaWNpZW5jeS5cblxuUmVhZCB0aGVpciBbYW5ub3VuY2VtZW50XShodHRwczovL3d3dy5haTIxLmNvbS9ibG9nL2Fubm91bmNpbmctamFtYmEtbW9kZWwtZmFtaWx5KSB0byBsZWFybiBtb3JlLiIsImNvbnRleHRfbGVuZ3RoIjoyNTYwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDA4IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyNTYwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pY3Jvc29mdC9waGktMy41LW1pbmktMTI4ay1pbnN0cnVjdCIsIm5hbWUiOiJNaWNyb3NvZnQ6IFBoaS0zLjUgTWluaSAxMjhLIEluc3RydWN0IiwiY3JlYXRlZCI6MTcyNDE5ODQwMCwiZGVzY3JpcHRpb24iOiJQaGktMy41IG1vZGVscyBhcmUgbGlnaHR3ZWlnaHQsIHN0YXRlLW9mLXRoZS1hcnQgb3BlbiBtb2RlbHMuIFRoZXNlIG1vZGVscyB3ZXJlIHRyYWluZWQgd2l0aCBQaGktMyBkYXRhc2V0cyB0aGF0IGluY2x1ZGUgYm90aCBzeW50aGV0aWMgZGF0YSBhbmQgdGhlIGZpbHRlcmVkLCBwdWJsaWNseSBhdmFpbGFibGUgd2Vic2l0ZXMgZGF0YSwgd2l0aCBhIGZvY3VzIG9uIGhpZ2ggcXVhbGl0eSBhbmQgcmVhc29uaW5nLWRlbnNlIHByb3BlcnRpZXMuIFBoaS0zLjUgTWluaSB1c2VzIDMuOEIgcGFyYW1ldGVycywgYW5kIGlzIGEgZGVuc2UgZGVjb2Rlci1vbmx5IHRyYW5zZm9ybWVyIG1vZGVsIHVzaW5nIHRoZSBzYW1lIHRva2VuaXplciBhcyBbUGhpLTMgTWluaV0oL21vZGVscy9taWNyb3NvZnQvcGhpLTMtbWluaS0xMjhrLWluc3RydWN0KS5cblxuVGhlIG1vZGVscyB1bmRlcndlbnQgYSByaWdvcm91cyBlbmhhbmNlbWVudCBwcm9jZXNzLCBpbmNvcnBvcmF0aW5nIGJvdGggc3VwZXJ2aXNlZCBmaW5lLXR1bmluZywgcHJveGltYWwgcG9saWN5IG9wdGltaXphdGlvbiwgYW5kIGRpcmVjdCBwcmVmZXJlbmNlIG9wdGltaXphdGlvbiB0byBlbnN1cmUgcHJlY2lzZSBpbnN0cnVjdGlvbiBhZGhlcmVuY2UgYW5kIHJvYnVzdCBzYWZldHkgbWVhc3VyZXMuIFdoZW4gYXNzZXNzZWQgYWdhaW5zdCBiZW5jaG1hcmtzIHRoYXQgdGVzdCBjb21tb24gc2Vuc2UsIGxhbmd1YWdlIHVuZGVyc3RhbmRpbmcsIG1hdGgsIGNvZGUsIGxvbmcgY29udGV4dCBhbmQgbG9naWNhbCByZWFzb25pbmcsIFBoaS0zLjUgbW9kZWxzIHNob3djYXNlZCByb2J1c3QgYW5kIHN0YXRlLW9mLXRoZS1hcnQgcGVyZm9ybWFuY2UgYW1vbmcgbW9kZWxzIHdpdGggbGVzcyB0aGFuIDEzIGJpbGxpb24gcGFyYW1ldGVycy4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjoicGhpMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibm91c3Jlc2VhcmNoL2hlcm1lcy0zLWxsYW1hLTMuMS03MGIiLCJuYW1lIjoiTm91czogSGVybWVzIDMgNzBCIEluc3RydWN0IiwiY3JlYXRlZCI6MTcyMzkzOTIwMCwiZGVzY3JpcHRpb24iOiJIZXJtZXMgMyBpcyBhIGdlbmVyYWxpc3QgbGFuZ3VhZ2UgbW9kZWwgd2l0aCBtYW55IGltcHJvdmVtZW50cyBvdmVyIFtIZXJtZXMgMl0oL21vZGVscy9ub3VzcmVzZWFyY2gvbm91cy1oZXJtZXMtMi1taXN0cmFsLTdiLWRwbyksIGluY2x1ZGluZyBhZHZhbmNlZCBhZ2VudGljIGNhcGFiaWxpdGllcywgbXVjaCBiZXR0ZXIgcm9sZXBsYXlpbmcsIHJlYXNvbmluZywgbXVsdGktdHVybiBjb252ZXJzYXRpb24sIGxvbmcgY29udGV4dCBjb2hlcmVuY2UsIGFuZCBpbXByb3ZlbWVudHMgYWNyb3NzIHRoZSBib2FyZC5cblxuSGVybWVzIDMgNzBCIGlzIGEgY29tcGV0aXRpdmUsIGlmIG5vdCBzdXBlcmlvciBmaW5ldHVuZSBvZiB0aGUgW0xsYW1hLTMuMSA3MEIgZm91bmRhdGlvbiBtb2RlbF0oL21vZGVscy9tZXRhLWxsYW1hL2xsYW1hLTMuMS03MGItaW5zdHJ1Y3QpLCBmb2N1c2VkIG9uIGFsaWduaW5nIExMTXMgdG8gdGhlIHVzZXIsIHdpdGggcG93ZXJmdWwgc3RlZXJpbmcgY2FwYWJpbGl0aWVzIGFuZCBjb250cm9sIGdpdmVuIHRvIHRoZSBlbmQgdXNlci5cblxuVGhlIEhlcm1lcyAzIHNlcmllcyBidWlsZHMgYW5kIGV4cGFuZHMgb24gdGhlIEhlcm1lcyAyIHNldCBvZiBjYXBhYmlsaXRpZXMsIGluY2x1ZGluZyBtb3JlIHBvd2VyZnVsIGFuZCByZWxpYWJsZSBmdW5jdGlvbiBjYWxsaW5nIGFuZCBzdHJ1Y3R1cmVkIG91dHB1dCBjYXBhYmlsaXRpZXMsIGdlbmVyYWxpc3QgYXNzaXN0YW50IGNhcGFiaWxpdGllcywgYW5kIGltcHJvdmVkIGNvZGUgZ2VuZXJhdGlvbiBza2lsbHMuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJjaGF0bWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDEyIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMyIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEzMTA3MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im5vdXNyZXNlYXJjaC9oZXJtZXMtMy1sbGFtYS0zLjEtNDA1YiIsIm5hbWUiOiJOb3VzOiBIZXJtZXMgMyA0MDVCIEluc3RydWN0IiwiY3JlYXRlZCI6MTcyMzc2NjQwMCwiZGVzY3JpcHRpb24iOiJIZXJtZXMgMyBpcyBhIGdlbmVyYWxpc3QgbGFuZ3VhZ2UgbW9kZWwgd2l0aCBtYW55IGltcHJvdmVtZW50cyBvdmVyIEhlcm1lcyAyLCBpbmNsdWRpbmcgYWR2YW5jZWQgYWdlbnRpYyBjYXBhYmlsaXRpZXMsIG11Y2ggYmV0dGVyIHJvbGVwbGF5aW5nLCByZWFzb25pbmcsIG11bHRpLXR1cm4gY29udmVyc2F0aW9uLCBsb25nIGNvbnRleHQgY29oZXJlbmNlLCBhbmQgaW1wcm92ZW1lbnRzIGFjcm9zcyB0aGUgYm9hcmQuXG5cbkhlcm1lcyAzIDQwNUIgaXMgYSBmcm9udGllci1sZXZlbCwgZnVsbC1wYXJhbWV0ZXIgZmluZXR1bmUgb2YgdGhlIExsYW1hLTMuMSA0MDVCIGZvdW5kYXRpb24gbW9kZWwsIGZvY3VzZWQgb24gYWxpZ25pbmcgTExNcyB0byB0aGUgdXNlciwgd2l0aCBwb3dlcmZ1bCBzdGVlcmluZyBjYXBhYmlsaXRpZXMgYW5kIGNvbnRyb2wgZ2l2ZW4gdG8gdGhlIGVuZCB1c2VyLlxuXG5UaGUgSGVybWVzIDMgc2VyaWVzIGJ1aWxkcyBhbmQgZXhwYW5kcyBvbiB0aGUgSGVybWVzIDIgc2V0IG9mIGNhcGFiaWxpdGllcywgaW5jbHVkaW5nIG1vcmUgcG93ZXJmdWwgYW5kIHJlbGlhYmxlIGZ1bmN0aW9uIGNhbGxpbmcgYW5kIHN0cnVjdHVyZWQgb3V0cHV0IGNhcGFiaWxpdGllcywgZ2VuZXJhbGlzdCBhc3Npc3RhbnQgY2FwYWJpbGl0aWVzLCBhbmQgaW1wcm92ZWQgY29kZSBnZW5lcmF0aW9uIHNraWxscy5cblxuSGVybWVzIDMgaXMgY29tcGV0aXRpdmUsIGlmIG5vdCBzdXBlcmlvciwgdG8gTGxhbWEtMy4xIEluc3RydWN0IG1vZGVscyBhdCBnZW5lcmFsIGNhcGFiaWxpdGllcywgd2l0aCB2YXJ5aW5nIHN0cmVuZ3RocyBhbmQgd2Vha25lc3NlcyBhdHRyaWJ1dGFibGUgYmV0d2VlbiB0aGUgdHdvLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA4IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEzMTA3MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9jaGF0Z3B0LTRvLWxhdGVzdCIsIm5hbWUiOiJPcGVuQUk6IENoYXRHUFQtNG8iLCJjcmVhdGVkIjoxNzIzNTkzNjAwLCJkZXNjcmlwdGlvbiI6Ik9wZW5BSSBDaGF0R1BUIDRvIGlzIGNvbnRpbnVhbGx5IHVwZGF0ZWQgYnkgT3BlbkFJIHRvIHBvaW50IHRvIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgR1BULTRvIHVzZWQgYnkgQ2hhdEdQVC4gSXQgdGhlcmVmb3JlIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSB0aGUgQVBJIHZlcnNpb24gb2YgW0dQVC00b10oL21vZGVscy9vcGVuYWkvZ3B0LTRvKSBpbiB0aGF0IGl0IGhhcyBhZGRpdGlvbmFsIFJMSEYuIEl0IGlzIGludGVuZGVkIGZvciByZXNlYXJjaCBhbmQgZXZhbHVhdGlvbi5cblxuT3BlbkFJIG5vdGVzIHRoYXQgdGhpcyBtb2RlbCBpcyBub3Qgc3VpdGVkIGZvciBwcm9kdWN0aW9uIHVzZS1jYXNlcyBhcyBpdCBtYXkgYmUgcmVtb3ZlZCBvciByZWRpcmVjdGVkIHRvIGFub3RoZXIgbW9kZWwgaW4gdGhlIGZ1dHVyZS4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwNSIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwNzIyNSIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxNjM4NCwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoic2FvMTBrL2wzLWx1bmFyaXMtOGIiLCJuYW1lIjoiU2FvMTBLOiBMbGFtYSAzIDhCIEx1bmFyaXMiLCJjcmVhdGVkIjoxNzIzNTA3MjAwLCJkZXNjcmlwdGlvbiI6Ikx1bmFyaXMgOEIgaXMgYSB2ZXJzYXRpbGUgZ2VuZXJhbGlzdCBhbmQgcm9sZXBsYXlpbmcgbW9kZWwgYmFzZWQgb24gTGxhbWEgMy4gSXQncyBhIHN0cmF0ZWdpYyBtZXJnZSBvZiBtdWx0aXBsZSBtb2RlbHMsIGRlc2lnbmVkIHRvIGJhbGFuY2UgY3JlYXRpdml0eSB3aXRoIGltcHJvdmVkIGxvZ2ljIGFuZCBnZW5lcmFsIGtub3dsZWRnZS5cblxuQ3JlYXRlZCBieSBbU2FvMTBrXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL1NhbzEwayksIHRoaXMgbW9kZWwgYWltcyB0byBvZmZlciBhbiBpbXByb3ZlZCBleHBlcmllbmNlIG92ZXIgU3RoZW5vIHYzLjIsIHdpdGggZW5oYW5jZWQgY3JlYXRpdml0eSBhbmQgbG9naWNhbCByZWFzb25pbmcuXG5cbkZvciBiZXN0IHJlc3VsdHMsIHVzZSB3aXRoIExsYW1hIDMgSW5zdHJ1Y3QgY29udGV4dCB0ZW1wbGF0ZSwgdGVtcGVyYXR1cmUgMS40LCBhbmQgbWluX3AgMC4xLiIsImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAwNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODE5MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYWV0aGVyd2lpbmcvbW4tc3RhcmNhbm5vbi0xMmIiLCJuYW1lIjoiQWV0aGVyd2lpbmc6IFN0YXJjYW5ub24gMTJCIiwiY3JlYXRlZCI6MTcyMzUwNzIwMCwiZGVzY3JpcHRpb24iOiJTdGFyY2Fubm9uIDEyQiB2MiBpcyBhIGNyZWF0aXZlIHJvbGVwbGF5IGFuZCBzdG9yeSB3cml0aW5nIG1vZGVsLCBiYXNlZCBvbiBNaXN0cmFsIE5lbW8sIHVzaW5nIFtub3RoaW5naWlzcmVhbC9tbi1jZWxlc3RlLTEyYl0oL25vdGhpbmdpaXNyZWFsL21uLWNlbGVzdGUtMTJiKSBhcyBhIGJhc2UsIHdpdGggW2ludGVydml0ZW5zL21pbmktbWFnbnVtLTEyYi12MS4xXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL2ludGVydml0ZW5zL21pbmktbWFnbnVtLTEyYi12MS4xKSBtZXJnZWQgaW4gdXNpbmcgdGhlIFtUSUVTXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMjMwNi4wMTcwOCkgbWV0aG9kLlxuXG5BbHRob3VnaCBtb3JlIHNpbWlsYXIgdG8gTWFnbnVtIG92ZXJhbGwsIHRoZSBtb2RlbCByZW1haW5zIHZlcnkgY3JlYXRpdmUsIHdpdGggYSBwbGVhc2FudCB3cml0aW5nIHN0eWxlLiBJdCBpcyByZWNvbW1lbmRlZCBmb3IgcGVvcGxlIHdhbnRpbmcgbW9yZSB2YXJpZXR5IHRoYW4gTWFnbnVtLCBhbmQgeWV0IG1vcmUgdmVyYm9zZSBwcm9zZSB0aGFuIENlbGVzdGUuIiwiY29udGV4dF9sZW5ndGgiOjE2Mzg0LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOiJjaGF0bWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDgiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDEyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC00by0yMDI0LTA4LTA2IiwibmFtZSI6Ik9wZW5BSTogR1BULTRvICgyMDI0LTA4LTA2KSIsImNyZWF0ZWQiOjE3MjI5MDI0MDAsImRlc2NyaXB0aW9uIjoiVGhlIDIwMjQtMDgtMDYgdmVyc2lvbiBvZiBHUFQtNG8gb2ZmZXJzIGltcHJvdmVkIHBlcmZvcm1hbmNlIGluIHN0cnVjdHVyZWQgb3V0cHV0cywgd2l0aCB0aGUgYWJpbGl0eSB0byBzdXBwbHkgYSBKU09OIHNjaGVtYSBpbiB0aGUgcmVzcG9uZV9mb3JtYXQuIFJlYWQgbW9yZSBbaGVyZV0oaHR0cHM6Ly9vcGVuYWkuY29tL2luZGV4L2ludHJvZHVjaW5nLXN0cnVjdHVyZWQtb3V0cHV0cy1pbi10aGUtYXBpLykuXG5cbkdQVC00byAoXCJvXCIgZm9yIFwib21uaVwiKSBpcyBPcGVuQUkncyBsYXRlc3QgQUkgbW9kZWwsIHN1cHBvcnRpbmcgYm90aCB0ZXh0IGFuZCBpbWFnZSBpbnB1dHMgd2l0aCB0ZXh0IG91dHB1dHMuIEl0IG1haW50YWlucyB0aGUgaW50ZWxsaWdlbmNlIGxldmVsIG9mIFtHUFQtNCBUdXJib10oL21vZGVscy9vcGVuYWkvZ3B0LTQtdHVyYm8pIHdoaWxlIGJlaW5nIHR3aWNlIGFzIGZhc3QgYW5kIDUwJSBtb3JlIGNvc3QtZWZmZWN0aXZlLiBHUFQtNG8gYWxzbyBvZmZlcnMgaW1wcm92ZWQgcGVyZm9ybWFuY2UgaW4gcHJvY2Vzc2luZyBub24tRW5nbGlzaCBsYW5ndWFnZXMgYW5kIGVuaGFuY2VkIHZpc3VhbCBjYXBhYmlsaXRpZXMuXG5cbkZvciBiZW5jaG1hcmtpbmcgYWdhaW5zdCBvdGhlciBtb2RlbHMsIGl0IHdhcyBicmllZmx5IGNhbGxlZCBbXCJpbS1hbHNvLWEtZ29vZC1ncHQyLWNoYXRib3RcIl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9MaWFtRmVkdXMvc3RhdHVzLzE3OTAwNjQ5NjM5NjYzNzAyMDkpIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDI1IiwiY29tcGxldGlvbiI6IjAuMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDM2MTMiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDEyNSJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxNjM4NCwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWV0YS1sbGFtYS9sbGFtYS0zLjEtNDA1YjpmcmVlIiwibmFtZSI6Ik1ldGE6IExsYW1hIDMuMSA0MDVCIChiYXNlKSAoZnJlZSkiLCJjcmVhdGVkIjoxNzIyNTU2ODAwLCJkZXNjcmlwdGlvbiI6Ik1ldGEncyBsYXRlc3QgY2xhc3Mgb2YgbW9kZWwgKExsYW1hIDMuMSkgbGF1bmNoZWQgd2l0aCBhIHZhcmlldHkgb2Ygc2l6ZXMgJiBmbGF2b3JzLiBUaGlzIGlzIHRoZSBiYXNlIDQwNUIgcHJlLXRyYWluZWQgdmVyc2lvbi5cblxuSXQgaGFzIGRlbW9uc3RyYXRlZCBzdHJvbmcgcGVyZm9ybWFuY2UgY29tcGFyZWQgdG8gbGVhZGluZyBjbG9zZWQtc291cmNlIG1vZGVscyBpbiBodW1hbiBldmFsdWF0aW9ucy5cblxuVG8gcmVhZCBtb3JlIGFib3V0IHRoZSBtb2RlbCByZWxlYXNlLCBbY2xpY2sgaGVyZV0oaHR0cHM6Ly9haS5tZXRhLmNvbS9ibG9nL21ldGEtbGxhbWEtMy8pLiBVc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW01ldGEncyBBY2NlcHRhYmxlIFVzZSBQb2xpY3ldKGh0dHBzOi8vbGxhbWEubWV0YS5jb20vbGxhbWEzL3VzZS1wb2xpY3kvKS4iLCJjb250ZXh0X2xlbmd0aCI6NjQwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibm9uZSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NjQwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtMy4xLTQwNWIiLCJuYW1lIjoiTWV0YTogTGxhbWEgMy4xIDQwNUIgKGJhc2UpIiwiY3JlYXRlZCI6MTcyMjU1NjgwMCwiZGVzY3JpcHRpb24iOiJNZXRhJ3MgbGF0ZXN0IGNsYXNzIG9mIG1vZGVsIChMbGFtYSAzLjEpIGxhdW5jaGVkIHdpdGggYSB2YXJpZXR5IG9mIHNpemVzICYgZmxhdm9ycy4gVGhpcyBpcyB0aGUgYmFzZSA0MDVCIHByZS10cmFpbmVkIHZlcnNpb24uXG5cbkl0IGhhcyBkZW1vbnN0cmF0ZWQgc3Ryb25nIHBlcmZvcm1hbmNlIGNvbXBhcmVkIHRvIGxlYWRpbmcgY2xvc2VkLXNvdXJjZSBtb2RlbHMgaW4gaHVtYW4gZXZhbHVhdGlvbnMuXG5cblRvIHJlYWQgbW9yZSBhYm91dCB0aGUgbW9kZWwgcmVsZWFzZSwgW2NsaWNrIGhlcmVdKGh0dHBzOi8vYWkubWV0YS5jb20vYmxvZy9tZXRhLWxsYW1hLTMvKS4gVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIFtNZXRhJ3MgQWNjZXB0YWJsZSBVc2UgUG9saWN5XShodHRwczovL2xsYW1hLm1ldGEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6Im5vbmUifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im5vdGhpbmdpaXNyZWFsL21uLWNlbGVzdGUtMTJiIiwibmFtZSI6Ik1pc3RyYWwgTmVtbyAxMkIgQ2VsZXN0ZSIsImNyZWF0ZWQiOjE3MjI1NTY4MDAsImRlc2NyaXB0aW9uIjoiQSBzcGVjaWFsaXplZCBzdG9yeSB3cml0aW5nIGFuZCByb2xlcGxheWluZyBtb2RlbCBiYXNlZCBvbiBNaXN0cmFsJ3MgTmVNbyAxMkIgSW5zdHJ1Y3QuIEZpbmUtdHVuZWQgb24gY3VyYXRlZCBkYXRhc2V0cyBpbmNsdWRpbmcgUmVkZGl0IFdyaXRpbmcgUHJvbXB0cyBhbmQgT3B1cyBJbnN0cnVjdCAyNUsuXG5cblRoaXMgbW9kZWwgZXhjZWxzIGF0IGNyZWF0aXZlIHdyaXRpbmcsIG9mZmVyaW5nIGltcHJvdmVkIE5TRlcgY2FwYWJpbGl0aWVzLCB3aXRoIHNtYXJ0ZXIgYW5kIG1vcmUgYWN0aXZlIG5hcnJhdGlvbi4gSXQgZGVtb25zdHJhdGVzIHJlbWFya2FibGUgdmVyc2F0aWxpdHkgaW4gYm90aCBTRlcgYW5kIE5TRlcgc2NlbmFyaW9zLCB3aXRoIHN0cm9uZyBPdXQgb2YgQ2hhcmFjdGVyIChPT0MpIHN0ZWVyaW5nIGNhcGFiaWxpdGllcywgYWxsb3dpbmcgZmluZS10dW5lZCBjb250cm9sIG92ZXIgbmFycmF0aXZlIGRpcmVjdGlvbiBhbmQgY2hhcmFjdGVyIGJlaGF2aW9yLlxuXG5DaGVjayBvdXQgdGhlIG1vZGVsJ3MgW0h1Z2dpbmdGYWNlIHBhZ2VdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vbm90aGluZ2lpc3JlYWwvTU4tMTJCLUNlbGVzdGUtVjEuOSkgZm9yIGRldGFpbHMgb24gd2hhdCBwYXJhbWV0ZXJzIGFuZCBwcm9tcHRzIHdvcmsgYmVzdCEiLCJjb250ZXh0X2xlbmd0aCI6MTYzODQsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6ImNoYXRtbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjE2Mzg0LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJwZXJwbGV4aXR5L2xsYW1hLTMuMS1zb25hci1zbWFsbC0xMjhrLW9ubGluZSIsIm5hbWUiOiJQZXJwbGV4aXR5OiBMbGFtYSAzLjEgU29uYXIgOEIgT25saW5lIiwiY3JlYXRlZCI6MTcyMjQ3MDQwMCwiZGVzY3JpcHRpb24iOiJMbGFtYSAzLjEgU29uYXIgaXMgUGVycGxleGl0eSdzIGxhdGVzdCBtb2RlbCBmYW1pbHkuIEl0IHN1cnBhc3NlcyB0aGVpciBlYXJsaWVyIFNvbmFyIG1vZGVscyBpbiBjb3N0LWVmZmljaWVuY3ksIHNwZWVkLCBhbmQgcGVyZm9ybWFuY2UuXG5cblRoaXMgaXMgdGhlIG9ubGluZSB2ZXJzaW9uIG9mIHRoZSBbb2ZmbGluZSBjaGF0IG1vZGVsXSgvbW9kZWxzL3BlcnBsZXhpdHkvbGxhbWEtMy4xLXNvbmFyLXNtYWxsLTEyOGstY2hhdCkuIEl0IGlzIGZvY3VzZWQgb24gZGVsaXZlcmluZyBoZWxwZnVsLCB1cC10by1kYXRlLCBhbmQgZmFjdHVhbCByZXNwb25zZXMuICNvbmxpbmUiLCJjb250ZXh0X2xlbmd0aCI6MTI3MDcyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMiIsInJlcXVlc3QiOiIwLjAwNSIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyNzA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicGVycGxleGl0eS9sbGFtYS0zLjEtc29uYXItbGFyZ2UtMTI4ay1vbmxpbmUiLCJuYW1lIjoiUGVycGxleGl0eTogTGxhbWEgMy4xIFNvbmFyIDcwQiBPbmxpbmUiLCJjcmVhdGVkIjoxNzIyNDcwNDAwLCJkZXNjcmlwdGlvbiI6IkxsYW1hIDMuMSBTb25hciBpcyBQZXJwbGV4aXR5J3MgbGF0ZXN0IG1vZGVsIGZhbWlseS4gSXQgc3VycGFzc2VzIHRoZWlyIGVhcmxpZXIgU29uYXIgbW9kZWxzIGluIGNvc3QtZWZmaWNpZW5jeSwgc3BlZWQsIGFuZCBwZXJmb3JtYW5jZS5cblxuVGhpcyBpcyB0aGUgb25saW5lIHZlcnNpb24gb2YgdGhlIFtvZmZsaW5lIGNoYXQgbW9kZWxdKC9tb2RlbHMvcGVycGxleGl0eS9sbGFtYS0zLjEtc29uYXItbGFyZ2UtMTI4ay1jaGF0KS4gSXQgaXMgZm9jdXNlZCBvbiBkZWxpdmVyaW5nIGhlbHBmdWwsIHVwLXRvLWRhdGUsIGFuZCBmYWN0dWFsIHJlc3BvbnNlcy4gI29ubGluZSIsImNvbnRleHRfbGVuZ3RoIjoxMjcwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMSIsInJlcXVlc3QiOiIwLjAwNSIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyNzA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWV0YS1sbGFtYS9sbGFtYS0zLjEtOGItaW5zdHJ1Y3Q6ZnJlZSIsIm5hbWUiOiJNZXRhOiBMbGFtYSAzLjEgOEIgSW5zdHJ1Y3QgKGZyZWUpIiwiY3JlYXRlZCI6MTcyMTY5MjgwMCwiZGVzY3JpcHRpb24iOiJNZXRhJ3MgbGF0ZXN0IGNsYXNzIG9mIG1vZGVsIChMbGFtYSAzLjEpIGxhdW5jaGVkIHdpdGggYSB2YXJpZXR5IG9mIHNpemVzICYgZmxhdm9ycy4gVGhpcyA4QiBpbnN0cnVjdC10dW5lZCB2ZXJzaW9uIGlzIGZhc3QgYW5kIGVmZmljaWVudC5cblxuSXQgaGFzIGRlbW9uc3RyYXRlZCBzdHJvbmcgcGVyZm9ybWFuY2UgY29tcGFyZWQgdG8gbGVhZGluZyBjbG9zZWQtc291cmNlIG1vZGVscyBpbiBodW1hbiBldmFsdWF0aW9ucy5cblxuVG8gcmVhZCBtb3JlIGFib3V0IHRoZSBtb2RlbCByZWxlYXNlLCBbY2xpY2sgaGVyZV0oaHR0cHM6Ly9haS5tZXRhLmNvbS9ibG9nL21ldGEtbGxhbWEtMy0xLykuIFVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbTWV0YSdzIEFjY2VwdGFibGUgVXNlIFBvbGljeV0oaHR0cHM6Ly9sbGFtYS5tZXRhLmNvbS9sbGFtYTMvdXNlLXBvbGljeS8pLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMCIsImNvbXBsZXRpb24iOiIwIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtMy4xLThiLWluc3RydWN0IiwibmFtZSI6Ik1ldGE6IExsYW1hIDMuMSA4QiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MjE2OTI4MDAsImRlc2NyaXB0aW9uIjoiTWV0YSdzIGxhdGVzdCBjbGFzcyBvZiBtb2RlbCAoTGxhbWEgMy4xKSBsYXVuY2hlZCB3aXRoIGEgdmFyaWV0eSBvZiBzaXplcyAmIGZsYXZvcnMuIFRoaXMgOEIgaW5zdHJ1Y3QtdHVuZWQgdmVyc2lvbiBpcyBmYXN0IGFuZCBlZmZpY2llbnQuXG5cbkl0IGhhcyBkZW1vbnN0cmF0ZWQgc3Ryb25nIHBlcmZvcm1hbmNlIGNvbXBhcmVkIHRvIGxlYWRpbmcgY2xvc2VkLXNvdXJjZSBtb2RlbHMgaW4gaHVtYW4gZXZhbHVhdGlvbnMuXG5cblRvIHJlYWQgbW9yZSBhYm91dCB0aGUgbW9kZWwgcmVsZWFzZSwgW2NsaWNrIGhlcmVdKGh0dHBzOi8vYWkubWV0YS5jb20vYmxvZy9tZXRhLWxsYW1hLTMtMS8pLiBVc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW01ldGEncyBBY2NlcHRhYmxlIFVzZSBQb2xpY3ldKGh0dHBzOi8vbGxhbWEubWV0YS5jb20vbGxhbWEzL3VzZS1wb2xpY3kvKS4iLCJjb250ZXh0X2xlbmd0aCI6MTYzODQsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDAzIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxNjM4NCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtMy4xLTQwNWItaW5zdHJ1Y3QiLCJuYW1lIjoiTWV0YTogTGxhbWEgMy4xIDQwNUIgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzIxNjkyODAwLCJkZXNjcmlwdGlvbiI6IlRoZSBoaWdobHkgYW50aWNpcGF0ZWQgNDAwQiBjbGFzcyBvZiBMbGFtYTMgaXMgaGVyZSEgQ2xvY2tpbmcgaW4gYXQgMTI4ayBjb250ZXh0IHdpdGggaW1wcmVzc2l2ZSBldmFsIHNjb3JlcywgdGhlIE1ldGEgQUkgdGVhbSBjb250aW51ZXMgdG8gcHVzaCB0aGUgZnJvbnRpZXIgb2Ygb3Blbi1zb3VyY2UgTExNcy5cblxuTWV0YSdzIGxhdGVzdCBjbGFzcyBvZiBtb2RlbCAoTGxhbWEgMy4xKSBsYXVuY2hlZCB3aXRoIGEgdmFyaWV0eSBvZiBzaXplcyAmIGZsYXZvcnMuIFRoaXMgNDA1QiBpbnN0cnVjdC10dW5lZCB2ZXJzaW9uIGlzIG9wdGltaXplZCBmb3IgaGlnaCBxdWFsaXR5IGRpYWxvZ3VlIHVzZWNhc2VzLlxuXG5JdCBoYXMgZGVtb25zdHJhdGVkIHN0cm9uZyBwZXJmb3JtYW5jZSBjb21wYXJlZCB0byBsZWFkaW5nIGNsb3NlZC1zb3VyY2UgbW9kZWxzIGluY2x1ZGluZyBHUFQtNG8gYW5kIENsYXVkZSAzLjUgU29ubmV0IGluIGV2YWx1YXRpb25zLlxuXG5UbyByZWFkIG1vcmUgYWJvdXQgdGhlIG1vZGVsIHJlbGVhc2UsIFtjbGljayBoZXJlXShodHRwczovL2FpLm1ldGEuY29tL2Jsb2cvbWV0YS1sbGFtYS0zLTEvKS4gVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIFtNZXRhJ3MgQWNjZXB0YWJsZSBVc2UgUG9saWN5XShodHRwczovL2xsYW1hLm1ldGEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDgiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtZXRhLWxsYW1hL2xsYW1hLTMuMS03MGItaW5zdHJ1Y3QiLCJuYW1lIjoiTWV0YTogTGxhbWEgMy4xIDcwQiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MjE2OTI4MDAsImRlc2NyaXB0aW9uIjoiTWV0YSdzIGxhdGVzdCBjbGFzcyBvZiBtb2RlbCAoTGxhbWEgMy4xKSBsYXVuY2hlZCB3aXRoIGEgdmFyaWV0eSBvZiBzaXplcyAmIGZsYXZvcnMuIFRoaXMgNzBCIGluc3RydWN0LXR1bmVkIHZlcnNpb24gaXMgb3B0aW1pemVkIGZvciBoaWdoIHF1YWxpdHkgZGlhbG9ndWUgdXNlY2FzZXMuXG5cbkl0IGhhcyBkZW1vbnN0cmF0ZWQgc3Ryb25nIHBlcmZvcm1hbmNlIGNvbXBhcmVkIHRvIGxlYWRpbmcgY2xvc2VkLXNvdXJjZSBtb2RlbHMgaW4gaHVtYW4gZXZhbHVhdGlvbnMuXG5cblRvIHJlYWQgbW9yZSBhYm91dCB0aGUgbW9kZWwgcmVsZWFzZSwgW2NsaWNrIGhlcmVdKGh0dHBzOi8vYWkubWV0YS5jb20vYmxvZy9tZXRhLWxsYW1hLTMtMS8pLiBVc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW01ldGEncyBBY2NlcHRhYmxlIFVzZSBQb2xpY3ldKGh0dHBzOi8vbGxhbWEubWV0YS5jb20vbGxhbWEzL3VzZS1wb2xpY3kvKS4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAxMTkiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAzOSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MzI3NjgsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaXN0cmFsYWkvY29kZXN0cmFsLW1hbWJhIiwibmFtZSI6Ik1pc3RyYWw6IENvZGVzdHJhbCBNYW1iYSIsImNyZWF0ZWQiOjE3MjEzNDcyMDAsImRlc2NyaXB0aW9uIjoiQSA3LjNCIHBhcmFtZXRlciBNYW1iYS1iYXNlZCBtb2RlbCBkZXNpZ25lZCBmb3IgY29kZSBhbmQgcmVhc29uaW5nIHRhc2tzLlxuXG4tIExpbmVhciB0aW1lIGluZmVyZW5jZSwgYWxsb3dpbmcgZm9yIHRoZW9yZXRpY2FsbHkgaW5maW5pdGUgc2VxdWVuY2UgbGVuZ3Roc1xuLSAyNTZrIHRva2VuIGNvbnRleHQgd2luZG93XG4tIE9wdGltaXplZCBmb3IgcXVpY2sgcmVzcG9uc2VzLCBlc3BlY2lhbGx5IGJlbmVmaWNpYWwgZm9yIGNvZGUgcHJvZHVjdGl2aXR5XG4tIFBlcmZvcm1zIGNvbXBhcmFibHkgdG8gc3RhdGUtb2YtdGhlLWFydCB0cmFuc2Zvcm1lciBtb2RlbHMgaW4gY29kZSBhbmQgcmVhc29uaW5nIHRhc2tzXG4tIEF2YWlsYWJsZSB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlIGZvciBmcmVlIHVzZSwgbW9kaWZpY2F0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIiwiY29udGV4dF9sZW5ndGgiOjI2MjE0NCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDI1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMjUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjI2MjE0NCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWlzdHJhbGFpL21pc3RyYWwtbmVtbzpmcmVlIiwibmFtZSI6Ik1pc3RyYWw6IE1pc3RyYWwgTmVtbyAoZnJlZSkiLCJjcmVhdGVkIjoxNzIxMzQ3MjAwLCJkZXNjcmlwdGlvbiI6IkEgMTJCIHBhcmFtZXRlciBtb2RlbCB3aXRoIGEgMTI4ayB0b2tlbiBjb250ZXh0IGxlbmd0aCBidWlsdCBieSBNaXN0cmFsIGluIGNvbGxhYm9yYXRpb24gd2l0aCBOVklESUEuXG5cblRoZSBtb2RlbCBpcyBtdWx0aWxpbmd1YWwsIHN1cHBvcnRpbmcgRW5nbGlzaCwgRnJlbmNoLCBHZXJtYW4sIFNwYW5pc2gsIEl0YWxpYW4sIFBvcnR1Z3Vlc2UsIENoaW5lc2UsIEphcGFuZXNlLCBLb3JlYW4sIEFyYWJpYywgYW5kIEhpbmRpLlxuXG5JdCBzdXBwb3J0cyBmdW5jdGlvbiBjYWxsaW5nIGFuZCBpcyByZWxlYXNlZCB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlLiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6Im1pc3RyYWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMjgwMDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaXN0cmFsYWkvbWlzdHJhbC1uZW1vIiwibmFtZSI6Ik1pc3RyYWw6IE1pc3RyYWwgTmVtbyIsImNyZWF0ZWQiOjE3MjEzNDcyMDAsImRlc2NyaXB0aW9uIjoiQSAxMkIgcGFyYW1ldGVyIG1vZGVsIHdpdGggYSAxMjhrIHRva2VuIGNvbnRleHQgbGVuZ3RoIGJ1aWx0IGJ5IE1pc3RyYWwgaW4gY29sbGFib3JhdGlvbiB3aXRoIE5WSURJQS5cblxuVGhlIG1vZGVsIGlzIG11bHRpbGluZ3VhbCwgc3VwcG9ydGluZyBFbmdsaXNoLCBGcmVuY2gsIEdlcm1hbiwgU3BhbmlzaCwgSXRhbGlhbiwgUG9ydHVndWVzZSwgQ2hpbmVzZSwgSmFwYW5lc2UsIEtvcmVhbiwgQXJhYmljLCBhbmQgSGluZGkuXG5cbkl0IHN1cHBvcnRzIGZ1bmN0aW9uIGNhbGxpbmcgYW5kIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UuIiwiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjoibWlzdHJhbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDM1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMDgiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEzMTA3MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC00by1taW5pIiwibmFtZSI6Ik9wZW5BSTogR1BULTRvLW1pbmkiLCJjcmVhdGVkIjoxNzIxMjYwODAwLCJkZXNjcmlwdGlvbiI6IkdQVC00byBtaW5pIGlzIE9wZW5BSSdzIG5ld2VzdCBtb2RlbCBhZnRlciBbR1BULTQgT21uaV0oL21vZGVscy9vcGVuYWkvZ3B0LTRvKSwgc3VwcG9ydGluZyBib3RoIHRleHQgYW5kIGltYWdlIGlucHV0cyB3aXRoIHRleHQgb3V0cHV0cy5cblxuQXMgdGhlaXIgbW9zdCBhZHZhbmNlZCBzbWFsbCBtb2RlbCwgaXQgaXMgbWFueSBtdWx0aXBsZXMgbW9yZSBhZmZvcmRhYmxlIHRoYW4gb3RoZXIgcmVjZW50IGZyb250aWVyIG1vZGVscywgYW5kIG1vcmUgdGhhbiA2MCUgY2hlYXBlciB0aGFuIFtHUFQtMy41IFR1cmJvXSgvbW9kZWxzL29wZW5haS9ncHQtMy41LXR1cmJvKS4gSXQgbWFpbnRhaW5zIFNPVEEgaW50ZWxsaWdlbmNlLCB3aGlsZSBiZWluZyBzaWduaWZpY2FudGx5IG1vcmUgY29zdC1lZmZlY3RpdmUuXG5cbkdQVC00byBtaW5pIGFjaGlldmVzIGFuIDgyJSBzY29yZSBvbiBNTUxVIGFuZCBwcmVzZW50bHkgcmFua3MgaGlnaGVyIHRoYW4gR1BULTQgb24gY2hhdCBwcmVmZXJlbmNlcyBbY29tbW9uIGxlYWRlcmJvYXJkc10oaHR0cHM6Ly9hcmVuYS5sbXN5cy5vcmcvKS5cblxuQ2hlY2sgb3V0IHRoZSBbbGF1bmNoIGFubm91bmNlbWVudF0oaHR0cHM6Ly9vcGVuYWkuY29tL2luZGV4L2dwdC00by1taW5pLWFkdmFuY2luZy1jb3N0LWVmZmljaWVudC1pbnRlbGxpZ2VuY2UvKSB0byBsZWFybiBtb3JlLlxuXG4jbXVsdGltb2RhbCIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMTUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA2IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDAwMjE3Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIiwiaW5wdXRfY2FjaGVfcmVhZCI6IjAuMDAwMDAwMDc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjE2Mzg0LCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvZ3B0LTRvLW1pbmktMjAyNC0wNy0xOCIsIm5hbWUiOiJPcGVuQUk6IEdQVC00by1taW5pICgyMDI0LTA3LTE4KSIsImNyZWF0ZWQiOjE3MjEyNjA4MDAsImRlc2NyaXB0aW9uIjoiR1BULTRvIG1pbmkgaXMgT3BlbkFJJ3MgbmV3ZXN0IG1vZGVsIGFmdGVyIFtHUFQtNCBPbW5pXSgvbW9kZWxzL29wZW5haS9ncHQtNG8pLCBzdXBwb3J0aW5nIGJvdGggdGV4dCBhbmQgaW1hZ2UgaW5wdXRzIHdpdGggdGV4dCBvdXRwdXRzLlxuXG5BcyB0aGVpciBtb3N0IGFkdmFuY2VkIHNtYWxsIG1vZGVsLCBpdCBpcyBtYW55IG11bHRpcGxlcyBtb3JlIGFmZm9yZGFibGUgdGhhbiBvdGhlciByZWNlbnQgZnJvbnRpZXIgbW9kZWxzLCBhbmQgbW9yZSB0aGFuIDYwJSBjaGVhcGVyIHRoYW4gW0dQVC0zLjUgVHVyYm9dKC9tb2RlbHMvb3BlbmFpL2dwdC0zLjUtdHVyYm8pLiBJdCBtYWludGFpbnMgU09UQSBpbnRlbGxpZ2VuY2UsIHdoaWxlIGJlaW5nIHNpZ25pZmljYW50bHkgbW9yZSBjb3N0LWVmZmVjdGl2ZS5cblxuR1BULTRvIG1pbmkgYWNoaWV2ZXMgYW4gODIlIHNjb3JlIG9uIE1NTFUgYW5kIHByZXNlbnRseSByYW5rcyBoaWdoZXIgdGhhbiBHUFQtNCBvbiBjaGF0IHByZWZlcmVuY2VzIFtjb21tb24gbGVhZGVyYm9hcmRzXShodHRwczovL2FyZW5hLmxtc3lzLm9yZy8pLlxuXG5DaGVjayBvdXQgdGhlIFtsYXVuY2ggYW5ub3VuY2VtZW50XShodHRwczovL29wZW5haS5jb20vaW5kZXgvZ3B0LTRvLW1pbmktYWR2YW5jaW5nLWNvc3QtZWZmaWNpZW50LWludGVsbGlnZW5jZS8pIHRvIGxlYXJuIG1vcmUuXG5cbiNtdWx0aW1vZGFsIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAxNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDcyMjUiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAwNzUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MTYzODQsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Imdvb2dsZS9nZW1tYS0yLTI3Yi1pdCIsIm5hbWUiOiJHb29nbGU6IEdlbW1hIDIgMjdCIiwiY3JlYXRlZCI6MTcyMDgyODgwMCwiZGVzY3JpcHRpb24iOiJHZW1tYSAyIDI3QiBieSBHb29nbGUgaXMgYW4gb3BlbiBtb2RlbCBidWlsdCBmcm9tIHRoZSBzYW1lIHJlc2VhcmNoIGFuZCB0ZWNobm9sb2d5IHVzZWQgdG8gY3JlYXRlIHRoZSBbR2VtaW5pIG1vZGVsc10oL21vZGVscz9xPWdlbWluaSkuXG5cbkdlbW1hIG1vZGVscyBhcmUgd2VsbC1zdWl0ZWQgZm9yIGEgdmFyaWV0eSBvZiB0ZXh0IGdlbmVyYXRpb24gdGFza3MsIGluY2x1ZGluZyBxdWVzdGlvbiBhbnN3ZXJpbmcsIHN1bW1hcml6YXRpb24sIGFuZCByZWFzb25pbmcuXG5cblNlZSB0aGUgW2xhdW5jaCBhbm5vdW5jZW1lbnRdKGh0dHBzOi8vYmxvZy5nb29nbGUvdGVjaG5vbG9neS9kZXZlbG9wZXJzL2dvb2dsZS1nZW1tYS0yLykgZm9yIG1vcmUgZGV0YWlscy4gVXNhZ2Ugb2YgR2VtbWEgaXMgc3ViamVjdCB0byBHb29nbGUncyBbR2VtbWEgVGVybXMgb2YgVXNlXShodHRwczovL2FpLmdvb2dsZS5kZXYvZ2VtbWEvdGVybXMpLiIsImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR2VtaW5pIiwiaW5zdHJ1Y3RfdHlwZSI6ImdlbW1hIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA4IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODE5MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoyMDQ4LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYWxwaW5kYWxlL21hZ251bS03MmIiLCJuYW1lIjoiTWFnbnVtIDcyQiIsImNyZWF0ZWQiOjE3MjA2NTYwMDAsImRlc2NyaXB0aW9uIjoiRnJvbSB0aGUgbWFrZXIgb2YgW0dvbGlhdGhdKGh0dHBzOi8vb3BlbnJvdXRlci5haS9tb2RlbHMvYWxwaW5kYWxlL2dvbGlhdGgtMTIwYiksIE1hZ251bSA3MkIgaXMgdGhlIGZpcnN0IGluIGEgbmV3IGZhbWlseSBvZiBtb2RlbHMgZGVzaWduZWQgdG8gYWNoaWV2ZSB0aGUgcHJvc2UgcXVhbGl0eSBvZiB0aGUgQ2xhdWRlIDMgbW9kZWxzLCBub3RhYmx5IE9wdXMgJiBTb25uZXQuXG5cblRoZSBtb2RlbCBpcyBiYXNlZCBvbiBbUXdlbjIgNzJCXShodHRwczovL29wZW5yb3V0ZXIuYWkvbW9kZWxzL3F3ZW4vcXdlbi0yLTcyYi1pbnN0cnVjdCkgYW5kIHRyYWluZWQgd2l0aCA1NSBtaWxsaW9uIHRva2VucyBvZiBoaWdobHkgY3VyYXRlZCByb2xlcGxheSAoUlApIGRhdGEuIiwiY29udGV4dF9sZW5ndGgiOjE2Mzg0LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUXdlbiIsImluc3RydWN0X3R5cGUiOiJjaGF0bWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwNCIsImNvbXBsZXRpb24iOiIwLjAwMDAwNiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODQsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Imdvb2dsZS9nZW1tYS0yLTliLWl0OmZyZWUiLCJuYW1lIjoiR29vZ2xlOiBHZW1tYSAyIDlCIChmcmVlKSIsImNyZWF0ZWQiOjE3MTk1MzI4MDAsImRlc2NyaXB0aW9uIjoiR2VtbWEgMiA5QiBieSBHb29nbGUgaXMgYW4gYWR2YW5jZWQsIG9wZW4tc291cmNlIGxhbmd1YWdlIG1vZGVsIHRoYXQgc2V0cyBhIG5ldyBzdGFuZGFyZCBmb3IgZWZmaWNpZW5jeSBhbmQgcGVyZm9ybWFuY2UgaW4gaXRzIHNpemUgY2xhc3MuXG5cbkRlc2lnbmVkIGZvciBhIHdpZGUgdmFyaWV0eSBvZiB0YXNrcywgaXQgZW1wb3dlcnMgZGV2ZWxvcGVycyBhbmQgcmVzZWFyY2hlcnMgdG8gYnVpbGQgaW5ub3ZhdGl2ZSBhcHBsaWNhdGlvbnMsIHdoaWxlIG1haW50YWluaW5nIGFjY2Vzc2liaWxpdHksIHNhZmV0eSwgYW5kIGNvc3QtZWZmZWN0aXZlbmVzcy5cblxuU2VlIHRoZSBbbGF1bmNoIGFubm91bmNlbWVudF0oaHR0cHM6Ly9ibG9nLmdvb2dsZS90ZWNobm9sb2d5L2RldmVsb3BlcnMvZ29vZ2xlLWdlbW1hLTIvKSBmb3IgbW9yZSBkZXRhaWxzLiBVc2FnZSBvZiBHZW1tYSBpcyBzdWJqZWN0IHRvIEdvb2dsZSdzIFtHZW1tYSBUZXJtcyBvZiBVc2VdKGh0dHBzOi8vYWkuZ29vZ2xlLmRldi9nZW1tYS90ZXJtcykuIiwiY29udGV4dF9sZW5ndGgiOjgxOTIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjoiZ2VtbWEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjgxOTIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Imdvb2dsZS9nZW1tYS0yLTliLWl0IiwibmFtZSI6Ikdvb2dsZTogR2VtbWEgMiA5QiIsImNyZWF0ZWQiOjE3MTk1MzI4MDAsImRlc2NyaXB0aW9uIjoiR2VtbWEgMiA5QiBieSBHb29nbGUgaXMgYW4gYWR2YW5jZWQsIG9wZW4tc291cmNlIGxhbmd1YWdlIG1vZGVsIHRoYXQgc2V0cyBhIG5ldyBzdGFuZGFyZCBmb3IgZWZmaWNpZW5jeSBhbmQgcGVyZm9ybWFuY2UgaW4gaXRzIHNpemUgY2xhc3MuXG5cbkRlc2lnbmVkIGZvciBhIHdpZGUgdmFyaWV0eSBvZiB0YXNrcywgaXQgZW1wb3dlcnMgZGV2ZWxvcGVycyBhbmQgcmVzZWFyY2hlcnMgdG8gYnVpbGQgaW5ub3ZhdGl2ZSBhcHBsaWNhdGlvbnMsIHdoaWxlIG1haW50YWluaW5nIGFjY2Vzc2liaWxpdHksIHNhZmV0eSwgYW5kIGNvc3QtZWZmZWN0aXZlbmVzcy5cblxuU2VlIHRoZSBbbGF1bmNoIGFubm91bmNlbWVudF0oaHR0cHM6Ly9ibG9nLmdvb2dsZS90ZWNobm9sb2d5L2RldmVsb3BlcnMvZ29vZ2xlLWdlbW1hLTIvKSBmb3IgbW9yZSBkZXRhaWxzLiBVc2FnZSBvZiBHZW1tYSBpcyBzdWJqZWN0IHRvIEdvb2dsZSdzIFtHZW1tYSBUZXJtcyBvZiBVc2VdKGh0dHBzOi8vYWkuZ29vZ2xlLmRldi9nZW1tYS90ZXJtcykuIiwiY29udGV4dF9sZW5ndGgiOjgxOTIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjoiZ2VtbWEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDA3IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMDciLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjgxOTIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6IjAxLWFpL3lpLWxhcmdlIiwibmFtZSI6IjAxLkFJOiBZaSBMYXJnZSIsImNyZWF0ZWQiOjE3MTkyNzM2MDAsImRlc2NyaXB0aW9uIjoiVGhlIFlpIExhcmdlIG1vZGVsIHdhcyBkZXNpZ25lZCBieSAwMS5BSSB3aXRoIHRoZSBmb2xsb3dpbmcgdXNlY2FzZXMgaW4gbWluZDoga25vd2xlZGdlIHNlYXJjaCwgZGF0YSBjbGFzc2lmaWNhdGlvbiwgaHVtYW4tbGlrZSBjaGF0IGJvdHMsIGFuZCBjdXN0b21lciBzZXJ2aWNlLlxuXG5JdCBzdGFuZHMgb3V0IGZvciBpdHMgbXVsdGlsaW5ndWFsIHByb2ZpY2llbmN5LCBwYXJ0aWN1bGFybHkgaW4gU3BhbmlzaCwgQ2hpbmVzZSwgSmFwYW5lc2UsIEdlcm1hbiwgYW5kIEZyZW5jaC5cblxuQ2hlY2sgb3V0IHRoZSBbbGF1bmNoIGFubm91bmNlbWVudF0oaHR0cHM6Ly8wMS1haS5naXRodWIuaW8vYmxvZy8wMS5haS15aS1sYXJnZS1sbG0tbGF1bmNoKSB0byBsZWFybiBtb3JlLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IllpIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDMiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDMiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhaTIxL2phbWJhLWluc3RydWN0IiwibmFtZSI6IkFJMjE6IEphbWJhIEluc3RydWN0IiwiY3JlYXRlZCI6MTcxOTI3MzYwMCwiZGVzY3JpcHRpb24iOiJUaGUgSmFtYmEtSW5zdHJ1Y3QgbW9kZWwsIGludHJvZHVjZWQgYnkgQUkyMSBMYWJzLCBpcyBhbiBpbnN0cnVjdGlvbi10dW5lZCB2YXJpYW50IG9mIHRoZWlyIGh5YnJpZCBTU00tVHJhbnNmb3JtZXIgSmFtYmEgbW9kZWwsIHNwZWNpZmljYWxseSBvcHRpbWl6ZWQgZm9yIGVudGVycHJpc2UgYXBwbGljYXRpb25zLlxuXG4tIDI1NksgQ29udGV4dCBXaW5kb3c6IEl0IGNhbiBwcm9jZXNzIGV4dGVuc2l2ZSBpbmZvcm1hdGlvbiwgZXF1aXZhbGVudCB0byBhIDQwMC1wYWdlIG5vdmVsLCB3aGljaCBpcyBiZW5lZmljaWFsIGZvciB0YXNrcyBpbnZvbHZpbmcgbGFyZ2UgZG9jdW1lbnRzIHN1Y2ggYXMgZmluYW5jaWFsIHJlcG9ydHMgb3IgbGVnYWwgZG9jdW1lbnRzXG4tIFNhZmV0eSBhbmQgQWNjdXJhY3k6IEphbWJhLUluc3RydWN0IGlzIGRlc2lnbmVkIHdpdGggZW5oYW5jZWQgc2FmZXR5IGZlYXR1cmVzIHRvIGVuc3VyZSBzZWN1cmUgZGVwbG95bWVudCBpbiBlbnRlcnByaXNlIGVudmlyb25tZW50cywgcmVkdWNpbmcgdGhlIHJpc2sgYW5kIGNvc3Qgb2YgaW1wbGVtZW50YXRpb25cblxuUmVhZCB0aGVpciBbYW5ub3VuY2VtZW50XShodHRwczovL3d3dy5haTIxLmNvbS9ibG9nL2Fubm91bmNpbmctamFtYmEpIHRvIGxlYXJuIG1vcmUuXG5cbkphbWJhIGhhcyBhIGtub3dsZWRnZSBjdXRvZmYgb2YgRmVicnVhcnkgMjAyNC4iLCJjb250ZXh0X2xlbmd0aCI6MjU2MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA3IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyNTYwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFudGhyb3BpYy9jbGF1ZGUtMy41LXNvbm5ldC0yMDI0MDYyMDpiZXRhIiwibmFtZSI6IkFudGhyb3BpYzogQ2xhdWRlIDMuNSBTb25uZXQgKDIwMjQtMDYtMjApIChzZWxmLW1vZGVyYXRlZCkiLCJjcmVhdGVkIjoxNzE4ODQxNjAwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzLjUgU29ubmV0IGRlbGl2ZXJzIGJldHRlci10aGFuLU9wdXMgY2FwYWJpbGl0aWVzLCBmYXN0ZXItdGhhbi1Tb25uZXQgc3BlZWRzLCBhdCB0aGUgc2FtZSBTb25uZXQgcHJpY2VzLiBTb25uZXQgaXMgcGFydGljdWxhcmx5IGdvb2QgYXQ6XG5cbi0gQ29kaW5nOiBBdXRvbm9tb3VzbHkgd3JpdGVzLCBlZGl0cywgYW5kIHJ1bnMgY29kZSB3aXRoIHJlYXNvbmluZyBhbmQgdHJvdWJsZXNob290aW5nXG4tIERhdGEgc2NpZW5jZTogQXVnbWVudHMgaHVtYW4gZGF0YSBzY2llbmNlIGV4cGVydGlzZTsgbmF2aWdhdGVzIHVuc3RydWN0dXJlZCBkYXRhIHdoaWxlIHVzaW5nIG11bHRpcGxlIHRvb2xzIGZvciBpbnNpZ2h0c1xuLSBWaXN1YWwgcHJvY2Vzc2luZzogZXhjZWxsaW5nIGF0IGludGVycHJldGluZyBjaGFydHMsIGdyYXBocywgYW5kIGltYWdlcywgYWNjdXJhdGVseSB0cmFuc2NyaWJpbmcgdGV4dCB0byBkZXJpdmUgaW5zaWdodHMgYmV5b25kIGp1c3QgdGhlIHRleHQgYWxvbmVcbi0gQWdlbnRpYyB0YXNrczogZXhjZXB0aW9uYWwgdG9vbCB1c2UsIG1ha2luZyBpdCBncmVhdCBhdCBhZ2VudGljIHRhc2tzIChpLmUuIGNvbXBsZXgsIG11bHRpLXN0ZXAgcHJvYmxlbSBzb2x2aW5nIHRhc2tzIHRoYXQgcmVxdWlyZSBlbmdhZ2luZyB3aXRoIG90aGVyIHN5c3RlbXMpXG5cbkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gKDIwMjQtMTAtMjMpLCBjaGVjayBvdXQgW0NsYXVkZSAzLjUgU29ubmV0XSgvYW50aHJvcGljL2NsYXVkZS0zLjUtc29ubmV0KS5cblxuI211bHRpbW9kYWwiLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwNDgiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAzIiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAwMzc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTMuNS1zb25uZXQtMjAyNDA2MjAiLCJuYW1lIjoiQW50aHJvcGljOiBDbGF1ZGUgMy41IFNvbm5ldCAoMjAyNC0wNi0yMCkiLCJjcmVhdGVkIjoxNzE4ODQxNjAwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzLjUgU29ubmV0IGRlbGl2ZXJzIGJldHRlci10aGFuLU9wdXMgY2FwYWJpbGl0aWVzLCBmYXN0ZXItdGhhbi1Tb25uZXQgc3BlZWRzLCBhdCB0aGUgc2FtZSBTb25uZXQgcHJpY2VzLiBTb25uZXQgaXMgcGFydGljdWxhcmx5IGdvb2QgYXQ6XG5cbi0gQ29kaW5nOiBBdXRvbm9tb3VzbHkgd3JpdGVzLCBlZGl0cywgYW5kIHJ1bnMgY29kZSB3aXRoIHJlYXNvbmluZyBhbmQgdHJvdWJsZXNob290aW5nXG4tIERhdGEgc2NpZW5jZTogQXVnbWVudHMgaHVtYW4gZGF0YSBzY2llbmNlIGV4cGVydGlzZTsgbmF2aWdhdGVzIHVuc3RydWN0dXJlZCBkYXRhIHdoaWxlIHVzaW5nIG11bHRpcGxlIHRvb2xzIGZvciBpbnNpZ2h0c1xuLSBWaXN1YWwgcHJvY2Vzc2luZzogZXhjZWxsaW5nIGF0IGludGVycHJldGluZyBjaGFydHMsIGdyYXBocywgYW5kIGltYWdlcywgYWNjdXJhdGVseSB0cmFuc2NyaWJpbmcgdGV4dCB0byBkZXJpdmUgaW5zaWdodHMgYmV5b25kIGp1c3QgdGhlIHRleHQgYWxvbmVcbi0gQWdlbnRpYyB0YXNrczogZXhjZXB0aW9uYWwgdG9vbCB1c2UsIG1ha2luZyBpdCBncmVhdCBhdCBhZ2VudGljIHRhc2tzIChpLmUuIGNvbXBsZXgsIG11bHRpLXN0ZXAgcHJvYmxlbSBzb2x2aW5nIHRhc2tzIHRoYXQgcmVxdWlyZSBlbmdhZ2luZyB3aXRoIG90aGVyIHN5c3RlbXMpXG5cbkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gKDIwMjQtMTAtMjMpLCBjaGVjayBvdXQgW0NsYXVkZSAzLjUgU29ubmV0XSgvYW50aHJvcGljL2NsYXVkZS0zLjUtc29ubmV0KS5cblxuI211bHRpbW9kYWwiLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0K2ltYWdlLT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0IiwiaW1hZ2UiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwNDgiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAzIiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAwMzc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InNhbzEway9sMy1ldXJ5YWxlLTcwYiIsIm5hbWUiOiJTYW8xMGs6IExsYW1hIDMgRXVyeWFsZSA3MEIgdjIuMSIsImNyZWF0ZWQiOjE3MTg2Njg4MDAsImRlc2NyaXB0aW9uIjoiRXVyeWFsZSA3MEIgdjIuMSBpcyBhIG1vZGVsIGZvY3VzZWQgb24gY3JlYXRpdmUgcm9sZXBsYXkgZnJvbSBbU2FvMTBrXShodHRwczovL2tvLWZpLmNvbS9zYW8xMGspLlxuXG4tIEJldHRlciBwcm9tcHQgYWRoZXJlbmNlLlxuLSBCZXR0ZXIgYW5hdG9teSAvIHNwYXRpYWwgYXdhcmVuZXNzLlxuLSBBZGFwdHMgbXVjaCBiZXR0ZXIgdG8gdW5pcXVlIGFuZCBjdXN0b20gZm9ybWF0dGluZyAvIHJlcGx5IGZvcm1hdHMuXG4tIFZlcnkgY3JlYXRpdmUsIGxvdHMgb2YgdW5pcXVlIHN3aXBlcy5cbi0gSXMgbm90IHJlc3RyaWN0aXZlIGR1cmluZyByb2xlcGxheXMuIiwiY29udGV4dF9sZW5ndGgiOjgxOTIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDE0OCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTQ4IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJjb2duaXRpdmVjb21wdXRhdGlvbnMvZG9scGhpbi1taXh0cmFsLTh4MjJiIiwibmFtZSI6IkRvbHBoaW4gMi45LjIgTWl4dHJhbCA4eDIyQiDwn5CsIiwiY3JlYXRlZCI6MTcxNzgwNDgwMCwiZGVzY3JpcHRpb24iOiJEb2xwaGluIDIuOSBpcyBkZXNpZ25lZCBmb3IgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nLCBjb252ZXJzYXRpb25hbCwgYW5kIGNvZGluZy4gVGhpcyBtb2RlbCBpcyBhIGZpbmV0dW5lIG9mIFtNaXh0cmFsIDh4MjJCIEluc3RydWN0XSgvbW9kZWxzL21pc3RyYWxhaS9taXh0cmFsLTh4MjJiLWluc3RydWN0KS4gSXQgZmVhdHVyZXMgYSA2NGsgY29udGV4dCBsZW5ndGggYW5kIHdhcyBmaW5lLXR1bmVkIHdpdGggYSAxNmsgc2VxdWVuY2UgbGVuZ3RoIHVzaW5nIENoYXRNTCB0ZW1wbGF0ZXMuXG5cblRoaXMgbW9kZWwgaXMgYSBzdWNjZXNzb3IgdG8gW0RvbHBoaW4gTWl4dHJhbCA4eDdCXSgvbW9kZWxzL2NvZ25pdGl2ZWNvbXB1dGF0aW9ucy9kb2xwaGluLW1peHRyYWwtOHg3YikuXG5cblRoZSBtb2RlbCBpcyB1bmNlbnNvcmVkIGFuZCBpcyBzdHJpcHBlZCBvZiBhbGlnbm1lbnQgYW5kIGJpYXMuIEl0IHJlcXVpcmVzIGFuIGV4dGVybmFsIGFsaWdubWVudCBsYXllciBmb3IgZXRoaWNhbCB1c2UuIFVzZXJzIGFyZSBjYXV0aW9uZWQgdG8gdXNlIHRoaXMgaGlnaGx5IGNvbXBsaWFudCBtb2RlbCByZXNwb25zaWJseSwgYXMgZGV0YWlsZWQgaW4gYSBibG9nIHBvc3QgYWJvdXQgdW5jZW5zb3JlZCBtb2RlbHMgYXQgW2VyaWNoYXJ0Zm9yZC5jb20vdW5jZW5zb3JlZC1tb2RlbHNdKGh0dHBzOi8vZXJpY2hhcnRmb3JkLmNvbS91bmNlbnNvcmVkLW1vZGVscykuXG5cbiNtb2UgI3VuY2Vuc29yZWQiLCJjb250ZXh0X2xlbmd0aCI6MTYwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6ImNoYXRtbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDkiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjE2MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJxd2VuL3F3ZW4tMi03MmItaW5zdHJ1Y3QiLCJuYW1lIjoiUXdlbiAyIDcyQiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MTc3MTg0MDAsImRlc2NyaXB0aW9uIjoiUXdlbjIgNzJCIGlzIGEgdHJhbnNmb3JtZXItYmFzZWQgbW9kZWwgdGhhdCBleGNlbHMgaW4gbGFuZ3VhZ2UgdW5kZXJzdGFuZGluZywgbXVsdGlsaW5ndWFsIGNhcGFiaWxpdGllcywgY29kaW5nLCBtYXRoZW1hdGljcywgYW5kIHJlYXNvbmluZy5cblxuSXQgZmVhdHVyZXMgU3dpR0xVIGFjdGl2YXRpb24sIGF0dGVudGlvbiBRS1YgYmlhcywgYW5kIGdyb3VwIHF1ZXJ5IGF0dGVudGlvbi4gSXQgaXMgcHJldHJhaW5lZCBvbiBleHRlbnNpdmUgZGF0YSB3aXRoIHN1cGVydmlzZWQgZmluZXR1bmluZyBhbmQgZGlyZWN0IHByZWZlcmVuY2Ugb3B0aW1pemF0aW9uLlxuXG5Gb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhpcyBbYmxvZyBwb3N0XShodHRwczovL3F3ZW5sbS5naXRodWIuaW8vYmxvZy9xd2VuMi8pIGFuZCBbR2l0SHViIHJlcG9dKGh0dHBzOi8vZ2l0aHViLmNvbS9Rd2VuTE0vUXdlbjIpLlxuXG5Vc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW1Rvbmd5aSBRaWFud2VuIExJQ0VOU0UgQUdSRUVNRU5UXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL1F3ZW4vUXdlbjEuNS0xMTBCLUNoYXQvYmxvYi9tYWluL0xJQ0VOU0UpLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlF3ZW4iLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA5IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwOSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pc3RyYWxhaS9taXN0cmFsLTdiLWluc3RydWN0OmZyZWUiLCJuYW1lIjoiTWlzdHJhbDogTWlzdHJhbCA3QiBJbnN0cnVjdCAoZnJlZSkiLCJjcmVhdGVkIjoxNzE2NzY4MDAwLCJkZXNjcmlwdGlvbiI6IkEgaGlnaC1wZXJmb3JtaW5nLCBpbmR1c3RyeS1zdGFuZGFyZCA3LjNCIHBhcmFtZXRlciBtb2RlbCwgd2l0aCBvcHRpbWl6YXRpb25zIGZvciBzcGVlZCBhbmQgY29udGV4dCBsZW5ndGguXG5cbipNaXN0cmFsIDdCIEluc3RydWN0IGhhcyBtdWx0aXBsZSB2ZXJzaW9uIHZhcmlhbnRzLCBhbmQgdGhpcyBpcyBpbnRlbmRlZCB0byBiZSB0aGUgbGF0ZXN0IHZlcnNpb24uKiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjoibWlzdHJhbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAiLCJjb21wbGV0aW9uIjoiMCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pc3RyYWxhaS9taXN0cmFsLTdiLWluc3RydWN0IiwibmFtZSI6Ik1pc3RyYWw6IE1pc3RyYWwgN0IgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzE2NzY4MDAwLCJkZXNjcmlwdGlvbiI6IkEgaGlnaC1wZXJmb3JtaW5nLCBpbmR1c3RyeS1zdGFuZGFyZCA3LjNCIHBhcmFtZXRlciBtb2RlbCwgd2l0aCBvcHRpbWl6YXRpb25zIGZvciBzcGVlZCBhbmQgY29udGV4dCBsZW5ndGguXG5cbipNaXN0cmFsIDdCIEluc3RydWN0IGhhcyBtdWx0aXBsZSB2ZXJzaW9uIHZhcmlhbnRzLCBhbmQgdGhpcyBpcyBpbnRlbmRlZCB0byBiZSB0aGUgbGF0ZXN0IHZlcnNpb24uKiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjoibWlzdHJhbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDI5IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMDU5IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWlzdHJhbGFpL21pc3RyYWwtN2ItaW5zdHJ1Y3QtdjAuMyIsIm5hbWUiOiJNaXN0cmFsOiBNaXN0cmFsIDdCIEluc3RydWN0IHYwLjMiLCJjcmVhdGVkIjoxNzE2NzY4MDAwLCJkZXNjcmlwdGlvbiI6IkEgaGlnaC1wZXJmb3JtaW5nLCBpbmR1c3RyeS1zdGFuZGFyZCA3LjNCIHBhcmFtZXRlciBtb2RlbCwgd2l0aCBvcHRpbWl6YXRpb25zIGZvciBzcGVlZCBhbmQgY29udGV4dCBsZW5ndGguXG5cbkFuIGltcHJvdmVkIHZlcnNpb24gb2YgW01pc3RyYWwgN0IgSW5zdHJ1Y3QgdjAuMl0oL21vZGVscy9taXN0cmFsYWkvbWlzdHJhbC03Yi1pbnN0cnVjdC12MC4yKSwgd2l0aCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6XG5cbi0gRXh0ZW5kZWQgdm9jYWJ1bGFyeSB0byAzMjc2OFxuLSBTdXBwb3J0cyB2MyBUb2tlbml6ZXJcbi0gU3VwcG9ydHMgZnVuY3Rpb24gY2FsbGluZ1xuXG5OT1RFOiBTdXBwb3J0IGZvciBmdW5jdGlvbiBjYWxsaW5nIGRlcGVuZHMgb24gdGhlIHByb3ZpZGVyLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjoibWlzdHJhbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDI5IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMDU5IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibm91c3Jlc2VhcmNoL2hlcm1lcy0yLXByby1sbGFtYS0zLThiIiwibmFtZSI6Ik5vdXNSZXNlYXJjaDogSGVybWVzIDIgUHJvIC0gTGxhbWEtMyA4QiIsImNyZWF0ZWQiOjE3MTY3NjgwMDAsImRlc2NyaXB0aW9uIjoiSGVybWVzIDIgUHJvIGlzIGFuIHVwZ3JhZGVkLCByZXRyYWluZWQgdmVyc2lvbiBvZiBOb3VzIEhlcm1lcyAyLCBjb25zaXN0aW5nIG9mIGFuIHVwZGF0ZWQgYW5kIGNsZWFuZWQgdmVyc2lvbiBvZiB0aGUgT3Blbkhlcm1lcyAyLjUgRGF0YXNldCwgYXMgd2VsbCBhcyBhIG5ld2x5IGludHJvZHVjZWQgRnVuY3Rpb24gQ2FsbGluZyBhbmQgSlNPTiBNb2RlIGRhdGFzZXQgZGV2ZWxvcGVkIGluLWhvdXNlLiIsImNvbnRleHRfbGVuZ3RoIjoxMzEwNzIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwMjUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAwNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTMxMDcyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEzMTA3MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pY3Jvc29mdC9waGktMy1taW5pLTEyOGstaW5zdHJ1Y3QiLCJuYW1lIjoiTWljcm9zb2Z0OiBQaGktMyBNaW5pIDEyOEsgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzE2NjgxNjAwLCJkZXNjcmlwdGlvbiI6IlBoaS0zIE1pbmkgaXMgYSBwb3dlcmZ1bCAzLjhCIHBhcmFtZXRlciBtb2RlbCBkZXNpZ25lZCBmb3IgYWR2YW5jZWQgbGFuZ3VhZ2UgdW5kZXJzdGFuZGluZywgcmVhc29uaW5nLCBhbmQgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nLiBPcHRpbWl6ZWQgdGhyb3VnaCBzdXBlcnZpc2VkIGZpbmUtdHVuaW5nIGFuZCBwcmVmZXJlbmNlIGFkanVzdG1lbnRzLCBpdCBleGNlbHMgaW4gdGFza3MgaW52b2x2aW5nIGNvbW1vbiBzZW5zZSwgbWF0aGVtYXRpY3MsIGxvZ2ljYWwgcmVhc29uaW5nLCBhbmQgY29kZSBwcm9jZXNzaW5nLlxuXG5BdCB0aW1lIG9mIHJlbGVhc2UsIFBoaS0zIE1lZGl1bSBkZW1vbnN0cmF0ZWQgc3RhdGUtb2YtdGhlLWFydCBwZXJmb3JtYW5jZSBhbW9uZyBsaWdodHdlaWdodCBtb2RlbHMuIFRoaXMgbW9kZWwgaXMgc3RhdGljLCB0cmFpbmVkIG9uIGFuIG9mZmxpbmUgZGF0YXNldCB3aXRoIGFuIE9jdG9iZXIgMjAyMyBjdXRvZmYgZGF0ZS4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiT3RoZXIiLCJpbnN0cnVjdF90eXBlIjoicGhpMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWljcm9zb2Z0L3BoaS0zLW1lZGl1bS0xMjhrLWluc3RydWN0IiwibmFtZSI6Ik1pY3Jvc29mdDogUGhpLTMgTWVkaXVtIDEyOEsgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzE2NTA4ODAwLCJkZXNjcmlwdGlvbiI6IlBoaS0zIDEyOEsgTWVkaXVtIGlzIGEgcG93ZXJmdWwgMTQtYmlsbGlvbiBwYXJhbWV0ZXIgbW9kZWwgZGVzaWduZWQgZm9yIGFkdmFuY2VkIGxhbmd1YWdlIHVuZGVyc3RhbmRpbmcsIHJlYXNvbmluZywgYW5kIGluc3RydWN0aW9uIGZvbGxvd2luZy4gT3B0aW1pemVkIHRocm91Z2ggc3VwZXJ2aXNlZCBmaW5lLXR1bmluZyBhbmQgcHJlZmVyZW5jZSBhZGp1c3RtZW50cywgaXQgZXhjZWxzIGluIHRhc2tzIGludm9sdmluZyBjb21tb24gc2Vuc2UsIG1hdGhlbWF0aWNzLCBsb2dpY2FsIHJlYXNvbmluZywgYW5kIGNvZGUgcHJvY2Vzc2luZy5cblxuQXQgdGltZSBvZiByZWxlYXNlLCBQaGktMyBNZWRpdW0gZGVtb25zdHJhdGVkIHN0YXRlLW9mLXRoZS1hcnQgcGVyZm9ybWFuY2UgYW1vbmcgbGlnaHR3ZWlnaHQgbW9kZWxzLiBJbiB0aGUgTU1MVS1Qcm8gZXZhbCwgdGhlIG1vZGVsIGV2ZW4gY29tZXMgY2xvc2UgdG8gYSBMbGFtYTMgNzBCIGxldmVsIG9mIHBlcmZvcm1hbmNlLlxuXG5Gb3IgNGsgY29udGV4dCBsZW5ndGgsIHRyeSBbUGhpLTMgTWVkaXVtIDRLXSgvbW9kZWxzL21pY3Jvc29mdC9waGktMy1tZWRpdW0tNGstaW5zdHJ1Y3QpLiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJPdGhlciIsImluc3RydWN0X3R5cGUiOiJwaGkzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibmV2ZXJzbGVlcC9sbGFtYS0zLWx1bWltYWlkLTcwYiIsIm5hbWUiOiJOZXZlclNsZWVwOiBMbGFtYSAzIEx1bWltYWlkIDcwQiIsImNyZWF0ZWQiOjE3MTU4MTc2MDAsImRlc2NyaXB0aW9uIjoiVGhlIE5ldmVyU2xlZXAgdGVhbSBpcyBiYWNrLCB3aXRoIGEgTGxhbWEgMyA3MEIgZmluZXR1bmUgdHJhaW5lZCBvbiB0aGVpciBjdXJhdGVkIHJvbGVwbGF5IGRhdGEuIFN0cmlraW5nIGEgYmFsYW5jZSBiZXR3ZWVuIGVSUCBhbmQgUlAsIEx1bWltYWlkIHdhcyBkZXNpZ25lZCB0byBiZSBzZXJpb3VzLCB5ZXQgdW5jZW5zb3JlZCB3aGVuIG5lY2Vzc2FyeS5cblxuVG8gZW5oYW5jZSBpdCdzIG92ZXJhbGwgaW50ZWxsaWdlbmNlIGFuZCBjaGF0IGNhcGFiaWxpdHksIHJvdWdobHkgNDAlIG9mIHRoZSB0cmFpbmluZyBkYXRhIHdhcyBub3Qgcm9sZXBsYXkuIFRoaXMgcHJvdmlkZXMgYSBicmVhZHRoIG9mIGtub3dsZWRnZSB0byBhY2Nlc3MsIHdoaWxlIHN0aWxsIGtlZXBpbmcgcm9sZXBsYXkgYXMgdGhlIHByaW1hcnkgc3RyZW5ndGguXG5cblVzYWdlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBbTWV0YSdzIEFjY2VwdGFibGUgVXNlIFBvbGljeV0oaHR0cHM6Ly9sbGFtYS5tZXRhLmNvbS9sbGFtYTMvdXNlLXBvbGljeS8pLiIsImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDA0IiwiY29tcGxldGlvbiI6IjAuMDAwMDA2IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvZ2VtaW5pLWZsYXNoLTEuNSIsIm5hbWUiOiJHb29nbGU6IEdlbWluaSAxLjUgRmxhc2ggIiwiY3JlYXRlZCI6MTcxNTY0NDgwMCwiZGVzY3JpcHRpb24iOiJHZW1pbmkgMS41IEZsYXNoIGlzIGEgZm91bmRhdGlvbiBtb2RlbCB0aGF0IHBlcmZvcm1zIHdlbGwgYXQgYSB2YXJpZXR5IG9mIG11bHRpbW9kYWwgdGFza3Mgc3VjaCBhcyB2aXN1YWwgdW5kZXJzdGFuZGluZywgY2xhc3NpZmljYXRpb24sIHN1bW1hcml6YXRpb24sIGFuZCBjcmVhdGluZyBjb250ZW50IGZyb20gaW1hZ2UsIGF1ZGlvIGFuZCB2aWRlby4gSXQncyBhZGVwdCBhdCBwcm9jZXNzaW5nIHZpc3VhbCBhbmQgdGV4dCBpbnB1dHMgc3VjaCBhcyBwaG90b2dyYXBocywgZG9jdW1lbnRzLCBpbmZvZ3JhcGhpY3MsIGFuZCBzY3JlZW5zaG90cy5cblxuR2VtaW5pIDEuNSBGbGFzaCBpcyBkZXNpZ25lZCBmb3IgaGlnaC12b2x1bWUsIGhpZ2gtZnJlcXVlbmN5IHRhc2tzIHdoZXJlIGNvc3QgYW5kIGxhdGVuY3kgbWF0dGVyLiBPbiBtb3N0IGNvbW1vbiB0YXNrcywgRmxhc2ggYWNoaWV2ZXMgY29tcGFyYWJsZSBxdWFsaXR5IHRvIG90aGVyIEdlbWluaSBQcm8gbW9kZWxzIGF0IGEgc2lnbmlmaWNhbnRseSByZWR1Y2VkIGNvc3QuIEZsYXNoIGlzIHdlbGwtc3VpdGVkIGZvciBhcHBsaWNhdGlvbnMgbGlrZSBjaGF0IGFzc2lzdGFudHMgYW5kIG9uLWRlbWFuZCBjb250ZW50IGdlbmVyYXRpb24gd2hlcmUgc3BlZWQgYW5kIHNjYWxlIG1hdHRlci5cblxuVXNhZ2Ugb2YgR2VtaW5pIGlzIHN1YmplY3QgdG8gR29vZ2xlJ3MgW0dlbWluaSBUZXJtcyBvZiBVc2VdKGh0dHBzOi8vYWkuZ29vZ2xlLmRldi90ZXJtcykuXG5cbiNtdWx0aW1vZGFsIiwiY29udGV4dF9sZW5ndGgiOjEwMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdlbWluaSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDc1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMyIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDA0Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIiwiaW5wdXRfY2FjaGVfcmVhZCI6IjAuMDAwMDAwMDE4NzUiLCJpbnB1dF9jYWNoZV93cml0ZSI6IjAuMDAwMDAwMTU4MyJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEwMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9ncHQtNG8iLCJuYW1lIjoiT3BlbkFJOiBHUFQtNG8iLCJjcmVhdGVkIjoxNzE1NTU4NDAwLCJkZXNjcmlwdGlvbiI6IkdQVC00byAoXCJvXCIgZm9yIFwib21uaVwiKSBpcyBPcGVuQUkncyBsYXRlc3QgQUkgbW9kZWwsIHN1cHBvcnRpbmcgYm90aCB0ZXh0IGFuZCBpbWFnZSBpbnB1dHMgd2l0aCB0ZXh0IG91dHB1dHMuIEl0IG1haW50YWlucyB0aGUgaW50ZWxsaWdlbmNlIGxldmVsIG9mIFtHUFQtNCBUdXJib10oL21vZGVscy9vcGVuYWkvZ3B0LTQtdHVyYm8pIHdoaWxlIGJlaW5nIHR3aWNlIGFzIGZhc3QgYW5kIDUwJSBtb3JlIGNvc3QtZWZmZWN0aXZlLiBHUFQtNG8gYWxzbyBvZmZlcnMgaW1wcm92ZWQgcGVyZm9ybWFuY2UgaW4gcHJvY2Vzc2luZyBub24tRW5nbGlzaCBsYW5ndWFnZXMgYW5kIGVuaGFuY2VkIHZpc3VhbCBjYXBhYmlsaXRpZXMuXG5cbkZvciBiZW5jaG1hcmtpbmcgYWdhaW5zdCBvdGhlciBtb2RlbHMsIGl0IHdhcyBicmllZmx5IGNhbGxlZCBbXCJpbS1hbHNvLWEtZ29vZC1ncHQyLWNoYXRib3RcIl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9MaWFtRmVkdXMvc3RhdHVzLzE3OTAwNjQ5NjM5NjYzNzAyMDkpXG5cbiNtdWx0aW1vZGFsIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDI1IiwiY29tcGxldGlvbiI6IjAuMDAwMDEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDM2MTMiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDEyNSJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxNjM4NCwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC00bzpleHRlbmRlZCIsIm5hbWUiOiJPcGVuQUk6IEdQVC00byAoZXh0ZW5kZWQpIiwiY3JlYXRlZCI6MTcxNTU1ODQwMCwiZGVzY3JpcHRpb24iOiJHUFQtNG8gKFwib1wiIGZvciBcIm9tbmlcIikgaXMgT3BlbkFJJ3MgbGF0ZXN0IEFJIG1vZGVsLCBzdXBwb3J0aW5nIGJvdGggdGV4dCBhbmQgaW1hZ2UgaW5wdXRzIHdpdGggdGV4dCBvdXRwdXRzLiBJdCBtYWludGFpbnMgdGhlIGludGVsbGlnZW5jZSBsZXZlbCBvZiBbR1BULTQgVHVyYm9dKC9tb2RlbHMvb3BlbmFpL2dwdC00LXR1cmJvKSB3aGlsZSBiZWluZyB0d2ljZSBhcyBmYXN0IGFuZCA1MCUgbW9yZSBjb3N0LWVmZmVjdGl2ZS4gR1BULTRvIGFsc28gb2ZmZXJzIGltcHJvdmVkIHBlcmZvcm1hbmNlIGluIHByb2Nlc3Npbmcgbm9uLUVuZ2xpc2ggbGFuZ3VhZ2VzIGFuZCBlbmhhbmNlZCB2aXN1YWwgY2FwYWJpbGl0aWVzLlxuXG5Gb3IgYmVuY2htYXJraW5nIGFnYWluc3Qgb3RoZXIgbW9kZWxzLCBpdCB3YXMgYnJpZWZseSBjYWxsZWQgW1wiaW0tYWxzby1hLWdvb2QtZ3B0Mi1jaGF0Ym90XCJdKGh0dHBzOi8vdHdpdHRlci5jb20vTGlhbUZlZHVzL3N0YXR1cy8xNzkwMDY0OTYzOTY2MzcwMjA5KVxuXG4jbXVsdGltb2RhbCIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDA2IiwiY29tcGxldGlvbiI6IjAuMDAwMDE4IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDA3MjI1Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjY0MDAwLCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvZ3B0LTRvLTIwMjQtMDUtMTMiLCJuYW1lIjoiT3BlbkFJOiBHUFQtNG8gKDIwMjQtMDUtMTMpIiwiY3JlYXRlZCI6MTcxNTU1ODQwMCwiZGVzY3JpcHRpb24iOiJHUFQtNG8gKFwib1wiIGZvciBcIm9tbmlcIikgaXMgT3BlbkFJJ3MgbGF0ZXN0IEFJIG1vZGVsLCBzdXBwb3J0aW5nIGJvdGggdGV4dCBhbmQgaW1hZ2UgaW5wdXRzIHdpdGggdGV4dCBvdXRwdXRzLiBJdCBtYWludGFpbnMgdGhlIGludGVsbGlnZW5jZSBsZXZlbCBvZiBbR1BULTQgVHVyYm9dKC9tb2RlbHMvb3BlbmFpL2dwdC00LXR1cmJvKSB3aGlsZSBiZWluZyB0d2ljZSBhcyBmYXN0IGFuZCA1MCUgbW9yZSBjb3N0LWVmZmVjdGl2ZS4gR1BULTRvIGFsc28gb2ZmZXJzIGltcHJvdmVkIHBlcmZvcm1hbmNlIGluIHByb2Nlc3Npbmcgbm9uLUVuZ2xpc2ggbGFuZ3VhZ2VzIGFuZCBlbmhhbmNlZCB2aXN1YWwgY2FwYWJpbGl0aWVzLlxuXG5Gb3IgYmVuY2htYXJraW5nIGFnYWluc3Qgb3RoZXIgbW9kZWxzLCBpdCB3YXMgYnJpZWZseSBjYWxsZWQgW1wiaW0tYWxzby1hLWdvb2QtZ3B0Mi1jaGF0Ym90XCJdKGh0dHBzOi8vdHdpdHRlci5jb20vTGlhbUZlZHVzL3N0YXR1cy8xNzkwMDY0OTYzOTY2MzcwMjA5KVxuXG4jbXVsdGltb2RhbCIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDA1IiwiY29tcGxldGlvbiI6IjAuMDAwMDE1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDA3MjI1Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtZ3VhcmQtMi04YiIsIm5hbWUiOiJNZXRhOiBMbGFtYUd1YXJkIDIgOEIiLCJjcmVhdGVkIjoxNzE1NTU4NDAwLCJkZXNjcmlwdGlvbiI6IlRoaXMgc2FmZWd1YXJkIG1vZGVsIGhhcyA4QiBwYXJhbWV0ZXJzIGFuZCBpcyBiYXNlZCBvbiB0aGUgTGxhbWEgMyBmYW1pbHkuIEp1c3QgbGlrZSBpcyBwcmVkZWNlc3NvciwgW0xsYW1hR3VhcmQgMV0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9tZXRhLWxsYW1hL0xsYW1hR3VhcmQtN2IpLCBpdCBjYW4gZG8gYm90aCBwcm9tcHQgYW5kIHJlc3BvbnNlIGNsYXNzaWZpY2F0aW9uLlxuXG5MbGFtYUd1YXJkIDIgYWN0cyBhcyBhIG5vcm1hbCBMTE0gd291bGQsIGdlbmVyYXRpbmcgdGV4dCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBpbnB1dC9vdXRwdXQgaXMgc2FmZS91bnNhZmUuIElmIGRlZW1lZCB1bnNhZmUsIGl0IHdpbGwgYWxzbyBzaGFyZSB0aGUgY29udGVudCBjYXRlZ29yaWVzIHZpb2xhdGVkLlxuXG5Gb3IgYmVzdCByZXN1bHRzLCBwbGVhc2UgdXNlIHJhdyBwcm9tcHQgaW5wdXQgb3IgdGhlIGAvY29tcGxldGlvbnNgIGVuZHBvaW50LCBpbnN0ZWFkIG9mIHRoZSBjaGF0IEFQSS5cblxuSXQgaGFzIGRlbW9uc3RyYXRlZCBzdHJvbmcgcGVyZm9ybWFuY2UgY29tcGFyZWQgdG8gbGVhZGluZyBjbG9zZWQtc291cmNlIG1vZGVscyBpbiBodW1hbiBldmFsdWF0aW9ucy5cblxuVG8gcmVhZCBtb3JlIGFib3V0IHRoZSBtb2RlbCByZWxlYXNlLCBbY2xpY2sgaGVyZV0oaHR0cHM6Ly9haS5tZXRhLmNvbS9ibG9nL21ldGEtbGxhbWEtMy8pLiBVc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW01ldGEncyBBY2NlcHRhYmxlIFVzZSBQb2xpY3ldKGh0dHBzOi8vbGxhbWEubWV0YS5jb20vbGxhbWEzL3VzZS1wb2xpY3kvKS4iLCJjb250ZXh0X2xlbmd0aCI6ODE5MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJub25lIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAyIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODE5MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibmV2ZXJzbGVlcC9sbGFtYS0zLWx1bWltYWlkLThiOmV4dGVuZGVkIiwibmFtZSI6Ik5ldmVyU2xlZXA6IExsYW1hIDMgTHVtaW1haWQgOEIgKGV4dGVuZGVkKSIsImNyZWF0ZWQiOjE3MTQ3ODA4MDAsImRlc2NyaXB0aW9uIjoiVGhlIE5ldmVyU2xlZXAgdGVhbSBpcyBiYWNrLCB3aXRoIGEgTGxhbWEgMyA4QiBmaW5ldHVuZSB0cmFpbmVkIG9uIHRoZWlyIGN1cmF0ZWQgcm9sZXBsYXkgZGF0YS4gU3RyaWtpbmcgYSBiYWxhbmNlIGJldHdlZW4gZVJQIGFuZCBSUCwgTHVtaW1haWQgd2FzIGRlc2lnbmVkIHRvIGJlIHNlcmlvdXMsIHlldCB1bmNlbnNvcmVkIHdoZW4gbmVjZXNzYXJ5LlxuXG5UbyBlbmhhbmNlIGl0J3Mgb3ZlcmFsbCBpbnRlbGxpZ2VuY2UgYW5kIGNoYXQgY2FwYWJpbGl0eSwgcm91Z2hseSA0MCUgb2YgdGhlIHRyYWluaW5nIGRhdGEgd2FzIG5vdCByb2xlcGxheS4gVGhpcyBwcm92aWRlcyBhIGJyZWFkdGggb2Yga25vd2xlZGdlIHRvIGFjY2Vzcywgd2hpbGUgc3RpbGwga2VlcGluZyByb2xlcGxheSBhcyB0aGUgcHJpbWFyeSBzdHJlbmd0aC5cblxuVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIFtNZXRhJ3MgQWNjZXB0YWJsZSBVc2UgUG9saWN5XShodHRwczovL2xsYW1hLm1ldGEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjI0NTc2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEzIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDkzNzUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA3NSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjQ1NzYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MjA0OCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im5ldmVyc2xlZXAvbGxhbWEtMy1sdW1pbWFpZC04YiIsIm5hbWUiOiJOZXZlclNsZWVwOiBMbGFtYSAzIEx1bWltYWlkIDhCIiwiY3JlYXRlZCI6MTcxNDc4MDgwMCwiZGVzY3JpcHRpb24iOiJUaGUgTmV2ZXJTbGVlcCB0ZWFtIGlzIGJhY2ssIHdpdGggYSBMbGFtYSAzIDhCIGZpbmV0dW5lIHRyYWluZWQgb24gdGhlaXIgY3VyYXRlZCByb2xlcGxheSBkYXRhLiBTdHJpa2luZyBhIGJhbGFuY2UgYmV0d2VlbiBlUlAgYW5kIFJQLCBMdW1pbWFpZCB3YXMgZGVzaWduZWQgdG8gYmUgc2VyaW91cywgeWV0IHVuY2Vuc29yZWQgd2hlbiBuZWNlc3NhcnkuXG5cblRvIGVuaGFuY2UgaXQncyBvdmVyYWxsIGludGVsbGlnZW5jZSBhbmQgY2hhdCBjYXBhYmlsaXR5LCByb3VnaGx5IDQwJSBvZiB0aGUgdHJhaW5pbmcgZGF0YSB3YXMgbm90IHJvbGVwbGF5LiBUaGlzIHByb3ZpZGVzIGEgYnJlYWR0aCBvZiBrbm93bGVkZ2UgdG8gYWNjZXNzLCB3aGlsZSBzdGlsbCBrZWVwaW5nIHJvbGVwbGF5IGFzIHRoZSBwcmltYXJ5IHN0cmVuZ3RoLlxuXG5Vc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW01ldGEncyBBY2NlcHRhYmxlIFVzZSBQb2xpY3ldKGh0dHBzOi8vbGxhbWEubWV0YS5jb20vbGxhbWEzL3VzZS1wb2xpY3kvKS4iLCJjb250ZXh0X2xlbmd0aCI6MjQ1NzYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwOTM3NSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDc1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyNDU3NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoyMDQ4LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoic2FvMTBrL2ZpbWJ1bHZldHItMTFiLXYyIiwibmFtZSI6IkZpbWJ1bHZldHIgMTFCIHYyIiwiY3JlYXRlZCI6MTcxMzY1NzYwMCwiZGVzY3JpcHRpb24iOiJDcmVhdGl2ZSB3cml0aW5nIG1vZGVsLCByb3V0ZWQgd2l0aCBwZXJtaXNzaW9uLiBJdCdzIGZhc3QsIGl0IGtlZXBzIHRoZSBjb252ZXJzYXRpb24gZ29pbmcsIGFuZCBpdCBzdGF5cyBpbiBjaGFyYWN0ZXIuXG5cbklmIHlvdSBzdWJtaXQgYSByYXcgcHJvbXB0LCB5b3UgY2FuIHVzZSBBbHBhY2Egb3IgVmljdW5hIGZvcm1hdHMuIiwiY29udGV4dF9sZW5ndGgiOjQwOTYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTIiLCJpbnN0cnVjdF90eXBlIjoiYWxwYWNhIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA4IiwiY29tcGxldGlvbiI6IjAuMDAwMDAxMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NDA5NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWV0YS1sbGFtYS9sbGFtYS0zLThiLWluc3RydWN0IiwibmFtZSI6Ik1ldGE6IExsYW1hIDMgOEIgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzEzMzk4NDAwLCJkZXNjcmlwdGlvbiI6Ik1ldGEncyBsYXRlc3QgY2xhc3Mgb2YgbW9kZWwgKExsYW1hIDMpIGxhdW5jaGVkIHdpdGggYSB2YXJpZXR5IG9mIHNpemVzICYgZmxhdm9ycy4gVGhpcyA4QiBpbnN0cnVjdC10dW5lZCB2ZXJzaW9uIHdhcyBvcHRpbWl6ZWQgZm9yIGhpZ2ggcXVhbGl0eSBkaWFsb2d1ZSB1c2VjYXNlcy5cblxuSXQgaGFzIGRlbW9uc3RyYXRlZCBzdHJvbmcgcGVyZm9ybWFuY2UgY29tcGFyZWQgdG8gbGVhZGluZyBjbG9zZWQtc291cmNlIG1vZGVscyBpbiBodW1hbiBldmFsdWF0aW9ucy5cblxuVG8gcmVhZCBtb3JlIGFib3V0IHRoZSBtb2RlbCByZWxlYXNlLCBbY2xpY2sgaGVyZV0oaHR0cHM6Ly9haS5tZXRhLmNvbS9ibG9nL21ldGEtbGxhbWEtMy8pLiBVc2FnZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gW01ldGEncyBBY2NlcHRhYmxlIFVzZSBQb2xpY3ldKGh0dHBzOi8vbGxhbWEubWV0YS5jb20vbGxhbWEzL3VzZS1wb2xpY3kvKS4iLCJjb250ZXh0X2xlbmd0aCI6ODE5MiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMyIsImluc3RydWN0X3R5cGUiOiJsbGFtYTMifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDAzIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjgxOTIsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6ODE5MiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtMy03MGItaW5zdHJ1Y3QiLCJuYW1lIjoiTWV0YTogTGxhbWEgMyA3MEIgSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNzEzMzk4NDAwLCJkZXNjcmlwdGlvbiI6Ik1ldGEncyBsYXRlc3QgY2xhc3Mgb2YgbW9kZWwgKExsYW1hIDMpIGxhdW5jaGVkIHdpdGggYSB2YXJpZXR5IG9mIHNpemVzICYgZmxhdm9ycy4gVGhpcyA3MEIgaW5zdHJ1Y3QtdHVuZWQgdmVyc2lvbiB3YXMgb3B0aW1pemVkIGZvciBoaWdoIHF1YWxpdHkgZGlhbG9ndWUgdXNlY2FzZXMuXG5cbkl0IGhhcyBkZW1vbnN0cmF0ZWQgc3Ryb25nIHBlcmZvcm1hbmNlIGNvbXBhcmVkIHRvIGxlYWRpbmcgY2xvc2VkLXNvdXJjZSBtb2RlbHMgaW4gaHVtYW4gZXZhbHVhdGlvbnMuXG5cblRvIHJlYWQgbW9yZSBhYm91dCB0aGUgbW9kZWwgcmVsZWFzZSwgW2NsaWNrIGhlcmVdKGh0dHBzOi8vYWkubWV0YS5jb20vYmxvZy9tZXRhLWxsYW1hLTMvKS4gVXNhZ2Ugb2YgdGhpcyBtb2RlbCBpcyBzdWJqZWN0IHRvIFtNZXRhJ3MgQWNjZXB0YWJsZSBVc2UgUG9saWN5XShodHRwczovL2xsYW1hLm1ldGEuY29tL2xsYW1hMy91c2UtcG9saWN5LykuIiwiY29udGV4dF9sZW5ndGgiOjgxOTIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTMiLCJpbnN0cnVjdF90eXBlIjoibGxhbWEzIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAzIiwiY29tcGxldGlvbiI6IjAuMDAwMDAwNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODE5MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWlzdHJhbGFpL21peHRyYWwtOHgyMmItaW5zdHJ1Y3QiLCJuYW1lIjoiTWlzdHJhbDogTWl4dHJhbCA4eDIyQiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MTMzMTIwMDAsImRlc2NyaXB0aW9uIjoiTWlzdHJhbCdzIG9mZmljaWFsIGluc3RydWN0IGZpbmUtdHVuZWQgdmVyc2lvbiBvZiBbTWl4dHJhbCA4eDIyQl0oL21vZGVscy9taXN0cmFsYWkvbWl4dHJhbC04eDIyYikuIEl0IHVzZXMgMzlCIGFjdGl2ZSBwYXJhbWV0ZXJzIG91dCBvZiAxNDFCLCBvZmZlcmluZyB1bnBhcmFsbGVsZWQgY29zdCBlZmZpY2llbmN5IGZvciBpdHMgc2l6ZS4gSXRzIHN0cmVuZ3RocyBpbmNsdWRlOlxuLSBzdHJvbmcgbWF0aCwgY29kaW5nLCBhbmQgcmVhc29uaW5nXG4tIGxhcmdlIGNvbnRleHQgbGVuZ3RoICg2NGspXG4tIGZsdWVuY3kgaW4gRW5nbGlzaCwgRnJlbmNoLCBJdGFsaWFuLCBHZXJtYW4sIGFuZCBTcGFuaXNoXG5cblNlZSBiZW5jaG1hcmtzIG9uIHRoZSBsYXVuY2ggYW5ub3VuY2VtZW50IFtoZXJlXShodHRwczovL21pc3RyYWwuYWkvbmV3cy9taXh0cmFsLTh4MjJiLykuXG4jbW9lIiwiY29udGV4dF9sZW5ndGgiOjY1NTM2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOiJtaXN0cmFsIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA5IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwOSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NjU1MzYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pY3Jvc29mdC93aXphcmRsbS0yLTh4MjJiIiwibmFtZSI6IldpemFyZExNLTIgOHgyMkIiLCJjcmVhdGVkIjoxNzEzMjI1NjAwLCJkZXNjcmlwdGlvbiI6IldpemFyZExNLTIgOHgyMkIgaXMgTWljcm9zb2Z0IEFJJ3MgbW9zdCBhZHZhbmNlZCBXaXphcmQgbW9kZWwuIEl0IGRlbW9uc3RyYXRlcyBoaWdobHkgY29tcGV0aXRpdmUgcGVyZm9ybWFuY2UgY29tcGFyZWQgdG8gbGVhZGluZyBwcm9wcmlldGFyeSBtb2RlbHMsIGFuZCBpdCBjb25zaXN0ZW50bHkgb3V0cGVyZm9ybXMgYWxsIGV4aXN0aW5nIHN0YXRlLW9mLXRoZS1hcnQgb3BlbnNvdXJjZSBtb2RlbHMuXG5cbkl0IGlzIGFuIGluc3RydWN0IGZpbmV0dW5lIG9mIFtNaXh0cmFsIDh4MjJCXSgvbW9kZWxzL21pc3RyYWxhaS9taXh0cmFsLTh4MjJiKS5cblxuVG8gcmVhZCBtb3JlIGFib3V0IHRoZSBtb2RlbCByZWxlYXNlLCBbY2xpY2sgaGVyZV0oaHR0cHM6Ly93aXphcmRsbS5naXRodWIuaW8vV2l6YXJkTE0yLykuXG5cbiNtb2UiLCJjb250ZXh0X2xlbmd0aCI6NjU1MzYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6InZpY3VuYSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjY1NTM2LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaWNyb3NvZnQvd2l6YXJkbG0tMi03YiIsIm5hbWUiOiJXaXphcmRMTS0yIDdCIiwiY3JlYXRlZCI6MTcxMzIyNTYwMCwiZGVzY3JpcHRpb24iOiJXaXphcmRMTS0yIDdCIGlzIHRoZSBzbWFsbGVyIHZhcmlhbnQgb2YgTWljcm9zb2Z0IEFJJ3MgbGF0ZXN0IFdpemFyZCBtb2RlbC4gSXQgaXMgdGhlIGZhc3Rlc3QgYW5kIGFjaGlldmVzIGNvbXBhcmFibGUgcGVyZm9ybWFuY2Ugd2l0aCBleGlzdGluZyAxMHggbGFyZ2VyIG9wZW5zb3VyY2UgbGVhZGluZyBtb2RlbHNcblxuSXQgaXMgYSBmaW5ldHVuZSBvZiBbTWlzdHJhbCA3QiBJbnN0cnVjdF0oL21vZGVscy9taXN0cmFsYWkvbWlzdHJhbC03Yi1pbnN0cnVjdCksIHVzaW5nIHRoZSBzYW1lIHRlY2huaXF1ZSBhcyBbV2l6YXJkTE0tMiA4eDIyQl0oL21vZGVscy9taWNyb3NvZnQvd2l6YXJkbG0tMi04eDIyYikuXG5cblRvIHJlYWQgbW9yZSBhYm91dCB0aGUgbW9kZWwgcmVsZWFzZSwgW2NsaWNrIGhlcmVdKGh0dHBzOi8vd2l6YXJkbG0uZ2l0aHViLmlvL1dpemFyZExNMi8pLlxuXG4jbW9lIiwiY29udGV4dF9sZW5ndGgiOjMyMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOiJ2aWN1bmEifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDA3IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMDciLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvZ2VtaW5pLXByby0xLjUiLCJuYW1lIjoiR29vZ2xlOiBHZW1pbmkgMS41IFBybyIsImNyZWF0ZWQiOjE3MTI2MjA4MDAsImRlc2NyaXB0aW9uIjoiR29vZ2xlJ3MgbGF0ZXN0IG11bHRpbW9kYWwgbW9kZWwsIHN1cHBvcnRzIGltYWdlIGFuZCB2aWRlb1swXSBpbiB0ZXh0IG9yIGNoYXQgcHJvbXB0cy5cblxuT3B0aW1pemVkIGZvciBsYW5ndWFnZSB0YXNrcyBpbmNsdWRpbmc6XG5cbi0gQ29kZSBnZW5lcmF0aW9uXG4tIFRleHQgZ2VuZXJhdGlvblxuLSBUZXh0IGVkaXRpbmdcbi0gUHJvYmxlbSBzb2x2aW5nXG4tIFJlY29tbWVuZGF0aW9uc1xuLSBJbmZvcm1hdGlvbiBleHRyYWN0aW9uXG4tIERhdGEgZXh0cmFjdGlvbiBvciBnZW5lcmF0aW9uXG4tIEFJIGFnZW50c1xuXG5Vc2FnZSBvZiBHZW1pbmkgaXMgc3ViamVjdCB0byBHb29nbGUncyBbR2VtaW5pIFRlcm1zIG9mIFVzZV0oaHR0cHM6Ly9haS5nb29nbGUuZGV2L3Rlcm1zKS5cblxuKiBbMF06IFZpZGVvIGlucHV0IGlzIG5vdCBhdmFpbGFibGUgdGhyb3VnaCBPcGVuUm91dGVyIGF0IHRoaXMgdGltZS4iLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR2VtaW5pIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDEyNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDY1NzUiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvZ3B0LTQtdHVyYm8iLCJuYW1lIjoiT3BlbkFJOiBHUFQtNCBUdXJibyIsImNyZWF0ZWQiOjE3MTI2MjA4MDAsImRlc2NyaXB0aW9uIjoiVGhlIGxhdGVzdCBHUFQtNCBUdXJibyBtb2RlbCB3aXRoIHZpc2lvbiBjYXBhYmlsaXRpZXMuIFZpc2lvbiByZXF1ZXN0cyBjYW4gbm93IHVzZSBKU09OIG1vZGUgYW5kIGZ1bmN0aW9uIGNhbGxpbmcuXG5cblRyYWluaW5nIGRhdGE6IHVwIHRvIERlY2VtYmVyIDIwMjMuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMSIsImNvbXBsZXRpb24iOiIwLjAwMDAzIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDE0NDUiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiY29oZXJlL2NvbW1hbmQtci1wbHVzIiwibmFtZSI6IkNvaGVyZTogQ29tbWFuZCBSKyIsImNyZWF0ZWQiOjE3MTIxODg4MDAsImRlc2NyaXB0aW9uIjoiQ29tbWFuZCBSKyBpcyBhIG5ldywgMTA0Qi1wYXJhbWV0ZXIgTExNIGZyb20gQ29oZXJlLiBJdCdzIHVzZWZ1bCBmb3Igcm9sZXBsYXksIGdlbmVyYWwgY29uc3VtZXIgdXNlY2FzZXMsIGFuZCBSZXRyaWV2YWwgQXVnbWVudGVkIEdlbmVyYXRpb24gKFJBRykuXG5cbkl0IG9mZmVycyBtdWx0aWxpbmd1YWwgc3VwcG9ydCBmb3IgdGVuIGtleSBsYW5ndWFnZXMgdG8gZmFjaWxpdGF0ZSBnbG9iYWwgYnVzaW5lc3Mgb3BlcmF0aW9ucy4gU2VlIGJlbmNobWFya3MgYW5kIHRoZSBsYXVuY2ggcG9zdCBbaGVyZV0oaHR0cHM6Ly90eHQuY29oZXJlLmNvbS9jb21tYW5kLXItcGx1cy1taWNyb3NvZnQtYXp1cmUvKS5cblxuVXNlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBDb2hlcmUncyBbVXNhZ2UgUG9saWN5XShodHRwczovL2RvY3MuY29oZXJlLmNvbS9kb2NzL3VzYWdlLXBvbGljeSkgYW5kIFtTYWFTIEFncmVlbWVudF0oaHR0cHM6Ly9jb2hlcmUuY29tL3NhYXMtYWdyZWVtZW50KS4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ29oZXJlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDMiLCJjb21wbGV0aW9uIjoiMC4wMDAwMTUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDAwLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiY29oZXJlL2NvbW1hbmQtci1wbHVzLTA0LTIwMjQiLCJuYW1lIjoiQ29oZXJlOiBDb21tYW5kIFIrICgwNC0yMDI0KSIsImNyZWF0ZWQiOjE3MTIwMTYwMDAsImRlc2NyaXB0aW9uIjoiQ29tbWFuZCBSKyBpcyBhIG5ldywgMTA0Qi1wYXJhbWV0ZXIgTExNIGZyb20gQ29oZXJlLiBJdCdzIHVzZWZ1bCBmb3Igcm9sZXBsYXksIGdlbmVyYWwgY29uc3VtZXIgdXNlY2FzZXMsIGFuZCBSZXRyaWV2YWwgQXVnbWVudGVkIEdlbmVyYXRpb24gKFJBRykuXG5cbkl0IG9mZmVycyBtdWx0aWxpbmd1YWwgc3VwcG9ydCBmb3IgdGVuIGtleSBsYW5ndWFnZXMgdG8gZmFjaWxpdGF0ZSBnbG9iYWwgYnVzaW5lc3Mgb3BlcmF0aW9ucy4gU2VlIGJlbmNobWFya3MgYW5kIHRoZSBsYXVuY2ggcG9zdCBbaGVyZV0oaHR0cHM6Ly90eHQuY29oZXJlLmNvbS9jb21tYW5kLXItcGx1cy1taWNyb3NvZnQtYXp1cmUvKS5cblxuVXNlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBDb2hlcmUncyBbVXNhZ2UgUG9saWN5XShodHRwczovL2RvY3MuY29oZXJlLmNvbS9kb2NzL3VzYWdlLXBvbGljeSkgYW5kIFtTYWFTIEFncmVlbWVudF0oaHR0cHM6Ly9jb2hlcmUuY29tL3NhYXMtYWdyZWVtZW50KS4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ29oZXJlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDMiLCJjb21wbGV0aW9uIjoiMC4wMDAwMTUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDAwLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoic29waG9zeW1wYXRoZWlhL21pZG5pZ2h0LXJvc2UtNzBiIiwibmFtZSI6Ik1pZG5pZ2h0IFJvc2UgNzBCIiwiY3JlYXRlZCI6MTcxMTA2NTYwMCwiZGVzY3JpcHRpb24iOiJBIG1lcmdlIHdpdGggYSBjb21wbGV4IGZhbWlseSB0cmVlLCB0aGlzIG1vZGVsIHdhcyBjcmFmdGVkIGZvciByb2xlcGxheWluZyBhbmQgc3Rvcnl0ZWxsaW5nLiBNaWRuaWdodCBSb3NlIGlzIGEgc3VjY2Vzc29yIHRvIFJvZ3VlIFJvc2UgYW5kIEF1cm9yYSBOaWdodHMgYW5kIGltcHJvdmVzIHVwb24gdGhlbSBib3RoLiBJdCB3YW50cyB0byBwcm9kdWNlIGxlbmd0aHkgb3V0cHV0IGJ5IGRlZmF1bHQgYW5kIGlzIHRoZSBiZXN0IGNyZWF0aXZlIHdyaXRpbmcgbWVyZ2UgcHJvZHVjZWQgc28gZmFyIGJ5IHNvcGhvc3ltcGF0aGVpYS5cblxuRGVzY2VuZGluZyBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgb2YgTWlkbmlnaHQgUm9zZSBhbmQgW1dpemFyZCBUdWx1IERvbHBoaW4gNzBCXShodHRwczovL2h1Z2dpbmdmYWNlLmNvL3NvcGhvc3ltcGF0aGVpYS9XaXphcmQtVHVsdS1Eb2xwaGluLTcwQi12MS4wKSwgaXQgaW5oZXJpdHMgdGhlIGJlc3QgcXVhbGl0aWVzIG9mIGVhY2guIiwiY29udGV4dF9sZW5ndGgiOjQwOTYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTIiLCJpbnN0cnVjdF90eXBlIjoiYWlyb2Jvcm9zIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA4IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwOCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NDA5NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiY29oZXJlL2NvbW1hbmQiLCJuYW1lIjoiQ29oZXJlOiBDb21tYW5kIiwiY3JlYXRlZCI6MTcxMDM3NDQwMCwiZGVzY3JpcHRpb24iOiJDb21tYW5kIGlzIGFuIGluc3RydWN0aW9uLWZvbGxvd2luZyBjb252ZXJzYXRpb25hbCBtb2RlbCB0aGF0IHBlcmZvcm1zIGxhbmd1YWdlIHRhc2tzIHdpdGggaGlnaCBxdWFsaXR5LCBtb3JlIHJlbGlhYmx5IGFuZCB3aXRoIGEgbG9uZ2VyIGNvbnRleHQgdGhhbiBvdXIgYmFzZSBnZW5lcmF0aXZlIG1vZGVscy5cblxuVXNlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBDb2hlcmUncyBbVXNhZ2UgUG9saWN5XShodHRwczovL2RvY3MuY29oZXJlLmNvbS9kb2NzL3VzYWdlLXBvbGljeSkgYW5kIFtTYWFTIEFncmVlbWVudF0oaHR0cHM6Ly9jb2hlcmUuY29tL3NhYXMtYWdyZWVtZW50KS4iLCJjb250ZXh0X2xlbmd0aCI6NDA5NiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNvaGVyZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo0MDk2LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwMDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJjb2hlcmUvY29tbWFuZC1yIiwibmFtZSI6IkNvaGVyZTogQ29tbWFuZCBSIiwiY3JlYXRlZCI6MTcxMDM3NDQwMCwiZGVzY3JpcHRpb24iOiJDb21tYW5kLVIgaXMgYSAzNUIgcGFyYW1ldGVyIG1vZGVsIHRoYXQgcGVyZm9ybXMgY29udmVyc2F0aW9uYWwgbGFuZ3VhZ2UgdGFza3MgYXQgYSBoaWdoZXIgcXVhbGl0eSwgbW9yZSByZWxpYWJseSwgYW5kIHdpdGggYSBsb25nZXIgY29udGV4dCB0aGFuIHByZXZpb3VzIG1vZGVscy4gSXQgY2FuIGJlIHVzZWQgZm9yIGNvbXBsZXggd29ya2Zsb3dzIGxpa2UgY29kZSBnZW5lcmF0aW9uLCByZXRyaWV2YWwgYXVnbWVudGVkIGdlbmVyYXRpb24gKFJBRyksIHRvb2wgdXNlLCBhbmQgYWdlbnRzLlxuXG5SZWFkIHRoZSBsYXVuY2ggcG9zdCBbaGVyZV0oaHR0cHM6Ly90eHQuY29oZXJlLmNvbS9jb21tYW5kLXIvKS5cblxuVXNlIG9mIHRoaXMgbW9kZWwgaXMgc3ViamVjdCB0byBDb2hlcmUncyBbVXNhZ2UgUG9saWN5XShodHRwczovL2RvY3MuY29oZXJlLmNvbS9kb2NzL3VzYWdlLXBvbGljeSkgYW5kIFtTYWFTIEFncmVlbWVudF0oaHR0cHM6Ly9jb2hlcmUuY29tL3NhYXMtYWdyZWVtZW50KS4iLCJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ29oZXJlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTI4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwMDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTMtaGFpa3U6YmV0YSIsIm5hbWUiOiJBbnRocm9waWM6IENsYXVkZSAzIEhhaWt1IChzZWxmLW1vZGVyYXRlZCkiLCJjcmVhdGVkIjoxNzEwMjg4MDAwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzIEhhaWt1IGlzIEFudGhyb3BpYydzIGZhc3Rlc3QgYW5kIG1vc3QgY29tcGFjdCBtb2RlbCBmb3Jcbm5lYXItaW5zdGFudCByZXNwb25zaXZlbmVzcy4gUXVpY2sgYW5kIGFjY3VyYXRlIHRhcmdldGVkIHBlcmZvcm1hbmNlLlxuXG5TZWUgdGhlIGxhdW5jaCBhbm5vdW5jZW1lbnQgYW5kIGJlbmNobWFyayByZXN1bHRzIFtoZXJlXShodHRwczovL3d3dy5hbnRocm9waWMuY29tL25ld3MvY2xhdWRlLTMtaGFpa3UpXG5cbiNtdWx0aW1vZGFsIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ2xhdWRlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAyNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTI1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDAwNCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwMDAzIiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAwMDMifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFudGhyb3BpYy9jbGF1ZGUtMy1oYWlrdSIsIm5hbWUiOiJBbnRocm9waWM6IENsYXVkZSAzIEhhaWt1IiwiY3JlYXRlZCI6MTcxMDI4ODAwMCwiZGVzY3JpcHRpb24iOiJDbGF1ZGUgMyBIYWlrdSBpcyBBbnRocm9waWMncyBmYXN0ZXN0IGFuZCBtb3N0IGNvbXBhY3QgbW9kZWwgZm9yXG5uZWFyLWluc3RhbnQgcmVzcG9uc2l2ZW5lc3MuIFF1aWNrIGFuZCBhY2N1cmF0ZSB0YXJnZXRlZCBwZXJmb3JtYW5jZS5cblxuU2VlIHRoZSBsYXVuY2ggYW5ub3VuY2VtZW50IGFuZCBiZW5jaG1hcmsgcmVzdWx0cyBbaGVyZV0oaHR0cHM6Ly93d3cuYW50aHJvcGljLmNvbS9uZXdzL2NsYXVkZS0zLWhhaWt1KVxuXG4jbXVsdGltb2RhbCIsImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNsYXVkZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMjUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDEyNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMDQiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDAwMyIsImlucHV0X2NhY2hlX3dyaXRlIjoiMC4wMDAwMDAzIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFudGhyb3BpYy9jbGF1ZGUtMy1vcHVzOmJldGEiLCJuYW1lIjoiQW50aHJvcGljOiBDbGF1ZGUgMyBPcHVzIChzZWxmLW1vZGVyYXRlZCkiLCJjcmVhdGVkIjoxNzA5NTk2ODAwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzIE9wdXMgaXMgQW50aHJvcGljJ3MgbW9zdCBwb3dlcmZ1bCBtb2RlbCBmb3IgaGlnaGx5IGNvbXBsZXggdGFza3MuIEl0IGJvYXN0cyB0b3AtbGV2ZWwgcGVyZm9ybWFuY2UsIGludGVsbGlnZW5jZSwgZmx1ZW5jeSwgYW5kIHVuZGVyc3RhbmRpbmcuXG5cblNlZSB0aGUgbGF1bmNoIGFubm91bmNlbWVudCBhbmQgYmVuY2htYXJrIHJlc3VsdHMgW2hlcmVdKGh0dHBzOi8vd3d3LmFudGhyb3BpYy5jb20vbmV3cy9jbGF1ZGUtMy1mYW1pbHkpXG5cbiNtdWx0aW1vZGFsIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ2xhdWRlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMTUiLCJjb21wbGV0aW9uIjoiMC4wMDAwNzUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMjQiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDE1IiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAxODc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTMtb3B1cyIsIm5hbWUiOiJBbnRocm9waWM6IENsYXVkZSAzIE9wdXMiLCJjcmVhdGVkIjoxNzA5NTk2ODAwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAzIE9wdXMgaXMgQW50aHJvcGljJ3MgbW9zdCBwb3dlcmZ1bCBtb2RlbCBmb3IgaGlnaGx5IGNvbXBsZXggdGFza3MuIEl0IGJvYXN0cyB0b3AtbGV2ZWwgcGVyZm9ybWFuY2UsIGludGVsbGlnZW5jZSwgZmx1ZW5jeSwgYW5kIHVuZGVyc3RhbmRpbmcuXG5cblNlZSB0aGUgbGF1bmNoIGFubm91bmNlbWVudCBhbmQgYmVuY2htYXJrIHJlc3VsdHMgW2hlcmVdKGh0dHBzOi8vd3d3LmFudGhyb3BpYy5jb20vbmV3cy9jbGF1ZGUtMy1mYW1pbHkpXG5cbiNtdWx0aW1vZGFsIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ2xhdWRlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMTUiLCJjb21wbGV0aW9uIjoiMC4wMDAwNzUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMjQiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAiLCJpbnB1dF9jYWNoZV9yZWFkIjoiMC4wMDAwMDE1IiwiaW5wdXRfY2FjaGVfd3JpdGUiOiIwLjAwMDAxODc1In0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFudGhyb3BpYy9jbGF1ZGUtMy1zb25uZXQ6YmV0YSIsIm5hbWUiOiJBbnRocm9waWM6IENsYXVkZSAzIFNvbm5ldCAoc2VsZi1tb2RlcmF0ZWQpIiwiY3JlYXRlZCI6MTcwOTU5NjgwMCwiZGVzY3JpcHRpb24iOiJDbGF1ZGUgMyBTb25uZXQgaXMgYW4gaWRlYWwgYmFsYW5jZSBvZiBpbnRlbGxpZ2VuY2UgYW5kIHNwZWVkIGZvciBlbnRlcnByaXNlIHdvcmtsb2Fkcy4gTWF4aW11bSB1dGlsaXR5IGF0IGEgbG93ZXIgcHJpY2UsIGRlcGVuZGFibGUsIGJhbGFuY2VkIGZvciBzY2FsZWQgZGVwbG95bWVudHMuXG5cblNlZSB0aGUgbGF1bmNoIGFubm91bmNlbWVudCBhbmQgYmVuY2htYXJrIHJlc3VsdHMgW2hlcmVdKGh0dHBzOi8vd3d3LmFudGhyb3BpYy5jb20vbmV3cy9jbGF1ZGUtMy1mYW1pbHkpXG5cbiNtdWx0aW1vZGFsIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ2xhdWRlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDMiLCJjb21wbGV0aW9uIjoiMC4wMDAwMTUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMC4wMDQ4Iiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIiwiaW5wdXRfY2FjaGVfcmVhZCI6IjAuMDAwMDAwMyIsImlucHV0X2NhY2hlX3dyaXRlIjoiMC4wMDAwMDM3NSJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYW50aHJvcGljL2NsYXVkZS0zLXNvbm5ldCIsIm5hbWUiOiJBbnRocm9waWM6IENsYXVkZSAzIFNvbm5ldCIsImNyZWF0ZWQiOjE3MDk1OTY4MDAsImRlc2NyaXB0aW9uIjoiQ2xhdWRlIDMgU29ubmV0IGlzIGFuIGlkZWFsIGJhbGFuY2Ugb2YgaW50ZWxsaWdlbmNlIGFuZCBzcGVlZCBmb3IgZW50ZXJwcmlzZSB3b3JrbG9hZHMuIE1heGltdW0gdXRpbGl0eSBhdCBhIGxvd2VyIHByaWNlLCBkZXBlbmRhYmxlLCBiYWxhbmNlZCBmb3Igc2NhbGVkIGRlcGxveW1lbnRzLlxuXG5TZWUgdGhlIGxhdW5jaCBhbm5vdW5jZW1lbnQgYW5kIGJlbmNobWFyayByZXN1bHRzIFtoZXJlXShodHRwczovL3d3dy5hbnRocm9waWMuY29tL25ld3MvY2xhdWRlLTMtZmFtaWx5KVxuXG4jbXVsdGltb2RhbCIsImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQraW1hZ2UtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiLCJpbWFnZSJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNsYXVkZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAzIiwiY29tcGxldGlvbiI6IjAuMDAwMDE1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDA0OCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCIsImlucHV0X2NhY2hlX3JlYWQiOiIwLjAwMDAwMDMiLCJpbnB1dF9jYWNoZV93cml0ZSI6IjAuMDAwMDAzNzUifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiY29oZXJlL2NvbW1hbmQtci0wMy0yMDI0IiwibmFtZSI6IkNvaGVyZTogQ29tbWFuZCBSICgwMy0yMDI0KSIsImNyZWF0ZWQiOjE3MDkzNDEyMDAsImRlc2NyaXB0aW9uIjoiQ29tbWFuZC1SIGlzIGEgMzVCIHBhcmFtZXRlciBtb2RlbCB0aGF0IHBlcmZvcm1zIGNvbnZlcnNhdGlvbmFsIGxhbmd1YWdlIHRhc2tzIGF0IGEgaGlnaGVyIHF1YWxpdHksIG1vcmUgcmVsaWFibHksIGFuZCB3aXRoIGEgbG9uZ2VyIGNvbnRleHQgdGhhbiBwcmV2aW91cyBtb2RlbHMuIEl0IGNhbiBiZSB1c2VkIGZvciBjb21wbGV4IHdvcmtmbG93cyBsaWtlIGNvZGUgZ2VuZXJhdGlvbiwgcmV0cmlldmFsIGF1Z21lbnRlZCBnZW5lcmF0aW9uIChSQUcpLCB0b29sIHVzZSwgYW5kIGFnZW50cy5cblxuUmVhZCB0aGUgbGF1bmNoIHBvc3QgW2hlcmVdKGh0dHBzOi8vdHh0LmNvaGVyZS5jb20vY29tbWFuZC1yLykuXG5cblVzZSBvZiB0aGlzIG1vZGVsIGlzIHN1YmplY3QgdG8gQ29oZXJlJ3MgW1VzYWdlIFBvbGljeV0oaHR0cHM6Ly9kb2NzLmNvaGVyZS5jb20vZG9jcy91c2FnZS1wb2xpY3kpIGFuZCBbU2FhUyBBZ3JlZW1lbnRdKGh0dHBzOi8vY29oZXJlLmNvbS9zYWFzLWFncmVlbWVudCkuIiwiY29udGV4dF9sZW5ndGgiOjEyODAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNvaGVyZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDAwLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWlzdHJhbGFpL21pc3RyYWwtbGFyZ2UiLCJuYW1lIjoiTWlzdHJhbCBMYXJnZSIsImNyZWF0ZWQiOjE3MDg5MDU2MDAsImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBNaXN0cmFsIEFJJ3MgZmxhZ3NoaXAgbW9kZWwsIE1pc3RyYWwgTGFyZ2UgMiAodmVyc2lvbiBgbWlzdHJhbC1sYXJnZS0yNDA3YCkuIEl0J3MgYSBwcm9wcmlldGFyeSB3ZWlnaHRzLWF2YWlsYWJsZSBtb2RlbCBhbmQgZXhjZWxzIGF0IHJlYXNvbmluZywgY29kZSwgSlNPTiwgY2hhdCwgYW5kIG1vcmUuIFJlYWQgdGhlIGxhdW5jaCBhbm5vdW5jZW1lbnQgW2hlcmVdKGh0dHBzOi8vbWlzdHJhbC5haS9uZXdzL21pc3RyYWwtbGFyZ2UtMjQwNy8pLlxuXG5JdCBzdXBwb3J0cyBkb3plbnMgb2YgbGFuZ3VhZ2VzIGluY2x1ZGluZyBGcmVuY2gsIEdlcm1hbiwgU3BhbmlzaCwgSXRhbGlhbiwgUG9ydHVndWVzZSwgQXJhYmljLCBIaW5kaSwgUnVzc2lhbiwgQ2hpbmVzZSwgSmFwYW5lc2UsIGFuZCBLb3JlYW4sIGFsb25nIHdpdGggODArIGNvZGluZyBsYW5ndWFnZXMgaW5jbHVkaW5nIFB5dGhvbiwgSmF2YSwgQywgQysrLCBKYXZhU2NyaXB0LCBhbmQgQmFzaC4gSXRzIGxvbmcgY29udGV4dCB3aW5kb3cgYWxsb3dzIHByZWNpc2UgaW5mb3JtYXRpb24gcmVjYWxsIGZyb20gbGFyZ2UgZG9jdW1lbnRzLiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC0zLjUtdHVyYm8tMDYxMyIsIm5hbWUiOiJPcGVuQUk6IEdQVC0zLjUgVHVyYm8gKG9sZGVyIHYwNjEzKSIsImNyZWF0ZWQiOjE3MDYxNDA4MDAsImRlc2NyaXB0aW9uIjoiR1BULTMuNSBUdXJibyBpcyBPcGVuQUkncyBmYXN0ZXN0IG1vZGVsLiBJdCBjYW4gdW5kZXJzdGFuZCBhbmQgZ2VuZXJhdGUgbmF0dXJhbCBsYW5ndWFnZSBvciBjb2RlLCBhbmQgaXMgb3B0aW1pemVkIGZvciBjaGF0IGFuZCB0cmFkaXRpb25hbCBjb21wbGV0aW9uIHRhc2tzLlxuXG5UcmFpbmluZyBkYXRhIHVwIHRvIFNlcCAyMDIxLiIsImNvbnRleHRfbGVuZ3RoIjo0MDk1LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjQwOTUsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9ncHQtNC10dXJiby1wcmV2aWV3IiwibmFtZSI6Ik9wZW5BSTogR1BULTQgVHVyYm8gUHJldmlldyIsImNyZWF0ZWQiOjE3MDYxNDA4MDAsImRlc2NyaXB0aW9uIjoiVGhlIHByZXZpZXcgR1BULTQgbW9kZWwgd2l0aCBpbXByb3ZlZCBpbnN0cnVjdGlvbiBmb2xsb3dpbmcsIEpTT04gbW9kZSwgcmVwcm9kdWNpYmxlIG91dHB1dHMsIHBhcmFsbGVsIGZ1bmN0aW9uIGNhbGxpbmcsIGFuZCBtb3JlLiBUcmFpbmluZyBkYXRhOiB1cCB0byBEZWMgMjAyMy5cblxuKipOb3RlOioqIGhlYXZpbHkgcmF0ZSBsaW1pdGVkIGJ5IE9wZW5BSSB3aGlsZSBpbiBwcmV2aWV3LiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDMiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJub3VzcmVzZWFyY2gvbm91cy1oZXJtZXMtMi1taXh0cmFsLTh4N2ItZHBvIiwibmFtZSI6Ik5vdXM6IEhlcm1lcyAyIE1peHRyYWwgOHg3QiBEUE8iLCJjcmVhdGVkIjoxNzA1MzYzMjAwLCJkZXNjcmlwdGlvbiI6Ik5vdXMgSGVybWVzIDIgTWl4dHJhbCA4eDdCIERQTyBpcyB0aGUgbmV3IGZsYWdzaGlwIE5vdXMgUmVzZWFyY2ggbW9kZWwgdHJhaW5lZCBvdmVyIHRoZSBbTWl4dHJhbCA4eDdCIE1vRSBMTE1dKC9tb2RlbHMvbWlzdHJhbGFpL21peHRyYWwtOHg3YikuXG5cblRoZSBtb2RlbCB3YXMgdHJhaW5lZCBvbiBvdmVyIDEsMDAwLDAwMCBlbnRyaWVzIG9mIHByaW1hcmlseSBbR1BULTRdKC9tb2RlbHMvb3BlbmFpL2dwdC00KSBnZW5lcmF0ZWQgZGF0YSwgYXMgd2VsbCBhcyBvdGhlciBoaWdoIHF1YWxpdHkgZGF0YSBmcm9tIG9wZW4gZGF0YXNldHMgYWNyb3NzIHRoZSBBSSBsYW5kc2NhcGUsIGFjaGlldmluZyBzdGF0ZSBvZiB0aGUgYXJ0IHBlcmZvcm1hbmNlIG9uIGEgdmFyaWV0eSBvZiB0YXNrcy5cblxuI21vZSIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA2IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwNiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MjA0OCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1pc3RyYWxhaS9taXN0cmFsLW1lZGl1bSIsIm5hbWUiOiJNaXN0cmFsIE1lZGl1bSIsImNyZWF0ZWQiOjE3MDQ4NDQ4MDAsImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBNaXN0cmFsIEFJJ3MgY2xvc2VkLXNvdXJjZSwgbWVkaXVtLXNpZGVkIG1vZGVsLiBJdCdzIHBvd2VyZWQgYnkgYSBjbG9zZWQtc291cmNlIHByb3RvdHlwZSBhbmQgZXhjZWxzIGF0IHJlYXNvbmluZywgY29kZSwgSlNPTiwgY2hhdCwgYW5kIG1vcmUuIEluIGJlbmNobWFya3MsIGl0IGNvbXBhcmVzIHdpdGggbWFueSBvZiB0aGUgZmxhZ3NoaXAgbW9kZWxzIG9mIG90aGVyIGNvbXBhbmllcy4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDI3NSIsImNvbXBsZXRpb24iOiIwLjAwMDAwODEiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaXN0cmFsYWkvbWlzdHJhbC1zbWFsbCIsIm5hbWUiOiJNaXN0cmFsIFNtYWxsIiwiY3JlYXRlZCI6MTcwNDg0NDgwMCwiZGVzY3JpcHRpb24iOiJXaXRoIDIyIGJpbGxpb24gcGFyYW1ldGVycywgTWlzdHJhbCBTbWFsbCB2MjQuMDkgb2ZmZXJzIGEgY29udmVuaWVudCBtaWQtcG9pbnQgYmV0d2VlbiAoTWlzdHJhbCBOZU1vIDEyQilbL21pc3RyYWxhaS9taXN0cmFsLW5lbW9dIGFuZCAoTWlzdHJhbCBMYXJnZSAyKVsvbWlzdHJhbGFpL21pc3RyYWwtbGFyZ2VdLCBwcm92aWRpbmcgYSBjb3N0LWVmZmVjdGl2ZSBzb2x1dGlvbiB0aGF0IGNhbiBiZSBkZXBsb3llZCBhY3Jvc3MgdmFyaW91cyBwbGF0Zm9ybXMgYW5kIGVudmlyb25tZW50cy4gSXQgaGFzIGJldHRlciByZWFzb25pbmcsIGV4aGliaXRzIG1vcmUgY2FwYWJpbGl0aWVzLCBjYW4gcHJvZHVjZSBhbmQgcmVhc29uIGFib3V0IGNvZGUsIGFuZCBpcyBtdWx0aWxpZ3VhbCwgc3VwcG9ydGluZyBFbmdsaXNoLCBGcmVuY2gsIEdlcm1hbiwgSXRhbGlhbiwgYW5kIFNwYW5pc2guIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMiIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaXN0cmFsYWkvbWlzdHJhbC10aW55IiwibmFtZSI6Ik1pc3RyYWwgVGlueSIsImNyZWF0ZWQiOjE3MDQ4NDQ4MDAsImRlc2NyaXB0aW9uIjoiTm90ZTogVGhpcyBtb2RlbCBpcyBiZWluZyBkZXByZWNhdGVkLiBSZWNvbW1lbmRlZCByZXBsYWNlbWVudCBpcyB0aGUgbmV3ZXIgW01pbmlzdHJhbCA4Ql0oL21pc3RyYWwvbWluaXN0cmFsLThiKVxuXG5UaGlzIG1vZGVsIGlzIGN1cnJlbnRseSBwb3dlcmVkIGJ5IE1pc3RyYWwtN0ItdjAuMiwgYW5kIGluY29ycG9yYXRlcyBhIFwiYmV0dGVyXCIgZmluZS10dW5pbmcgdGhhbiBbTWlzdHJhbCA3Ql0oL21vZGVscy9taXN0cmFsYWkvbWlzdHJhbC03Yi1pbnN0cnVjdC12MC4xKSwgaW5zcGlyZWQgYnkgY29tbXVuaXR5IHdvcmsuIEl0J3MgYmVzdCB1c2VkIGZvciBsYXJnZSBiYXRjaCBwcm9jZXNzaW5nIHRhc2tzIHdoZXJlIGNvc3QgaXMgYSBzaWduaWZpY2FudCBmYWN0b3IgYnV0IHJlYXNvbmluZyBjYXBhYmlsaXRpZXMgYXJlIG5vdCBjcnVjaWFsLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDI1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMjUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaXN0cmFsYWkvbWlzdHJhbC03Yi1pbnN0cnVjdC12MC4yIiwibmFtZSI6Ik1pc3RyYWw6IE1pc3RyYWwgN0IgSW5zdHJ1Y3QgdjAuMiIsImNyZWF0ZWQiOjE3MDM3MjE2MDAsImRlc2NyaXB0aW9uIjoiQSBoaWdoLXBlcmZvcm1pbmcsIGluZHVzdHJ5LXN0YW5kYXJkIDcuM0IgcGFyYW1ldGVyIG1vZGVsLCB3aXRoIG9wdGltaXphdGlvbnMgZm9yIHNwZWVkIGFuZCBjb250ZXh0IGxlbmd0aC5cblxuQW4gaW1wcm92ZWQgdmVyc2lvbiBvZiBbTWlzdHJhbCA3QiBJbnN0cnVjdF0oL21vZGVsc21pc3RyYWxhaS9taXN0cmFsLTdiLWluc3RydWN0LXYwLjEpLCB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhbmdlczpcblxuLSAzMmsgY29udGV4dCB3aW5kb3cgKHZzIDhrIGNvbnRleHQgaW4gdjAuMSlcbi0gUm9wZS10aGV0YSA9IDFlNlxuLSBObyBTbGlkaW5nLVdpbmRvdyBBdHRlbnRpb24iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6Im1pc3RyYWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiY29nbml0aXZlY29tcHV0YXRpb25zL2RvbHBoaW4tbWl4dHJhbC04eDdiIiwibmFtZSI6IkRvbHBoaW4gMi42IE1peHRyYWwgOHg3QiDwn5CsIiwiY3JlYXRlZCI6MTcwMzExNjgwMCwiZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgMTZrIGNvbnRleHQgZmluZS10dW5lIG9mIFtNaXh0cmFsLTh4N2JdKC9tb2RlbHMvbWlzdHJhbGFpL21peHRyYWwtOHg3YikuIEl0IGV4Y2VscyBpbiBjb2RpbmcgdGFza3MgZHVlIHRvIGV4dGVuc2l2ZSB0cmFpbmluZyB3aXRoIGNvZGluZyBkYXRhIGFuZCBpcyBrbm93biBmb3IgaXRzIG9iZWRpZW5jZSwgYWx0aG91Z2ggaXQgbGFja3MgRFBPIHR1bmluZy5cblxuVGhlIG1vZGVsIGlzIHVuY2Vuc29yZWQgYW5kIGlzIHN0cmlwcGVkIG9mIGFsaWdubWVudCBhbmQgYmlhcy4gSXQgcmVxdWlyZXMgYW4gZXh0ZXJuYWwgYWxpZ25tZW50IGxheWVyIGZvciBldGhpY2FsIHVzZS4gVXNlcnMgYXJlIGNhdXRpb25lZCB0byB1c2UgdGhpcyBoaWdobHkgY29tcGxpYW50IG1vZGVsIHJlc3BvbnNpYmx5LCBhcyBkZXRhaWxlZCBpbiBhIGJsb2cgcG9zdCBhYm91dCB1bmNlbnNvcmVkIG1vZGVscyBhdCBbZXJpY2hhcnRmb3JkLmNvbS91bmNlbnNvcmVkLW1vZGVsc10oaHR0cHM6Ly9lcmljaGFydGZvcmQuY29tL3VuY2Vuc29yZWQtbW9kZWxzKS5cblxuI21vZSAjdW5jZW5zb3JlZCIsImNvbnRleHRfbGVuZ3RoIjozMjc2OCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6Ik1pc3RyYWwiLCJpbnN0cnVjdF90eXBlIjoiY2hhdG1sIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjgsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Imdvb2dsZS9nZW1pbmktcHJvLXZpc2lvbiIsIm5hbWUiOiJHb29nbGU6IEdlbWluaSBQcm8gVmlzaW9uIDEuMCIsImNyZWF0ZWQiOjE3MDI0MjU2MDAsImRlc2NyaXB0aW9uIjoiR29vZ2xlJ3MgZmxhZ3NoaXAgbXVsdGltb2RhbCBtb2RlbCwgc3VwcG9ydGluZyBpbWFnZSBhbmQgdmlkZW8gaW4gdGV4dCBvciBjaGF0IHByb21wdHMgZm9yIGEgdGV4dCBvciBjb2RlIHJlc3BvbnNlLlxuXG5TZWUgdGhlIGJlbmNobWFya3MgYW5kIHByb21wdGluZyBndWlkZWxpbmVzIGZyb20gW0RlZXBtaW5kXShodHRwczovL2RlZXBtaW5kLmdvb2dsZS90ZWNobm9sb2dpZXMvZ2VtaW5pLykuXG5cblVzYWdlIG9mIEdlbWluaSBpcyBzdWJqZWN0IHRvIEdvb2dsZSdzIFtHZW1pbmkgVGVybXMgb2YgVXNlXShodHRwczovL2FpLmdvb2dsZS5kZXYvdGVybXMpLlxuXG4jbXVsdGltb2RhbCIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dCtpbWFnZS0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCIsImltYWdlIl0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR2VtaW5pIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAxNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwLjAwMjUiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoxNjM4NCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoyMDQ4LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZ29vZ2xlL2dlbWluaS1wcm8iLCJuYW1lIjoiR29vZ2xlOiBHZW1pbmkgUHJvIDEuMCIsImNyZWF0ZWQiOjE3MDI0MjU2MDAsImRlc2NyaXB0aW9uIjoiR29vZ2xlJ3MgZmxhZ3NoaXAgdGV4dCBnZW5lcmF0aW9uIG1vZGVsLiBEZXNpZ25lZCB0byBoYW5kbGUgbmF0dXJhbCBsYW5ndWFnZSB0YXNrcywgbXVsdGl0dXJuIHRleHQgYW5kIGNvZGUgY2hhdCwgYW5kIGNvZGUgZ2VuZXJhdGlvbi5cblxuU2VlIHRoZSBiZW5jaG1hcmtzIGFuZCBwcm9tcHRpbmcgZ3VpZGVsaW5lcyBmcm9tIFtEZWVwbWluZF0oaHR0cHM6Ly9kZWVwbWluZC5nb29nbGUvdGVjaG5vbG9naWVzL2dlbWluaS8pLlxuXG5Vc2FnZSBvZiBHZW1pbmkgaXMgc3ViamVjdCB0byBHb29nbGUncyBbR2VtaW5pIFRlcm1zIG9mIFVzZV0oaHR0cHM6Ly9haS5nb29nbGUuZGV2L3Rlcm1zKS4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHZW1pbmkiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDE1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAuMDAyNSIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzYwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaXN0cmFsYWkvbWl4dHJhbC04eDdiLWluc3RydWN0IiwibmFtZSI6Ik1pc3RyYWw6IE1peHRyYWwgOHg3QiBJbnN0cnVjdCIsImNyZWF0ZWQiOjE3MDIxNjY0MDAsImRlc2NyaXB0aW9uIjoiTWl4dHJhbCA4eDdCIEluc3RydWN0IGlzIGEgcHJldHJhaW5lZCBnZW5lcmF0aXZlIFNwYXJzZSBNaXh0dXJlIG9mIEV4cGVydHMsIGJ5IE1pc3RyYWwgQUksIGZvciBjaGF0IGFuZCBpbnN0cnVjdGlvbiB1c2UuIEluY29ycG9yYXRlcyA4IGV4cGVydHMgKGZlZWQtZm9yd2FyZCBuZXR3b3JrcykgZm9yIGEgdG90YWwgb2YgNDcgYmlsbGlvbiBwYXJhbWV0ZXJzLlxuXG5JbnN0cnVjdCBtb2RlbCBmaW5lLXR1bmVkIGJ5IE1pc3RyYWwuICNtb2UiLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6Im1pc3RyYWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDI0IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMjQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuY2hhdC9vcGVuY2hhdC03YiIsIm5hbWUiOiJPcGVuQ2hhdCAzLjUgN0IiLCJjcmVhdGVkIjoxNzAxMTI5NjAwLCJkZXNjcmlwdGlvbiI6Ik9wZW5DaGF0IDdCIGlzIGEgbGlicmFyeSBvZiBvcGVuLXNvdXJjZSBsYW5ndWFnZSBtb2RlbHMsIGZpbmUtdHVuZWQgd2l0aCBcIkMtUkxGVCAoQ29uZGl0aW9uZWQgUmVpbmZvcmNlbWVudCBMZWFybmluZyBGaW5lLVR1bmluZylcIiAtIGEgc3RyYXRlZ3kgaW5zcGlyZWQgYnkgb2ZmbGluZSByZWluZm9yY2VtZW50IGxlYXJuaW5nLiBJdCBoYXMgYmVlbiB0cmFpbmVkIG9uIG1peGVkLXF1YWxpdHkgZGF0YSB3aXRob3V0IHByZWZlcmVuY2UgbGFiZWxzLlxuXG4tIEZvciBPcGVuQ2hhdCBmaW5lLXR1bmVkIG9uIE1pc3RyYWwgN0IsIGNoZWNrIG91dCBbT3BlbkNoYXQgN0JdKC9tb2RlbHMvb3BlbmNoYXQvb3BlbmNoYXQtN2IpLlxuLSBGb3IgT3BlbkNoYXQgZmluZS10dW5lZCBvbiBMbGFtYSA4QiwgY2hlY2sgb3V0IFtPcGVuQ2hhdCA4Ql0oL21vZGVscy9vcGVuY2hhdC9vcGVuY2hhdC04YikuXG5cbiNvcGVuLXNvdXJjZSIsImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOiJvcGVuY2hhdCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMDciLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAwNyIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODE5MiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibmV2ZXJzbGVlcC9ub3JvbWFpZC0yMGIiLCJuYW1lIjoiTm9yb21haWQgMjBCIiwiY3JlYXRlZCI6MTcwMDk1NjgwMCwiZGVzY3JpcHRpb24iOiJBIGNvbGxhYiBiZXR3ZWVuIElrYXJpRGV2IGFuZCBVbmRpLiBUaGlzIG1lcmdlIGlzIHN1aXRhYmxlIGZvciBSUCwgRVJQLCBhbmQgZ2VuZXJhbCBrbm93bGVkZ2UuXG5cbiNtZXJnZSAjdW5jZW5zb3JlZCIsImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEyIiwiaW5zdHJ1Y3RfdHlwZSI6ImFscGFjYSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwNzUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDE1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjIwNDgsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTIuMTpiZXRhIiwibmFtZSI6IkFudGhyb3BpYzogQ2xhdWRlIHYyLjEgKHNlbGYtbW9kZXJhdGVkKSIsImNyZWF0ZWQiOjE3MDA2MTEyMDAsImRlc2NyaXB0aW9uIjoiQ2xhdWRlIDIgZGVsaXZlcnMgYWR2YW5jZW1lbnRzIGluIGtleSBjYXBhYmlsaXRpZXMgZm9yIGVudGVycHJpc2Vz4oCUaW5jbHVkaW5nIGFuIGluZHVzdHJ5LWxlYWRpbmcgMjAwSyB0b2tlbiBjb250ZXh0IHdpbmRvdywgc2lnbmlmaWNhbnQgcmVkdWN0aW9ucyBpbiByYXRlcyBvZiBtb2RlbCBoYWxsdWNpbmF0aW9uLCBzeXN0ZW0gcHJvbXB0cyBhbmQgYSBuZXcgYmV0YSBmZWF0dXJlOiB0b29sIHVzZS4iLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ2xhdWRlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDgiLCJjb21wbGV0aW9uIjoiMC4wMDAwMjQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiYW50aHJvcGljL2NsYXVkZS0yLjEiLCJuYW1lIjoiQW50aHJvcGljOiBDbGF1ZGUgdjIuMSIsImNyZWF0ZWQiOjE3MDA2MTEyMDAsImRlc2NyaXB0aW9uIjoiQ2xhdWRlIDIgZGVsaXZlcnMgYWR2YW5jZW1lbnRzIGluIGtleSBjYXBhYmlsaXRpZXMgZm9yIGVudGVycHJpc2Vz4oCUaW5jbHVkaW5nIGFuIGluZHVzdHJ5LWxlYWRpbmcgMjAwSyB0b2tlbiBjb250ZXh0IHdpbmRvdywgc2lnbmlmaWNhbnQgcmVkdWN0aW9ucyBpbiByYXRlcyBvZiBtb2RlbCBoYWxsdWNpbmF0aW9uLCBzeXN0ZW0gcHJvbXB0cyBhbmQgYSBuZXcgYmV0YSBmZWF0dXJlOiB0b29sIHVzZS4iLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiQ2xhdWRlIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDgiLCJjb21wbGV0aW9uIjoiMC4wMDAwMjQiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTI6YmV0YSIsIm5hbWUiOiJBbnRocm9waWM6IENsYXVkZSB2MiAoc2VsZi1tb2RlcmF0ZWQpIiwiY3JlYXRlZCI6MTcwMDYxMTIwMCwiZGVzY3JpcHRpb24iOiJDbGF1ZGUgMiBkZWxpdmVycyBhZHZhbmNlbWVudHMgaW4ga2V5IGNhcGFiaWxpdGllcyBmb3IgZW50ZXJwcmlzZXPigJRpbmNsdWRpbmcgYW4gaW5kdXN0cnktbGVhZGluZyAyMDBLIHRva2VuIGNvbnRleHQgd2luZG93LCBzaWduaWZpY2FudCByZWR1Y3Rpb25zIGluIHJhdGVzIG9mIG1vZGVsIGhhbGx1Y2luYXRpb24sIHN5c3RlbSBwcm9tcHRzIGFuZCBhIG5ldyBiZXRhIGZlYXR1cmU6IHRvb2wgdXNlLiIsImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAyNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MjAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTIiLCJuYW1lIjoiQW50aHJvcGljOiBDbGF1ZGUgdjIiLCJjcmVhdGVkIjoxNzAwNjExMjAwLCJkZXNjcmlwdGlvbiI6IkNsYXVkZSAyIGRlbGl2ZXJzIGFkdmFuY2VtZW50cyBpbiBrZXkgY2FwYWJpbGl0aWVzIGZvciBlbnRlcnByaXNlc+KAlGluY2x1ZGluZyBhbiBpbmR1c3RyeS1sZWFkaW5nIDIwMEsgdG9rZW4gY29udGV4dCB3aW5kb3csIHNpZ25pZmljYW50IHJlZHVjdGlvbnMgaW4gcmF0ZXMgb2YgbW9kZWwgaGFsbHVjaW5hdGlvbiwgc3lzdGVtIHByb21wdHMgYW5kIGEgbmV3IGJldGEgZmVhdHVyZTogdG9vbCB1c2UuIiwiY29udGV4dF9sZW5ndGgiOjIwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkNsYXVkZSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDA4IiwiY29tcGxldGlvbiI6IjAuMDAwMDI0IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjoyMDAwMDAsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoidW5kaTk1L3RvcHB5LW0tN2IiLCJuYW1lIjoiVG9wcHkgTSA3QiIsImNyZWF0ZWQiOjE2OTk1NzQ0MDAsImRlc2NyaXB0aW9uIjoiQSB3aWxkIDdCIHBhcmFtZXRlciBtb2RlbCB0aGF0IG1lcmdlcyBzZXZlcmFsIG1vZGVscyB1c2luZyB0aGUgbmV3IHRhc2tfYXJpdGhtZXRpYyBtZXJnZSBtZXRob2QgZnJvbSBtZXJnZWtpdC5cbkxpc3Qgb2YgbWVyZ2VkIG1vZGVsczpcbi0gTm91c1Jlc2VhcmNoL05vdXMtQ2FweWJhcmEtN0ItVjEuOVxuLSBbSHVnZ2luZ0ZhY2VINC96ZXBoeXItN2ItYmV0YV0oL21vZGVscy9odWdnaW5nZmFjZWg0L3plcGh5ci03Yi1iZXRhKVxuLSBsZW1vbmlsaWEvQXNoaExpbWFSUC1NaXN0cmFsLTdCXG4tIFZ1bGthbmUvMTIwLURheXMtb2YtU29kb20tTG9SQS1NaXN0cmFsLTdiXG4tIFVuZGk5NS9NaXN0cmFsLXBpcHBhLXNoYXJlZ3B0LTdiLXFsb3JhXG5cbiNtZXJnZSAjdW5jZW5zb3JlZCIsImNvbnRleHRfbGVuZ3RoIjo0MDk2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOiJhbHBhY2EifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDA3IiwiY29tcGxldGlvbiI6IjAuMDAwMDAwMDciLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjQwOTYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFscGluZGFsZS9nb2xpYXRoLTEyMGIiLCJuYW1lIjoiR29saWF0aCAxMjBCIiwiY3JlYXRlZCI6MTY5OTU3NDQwMCwiZGVzY3JpcHRpb24iOiJBIGxhcmdlIExMTSBjcmVhdGVkIGJ5IGNvbWJpbmluZyB0d28gZmluZS10dW5lZCBMbGFtYSA3MEIgbW9kZWxzIGludG8gb25lIDEyMEIgbW9kZWwuIENvbWJpbmVzIFh3aW4gYW5kIEV1cnlhbGUuXG5cbkNyZWRpdHMgdG9cbi0gW0BjaGFyZ29kZGFyZF0oaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9jaGFyZ29kZGFyZCkgZm9yIGRldmVsb3BpbmcgdGhlIGZyYW1ld29yayB1c2VkIHRvIG1lcmdlIHRoZSBtb2RlbCAtIFttZXJnZWtpdF0oaHR0cHM6Ly9naXRodWIuY29tL2NnMTIzL21lcmdla2l0KS5cbi0gW0BVbmRpOTVdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vVW5kaTk1KSBmb3IgaGVscGluZyB3aXRoIHRoZSBtZXJnZSByYXRpb3MuXG5cbiNtZXJnZSIsImNvbnRleHRfbGVuZ3RoIjo2MTQ0LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEyIiwiaW5zdHJ1Y3RfdHlwZSI6ImFpcm9ib3JvcyJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDA2NTYyNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwOTM3NSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NjE0NCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo1MTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVucm91dGVyL2F1dG8iLCJuYW1lIjoiQXV0byBSb3V0ZXIiLCJjcmVhdGVkIjoxNjk5NDAxNjAwLCJkZXNjcmlwdGlvbiI6IllvdXIgcHJvbXB0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IGEgbWV0YS1tb2RlbCBhbmQgcm91dGVkIHRvIG9uZSBvZiBkb3plbnMgb2YgbW9kZWxzIChzZWUgYmVsb3cpLCBvcHRpbWl6aW5nIGZvciB0aGUgYmVzdCBwb3NzaWJsZSBvdXRwdXQuXG5cblRvIHNlZSB3aGljaCBtb2RlbCB3YXMgdXNlZCwgdmlzaXQgW0FjdGl2aXR5XSgvYWN0aXZpdHkpLCBvciByZWFkIHRoZSBgbW9kZWxgIGF0dHJpYnV0ZSBvZiB0aGUgcmVzcG9uc2UuIFlvdXIgcmVzcG9uc2Ugd2lsbCBiZSBwcmljZWQgYXQgdGhlIHNhbWUgcmF0ZSBhcyB0aGUgcm91dGVkIG1vZGVsLlxuXG5UaGUgbWV0YS1tb2RlbCBpcyBwb3dlcmVkIGJ5IFtOb3QgRGlhbW9uZF0oaHR0cHM6Ly9kb2NzLm5vdGRpYW1vbmQuYWkvZG9jcy9ob3ctbm90LWRpYW1vbmQtd29ya3MpLiBMZWFybiBtb3JlIGluIG91ciBbZG9jc10oL2RvY3MvbW9kZWwtcm91dGluZykuXG5cblJlcXVlc3RzIHdpbGwgYmUgcm91dGVkIHRvIHRoZSBmb2xsb3dpbmcgbW9kZWxzOlxuLSBbb3BlbmFpL2dwdC00by0yMDI0LTA4LTA2XSgvb3BlbmFpL2dwdC00by0yMDI0LTA4LTA2KVxuLSBbb3BlbmFpL2dwdC00by0yMDI0LTA1LTEzXSgvb3BlbmFpL2dwdC00by0yMDI0LTA1LTEzKVxuLSBbb3BlbmFpL2dwdC00by1taW5pLTIwMjQtMDctMThdKC9vcGVuYWkvZ3B0LTRvLW1pbmktMjAyNC0wNy0xOClcbi0gW29wZW5haS9jaGF0Z3B0LTRvLWxhdGVzdF0oL29wZW5haS9jaGF0Z3B0LTRvLWxhdGVzdClcbi0gW29wZW5haS9vMS1wcmV2aWV3LTIwMjQtMDktMTJdKC9vcGVuYWkvbzEtcHJldmlldy0yMDI0LTA5LTEyKVxuLSBbb3BlbmFpL28xLW1pbmktMjAyNC0wOS0xMl0oL29wZW5haS9vMS1taW5pLTIwMjQtMDktMTIpXG4tIFthbnRocm9waWMvY2xhdWRlLTMuNS1zb25uZXRdKC9hbnRocm9waWMvY2xhdWRlLTMuNS1zb25uZXQpXG4tIFthbnRocm9waWMvY2xhdWRlLTMuNS1oYWlrdV0oL2FudGhyb3BpYy9jbGF1ZGUtMy41LWhhaWt1KVxuLSBbYW50aHJvcGljL2NsYXVkZS0zLW9wdXNdKC9hbnRocm9waWMvY2xhdWRlLTMtb3B1cylcbi0gW2FudGhyb3BpYy9jbGF1ZGUtMi4xXSgvYW50aHJvcGljL2NsYXVkZS0yLjEpXG4tIFtnb29nbGUvZ2VtaW5pLXByby0xLjVdKC9nb29nbGUvZ2VtaW5pLXByby0xLjUpXG4tIFtnb29nbGUvZ2VtaW5pLWZsYXNoLTEuNV0oL2dvb2dsZS9nZW1pbmktZmxhc2gtMS41KVxuLSBbbWlzdHJhbGFpL21pc3RyYWwtbGFyZ2UtMjQwN10oL21pc3RyYWxhaS9taXN0cmFsLWxhcmdlLTI0MDcpXG4tIFttaXN0cmFsYWkvbWlzdHJhbC1uZW1vXSgvbWlzdHJhbGFpL21pc3RyYWwtbmVtbylcbi0gW2RlZXBzZWVrL2RlZXBzZWVrLXIxXSgvZGVlcHNlZWsvZGVlcHNlZWstcjEpXG4tIFttZXRhLWxsYW1hL2xsYW1hLTMuMS03MGItaW5zdHJ1Y3RdKC9tZXRhLWxsYW1hL2xsYW1hLTMuMS03MGItaW5zdHJ1Y3QpXG4tIFttZXRhLWxsYW1hL2xsYW1hLTMuMS00MDViLWluc3RydWN0XSgvbWV0YS1sbGFtYS9sbGFtYS0zLjEtNDA1Yi1pbnN0cnVjdClcbi0gW21pc3RyYWxhaS9taXh0cmFsLTh4MjJiLWluc3RydWN0XSgvbWlzdHJhbGFpL21peHRyYWwtOHgyMmItaW5zdHJ1Y3QpXG4tIFtjb2hlcmUvY29tbWFuZC1yLXBsdXNdKC9jb2hlcmUvY29tbWFuZC1yLXBsdXMpXG4tIFtjb2hlcmUvY29tbWFuZC1yXSgvY29oZXJlL2NvbW1hbmQtcikiLCJjb250ZXh0X2xlbmd0aCI6MjAwMDAwMCwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IlJvdXRlciIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6Ii0xIiwiY29tcGxldGlvbiI6Ii0xIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6bnVsbCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjpudWxsLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC0zLjUtdHVyYm8tMTEwNiIsIm5hbWUiOiJPcGVuQUk6IEdQVC0zLjUgVHVyYm8gMTZrIChvbGRlciB2MTEwNikiLCJjcmVhdGVkIjoxNjk5MjI4ODAwLCJkZXNjcmlwdGlvbiI6IkFuIG9sZGVyIEdQVC0zLjUgVHVyYm8gbW9kZWwgd2l0aCBpbXByb3ZlZCBpbnN0cnVjdGlvbiBmb2xsb3dpbmcsIEpTT04gbW9kZSwgcmVwcm9kdWNpYmxlIG91dHB1dHMsIHBhcmFsbGVsIGZ1bmN0aW9uIGNhbGxpbmcsIGFuZCBtb3JlLiBUcmFpbmluZyBkYXRhOiB1cCB0byBTZXAgMjAyMS4iLCJjb250ZXh0X2xlbmd0aCI6MTYzODUsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODUsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC00LTExMDYtcHJldmlldyIsIm5hbWUiOiJPcGVuQUk6IEdQVC00IFR1cmJvIChvbGRlciB2MTEwNikiLCJjcmVhdGVkIjoxNjk5MjI4ODAwLCJkZXNjcmlwdGlvbiI6IlRoZSBsYXRlc3QgR1BULTQgVHVyYm8gbW9kZWwgd2l0aCB2aXNpb24gY2FwYWJpbGl0aWVzLiBWaXNpb24gcmVxdWVzdHMgY2FuIG5vdyB1c2UgSlNPTiBtb2RlIGFuZCBmdW5jdGlvbiBjYWxsaW5nLlxuXG5UcmFpbmluZyBkYXRhOiB1cCB0byBBcHJpbCAyMDIzLiIsImNvbnRleHRfbGVuZ3RoIjoxMjgwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDMiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjEyODAwMCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvcGFsbS0yLWNoYXQtYmlzb24tMzJrIiwibmFtZSI6Ikdvb2dsZTogUGFMTSAyIENoYXQgMzJrIiwiY3JlYXRlZCI6MTY5ODk2OTYwMCwiZGVzY3JpcHRpb24iOiJQYUxNIDIgaXMgYSBsYW5ndWFnZSBtb2RlbCBieSBHb29nbGUgd2l0aCBpbXByb3ZlZCBtdWx0aWxpbmd1YWwsIHJlYXNvbmluZyBhbmQgY29kaW5nIGNhcGFiaWxpdGllcy4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJQYUxNIiwiaW5zdHJ1Y3RfdHlwZSI6bnVsbH0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDEiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjgxOTIsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvcGFsbS0yLWNvZGVjaGF0LWJpc29uLTMyayIsIm5hbWUiOiJHb29nbGU6IFBhTE0gMiBDb2RlIENoYXQgMzJrIiwiY3JlYXRlZCI6MTY5ODk2OTYwMCwiZGVzY3JpcHRpb24iOiJQYUxNIDIgZmluZS10dW5lZCBmb3IgY2hhdGJvdCBjb252ZXJzYXRpb25zIHRoYXQgaGVscCB3aXRoIGNvZGUtcmVsYXRlZCBxdWVzdGlvbnMuIiwiY29udGV4dF9sZW5ndGgiOjMyNzY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUGFMTSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo4MTkyLCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiam9uZHVyYmluL2Fpcm9ib3Jvcy1sMi03MGIiLCJuYW1lIjoiQWlyb2Jvcm9zIDcwQiIsImNyZWF0ZWQiOjE2OTg1Mzc2MDAsImRlc2NyaXB0aW9uIjoiQSBMbGFtYSAyIDcwQiBmaW5lLXR1bmUgdXNpbmcgc3ludGhldGljIGRhdGEgKHRoZSBBaXJvYm9yb3MgZGF0YXNldCkuXG5cbkN1cnJlbnRseSBiYXNlZCBvbiBbam9uZHVyYmluL2Fpcm9ib3Jvcy1sMi03MGJdKGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vam9uZHVyYmluL2Fpcm9ib3Jvcy1sMi03MGItMi4yLjEpLCBidXQgbWlnaHQgZ2V0IHVwZGF0ZWQgaW4gdGhlIGZ1dHVyZS4iLCJjb250ZXh0X2xlbmd0aCI6NDA5NiwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkxsYW1hMiIsImluc3RydWN0X3R5cGUiOiJhaXJvYm9yb3MifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDA1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo0MDk2LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvZ3B0LTMuNS10dXJiby1pbnN0cnVjdCIsIm5hbWUiOiJPcGVuQUk6IEdQVC0zLjUgVHVyYm8gSW5zdHJ1Y3QiLCJjcmVhdGVkIjoxNjk1ODU5MjAwLCJkZXNjcmlwdGlvbiI6IlRoaXMgbW9kZWwgaXMgYSB2YXJpYW50IG9mIEdQVC0zLjUgVHVyYm8gdHVuZWQgZm9yIGluc3RydWN0aW9uYWwgcHJvbXB0cyBhbmQgb21pdHRpbmcgY2hhdC1yZWxhdGVkIG9wdGltaXphdGlvbnMuIFRyYWluaW5nIGRhdGE6IHVwIHRvIFNlcCAyMDIxLiIsImNvbnRleHRfbGVuZ3RoIjo0MDk1LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiR1BUIiwiaW5zdHJ1Y3RfdHlwZSI6ImNoYXRtbCJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NDA5NSwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtaXN0cmFsYWkvbWlzdHJhbC03Yi1pbnN0cnVjdC12MC4xIiwibmFtZSI6Ik1pc3RyYWw6IE1pc3RyYWwgN0IgSW5zdHJ1Y3QgdjAuMSIsImNyZWF0ZWQiOjE2OTU4NTkyMDAsImRlc2NyaXB0aW9uIjoiQSA3LjNCIHBhcmFtZXRlciBtb2RlbCB0aGF0IG91dHBlcmZvcm1zIExsYW1hIDIgMTNCIG9uIGFsbCBiZW5jaG1hcmtzLCB3aXRoIG9wdGltaXphdGlvbnMgZm9yIHNwZWVkIGFuZCBjb250ZXh0IGxlbmd0aC4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjgsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJNaXN0cmFsIiwiaW5zdHJ1Y3RfdHlwZSI6Im1pc3RyYWwifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMDIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjozMjc2OCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoyMDQ4LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoicHlnbWFsaW9uYWkvbXl0aGFsaW9uLTEzYiIsIm5hbWUiOiJQeWdtYWxpb246IE15dGhhbGlvbiAxM0IiLCJjcmVhdGVkIjoxNjkzNjEyODAwLCJkZXNjcmlwdGlvbiI6IkEgYmxlbmQgb2YgdGhlIG5ldyBQeWdtYWxpb24tMTNiIGFuZCBNeXRob01heC4gI21lcmdlIiwiY29udGV4dF9sZW5ndGgiOjgxOTIsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTIiLCJpbnN0cnVjdF90eXBlIjoiYWxwYWNhIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDA1NjI1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAxMTI1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo4MTkyLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEwMjQsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJvcGVuYWkvZ3B0LTMuNS10dXJiby0xNmsiLCJuYW1lIjoiT3BlbkFJOiBHUFQtMy41IFR1cmJvIDE2ayIsImNyZWF0ZWQiOjE2OTMxODA4MDAsImRlc2NyaXB0aW9uIjoiVGhpcyBtb2RlbCBvZmZlcnMgZm91ciB0aW1lcyB0aGUgY29udGV4dCBsZW5ndGggb2YgZ3B0LTMuNS10dXJibywgYWxsb3dpbmcgaXQgdG8gc3VwcG9ydCBhcHByb3hpbWF0ZWx5IDIwIHBhZ2VzIG9mIHRleHQgaW4gYSBzaW5nbGUgcmVxdWVzdCBhdCBhIGhpZ2hlciBjb3N0LiBUcmFpbmluZyBkYXRhOiB1cCB0byBTZXAgMjAyMS4iLCJjb250ZXh0X2xlbmd0aCI6MTYzODUsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwMyIsImNvbXBsZXRpb24iOiIwLjAwMDAwNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTYzODUsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC00LTMyayIsIm5hbWUiOiJPcGVuQUk6IEdQVC00IDMyayIsImNyZWF0ZWQiOjE2OTMxODA4MDAsImRlc2NyaXB0aW9uIjoiR1BULTQtMzJrIGlzIGFuIGV4dGVuZGVkIHZlcnNpb24gb2YgR1BULTQsIHdpdGggdGhlIHNhbWUgY2FwYWJpbGl0aWVzIGJ1dCBxdWFkcnVwbGVkIGNvbnRleHQgbGVuZ3RoLCBhbGxvd2luZyBmb3IgcHJvY2Vzc2luZyB1cCB0byA0MCBwYWdlcyBvZiB0ZXh0IGluIGEgc2luZ2xlIHBhc3MuIFRoaXMgaXMgcGFydGljdWxhcmx5IGJlbmVmaWNpYWwgZm9yIGhhbmRsaW5nIGxvbmdlciBjb250ZW50IGxpa2UgaW50ZXJhY3Rpbmcgd2l0aCBQREZzIHdpdGhvdXQgYW4gZXh0ZXJuYWwgdmVjdG9yIGRhdGFiYXNlLiBUcmFpbmluZyBkYXRhOiB1cCB0byBTZXAgMjAyMS4iLCJjb250ZXh0X2xlbmd0aCI6MzI3NjcsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDA2IiwiY29tcGxldGlvbiI6IjAuMDAwMTIiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjMyNzY3LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9ncHQtNC0zMmstMDMxNCIsIm5hbWUiOiJPcGVuQUk6IEdQVC00IDMyayAob2xkZXIgdjAzMTQpIiwiY3JlYXRlZCI6MTY5MzE4MDgwMCwiZGVzY3JpcHRpb24iOiJHUFQtNC0zMmsgaXMgYW4gZXh0ZW5kZWQgdmVyc2lvbiBvZiBHUFQtNCwgd2l0aCB0aGUgc2FtZSBjYXBhYmlsaXRpZXMgYnV0IHF1YWRydXBsZWQgY29udGV4dCBsZW5ndGgsIGFsbG93aW5nIGZvciBwcm9jZXNzaW5nIHVwIHRvIDQwIHBhZ2VzIG9mIHRleHQgaW4gYSBzaW5nbGUgcGFzcy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgYmVuZWZpY2lhbCBmb3IgaGFuZGxpbmcgbG9uZ2VyIGNvbnRlbnQgbGlrZSBpbnRlcmFjdGluZyB3aXRoIFBERnMgd2l0aG91dCBhbiBleHRlcm5hbCB2ZWN0b3IgZGF0YWJhc2UuIFRyYWluaW5nIGRhdGE6IHVwIHRvIFNlcCAyMDIxLiIsImNvbnRleHRfbGVuZ3RoIjozMjc2NywiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDYiLCJjb21wbGV0aW9uIjoiMC4wMDAxMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MzI3NjcsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibm91c3Jlc2VhcmNoL25vdXMtaGVybWVzLWxsYW1hMi0xM2IiLCJuYW1lIjoiTm91czogSGVybWVzIDEzQiIsImNyZWF0ZWQiOjE2OTI0ODk2MDAsImRlc2NyaXB0aW9uIjoiQSBzdGF0ZS1vZi10aGUtYXJ0IGxhbmd1YWdlIG1vZGVsIGZpbmUtdHVuZWQgb24gb3ZlciAzMDBrIGluc3RydWN0aW9ucyBieSBOb3VzIFJlc2VhcmNoLCB3aXRoIFRla25pdW0gYW5kIEVtb3ppbGxhIGxlYWRpbmcgdGhlIGZpbmUgdHVuaW5nIHByb2Nlc3MuIiwiY29udGV4dF9sZW5ndGgiOjQwOTYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTIiLCJpbnN0cnVjdF90eXBlIjoiYWxwYWNhIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAxOCIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDE4IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo0MDk2LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOm51bGwsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJtYW5jZXIvd2VhdmVyIiwibmFtZSI6Ik1hbmNlcjogV2VhdmVyIChhbHBoYSkiLCJjcmVhdGVkIjoxNjkwOTM0NDAwLCJkZXNjcmlwdGlvbiI6IkFuIGF0dGVtcHQgdG8gcmVjcmVhdGUgQ2xhdWRlLXN0eWxlIHZlcmJvc2l0eSwgYnV0IGRvbid0IGV4cGVjdCB0aGUgc2FtZSBsZXZlbCBvZiBjb2hlcmVuY2Ugb3IgbWVtb3J5LiBNZWFudCBmb3IgdXNlIGluIHJvbGVwbGF5L25hcnJhdGl2ZSBzaXR1YXRpb25zLiIsImNvbnRleHRfbGVuZ3RoIjo4MDAwLCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEyIiwiaW5zdHJ1Y3RfdHlwZSI6ImFscGFjYSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxMTI1IiwiY29tcGxldGlvbiI6IjAuMDAwMDAxMTI1IiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo4MDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEwMDAsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJodWdnaW5nZmFjZWg0L3plcGh5ci03Yi1iZXRhOmZyZWUiLCJuYW1lIjoiSHVnZ2luZyBGYWNlOiBaZXBoeXIgN0IgKGZyZWUpIiwiY3JlYXRlZCI6MTY5MDkzNDQwMCwiZGVzY3JpcHRpb24iOiJaZXBoeXIgaXMgYSBzZXJpZXMgb2YgbGFuZ3VhZ2UgbW9kZWxzIHRoYXQgYXJlIHRyYWluZWQgdG8gYWN0IGFzIGhlbHBmdWwgYXNzaXN0YW50cy4gWmVwaHlyLTdCLc6yIGlzIHRoZSBzZWNvbmQgbW9kZWwgaW4gdGhlIHNlcmllcywgYW5kIGlzIGEgZmluZS10dW5lZCB2ZXJzaW9uIG9mIFttaXN0cmFsYWkvTWlzdHJhbC03Qi12MC4xXSgvbW9kZWxzL21pc3RyYWxhaS9taXN0cmFsLTdiLWluc3RydWN0LXYwLjEpIHRoYXQgd2FzIHRyYWluZWQgb24gYSBtaXggb2YgcHVibGljbHkgYXZhaWxhYmxlLCBzeW50aGV0aWMgZGF0YXNldHMgdXNpbmcgRGlyZWN0IFByZWZlcmVuY2UgT3B0aW1pemF0aW9uIChEUE8pLiIsImNvbnRleHRfbGVuZ3RoIjo0MDk2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTWlzdHJhbCIsImluc3RydWN0X3R5cGUiOiJ6ZXBoeXIifSwicHJpY2luZyI6eyJwcm9tcHQiOiIwIiwiY29tcGxldGlvbiI6IjAiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjQwOTYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6MjA0OCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6ImFudGhyb3BpYy9jbGF1ZGUtMi4wOmJldGEiLCJuYW1lIjoiQW50aHJvcGljOiBDbGF1ZGUgdjIuMCAoc2VsZi1tb2RlcmF0ZWQpIiwiY3JlYXRlZCI6MTY5MDUwMjQwMCwiZGVzY3JpcHRpb24iOiJBbnRocm9waWMncyBmbGFnc2hpcCBtb2RlbC4gU3VwZXJpb3IgcGVyZm9ybWFuY2Ugb24gdGFza3MgdGhhdCByZXF1aXJlIGNvbXBsZXggcmVhc29uaW5nLiBTdXBwb3J0cyBodW5kcmVkcyBvZiBwYWdlcyBvZiB0ZXh0LiIsImNvbnRleHRfbGVuZ3RoIjoxMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAyNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJhbnRocm9waWMvY2xhdWRlLTIuMCIsIm5hbWUiOiJBbnRocm9waWM6IENsYXVkZSB2Mi4wIiwiY3JlYXRlZCI6MTY5MDUwMjQwMCwiZGVzY3JpcHRpb24iOiJBbnRocm9waWMncyBmbGFnc2hpcCBtb2RlbC4gU3VwZXJpb3IgcGVyZm9ybWFuY2Ugb24gdGFza3MgdGhhdCByZXF1aXJlIGNvbXBsZXggcmVhc29uaW5nLiBTdXBwb3J0cyBodW5kcmVkcyBvZiBwYWdlcyBvZiB0ZXh0LiIsImNvbnRleHRfbGVuZ3RoIjoxMDAwMDAsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJDbGF1ZGUiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAwOCIsImNvbXBsZXRpb24iOiIwLjAwMDAyNCIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6MTAwMDAwLCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6InVuZGk5NS9yZW1tLXNsZXJwLWwyLTEzYiIsIm5hbWUiOiJSZU1NIFNMRVJQIDEzQiIsImNyZWF0ZWQiOjE2ODk5ODQwMDAsImRlc2NyaXB0aW9uIjoiQSByZWNyZWF0aW9uIHRyaWFsIG9mIHRoZSBvcmlnaW5hbCBNeXRob01heC1MMi1CMTMgYnV0IHdpdGggdXBkYXRlZCBtb2RlbHMuICNtZXJnZSIsImNvbnRleHRfbGVuZ3RoIjo2MTQ0LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEyIiwiaW5zdHJ1Y3RfdHlwZSI6ImFscGFjYSJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwNTYyNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTEyNSIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NjE0NCwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoxMDI0LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoiZ29vZ2xlL3BhbG0tMi1jaGF0LWJpc29uIiwibmFtZSI6Ikdvb2dsZTogUGFMTSAyIENoYXQiLCJjcmVhdGVkIjoxNjg5ODExMjAwLCJkZXNjcmlwdGlvbiI6IlBhTE0gMiBpcyBhIGxhbmd1YWdlIG1vZGVsIGJ5IEdvb2dsZSB3aXRoIGltcHJvdmVkIG11bHRpbGluZ3VhbCwgcmVhc29uaW5nIGFuZCBjb2RpbmcgY2FwYWJpbGl0aWVzLiIsImNvbnRleHRfbGVuZ3RoIjo5MjE2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUGFMTSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo5MjE2LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEwMjQsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJnb29nbGUvcGFsbS0yLWNvZGVjaGF0LWJpc29uIiwibmFtZSI6Ikdvb2dsZTogUGFMTSAyIENvZGUgQ2hhdCIsImNyZWF0ZWQiOjE2ODk4MTEyMDAsImRlc2NyaXB0aW9uIjoiUGFMTSAyIGZpbmUtdHVuZWQgZm9yIGNoYXRib3QgY29udmVyc2F0aW9ucyB0aGF0IGhlbHAgd2l0aCBjb2RlLXJlbGF0ZWQgcXVlc3Rpb25zLiIsImNvbnRleHRfbGVuZ3RoIjo3MTY4LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiUGFMTSIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAxIiwiY29tcGxldGlvbiI6IjAuMDAwMDAyIiwicmVxdWVzdCI6IjAiLCJpbWFnZSI6IjAiLCJ3ZWJfc2VhcmNoIjoiMCIsImludGVybmFsX3JlYXNvbmluZyI6IjAifSwidG9wX3Byb3ZpZGVyIjp7ImNvbnRleHRfbGVuZ3RoIjo3MTY4LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjEwMjQsImlzX21vZGVyYXRlZCI6ZmFsc2V9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9LHsiaWQiOiJncnlwaGUvbXl0aG9tYXgtbDItMTNiIiwibmFtZSI6Ik15dGhvTWF4IDEzQiIsImNyZWF0ZWQiOjE2ODgyNTYwMDAsImRlc2NyaXB0aW9uIjoiT25lIG9mIHRoZSBoaWdoZXN0IHBlcmZvcm1pbmcgYW5kIG1vc3QgcG9wdWxhciBmaW5lLXR1bmVzIG9mIExsYW1hIDIgMTNCLCB3aXRoIHJpY2ggZGVzY3JpcHRpb25zIGFuZCByb2xlcGxheS4gI21lcmdlIiwiY29udGV4dF9sZW5ndGgiOjQwOTYsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJMbGFtYTIiLCJpbnN0cnVjdF90eXBlIjoiYWxwYWNhIn0sInByaWNpbmciOnsicHJvbXB0IjoiMC4wMDAwMDAwNjUiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAwNjUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjQwOTYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im1ldGEtbGxhbWEvbGxhbWEtMi0xM2ItY2hhdCIsIm5hbWUiOiJNZXRhOiBMbGFtYSAyIDEzQiBDaGF0IiwiY3JlYXRlZCI6MTY4NzIxOTIwMCwiZGVzY3JpcHRpb24iOiJBIDEzIGJpbGxpb24gcGFyYW1ldGVyIGxhbmd1YWdlIG1vZGVsIGZyb20gTWV0YSwgZmluZSB0dW5lZCBmb3IgY2hhdCBjb21wbGV0aW9ucyIsImNvbnRleHRfbGVuZ3RoIjo0MDk2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEyIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMiJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwMjIiLCJjb21wbGV0aW9uIjoiMC4wMDAwMDAyMiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6NDA5NiwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjoyMDQ4LCJpc19tb2RlcmF0ZWQiOmZhbHNlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoibWV0YS1sbGFtYS9sbGFtYS0yLTcwYi1jaGF0IiwibmFtZSI6Ik1ldGE6IExsYW1hIDIgNzBCIENoYXQiLCJjcmVhdGVkIjoxNjg3MjE5MjAwLCJkZXNjcmlwdGlvbiI6IlRoZSBmbGFnc2hpcCwgNzAgYmlsbGlvbiBwYXJhbWV0ZXIgbGFuZ3VhZ2UgbW9kZWwgZnJvbSBNZXRhLCBmaW5lIHR1bmVkIGZvciBjaGF0IGNvbXBsZXRpb25zLiBMbGFtYSAyIGlzIGFuIGF1dG8tcmVncmVzc2l2ZSBsYW5ndWFnZSBtb2RlbCB0aGF0IHVzZXMgYW4gb3B0aW1pemVkIHRyYW5zZm9ybWVyIGFyY2hpdGVjdHVyZS4gVGhlIHR1bmVkIHZlcnNpb25zIHVzZSBzdXBlcnZpc2VkIGZpbmUtdHVuaW5nIChTRlQpIGFuZCByZWluZm9yY2VtZW50IGxlYXJuaW5nIHdpdGggaHVtYW4gZmVlZGJhY2sgKFJMSEYpIHRvIGFsaWduIHRvIGh1bWFuIHByZWZlcmVuY2VzIGZvciBoZWxwZnVsbmVzcyBhbmQgc2FmZXR5LiIsImNvbnRleHRfbGVuZ3RoIjo0MDk2LCJhcmNoaXRlY3R1cmUiOnsibW9kYWxpdHkiOiJ0ZXh0LT50ZXh0IiwiaW5wdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sIm91dHB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwidG9rZW5pemVyIjoiTGxhbWEyIiwiaW5zdHJ1Y3RfdHlwZSI6ImxsYW1hMiJ9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwOSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMDkiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjQwOTYsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6bnVsbCwiaXNfbW9kZXJhdGVkIjpmYWxzZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9ncHQtMy41LXR1cmJvIiwibmFtZSI6Ik9wZW5BSTogR1BULTMuNSBUdXJibyIsImNyZWF0ZWQiOjE2ODUyMzIwMDAsImRlc2NyaXB0aW9uIjoiR1BULTMuNSBUdXJibyBpcyBPcGVuQUkncyBmYXN0ZXN0IG1vZGVsLiBJdCBjYW4gdW5kZXJzdGFuZCBhbmQgZ2VuZXJhdGUgbmF0dXJhbCBsYW5ndWFnZSBvciBjb2RlLCBhbmQgaXMgb3B0aW1pemVkIGZvciBjaGF0IGFuZCB0cmFkaXRpb25hbCBjb21wbGV0aW9uIHRhc2tzLlxuXG5UcmFpbmluZyBkYXRhIHVwIHRvIFNlcCAyMDIxLiIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NSwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjE2Mzg1LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9ncHQtMy41LXR1cmJvLTAxMjUiLCJuYW1lIjoiT3BlbkFJOiBHUFQtMy41IFR1cmJvIDE2ayIsImNyZWF0ZWQiOjE2ODUyMzIwMDAsImRlc2NyaXB0aW9uIjoiVGhlIGxhdGVzdCBHUFQtMy41IFR1cmJvIG1vZGVsIHdpdGggaW1wcm92ZWQgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nLCBKU09OIG1vZGUsIHJlcHJvZHVjaWJsZSBvdXRwdXRzLCBwYXJhbGxlbCBmdW5jdGlvbiBjYWxsaW5nLCBhbmQgbW9yZS4gVHJhaW5pbmcgZGF0YTogdXAgdG8gU2VwIDIwMjEuXG5cblRoaXMgdmVyc2lvbiBoYXMgYSBoaWdoZXIgYWNjdXJhY3kgYXQgcmVzcG9uZGluZyBpbiByZXF1ZXN0ZWQgZm9ybWF0cyBhbmQgYSBmaXggZm9yIGEgYnVnIHdoaWNoIGNhdXNlZCBhIHRleHQgZW5jb2RpbmcgaXNzdWUgZm9yIG5vbi1FbmdsaXNoIGxhbmd1YWdlIGZ1bmN0aW9uIGNhbGxzLiIsImNvbnRleHRfbGVuZ3RoIjoxNjM4NSwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDAwNSIsImNvbXBsZXRpb24iOiIwLjAwMDAwMTUiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjE2Mzg1LCJtYXhfY29tcGxldGlvbl90b2tlbnMiOjQwOTYsImlzX21vZGVyYXRlZCI6dHJ1ZX0sInBlcl9yZXF1ZXN0X2xpbWl0cyI6bnVsbH0seyJpZCI6Im9wZW5haS9ncHQtNCIsIm5hbWUiOiJPcGVuQUk6IEdQVC00IiwiY3JlYXRlZCI6MTY4NTIzMjAwMCwiZGVzY3JpcHRpb24iOiJPcGVuQUkncyBmbGFnc2hpcCBtb2RlbCwgR1BULTQgaXMgYSBsYXJnZS1zY2FsZSBtdWx0aW1vZGFsIGxhbmd1YWdlIG1vZGVsIGNhcGFibGUgb2Ygc29sdmluZyBkaWZmaWN1bHQgcHJvYmxlbXMgd2l0aCBncmVhdGVyIGFjY3VyYWN5IHRoYW4gcHJldmlvdXMgbW9kZWxzIGR1ZSB0byBpdHMgYnJvYWRlciBnZW5lcmFsIGtub3dsZWRnZSBhbmQgYWR2YW5jZWQgcmVhc29uaW5nIGNhcGFiaWxpdGllcy4gVHJhaW5pbmcgZGF0YTogdXAgdG8gU2VwIDIwMjEuIiwiY29udGV4dF9sZW5ndGgiOjgxOTEsImFyY2hpdGVjdHVyZSI6eyJtb2RhbGl0eSI6InRleHQtPnRleHQiLCJpbnB1dF9tb2RhbGl0aWVzIjpbInRleHQiXSwib3V0cHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJ0b2tlbml6ZXIiOiJHUFQiLCJpbnN0cnVjdF90eXBlIjpudWxsfSwicHJpY2luZyI6eyJwcm9tcHQiOiIwLjAwMDAzIiwiY29tcGxldGlvbiI6IjAuMDAwMDYiLCJyZXF1ZXN0IjoiMCIsImltYWdlIjoiMCIsIndlYl9zZWFyY2giOiIwIiwiaW50ZXJuYWxfcmVhc29uaW5nIjoiMCJ9LCJ0b3BfcHJvdmlkZXIiOnsiY29udGV4dF9sZW5ndGgiOjgxOTEsIm1heF9jb21wbGV0aW9uX3Rva2VucyI6NDA5NiwiaXNfbW9kZXJhdGVkIjp0cnVlfSwicGVyX3JlcXVlc3RfbGltaXRzIjpudWxsfSx7ImlkIjoib3BlbmFpL2dwdC00LTAzMTQiLCJuYW1lIjoiT3BlbkFJOiBHUFQtNCAob2xkZXIgdjAzMTQpIiwiY3JlYXRlZCI6MTY4NTIzMjAwMCwiZGVzY3JpcHRpb24iOiJHUFQtNC0wMzE0IGlzIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIEdQVC00IHJlbGVhc2VkLCB3aXRoIGEgY29udGV4dCBsZW5ndGggb2YgOCwxOTIgdG9rZW5zLCBhbmQgd2FzIHN1cHBvcnRlZCB1bnRpbCBKdW5lIDE0LiBUcmFpbmluZyBkYXRhOiB1cCB0byBTZXAgMjAyMS4iLCJjb250ZXh0X2xlbmd0aCI6ODE5MSwiYXJjaGl0ZWN0dXJlIjp7Im1vZGFsaXR5IjoidGV4dC0+dGV4dCIsImlucHV0X21vZGFsaXRpZXMiOlsidGV4dCJdLCJvdXRwdXRfbW9kYWxpdGllcyI6WyJ0ZXh0Il0sInRva2VuaXplciI6IkdQVCIsImluc3RydWN0X3R5cGUiOm51bGx9LCJwcmljaW5nIjp7InByb21wdCI6IjAuMDAwMDMiLCJjb21wbGV0aW9uIjoiMC4wMDAwNiIsInJlcXVlc3QiOiIwIiwiaW1hZ2UiOiIwIiwid2ViX3NlYXJjaCI6IjAiLCJpbnRlcm5hbF9yZWFzb25pbmciOiIwIn0sInRvcF9wcm92aWRlciI6eyJjb250ZXh0X2xlbmd0aCI6ODE5MSwibWF4X2NvbXBsZXRpb25fdG9rZW5zIjo0MDk2LCJpc19tb2RlcmF0ZWQiOnRydWV9LCJwZXJfcmVxdWVzdF9saW1pdHMiOm51bGx9XX0= + recorded_at: Mon, 21 Apr 2025 11:25:26 GMT recorded_with: VCR 6.3.1 + From ad1bb2b9577942ebabc8d00efde8632dcd73898f Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Tue, 22 Apr 2025 09:05:30 -0300 Subject: [PATCH 54/55] Remove stale code from main --- spec/ruby_llm/chat_tools_spec.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spec/ruby_llm/chat_tools_spec.rb b/spec/ruby_llm/chat_tools_spec.rb index 48b27007..f68536c0 100644 --- a/spec/ruby_llm/chat_tools_spec.rb +++ b/spec/ruby_llm/chat_tools_spec.rb @@ -82,10 +82,6 @@ def execute chat_models.each do |model| # rubocop:disable Style/CombinableLoops provider = RubyLLM::Models.provider_for(model).slug it "#{provider}/#{model} can use tools without parameters in multi-turn streaming conversations" do # rubocop:disable RSpec/ExampleLength,RSpec/MultipleExpectations - if provider == 'anthropic' && model == 'claude-3-5-haiku-20241022' - pending('Anthropic frequently returns 529 OverloadedError mid-stream for this specific test. ' \ - 'This appears to be provider-side flakiness. Skipping only for this model to allow release 1.2.0.') - end chat = RubyLLM.chat(model: model) .with_temperature(0.1) .with_tool(BestLanguageToLearn) From 7ab29e010d290eef54a4c8a613a6a7b45d985787 Mon Sep 17 00:00:00 2001 From: Leonardo Mosquera Date: Tue, 22 Apr 2025 09:10:33 -0300 Subject: [PATCH 55/55] Appease rubocop --- lib/ruby_llm/providers/ollama.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ruby_llm/providers/ollama.rb b/lib/ruby_llm/providers/ollama.rb index 704ee850..eec4fe19 100644 --- a/lib/ruby_llm/providers/ollama.rb +++ b/lib/ruby_llm/providers/ollama.rb @@ -20,7 +20,7 @@ def api_base(config) config.ollama_api_base_url end - def headers(config) + def headers(_config) {} end