added prometheus data export

This commit is contained in:
specCon18 2023-08-02 00:47:47 -04:00
parent f9e7f97f00
commit 3273539169
14 changed files with 3248 additions and 3577 deletions

1
.direnv/flake-profile Symbolic link
View file

@ -0,0 +1 @@
flake-profile-3-link

View file

@ -0,0 +1 @@
/nix/store/pcq0jj14sb6bcwd12xh8k788plaq6dm2-nix-shell-env

View file

@ -0,0 +1 @@
/nix/store/6apfpfbqca55him8vv2w9dkh0ylzlv72-nix-shell-env

View file

@ -0,0 +1 @@
/nix/store/p8fk75qx2dx50hsinmwcnl57qybjwx9m-my-rust-project-env

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

176
Cargo.lock generated
View file

@ -32,12 +32,72 @@ dependencies = [
"libc",
]
[[package]]
name = "async-trait"
version = "0.1.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "axum"
version = "0.6.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6a1de45611fdb535bfde7b7de4fd54f4fd2b17b1737c0a59b69bf9b92074b8c"
dependencies = [
"async-trait",
"axum-core",
"bitflags 1.3.2",
"bytes",
"futures-util",
"http",
"http-body",
"hyper",
"itoa",
"matchit",
"memchr",
"mime",
"percent-encoding",
"pin-project-lite",
"rustversion",
"serde",
"serde_json",
"serde_path_to_error",
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tower",
"tower-layer",
"tower-service",
]
[[package]]
name = "axum-core"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
dependencies = [
"async-trait",
"bytes",
"futures-util",
"http",
"http-body",
"mime",
"rustversion",
"tower-layer",
"tower-service",
]
[[package]]
name = "backtrace"
version = "0.3.68"
@ -484,6 +544,12 @@ version = "0.4.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
[[package]]
name = "matchit"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67827e6ea8ee8a7c4a72227ef4fc08957040acffdb5f122733b24fa12daff41b"
[[package]]
name = "memchr"
version = "2.5.0"
@ -520,9 +586,13 @@ dependencies = [
name = "mtg_seller_bot"
version = "0.1.0"
dependencies = [
"axum",
"chrono",
"dotenv",
"hyper",
"indicatif",
"lazy_static",
"prometheus",
"reqwest",
"serde",
"serde_json",
@ -660,6 +730,26 @@ version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
[[package]]
name = "pin-project"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842"
dependencies = [
"pin-project-internal",
]
[[package]]
name = "pin-project-internal"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "pin-project-lite"
version = "0.2.10"
@ -693,6 +783,27 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "prometheus"
version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c"
dependencies = [
"cfg-if",
"fnv",
"lazy_static",
"memchr",
"parking_lot",
"protobuf",
"thiserror",
]
[[package]]
name = "protobuf"
version = "2.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
[[package]]
name = "quote"
version = "1.0.32"
@ -767,6 +878,12 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "rustversion"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
[[package]]
name = "ryu"
version = "1.0.15"
@ -842,6 +959,16 @@ dependencies = [
"serde",
]
[[package]]
name = "serde_path_to_error"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335"
dependencies = [
"itoa",
"serde",
]
[[package]]
name = "serde_urlencoded"
version = "0.7.1"
@ -899,6 +1026,12 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "sync_wrapper"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]]
name = "tempfile"
version = "3.7.0"
@ -912,6 +1045,26 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "thiserror"
version = "1.0.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "time"
version = "0.1.45"
@ -993,6 +1146,28 @@ dependencies = [
"tracing",
]
[[package]]
name = "tower"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
dependencies = [
"futures-core",
"futures-util",
"pin-project",
"pin-project-lite",
"tokio",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "tower-layer"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
[[package]]
name = "tower-service"
version = "0.3.2"
@ -1006,6 +1181,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
dependencies = [
"cfg-if",
"log",
"pin-project-lite",
"tracing-core",
]

View file

@ -6,9 +6,13 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
axum = "0.6.19"
chrono = "0.4.26"
dotenv = "0.15.0"
hyper = "0.14.27"
indicatif = "0.17.5"
lazy_static = "1.4.0"
prometheus = "0.13.3"
reqwest = { version = "0.11.18", features = ["json"] }
serde = { version = "1.0.178", features = ["derive"]}
serde_json = "1.0.104"

0
Dockerfile Normal file
View file

5660
cards.json

File diff suppressed because it is too large Load diff

26
flake.lock generated Normal file
View file

@ -0,0 +1,26 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1690881714,
"narHash": "sha256-h/nXluEqdiQHs1oSgkOOWF+j8gcJMWhwnZ9PFabN6q0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "9e1960bc196baf6881340d53dccb203a951745a2",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-unstable",
"type": "indirect"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

26
flake.nix Normal file
View file

@ -0,0 +1,26 @@
{
description = "A simple Rust project";
inputs.nixpkgs.url = "nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }: {
defaultPackage.x86_64-linux = with nixpkgs.legacyPackages.x86_64-linux; stdenv.mkDerivation {
name = "my-rust-project";
src = self;
buildInputs = [
openssl
pkgconfig
rustc
cargo
];
shellHook = ''
export OPENSSL_DIR=${openssl.dev}
export OPENSSL_LIB_DIR=${openssl.out}/lib
export OPENSSL_INCLUDE_DIR=${openssl.dev}/include
'';
};
};
}

View file

@ -4,6 +4,10 @@ use serde::{Deserialize, Serialize};
use std::{collections::HashMap, env, fs::File, fs::OpenOptions, io::BufReader};
use tokio::time::Duration;
use indicatif::{ProgressBar, ProgressStyle};
use axum::{routing::get, Router};
use hyper::{Server, http, body};
use std::{net::SocketAddr, sync::Arc};
use prometheus::{Encoder, TextEncoder, GaugeVec, Opts, Registry};
/// This structure defines a Card object, consisting of a name and a hashmap of prices.
#[derive(Serialize, Deserialize, Debug, Clone)]
@ -26,8 +30,13 @@ struct CardFile {
cards: Vec<CardFromFile>,
}
/// The main function of the program. It retrieves card price information from an external API and updates a local JSON file.
/// It accepts a path to a JSON file as an argument and also uses an environment variable, UPDATE_INTERVAL, to determine the frequency of its update cycle.
lazy_static::lazy_static! {
static ref CARD_VALUES: GaugeVec = GaugeVec::new(
Opts::new("card_value", "The value of cards"),
&["name"]
).unwrap();
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv::dotenv().ok();
@ -51,6 +60,18 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let update_interval = std::time::Duration::from_secs(update_interval * 3600);
// Prometheus registry to register our metrics
let registry = Arc::new(Registry::new());
// Register our metric with the registry
registry.register(Box::new(CARD_VALUES.clone())).unwrap();
// This is the address where we will expose the Prometheus /metrics endpoint
let metrics_addr = SocketAddr::from(([127, 0, 0, 1], 3001));
// Spawn a new independent Tokio task for the metrics server
tokio::spawn(run_metrics_server(metrics_addr, registry.clone()));
let mut interval = tokio::time::interval(update_interval);
loop {
interval.tick().await;
@ -88,9 +109,17 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
if let Some(price) = card.prices.get("usd") {
if let Some(price_str) = price {
if card_from_file.usd_value.as_ref() != Some(price_str) {
card_from_file.usd_value = Some(price_str.clone());
}
// Assume price_str can be parsed to a f64
let value = price_str.parse::<f64>().unwrap();
// Always update the metrics for this card
CARD_VALUES.with_label_values(&[&card_from_file.name]).set(value);
} else {
// If price is null, set it as 0
card_from_file.usd_value = Some("0.0".to_string());
CARD_VALUES.with_label_values(&[&card_from_file.name]).set(0.0);
}
}
@ -99,6 +128,20 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
tokio::time::sleep(Duration::from_millis(100)).await;
}
// After updating the card values, keep the top 10 highest value cards
cards_data.cards.sort_by(|a, b| b.usd_value.partial_cmp(&a.usd_value).unwrap());
let top_10_cards = &cards_data.cards[..10];
// Update the metrics for the top 10 cards
for card in top_10_cards {
if let Some(price_str) = &card.usd_value {
let value = price_str.parse::<f64>().unwrap();
// Update the metrics for this card
CARD_VALUES.with_label_values(&[&card.name]).set(value);
}
}
// Mark the progress bar as completed.
pb.finish_with_message("Completed!");
@ -109,6 +152,29 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
.open(file_path)?;
serde_json::to_writer_pretty(file, &cards_data)?;
}
}
async fn run_metrics_server(addr: SocketAddr, registry: Arc<Registry>) {
let app = Router::new().route("/metrics", get(move || {
let registry = Arc::clone(&registry);
async move {
let metric_families = registry.gather();
let mut buffer = vec![];
let encoder = TextEncoder::new();
encoder.encode(&metric_families, &mut buffer).unwrap();
let metrics = String::from_utf8(buffer).unwrap();
http::Response::new(body::Body::from(metrics))
}
}));
Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}

632
tmp.json
View file

@ -1,632 +0,0 @@
{"name":"castle vantress","count":2,"usd_value":"0.00"},
{"name":"snow-covered island","count":1,"usd_value":"0.00"},
{"name":"beacon of tomorrows","count":1,"usd_value":"0.00"},
{"name":"oran-rief the vastwood","count":1,"usd_value":"0.00"},
{"name":"mosswort bridge","count":1,"usd_value":"0.00"},
{"name":"snow-covered forest","count":1,"usd_value":"0.00"},
{"name":"castle embereth","count":1,"usd_value":"0.00"},
{"name":"sokenzan, crucible of defiance","count":1,"usd_value":"0.00"},
{"name":"spinerock knoll","count":1,"usd_value":"0.00"},
{"name":"yavimaya coast","count":1,"usd_value":"0.00"},
{"name":"temple of deceit","count":1,"usd_value":"0.00"},
{"name":"plaza of harmony","count":1,"usd_value":"0.00"},
{"name":"vault of champions","count":1,"usd_value":"0.00"},
{"name":"overgrown farmland","count":1,"usd_value":"0.00"},
{"name":"deserted beach","count":1,"usd_value":"0.00"},
{"name":"exotic orchard","count":2,"usd_value":"0.00"},
{"name":"spectator seating","count":1,"usd_value":"0.00"},
{"name":"wooded bastion","count":1,"usd_value":"0.00"},
{"name":"flooded grove","count":1,"usd_value":"0.00"},
{"name":"twilight mire","count":2,"usd_value":"0.00"},
{"name":"overgrown tomb","count":1,"usd_value":"0.00"},
{"name":"breeding pool","count":1,"usd_value":"0.00"},
{"name":"cinder glade","count":2,"usd_value":"0.00"},
{"name":"indatha triome","count":1,"usd_value":"0.00"},
{"name":"mossfire valley","count":1,"usd_value":"0.00"},
{"name":"haunted ridge","count":1,"usd_value":"0.00"},
{"name":"stomping ground","count":1,"usd_value":"0.00"},
{"name":"temple of epiphany","count":2,"usd_value":"0.00"},
{"name":"temple of triumph","count":1,"usd_value":"0.00"},
{"name":"needle spires","count":1,"usd_value":"0.00"},
{"name":"kessig wolf run","count":1,"usd_value":"0.00"},
{"name":"shadowblood ridge","count":1,"usd_value":"0.00"},
{"name":"desolate lighthouse","count":1,"usd_value":"0.00"},
{"name":"blinkmoth nexus","count":1,"usd_value":"0.00"},
{"name":"blast zone","count":1,"usd_value":"0.00"},
{"name":"mobilized district","count":2,"usd_value":"0.00"},
{"name":"lotus field","count":1,"usd_value":"0.00"},
{"name":"academy ruins","count":1,"usd_value":"0.00"},
{"name":"command beacon","count":1,"usd_value":"0.00"},
{"name":"drownyard temple","count":1,"usd_value":"0.00"},
{"name":"eiganjo, seat of the empire","count":1,"usd_value":"0.00"},
{"name":"windbrisk heights","count":1,"usd_value":"0.00"},
{"name":"snow-covered swamp","count":1,"usd_value":"0.00"},
{"name":"snow-covered plains","count":2,"usd_value":"0.00"},
{"name":"walking ballista","count":1,"usd_value":"0.00"},
{"name":"sundering titan","count":2,"usd_value":"0.00"},
{"name":"phyrexian revoker","count":1,"usd_value":"0.00"},
{"name":"akroan horse","count":1,"usd_value":"0.00"},
{"name":"marching duodrone","count":1,"usd_value":"0.00"},
{"name":"solemn simulacrum","count":1,"usd_value":"0.00"},
{"name":"bladegriff prototype","count":1,"usd_value":"0.00"},
{"name":"myr battlesphere","count":1,"usd_value":"0.00"},
{"name":"metalwork colossus","count":1,"usd_value":"0.00"},
{"name":"benthic biomancer","count":1,"usd_value":"0.00"},
{"name":"sphinx of foresight","count":1,"usd_value":"0.00"},
{"name":"body of knowledge","count":1,"usd_value":"0.00"},
{"name":"sakashima's protege","count":1,"usd_value":"0.00"},
{"name":"lunar mystic","count":1,"usd_value":"0.00"},
{"name":"fae of wishes","count":1,"usd_value":"0.00"},
{"name":"eon frolicker","count":1,"usd_value":"0.00"},
{"name":"nascent metamorph","count":1,"usd_value":"0.00"},
{"name":"scourge of fleets","count":1,"usd_value":"0.00"},
{"name":"rattlechains","count":1,"usd_value":"0.00"},
{"name":"dungeon geists","count":2,"usd_value":"0.00"},
{"name":"prosperous thief","count":1,"usd_value":"0.00"},
{"name":"kheru spellsnatcher","count":1,"usd_value":"0.00"},
{"name":"dimensional infiltrator","count":1,"usd_value":"0.00"},
{"name":"serpent of yawning depths","count":1,"usd_value":"0.00"},
{"name":"enigma thief","count":1,"usd_value":"0.00"},
{"name":"poppet stitcher","count":1,"usd_value":"0.00"},
{"name":"master of etherium","count":1,"usd_value":"0.00"},
{"name":"omnispell adept","count":1,"usd_value":"0.00"},
{"name":"inkwell leviathan","count":1,"usd_value":"0.00"},
{"name":"haldan, avid arcanist","count":1,"usd_value":"0.00"},
{"name":"sludge monster","count":1,"usd_value":"0.00"},
{"name":"spark double","count":1,"usd_value":"0.00"},
{"name":"patrician geist","count":1,"usd_value":"0.00"},
{"name":"niblis of frost","count":1,"usd_value":"0.00"},
{"name":"laboratory drudge","count":1,"usd_value":"0.00"},
{"name":"illithid harvester","count":3,"usd_value":"0.00"},
{"name":"gale, waterdeep prodigy","count":1,"usd_value":"0.00"},
{"name":"talrand, sky summoner","count":1,"usd_value":"0.00"},
{"name":"tomb of horrors adventurer","count":1,"usd_value":"0.00"},
{"name":"imoen, mystic trickster","count":1,"usd_value":"0.00"},
{"name":"eligeth, crossroads augur","count":1,"usd_value":"0.00"},
{"name":"guardians of oboro","count":5,"usd_value":"0.00"},
{"name":"futurist operative","count":3,"usd_value":"0.00"},
{"name":"tameshi, reality architect","count":2,"usd_value":"0.00"},
{"name":"aetherling","count":2,"usd_value":"0.00"},
{"name":"moonsnare specialist","count":7,"usd_value":"0.00"},
{"name":"mirror-mad phantasm","count":2,"usd_value":"0.00"},
{"name":"hidetsugu, devouring chaos","count":1,"usd_value":"0.00"},
{"name":"ruin raider","count":1,"usd_value":"0.00"},
{"name":"nashi, moon sage's scion","count":1,"usd_value":"0.00"},
{"name":"myojin of grim betrayal","count":1,"usd_value":"0.00"},
{"name":"nighthowler","count":1,"usd_value":"0.00"},
{"name":"ogre slumlord","count":1,"usd_value":"0.00"},
{"name":"massacre girl","count":1,"usd_value":"0.00"},
{"name":"salvage titan","count":1,"usd_value":"0.00"},
{"name":"sepulchral primordial","count":1,"usd_value":"0.00"},
{"name":"death's shadow","count":1,"usd_value":"0.00"},
{"name":"murderous rider","count":1,"usd_value":"0.00"},
{"name":"piper of the swarm","count":1,"usd_value":"0.00"},
{"name":"demon of loathing","count":1,"usd_value":"0.00"},
{"name":"gravewaker","count":1,"usd_value":"0.00"},
{"name":"despoiler of souls","count":1,"usd_value":"0.00"},
{"name":"soul of innistrad","count":1,"usd_value":"0.00"},
{"name":"silumgar assassin","count":1,"usd_value":"0.00"},
{"name":"defiant bloodlord","count":1,"usd_value":"0.00"},
{"name":"guul draz overseer","count":1,"usd_value":"0.00"},
{"name":"spawn of mayhem","count":1,"usd_value":"0.00"},
{"name":"nezumi prowler","count":1,"usd_value":"0.00"},
{"name":"pestilence demon","count":1,"usd_value":"0.00"},
{"name":"graveyard trespasser","count":1,"usd_value":"0.00"},
{"name":"baneblade scoundrel","count":1,"usd_value":"0.00"},
{"name":"calculating lich","count":1,"usd_value":"0.00"},
{"name":"dread presence","count":1,"usd_value":"0.00"},
{"name":"safana, calimport cutthroat","count":1,"usd_value":"0.00"},
{"name":"viconia, drow apostate","count":1,"usd_value":"0.00"},
{"name":"shadowheart, dark justiciar","count":2,"usd_value":"0.00"},
{"name":"sivriss, nightmare speaker","count":1,"usd_value":"0.00"},
{"name":"sarevok, deathbringer","count":1,"usd_value":"0.00"},
{"name":"solemn doomguide","count":1,"usd_value":"0.00"},
{"name":"ravenloft adventurer","count":1,"usd_value":"0.00"},
{"name":"dokuchi silencer","count":1,"usd_value":"0.00"},
{"name":"opposition agent","count":1,"usd_value":"0.00"},
{"name":"oathsworn knight","count":1,"usd_value":"0.00"},
{"name":"vilis, broker of blood","count":1,"usd_value":"0.00"},
{"name":"sengir, the dark baron","count":1,"usd_value":"0.00"},
{"name":"biting-palm ninja","count":2,"usd_value":"0.00"},
{"name":"blade of the oni","count":2,"usd_value":"0.00"},
{"name":"mukotai ambusher","count":3,"usd_value":"0.00"},
{"name":"dokuchi shadow-walker","count":3,"usd_value":"0.00"},
{"name":"elvish dreadlord","count":2,"usd_value":"0.00"},
{"name":"nezumi bladeblesser","count":2,"usd_value":"0.00"},
{"name":"intellect devourer","count":2,"usd_value":"0.00"},
{"name":"shady traveler","count":5,"usd_value":"0.00"},
{"name":"champion of stray souls","count":2,"usd_value":"0.00"},
{"name":"inkrise infiltrator","count":5,"usd_value":"0.00"},
{"name":"daring archaeologist","count":1,"usd_value":"0.00"},
{"name":"norika yamazaki, the poet","count":2,"usd_value":"0.00"},
{"name":"eiganjo exemplar","count":2,"usd_value":"0.00"},
{"name":"lae'zel vlaakith's champion","count":1,"usd_value":"0.00"},
{"name":"harper recruiter","count":1,"usd_value":"0.00"},
{"name":"kyodai, soul of kamigawa","count":1,"usd_value":"0.00"},
{"name":"ancient gold dragon","count":1,"usd_value":"0.00"},
{"name":"ellyn harbreeze, busybody","count":1,"usd_value":"0.00"},
{"name":"weathered wayfarer","count":1,"usd_value":"0.00"},
{"name":"michiko konda, truth seeker","count":1,"usd_value":"0.00"},
{"name":"brutal cathar","count":2,"usd_value":"0.00"},
{"name":"sungold sentinel","count":1,"usd_value":"0.00"},
{"name":"keeper of the accord","count":1,"usd_value":"0.00"},
{"name":"toolcraft exemplar","count":1,"usd_value":"0.00"},
{"name":"high sentinels of arashin","count":1,"usd_value":"0.00"},
{"name":"esper sentinel","count":1,"usd_value":"0.00"},
{"name":"teshar, ancestor's apostle","count":1,"usd_value":"0.00"},
{"name":"acclaimed contender","count":1,"usd_value":"0.00"},
{"name":"angelic guardian","count":1,"usd_value":"0.00"},
{"name":"archon of coronation","count":1,"usd_value":"0.00"},
{"name":"faerie guidemother","count":1,"usd_value":"0.00"},
{"name":"giant killer","count":2,"usd_value":"0.00"},
{"name":"god-eternal oketra","count":1,"usd_value":"0.00"},
{"name":"taranika, akroan veteran","count":1,"usd_value":"0.00"},
{"name":"victory's envoy","count":1,"usd_value":"0.00"},
{"name":"hanged executioner","count":1,"usd_value":"0.00"},
{"name":"majestic auricorn","count":1,"usd_value":"0.00"},
{"name":"loxodon lifechanter","count":2,"usd_value":"0.00"},
{"name":"tomik, distinguished advokist","count":1,"usd_value":"0.00"},
{"name":"wingmate roc","count":1,"usd_value":"0.00"},
{"name":"avacyn, angel of hope","count":1,"usd_value":"0.00"},
{"name":"zetalpa, primal dawn","count":1,"usd_value":"0.00"},
{"name":"livio, oathsworn sentinel","count":1,"usd_value":"0.00"},
{"name":"highcliff felidar","count":1,"usd_value":"0.00"},
{"name":"sun titan","count":1,"usd_value":"0.00"},
{"name":"trove warden","count":1,"usd_value":"0.00"},
{"name":"kytheon's irregulars","count":1,"usd_value":"0.00"},
{"name":"munda's vanguard","count":1,"usd_value":"0.00"},
{"name":"light of the legion","count":1,"usd_value":"0.00"},
{"name":"scion of vitu-ghazi","count":1,"usd_value":"0.00"},
{"name":"angel of deliverance","count":1,"usd_value":"0.00"},
{"name":"stonehewer giant","count":1,"usd_value":"0.00"},
{"name":"hero of goma fada","count":2,"usd_value":"0.00"},
{"name":"serra's guardian","count":2,"usd_value":"0.00"},
{"name":"blade-blizzard kitsune","count":2,"usd_value":"0.00"},
{"name":"sunblade samurai","count":3,"usd_value":"0.00"},
{"name":"candlegrove witch","count":4,"usd_value":"0.00"},
{"name":"imperial subduer","count":2,"usd_value":"0.00"},
{"name":"light-paws, emperor's voice","count":3,"usd_value":"0.00"},
{"name":"sephara, sky's blade","count":2,"usd_value":"0.00"},
{"name":"doomgape","count":1,"usd_value":"0.00"},
{"name":"izoni,thousand-eyed","count":1,"usd_value":"0.00"},
{"name":"kagha, shadow archdruid","count":1,"usd_value":"0.00"},
{"name":"baba lysaga, night witch","count":1,"usd_value":"0.00"},
{"name":"silver-fur, master","count":1,"usd_value":"0.00"},
{"name":"satoru umezawa","count":2,"usd_value":"0.00"},
{"name":"wilhelt, the rotcleaver","count":1,"usd_value":"0.00"},
{"name":"consuming aberration","count":1,"usd_value":"0.00"},
{"name":"sygg, river cutthroat","count":1,"usd_value":"0.00"},
{"name":"notion thief","count":1,"usd_value":"0.00"},
{"name":"anowon, the ruin thief","count":1,"usd_value":"0.00"},
{"name":"fathom feeder","count":1,"usd_value":"0.00"},
{"name":"jon irenicus, shattered one","count":1,"usd_value":"0.00"},
{"name":"rilsa rael, kingpin","count":1,"usd_value":"0.00"},
{"name":"boros reckoner","count":1,"usd_value":"0.00"},
{"name":"swiftblade vindicator","count":3,"usd_value":"0.00"},
{"name":"angelic captain","count":4,"usd_value":"0.00"},
{"name":"blade historian","count":1,"usd_value":"0.00"},
{"name":"raiyuu, storm's edge","count":2,"usd_value":"0.00"},
{"name":"risona, asari commander","count":1,"usd_value":"0.00"},
{"name":"aurelia, the warleader","count":1,"usd_value":"0.00"},
{"name":"agrus kos, wojek veteran","count":1,"usd_value":"0.00"},
{"name":"zirda, the dawnwaker","count":1,"usd_value":"0.00"},
{"name":"razia, boros archangel","count":1,"usd_value":"0.00"},
{"name":"munda, ambush leader","count":2,"usd_value":"0.00"},
{"name":"commander liara portyr","count":3,"usd_value":"0.00"},
{"name":"anya, merciless angel","count":1,"usd_value":"0.00"},
{"name":"ivorytusk fortress","count":1,"usd_value":"0.00"},
{"name":"wild beastmaster","count":1,"usd_value":"0.00"},
{"name":"gilanra, caller of wirewood","count":1,"usd_value":"0.00"},
{"name":"voracious hydra","count":1,"usd_value":"0.00"},
{"name":"kami of transience","count":2,"usd_value":"0.00"},
{"name":"dire-strain brawler","count":1,"usd_value":"0.00"},
{"name":"wing shredder","count":1,"usd_value":"0.00"},
{"name":"treeshaker chimera","count":1,"usd_value":"0.00"},
{"name":"wicked wolf","count":1,"usd_value":"0.00"},
{"name":"dire-strain demolisher","count":1,"usd_value":"0.00"},
{"name":"vengevine","count":1,"usd_value":"0.00"},
{"name":"terastodon","count":1,"usd_value":"0.00"},
{"name":"kogla, the titan ape","count":1,"usd_value":"0.00"},
{"name":"ripjaw raptor","count":1,"usd_value":"0.00"},
{"name":"wakeroot elemental","count":1,"usd_value":"0.00"},
{"name":"earthshaker giant","count":1,"usd_value":"0.00"},
{"name":"ghalta, primal hunger","count":1,"usd_value":"0.00"},
{"name":"ravenous gigantotherium","count":1,"usd_value":"0.00"},
{"name":"glademuse","count":1,"usd_value":"0.00"},
{"name":"heir of the ancient fang","count":1,"usd_value":"0.00"},
{"name":"oviya pashiri, sage lifecrafter","count":1,"usd_value":"0.00"},
{"name":"kodama of the east tree","count":1,"usd_value":"0.00"},
{"name":"immaculate magistrate","count":1,"usd_value":"0.00"},
{"name":"skanos, dragonheart","count":1,"usd_value":"0.00"},
{"name":"erinis, gloom stalker","count":2,"usd_value":"0.00"},
{"name":"wilson, refined grizzly","count":1,"usd_value":"0.00"},
{"name":"halsin, emerald archdruid","count":1,"usd_value":"0.00"},
{"name":"hound tamer","count":1,"usd_value":"0.00"},
{"name":"rampaging baloths","count":1,"usd_value":"0.00"},
{"name":"multani, yavimaya's avatar","count":1,"usd_value":"0.00"},
{"name":"sylvan advocate","count":1,"usd_value":"0.00"},
{"name":"kappa tech-wrecker","count":1,"usd_value":"0.00"},
{"name":"waker of the wilds","count":1,"usd_value":"0.00"},
{"name":"fang of shigeki","count":1,"usd_value":"0.00"},
{"name":"jaheira, friend of the forest","count":1,"usd_value":"0.00"},
{"name":"biowaste blob","count":1,"usd_value":"0.00"},
{"name":"apex devastator","count":1,"usd_value":"0.00"},
{"name":"bristling hydra","count":1,"usd_value":"0.00"},
{"name":"renegade krasis","count":1,"usd_value":"0.00"},
{"name":"architect of the untamed","count":1,"usd_value":"0.00"},
{"name":"cylian sunsinger","count":1,"usd_value":"0.00"},
{"name":"myojin of towering might","count":1,"usd_value":"0.00"},
{"name":"deranged outcast","count":1,"usd_value":"0.00"},
{"name":"soul of zendikar","count":1,"usd_value":"0.00"},
{"name":"dawnhart rejuvenator","count":4,"usd_value":"0.00"},
{"name":"jukai trainee","count":4,"usd_value":"0.00"},
{"name":"bird admirer","count":4,"usd_value":"0.00"},
{"name":"outland liberator","count":2,"usd_value":"0.00"},
{"name":"dawnhart mentor","count":2,"usd_value":"0.00"},
{"name":"noble hierarch","count":2,"usd_value":"0.00"},
{"name":"tireless hauler","count":2,"usd_value":"0.00"},
{"name":"warden of the first tree","count":2,"usd_value":"0.00"},
{"name":"weaver of harmony","count":2,"usd_value":"0.00"},
{"name":"coiling stalker","count":3,"usd_value":"0.00"},
{"name":"spring-leaf avenger","count":3,"usd_value":"0.00"},
{"name":"dryad of the ilysian grove","count":3,"usd_value":"0.00"},
{"name":"kura, the boundless sky","count":2,"usd_value":"0.00"},
{"name":"terror of mount velus","count":1,"usd_value":"0.00"},
{"name":"dreadhorde arcanist","count":1,"usd_value":"0.00"},
{"name":"marauding raptor","count":1,"usd_value":"0.00"},
{"name":"fiendish duo","count":1,"usd_value":"0.00"},
{"name":"akoum hellkite","count":1,"usd_value":"0.00"},
{"name":"captain lannery storm","count":1,"usd_value":"0.00"},
{"name":"phoenix of ash","count":1,"usd_value":"0.00"},
{"name":"sin prodder","count":1,"usd_value":"0.00"},
{"name":"legion loyalist","count":1,"usd_value":"0.00"},
{"name":"immolation shaman","count":1,"usd_value":"0.00"},
{"name":"charmbreaker devils","count":1,"usd_value":"0.00"},
{"name":"goblin dark-dwellers","count":1,"usd_value":"0.00"},
{"name":"dualcaster mage","count":1,"usd_value":"0.00"},
{"name":"smoldering egg","count":1,"usd_value":"0.00"},
{"name":"lathliss, dragon queen","count":1,"usd_value":"0.00"},
{"name":"rionya, fire dancer","count":1,"usd_value":"0.00"},
{"name":"amplifire","count":1,"usd_value":"0.00"},
{"name":"scrap welder","count":1,"usd_value":"0.00"},
{"name":"falkenrath pit fighter","count":1,"usd_value":"0.00"},
{"name":"fury","count":1,"usd_value":"0.00"},
{"name":"karlach, fury of avernus","count":1,"usd_value":"0.00"},
{"name":"gut, true soul zealot","count":1,"usd_value":"0.00"},
{"name":"ogre-head helm","count":1,"usd_value":"0.00"},
{"name":"lizard blades","count":1,"usd_value":"0.00"},
{"name":"immortal phoenix","count":1,"usd_value":"0.00"},
{"name":"rekindling phoenix","count":1,"usd_value":"0.00"},
{"name":"rageblood shaman","count":1,"usd_value":"0.00"},
{"name":"dragon-style twins","count":1,"usd_value":"0.00"},
{"name":"labyrinth champion","count":1,"usd_value":"0.00"},
{"name":"magus of the moon","count":1,"usd_value":"0.00"},
{"name":"rowan's stalwarts","count":2,"usd_value":"0.00"},
{"name":"akki ronin","count":3,"usd_value":"0.00"},
{"name":"monastery swiftspear","count":1,"usd_value":"0.00"},
{"name":"fangblade brigand","count":1,"usd_value":"0.00"},
{"name":"gargadon","count":1,"usd_value":"0.00"},
{"name":"reinforced ronin","count":1,"usd_value":"0.00"},
{"name":"combustible gearhulk","count":1,"usd_value":"0.00"},
{"name":"thundering raiju","count":1,"usd_value":"0.00"},
{"name":"etali, primal storm","count":1,"usd_value":"0.00"},
{"name":"anax, hardened in the forge","count":1,"usd_value":"0.00"},
{"name":"fervent champion","count":1,"usd_value":"0.00"},
{"name":"lovisa coldeyes","count":1,"usd_value":"0.00"},
{"name":"grim lavamancer","count":1,"usd_value":"0.00"},
{"name":"ashcloud phoenix","count":1,"usd_value":"0.00"},
{"name":"flame-wreathed phoenix","count":1,"usd_value":"0.00"},
{"name":"flameblast dragon","count":1,"usd_value":"0.00"},
{"name":"geode rager","count":1,"usd_value":"0.00"},
{"name":"goro-goro, disciple of ryusei","count":1,"usd_value":"0.00"},
{"name":"verix bladewing","count":1,"usd_value":"0.00"},
{"name":"akoum firebird","count":1,"usd_value":"0.00"},
{"name":"moonveil regent","count":1,"usd_value":"0.00"},
{"name":"sunstreak phoenix","count":1,"usd_value":"0.00"},
{"name":"hoard-smelter dragon","count":2,"usd_value":"0.00"},
{"name":"shivan dragon","count":4,"usd_value":"0.00"},
{"name":"krenko, tin street kingpin","count":2,"usd_value":"0.00"},
{"name":"drakuseth, maw of flames","count":2,"usd_value":"0.00"},
{"name":"harvesttide infiltrator","count":5,"usd_value":"0.00"},
{"name":"tavern ruffian","count":4,"usd_value":"0.00"},
{"name":"glint-horn buccaneer","count":2,"usd_value":"0.00"},
{"name":"upriser renegade","count":2,"usd_value":"0.00"},
{"name":"peerless samurai","count":2,"usd_value":"0.00"},
{"name":"village watch","count":2,"usd_value":"0.00"},
{"name":"heiko yamazaki, the general","count":2,"usd_value":"0.00"},
{"name":"legion warboss","count":2,"usd_value":"0.00"},
{"name":"xyris, the writhing storm","count":1,"usd_value":"0.00"},
{"name":"averna, the chaos bloom","count":1,"usd_value":"0.00"},
{"name":"kalamax, the stormsire","count":1,"usd_value":"0.00"},
{"name":"bane, lord of darkness","count":2,"usd_value":"0.00"},
{"name":"myrkul, lord of bones","count":1,"usd_value":"0.00"},
{"name":"Bhaal, Lord of Murder","count":2,"usd_value":"0.00"},
{"name":"korvold, fae-cursed king","count":1,"usd_value":"0.00"},
{"name":"gnostro, voice of the crags","count":1,"usd_value":"0.00"},
{"name":"dynaheir, invoker adept","count":1,"usd_value":"0.00"},
{"name":"zedruu the greathearted","count":1,"usd_value":"0.00"},
{"name":"yarok, the desecrated","count":1,"usd_value":"0.00"},
{"name":"nine-fingers keene","count":1,"usd_value":"0.00"},
{"name":"sidisi, brood tyrant","count":1,"usd_value":"0.00"},
{"name":"mazzy, truesword paladin","count":1,"usd_value":"0.00"},
{"name":"jared carthalion, true heir","count":1,"usd_value":"0.00"},
{"name":"obuun, mul daya ancestor","count":1,"usd_value":"0.00"},
{"name":"isshin, two heavens as one","count":1,"usd_value":"0.00"},
{"name":"jan jansen, chaos, crafter","count":1,"usd_value":"0.00"},
{"name":"zevlor, elturel exile","count":2,"usd_value":"0.00"},
{"name":"the kami war","count":1,"usd_value":"0.00"},
{"name":"niv-mizzet reborn","count":1,"usd_value":"0.00"},
{"name":"jhoira, weatherlight captain","count":1,"usd_value":"0.00"},
{"name":"zara, renegade recruiter","count":1,"usd_value":"0.00"},
{"name":"brudiclad, telchor engineer","count":2,"usd_value":"0.00"},
{"name":"melek izzet paragon","count":1,"usd_value":"0.00"},
{"name":"jhoira of the ghitu","count":1,"usd_value":"0.00"},
{"name":"lozhan, dragons' legacy","count":2,"usd_value":"0.00"},
{"name":"djinn illuminatus","count":1,"usd_value":"0.00"},
{"name":"dreadhorde butcher","count":1,"usd_value":"0.00"},
{"name":"falkenrath aristocrat","count":1,"usd_value":"0.00"},
{"name":"fulminator mage","count":1,"usd_value":"0.00"},
{"name":"underworld cerberus","count":1,"usd_value":"0.00"},
{"name":"tymaret, the murder king","count":1,"usd_value":"0.00"},
{"name":"dust stalker","count":1,"usd_value":"0.00"},
{"name":"astarion, the decadent","count":1,"usd_value":"0.00"},
{"name":"minthara, merciless soul","count":1,"usd_value":"0.00"},
{"name":"greasefang, okiba boss","count":2,"usd_value":"0.00"},
{"name":"orah, skyclave hierophant","count":1,"usd_value":"0.00"},
{"name":"mina and denn, wildborn","count":2,"usd_value":"0.00"},
{"name":"ruric thar, the unbowed","count":2,"usd_value":"0.00"},
{"name":"vexing shusher","count":1,"usd_value":"0.00"},
{"name":"gallia of the endless dance","count":1,"usd_value":"0.00"},
{"name":"borborygmos enraged","count":1,"usd_value":"0.00"},
{"name":"living twister","count":1,"usd_value":"0.00"},
{"name":"omnath, locus of rage","count":1,"usd_value":"0.00"},
{"name":"pako arcane retriever","count":1,"usd_value":"0.00"},
{"name":"wort, the raidmother","count":1,"usd_value":"0.00"},
{"name":"savageborn hydra","count":1,"usd_value":"0.00"},
{"name":"ravager wurm","count":1,"usd_value":"0.00"},
{"name":"oji, the exquisite blade","count":1,"usd_value":"0.00"},
{"name":"meddling mage","count":1,"usd_value":"0.00"},
{"name":"noyan dar, roil shaper","count":3,"usd_value":"0.00"},
{"name":"lavinia of the tenth","count":2,"usd_value":"0.00"},
{"name":"daxos of meletis","count":1,"usd_value":"0.00"},
{"name":"dream trawler","count":1,"usd_value":"0.00"},
{"name":"deputy of detention","count":1,"usd_value":"0.00"},
{"name":"isperia, supreme judge","count":1,"usd_value":"0.00"},
{"name":"korlessa, scale singer","count":1,"usd_value":"0.00"},
{"name":"alaundo the seer","count":1,"usd_value":"0.00"},
{"name":"roalesk, apex hybrid","count":1,"usd_value":"0.00"},
{"name":"zegana, utopian speaker","count":2,"usd_value":"0.00"},
{"name":"rashmi, eternities crafter","count":1,"usd_value":"0.00"},
{"name":"slogurk, the overslime","count":1,"usd_value":"0.00"},
{"name":"shardless agent","count":1,"usd_value":"0.00"},
{"name":"dawnhart wardens","count":2,"usd_value":"0.00"},
{"name":"emmara tandris","count":1,"usd_value":"0.00"},
{"name":"tolsimir, friend to wolves","count":1,"usd_value":"0.00"},
{"name":"kyler, sigardian emissary","count":1,"usd_value":"0.00"},
{"name":"lathiel, the bounteous dawn","count":1,"usd_value":"0.00"},
{"name":"rhys the redeemed","count":1,"usd_value":"0.00"},
{"name":"katilda, dawnhart prime","count":1,"usd_value":"0.00"},
{"name":"risen sanctuary","count":1,"usd_value":"0.00"},
{"name":"duke ulder ravengard","count":1,"usd_value":"0.00"},
{"name":"spirit-sister's call","count":1,"usd_value":"0.00"},
{"name":"oath of kaya","count":2,"usd_value":"0.00"},
{"name":"invocation of saint traft","count":2,"usd_value":"0.00"},
{"name":"fevered visions","count":2,"usd_value":"0.00"},
{"name":"sultai ascendancy","count":1,"usd_value":"0.00"},
{"name":"abzan ascendancy","count":1,"usd_value":"0.00"},
{"name":"mardu ascendancy","count":1,"usd_value":"0.00"},
{"name":"agent of the iron throne","count":1,"usd_value":"0.00"},
{"name":"cultist of the absolute","count":1,"usd_value":"0.00"},
{"name":"scion of halaster","count":1,"usd_value":"0.00"},
{"name":"curse of leeches","count":1,"usd_value":"0.00"},
{"name":"phyrexian scriptures","count":1,"usd_value":"0.00"},
{"name":"daxos's torment","count":1,"usd_value":"0.00"},
{"name":"descent into madness","count":1,"usd_value":"0.00"},
{"name":"wound reflection","count":1,"usd_value":"0.00"},
{"name":"liliana's mastery","count":1,"usd_value":"0.00"},
{"name":"the meathook massacre","count":1,"usd_value":"0.00"},
{"name":"master chef","count":1,"usd_value":"0.00"},
{"name":"the dragon-kami reborn","count":2,"usd_value":"0.00"},
{"name":"predatory urge","count":1,"usd_value":"0.00"},
{"name":"oath of the ancient wood","count":1,"usd_value":"0.00"},
{"name":"aid from the cowl","count":1,"usd_value":"0.00"},
{"name":"unnatural growth","count":1,"usd_value":"0.00"},
{"name":"rites of flourishing","count":1,"usd_value":"0.00"},
{"name":"the mending of dominaria","count":1,"usd_value":"0.00"},
{"name":"abundance","count":1,"usd_value":"0.00"},
{"name":"mana reflection","count":1,"usd_value":"0.00"},
{"name":"enchantress's presence","count":1,"usd_value":"0.00"},
{"name":"collapsing borders","count":4,"usd_value":"0.00"},
{"name":"court of ire","count":1,"usd_value":"0.00"},
{"name":"sneak attack","count":1,"usd_value":"0.00"},
{"name":"ion storm","count":1,"usd_value":"0.00"},
{"name":"curse of shaken faith","count":1,"usd_value":"0.00"},
{"name":"leyline of combustion","count":1,"usd_value":"0.00"},
{"name":"blood moon","count":1,"usd_value":"0.00"},
{"name":"tavern brawler","count":1,"usd_value":"0.00"},
{"name":"popular entertainer","count":1,"usd_value":"0.00"},
{"name":"descent into avernus","count":1,"usd_value":"0.00"},
{"name":"street urchin","count":1,"usd_value":"0.00"},
{"name":"blood sun","count":1,"usd_value":"0.00"},
{"name":"domestication","count":1,"usd_value":"0.00"},
{"name":"shark typhoon","count":1,"usd_value":"0.00"},
{"name":"prism array","count":1,"usd_value":"0.00"},
{"name":"shameless charlatan","count":1,"usd_value":"0.00"},
{"name":"kindred discovery","count":1,"usd_value":"0.00"},
{"name":"curse of surveillance","count":1,"usd_value":"0.00"},
{"name":"court of cunning","count":1,"usd_value":"0.00"},
{"name":"swarm intelligence","count":1,"usd_value":"0.00"},
{"name":"legion loyalty","count":1,"usd_value":"0.00"},
{"name":"noble heritage","count":1,"usd_value":"0.00"},
{"name":"happily ever after","count":1,"usd_value":"0.00"},
{"name":"always watching","count":3,"usd_value":"0.00"},
{"name":"martial law","count":1,"usd_value":"0.00"},
{"name":"court of grace","count":1,"usd_value":"0.00"},
{"name":"together forever","count":1,"usd_value":"0.00"},
{"name":"quarantine field","count":1,"usd_value":"0.00"},
{"name":"legion's landing","count":1,"usd_value":"0.00"},
{"name":"sigarda's splendor","count":1,"usd_value":"0.00"},
{"name":"tamiyo, compleated sage","count":1,"usd_value":"0.00"},
{"name":"angrath, minotaur pirate","count":1,"usd_value":"0.00"},
{"name":"domri, anarch of bolas","count":1,"usd_value":"0.00"},
{"name":"geyadrone dihada","count":1,"usd_value":"0.00"},
{"name":"nicol bolas, dragon-god","count":1,"usd_value":"0.00"},
{"name":"kaito, shizuki","count":1,"usd_value":"0.00"},
{"name":"ugin, the ineffable","count":1,"usd_value":"0.00"},
{"name":"wrenn and seven","count":1,"usd_value":"0.00"},
{"name":"vivien, champion of the wilds","count":1,"usd_value":"0.00"},
{"name":"nissa, who shakes the world","count":2,"usd_value":"0.00"},
{"name":"sarkhan the masterless","count":2,"usd_value":"0.00"},
{"name":"jeska, thrice reborn","count":1,"usd_value":"0.00"},
{"name":"jace, architect of thought","count":1,"usd_value":"0.00"},
{"name":"anguished unmaking","count":1,"usd_value":"0.00"},
{"name":"artifact mutation","count":1,"usd_value":"0.00"},
{"name":"master warcraft","count":1,"usd_value":"0.00"},
{"name":"siphon insight","count":1,"usd_value":"0.00"},
{"name":"spinal embrace","count":1,"usd_value":"0.00"},
{"name":"dragon shift","count":1,"usd_value":"0.00"},
{"name":"firemind's foresight","count":1,"usd_value":"0.00"},
{"name":"dromoka's command","count":1,"usd_value":"0.00"},
{"name":"astarion's thirst","count":1,"usd_value":"0.00"},
{"name":"march of wretched sorrow","count":2,"usd_value":"0.00"},
{"name":"vampiric tutor","count":1,"usd_value":"0.00"},
{"name":"return of the wildspeaker","count":2,"usd_value":"0.00"},
{"name":"kamahl's will","count":1,"usd_value":"0.00"},
{"name":"curious herd","count":1,"usd_value":"0.00"},
{"name":"strength of the tajuru","count":1,"usd_value":"0.00"},
{"name":"fated intervention","count":1,"usd_value":"0.00"},
{"name":"march of burgeoning life","count":1,"usd_value":"0.00"},
{"name":"awakening of vitu-ghazi","count":1,"usd_value":"0.00"},
{"name":"once upon a time","count":1,"usd_value":"0.00"},
{"name":"faithless salvaging","count":1,"usd_value":"0.00"},
{"name":"chaos warp","count":1,"usd_value":"0.00"},
{"name":"deflecting swat","count":1,"usd_value":"0.00"},
{"name":"magmaquake","count":1,"usd_value":"0.00"},
{"name":"commune with lava","count":1,"usd_value":"0.00"},
{"name":"starstorm","count":1,"usd_value":"0.00"},
{"name":"comet storm","count":1,"usd_value":"0.00"},
{"name":"epiphany at the drownyard","count":1,"usd_value":"0.00"},
{"name":"polymorphous rush","count":1,"usd_value":"0.00"},
{"name":"engulf the shore","count":1,"usd_value":"0.00"},
{"name":"icy blast","count":1,"usd_value":"0.00"},
{"name":"decoy gambit","count":1,"usd_value":"0.00"},
{"name":"march of swirling mist","count":2,"usd_value":"0.00"},
{"name":"gale's redirection","count":1,"usd_value":"0.00"},
{"name":"march of otherworldly light","count":2,"usd_value":"0.00"},
{"name":"eerie interlude","count":1,"usd_value":"0.00"},
{"name":"ignite the beacon","count":2,"usd_value":"0.00"},
{"name":"revel in silence","count":1,"usd_value":"0.00"},
{"name":"lae'zel's acrobatics","count":1,"usd_value":"0.00"},
{"name":"time sieve","count":1,"usd_value":"0.00"},
{"name":"aetherflux reservoir","count":1,"usd_value":"0.00"},
{"name":"pyxis of pandemonium","count":1,"usd_value":"0.00"},
{"name":"chaos wand","count":2,"usd_value":"0.00"},
{"name":"corrupted grafstone","count":1,"usd_value":"0.00"},
{"name":"silent gravestone","count":1,"usd_value":"0.00"},
{"name":"tower of calamities","count":1,"usd_value":"0.00"},
{"name":"haunted plate mail","count":1,"usd_value":"0.00"},
{"name":"eye of doom","count":1,"usd_value":"0.00"},
{"name":"multiclass baldric","count":1,"usd_value":"0.00"},
{"name":"mighty servant of leuk-o","count":1,"usd_value":"0.00"},
{"name":"moss diamond","count":3,"usd_value":"0.00"},
{"name":"cloak of the bat","count":2,"usd_value":"0.00"},
{"name":"sky diamond","count":1,"usd_value":"0.00"},
{"name":"charcoal diamond","count":1,"usd_value":"0.00"},
{"name":"decanter of endless water","count":1,"usd_value":"0.00"},
{"name":"thran temporal gateway","count":1,"usd_value":"0.00"},
{"name":"stonespeaker crystal","count":1,"usd_value":"0.00"},
{"name":"seer's sundial","count":2,"usd_value":"0.00"},
{"name":"loxodon warhammer","count":1,"usd_value":"0.00"},
{"name":"vanquisher's banner","count":1,"usd_value":"0.00"},
{"name":"junkyo bell","count":1,"usd_value":"0.00"},
{"name":"helvault","count":1,"usd_value":"0.00"},
{"name":"obelisk of urd","count":1,"usd_value":"0.00"},
{"name":"blackblade reforged","count":1,"usd_value":"0.00"},
{"name":"mesmeric orb","count":1,"usd_value":"0.00"},
{"name":"ratchet bomb","count":1,"usd_value":"0.00"},
{"name":"boneyard","count":1,"usd_value":"0.00"},
{"name":"scytheclaw","count":1,"usd_value":"0.00"},
{"name":"eater of virtue","count":2,"usd_value":"0.00"},
{"name":"nevinyrral's disk","count":1,"usd_value":"0.00"},
{"name":"pithing needle","count":1,"usd_value":"0.00"},
{"name":"twinning staff","count":1,"usd_value":"0.00"},
{"name":"rings of brighthearth","count":1,"usd_value":"0.00"},
{"name":"surgehacker mech","count":1,"usd_value":"0.00"},
{"name":"conjurer's closet","count":1,"usd_value":"0.00"},
{"name":"mask of griselbrand","count":1,"usd_value":"0.00"},
{"name":"mukotai soulripper","count":1,"usd_value":"0.00"},
{"name":"whispersteel dagger","count":1,"usd_value":"0.00"},
{"name":"mizzium tank","count":1,"usd_value":"0.00"},
{"name":"lavabrink floodgates","count":1,"usd_value":"0.00"},
{"name":"silent submersible","count":1,"usd_value":"0.00"},
{"name":"parhelion II","count":1,"usd_value":"0.00"},
{"name":"kaya's wrath","count":1,"usd_value":"0.00"},
{"name":"obzedat's aid","count":1,"usd_value":"0.00"},
{"name":"revival/revenge","count":1,"usd_value":"0.00"},
{"name":"angrath's fury","count":2,"usd_value":"0.00"},
{"name":"bring to light","count":1,"usd_value":"0.00"},
{"name":"camaraderie","count":1,"usd_value":"0.00"},
{"name":"reap the past","count":1,"usd_value":"0.00"},
{"name":"dire-strain rampage","count":1,"usd_value":"0.00"},
{"name":"solar blaze","count":3,"usd_value":"0.00"},
{"name":"brightflame","count":1,"usd_value":"0.00"},
{"name":"eiganjo uprising","count":2,"usd_value":"0.00"},
{"name":"soulquake","count":1,"usd_value":"0.00"},
{"name":"casualties of war","count":1,"usd_value":"0.00"},
{"name":"role reversal","count":1,"usd_value":"0.00"},
{"name":"time wipe","count":1,"usd_value":"0.00"},
{"name":"beck/call","count":1,"usd_value":"0.00"},
{"name":"angelfire ignition","count":1,"usd_value":"0.00"},
{"name":"gruesome slaughter","count":1,"usd_value":"0.00"},
{"name":"imperial seal","count":1,"usd_value":"0.00"},
{"name":"call to the void","count":1,"usd_value":"0.00"},
{"name":"blood money","count":2,"usd_value":"0.00"},
{"name":"eldritch pact","count":1,"usd_value":"0.00"},
{"name":"the elderspell","count":2,"usd_value":"0.00"},
{"name":"scheming symmetry","count":1,"usd_value":"0.00"},
{"name":"command the dreadhorde","count":1,"usd_value":"0.00"},
{"name":"finale of eternity","count":1,"usd_value":"0.00"},
{"name":"necromantic selection","count":1,"usd_value":"0.00"},
{"name":"visions of dread","count":1,"usd_value":"0.00"},
{"name":"extinguish all hope","count":1,"usd_value":"0.00"},
{"name":"ruinous path","count":1,"usd_value":"0.00"},
{"name":"ghastly conscription","count":1,"usd_value":"0.00"},
{"name":"sever the bloodline","count":1,"usd_value":"0.00"},
{"name":"gild","count":1,"usd_value":"0.00"},
{"name":"soul transfer","count":2,"usd_value":"0.00"},
{"name":"in garruk's wake","count":1,"usd_value":"0.00"},
{"name":"nylea's intervention","count":1,"usd_value":"0.00"},
{"name":"nissa's renewal","count":1,"usd_value":"0.00"},
{"name":"finale of devastation","count":1,"usd_value":"0.00"},
{"name":"traverse the outlands","count":1,"usd_value":"0.00"},
{"name":"adventurous impulse","count":1,"usd_value":"0.00"},
{"name":"cultivate","count":1,"usd_value":"0.00"},
{"name":"storm the festival","count":1,"usd_value":"0.00"},
{"name":"invoke the ancients","count":1,"usd_value":"0.00"},
{"name":"nissa's renewal","count":1,"usd_value":"0.00"},
{"name":"predatory rampage","count":1,"usd_value":"0.00"},
{"name":"rolling earthquake","count":1,"usd_value":"0.00"},
{"name":"howl of the horde","count":1,"usd_value":"0.00"},
{"name":"visions of ruin","count":1,"usd_value":"0.00"},
{"name":"irencrag feat","count":1,"usd_value":"0.00"},
{"name":"repeating barrage","count":1,"usd_value":"0.00"},
{"name":"alpha brawl","count":1,"usd_value":"0.00"},
{"name":"crater's claws","count":1,"usd_value":"0.00"},
{"name":"mindblaze","count":1,"usd_value":"0.00"},
{"name":"radiant flames","count":1,"usd_value":"0.00"},
{"name":"trade secrets","count":1,"usd_value":"0.00"},
{"name":"fractured sanity","count":1,"usd_value":"0.00"},
{"name":"notorious throng","count":1,"usd_value":"0.00"},
{"name":"reshape","count":1,"usd_value":"0.00"},
{"name":"river's rebuke","count":1,"usd_value":"0.00"},
{"name":"stolen identity","count":1,"usd_value":"0.00"},
{"name":"sakashima's will","count":1,"usd_value":"0.00"},
{"name":"sculpted sunburst","count":1,"usd_value":"0.00"},
{"name":"council's judgment","count":1,"usd_value":"0.00"},
{"name":"farewell","count":1,"usd_value":"0.00"},
{"name":"gideon's battle cry","count":2,"usd_value":"0.00"},
{"name":"planar outburst","count":2,"usd_value":"0.00"},
{"name":"single combat","count":1,"usd_value":"0.00"},
{"name":"ravnica at war","count":1,"usd_value":"0.00"},
{"name":"fumigate","count":1,"usd_value":"0.00"},
{"name":"citywide bust","count":1,"usd_value":"0.00"}