diff --git a/Anchor.toml b/Anchor.toml index dbaa023761..3022364263 100644 --- a/Anchor.toml +++ b/Anchor.toml @@ -1,3 +1,6 @@ +[toolchain] +anchor_version = "0.29.0" + [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/Cargo.lock b/Cargo.lock index 10989da811..3197415864 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" @@ -40,11 +55,11 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.9", + "getrandom 0.2.16", "once_cell", "version_check", ] @@ -56,17 +71,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", - "getrandom 0.2.9", + "getrandom 0.2.16", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] name = "aho-corasick" -version = "0.7.18" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -86,7 +101,7 @@ dependencies = [ "anchor-syn", "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -96,10 +111,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f2a3e1df4685f18d12a943a9f2a7456305401af21a07c9fe076ef9ecd6e400" dependencies = [ "anchor-syn", - "bs58 0.5.0", + "bs58 0.5.1", "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -110,7 +125,7 @@ checksum = "9423945cb55627f0b30903288e78baf6f62c6c8ab28fb344b6b25f1ffee3dca7" dependencies = [ "anchor-syn", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -121,7 +136,7 @@ checksum = "93ed12720033cc3c3bf3cfa293349c2275cd5ab99936e33dd4bf283aaad3e241" dependencies = [ "anchor-syn", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -133,7 +148,7 @@ dependencies = [ "anchor-syn", "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -144,7 +159,7 @@ checksum = "b18c4f191331e078d4a6a080954d1576241c29c56638783322a18d308ab27e4f" dependencies = [ "anchor-syn", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -155,7 +170,7 @@ checksum = "5de10d6e9620d3bcea56c56151cad83c5992f50d5960b3a9bebc4a50390ddc3c" dependencies = [ "anchor-syn", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -168,7 +183,7 @@ dependencies = [ "borsh-derive-internal 0.10.3", "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -179,7 +194,7 @@ checksum = "1ecc31d19fa54840e74b7a979d44bcea49d70459de846088a1d71e87ba53c419" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -198,11 +213,11 @@ dependencies = [ "anchor-derive-serde", "anchor-derive-space", "arrayref", - "base64 0.13.0", + "base64 0.13.1", "bincode", "borsh 0.10.3", "bytemuck", - "getrandom 0.2.9", + "getrandom 0.2.16", "solana-program", "thiserror", ] @@ -227,22 +242,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9101b84702fed2ea57bd22992f75065da5648017135b844283a2f6d74f27825" dependencies = [ "anyhow", - "bs58 0.5.0", + "bs58 0.5.1", "heck", "proc-macro2", "quote", "serde", "serde_json", - "sha2 0.10.8", - "syn 1.0.92", + "sha2 0.10.9", + "syn 1.0.109", "thiserror", ] [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +dependencies = [ + "backtrace", +] [[package]] name = "ark-bn254" @@ -288,7 +306,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version", "zeroize", ] @@ -299,7 +317,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -312,7 +330,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -348,7 +366,7 @@ checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -369,15 +387,15 @@ checksum = "9ad284aeb45c13f2fb4f084de4a420ebf447423bdf9386c0540ce33cb3ef4b8c" [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "assert_matches" @@ -398,9 +416,24 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] [[package]] name = "base64" @@ -410,9 +443,9 @@ checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" @@ -435,6 +468,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + [[package]] name = "bitmaps" version = "2.1.0" @@ -458,9 +497,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", @@ -517,11 +556,11 @@ dependencies = [ [[package]] name = "borsh" -version = "1.1.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e3f7359eeed8d454c38bbb25eb89d98b888b1060bbfeed2cda71cb013ff2dc2" +checksum = "f5327f6c99920069d1fe374aa743be1af0031dea9f250852cdf1ae6a0861ee24" dependencies = [ - "borsh-derive 1.1.1", + "borsh-derive 1.5.2", "cfg_aliases", ] @@ -535,7 +574,7 @@ dependencies = [ "borsh-schema-derive-internal 0.9.3", "proc-macro-crate 0.1.5", "proc-macro2", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -548,21 +587,20 @@ dependencies = [ "borsh-schema-derive-internal 0.10.3", "proc-macro-crate 0.1.5", "proc-macro2", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] name = "borsh-derive" -version = "1.1.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "318d18ba283f9aa5bfef1405996ce66c584127f401be1403729ec88b10adc772" +checksum = "10aedd8f1a81a8aafbfde924b0e3061cd6fedd6f6bbcfc6a76e6fd426d7bfe26" dependencies = [ "once_cell", - "proc-macro-crate 1.2.1", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.48", - "syn_derive", + "syn 2.0.58", ] [[package]] @@ -573,7 +611,7 @@ checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -584,7 +622,7 @@ checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -595,7 +633,7 @@ checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -606,7 +644,7 @@ checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -617,18 +655,18 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "tinyvec", ] [[package]] name = "bumpalo" -version = "3.9.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bv" @@ -642,9 +680,9 @@ dependencies = [ [[package]] name = "bytecheck" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -659,68 +697,70 @@ checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.4.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.2.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b3de4a0c5e67e16066a0715723abd91edc2f9001d09c46e1dca929351e130e" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.0.83" +version = "1.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ + "find-msvc-tools", "jobserver", "libc", + "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.30" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ "num-traits", ] @@ -756,9 +796,9 @@ dependencies = [ [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "convert_case" @@ -768,69 +808,49 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" -version = "0.8.2" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.10" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset 0.6.5", - "once_cell", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.11" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" -dependencies = [ - "cfg-if", - "once_cell", -] +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", @@ -871,9 +891,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -881,27 +901,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -918,20 +938,20 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", - "syn 2.0.48", + "rustc_version", + "syn 2.0.58", ] [[package]] @@ -962,7 +982,7 @@ dependencies = [ "anchor-lang", "anchor-spl", "arrayref", - "base64 0.13.0", + "base64 0.13.1", "borsh 0.10.3", "bytemuck", "byteorder", @@ -996,7 +1016,7 @@ version = "0.1.0" source = "git+https://github.com/drift-labs/drift-macros.git?rev=c57d87#c57d87e073d13d43f4d1fb09fe6822915a4ccc11" dependencies = [ "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -1031,14 +1051,14 @@ dependencies = [ "derivation-path", "ed25519-dalek", "hmac 0.12.1", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] name = "either" -version = "1.8.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "ellipsis-macros" @@ -1051,7 +1071,7 @@ dependencies = [ "quote", "rustversion", "solana-program", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -1071,7 +1091,7 @@ checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -1087,6 +1107,12 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "fast-math" version = "0.1.1" @@ -1096,6 +1122,16 @@ dependencies = [ "ieee754", ] +[[package]] +name = "faster-hex" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7223ae2d2f179b803433d9c830478527e92b8117eab39460edae7f1614d9fb73" +dependencies = [ + "heapless", + "serde", +] + [[package]] name = "feature-probe" version = "0.1.1" @@ -1104,14 +1140,20 @@ checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" [[package]] name = "field-offset" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.6.5", - "rustc_version 0.3.3", + "memoffset", + "rustc_version", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "fnv" version = "1.0.7" @@ -1150,24 +1192,51 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.8", ] [[package]] @@ -1176,7 +1245,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.8", ] [[package]] @@ -1188,20 +1257,36 @@ dependencies = [ "ahash 0.8.6", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + [[package]] name = "heck" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" dependencies = [ "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] @@ -1247,9 +1332,9 @@ dependencies = [ [[package]] name = "humantime" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "ident_case" @@ -1279,6 +1364,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", +] + [[package]] name = "itertools" version = "0.9.0" @@ -1308,39 +1403,44 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.67" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "keccak" -version = "0.1.0" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lib-sokoban" @@ -1356,9 +1456,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.152" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libsecp256k1" @@ -1410,27 +1510,24 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ "scopeguard", ] [[package]] name = "log" -version = "0.4.17" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "memchr" -version = "2.4.0" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" @@ -1443,18 +1540,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -1471,11 +1559,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + [[package]] name = "num" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -1487,20 +1584,19 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] @@ -1513,35 +1609,34 @@ checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] name = "num-derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -1550,11 +1645,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -1562,23 +1656,13 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_enum" version = "0.5.9" @@ -1599,11 +1683,12 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" dependencies = [ - "num_enum_derive 0.7.2", + "num_enum_derive 0.7.4", + "rustversion", ] [[package]] @@ -1612,10 +1697,10 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "proc-macro-crate 1.2.1", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -1624,40 +1709,50 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ - "proc-macro-crate 1.2.1", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "num_enum_derive" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ - "proc-macro-crate 1.2.1", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openbook-v2-light" version = "0.1.0" dependencies = [ + "ahash 0.8.6", "anchor-lang", "borsh 0.10.3", "bytemuck", @@ -1665,9 +1760,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1675,22 +1770,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.3" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-link", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" @@ -1712,18 +1807,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phoenix-v1" @@ -1759,9 +1845,12 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.10" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.27", +] [[package]] name = "proc-macro-crate" @@ -1774,36 +1863,21 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.2.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "thiserror", - "toml", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "version_check", + "toml_edit 0.19.15", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-crate" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "toml_edit 0.23.4", ] [[package]] @@ -1832,13 +1906,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] name = "pyth" version = "0.1.0" dependencies = [ + "ahash 0.8.6", "anchor-lang", "arrayref", "bytemuck", @@ -1900,9 +1975,9 @@ dependencies = [ "fast-math", "hex", "proc-macro2", - "rustc_version 0.4.0", + "rustc_version", "serde", - "sha3 0.10.4", + "sha3 0.10.8", "slow_primes", "solana-program", "thiserror", @@ -1919,13 +1994,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "radium" version = "0.7.0" @@ -1991,7 +2072,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.9", + "getrandom 0.2.16", ] [[package]] @@ -2014,42 +2095,50 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.3" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ - "autocfg", - "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.3" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.9.4", ] [[package]] name = "regex" -version = "1.5.4" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a52d8d02cacdb176ef4678de6c052efb4b3da14b78e4db683a4252762be5433" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "722166aa0d7438abbaa4d5cc2c649dac844e8c56d82fb3d33e9c34b5cd268fc6" dependencies = [ "aho-corasick", "memchr", @@ -2058,9 +2147,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "c3160422bbd54dd5ecfdca71e5fd59b7b8fe2b1697ab2baf64f6d05dcc66d298" [[package]] name = "rend" @@ -2073,12 +2162,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.42" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" dependencies = [ "bitvec", "bytecheck", + "bytes", "hashbrown 0.12.3", "ptr_meta", "rend", @@ -2096,17 +2186,17 @@ checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ "proc-macro2", "quote", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] name = "rust_decimal" -version = "1.36.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" +checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0" dependencies = [ "arrayvec", - "borsh 1.1.1", + "borsh 1.5.2", "bytes", "num-traits", "rand 0.8.5", @@ -2116,52 +2206,49 @@ dependencies = [ ] [[package]] -name = "rustc-hash" -version = "1.1.0" +name = "rustc-demangle" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] -name = "rustc_version" -version = "0.3.3" +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.18", + "semver", ] [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safe-transmute" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98a01dab6acf992653be49205bdd549f32f17cb2803e8eacf1560bf97259aae8" +checksum = "3944826ff8fa8093089aba3acb4ef44b9446a99a16f3bf4e74af3f77d340ab7d" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "seahash" @@ -2171,64 +2258,47 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.18" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -2252,7 +2322,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2293,9 +2363,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -2316,9 +2386,9 @@ dependencies = [ [[package]] name = "sha3" -version = "0.10.4" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaedf34ed289ea47c2b741bb72e5357a209512d67bcd4bda44359e5bf0470f56" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ "digest 0.10.7", "keccak", @@ -2343,7 +2413,7 @@ dependencies = [ "quote", "shank_macro_impl", "shank_render", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -2356,7 +2426,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 1.0.92", + "syn 1.0.109", ] [[package]] @@ -2370,6 +2440,12 @@ dependencies = [ "shank_macro_impl", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signature" version = "1.6.4" @@ -2403,9 +2479,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.8.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "solana-frozen-abi" @@ -2429,12 +2505,12 @@ dependencies = [ "memmap2", "once_cell", "rand_core 0.6.4", - "rustc_version 0.4.0", + "rustc_version", "serde", "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "solana-frozen-abi-macro", "subtle", "thiserror", @@ -2448,8 +2524,8 @@ checksum = "f516f992211a2ab70de5c367190575c97e02d156f9f1d8b76886d673f30e88a2" dependencies = [ "proc-macro2", "quote", - "rustc_version 0.4.0", - "syn 2.0.48", + "rustc_version", + "syn 2.0.58", ] [[package]] @@ -2476,7 +2552,7 @@ dependencies = [ "array-bytes", "base64 0.21.7", "bincode", - "bitflags", + "bitflags 1.3.2", "blake3", "borsh 0.10.3", "borsh 0.9.3", @@ -2487,28 +2563,28 @@ dependencies = [ "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.9", + "getrandom 0.2.16", "itertools 0.10.5", "js-sys", "lazy_static", "libc", "libsecp256k1", "log", - "memoffset 0.9.0", + "memoffset", "num-bigint", "num-derive 0.3.3", "num-traits", "parking_lot", "rand 0.7.3", "rand_chacha 0.2.2", - "rustc_version 0.4.0", + "rustc_version", "rustversion", "serde", "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.8", - "sha3 0.10.4", + "sha2 0.10.9", + "sha3 0.10.8", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-sdk-macro", @@ -2527,7 +2603,7 @@ dependencies = [ "assert_matches", "base64 0.21.7", "bincode", - "bitflags", + "bitflags 1.3.2", "borsh 0.10.3", "bs58 0.4.0", "bytemuck", @@ -2552,15 +2628,15 @@ dependencies = [ "qstring", "rand 0.7.3", "rand_chacha 0.2.2", - "rustc_version 0.4.0", + "rustc_version", "rustversion", "serde", "serde_bytes", "serde_derive", "serde_json", "serde_with", - "sha2 0.10.8", - "sha3 0.10.4", + "sha2 0.10.9", + "sha3 0.10.8", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", @@ -2581,7 +2657,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2627,7 +2703,7 @@ checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3" dependencies = [ "assert_matches", "borsh 0.10.3", - "num-derive 0.4.1", + "num-derive 0.4.2", "num-traits", "solana-program", "spl-token 4.0.0", @@ -2648,25 +2724,25 @@ dependencies = [ [[package]] name = "spl-discriminator-derive" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadbefec4f3c678215ca72bd71862697bb06b41fd77c0088902dd3203354387b" +checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "spl-discriminator-syn" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e5f2044ca42c8938d54d1255ce599c79a1ffd86b677dfab695caa20f9ffc3f2" +checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" dependencies = [ "proc-macro2", "quote", - "sha2 0.10.8", - "syn 2.0.48", + "sha2 0.10.9", + "syn 2.0.58", "thiserror", ] @@ -2698,7 +2774,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" dependencies = [ - "num-derive 0.4.1", + "num-derive 0.4.2", "num-traits", "solana-program", "spl-program-error-derive", @@ -2707,14 +2783,14 @@ dependencies = [ [[package]] name = "spl-program-error-derive" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5269c8e868da17b6552ef35a51355a017bd8e0eae269c201fef830d35fa52c" +checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" dependencies = [ "proc-macro2", "quote", - "sha2 0.10.8", - "syn 2.0.48", + "sha2 0.10.9", + "syn 2.0.58", ] [[package]] @@ -2769,9 +2845,9 @@ checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.1", + "num-derive 0.4.2", "num-traits", - "num_enum 0.7.2", + "num_enum 0.7.4", "solana-program", "solana-zk-token-sdk", "spl-memo", @@ -2826,6 +2902,12 @@ dependencies = [ "spl-program-error", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "static_assertions" version = "1.1.0" @@ -2834,9 +2916,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -2848,54 +2930,64 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" name = "switchboard" version = "0.1.0" dependencies = [ + "ahash 0.8.6", "anchor-lang", - "base64 0.13.0", + "base64 0.13.1", +] + +[[package]] +name = "switchboard-common" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351e6e0182593ab8d5c3960256b22cf684431f2d0e5f606e641a933485e24e20" +dependencies = [ + "anyhow", + "base64 0.21.7", + "bincode", + "hex", + "serde", + "serde_json", + "sha2 0.10.9", + "sha3 0.10.8", ] [[package]] name = "switchboard-on-demand" version = "0.1.0" dependencies = [ + "ahash 0.8.6", "anchor-lang", - "base64 0.13.0", + "base64 0.13.1", "bytemuck", + "faster-hex", + "rust_decimal", + "sha2 0.10.9", "solana-program", + "switchboard-common", ] [[package]] name = "syn" -version = "1.0.92" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "syn" -version = "2.0.48" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "syn_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "tap" version = "1.0.1" @@ -2904,31 +2996,31 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2952,9 +3044,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -2969,6 +3061,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" name = "token-faucet" version = "0.1.0" dependencies = [ + "ahash 0.8.6", "anchor-lang", "anchor-spl", "bytemuck", @@ -2977,30 +3070,71 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] -name = "typenum" -version = "1.15.0" +name = "toml_datetime" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" [[package]] -name = "ucd-trie" -version = "0.1.4" +name = "toml_datetime" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89570599c4fe5585de2b388aab47e99f7fa4e9238a1399f707a02e356058141c" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime 0.6.11", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7211ff1b8f0d3adae1663b7da9ffe396eabe1ca25f0b0bee42b0da29a9ddce93" +dependencies = [ + "indexmap", + "toml_datetime 0.7.0", + "toml_parser", + "winnow 0.7.13", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow 0.7.13", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "uint" -version = "0.9.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6470ab50f482bde894a037a57064480a246dbfdd5960bd65a44824693f08da5f" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" dependencies = [ "byteorder", "crunchy", @@ -3010,30 +3144,24 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" - -[[package]] -name = "unicode-xid" -version = "0.2.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "universal-hash" @@ -3045,6 +3173,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "unsize" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa7a7a734c1a5664a662ddcea0b6c9472a21da8888c957c7f1eaa09dba7a939" +dependencies = [ + "autocfg", +] + [[package]] name = "uriparse" version = "0.6.4" @@ -3057,15 +3194,19 @@ dependencies = [ [[package]] name = "uuid" -version = "1.11.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" @@ -3075,40 +3216,60 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] [[package]] name = "wasm-bindgen" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3116,28 +3277,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.57" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -3161,11 +3325,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "winapi", + "windows-sys", ] [[package]] @@ -3175,55 +3339,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" -dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" +name = "windows-link" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] -name = "windows_i686_gnu" -version = "0.36.1" +name = "windows-sys" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] [[package]] -name = "windows_i686_msvc" -version = "0.36.1" +name = "winnow" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.36.1" +name = "winnow" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "without-alloc" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e34736feff52a0b3e5680927e947a4d8fac1f0b80dc8120b080dd8de24d75e2" +checksum = "375db0478b203b950ef10d1cce23cdbe5f30c2454fd9e7673ff56656df23adbb" dependencies = [ "alloc-traits", + "unsize", ] [[package]] @@ -3237,22 +3398,42 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive 0.8.27", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ - "zerocopy-derive", + "proc-macro2", + "quote", + "syn 2.0.58", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -3272,5 +3453,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] diff --git a/Cargo.toml b/Cargo.toml index 766930deab..6129c26246 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,10 +5,12 @@ members = [ exclude = [ "deps/serum-dex" ] +resolver = "2" [profile.release] lto = "fat" codegen-units = 1 +overflow-checks = true [profile.release.build-override] opt-level = 3 diff --git a/programs/drift/Cargo.toml b/programs/drift/Cargo.toml index 7771b9c8e3..eb40e3db7c 100644 --- a/programs/drift/Cargo.toml +++ b/programs/drift/Cargo.toml @@ -18,9 +18,9 @@ default=["mainnet-beta", "no-entrypoint"] drift-rs=[] [dependencies] -anchor-lang = "0.29.0" +anchor-lang = "=0.29.0" solana-program = "1.16" -anchor-spl = "0.29.0" +anchor-spl = "=0.29.0" pyth-client = "0.2.2" pyth-lazer-solana-contract = { git = "https://github.com/drift-labs/pyth-crosschain", rev = "d790d1cb4da873a949cf33ff70349b7614b232eb", features = ["no-entrypoint"]} pythnet-sdk = { git = "https://github.com/drift-labs/pyth-crosschain", rev = "3e8a24ecd0bcf22b787313e2020f4186bb22c729"} @@ -44,7 +44,7 @@ drift-macros = { git = "https://github.com/drift-labs/drift-macros.git", rev = " switchboard = { path = "../switchboard", features = ["no-entrypoint"] } openbook-v2-light = { path = "../openbook_v2", features = ["no-entrypoint"] } ahash = "=0.8.6" -switchboard-on-demand = { path = "../switchboard-on-demand", features = ["no-entrypoint"] } +switchboard-on-demand = { path = "../switchboard-on-demand", features = ["no-entrypoint", "anchor"] } byteorder = "1.4.3" [dev-dependencies] diff --git a/programs/drift/src/instructions/admin.rs b/programs/drift/src/instructions/admin.rs index 94fe90f15f..643a40441e 100644 --- a/programs/drift/src/instructions/admin.rs +++ b/programs/drift/src/instructions/admin.rs @@ -51,8 +51,8 @@ use crate::state::insurance_fund_stake::ProtocolIfSharesTransferConfig; use crate::state::oracle::get_sb_on_demand_price; use crate::state::oracle::{ get_oracle_price, get_prelaunch_price, get_pyth_price, get_switchboard_price, - HistoricalIndexData, HistoricalOracleData, OraclePriceData, OracleSource, PrelaunchOracle, - PrelaunchOracleParams, + get_switchboard_surge_price, HistoricalIndexData, HistoricalOracleData, OraclePriceData, + OracleSource, PrelaunchOracle, PrelaunchOracleParams, }; use crate::state::oracle_map::OracleMap; use crate::state::paused_operations::{InsuranceFundOperation, PerpOperation, SpotOperation}; @@ -909,6 +909,15 @@ pub fn handle_initialize_perp_market( )?; (oracle_price, oracle_delay, QUOTE_PRECISION_I64) } + OracleSource::SwitchboardSurge => { + let OraclePriceData { + price: oracle_price, + delay: oracle_delay, + .. + } = get_switchboard_surge_price(&ctx.accounts.oracle, clock_slot)?; + + (oracle_price, oracle_delay, oracle_price) + } }; validate_margin( diff --git a/programs/drift/src/state/oracle.rs b/programs/drift/src/state/oracle.rs index 3becf945f6..19728304a2 100644 --- a/programs/drift/src/state/oracle.rs +++ b/programs/drift/src/state/oracle.rs @@ -8,7 +8,7 @@ use crate::math::constants::{ }; use crate::math::safe_math::SafeMath; use switchboard::{AggregatorAccountData, SwitchboardDecimal}; -use switchboard_on_demand::{PullFeedAccountData, SB_ON_DEMAND_PRECISION}; +use switchboard_on_demand::{PullFeedAccountData, SB_ON_DEMAND_PRECISION, SwitchboardQuote}; use crate::error::ErrorCode::{InvalidOracle, UnableToLoadOracle}; use crate::math::oracle::{is_oracle_valid_for_action, DriftAction, OracleValidity}; @@ -132,6 +132,7 @@ pub enum OracleSource { PythLazer1K, PythLazer1M, PythLazerStableCoin, + SwitchboardSurge, } impl OracleSource { @@ -345,6 +346,7 @@ pub fn get_oracle_price( OracleSource::PythLazerStableCoin => { get_pyth_stable_coin_price(price_oracle, clock_slot, oracle_source) } + OracleSource::SwitchboardSurge => get_switchboard_surge_price(price_oracle, clock_slot), } } @@ -545,6 +547,51 @@ pub fn get_sb_on_demand_price( }) } +pub fn get_switchboard_surge_price( + price_oracle: &AccountInfo, + clock_slot: u64, +) -> DriftResult { + let data = price_oracle.try_borrow_data().or(Err(ErrorCode::UnableToLoadOracle))?; + let quote_data = SwitchboardQuote::try_deserialize(&mut &data[..]) + .or(Err(ErrorCode::UnableToLoadOracle))?; + + // Get feeds from the quote + let feeds = quote_data.feeds_slice(); + + validate!( + !feeds.is_empty(), + ErrorCode::InvalidOracle, + "SwitchboardQuote has no feeds" + )?; + + // Use the first feed's price + let first_feed_price = feeds[0].feed_value(); + + // Convert from i128 with PRECISION=18 to PRICE_PRECISION + let switchboard_precision = 10_u128.pow(SB_ON_DEMAND_PRECISION); + let price = first_feed_price + .safe_div((switchboard_precision / PRICE_PRECISION) as i128)? + .cast::()?; + + // Calculate confidence as a percentage of the price (e.g., 0.1% = 10 bps) + // This is a conservative estimate since we don't have explicit confidence data + let confidence = price.unsigned_abs().safe_div(1000)?; // 0.1% of price + + // Calculate delay based on the slot from the quote + let delay = clock_slot.cast::()?.safe_sub(quote_data.slot.cast()?)?; + + // Assume sufficient data points since the quote has been verified + let has_sufficient_number_of_data_points = true; + + Ok(OraclePriceData { + price, + confidence, + delay, + has_sufficient_number_of_data_points, + sequence_id: None, + }) +} + /// Given a decimal number represented as a mantissa (the digits) plus an /// original_precision (10.pow(some number of decimals)), scale the /// mantissa/digits to make sense with a new_precision. @@ -566,11 +613,7 @@ fn convert_switchboard_decimal(switchboard_decimal: &SwitchboardDecimal) -> Drif /// mantissa/digits to make sense with a new_precision. fn convert_sb_i128(switchboard_i128: &i128) -> DriftResult { let switchboard_precision = 10_u128.pow(SB_ON_DEMAND_PRECISION); - if switchboard_precision > PRICE_PRECISION { - switchboard_i128.safe_div((switchboard_precision / PRICE_PRECISION) as i128) - } else { - switchboard_i128.safe_mul((PRICE_PRECISION / switchboard_precision) as i128) - } + switchboard_i128.safe_div((switchboard_precision / PRICE_PRECISION) as i128) } pub fn get_prelaunch_price(price_oracle: &AccountInfo, slot: u64) -> DriftResult { diff --git a/programs/drift/src/state/perp_market.rs b/programs/drift/src/state/perp_market.rs index 815fa83fc2..4da196beac 100644 --- a/programs/drift/src/state/perp_market.rs +++ b/programs/drift/src/state/perp_market.rs @@ -31,8 +31,8 @@ use crate::math::stats; use num_integer::Roots; use crate::state::oracle::{ - get_prelaunch_price, get_sb_on_demand_price, get_switchboard_price, HistoricalOracleData, - MMOraclePriceData, OraclePriceData, OracleSource, + get_prelaunch_price, get_sb_on_demand_price, get_switchboard_price, get_switchboard_surge_price, + HistoricalOracleData, MMOraclePriceData, OraclePriceData, OracleSource, }; use crate::state::spot_market::{AssetTier, SpotBalance, SpotBalanceType}; use crate::state::traits::{MarketIndexOffset, Size}; @@ -1496,6 +1496,9 @@ impl AMM { OracleSource::PythLazerStableCoin => Ok(Some( self.get_pyth_twap(price_oracle, &OracleSource::PythLazerStableCoin)?, )), + OracleSource::SwitchboardSurge => { + Ok(Some(get_switchboard_surge_price(price_oracle, slot)?.price)) + } } } diff --git a/programs/openbook_v2/Cargo.toml b/programs/openbook_v2/Cargo.toml index 7a7360a4f3..cd6c202303 100644 --- a/programs/openbook_v2/Cargo.toml +++ b/programs/openbook_v2/Cargo.toml @@ -20,4 +20,5 @@ cpi = ["no-entrypoint"] [dependencies] anchor-lang = { version = "0.29.0", features = ["derive"] } borsh = {version = "0.10.3", features = ["const-generics", "default"]} -bytemuck = { version = "1.4.0" , features = ["derive", "min_const_generics"]} \ No newline at end of file +bytemuck = { version = "1.4.0" , features = ["derive", "min_const_generics"]} +ahash = "=0.8.6" diff --git a/programs/pyth/Cargo.toml b/programs/pyth/Cargo.toml index 1acd07ab7f..4b42115be6 100644 --- a/programs/pyth/Cargo.toml +++ b/programs/pyth/Cargo.toml @@ -20,3 +20,4 @@ anchor-test= [] anchor-lang = "0.29.0" arrayref = "0.3.6" bytemuck = { version = "1.4.0" } +ahash = "=0.8.6" diff --git a/programs/switchboard-on-demand/.gitignore b/programs/switchboard-on-demand/.gitignore new file mode 100644 index 0000000000..c71a954be4 --- /dev/null +++ b/programs/switchboard-on-demand/.gitignore @@ -0,0 +1,3 @@ +!.env + +doc \ No newline at end of file diff --git a/programs/switchboard-on-demand/Cargo.toml b/programs/switchboard-on-demand/Cargo.toml index 0709be9058..cb090d68ad 100644 --- a/programs/switchboard-on-demand/Cargo.toml +++ b/programs/switchboard-on-demand/Cargo.toml @@ -12,13 +12,19 @@ no-entrypoint = [] no-idl = [] cpi = ["no-entrypoint"] default = ["mainnet-beta"] -mainnet-beta=[] -anchor-test= [] +mainnet-beta =[] +anchor-test = [] +anchor = [] [dependencies] -anchor-lang = "0.29.0" +anchor-lang = "=0.29.0" bytemuck = { version = "1.4.0" } solana-program = "1.16" +ahash = "=0.8.6" +switchboard-common = "0.11.6" +rust_decimal = "1.38.0" +sha2 = "0.10.9" +faster-hex = "0.10.0" [dev-dependencies] base64 = "0.13.0" diff --git a/programs/switchboard-on-demand/DOCS.md b/programs/switchboard-on-demand/DOCS.md new file mode 100644 index 0000000000..139b8929dc --- /dev/null +++ b/programs/switchboard-on-demand/DOCS.md @@ -0,0 +1,37 @@ +# Docs + +## Prerequisites + +To deploy the `switchboard-on-demand` docs site, you will need to install the Firebase CLI and connect your account. + +```bash +curl -sL https://firebase.tools | upgrade=true bash +``` + +After logging in (using `firebase login`), you will also need to make sure that your Firebase account has access to the `switchboard-docs` project: + +```bash +❯ firebase projects:list +✔ Preparing the list of your Firebase projects +┌────────────────────────┬────────────────────────┬────────────────┬──────────────────────┐ +│ Project Display Name │ Project ID │ Project Number │ Resource Location ID │ +├────────────────────────┼────────────────────────┼────────────────┼──────────────────────┤ +│ Switchboard Docs │ switchboard-docs │ 659732266249 │ [Not specified] │ +└────────────────────────┴────────────────────────┴────────────────┴──────────────────────┘ +``` + +If access is needed, contact [Mitch](mailto://mitch@switchboard.xyz) or [Jack](mailto://jack@switchboard.xyz). + +## Generate / Deploy Site + +To deploy the docs for the `switchboard-on-demand` Rust SDK, simply run the following script: + +```bash +# Generates the docs site and opens locally. +pnpm docgen --open + +# Generates the docs site and tries to deploy to Firebase. +# +# Note that you will need to be logged into the Firebase CLI (See above). +pnpm docgen:deploy +``` diff --git a/programs/switchboard-on-demand/README.md b/programs/switchboard-on-demand/README.md new file mode 100644 index 0000000000..b39f1c14bc --- /dev/null +++ b/programs/switchboard-on-demand/README.md @@ -0,0 +1,120 @@ +
+ +![Switchboard Logo](https://github.com/switchboard-xyz/core-sdk/raw/main/website/static/img/icons/switchboard/avatar.png) + +# switchboard-on-demand + +> A Rust library for seamless interaction with Switchboard Oracle accounts on the Solana blockchain. + +[![Crates.io](https://img.shields.io/crates/v/switchboard-solana.svg?style=flat-square&logo=rust)](https://crates.io/crates/switchboard-solana) +[![Discord](https://img.shields.io/discord/841525135311634443?label=Discord&logo=discord&logoColor=white&style=flat-square)](https://discord.gg/switchboardxyz) +[![Twitter Follow](https://img.shields.io/twitter/follow/switchboardxyz?style=social)](https://twitter.com/switchboardxyz) + +

+ Switchboard Documentation: docs.switchboard.xyz +
+ Rustdoc: switchboard-on-demand-rust-docs.web.app +

+ +
+ +## Overview + +`switchboard-on-demand` provides Rust developers with an efficient and easy-to-use client for integrating Solana-based oracles from Switchboard into their applications. This library empowers developers to leverage decentralized, trustless, and highly reliable oracle data for various applications, particularly in the DeFi and Web3 spaces. + +## Features + +- **On-Demand Oracle Data**: Fetch real-time, accurate, and tamper-proof data for blockchain applications. +- **Custom Oracle Creation**: Design and deploy your own oracles tailored to your specific data needs. +- **High Fidelity Financial Data**: Ideal for applications requiring precise and dependable financial data. +- **Privacy-Focused**: Operates within confidential runtimes to ensure data integrity and security. + +## Getting Started + +### Prerequisites + +Ensure you have the following installed: +- Rust (latest stable version) +- Cargo +- Solana CLI tools (if interacting directly with the Solana blockchain) + +### Installation + +Add `switchboard-on-demand` to your `Cargo.toml`: + +```toml +[dependencies] +switchboard-on-demand = "0.8.0" +``` + +### Using on chain + +```rust +use switchboard_on_demand::PullFeedAccountData; +use rust_decimal::Decimal; +use solana_program::sysvar::clock::Clock; + +pub fn solana_ix<'a>(mut ctx: Context>, params: Params) -> Result<()> { + // Parse the oracle feed account data + let feed = PullFeedAccountData::parse(ctx.accounts.sb_feed)?; + + // Configure staleness and accuracy requirements + let max_stale_slots = 100; // Maximum slots before data is considered stale + let min_samples = 5; // Minimum oracle samples required for accuracy + + // Get the verified oracle price with enhanced error handling + let price: Decimal = feed.get_value(&Clock::get()?, max_stale_slots, min_samples, true)?; + + msg!("Oracle Price: {}", price); + + Ok(()) +} +``` + +### Oracle Quote Verification + +The library includes advanced oracle quote verification functionality through the `QuoteVerifier` struct. This allows for cryptographically verified data from multiple oracles: + +```rust +use switchboard_on_demand::prelude::*; + +// Configure the verifier with required accounts +let mut verifier = QuoteVerifier::new(); +verifier + .queue(&queue_account) + .slothash_sysvar(&slothash_sysvar) + .ix_sysvar(&instructions_sysvar) + .clock_slot(clock_slot) + .max_age(150); + +// Verify the oracle quote from instruction at index 0 +let quote = verifier.verify_instruction_at(0)?; + +// Access verified feed data +for feed in quote.feeds() { + let feed_id = feed.feed_id(); + let value = feed.value(); + + msg!("Feed {}: {}", feed.hex_id(), value); +} +``` + +### Quote Program Integration + +The library now includes support for the dedicated quote program for oracle-managed updates: + +```rust +use switchboard_on_demand::{QUOTE_PROGRAM_ID, QuoteVerifier}; + +// The quote program ID is available as a constant +let quote_program = QUOTE_PROGRAM_ID; + +// Verify quotes from oracle accounts +let verified_quote = QuoteVerifier::new() + .queue(&queue_account) + .slothash_sysvar(&slothash_sysvar) + .ix_sysvar(&instructions_sysvar) + .clock_slot(clock_slot) + .max_age(150) + .verify_account(&oracle_account)?; +``` diff --git a/programs/switchboard-on-demand/firebase.json b/programs/switchboard-on-demand/firebase.json new file mode 100644 index 0000000000..1558d887cb --- /dev/null +++ b/programs/switchboard-on-demand/firebase.json @@ -0,0 +1,14 @@ +{ + "hosting": [ + { + "site": "switchboard-on-demand-rust-docs", + "public": "doc", + "rewrites": [ + { + "source": "**", + "destination": "index.html" + } + ] + } + ] +} diff --git a/programs/switchboard-on-demand/package.json b/programs/switchboard-on-demand/package.json new file mode 100644 index 0000000000..928c830f45 --- /dev/null +++ b/programs/switchboard-on-demand/package.json @@ -0,0 +1,12 @@ +{ + "name": "switchboard-on-demand-rust-docs", + "scripts": { + "docgen": "cargo doc --all-features --no-deps", + "docgen:compile": "pnpm docgen && ts-node ./scripts/compile_docs.ts", + "docgen:deploy": "pnpm docgen:compile && cd target && firebase deploy --project docs --only hosting:switchboard-on-demand-rust-docs" + }, + "dependencies": { + "@types/fs-extra": "^11.0.4", + "fs-extra": "^11.2.0" + } +} diff --git a/programs/switchboard-on-demand/rustfmt.toml b/programs/switchboard-on-demand/rustfmt.toml new file mode 100644 index 0000000000..36fb37ff95 --- /dev/null +++ b/programs/switchboard-on-demand/rustfmt.toml @@ -0,0 +1,3 @@ +reorder_imports = true +imports_granularity = "Module" +group_imports = "StdExternalCrate" diff --git a/programs/switchboard-on-demand/scripts/compile_docs.ts b/programs/switchboard-on-demand/scripts/compile_docs.ts new file mode 100644 index 0000000000..69d107df9f --- /dev/null +++ b/programs/switchboard-on-demand/scripts/compile_docs.ts @@ -0,0 +1,65 @@ +import { exec } from "child_process"; +import * as fs from "fs-extra"; +import path from "path"; + +type Replaces = { files: number }; + +async function replaceInFiles( + dir: string, + searchValue: string, + replaceValue: string +): Promise { + try { + const files = await fs.readdir(dir); + for (const file of files) { + const filePath = path.join(dir, file); + const stats = await fs.stat(filePath); + if (stats.isFile()) { + let content = await fs.readFile(filePath, "utf-8"); + content = content.replace(new RegExp(searchValue, "g"), replaceValue); + await fs.writeFile(filePath, content); + } else if (stats.isDirectory()) { + await replaceInFiles(filePath, searchValue, replaceValue); + } + } + } catch (error) { + console.error(`Error: ${error}`); + } +} + +(async () => { + // Copy docs site from ./target/doc to ./doc + const IN_DIR = path.join(__dirname, "../target/doc"); + const OUT_DIR = path.join(__dirname, "../doc"); + await fs.removeSync(OUT_DIR); + await fs.copy(IN_DIR, OUT_DIR, { overwrite: true }); + + // Remove the ../doc/crates.js file + await fs.remove(path.join(OUT_DIR, "crates.js")); + + // Find each file in ./doc/switchboard_on_demand and replace all "../static.files" with "static.files" + const SRC_DIR = path.join(OUT_DIR, "switchboard_on_demand"); + await replaceInFiles(SRC_DIR, "../static.files", "static.files"); + await replaceInFiles(SRC_DIR, "../src", "src"); + await replaceInFiles( + SRC_DIR, + "/switchboard_on_demand/index.html", + "/index.html" + ); + + // Find each file in ./doc/static.files and update search results. + const STATIC_DIR = path.join(OUT_DIR, "static.files"); + await replaceInFiles( + STATIC_DIR, + "link.href=item.href;", + `link.href=item.href.replace(/^\\.\\.\\/switchboard_on_demand\\//, '../');` + ); + + // Move contents of ./doc/switchboard_on_demand/ to ./doc + await fs.copy(SRC_DIR, OUT_DIR); + await fs.remove(SRC_DIR); + + // Need to use bash to copy over the font files. Using fs to do so was corrupting the woff2 files. + const STATIC_IN = path.join(IN_DIR, "static.files/*.woff2"); + exec(`cp ${STATIC_IN} ${STATIC_DIR}`); +})(); diff --git a/programs/switchboard-on-demand/src/account_info_compat.rs b/programs/switchboard-on-demand/src/account_info_compat.rs new file mode 100644 index 0000000000..c3717579f7 --- /dev/null +++ b/programs/switchboard-on-demand/src/account_info_compat.rs @@ -0,0 +1,110 @@ +//! Compatibility layer for different AccountInfo types +//! +//! This module provides compatibility between different AccountInfo implementations, +//! using pinocchio AccountInfo internally when the pinocchio feature is enabled, +//! otherwise falling back to anchor/solana-program AccountInfo types. + +// Use pinocchio AccountInfo when the feature is enabled for better performance +#[cfg(feature = "pinocchio")] +pub type AccountInfo = pinocchio::account_info::AccountInfo; + +// Otherwise use the appropriate AccountInfo type based on anchor feature +#[cfg(all(not(feature = "pinocchio"), feature = "anchor"))] +pub type AccountInfo<'a> = anchor_lang::prelude::AccountInfo<'a>; + +#[cfg(all(not(feature = "pinocchio"), not(feature = "anchor")))] +pub type AccountInfo<'a> = crate::solana_program::account_info::AccountInfo<'a>; + +/// Trait for types that can be converted to a reference to AccountInfo +#[cfg(feature = "pinocchio")] +pub trait AsAccountInfo<'a> { + fn as_account_info(&self) -> &AccountInfo; +} + +#[cfg(not(feature = "pinocchio"))] +pub trait AsAccountInfo<'a> { + fn as_account_info(&self) -> &AccountInfo<'a>; +} + +/// Implementation for the primary AccountInfo type +#[cfg(feature = "pinocchio")] +impl<'a> AsAccountInfo<'a> for AccountInfo { + #[inline(always)] + fn as_account_info(&self) -> &AccountInfo { + self + } +} + +#[cfg(not(feature = "pinocchio"))] +impl<'a> AsAccountInfo<'a> for AccountInfo<'a> { + #[inline(always)] + fn as_account_info(&self) -> &AccountInfo<'a> { + self + } +} + +/// Implementation for references to AccountInfo +#[cfg(feature = "pinocchio")] +impl<'a> AsAccountInfo<'a> for &AccountInfo { + #[inline(always)] + fn as_account_info(&self) -> &AccountInfo { + self + } +} + +#[cfg(not(feature = "pinocchio"))] +impl<'a> AsAccountInfo<'a> for &AccountInfo<'a> { + #[inline(always)] + fn as_account_info(&self) -> &AccountInfo<'a> { + self + } +} + +/// Helper macro to abstract field access differences between AccountInfo types +#[cfg(feature = "pinocchio")] +#[macro_export] +macro_rules! get_account_key { + ($account:expr) => { + $account.key() + }; +} + +#[cfg(not(feature = "pinocchio"))] +#[macro_export] +macro_rules! get_account_key { + ($account:expr) => { + $account.key + }; +} + +#[cfg(feature = "pinocchio")] +#[macro_export] +macro_rules! borrow_account_data { + ($account:expr) => { + $account.borrow_data_unchecked() + }; +} + +#[cfg(not(feature = "pinocchio"))] +#[macro_export] +macro_rules! borrow_account_data { + ($account:expr) => { + $account.data.borrow() + }; +} + +#[cfg(feature = "pinocchio")] +#[macro_export] +macro_rules! borrow_mut_account_data { + ($account:expr) => { + unsafe { $account.borrow_mut_data_unchecked() } + }; +} + +#[cfg(not(feature = "pinocchio"))] +#[macro_export] +macro_rules! borrow_mut_account_data { + ($account:expr) => { + $account.data.borrow_mut() + }; +} diff --git a/programs/switchboard-on-demand/src/accounts.rs b/programs/switchboard-on-demand/src/accounts.rs new file mode 100644 index 0000000000..2a208b9970 --- /dev/null +++ b/programs/switchboard-on-demand/src/accounts.rs @@ -0,0 +1 @@ +pub use crate::on_demand::accounts::*; diff --git a/programs/switchboard-on-demand/src/anchor_traits.rs b/programs/switchboard-on-demand/src/anchor_traits.rs new file mode 100644 index 0000000000..77421478a5 --- /dev/null +++ b/programs/switchboard-on-demand/src/anchor_traits.rs @@ -0,0 +1,47 @@ +use anchor_lang::prelude::borsh::BorshSerialize; +use crate::solana_program::instruction::AccountMeta; +use crate::Pubkey; + +/// Traits pulled out of anchor-lang library to remove dependency conflicts +/// for users. +pub trait Discriminator { + /// The 8-byte discriminator used to identify the account or instruction type + const DISCRIMINATOR: &'static [u8]; + + /// Returns the discriminator for this type + fn discriminator() -> &'static [u8] { + Self::DISCRIMINATOR + } +} + +/// Trait for types that have an owner program +pub trait Owner { + /// Returns the program ID that owns this account type + fn owner() -> Pubkey; +} + +/// Trait marker for zero-copy deserialization +pub trait ZeroCopy {} + +/// Trait for converting types to Solana account metas +pub trait ToAccountMetas { + /// `is_signer` is given as an optional override for the signer meta field. + /// This covers the edge case when a program-derived-address needs to relay + /// a transaction from a client to another program but sign the transaction + /// before the relay. The client cannot mark the field as a signer, and so + /// we have to override the is_signer meta field given by the client. + fn to_account_metas(&self, is_signer: Option) -> Vec; +} + +/// Calculates the data for an instruction invocation, where the data is +/// `Sha256(:)[..8] || BorshSerialize(args)`. +/// `args` is a borsh serialized struct of named fields for each argument given +/// to an instruction. +pub trait InstructionData: Discriminator + BorshSerialize { + /// Serializes the instruction data with discriminator prefix + fn data(&self) -> Vec { + let mut d = Self::DISCRIMINATOR.to_vec(); + d.append(&mut anchor_lang::prelude::borsh::to_vec(self).expect("Should always serialize")); + d + } +} diff --git a/programs/switchboard-on-demand/src/client/accounts/mod.rs b/programs/switchboard-on-demand/src/client/accounts/mod.rs new file mode 100644 index 0000000000..78f4714234 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/accounts/mod.rs @@ -0,0 +1,13 @@ +// Re-export from on_demand/accounts which have the complete definitions +pub use crate::on_demand::accounts::{ + OracleAccountData, State, StateEpochInfo, PullFeedAccountData, QueueAccountData, +}; +pub use crate::on_demand::types::Quote; + +// Client-specific extensions remain in this module +mod oracle_ext; +mod pull_feed_ext; +mod queue_ext; +mod state_ext; + +pub use queue_ext::{Queue}; // Export the Queue wrapper struct diff --git a/programs/switchboard-on-demand/src/client/accounts/oracle_ext.rs b/programs/switchboard-on-demand/src/client/accounts/oracle_ext.rs new file mode 100644 index 0000000000..a992294ad2 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/accounts/oracle_ext.rs @@ -0,0 +1,10 @@ +// Client-specific extensions for OracleAccountData +use super::super::lut_owner::LutOwner; +use crate::on_demand::accounts::OracleAccountData; + +// Client-specific trait implementation +impl LutOwner for OracleAccountData { + fn lut_slot(&self) -> u64 { + self.lut_slot + } +} diff --git a/programs/switchboard-on-demand/src/client/accounts/pull_feed_ext.rs b/programs/switchboard-on-demand/src/client/accounts/pull_feed_ext.rs new file mode 100644 index 0000000000..207b6ad5d7 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/accounts/pull_feed_ext.rs @@ -0,0 +1,10 @@ +// Client-specific extensions for PullFeedAccountData +use super::super::lut_owner::LutOwner; +use crate::on_demand::accounts::PullFeedAccountData; + +// Client-specific trait implementation +impl LutOwner for PullFeedAccountData { + fn lut_slot(&self) -> u64 { + self.lut_slot + } +} diff --git a/programs/switchboard-on-demand/src/client/accounts/queue_ext.rs b/programs/switchboard-on-demand/src/client/accounts/queue_ext.rs new file mode 100644 index 0000000000..023aae41d9 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/accounts/queue_ext.rs @@ -0,0 +1,196 @@ +// Client-specific extensions for QueueAccountData +use super::super::lut_owner::LutOwner; +use super::super::gateway::Gateway; +use super::super::crossbar::CrossbarClient; +use crate::on_demand::accounts::QueueAccountData; +use crate::RpcClient; +use crate::Pubkey; +use anyhow::{anyhow, Context}; +use anyhow::Error as AnyhowError; +use futures::future::join_all; + +// Client-specific trait implementation +impl LutOwner for QueueAccountData { + fn lut_slot(&self) -> u64 { + self.lut_slot + } +} + +impl QueueAccountData { + /// Loads queue data from on-chain + pub async fn load(client: &RpcClient, key: &Pubkey) -> Result { + let key_anchor: anchor_client::solana_sdk::pubkey::Pubkey = key.to_bytes().into(); + let account = client + .get_account_data(&key_anchor) + .await + .map_err(|_| anyhow!("QueueAccountData.load: Account not found"))?; + let buf = account[8..].to_vec(); + let parsed: &QueueAccountData = bytemuck::try_from_bytes(&buf) + .map_err(|e| anyhow!("Failed to parse QueueAccountData: {:?}", e))?; + Ok(*parsed) + } + + /// Fetches all gateways from the oracle accounts and tests them to see if they are reachable. + /// Returns a list of reachable gateways. + /// # Arguments + /// * `client` - The RPC client to use for fetching the oracle accounts. + /// # Returns + /// A list of reachable gateways. + pub async fn fetch_gateways(&self, client: &RpcClient) -> Result, AnyhowError> { + let oracles = self.fetch_oracles(client).await?; + let gateways = oracles + .into_iter() + .map(|x| x.1) + .filter_map(|x| x.gateway_uri()) + .map(Gateway::new) + .collect::>(); + + let mut test_futures = Vec::new(); + for gateway in gateways.iter() { + test_futures.push(gateway.test_gateway()); + } + let results = join_all(test_futures).await; + let mut good_gws = Vec::new(); + for (i, is_good) in results.into_iter().enumerate() { + if is_good { + good_gws.push(gateways[i].clone()); + } + } + Ok(good_gws) + } + + /// Fetches a gateway from the crossbar service + /// + /// # Arguments + /// * `crossbar` - The crossbar client to use for fetching gateways + /// + /// # Returns + /// * `Result` - A Gateway instance ready for use + pub async fn fetch_gateway_from_crossbar(&self, crossbar: &CrossbarClient) -> Result { + // Default to mainnet, but this could be made configurable + let network = "mainnet"; + + // Fetch gateways for the network + let gateways = crossbar.fetch_gateways(network).await + .context("Failed to fetch gateways from crossbar")?; + + let gateway_url = gateways + .first() + .ok_or_else(|| anyhow!("No gateways available for network: {}", network))?; + + Ok(Gateway::new(gateway_url.clone())) + } +} + +/// Higher-level Queue struct that matches the JavaScript pattern +/// +/// This struct represents a queue instance with a specific pubkey, +/// similar to the JavaScript Queue class which has a program and pubkey. +pub struct Queue { + pub pubkey: Pubkey, + pub client: RpcClient, +} + +impl Queue { + /// Default devnet queue key + pub const DEFAULT_DEVNET_KEY: &'static str = "EYiAmGSdsQTuCw413V5BzaruWuCCSDgTPtBGvLkXHbe7"; + + /// Default mainnet queue key + pub const DEFAULT_MAINNET_KEY: &'static str = "A43DyUGA7s8eXPxqEjJY6EBu1KKbNgfxF8h17VAHn13w"; + + /// Creates a new Queue instance + /// + /// # Arguments + /// * `client` - RPC client for Solana connections + /// * `pubkey` - The public key of the queue account + pub fn new(client: RpcClient, pubkey: Pubkey) -> Self { + Self { pubkey, client } + } + + /// Creates a Queue instance with the default mainnet key + /// + /// # Arguments + /// * `client` - RPC client for Solana connections + pub fn default_mainnet(client: RpcClient) -> Result { + let pubkey_str = Self::DEFAULT_MAINNET_KEY; + let bytes: [u8; 32] = bs58::decode(pubkey_str) + .into_vec() + .map_err(|e| anyhow!("Failed to decode mainnet queue key: {}", e))? + .try_into() + .map_err(|_| anyhow!("Invalid mainnet queue key length"))?; + let pubkey = Pubkey::new_from_array(bytes); + Ok(Self::new(client, pubkey)) + } + + /// Creates a Queue instance with the default devnet key + /// + /// # Arguments + /// * `client` - RPC client for Solana connections + pub fn default_devnet(client: RpcClient) -> Result { + let pubkey_str = Self::DEFAULT_DEVNET_KEY; + let bytes: [u8; 32] = bs58::decode(pubkey_str) + .into_vec() + .map_err(|e| anyhow!("Failed to decode devnet queue key: {}", e))? + .try_into() + .map_err(|_| anyhow!("Invalid devnet queue key length"))?; + let pubkey = Pubkey::new_from_array(bytes); + Ok(Self::new(client, pubkey)) + } + + /// Loads the queue data from on-chain + /// + /// # Returns + /// * `Result` - The queue account data + pub async fn load_data(&self) -> Result { + QueueAccountData::load(&self.client, &self.pubkey).await + } + + /// Fetches a gateway from the crossbar service, automatically detecting network + /// + /// This method matches the JavaScript implementation exactly: + /// 1. Tries to load data from the default mainnet queue + /// 2. If that fails, assumes devnet + /// 3. Fetches available gateways for the detected network + /// 4. Returns the first gateway + /// + /// # Arguments + /// * `crossbar` - The crossbar client to use for fetching gateways + /// + /// # Returns + /// * `Result` - A Gateway instance ready for use + /// + /// # Example + /// ```rust,no_run + /// use switchboard_on_demand::client::{CrossbarClient, Queue}; + /// use switchboard_on_demand::RpcClient; + /// + /// # async fn example() -> Result<(), Box> { + /// let client = RpcClient::new("https://api.mainnet-beta.solana.com".to_string()); + /// let queue = Queue::default_mainnet(client)?; + /// let crossbar = CrossbarClient::default(); + /// let gateway = queue.fetch_gateway_from_crossbar(&crossbar).await?; + /// # Ok(()) + /// # } + /// ``` + pub async fn fetch_gateway_from_crossbar(&self, crossbar: &CrossbarClient) -> Result { + let mut network = "mainnet"; + + // Try to load data from the default mainnet queue to detect network + let mainnet_client = RpcClient::new(self.client.url()); + let mainnet_queue = Queue::default_mainnet(mainnet_client)?; + + if mainnet_queue.load_data().await.is_err() { + network = "devnet"; + } + + // Fetch gateways for the detected network + let gateways = crossbar.fetch_gateways(network).await + .context("Failed to fetch gateways from crossbar")?; + + let gateway_url = gateways + .first() + .ok_or_else(|| anyhow!("No gateways available for network: {}", network))?; + + Ok(Gateway::new(gateway_url.clone())) + } +} diff --git a/programs/switchboard-on-demand/src/client/accounts/state_ext.rs b/programs/switchboard-on-demand/src/client/accounts/state_ext.rs new file mode 100644 index 0000000000..a1e3468d98 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/accounts/state_ext.rs @@ -0,0 +1,2 @@ +// Client-specific extensions for State +// All state definitions are in on_demand/accounts/state.rs diff --git a/programs/switchboard-on-demand/src/client/associated_token_account.rs b/programs/switchboard-on-demand/src/client/associated_token_account.rs new file mode 100644 index 0000000000..d304a6bb00 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/associated_token_account.rs @@ -0,0 +1,71 @@ +use lazy_static::lazy_static; +use crate::Pubkey; +use std::str::FromStr; + +lazy_static! { + pub static ref SPL_TOKEN_PROGRAM_ID: Pubkey = + Pubkey::from_str("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA").unwrap(); + pub static ref SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID: Pubkey = + Pubkey::from_str("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL").unwrap(); + pub static ref NATIVE_MINT: Pubkey = + Pubkey::from_str("So11111111111111111111111111111111111111112").unwrap(); +} + +pub fn get_associated_token_address_and_bump_seed( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + program_id: &Pubkey, + token_program_id: &Pubkey, +) -> (Pubkey, u8) { + get_associated_token_address_and_bump_seed_internal( + wallet_address, + token_mint_address, + program_id, + token_program_id, + ) +} + +/// Derives the associated token account address for the given wallet address +/// and token mint +pub fn get_associated_token_address( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, +) -> Pubkey { + get_associated_token_address_with_program_id( + wallet_address, + token_mint_address, + &SPL_TOKEN_PROGRAM_ID, + ) +} + +/// Derives the associated token account address for the given wallet address, +/// token mint and token program id +pub fn get_associated_token_address_with_program_id( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + token_program_id: &Pubkey, +) -> Pubkey { + get_associated_token_address_and_bump_seed( + wallet_address, + token_mint_address, + &SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + token_program_id, + ) + .0 +} + +fn get_associated_token_address_and_bump_seed_internal( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + program_id: &Pubkey, + token_program_id: &Pubkey, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + &wallet_address.to_bytes(), + &token_program_id.to_bytes(), + &token_mint_address.to_bytes(), + ], + program_id, + ) +} diff --git a/programs/switchboard-on-demand/src/client/crossbar.rs b/programs/switchboard-on-demand/src/client/crossbar.rs new file mode 100644 index 0000000000..4d25e027df --- /dev/null +++ b/programs/switchboard-on-demand/src/client/crossbar.rs @@ -0,0 +1,558 @@ +#![allow(non_snake_case)] +use anyhow::anyhow; +use anyhow::Context; +use anyhow::Error as AnyhowError; +use base58::ToBase58; +use futures::{Stream, StreamExt}; +use hex; +use reqwest::Client; +use rust_decimal::Decimal; +use serde::de::Error as DeError; +use serde::{Deserialize, Deserializer, Serialize}; +use anchor_client::solana_sdk::genesis_config::ClusterType; +use crate::Pubkey; +use switchboard_utils::utils::median; +use tokio::time::interval; +use tokio::time::Duration; +use tokio_stream::wrappers::IntervalStream; + +#[derive(Serialize, Deserialize)] +pub struct StoreResponse { + pub cid: String, + pub feedHash: String, + pub queueHex: String, +} + +#[derive(Serialize, Deserialize)] +pub struct FetchSolanaUpdatesResponse { + pub success: bool, + pub pullIx: String, + pub responses: Vec, + pub lookupTables: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct Response { + pub oracle: String, + pub result: Option, + pub errors: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SimulateSolanaFeedsResponse { + pub feed: String, + pub feedHash: String, + pub results: Vec>, + #[serde(skip_deserializing, default)] + pub result: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SimulateSuiFeedsResponse { + pub feed: String, + pub feedHash: String, + // The TS endpoint returns the results as strings. You can choose to parse them into Decimal if desired. + pub results: Vec, + // The result is already computed by the server; hence, no median calculation here. + #[serde(skip_deserializing, default)] + pub result: Option, + #[serde(default)] + pub stdev: Option, + #[serde(default)] + pub variance: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SimulateFeedsResponse { + pub feedHash: String, + pub results: Vec, + #[serde(skip_deserializing, default)] + pub result: Decimal, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SuiOracleResult { + pub successValue: String, + pub isNegative: bool, + pub timestamp: u64, + pub oracleId: String, + #[serde(serialize_with = "bytes_to_hex", deserialize_with = "hex_to_bytes")] + pub signature: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SuiFeedConfigs { + pub feedHash: String, + pub maxVariance: u64, + pub minResponses: u64, + pub minSampleSize: u64, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SuiUpdateResponse { + pub aggregator_id: Option, + pub results: Vec, + pub feedConfigs: SuiFeedConfigs, + pub queue: String, + pub fee: u64, + pub failures: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct FetchSuiUpdatesResponse { + pub responses: Vec, + pub failures: Vec, +} + +#[derive(Clone, Debug)] +pub struct CrossbarClient { + crossbar_url: String, + verbose: bool, + client: Client, +} + +fn hex_to_bytes<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let s: String = Deserialize::deserialize(deserializer)?; + hex::decode(&s).map_err(DeError::custom) +} + +fn bytes_to_hex(bytes: &Vec, serializer: S) -> Result +where + S: serde::Serializer, +{ + // Convert the byte vector into a hex string. + let hex_string = hex::encode(bytes); + serializer.serialize_str(&hex_string) +} + +fn cluster_type_to_string(cluster_type: ClusterType) -> String { + match cluster_type { + ClusterType::MainnetBeta => "mainnet-beta", + ClusterType::Testnet => "testnet", + ClusterType::Devnet => "devnet", + ClusterType::Development => "development", + } + .to_string() +} + +impl Default for CrossbarClient { + fn default() -> Self { + Self::new("https://crossbar.switchboard.xyz", false) + } +} + +impl CrossbarClient { + pub fn new(crossbar_url: &str, verbose: bool) -> Self { + Self { + crossbar_url: crossbar_url.to_string(), + verbose, + client: Client::new(), + } + } + + /// # Arguments + /// * `feed_hash` - The feed hash of the jobs it performs + /// # Returns + /// * `Result` - The response from the crossbar gateway, + /// containing the json formatted oracle jobs + pub async fn fetch(&self, feed_hash: &str) -> Result { + let url = format!("{}/fetch/{}", self.crossbar_url, feed_hash); + let resp = self + .client + .get(&url) + .send() + .await + .context("Failed to send fetch request")?; + + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!("{}", resp.text().await.context("Failed to fetch response")?); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + resp.json().await.context("Failed to parse response") + } + + /// Store feed jobs in the crossbar gateway to a pinned IPFS address + pub async fn store( + &self, + queue_address: Pubkey, + jobs: &[serde_json::Value], + ) -> Result { + let queue = bs58::decode(queue_address.to_string()) + .into_vec() + .context("Failed to decode queue address")?; + let queue_hex = queue.to_base58(); + let payload = serde_json::json!({ "queue": queue_hex, "jobs": jobs }); + + let url = format!("{}/store", self.crossbar_url); + let resp = self + .client + .post(&url) + .json(&payload) + .header("Content-Type", "application/json") + .send() + .await + .context("Failed to send store request")?; + + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!( + "{}: {}", + status, + resp.text().await.context("Failed to fetch response")? + ); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + resp.json().await.context("Failed to parse response") + } + + pub async fn fetch_solana_updates( + &self, + network: ClusterType, + feed_pubkeys: &[Pubkey], + num_signatures: Option, + ) -> Result, AnyhowError> { + if feed_pubkeys.is_empty() { + return Err(anyhow!("Feed pubkeys are empty")); + } + + let feeds_param: Vec<_> = feed_pubkeys.iter().map(|x| x.to_string()).collect(); + let feeds_param = feeds_param.join(","); + let network = cluster_type_to_string(network); + let mut url = format!( + "{}/updates/solana/{}/{}", + self.crossbar_url, network, feeds_param + ); + if let Some(num_signatures) = num_signatures { + url.push_str(&format!("?numSignatures={}", num_signatures)); + } + + let resp = self.client.get(&url).send().await?; + + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!( + "{}: {}", + status, + resp.text().await.context("Failed to fetch response")? + ); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + resp.json().await.context("Failed to parse response") + } + + /// Simulate feed responses from the crossbar gateway for Solana feeds. + /// In addition to deserializing the JSON, compute the median for each response + /// and store it in the `result` field as an Option. + pub async fn simulate_solana_feeds( + &self, + network: ClusterType, + feed_pubkeys: &[Pubkey], + ) -> Result, AnyhowError> { + if feed_pubkeys.is_empty() { + return Err(anyhow!("Feed pubkeys are empty")); + } + + let feeds_param: Vec<_> = feed_pubkeys.iter().map(|x| x.to_string()).collect(); + let feeds_param = feeds_param.join(","); + let network = cluster_type_to_string(network); + let url = format!( + "{}/simulate/solana/{}/{}", + self.crossbar_url, network, feeds_param + ); + let resp = self.client.get(&url).send().await?; + + let status = resp.status(); + let raw = resp.text().await.context("Failed to fetch response")?; + if !status.is_success() { + if self.verbose { + eprintln!("{}: {}", status, raw); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + let mut responses: Vec = serde_json::from_str(&raw)?; + // Compute the median result for each response + for response in responses.iter_mut() { + // Collect non-None decimals + let valid: Vec = response.results.iter().filter_map(|x| *x).collect(); + response.result = if valid.is_empty() { + None + } else { + Some(median(valid).expect("Failed to compute median")) + }; + } + Ok(responses) + } + + /// Simulate feed responses from the crossbar gateway. + /// In addition to deserializing the JSON, compute the median for each response + /// and store it in the `result` field. + pub async fn simulate_feeds( + &self, + feed_hashes: &[&str], + ) -> Result, AnyhowError> { + if feed_hashes.is_empty() { + return Err(anyhow!("Feed hashes are empty")); + } + + let feeds_param = feed_hashes.join(","); + let url = format!("{}/simulate/{}", self.crossbar_url, feeds_param); + let resp = self + .client + .get(&url) + .send() + .await + .context("Failed to send simulate feeds request")?; + + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!( + "{}: {}", + status, + resp.text().await.context("Failed to fetch response")? + ); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + let mut responses: Vec = + resp.json().await.context("Failed to parse response")?; + // Compute the median result for each response + for response in responses.iter_mut() { + response.result = median(response.results.clone()).expect("Failed to compute median"); + } + Ok(responses) + } + + /// Fetch the Sui feed update from the crossbar gateway. + /// + /// # Arguments + /// * `network` - The Sui network identifier (e.g., "mainnet", "testnet") + /// * `aggregator_addresses` - A slice of aggregator address strings. + /// + /// # Returns + /// * `Result` - The response containing Sui feed update data. + pub async fn fetch_sui_updates( + &self, + network: &str, + aggregator_addresses: &[&str], + ) -> Result { + if aggregator_addresses.is_empty() { + return Err(anyhow!("Aggregator addresses are empty")); + } + let feeds_param = aggregator_addresses.join(","); + let url = format!( + "{}/updates/sui/{}/{}", + self.crossbar_url, network, feeds_param + ); + let resp = self + .client + .get(&url) + .send() + .await + .context("Failed to send fetch Sui updates request")?; + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!( + "{}: {}", + status, + resp.text().await.context("Failed to fetch response text")? + ); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + let mut update_response: FetchSuiUpdatesResponse = resp + .json() + .await + .context("Failed to parse fetch Sui updates response")?; + + // If the server did not include aggregator_id or it is empty, + // and if the number of responses matches the number of aggregator_addresses, + // we assign the aggregator addresses to the corresponding responses. + if update_response.responses.len() == aggregator_addresses.len() { + for (resp_item, &agg_id) in update_response + .responses + .iter_mut() + .zip(aggregator_addresses) + { + if resp_item.aggregator_id.is_none() + || resp_item.aggregator_id.as_ref().unwrap().is_empty() + { + resp_item.aggregator_id = Some(agg_id.to_string()); + } + } + } + Ok(update_response) + } + + /// Simulate feed responses for Sui from the crossbar gateway. + /// + /// # Arguments + /// * `network` - The Sui network identifier (e.g. "mainnet", "testnet") + /// * `feed_ids` - The list of feed ids as string slices. + /// + /// # Returns + /// * `Result, AnyhowError>` - The current simulated results for the requested feeds. + pub async fn simulate_sui_feeds( + &self, + network: &str, + feed_ids: &[&str], + ) -> Result, AnyhowError> { + if feed_ids.is_empty() { + return Err(anyhow!("Feed ids are empty")); + } + let feeds_param = feed_ids.join(","); + let url = format!( + "{}/simulate/sui/{}/{}", + self.crossbar_url, network, feeds_param + ); + let resp = self + .client + .get(&url) + .send() + .await + .context("Failed to send simulate sui feeds request")?; + let status = resp.status(); + let raw = resp + .text() + .await + .context("Failed to fetch response for simulate sui feeds")?; + if !status.is_success() { + if self.verbose { + eprintln!("{}: {}", status, raw); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + // Parse the response. We assume the TS server returns JSON matching SimulateSuiFeedsResponse. + let responses: Vec = + serde_json::from_str(&raw).context("Failed to parse simulate sui feeds response")?; + Ok(responses) + } + + /// Stream the simulation of feed responses from the crossbar gateway. + pub fn stream_simulate_feeds<'a>( + &'a self, + feed_hashes: Vec<&'a str>, + poll_interval: Duration, + ) -> impl Stream, AnyhowError>> + 'a { + // Create an interval timer stream. + let interval_stream = IntervalStream::new(interval(poll_interval)); + let feed_hashes = feed_hashes.clone(); + // For each tick, call the simulate_feeds function. + interval_stream.then(move |_| { + let feed_hashes = feed_hashes.clone(); + async move { self.simulate_feeds(&feed_hashes).await } + }) + } + + /// Stream the simulation of feed responses from the crossbar gateway for Solana feeds. + pub fn stream_simulate_solana_feeds<'a>( + &'a self, + network: anchor_client::solana_sdk::genesis_config::ClusterType, + feed_pubkeys: &'a [Pubkey], + poll_interval: Duration, + ) -> impl Stream, AnyhowError>> + 'a { + let interval_stream = IntervalStream::new(interval(poll_interval)); + interval_stream.then(move |_| { + let network = network; + async move { self.simulate_solana_feeds(network, feed_pubkeys).await } + }) + } + + /// Stream the simulation of Sui feed responses from the crossbar gateway. + pub fn stream_simulate_sui_feeds<'a>( + &'a self, + network: &'a str, + feed_ids: Vec<&'a str>, + poll_interval: Duration, + ) -> impl Stream, AnyhowError>> + 'a { + let interval_stream = IntervalStream::new(interval(poll_interval)); + interval_stream.then(move |_| { + let feed_ids = feed_ids.clone(); + async move { self.simulate_sui_feeds(network, &feed_ids).await } + }) + } + + /// Stream the Sui feed update responses from the crossbar gateway. + /// + /// # Arguments + /// * `network` - The Sui network identifier (e.g., "mainnet", "testnet") + /// * `aggregator_addresses` - A vector of aggregator address strings. + /// * `poll_interval` - The polling interval for updates. + /// + /// # Returns + /// * `impl Stream>` + /// - A stream of Sui update responses. + pub fn stream_sui_updates<'a>( + &'a self, + network: &'a str, + aggregator_addresses: Vec<&'a str>, + poll_interval: Duration, + ) -> impl Stream> + 'a { + let interval_stream = IntervalStream::new(interval(poll_interval)); + interval_stream.then(move |_| { + let aggregator_addresses = aggregator_addresses.clone(); + async move { self.fetch_sui_updates(network, &aggregator_addresses).await } + }) + } + + /// Fetches gateway URLs from the crossbar service for a specific network + /// + /// # Arguments + /// * `network` - The network to fetch gateways for ("mainnet" or "devnet") + /// + /// # Returns + /// * `Result, AnyhowError>` - A vector of gateway URLs + pub async fn fetch_gateways(&self, network: &str) -> Result, AnyhowError> { + let url = format!("{}/gateways?network={}", self.crossbar_url, network); + let resp = self + .client + .get(&url) + .send() + .await + .context("Failed to send fetch gateways request")?; + + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!("{}: {}", status, resp.text().await.context("Failed to fetch response")?); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + resp.json().await.context("Failed to parse gateways response") + } + +} + +#[cfg(test)] +mod tests { + use super::*; + use std::str::FromStr; + + #[tokio::test] + async fn test_crossbar_client_default_initialization() { + let key = Pubkey::from_str("D1MmZ3je8GCjLrTbWXotnZ797k6E56QkdyXyhPXZQocH").unwrap(); + let client = CrossbarClient::default(); + let resp = client + .simulate_solana_feeds(ClusterType::MainnetBeta, &[key]) + .await + .unwrap(); + println!("{:?}", resp); + } +} diff --git a/programs/switchboard-on-demand/src/client/gateway.rs b/programs/switchboard-on-demand/src/client/gateway.rs new file mode 100644 index 0000000000..e2bd444d8f --- /dev/null +++ b/programs/switchboard-on-demand/src/client/gateway.rs @@ -0,0 +1,415 @@ +use super::oracle_job::OracleJob; +use base64::prelude::*; +use prost::Message; +use reqwest::header::CONTENT_TYPE; +use reqwest::Client; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use std::time::Duration; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MedianResponse { + pub value: String, + pub feed_hash: String, +} + +/// Parameters for the consensus route. +#[derive(Debug, Clone)] +pub struct FetchSignaturesConsensusParams { + pub recent_hash: Option, + pub feed_configs: Vec, // Your existing FeedConfig struct + pub use_timestamp: Option, + pub num_signatures: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct FetchSignaturesConsensusResponse { + pub median_responses: Vec, + pub oracle_responses: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ConsensusOracleResponse { + pub oracle_pubkey: String, + pub eth_address: String, + pub signature: String, + pub checksum: String, + pub recovery_id: i32, + pub feed_responses: Vec, + pub errors: Vec>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct FeedEvalResponse { + pub oracle_pubkey: String, + pub queue_pubkey: String, + pub oracle_signing_pubkey: String, + pub feed_hash: String, + pub recent_hash: String, + pub failure_error: String, + pub success_value: String, + pub msg: String, + pub signature: String, + pub recovery_id: i32, + pub recent_successes_if_failed: Vec, + pub timestamp: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct FeedEvalResponseSingle { + pub responses: Vec, + pub caller: String, + pub failures: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct FeedEvalManyResponse { + pub feed_responses: Vec, + pub signature: String, + pub recovery_id: i32, + pub errors: Vec>, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct FetchSignaturesMultiResponse { + pub oracle_responses: Vec, + pub errors: Vec>, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct FetchSignaturesBatchRequest { + pub api_version: String, + /// Chain metadata for the oracle to sign with + pub recent_hash: String, + /// Signing protocol for the oracle to use + pub signature_scheme: String, + /// Hashing scheme for the checksum used in the signature + pub hash_scheme: String, + pub feed_requests: Vec, + pub num_oracles: u32, + // Whether or not to use the timestamp in the checksum + #[serde(default)] + pub use_timestamp: bool, +} + +#[derive(Debug, Serialize, Deserialize, Clone, Default)] +pub struct FeedEvalBatchResponse { + pub feed_responses: Vec, + pub errors: Vec>, +} + +#[derive(Debug, Serialize, Deserialize, Clone, Default)] +pub struct FetchSignaturesBatchResponse { + pub oracle_responses: Vec, + pub errors: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct RandomnessRevealResponse { + pub signature: String, + pub recovery_id: i32, + pub value: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct AttestEnclaveResponse { + pub guardian: String, + pub signature: String, + pub recovery_id: i32, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct PingResponse { + pub oracle_pubkey: String, + pub oracle_authority: String, + pub queue: String, + pub rate_limit: i32, + pub version: String, + pub mr_enclave: String, + pub is_push_oracle: bool, + pub is_pull_oracle: bool, + pub is_gateway: bool, + pub is_guardian: bool, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct FetchQuoteResponse { + pub oracle_pubkey: String, + pub queue: String, + pub now: i64, + pub mr_enclave: String, + pub ed25519_pubkey: String, + pub secp256k1_pubkey: String, + pub quote: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct BridgeEnclaveResponse { + pub guardian: String, + pub oracle: String, + pub queue: String, + pub mr_enclave: String, + pub chain_hash: String, + pub oracle_ed25519_enclave_signer: String, + pub oracle_secp256k1_enclave_signer: String, + pub msg: String, + pub msg_prehash: String, + pub signature: String, + pub recovery_id: i32, +} + +#[derive(Debug, Clone, Default)] +pub struct Gateway { + gateway_url: String, + client: Arc, +} + +impl Gateway { + pub fn new(gateway_url: String) -> Self { + let client = Client::builder() + .timeout(Duration::from_secs(10)) + // Switchboard does its own keypair authentication + .danger_accept_invalid_certs(true) + .build() + .unwrap(); + + Self { + gateway_url, + client: Arc::new(client), + } + } + + /// Fetches signatures from the gateway + /// # Arguments + /// * `params` - FetchSignaturesParams + /// * `params.recent_hash` - The recent hash of the feed + /// * `params.encoded_jobs` - The encoded jobs + /// * `params.num_signatures` - The number of signatures to fetch + /// * `params.max_variance` - The maximum variance + /// * `params.min_responses` - The minimum number of responses + /// * `params.use_timestamp` - Whether to use the timestamp + /// # Returns + /// * `Result` + pub async fn fetch_signatures_from_encoded( + &self, + params: FetchSignaturesParams, + ) -> Result { + let url = format!("{}/gateway/api/v1/fetch_signatures", self.gateway_url); + let body = serde_json::json!({ + "api_version": "1.0.0", + "jobs_b64_encoded": params.encoded_jobs, + "recent_chainhash": params.recent_hash.unwrap_or_else(|| bs58::encode(vec![0; 32]).into_string()), + "signature_scheme": "Secp256k1", + "hash_scheme": "Sha256", + "num_oracles": params.num_signatures, + "max_variance": (params.max_variance.unwrap_or(1) as f64 * 1e9) as u64, + "min_responses": params.min_responses.unwrap_or(1), + "use_timestamp": params.use_timestamp.unwrap_or(false), + }); + + let res = self + .client + .post(&url) + .header(CONTENT_TYPE, "application/json") + .json(&body) + .send() + .await?; + + let raw = res.text().await?; + let res = serde_json::from_str::(&raw).unwrap(); + + Ok(res) + } + + /// Fetches signatures from the gateway using the multi-feed method + /// # Arguments + /// * `params` - FetchSignaturesMultiParams + /// * `params.recent_hash` - The recent hash of the feed + /// * `params.feed_configs` - The feed configurations + /// * `params.num_signatures` - The number of signatures to fetch + /// * `params.use_timestamp` - Whether to use the timestamp + /// # Returns + /// * `Result` + pub async fn fetch_signatures_multi( + &self, + params: FetchSignaturesMultiParams, + ) -> Result { + let url = format!("{}/gateway/api/v1/fetch_signatures_multi", self.gateway_url); + let mut feed_requests = vec![]; + + for config in params.feed_configs { + let max_variance = (config.max_variance.unwrap_or(1) as f64 * 1e9) as u64; + feed_requests.push(serde_json::json!({ + "jobs_b64_encoded": config.encoded_jobs, + "max_variance": max_variance, + "min_responses": config.min_responses.unwrap_or(1), + "use_timestamp": params.use_timestamp.unwrap_or(false), + })); + } + + let body = serde_json::json!({ + "api_version": "1.0.0", + "num_oracles": params.num_signatures.unwrap_or(1), + "recent_hash": params.recent_hash.unwrap_or_else(|| bs58::encode(vec![0; 32]).into_string()), + "signature_scheme": "Secp256k1", + "hash_scheme": "Sha256", + "feed_requests": feed_requests, + }); + + let res = self + .client + .post(&url) + .header(CONTENT_TYPE, "application/json") + .json(&body) + .send() + .await?; + let res = res.json::().await?; + + Ok(res) + } + + pub async fn fetch_signatures_batch( + &self, + params: FetchSignaturesBatchParams, + ) -> Result { + let url = format!("{}/gateway/api/v1/fetch_signatures_batch", self.gateway_url); + let req = FetchSignaturesBatchRequest { + api_version: "1.0.0".to_string(), + recent_hash: params + .recent_hash + .clone() + .unwrap_or_else(|| bs58::encode(vec![0; 32]).into_string()), + signature_scheme: "Secp256k1".to_string(), + hash_scheme: "Sha256".to_string(), + feed_requests: params.feed_configs.clone(), + num_oracles: params.num_signatures.unwrap_or(1), + use_timestamp: params.use_timestamp.unwrap_or(false), + }; + + let res = self + .client + .post(&url) + .header(CONTENT_TYPE, "application/json") + .json(&req) + .send() + .await?; + + let response = res.json::().await?; + Ok(response) + } + + pub async fn fetch_signatures_consensus( + &self, + params: FetchSignaturesConsensusParams, + ) -> Result { + let url = format!( + "{}/gateway/api/v1/fetch_signatures_consensus", + self.gateway_url + ); + println!("Fetching signatures from: {}", url); + // Build feed_requests array from feed_configs + let feed_requests: Vec = params + .feed_configs + .iter() + .map(|config| { + // If max_variance or min_responses are not provided, use default values. + let max_variance = config.max_variance.unwrap_or(1); + let min_responses = config.min_responses.unwrap_or(1); + serde_json::json!({ + "jobs_b64_encoded": config.encoded_jobs, + "max_variance": (max_variance as f64 * 1e9) as u64, + "min_responses": min_responses, + "use_timestamp": params.use_timestamp.unwrap_or(false) + }) + }) + .collect(); + + let body = serde_json::json!({ + "api_version": "1.0.0", + "recent_hash": params.recent_hash.unwrap_or_else(|| bs58::encode(vec![0; 32]).into_string()), + "signature_scheme": "Secp256k1", + "hash_scheme": "Sha256", + "feed_requests": feed_requests, + "num_oracles": params.num_signatures.unwrap_or(1) + }); + + let res = self + .client + .post(&url) + .header(CONTENT_TYPE, "application/json") + .json(&body) + .send() + .await?; + + let response = res.json::().await?; + Ok(response) + } + + pub async fn test_gateway(&self) -> bool { + let client = &self.client; + // Make HTTP request + let url = format!("{}/gateway/api/v1/test", self.gateway_url); + let response = client.get(&url).send().await; + + // Process response + if let Ok(resp) = response { + if let Ok(text) = resp.text().await { + !text.is_empty() + } else { + false + } + } else { + false + } + } +} + +#[derive(Debug)] +pub struct FetchSignaturesParams { + pub recent_hash: Option, + pub encoded_jobs: Vec, + pub num_signatures: u32, + pub max_variance: Option, + pub min_responses: Option, + pub use_timestamp: Option, +} + +#[derive(Debug, Clone)] +pub struct FeedConfig { + pub encoded_jobs: Vec, + pub max_variance: Option, + pub min_responses: Option, +} + +#[derive(Debug, Serialize, Deserialize, Clone, Default)] +pub struct BatchFeedRequest { + /// Vec of jobs to process. Each group is equivalent to 1 feed. + pub jobs_b64_encoded: Vec, + /// Allowed variance in the feed values + pub max_variance: u64, + /// Minimum number of responses required for the feed + pub min_responses: u32, +} + +#[derive(Debug)] +pub struct FetchSignaturesMultiParams { + pub recent_hash: Option, + pub feed_configs: Vec, + pub num_signatures: Option, + pub use_timestamp: Option, +} + +#[derive(Debug, Clone, Default)] +pub struct FetchSignaturesBatchParams { + pub recent_hash: Option, + pub feed_configs: Vec, + pub num_signatures: Option, + pub use_timestamp: Option, +} + +pub fn encode_jobs(job_array: &[OracleJob]) -> Vec { + job_array + .iter() + .map(|job| BASE64_STANDARD.encode(job.encode_length_delimited_to_vec())) + .collect() +} diff --git a/programs/switchboard-on-demand/src/client/instructions/mod.rs b/programs/switchboard-on-demand/src/client/instructions/mod.rs new file mode 100644 index 0000000000..31cc67df06 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/instructions/mod.rs @@ -0,0 +1,12 @@ +pub mod pull_feed_submit_response_ix; +pub use pull_feed_submit_response_ix::*; +pub mod pull_feed_submit_response_many_ix; +pub use pull_feed_submit_response_many_ix::*; +pub mod pull_feed_submit_response_consensus; +pub use pull_feed_submit_response_consensus::*; +use sha2::{Digest, Sha256}; + +pub fn get_discriminator(name: &str) -> Vec { + let name = format!("global:{}", name); + Sha256::digest(&name)[..8].to_vec() +} diff --git a/programs/switchboard-on-demand/src/client/instructions/pull_feed_submit_response_consensus.rs b/programs/switchboard-on-demand/src/client/instructions/pull_feed_submit_response_consensus.rs new file mode 100644 index 0000000000..7e05e4cfce --- /dev/null +++ b/programs/switchboard-on-demand/src/client/instructions/pull_feed_submit_response_consensus.rs @@ -0,0 +1,53 @@ +use super::get_discriminator; +use borsh::{BorshDeserialize, BorshSerialize}; +use crate::AccountMeta; +use crate::Pubkey; +use anchor_client::solana_sdk::sysvar::instructions; + +#[derive(Clone, Debug)] +pub struct PullFeedSubmitResponseConsensus { + pub queue: Pubkey, + pub program_state: Pubkey, + pub recent_slothashes: Pubkey, + pub payer: Pubkey, + pub system_program: Pubkey, + pub reward_vault: Pubkey, + pub token_program: Pubkey, + pub token_mint: Pubkey, +} + +impl PullFeedSubmitResponseConsensus { + pub fn to_account_metas(&self, _is_signer: Option) -> Vec { + vec![ + AccountMeta::new_readonly(self.queue, false), + AccountMeta::new_readonly(self.program_state, false), + AccountMeta::new_readonly(self.recent_slothashes, false), + AccountMeta::new(self.payer, true), + AccountMeta::new_readonly(self.system_program, false), + AccountMeta::new(self.reward_vault, false), + AccountMeta::new_readonly(self.token_program, false), + AccountMeta::new_readonly(self.token_mint, false), + AccountMeta::new_readonly(instructions::id().to_bytes().into(), false), + ] + } +} + +#[derive(Clone, BorshSerialize, BorshDeserialize)] +pub struct PullFeedSubmitResponseConsensusParams { + pub slot: u64, + pub values: Vec, +} + +impl PullFeedSubmitResponseConsensusParams { + pub fn to_vec(&self) -> Vec { + let mut buffer: Vec = Vec::new(); + self.serialize(&mut buffer).unwrap(); + buffer + } + + pub fn data(&self) -> Vec { + let mut res = get_discriminator("pull_feed_submit_response_consensus").to_vec(); + res.extend_from_slice(&self.to_vec()); + res + } +} diff --git a/programs/switchboard-on-demand/src/client/instructions/pull_feed_submit_response_ix.rs b/programs/switchboard-on-demand/src/client/instructions/pull_feed_submit_response_ix.rs new file mode 100644 index 0000000000..0d36185b51 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/instructions/pull_feed_submit_response_ix.rs @@ -0,0 +1,63 @@ +use super::get_discriminator; +use borsh::{BorshDeserialize, BorshSerialize}; +use crate::AccountMeta; +use crate::Pubkey; + +#[derive(Clone, Debug)] +pub struct PullFeedSubmitResponse { + pub feed: Pubkey, + pub queue: Pubkey, + pub program_state: Pubkey, + pub recent_slothashes: Pubkey, + pub payer: Pubkey, + pub system_program: Pubkey, + pub reward_vault: Pubkey, + pub token_program: Pubkey, + pub token_mint: Pubkey, +} + +impl PullFeedSubmitResponse { + pub fn to_account_metas(&self, _is_signer: Option) -> Vec { + vec![ + AccountMeta::new(self.feed, false), + AccountMeta::new_readonly(self.queue, false), + AccountMeta::new_readonly(self.program_state, false), + AccountMeta::new_readonly(self.recent_slothashes, false), + AccountMeta::new(self.payer, true), + AccountMeta::new_readonly(self.system_program, false), + AccountMeta::new(self.reward_vault, false), + AccountMeta::new_readonly(self.token_program, false), + AccountMeta::new_readonly(self.token_mint, false), + ] + } +} + +// 82 bytes +#[derive(Clone, BorshSerialize, BorshDeserialize)] +pub struct Submission { + pub value: i128, + pub signature: [u8; 64], + pub recovery_id: u8, + // If the oracle failed to produce response at the user request slot and it + // responds with an older signed vlaue state which slot its signed with by + // offset of requested. + pub offset: u8, +} +#[derive(Clone, BorshSerialize, BorshDeserialize)] +pub struct PullFeedSubmitResponseParams { + pub slot: u64, + pub submissions: Vec, +} +impl PullFeedSubmitResponseParams { + pub fn to_vec(&self) -> Vec { + let mut buffer: Vec = Vec::new(); + self.serialize(&mut buffer).unwrap(); + buffer + } + + pub fn data(&self) -> Vec { + let mut res = get_discriminator("pull_feed_submit_response").to_vec(); + res.extend_from_slice(&self.to_vec()); + res + } +} diff --git a/programs/switchboard-on-demand/src/client/instructions/pull_feed_submit_response_many_ix.rs b/programs/switchboard-on-demand/src/client/instructions/pull_feed_submit_response_many_ix.rs new file mode 100644 index 0000000000..54f99708bc --- /dev/null +++ b/programs/switchboard-on-demand/src/client/instructions/pull_feed_submit_response_many_ix.rs @@ -0,0 +1,60 @@ +use super::get_discriminator; +use borsh::{BorshDeserialize, BorshSerialize}; +use crate::AccountMeta; +use crate::Pubkey; +use anchor_client::solana_sdk::sysvar::instructions; + +#[derive(Clone, Debug)] +pub struct PullFeedSubmitResponseMany { + pub queue: Pubkey, + pub program_state: Pubkey, + pub recent_slothashes: Pubkey, + // mut + pub payer: Pubkey, + pub system_program: Pubkey, + // mut + pub reward_vault: Pubkey, + pub token_program: Pubkey, + pub token_mint: Pubkey, +} + +impl PullFeedSubmitResponseMany { + pub fn to_account_metas(&self, _is_signer: Option) -> Vec { + vec![ + AccountMeta::new_readonly(self.queue, false), + AccountMeta::new_readonly(self.program_state, false), + AccountMeta::new_readonly(self.recent_slothashes, false), + AccountMeta::new(self.payer, true), + AccountMeta::new_readonly(self.system_program, false), + AccountMeta::new(self.reward_vault, false), + AccountMeta::new_readonly(self.token_program, false), + AccountMeta::new_readonly(self.token_mint, false), + AccountMeta::new_readonly(instructions::id().to_bytes().into(), false), + ] + } +} + +#[derive(Clone, BorshSerialize, BorshDeserialize)] +pub struct MultiSubmission { + pub values: Vec, // i128::MAX is a sentinel value for missing data + pub signature: [u8; 64], + pub recovery_id: u8, +} +#[derive(Clone, BorshSerialize, BorshDeserialize)] +pub struct PullFeedSubmitResponseManyParams { + pub slot: u64, + pub submissions: Vec, +} +impl PullFeedSubmitResponseManyParams { + pub fn to_vec(&self) -> Vec { + let mut buffer: Vec = Vec::new(); + self.serialize(&mut buffer).unwrap(); + buffer + } + + pub fn data(&self) -> Vec { + let mut res = get_discriminator("pull_feed_submit_response_many").to_vec(); + res.extend_from_slice(&self.to_vec()); + res + } +} diff --git a/programs/switchboard-on-demand/src/client/lut_owner.rs b/programs/switchboard-on-demand/src/client/lut_owner.rs new file mode 100644 index 0000000000..ac4a147a5b --- /dev/null +++ b/programs/switchboard-on-demand/src/client/lut_owner.rs @@ -0,0 +1,84 @@ +#[allow(unused_imports)] +use crate::*; +use anyhow::anyhow; +use anyhow::Error as AnyhowError; +use crate::solana_compat::solana_client::nonblocking::rpc_client::RpcClient; +use anchor_client::solana_sdk::address_lookup_table::instruction::derive_lookup_table_address; +use anchor_client::solana_sdk::address_lookup_table::state::AddressLookupTable; +use anchor_client::solana_sdk::address_lookup_table::AddressLookupTableAccount; +use crate::Pubkey; + +pub trait LutOwner { + fn lut_slot(&self) -> u64; +} + +pub async fn load_lookup_table( + client: &RpcClient, + self_key: Pubkey, +) -> Result { + let account = client + .get_account_data(&self_key.to_bytes().into()) + .await + .map_err(|_| anyhow!("LutOwner.load_lookup_table: Oracle not found"))?; + let account = account[8..].to_vec(); + let data = bytemuck::try_from_bytes::(&account) + .map_err(|_| anyhow!("LutOwner.load_lookup_table: Invalid data"))?; + let lut_slot = data.lut_slot(); + let lut_signer: Pubkey = find_lut_signer(&self_key); + let lut_key: anchor_client::solana_sdk::pubkey::Pubkey = derive_lookup_table_address(&lut_signer.to_bytes().into(), lut_slot).0; + let lut_account = client + .get_account_data(&lut_key.to_bytes().into()) + .await + .map_err(|_| anyhow!("LutOwner.load_lookup_table: LUT not found"))?; + let parsed_lut = AddressLookupTable::deserialize(&lut_account) + .map_err(|_| anyhow!("LutOwner.load_lookup_table: Invalid LUT data"))?; + Ok(AddressLookupTableAccount { + addresses: parsed_lut.addresses.to_vec(), + key: lut_key, + }) +} + +pub async fn load_lookup_tables( + client: &RpcClient, + keys: &[Pubkey], +) -> Result, AnyhowError> { + // Account data uses v3 Pubkey, but RpcClient expects v2 Pubkey + let keys_v2: Vec<_> = keys.iter().map(|k| k.to_bytes().into()).collect(); + let accounts_data = client + .get_multiple_accounts(&keys_v2) + .await? + .into_iter() + .map(|acct| match acct { + Some(account) => account.data.get(8..).unwrap_or(&[]).to_vec(), + None => vec![], + }) + .collect::>(); + let mut lut_keys = Vec::new(); + let mut out = Vec::new(); + for (idx, account) in accounts_data.iter().enumerate() { + let data = bytemuck::try_from_bytes::(account); + if data.is_err() { + continue; + } + let lut_slot = data.unwrap().lut_slot(); + let lut_signer = find_lut_signer(&keys[idx]); + let lut_key = derive_lookup_table_address(&lut_signer, lut_slot).0; + lut_keys.push(lut_key.to_bytes().into()); + } + let lut_datas = client + .get_multiple_accounts(lut_keys.as_slice()) + .await? + .into_iter() + .map(|data| data.unwrap_or_default().data.to_vec()) + .collect::>>(); + for (idx, lut_data) in lut_datas.iter().enumerate() { + let parsed_lut = AddressLookupTable::deserialize(lut_data); + if let Ok(parsed_lut) = parsed_lut { + out.push(AddressLookupTableAccount { + addresses: parsed_lut.addresses.to_vec(), + key: lut_keys[idx].to_bytes().into(), + }); + } + } + Ok(out) +} diff --git a/programs/switchboard-on-demand/src/client/mod.rs b/programs/switchboard-on-demand/src/client/mod.rs new file mode 100644 index 0000000000..1b4a7bff66 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/mod.rs @@ -0,0 +1,50 @@ +/// Core Crossbar protocol implementations and client functionality +pub mod crossbar; +pub use crossbar::*; + +/// Gateway client for interfacing with Switchboard's Crossbar API +pub mod gateway; +pub use gateway::*; + +/// Pull-based oracle feed management and data fetching utilities +pub mod pull_feed; +pub use self::pull_feed::PullFeed; + +/// Oracle job definitions, serialization, and protocol buffer handling +pub mod oracle_job; +pub use oracle_job::OracleJob; + +/// SECP256k1 cryptographic utilities and signature verification +pub mod secp256k1; +pub use secp256k1::*; + +/// Lookup table ownership and management functionality +pub mod lut_owner; +pub use lut_owner::*; + +/// Associated token account utilities and constants +pub mod associated_token_account; +pub use associated_token_account::*; + +/// Solana slot hash utilities and recent hash management +pub mod recent_slothashes; +pub use recent_slothashes::*; + +/// Client-specific account structures and deserialization utilities +pub mod accounts; +pub use accounts::*; + +/// Client-specific instruction builders for interacting with the Switchboard On-Demand program +pub mod instructions; +pub use instructions::*; + +/// Transaction building utilities +pub mod transaction_builder; +pub use transaction_builder::*; + +/// Client utility functions and helpers +pub mod utils; +pub use utils::*; + +/// Re-export prost for protobuf handling +pub use prost; \ No newline at end of file diff --git a/programs/switchboard-on-demand/src/client/oracle_job.rs b/programs/switchboard-on-demand/src/client/oracle_job.rs new file mode 100644 index 0000000000..5bc0c43859 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/oracle_job.rs @@ -0,0 +1,8475 @@ +// @generated +/// / Represnts a list of tasks to be performed by a switchboard oracle. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct OracleJob { + /// / The chain of tasks to perform for this OracleJob. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, + /// / The weight to assign to this job's result when aggregating multiple job results. A higher + /// / weight means this job's result will have more influence on the final aggregated value. This + /// / value must be greater than or equal to 0. + #[prost(uint32, optional, tag = "2", default = "1")] + pub weight: ::core::option::Option, + #[prost(uint32, optional, tag = "3")] + pub min_responses: ::core::option::Option, + #[prost(uint32, optional, tag = "4")] + pub min_samples: ::core::option::Option, + #[prost(uint64, optional, tag = "5")] + pub max_variance: ::core::option::Option, + #[prost(string, optional, tag = "6")] + pub name: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "7")] + pub queue: ::core::option::Option<::prost::alloc::string::String>, +} +/// Nested message and enum types in `OracleJob`. +pub mod oracle_job { + /// + /// The adapter will report the text body of a successful HTTP request to the + /// specified url, or return an error if the response status code is greater + /// than or equal to 400. + /// + /// _**Input**_: None + /// + /// _**Returns**_: String representation of the http response. + /// + /// _**Example**_: Basic HttpTask + /// + /// ```json + /// {"httpTask": {"url": " } + /// ``` + /// + /// _**Example**_: HttpTask example with headers + /// + /// ```json + /// { "httpTask": { "url": " "method": "METHOD_POST", "headers": \[ { "key": "MY_HEADER_KEY", "value": "MY_HEADER_VALUE" } \], "body": "{\"MY_BODY_KEY\":\"MY_BODY_VALUE\"}" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct HttpTask { + /// / A string containing the URL to direct this HTTP request to. + #[prost(string, optional, tag = "1")] + pub url: ::core::option::Option<::prost::alloc::string::String>, + /// / The type of HTTP request to make. + #[prost(enumeration = "http_task::Method", optional, tag = "2")] + pub method: ::core::option::Option, + /// / A list of headers to add to this HttpTask. + #[prost(message, repeated, tag = "3")] + pub headers: ::prost::alloc::vec::Vec, + /// / A stringified body (if any) to add to this HttpTask. + #[prost(string, optional, tag = "4")] + pub body: ::core::option::Option<::prost::alloc::string::String>, + } + /// Nested message and enum types in `HttpTask`. + pub mod http_task { + /// / An object that represents a header to add to an HTTP request. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Header { + /// / A header key such as `Authorization` or `Content-Type` + #[prost(string, optional, tag = "1")] + pub key: ::core::option::Option<::prost::alloc::string::String>, + /// / A value for the given header key like `Basic MYAUTHKEY` or `application/json` + #[prost(string, optional, tag = "2")] + pub value: ::core::option::Option<::prost::alloc::string::String>, + } + /// / An enumeration representing the types of HTTP requests available to make. + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Method { + /// / Unset HTTP method will default to METHOD_GET + Unkown = 0, + /// / Perform an HTTP 'GET' request. + Get = 1, + /// / Perform an HTTP 'POST' request. + Post = 2, + } + impl Method { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Method::Unkown => "METHOD_UNKOWN", + Method::Get => "METHOD_GET", + Method::Post => "METHOD_POST", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "METHOD_UNKOWN" => Some(Self::Unkown), + "METHOD_GET" => Some(Self::Get), + "METHOD_POST" => Some(Self::Post), + _ => None, + } + } + } + } + /// + /// The adapter walks the path specified and returns the value found at that result. If returning + /// JSON data from the HttpGet or HttpPost adapters, you must use this adapter to parse the response. + /// + /// _**Input**_: String representation of a JSON object. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Parses the price field from a JSON object + /// + /// ```json + /// {"jsonParse": {"path": "$.price"} } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct JsonParseTask { + /// / JSONPath formatted path to the element. + /// / + #[prost(string, optional, tag = "1")] + pub path: ::core::option::Option<::prost::alloc::string::String>, + /// / The technique that will be used to aggregate the results if walking the specified path returns multiple numerical results. + #[prost( + enumeration = "json_parse_task::AggregationMethod", + optional, + tag = "2" + )] + pub aggregation_method: ::core::option::Option, + } + /// Nested message and enum types in `JsonParseTask`. + pub mod json_parse_task { + /// / The methods of combining a list of numerical results. + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum AggregationMethod { + None = 0, + /// / Grab the minimum value of the results. + Min = 1, + /// / Grab the maximum value of the results. + Max = 2, + /// / Sum up all of the results. + Sum = 3, + /// / Average all of the results. + Mean = 4, + /// / Grab the median of the results. + Median = 5, + } + impl AggregationMethod { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + AggregationMethod::None => "NONE", + AggregationMethod::Min => "MIN", + AggregationMethod::Max => "MAX", + AggregationMethod::Sum => "SUM", + AggregationMethod::Mean => "MEAN", + AggregationMethod::Median => "MEDIAN", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "NONE" => Some(Self::None), + "MIN" => Some(Self::Min), + "MAX" => Some(Self::Max), + "SUM" => Some(Self::Sum), + "MEAN" => Some(Self::Mean), + "MEDIAN" => Some(Self::Median), + _ => None, + } + } + } + } + /// + /// Returns the median (middle) of all the results returned by the provided subtasks and subjobs. Nested tasks must return a Number. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the median numerical result of 3 tasks. + /// + /// ```json + /// {"medianTask": {"tasks": \[{"valueTask": {"value": 10}},{"valueTask": {"value": 20}},{"valueTask": {"value": 30}}\]}} + /// ``` + /// + /// _**Example**_: Returns the median numerical result of 3 jobs. + /// + /// ```json + /// {"medianTask": {"jobs": \[{"tasks": [{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": \[{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": [{"httpTask": {"url": " {"path": "$[0][7]"}}]}]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MedianTask { + /// / A list of subtasks to process and produce a list of result values. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, + /// / A list of subjobs to process and produce a list of result values. + #[prost(message, repeated, tag = "2")] + pub jobs: ::prost::alloc::vec::Vec, + /// / The minimum number of values before a successful median can be yielded. + #[prost(int32, optional, tag = "3")] + pub min_successful_required: ::core::option::Option, + /// / The maximum range between the minimum and maximum values before a successful median can be yielded. + #[prost(string, optional, tag = "4")] + pub max_range_percent: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Returns the mean (average) of all the results returned by the provided subtasks and subjobs. Nested tasks or jobs must return a Number. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the mean numerical result of 3 tasks. + /// + /// ```json + /// {"meanTask": {"tasks": \[{"valueTask": {"value": 10}},{"valueTask": {"value": 20}},{"valueTask": {"value": 30}}\]}} + /// ``` + /// + /// _**Example**_: Returns the mean numerical result of 3 jobs. + /// + /// ```json + /// {"meanTask": {"jobs": \[{"tasks": [{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": \[{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": [{"httpTask": {"url": " {"path": "$[0][7]"}}]}]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MeanTask { + /// / A list of subtasks to process and produce a list of result values. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, + /// / A list of subjobs to process and produce a list of result values. + #[prost(message, repeated, tag = "2")] + pub jobs: ::prost::alloc::vec::Vec, + } + /// + /// Returns the maximum value of all the results returned by the provided subtasks and subjobs. Nested tasks or jobs must return a Number. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the maximum numerical result from 3 tasks. + /// + /// ```json + /// {"maxTask": {"tasks": \[{"valueTask": {"value": 10}},{"valueTask": {"value": 20}},{"valueTask": {"value": 30}}\]}} + /// ``` + /// + /// _**Example**_: Returns the maximum numerical result from 3 jobs. + /// + /// ```json + /// {"maxTask": {"jobs": \[{"tasks": [{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": \[{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": [{"httpTask": {"url": " {"path": "$[0][7]"}}]}]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MaxTask { + /// / A list of subtasks to process and produce a list of result values. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, + /// / A list of subjobs to process and produce a list of result values. + #[prost(message, repeated, tag = "2")] + pub jobs: ::prost::alloc::vec::Vec, + } + /// + /// Returns the minimum value of all the results returned by the provided subtasks and subjobs. Nested tasks or jobs must return a Number. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the minimum numerical result from 3 tasks. + /// + /// ```json + /// {"minTask": {"tasks": \[{"valueTask": {"value": 10}},{"valueTask": {"value": 20}},{"valueTask": {"value": 30}}\]}} + /// ``` + /// + /// _**Example**_: Returns the minimum numerical result from 3 jobs. + /// + /// ```json + /// {"minTask": {"jobs": \[{"tasks": [{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": \[{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": [{"httpTask": {"url": " {"path": "$[0][7]"}}]}]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MinTask { + /// / A list of subtasks to process and produce a list of result values. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, + /// / A list of subjobs to process and produce a list of result values. + #[prost(message, repeated, tag = "2")] + pub jobs: ::prost::alloc::vec::Vec, + } + /// + /// Returns a specified value. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the value 10 + /// + /// ```json + /// {"valueTask": {"value": 10} } + /// ``` + /// + /// _**Example**_: Returns the currentRound result of an aggregator + /// + /// ```json + /// {"valueTask": {"aggregatorPubkey": "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"} } + /// ``` + /// + /// _**Example**_: Returns the value stored in a CacheTask variable + /// + /// ```json + /// {"valueTask": {"big": "${ONE}"} } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ValueTask { + #[prost(oneof = "value_task::Value", tags = "1, 2, 3, 4, 5")] + pub value: ::core::option::Option, + } + /// Nested message and enum types in `ValueTask`. + pub mod value_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Value { + /// / The value that will be returned from this task. + #[prost(double, tag = "1")] + Value(f64), + /// / Specifies an aggregatorr to pull the value of. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "3")] + Big(::prost::alloc::string::String), + /// / A stringified hex number (0x prefix is optional). + #[prost(string, tag = "4")] + Hex(::prost::alloc::string::String), + /// A utf8 string. + #[prost(string, tag = "5")] + Utf8(::prost::alloc::string::String), + } + } + /// + /// Opens and maintains a websocket for light speed data retrieval. + /// + /// _**Input**_: None + /// + /// _**Returns**_: String representation of the websocket subscription message. + /// + /// _**Example**_: Opens a coinbase websocket + /// + /// ```json + /// { "websocketTask": { "url": "wss://ws-feed.pro.coinbase.com", "subscription": "{\"type\":\"subscribe\",\"product_ids\":\[\"BTC-USD\"\],\"channels\":\[\"ticker\",{\"name\":\"ticker\",\"product_ids\":[\"BTC-USD\"\]}]}", "maxDataAgeSeconds": 15, "filter": "$\[?(@.type == 'ticker' && @.product_id == 'BTC-USD')\]" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct WebsocketTask { + /// / The websocket url. + #[prost(string, optional, tag = "1")] + pub url: ::core::option::Option<::prost::alloc::string::String>, + /// / The websocket message to notify of a new subscription. + #[prost(string, optional, tag = "2")] + pub subscription: ::core::option::Option<::prost::alloc::string::String>, + /// / Minimum amount of time required between when the horses are taking out. + #[prost(int32, optional, tag = "3")] + pub max_data_age_seconds: ::core::option::Option, + /// / Incoming message JSONPath filter. + /// / Example: "$\[?(@.channel == 'ticker' && @.market == 'BTC/USD')\]" + #[prost(string, optional, tag = "4")] + pub filter: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// This task will run the `attempt` on the subtasks in an effort to produce a valid numerical result. If `attempt`. fails to produce an acceptable result, `on_failure` subtasks will be run instead. + /// + /// _**Input**_: The current running numerical result output from a task. + /// + /// _**Returns**_: A numerical result, else run `on_failure` subtasks. + /// + /// _**Example**_: Returns the numerical result from the conditionalTask's subtasks, else `on_failure` returns the numerical result from its subtasks. + /// + /// ```json + /// {"conditionalTask":{"attempt":\[{"tasks":[{"jupiterSwapTask":{"inTokenAddress":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","outTokenAddress":"DUALa4FC2yREwZ59PHeu1un4wis36vHRv5hWVBmzykCJ"}}\]}],"onFailure":\[{"lpExchangeRateTask":{"orcaPoolAddress":"7yJ4gMRJhEoCR48aPE3EAWRmCoygakik81ZS1sajaTnE"}}\]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ConditionalTask { + /// / A list of subtasks to process in an attempt to produce a valid numerical result. + #[prost(message, repeated, tag = "1")] + pub attempt: ::prost::alloc::vec::Vec, + /// / A list of subtasks that will be run if `attempt` subtasks are unable to produce an acceptable + /// / result. + #[prost(message, repeated, tag = "2")] + pub on_failure: ::prost::alloc::vec::Vec, + } + /// + /// This task will divide a numerical input by a scalar value from a job of subtasks, an aggregator, or a big. + /// + /// _**Input**_: The current running numerical result output from a scalar value, an aggregator, a job of subtasks or a big. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the numerical result by dividing by a job of subtasks. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"divideTask":{"job":{"tasks":[{"valueTask":{"value":10}}\]}}}]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by dividing by an aggregator. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"divideTask":{"aggregatorPubkey":"GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"}}\]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by dividing by a big. + /// + /// ```json + /// {"tasks":\[{"cacheTask":{"cacheItems":[{"variableName":"TEN","job":{"tasks":[{"valueTask":{"value":10}}\]}}]}},{"valueTask":{"value":100}},{"divideTask":{"big":"${TEN}"}}]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DivideTask { + #[prost(oneof = "divide_task::Denominator", tags = "1, 2, 3, 4")] + pub denominator: ::core::option::Option, + } + /// Nested message and enum types in `DivideTask`. + pub mod divide_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Denominator { + /// / Specifies a basic scalar denominator to divide by. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Specifies another aggregator resut to divide by. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A job whose result is computed before dividing our numerical input by that result. + #[prost(message, tag = "3")] + Job(super::super::OracleJob), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "4")] + Big(::prost::alloc::string::String), + } + } + /// + /// This task will multiply a numerical input by a scalar value from a job of subtasks, an aggregator, or a big. + /// + /// _**Input**_: The current running numerical result output from a scalar value, an aggregator, a job of subtasks or a big. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the numerical result by multiplying by a job of subtasks. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"multiplyTask":{"job":{"tasks":[{"valueTask":{"value":10}}\]}}}]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by an aggregator. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"multiplyTask":{"aggregatorPubkey":"GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"}}\]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by a big. + /// + /// ```json + /// {"tasks":\[{"cacheTask":{"cacheItems":[{"variableName":"TEN","job":{"tasks":[{"valueTask":{"value":10}}\]}}]}},{"valueTask":{"value":100}},{"multiplyTask":{"big":"${TEN}"}}]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MultiplyTask { + #[prost(oneof = "multiply_task::Multiple", tags = "1, 2, 3, 4")] + pub multiple: ::core::option::Option, + } + /// Nested message and enum types in `MultiplyTask`. + pub mod multiply_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Multiple { + /// / Specifies a scalar to multiply by. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Specifies an aggregator to multiply by. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A job whose result is computed before multiplying our numerical input by that result. + #[prost(message, tag = "3")] + Job(super::super::OracleJob), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "4")] + Big(::prost::alloc::string::String), + } + } + /// + /// This task will add a numerical input by a scalar value from a job of subtasks, an aggregator, or a big. + /// + /// _**Input**_: The current running numerical result output from a scalar value, an aggregator, a job of subtasks or a big. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the numerical result by adding by a job of subtasks. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"addTask":{"job":{"tasks":[{"valueTask":{"value":10}}\]}}}]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by an aggregator. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"addTask":{"aggregatorPubkey":"GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"}}\]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by a big. + /// + /// ```json + /// {"tasks":\[{"cacheTask":{"cacheItems":[{"variableName":"TEN","job":{"tasks":[{"valueTask":{"value":10}}\]}}]}},{"valueTask":{"value":100}},{"addTask":{"big":"${TEN}"}}]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct AddTask { + #[prost(oneof = "add_task::Addition", tags = "1, 2, 3, 4")] + pub addition: ::core::option::Option, + } + /// Nested message and enum types in `AddTask`. + pub mod add_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Addition { + /// / Specifies a scalar to add by. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Specifies an aggregator to add by. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A job whose result is computed before adding our numerical input by that result. + #[prost(message, tag = "3")] + Job(super::super::OracleJob), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "4")] + Big(::prost::alloc::string::String), + } + } + /// + /// This task will subtract a numerical input by a scalar value from a job of subtasks, an aggregator, or a big. + /// + /// _**Input**_: The current running numerical result output from a scalar value, an aggregator, a job of subtasks or a big. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the numerical result by subtracting by a job of subtasks. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"subtractTask":{"job":{"tasks":[{"valueTask":{"value":10}}\]}}}]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by an aggregator. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"subtractTask":{"aggregatorPubkey":"GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"}}\]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by a big. + /// + /// ```json + /// {"tasks":\[{"cacheTask":{"cacheItems":[{"variableName":"TEN","job":{"tasks":[{"valueTask":{"value":10}}\]}}]}},{"valueTask":{"value":100}},{"subtractTask":{"big":"${TEN}"}}]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SubtractTask { + #[prost(oneof = "subtract_task::Subtraction", tags = "1, 2, 3, 4")] + pub subtraction: ::core::option::Option, + } + /// Nested message and enum types in `SubtractTask`. + pub mod subtract_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Subtraction { + /// / Specifies a scalar to subtract by. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Specifies an aggregator to subtract by. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A job whose result is computed before subtracting our numerical input by that result. + #[prost(message, tag = "3")] + Job(super::super::OracleJob), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "4")] + Big(::prost::alloc::string::String), + } + } + /// + /// Fetch LP token price info from a number of supported exchanges. + /// + /// See our blog post on [Fair LP Token Oracles](/blog/2022/01/20/Fair-LP-Token-Oracles) + /// + /// *NOTE**: This is not the swap price but the price of the underlying LP token. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The price of an LP token for a given AMM pool. + /// + /// _**Example**_: Fetch the Orca LP token price of the SOL/USDC pool + /// + /// ```json + /// { "lpTokenPriceTask": { "orcaPoolAddress": "APDFRM3HMr8CAGXwKHiu2f5ePSpaiEJhaURwhsRrUUt9" } } + /// ``` + /// + /// _**Example**_: Fetch the fair price Orca LP token price of the SOL/USDC pool + /// + /// ```json + /// { "lpTokenPriceTask": { "orcaPoolAddress": "APDFRM3HMr8CAGXwKHiu2f5ePSpaiEJhaURwhsRrUUt9", "useFairPrice": true, "priceFeedAddresses": \[ "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR", "BjUgj6YCnFBZ49wF54ddBVA9qu8TeqkFtkbqmZcee8uW" \] } } + /// ``` + /// + /// _**Example**_: Fetch the fair price Raydium LP token price of the SOL/USDC pool + /// + /// ```json + /// { "lpTokenPriceTask": { "raydiumPoolAddress": "58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2", "useFairPrice": true,"priceFeedAddresses": \["GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR","BjUgj6YCnFBZ49wF54ddBVA9qu8TeqkFtkbqmZcee8uW" \] } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LpTokenPriceTask { + /// / A list of Switchboard aggregator accounts used to calculate the fair LP price. This ensures the price is based on the previous round to mitigate flash loan price manipulation. + #[prost(string, repeated, tag = "5")] + pub price_feed_addresses: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// / A list of OracleJobs to execute in order to yield the price feed jobs to use for the fair price formula. + #[prost(message, repeated, tag = "6")] + pub price_feed_jobs: ::prost::alloc::vec::Vec, + /// / If enabled and price_feed_addresses provided, the oracle will calculate the fair LP price based on the liquidity pool reserves. See our blog post for more information: + #[prost(bool, optional, tag = "7")] + pub use_fair_price: ::core::option::Option, + #[prost(oneof = "lp_token_price_task::PoolAddress", tags = "1, 2, 3, 4")] + pub pool_address: ::core::option::Option, + } + /// Nested message and enum types in `LpTokenPriceTask`. + pub mod lp_token_price_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum PoolAddress { + /// / Mercurial finance pool address. A full list can be found here: + #[prost(string, tag = "1")] + MercurialPoolAddress(::prost::alloc::string::String), + /// / Saber pool address. A full list can be found here: + #[prost(string, tag = "2")] + SaberPoolAddress(::prost::alloc::string::String), + /// / Orca pool address. A full list can be found here: + #[prost(string, tag = "3")] + OrcaPoolAddress(::prost::alloc::string::String), + /// / The Raydium liquidity pool ammId. A full list can be found here: + #[prost(string, tag = "4")] + RaydiumPoolAddress(::prost::alloc::string::String), + } + } + /// + /// Fetch the current swap price for a given liquidity pool + /// + /// _**Input**_: None + /// + /// _**Returns**_: The swap price for a given AMM pool. + /// + /// _**Example**_: Fetch the exchange rate from the Orca SOL/USDC pool + /// + /// ```json + /// { "lpExchangeRateTask": { "orcaPoolAddress": "APDFRM3HMr8CAGXwKHiu2f5ePSpaiEJhaURwhsRrUUt9" } } + /// ``` + /// + /// _**Example**_: Fetch the exchange rate from the Raydium SOL/USDC pool + /// + /// ```json + /// { "lpExchangeRateTask": { "raydiumPoolAddress": "58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LpExchangeRateTask { + /// / Used alongside mercurial_pool_address to specify the input token for a swap. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / Used alongside mercurial_pool_address to specify the output token for a swap. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(enumeration = "lp_exchange_rate_task::Chain", optional, tag = "9")] + pub chain: ::core::option::Option, + #[prost( + oneof = "lp_exchange_rate_task::PoolAddress", + tags = "3, 4, 5, 6, 7, 8" + )] + pub pool_address: ::core::option::Option, + } + /// Nested message and enum types in `LpExchangeRateTask`. + pub mod lp_exchange_rate_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Chain { + Solana = 0, + Eclipse = 1, + } + impl Chain { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Chain::Solana => "SOLANA", + Chain::Eclipse => "ECLIPSE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "SOLANA" => Some(Self::Solana), + "ECLIPSE" => Some(Self::Eclipse), + _ => None, + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum PoolAddress { + /// / Mercurial finance pool address. A full list can be found here: + #[prost(string, tag = "3")] + MercurialPoolAddress(::prost::alloc::string::String), + /// / Saber pool address. A full list can be found here: + #[prost(string, tag = "4")] + SaberPoolAddress(::prost::alloc::string::String), + /// / **@deprecated** Use orcaPoolAddress + #[prost(string, tag = "5")] + OrcaPoolTokenMintAddress(::prost::alloc::string::String), + /// / The Raydium liquidity pool ammId. A full list can be found here: + #[prost(string, tag = "6")] + RaydiumPoolAddress(::prost::alloc::string::String), + /// / Pool address for an Orca LP pool or whirlpool. + /// / A full list of Orca LP pools can be found here: + #[prost(string, tag = "7")] + OrcaPoolAddress(::prost::alloc::string::String), + /// / The Port reserve pubkey. A full list can be found here: + #[prost(string, tag = "8")] + PortReserveAddress(::prost::alloc::string::String), + } + } + /// + /// Find and extract text using regular expressions from the previous task's output. + /// + /// _**Input**_: String output from previous task + /// + /// _**Returns**_: The matched string based on the regex pattern and group number + /// + /// _**Example**_: Extract the first number from a string + /// + /// ```json + /// { + /// "regexExtractTask": { + /// "pattern": "\\d+", + /// "groupNumber": 0 + /// } + /// } + /// ``` + /// + /// _**Example**_: Extract text between quotes + /// + /// ```json + /// { + /// "regexExtractTask": { + /// "pattern": "\"(\[^\"\]+)\"", + /// "groupNumber": 1 + /// } + /// } + /// ``` + /// + /// _**Example**_: Extract the first JSON object from a stream + /// + /// ```json + /// { + /// "regexExtractTask": { + /// "pattern": "\\{\[^}\]+\\}" + /// } + /// } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RegexExtractTask { + /// / The regular expression pattern to match against the input string. + /// / Uses the fancy-regex Rust crate syntax. + #[prost(string, optional, tag = "1")] + pub pattern: ::core::option::Option<::prost::alloc::string::String>, + /// / The capture group number to extract (0 returns full match, 1+ returns respective capture group). + /// / Defaults to 0 if not specified. + #[prost(int32, optional, tag = "2")] + pub group_number: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct XStepPriceTask { + #[prost(oneof = "x_step_price_task::StepSource", tags = "1, 2")] + pub step_source: ::core::option::Option, + } + /// Nested message and enum types in `XStepPriceTask`. + pub mod x_step_price_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum StepSource { + /// / median task containing the job definitions to fetch the STEP/USD price + #[prost(message, tag = "1")] + StepJob(super::MedianTask), + /// / existing aggregator pubkey for STEP/USD + #[prost(string, tag = "2")] + StepAggregatorPubkey(::prost::alloc::string::String), + } + } + /// + /// Takes a twap over a set period for a certain aggregator. Aggregators have an optional history buffer account storing the last N accepted results. The TwapTask will iterate over an aggregators history buffer and calculate the time weighted average of the samples within a given time period. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The time weighted average of an aggregator over a given time period. + /// + /// _**Example**_: The 1hr Twap of the SOL/USD Aggregator, requiring at least 60 samples. + /// + /// ```json + /// { "twapTask": { "aggregatorPubkey": "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR", "period": 3600, "minSamples": 60, "weightByPropagationTime": true } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct TwapTask { + /// / The target aggregator for the TWAP. + #[prost(string, optional, tag = "1")] + pub aggregator_pubkey: ::core::option::Option<::prost::alloc::string::String>, + /// / Period, in seconds, the twap should account for + #[prost(int32, optional, tag = "2")] + pub period: ::core::option::Option, + /// / Weight samples by their propagation time + #[prost(bool, optional, tag = "3")] + pub weight_by_propagation_time: ::core::option::Option, + /// / Minimum number of samples in the history to calculate a valid result + #[prost(uint32, optional, tag = "4")] + pub min_samples: ::core::option::Option, + /// / Ending unix timestamp to collect values up to + #[prost(int32, optional, tag = "5")] + pub ending_unix_timestamp: ::core::option::Option, + /// / Execute the task to get the ending unix timestamp + #[prost(message, optional, tag = "6")] + pub ending_unix_timestamp_task: ::core::option::Option, + } + /// / Fetch the latest swap price on Serum's orderbook + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SerumSwapTask { + /// / The serum pool to fetch swap price for + #[prost(string, optional, tag = "1")] + pub serum_pool_address: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Round the current running result to an exponential power. + /// + /// _**Input**_: The current running numerical result. + /// + /// _**Returns**_: The input raised to an exponential power. + /// + /// _**Example**_: Raise 2 to the power of 3, 2^3 + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":2}},{"powTask":{"scalar":3}}\]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PowTask { + #[prost(oneof = "pow_task::Exponent", tags = "1, 2, 3")] + pub exponent: ::core::option::Option, + } + /// Nested message and enum types in `PowTask`. + pub mod pow_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Exponent { + /// / Take the working value to the exponent of value. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Take the working value to the exponent of the aggregators value. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "3")] + Big(::prost::alloc::string::String), + } + } + /// / Fetch the lending rates for various Solana protocols + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LendingRateTask { + /// / 01, apricot, francium, jet, larix, mango, port, solend, tulip + #[prost(string, optional, tag = "1")] + pub protocol: ::core::option::Option<::prost::alloc::string::String>, + /// / A token mint address supported by the chosen protocol + #[prost(string, optional, tag = "2")] + pub asset_mint: ::core::option::Option<::prost::alloc::string::String>, + #[prost(enumeration = "lending_rate_task::Field", optional, tag = "3")] + pub field: ::core::option::Option, + } + /// Nested message and enum types in `LendingRateTask`. + pub mod lending_rate_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Field { + /// / deposit lending rate + DepositRate = 0, + /// / borrow lending rate + BorrowRate = 1, + } + impl Field { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Field::DepositRate => "FIELD_DEPOSIT_RATE", + Field::BorrowRate => "FIELD_BORROW_RATE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "FIELD_DEPOSIT_RATE" => Some(Self::DepositRate), + "FIELD_BORROW_RATE" => Some(Self::BorrowRate), + _ => None, + } + } + } + } + /// / Fetch the current price for a Mango perpetual market + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MangoPerpMarketTask { + /// / Mainnet address for a mango perpetual market. A full list can be found here: + #[prost(string, optional, tag = "1")] + pub perp_market_address: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Fetch the simulated price for a swap on JupiterSwap. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The swap price on Jupiter for a given input and output token mint address. + /// + /// _**Example**_: Fetch the JupiterSwap price for exchanging 1 SOL into USDC. + /// + /// ```json + /// { "jupiterSwapTask": { "inTokenAddress": "So11111111111111111111111111111111111111112", "outTokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } } + /// ``` + /// + /// _**Example**_: Fetch the JupiterSwap price for exchanging 1000 SOL into USDC. + /// + /// ```json + /// { "jupiterSwapTask": { "inTokenAddress": "So11111111111111111111111111111111111111112", "outTokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "baseAmount": "1000" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct JupiterSwapTask { + /// / The input token address. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The output token address. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The allowable slippage on the swap in decimal form (e.g. 0.5 is 0.5% slippage) + #[prost(double, optional, tag = "9")] + pub slippage: ::core::option::Option, + #[prost(enumeration = "jupiter_swap_task::Version", optional, tag = "10")] + pub version: ::core::option::Option, + #[prost(oneof = "jupiter_swap_task::RoutesFilters", tags = "4, 5")] + pub routes_filters: ::core::option::Option, + #[prost(oneof = "jupiter_swap_task::SwapAmount", tags = "3, 6, 7, 8")] + pub swap_amount: ::core::option::Option, + } + /// Nested message and enum types in `JupiterSwapTask`. + pub mod jupiter_swap_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct FilterList { + /// / A list of Jupiter AMM labels to allow or deny (e.g. 'Raydium', 'Orca') + #[prost(string, repeated, tag = "1")] + pub labels: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Version { + V1 = 0, + V2 = 1, + } + impl Version { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Version::V1 => "VERSION_V1", + Version::V2 => "VERSION_V2", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "VERSION_V1" => Some(Self::V1), + "VERSION_V2" => Some(Self::V2), + _ => None, + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum RoutesFilters { + /// / A list of AMM markets to allow. + #[prost(message, tag = "4")] + AllowList(FilterList), + /// / A list of AMM markets to deny. + #[prost(message, tag = "5")] + DenyList(FilterList), + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum SwapAmount { + /// / The amount of `in_token_address` tokens to swap. + #[prost(double, tag = "3")] + BaseAmount(f64), + /// / The amount of `out_token_address` tokens to swap. + #[prost(double, tag = "6")] + QuoteAmount(f64), + /// / The amount of `in_token_address` tokens to swap. + #[prost(string, tag = "7")] + BaseAmountString(::prost::alloc::string::String), + /// / The amount of `out_token_address` tokens to swap. + #[prost(string, tag = "8")] + QuoteAmountString(::prost::alloc::string::String), + } + } + /// / Fetch the current price of a perpetual market. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PerpMarketTask { + #[prost(oneof = "perp_market_task::MarketAddress", tags = "1, 2, 3, 4")] + pub market_address: ::core::option::Option, + } + /// Nested message and enum types in `PerpMarketTask`. + pub mod perp_market_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum MarketAddress { + /// / Market address for a mango perpetual market. A full list can be found here: + #[prost(string, tag = "1")] + MangoMarketAddress(::prost::alloc::string::String), + /// / Market address for a drift perpetual market. A full list can be found here: + #[prost(string, tag = "2")] + DriftMarketAddress(::prost::alloc::string::String), + /// / Market address for a zeta perpetual market. + #[prost(string, tag = "3")] + ZetaMarketAddress(::prost::alloc::string::String), + /// / Market address for a 01 protocol perpetual market. + #[prost(string, tag = "4")] + ZoMarketAddress(::prost::alloc::string::String), + } + } + /// + /// Fetch the current price of a Solana oracle protocol. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The current price of an on-chain oracle. + /// + /// _**Example**_: The Switchboard SOL/USD oracle price. + /// + /// ```json + /// { "oracleTask": { "switchboardAddress": "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR" } } + /// ``` + /// + /// _**Example**_: The Pyth SOL/USD oracle price. + /// + /// ```json + /// { "oracleTask": { "pythAddress": "H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG" } } + /// ``` + /// + /// _**Example**_: The Chainlink SOL/USD oracle price. + /// + /// ```json + /// { "oracleTask": { "chainlinkAddress": "CcPVS9bqyXbD9cLnTbhhHazLsrua8QMFUHTutPtjyDzq" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct OracleTask { + /// / Value (as a percentage) that the lower bound confidence interval is of the actual value. + /// / Confidence intervals that are larger that this treshold are rejected. + /// / + /// / The confidence interval should be provided as a raw percentage value. For example, to + /// / represent 10%, enter the value as 10, not 0.1. + /// + /// Deprecated "pyth_allowed_confidence_interval" + #[prost(double, optional, tag = "4")] + pub pyth_allowed_confidence_interval: ::core::option::Option, + #[prost(message, optional, tag = "5")] + pub chainlink_configs: ::core::option::Option, + #[prost(message, optional, tag = "6")] + pub pyth_configs: ::core::option::Option, + #[prost(message, optional, tag = "9")] + pub switchboard_configs: ::core::option::Option, + #[prost(message, optional, tag = "10")] + pub edge_configs: ::core::option::Option, + #[prost(message, optional, tag = "11")] + pub redstone_configs: ::core::option::Option, + #[prost(oneof = "oracle_task::AggregatorAddress", tags = "1, 2, 3, 7, 8")] + pub aggregator_address: ::core::option::Option, + } + /// Nested message and enum types in `OracleTask`. + pub mod oracle_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ChainlinkConfigs { + #[prost(string, optional, tag = "1")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PythConfigs { + #[prost(string, optional, tag = "1")] + pub hermes_url: ::core::option::Option<::prost::alloc::string::String>, + #[prost(double, optional, tag = "2")] + pub pyth_allowed_confidence_interval: ::core::option::Option, + #[prost(int32, optional, tag = "3")] + pub max_stale_seconds: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SwitchboardConfigs { + #[prost(int32, optional, tag = "1")] + pub version: ::core::option::Option, + #[prost(message, repeated, tag = "2")] + pub jobs: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct EdgeConfigs {} + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RedstoneConfigs {} + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum AggregatorAddress { + /// / Mainnet address of a Switchboard feed. Switchboard is decentralized and allows anyone to build their own feed. + #[prost(string, tag = "1")] + SwitchboardAddress(::prost::alloc::string::String), + /// / Mainnet address for a Pyth feed. A full list can be found here: + #[prost(string, tag = "2")] + PythAddress(::prost::alloc::string::String), + /// / Mainnet address for a Chainlink feed. A full list can be found here: + #[prost(string, tag = "3")] + ChainlinkAddress(::prost::alloc::string::String), + #[prost(string, tag = "7")] + EdgeId(::prost::alloc::string::String), + #[prost(string, tag = "8")] + RedstoneId(::prost::alloc::string::String), + } + } + /// / Load a parse an Anchor based solana account. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct AnchorFetchTask { + /// / Owning program of the account to parse. + #[prost(string, optional, tag = "1")] + pub program_id: ::core::option::Option<::prost::alloc::string::String>, + /// / The account to parse. + #[prost(string, optional, tag = "2")] + pub account_address: ::core::option::Option<::prost::alloc::string::String>, + } + /// / Fetch the JSON representation of an SPL Stake Pool account. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SplStakePoolTask { + /// / The pubkey of the SPL Stake Pool. + #[prost(string, optional, tag = "1")] + pub pubkey: ::core::option::Option<::prost::alloc::string::String>, + } + /// / Fetch the JSON representation of an SPL token mint. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SplTokenParseTask { + #[prost(oneof = "spl_token_parse_task::AccountAddress", tags = "1, 2")] + pub account_address: ::core::option::Option, + } + /// Nested message and enum types in `SplTokenParseTask`. + pub mod spl_token_parse_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum AccountAddress { + /// / The publicKey of a token account to fetch the mintInfo for. + #[prost(string, tag = "1")] + TokenAccountAddress(::prost::alloc::string::String), + /// / The publicKey of the token mint address. + #[prost(string, tag = "2")] + MintAddress(::prost::alloc::string::String), + } + } + /// / Fetch the swap price from UniSwap. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UniswapExchangeRateTask { + /// / The input token address. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The output token address. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The amount of tokens to swap. + #[prost(double, optional, tag = "3")] + pub in_token_amount: ::core::option::Option, + /// / The allowable slippage in percent for the swap. + #[prost(double, optional, tag = "4")] + pub slippage: ::core::option::Option, + /// / The RPC provider to use for the swap. + #[prost(string, optional, tag = "5")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + /// / The version of the Uniswap exchange to use. + #[prost( + enumeration = "uniswap_exchange_rate_task::Version", + optional, + tag = "6" + )] + pub version: ::core::option::Option, + #[prost(string, optional, tag = "7")] + pub router_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "8")] + pub factory_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "9")] + pub quoter_address: ::core::option::Option<::prost::alloc::string::String>, + } + /// Nested message and enum types in `UniswapExchangeRateTask`. + pub mod uniswap_exchange_rate_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Version { + V2Deprecated = 0, + V3Deprecated = 1, + V2 = 2, + V3 = 3, + } + impl Version { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Version::V2Deprecated => "VERSION_V2_DEPRECATED", + Version::V3Deprecated => "VERSION_V3_DEPRECATED", + Version::V2 => "VERSION_V2", + Version::V3 => "VERSION_V3", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "VERSION_V2_DEPRECATED" => Some(Self::V2Deprecated), + "VERSION_V3_DEPRECATED" => Some(Self::V3Deprecated), + "VERSION_V2" => Some(Self::V2), + "VERSION_V3" => Some(Self::V3), + _ => None, + } + } + } + } + /// / Fetch the swap price from SushiSwap. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SushiswapExchangeRateTask { + /// / The input token address. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The output token address. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The amount of tokens to swap. + #[prost(double, optional, tag = "3")] + pub in_token_amount: ::core::option::Option, + /// / The allowable slippage in percent for the swap. + #[prost(double, optional, tag = "4")] + pub slippage: ::core::option::Option, + /// / The RPC provider to use for the swap. + #[prost(string, optional, tag = "5")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + } + /// / Fetch the swap price from PancakeSwap. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PancakeswapExchangeRateTask { + /// / The input token address. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The output token address. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The amount of tokens to swap. + #[prost(double, optional, tag = "3")] + pub in_token_amount: ::core::option::Option, + /// / The allowable slippage in percent for the swap. + #[prost(double, optional, tag = "4")] + pub slippage: ::core::option::Option, + /// / The RPC provider to use for the swap. + #[prost(string, optional, tag = "5")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Execute a job and store the result in a variable to reference later. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The input + /// + /// _**Example**_: CacheTask storing ${ONE} = 1 + /// + /// ```json + /// { "cacheTask": { "cacheItems": \[ { "variableName": "ONE", "job": { "tasks": [ { "valueTask": { "value": 1 } } \] } } ] } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct CacheTask { + /// / A list of cached variables to reference in the job with `${VARIABLE_NAME}`. + #[prost(message, repeated, tag = "1")] + pub cache_items: ::prost::alloc::vec::Vec, + } + /// Nested message and enum types in `CacheTask`. + pub mod cache_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct CacheItem { + /// / The name of the variable to store in cache to reference later with `${VARIABLE_NAME}`. + #[prost(string, optional, tag = "1")] + pub variable_name: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute to yield the value to store in cache. + #[prost(message, optional, tag = "2")] + pub job: ::core::option::Option, + } + } + /// / Return the difference between an oracle's clock and the current timestamp at `SYSVAR_CLOCK_PUBKEY`. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SysclockOffsetTask {} + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MarinadeStateTask {} + /// / Fetch the account data in a stringified buffer format. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SolanaAccountDataFetchTask { + /// / The on-chain account to fetch the account data from. + #[prost(string, optional, tag = "1")] + pub pubkey: ::core::option::Option<::prost::alloc::string::String>, + #[prost( + enumeration = "solana_account_data_fetch_task::Network", + optional, + tag = "2" + )] + pub network: ::core::option::Option, + } + /// Nested message and enum types in `SolanaAccountDataFetchTask`. + pub mod solana_account_data_fetch_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Network { + Mainnet = 0, + Testnet = 1, + Devnet = 2, + } + impl Network { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Network::Mainnet => "NETWORK_MAINNET", + Network::Testnet => "NETWORK_TESTNET", + Network::Devnet => "NETWORK_DEVNET", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "NETWORK_MAINNET" => Some(Self::Mainnet), + "NETWORK_TESTNET" => Some(Self::Testnet), + "NETWORK_DEVNET" => Some(Self::Devnet), + _ => None, + } + } + } + } + /// + /// Return a timestamp from a crontab instruction. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A timestamp + /// + /// _**Example**_: Return the unix timestamp for the on-chain SYSCLOCK + /// + /// ```json + /// {"cronParseTask":{"cronPattern":"* * * * * *","clockOffset":0,"clock":"SYSCLOCK"}} + /// ``` + /// + /// _**Example**_: Return the unix timestamp for next friday at 5pm UTC + /// + /// ```json + /// {"cronParseTask":{"cronPattern":"0 17 * * 5","clockOffset":0,"clock":0}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct CronParseTask { + /// / The cron pattern to parse. + #[prost(string, optional, tag = "1")] + pub cron_pattern: ::core::option::Option<::prost::alloc::string::String>, + /// / The timestamp offset to calculate the next run. + #[prost(int32, optional, tag = "2")] + pub clock_offset: ::core::option::Option, + /// / Use the TaskRunner's clock or the on-chain SYSCLOCK. + #[prost(enumeration = "cron_parse_task::ClockType", optional, tag = "3")] + pub clock: ::core::option::Option, + } + /// Nested message and enum types in `CronParseTask`. + pub mod cron_parse_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum ClockType { + /// / Use the TaskRunners system clock for the current time. + Oracle = 0, + /// / Use the on-chain SYSCLOCK for the current time. + Sysclock = 1, + } + impl ClockType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + ClockType::Oracle => "ORACLE", + ClockType::Sysclock => "SYSCLOCK", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "ORACLE" => Some(Self::Oracle), + "SYSCLOCK" => Some(Self::Sysclock), + _ => None, + } + } + } + } + /// / Return the deserialized value from a stringified buffer. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BufferLayoutParseTask { + /// / The buffer offset to start deserializing from. + #[prost(uint32, optional, tag = "1")] + pub offset: ::core::option::Option, + /// / The endianness of the stored value. + #[prost(enumeration = "buffer_layout_parse_task::Endian", optional, tag = "2")] + pub endian: ::core::option::Option, + /// / The type of value to deserialize. + #[prost( + enumeration = "buffer_layout_parse_task::BufferParseType", + optional, + tag = "3" + )] + pub r#type: ::core::option::Option, + } + /// Nested message and enum types in `BufferLayoutParseTask`. + pub mod buffer_layout_parse_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Endian { + /// Use little endian byte order. + LittleEndian = 0, + /// Use big endian byte order. + BigEndian = 1, + } + impl Endian { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Endian::LittleEndian => "LITTLE_ENDIAN", + Endian::BigEndian => "BIG_ENDIAN", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "LITTLE_ENDIAN" => Some(Self::LittleEndian), + "BIG_ENDIAN" => Some(Self::BigEndian), + _ => None, + } + } + } + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum BufferParseType { + /// / A public key. + Pubkey = 1, + /// / A boolean. + Bool = 2, + /// / An 8-bit unsigned value. + U8 = 3, + /// / An 8-bit signed value. + I8 = 4, + /// / A 16-bit unsigned value. + U16 = 5, + /// / A 16-bit signed value. + I16 = 6, + /// / A 32-bit unsigned value. + U32 = 7, + /// / A 32-bit signed value. + I32 = 8, + /// / A 32-bit IEEE floating point value. + F32 = 9, + /// / A 64-bit unsigned value. + U64 = 10, + /// / A 64-bit signed value. + I64 = 11, + /// / A 64-bit IEEE floating point value. + F64 = 12, + /// / A 128-bit unsigned value. + U128 = 13, + /// / A 128-bit signed value. + I128 = 14, + } + impl BufferParseType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + BufferParseType::Pubkey => "pubkey", + BufferParseType::Bool => "bool", + BufferParseType::U8 => "u8", + BufferParseType::I8 => "i8", + BufferParseType::U16 => "u16", + BufferParseType::I16 => "i16", + BufferParseType::U32 => "u32", + BufferParseType::I32 => "i32", + BufferParseType::F32 => "f32", + BufferParseType::U64 => "u64", + BufferParseType::I64 => "i64", + BufferParseType::F64 => "f64", + BufferParseType::U128 => "u128", + BufferParseType::I128 => "i128", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "pubkey" => Some(Self::Pubkey), + "bool" => Some(Self::Bool), + "u8" => Some(Self::U8), + "i8" => Some(Self::I8), + "u16" => Some(Self::U16), + "i16" => Some(Self::I16), + "u32" => Some(Self::U32), + "i32" => Some(Self::I32), + "f32" => Some(Self::F32), + "u64" => Some(Self::U64), + "i64" => Some(Self::I64), + "f64" => Some(Self::F64), + "u128" => Some(Self::U128), + "i128" => Some(Self::I128), + _ => None, + } + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct HistoryFunctionTask { + #[prost(enumeration = "history_function_task::Method", optional, tag = "1")] + pub method: ::core::option::Option, + #[prost(string, optional, tag = "2")] + pub aggregator_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(uint32, optional, tag = "3")] + pub period: ::core::option::Option, + } + /// Nested message and enum types in `HistoryFunctionTask`. + pub mod history_function_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Method { + Min = 0, + Max = 1, + } + impl Method { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Method::Min => "METHOD_MIN", + Method::Max => "METHOD_MAX", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "METHOD_MIN" => Some(Self::Min), + "METHOD_MAX" => Some(Self::Max), + _ => None, + } + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct VwapTask { + #[prost(string, optional, tag = "1")] + pub price_aggregator_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "2")] + pub volume_aggregator_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(uint32, optional, tag = "3")] + pub period: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct EwmaTask { + #[prost(string, optional, tag = "1")] + pub aggregator_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(int32, optional, tag = "2")] + pub period: ::core::option::Option, + #[prost(double, optional, tag = "3")] + pub lambda: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ComparisonTask { + /// / The type of operator to use on the left (lhs) and right (rhs) operand. + #[prost(enumeration = "comparison_task::Operation", optional, tag = "1")] + pub op: ::core::option::Option, + /// / The OracleJob to execute if the condition evaluates to true. + #[prost(message, optional, tag = "6")] + pub on_true: ::core::option::Option, + /// / The result to use if the condition evaluates to true. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "7")] + pub on_true_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute if the condition evaluates to false. + #[prost(message, optional, tag = "8")] + pub on_false: ::core::option::Option, + /// / The result to use if the condition evaluates to false. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "9")] + pub on_false_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute if the condition fails to evaluate. + #[prost(message, optional, tag = "10")] + pub on_failure: ::core::option::Option, + /// / The result to use if the condition fails to evaluate. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "11")] + pub on_failure_value: ::core::option::Option<::prost::alloc::string::String>, + #[prost(oneof = "comparison_task::Lhs", tags = "2, 3")] + pub lhs: ::core::option::Option, + #[prost(oneof = "comparison_task::Rhs", tags = "4, 5")] + pub rhs: ::core::option::Option, + } + /// Nested message and enum types in `ComparisonTask`. + pub mod comparison_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Operation { + /// / Use the equals to '==' operator. + Eq = 0, + /// / Use the greater than '>' operator. + Gt = 1, + /// / Use the less than '<' operator. + Lt = 2, + } + impl Operation { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Operation::Eq => "OPERATION_EQ", + Operation::Gt => "OPERATION_GT", + Operation::Lt => "OPERATION_LT", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "OPERATION_EQ" => Some(Self::Eq), + "OPERATION_GT" => Some(Self::Gt), + "OPERATION_LT" => Some(Self::Lt), + _ => None, + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Lhs { + /// / OracleJob where the executed result is equal to the left hand side operand. + #[prost(message, tag = "2")] + Lhs(super::super::OracleJob), + /// / String or `${CACHE_KEY}` representing the left hand side operand. + #[prost(string, tag = "3")] + LhsValue(::prost::alloc::string::String), + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Rhs { + /// / OracleJob where the executed result is equal to the right hand side operand. + #[prost(message, tag = "4")] + Rhs(super::super::OracleJob), + /// / String or `${CACHE_KEY}` representing the right hand side operand. + #[prost(string, tag = "5")] + RhsValue(::prost::alloc::string::String), + } + } + /// + /// Round the current running result to a set number of decimal places. + /// + /// _**Input**_: The current running numerical result. + /// + /// _**Returns**_: The running result rounded to a set number of decimal places. + /// + /// _**Example**_: Round down the running resul to 8 decimal places + /// + /// ```json + /// { "roundTask": { "method": "METHOD_ROUND_DOWN", "decimals": 8 } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RoundTask { + /// / The rounding method to use. + #[prost(enumeration = "round_task::Method", optional, tag = "1")] + pub method: ::core::option::Option, + /// / The number of decimals to round to. + #[prost(int32, optional, tag = "2")] + pub decimals: ::core::option::Option, + } + /// Nested message and enum types in `RoundTask`. + pub mod round_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Method { + /// / Round the result down. + RoundUp = 0, + /// / Round the result up. + RoundDown = 1, + } + impl Method { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Method::RoundUp => "METHOD_ROUND_UP", + Method::RoundDown => "METHOD_ROUND_DOWN", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "METHOD_ROUND_UP" => Some(Self::RoundUp), + "METHOD_ROUND_DOWN" => Some(Self::RoundDown), + _ => None, + } + } + } + } + /// + /// Bound the running result to an upper/lower bound. This is typically the last task in an OracleJob. + /// + /// _**Input**_: The current running numerical result. + /// + /// _**Returns**_: The running result bounded to an upper or lower bound if it exceeds a given threshold. + /// + /// _**Example**_: Bound the running result to a value between 0.90 and 1.10 + /// + /// ```json + /// { "boundTask": { "lowerBoundValue": "0.90","onExceedsLowerBoundValue": "0.90","upperBoundValue": "1.10","onExceedsUpperBoundValue": "1.10" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BoundTask { + /// / The OracleJob to execute for the lower bound value. + #[prost(message, optional, tag = "1")] + pub lower_bound: ::core::option::Option, + /// / The value to use for the lower bound. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "2")] + pub lower_bound_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute for the upper bound value. + #[prost(message, optional, tag = "3")] + pub upper_bound: ::core::option::Option, + /// / The value to use for the upper bound. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "4")] + pub upper_bound_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute if the upper bound is exceeded. + #[prost(message, optional, tag = "5")] + pub on_exceeds_upper_bound: ::core::option::Option, + /// / The value to use if the upper bound is exceeded. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "6")] + pub on_exceeds_upper_bound_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute if the lower bound is exceeded. + #[prost(message, optional, tag = "7")] + pub on_exceeds_lower_bound: ::core::option::Option, + /// / The value to use if the lower bound is exceeded. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "8")] + pub on_exceeds_lower_bound_value: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Securely request secrets from a Switchboard SecretsServer that are owned by a specific authority. Any secrets that are returned for the current feed will then be unwrapped into variables to be accessed later. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The input + /// + /// _**Example**_: SecretsTask + /// + /// ```json + /// { "secretsTask": { "authority": "Accb21tUCWocJea6Uk3DgrNZawgmKegDVeHw8cGMDPi5" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SecretsTask { + /// / The authority of the secrets that are to be requested. + #[prost(string, optional, tag = "1")] + pub authority: ::core::option::Option<::prost::alloc::string::String>, + /// / The url of the server to request secrets from. The default is + #[prost(string, optional, tag = "2")] + pub url: ::core::option::Option<::prost::alloc::string::String>, + } + /// / Grab the price of an Sanctum LST relative to SOL. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SanctumLstPriceTask { + /// / The address of the LST mint. + /// / + /// / e.g. INF - 5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm + #[prost(string, optional, tag = "1")] + pub lst_mint: ::core::option::Option<::prost::alloc::string::String>, + /// / Allow the check to see if the LST was cranked for the current epoch to be skipped. + #[prost(bool, optional, tag = "2")] + pub skip_epoch_check: ::core::option::Option, + } + /// / OndoUsdyTask represents a task that computes the price of USDY relative to USD using a + /// / specified strategy. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct OndoUsdyTask { + /// / The strategy used to determine the price of USDY. + #[prost(enumeration = "ondo_usdy_task::Strategy", optional, tag = "1")] + pub strategy: ::core::option::Option, + } + /// Nested message and enum types in `OndoUsdyTask`. + pub mod ondo_usdy_task { + /// / Strategy specifies the method used to determine the price of USDY. + /// / + /// / - STRATEGY_FAIR_VALUE: Computes the price based on a fair value model. + /// / - STRATEGY_MARKET: Fetches the price directly from the market. + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Strategy { + FairValue = 0, + Market = 1, + } + impl Strategy { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Strategy::FairValue => "STRATEGY_FAIR_VALUE", + Strategy::Market => "STRATEGY_MARKET", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "STRATEGY_FAIR_VALUE" => Some(Self::FairValue), + "STRATEGY_MARKET" => Some(Self::Market), + _ => None, + } + } + } + } + /// / Grab the swap price from a Meteora pool. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MeteoraSwapTask { + /// / The address of the pool. + #[prost(string, optional, tag = "1")] + pub pool: ::core::option::Option<::prost::alloc::string::String>, + /// / The pool type. + #[prost(enumeration = "meteora_swap_task::Type", optional, tag = "2")] + pub r#type: ::core::option::Option, + } + /// Nested message and enum types in `MeteoraSwapTask`. + pub mod meteora_swap_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Type { + Dlmm = 0, + Standard = 1, + } + impl Type { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Type::Dlmm => "TYPE_DLMM", + Type::Standard => "TYPE_STANDARD", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "TYPE_DLMM" => Some(Self::Dlmm), + "TYPE_STANDARD" => Some(Self::Standard), + _ => None, + } + } + } + } + /// / Get current time in seconds since Unix epoch. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UnixTimeTask { + /// / The offset to subtract from the current time. + #[prost(int32, optional, tag = "1")] + pub offset: ::core::option::Option, + } + /// + /// Fetch pricing information for Maple Finance assets. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The requested price or value based on the specified method. + /// + /// _**Example**_: Fetch the syrupUSDC fair price from Maple Finance + /// + /// ```json + /// { "mapleFinanceTask": { "method": "METHOD_SYRUP_USDC_FAIR_PRICE" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MapleFinanceTask { + /// / The specific method to use for this task. + #[prost(enumeration = "maple_finance_task::Method", optional, tag = "1")] + pub method: ::core::option::Option, + } + /// Nested message and enum types in `MapleFinanceTask`. + pub mod maple_finance_task { + /// / Specifies the method to use for fetching Maple Finance data. + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Method { + /// / Fetch the fair price of syrupUSDC in the Maple Finance ecosystem. + SyrupUsdcFairPrice = 0, + } + impl Method { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Method::SyrupUsdcFairPrice => "METHOD_SYRUP_USDC_FAIR_PRICE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "METHOD_SYRUP_USDC_FAIR_PRICE" => Some(Self::SyrupUsdcFairPrice), + _ => None, + } + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GlyphTask { + #[prost(string, optional, tag = "1")] + pub pool_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(bool, optional, tag = "2")] + pub zero_for_one: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct CorexTask { + #[prost(string, optional, tag = "1")] + pub in_token: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "2")] + pub out_token: ::core::option::Option<::prost::alloc::string::String>, + #[prost(double, optional, tag = "3")] + pub slippage: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct AftermathTask { + #[prost(string, optional, tag = "1")] + pub pool_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(double, optional, tag = "2")] + pub in_amount: ::core::option::Option, + #[prost(string, optional, tag = "3")] + pub in_coin_type: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "4")] + pub out_coin_type: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Interacts with a Large Language Model (LLM) to generate a text response based on a user-provided prompt. + /// + /// _**Input**_: None + /// + /// _**Returns**_: Text generated by the LLM based on the provided prompt and configuration. + /// + /// _**Example**_: Using OpenAI's GPT-4 model to generate a joke. + /// + /// ```json + /// { + /// "llmTask": { + /// "providerConfig": { + /// "openai": { + /// "model": "gpt-4", + /// "userPrompt": "Tell me a joke.", + /// "temperature": 0.7, + /// "secretNameApiKey": "${OPENAI_API_KEY}" + /// } + /// } + /// } + /// } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LlmTask { + #[prost(oneof = "llm_task::ProviderConfig", tags = "1, 2, 3")] + pub provider_config: ::core::option::Option, + } + /// Nested message and enum types in `LlmTask`. + pub mod llm_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct OpenAiConfig { + #[prost(string, optional, tag = "1")] + pub model: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "2")] + pub user_prompt: ::core::option::Option<::prost::alloc::string::String>, + #[prost(double, optional, tag = "3")] + pub temperature: ::core::option::Option, + #[prost(string, optional, tag = "4")] + pub secret_name_api_key: ::core::option::Option<::prost::alloc::string::String>, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GroqConfig { + #[prost(string, optional, tag = "1")] + pub model: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "2")] + pub user_prompt: ::core::option::Option<::prost::alloc::string::String>, + #[prost(double, optional, tag = "3")] + pub temperature: ::core::option::Option, + #[prost(string, optional, tag = "4")] + pub secret_name_api_key: ::core::option::Option<::prost::alloc::string::String>, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GrokXaiConfig { + #[prost(string, optional, tag = "1")] + pub model: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "2")] + pub user_prompt: ::core::option::Option<::prost::alloc::string::String>, + #[prost(double, optional, tag = "3")] + pub temperature: ::core::option::Option, + #[prost(string, optional, tag = "4")] + pub secret_name_api_key: ::core::option::Option<::prost::alloc::string::String>, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum ProviderConfig { + #[prost(message, tag = "1")] + Openai(OpenAiConfig), + #[prost(message, tag = "2")] + Groq(GroqConfig), + #[prost(message, tag = "3")] + Grokxai(GrokXaiConfig), + } + } + /// + /// Fetch the current price of Solayer's sUSD stablecoin by reading its interest-bearing mint configuration. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The current price of sUSD relative to USD (1.0 = $1.00) + /// + /// _**Example**_: Fetch the current sUSD price + /// + /// ```json + /// { "solayerSusdTask": {} } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SolayerSusdTask {} + /// + /// Fetch pricing information from Curve Finance pools. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The current price/exchange rate from the specified Curve pool. + /// + /// _**Example**_: Fetch the price from a Curve pool on Ethereum + /// + /// ```json + /// { + /// "curveFinanceTask": { + /// "chain": "CHAIN_ETHEREUM", + /// "poolAddress": "0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7", + /// "outDecimals": 18 + /// } + /// } + /// ``` + /// + /// _**Example**_: Fetch the price using a custom RPC provider + /// + /// ```json + /// { + /// "curveFinanceTask": { + /// "chain": "CHAIN_ETHEREUM", + /// "provider": " + /// "poolAddress": "0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7", + /// "outDecimals": 18 + /// } + /// } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct CurveFinanceTask { + /// / Required. Specifies which blockchain to use when reading information from Curve Finance. + #[prost(enumeration = "curve_finance_task::Chain", optional, tag = "1")] + pub chain: ::core::option::Option, + /// / Optional. The RPC endpoint to use for blockchain requests. If not specified, a default RPC will be used which may have rate limits. + #[prost(string, optional, tag = "2")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + /// / The on-chain address of the Curve Finance pool to fetch pricing data from. + #[prost(string, optional, tag = "3")] + pub pool_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The number of decimal places to include in the returned price value. + #[prost(uint32, optional, tag = "4")] + pub out_decimals: ::core::option::Option, + } + /// Nested message and enum types in `CurveFinanceTask`. + pub mod curve_finance_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Chain { + /// / Use the Ethereum blockchain for fetching Curve Finance data + Ethereum = 0, + } + impl Chain { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Chain::Ethereum => "CHAIN_ETHEREUM", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "CHAIN_ETHEREUM" => Some(Self::Ethereum), + _ => None, + } + } + } + } + /// + /// Fetches tETH/WETH redemption rate + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct TurboEthRedemptionRateTask { + #[prost(string, optional, tag = "1")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Fetch the current swap price from a BitFlux pool. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The swap price between the specified input and output tokens. + /// + /// _**Example**_: Fetch the swap price using a custom RPC provider + /// + /// ```json + /// { + /// "bitFluxTask": { + /// "provider": " + /// "poolAddress": "0x0000000000000000000000000000000000000000", + /// "inToken": "0x0000000000000000000000000000000000000000", + /// "outToken": "0x0000000000000000000000000000000000000000" + /// } + /// } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BitFluxTask { + /// / Optional. The RPC endpoint to use for requests. If not specified, a default RPC will be used. + #[prost(string, optional, tag = "1")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + /// / The address of the BitFlux pool. + #[prost(string, optional, tag = "2")] + pub pool_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The address of the input token. + #[prost(string, optional, tag = "3")] + pub in_token: ::core::option::Option<::prost::alloc::string::String>, + /// / The address of the output token. + #[prost(string, optional, tag = "4")] + pub out_token: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Fetch the current price for Fragmetric liquid restaking tokens. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The current price of the specified Fragmetric token relative to SOL (1.0 = 1 SOL) + /// + /// _**Example**_: Fetch the fragSOL token price + /// + /// ```json + /// { "fragmetricTask": { "token": "TOKEN_FRAG_SOL" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct FragmetricTask { + /// / The Fragmetric token to fetch the price for + #[prost(enumeration = "fragmetric_task::Token", optional, tag = "1")] + pub token: ::core::option::Option, + } + /// Nested message and enum types in `FragmetricTask`. + pub mod fragmetric_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Token { + /// / Fragmetric's liquid restaking token (fragSOL) + FragSol = 0, + /// / Fragmetric's native staking token (nSOL) + NSol = 1, + } + impl Token { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Token::FragSol => "TOKEN_FRAG_SOL", + Token::NSol => "TOKEN_N_SOL", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "TOKEN_FRAG_SOL" => Some(Self::FragSol), + "TOKEN_N_SOL" => Some(Self::NSol), + _ => None, + } + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct EtherfuseTask { + #[prost(enumeration = "etherfuse_task::Token", optional, tag = "1")] + pub token: ::core::option::Option, + } + /// Nested message and enum types in `EtherfuseTask`. + pub mod etherfuse_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Token { + Cetes = 0, + Ustry = 1, + Eurob = 2, + Tesouro = 3, + Gilts = 4, + } + impl Token { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Token::Cetes => "TOKEN_CETES", + Token::Ustry => "TOKEN_USTRY", + Token::Eurob => "TOKEN_EUROB", + Token::Tesouro => "TOKEN_TESOURO", + Token::Gilts => "TOKEN_GILTS", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "TOKEN_CETES" => Some(Self::Cetes), + "TOKEN_USTRY" => Some(Self::Ustry), + "TOKEN_EUROB" => Some(Self::Eurob), + "TOKEN_TESOURO" => Some(Self::Tesouro), + "TOKEN_GILTS" => Some(Self::Gilts), + _ => None, + } + } + } + } + /// + /// Query historical yield data for a given Liquid Staking Token (LST) + /// and perform a statistical reduction operation over the dataset. + /// + /// _**Input**_: LST mint address, reduction operation type, and number of epochs to sample. + /// + /// _**Returns**_: The computed yield value based on the specified operation. + /// + /// _**Example**_: Compute the median APY for an LST over the last 100 epochs + /// + /// ```json + /// { + /// "lstHistoricalYieldTask": { + /// "lstMint": "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn", + /// "operation": "OPERATION_MEDIAN", + /// "epochs": 100 + /// } + /// } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LstHistoricalYieldTask { + /// / Required. The LST mint address for which historical yield data is queried. + #[prost(string, optional, tag = "1")] + pub lst_mint: ::core::option::Option<::prost::alloc::string::String>, + /// / Required. The statistical operation to apply to the historical yield dataset. + #[prost( + enumeration = "lst_historical_yield_task::Operation", + optional, + tag = "2" + )] + pub operation: ::core::option::Option, + /// / Optional. The number of epochs to sample for the computation. + /// / - If `epochs = 0`, all available historical data will be used. + /// / - If `epochs > 0`, only the last `epochs` entries will be included. + #[prost(int32, optional, tag = "3")] + pub epochs: ::core::option::Option, + } + /// Nested message and enum types in `LstHistoricalYieldTask`. + pub mod lst_historical_yield_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Operation { + Median = 0, + Mean = 1, + Min = 2, + Max = 3, + } + impl Operation { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Operation::Median => "OPERATION_MEDIAN", + Operation::Mean => "OPERATION_MEAN", + Operation::Min => "OPERATION_MIN", + Operation::Max => "OPERATION_MAX", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "OPERATION_MEDIAN" => Some(Self::Median), + "OPERATION_MEAN" => Some(Self::Mean), + "OPERATION_MIN" => Some(Self::Min), + "OPERATION_MAX" => Some(Self::Max), + _ => None, + } + } + } + } + /// + /// Execute a swap task in the Pump AMM based on the given parameters. + /// + /// _**Input**_: Pool address, input token amount, max allowed slippage, and swap direction. + /// + /// _**Returns**_: Executes the swap operation in the Pump AMM with the given parameters. + /// + /// _**Example**_: Swap 10 tokens from X to Y with a maximum slippage of 0.5% + /// + /// ```json + /// { + /// "pumpAmmTask": { + /// "pool_address": "Gf7sXMoP8iRw4iiXmJ1nq4vxcRycbGXy5RL8a8LnTd3v", + /// "in_amount": "10", + /// "max_slippage": 0.5, + /// "is_x_for_y": true + /// } + /// } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PumpAmmTask { + /// / Required. The address of the liquidity pool in the Pump AMM. + #[prost(string, optional, tag = "1")] + pub pool_address: ::core::option::Option<::prost::alloc::string::String>, + /// / Optional. The input token amount for the swap. + /// / - This value should in full units of the input token. + /// / - Default value: `1` (Swap 1 full token). + #[prost(double, optional, tag = "2")] + pub in_amount: ::core::option::Option, + /// / Optional. The maximum allowed slippage for the swap, expressed as a percentage. + /// / - Example: `0.5` represents 0.5% slippage tolerance. + /// / - Default value: `3` (3% slippage tolerance). + #[prost(double, optional, tag = "3")] + pub max_slippage: ::core::option::Option, + /// / Optional. Indicates the swap direction: + /// / - `true`: Swapping token X for token Y. + /// / - `false`: Swapping token Y for token X. + /// / - Default value: `true`. + #[prost(bool, optional, tag = "4")] + pub is_x_for_y: ::core::option::Option, + } + /// + /// Derive the fair LP token price for a given Pump AMM liquidity pool. + /// + /// _**Input**_: Pool address, X token price job, Y token price job. + /// _**Returns**_: The fair LP token price for the given Pump AMM liquidity pool. + /// _**Example**_: Derive the fair LP token price for a given Pump AMM liquidity pool. + /// ```json + /// { + /// "pumpAmmLpTokenPriceTask": { + /// "pool_address": "Gf7sXMoP8iRw4iiXmJ1nq4vxcRycbGXy5RL8a8LnTd3v", // USDC/SOL + /// "x_price_job": { + /// "oracleTask": { + /// "switchboardAddress": "..." // USDC/USD + /// } + /// }, + /// "y_price_job": { + /// "oracleTask": { + /// "switchboardAddress": "..." // SOL/USD + /// } + /// } + /// } + /// } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PumpAmmLpTokenPriceTask { + /// / Required. The address of the liquidity pool in the Pump AMM. + #[prost(string, optional, tag = "1")] + pub pool_address: ::core::option::Option<::prost::alloc::string::String>, + /// / Required. The job to execute to fetch the price of the pool x token + #[prost(message, optional, tag = "2")] + pub x_price_job: ::core::option::Option, + /// / Required. The job to execute + #[prost(message, optional, tag = "3")] + pub y_price_job: ::core::option::Option, + } + /// + /// Get the exchange rate between and Exponent vault pricipal token and + /// underlying token. + /// _**Input**_: Vault address + /// _**Returns**_: The exchange rate between the vault principal token and + /// underlying token. + /// _**Example**_: Get the exchange rate between the vault principal token and + /// underlying token. + /// ```json + /// { + /// "exponentTask": { + /// "vault": "9YbaicMsXrtupkpD72pdWBfU6R7EJfSByw75sEpDM1uH" + /// } + /// } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ExponentTask { + #[prost(string, optional, tag = "1")] + pub vault: ::core::option::Option<::prost::alloc::string::String>, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ExponentPtLinearPricingTask { + #[prost(string, optional, tag = "1")] + pub vault: ::core::option::Option<::prost::alloc::string::String>, + #[prost(double, optional, tag = "2")] + pub start_price: ::core::option::Option, + } + /// + /// Apply Solana Token 2022 extension modifiers to a feed. + /// _**Input**_: Token address and extension type. + /// _**Returns**_: The value associated with the token2022 extension. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SolanaToken2022ExtensionTask { + #[prost(string, optional, tag = "1")] + pub mint: ::core::option::Option<::prost::alloc::string::String>, + #[prost( + enumeration = "solana_token2022_extension_task::Token2022Extension", + optional, + tag = "2" + )] + pub extension: ::core::option::Option, + } + /// Nested message and enum types in `SolanaToken2022ExtensionTask`. + pub mod solana_token2022_extension_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Token2022Extension { + Token2022ScaledAmountFactor = 0, + } + impl Token2022Extension { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Token2022Extension::Token2022ScaledAmountFactor => { + "TOKEN_2022_SCALED_AMOUNT_FACTOR" + } + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "TOKEN_2022_SCALED_AMOUNT_FACTOR" => Some(Self::Token2022ScaledAmountFactor), + _ => None, + } + } + } + } + /// + /// Fetch a *live* spot price straight out of the global **Surge** websocket + /// cache – the same cache that powers our high-speed on-chain oracles. + /// + /// _**Input**_ + /// • `symbol` – the trading-pair symbol as it appears on the exchange + /// • `source` – which exchange’s stream to read from + /// • `BINANCE` (weight 3) + /// • `BYBIT` (weight 2) + /// • `OKX` (weight 2) + /// • `COINBASE` (weight 1) + /// • `WEIGHTED` (default) – use the *weighted median* of all + /// fresh quotes (<= 5 s old) with the weights shown above. + /// + /// _**Returns**_ + /// The most recent price available from the chosen source. + /// The task fails if the cached tick is older than **5 s**. + /// + /// _**Example**_: Pull the Binance price for BTC / USDT + /// ```json + /// { + /// "switchboardSurgeTask": { + /// "source": "BINANCE", + /// "symbol": "BTCUSDT" + /// } + /// } + /// ``` + /// + /// _**Example**_: Use the weighted-median oracle for BTC / USDT + /// ```json + /// { + /// "switchboardSurgeTask": { + /// "source": "WEIGHTED", // or omit — WEIGHTED is the default + /// "symbol": "BTCUSDT" + /// } + /// } + /// ``` + /// + /// _**Notes**_ + /// • Symbols are auto-normalised (case-insensitive, punctuation removed). + /// • If a venue’s price is stale (> 5 s) it is ignored in the WEIGHTED + /// calculation. The task errors if **no** fresh price remains. + /// • The weighted-median algorithm is the same one Hyperliquid uses in + /// production: cumulative weights 3 / 2 / 2 / 1 / 1 / 1 / 1 / 1 across the + /// eight venues (we currently stream the first four). + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SwitchboardSurgeTask { + /// Determines which source will be used for pricing. + /// Default: WEIGHTED average across all sources. + #[prost(enumeration = "switchboard_surge_task::Source", optional, tag = "1")] + pub source: ::core::option::Option, + #[prost(string, optional, tag = "2")] + pub symbol: ::core::option::Option<::prost::alloc::string::String>, + } + /// Nested message and enum types in `SwitchboardSurgeTask`. + pub mod switchboard_surge_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Source { + Weighted = 0, + Binance = 1, + Okx = 2, + Bybit = 3, + Coinbase = 4, + } + impl Source { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Source::Weighted => "WEIGHTED", + Source::Binance => "BINANCE", + Source::Okx => "OKX", + Source::Bybit => "BYBIT", + Source::Coinbase => "COINBASE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "WEIGHTED" => Some(Self::Weighted), + "BINANCE" => Some(Self::Binance), + "OKX" => Some(Self::Okx), + "BYBIT" => Some(Self::Bybit), + "COINBASE" => Some(Self::Coinbase), + _ => None, + } + } + } + } + /// / Represents a singular operation performed by an oracle to yield an eventual numerical result. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Task { + #[prost( + oneof = "task::Task", + tags = "1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70" + )] + pub task: ::core::option::Option, + } + /// Nested message and enum types in `Task`. + pub mod task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Task { + #[prost(message, tag = "1")] + HttpTask(super::HttpTask), + #[prost(message, tag = "2")] + JsonParseTask(super::JsonParseTask), + #[prost(message, tag = "4")] + MedianTask(super::MedianTask), + #[prost(message, tag = "5")] + MeanTask(super::MeanTask), + #[prost(message, tag = "6")] + WebsocketTask(super::WebsocketTask), + #[prost(message, tag = "7")] + DivideTask(super::DivideTask), + #[prost(message, tag = "8")] + MultiplyTask(super::MultiplyTask), + #[prost(message, tag = "9")] + LpTokenPriceTask(super::LpTokenPriceTask), + #[prost(message, tag = "10")] + LpExchangeRateTask(super::LpExchangeRateTask), + #[prost(message, tag = "11")] + ConditionalTask(super::ConditionalTask), + #[prost(message, tag = "12")] + ValueTask(super::ValueTask), + #[prost(message, tag = "13")] + MaxTask(super::MaxTask), + #[prost(message, tag = "14")] + RegexExtractTask(super::RegexExtractTask), + #[prost(message, tag = "15")] + XstepPriceTask(super::XStepPriceTask), + #[prost(message, tag = "16")] + AddTask(super::AddTask), + #[prost(message, tag = "17")] + SubtractTask(super::SubtractTask), + #[prost(message, tag = "18")] + TwapTask(super::TwapTask), + #[prost(message, tag = "19")] + SerumSwapTask(super::SerumSwapTask), + #[prost(message, tag = "20")] + PowTask(super::PowTask), + #[prost(message, tag = "21")] + LendingRateTask(super::LendingRateTask), + #[prost(message, tag = "22")] + MangoPerpMarketTask(super::MangoPerpMarketTask), + #[prost(message, tag = "23")] + JupiterSwapTask(super::JupiterSwapTask), + #[prost(message, tag = "24")] + PerpMarketTask(super::PerpMarketTask), + #[prost(message, tag = "25")] + OracleTask(super::OracleTask), + #[prost(message, tag = "26")] + AnchorFetchTask(super::AnchorFetchTask), + #[prost(message, tag = "29")] + SplStakePoolTask(super::SplStakePoolTask), + #[prost(message, tag = "30")] + SplTokenParseTask(super::SplTokenParseTask), + #[prost(message, tag = "31")] + UniswapExchangeRateTask(super::UniswapExchangeRateTask), + #[prost(message, tag = "32")] + SushiswapExchangeRateTask(super::SushiswapExchangeRateTask), + #[prost(message, tag = "33")] + PancakeswapExchangeRateTask(super::PancakeswapExchangeRateTask), + #[prost(message, tag = "34")] + CacheTask(super::CacheTask), + #[prost(message, tag = "35")] + SysclockOffsetTask(super::SysclockOffsetTask), + #[prost(message, tag = "36")] + MarinadeStateTask(super::MarinadeStateTask), + #[prost(message, tag = "37")] + SolanaAccountDataFetchTask(super::SolanaAccountDataFetchTask), + #[prost(message, tag = "38")] + BufferLayoutParseTask(super::BufferLayoutParseTask), + #[prost(message, tag = "39")] + CronParseTask(super::CronParseTask), + #[prost(message, tag = "40")] + MinTask(super::MinTask), + #[prost(message, tag = "41")] + HistoryFunctionTask(super::HistoryFunctionTask), + #[prost(message, tag = "42")] + VwapTask(super::VwapTask), + #[prost(message, tag = "43")] + EwmaTask(super::EwmaTask), + #[prost(message, tag = "44")] + ComparisonTask(super::ComparisonTask), + #[prost(message, tag = "45")] + RoundTask(super::RoundTask), + #[prost(message, tag = "46")] + BoundTask(super::BoundTask), + #[prost(message, tag = "47")] + SecretsTask(super::SecretsTask), + #[prost(message, tag = "48")] + SanctumLstPriceTask(super::SanctumLstPriceTask), + #[prost(message, tag = "49")] + OndoUsdyTask(super::OndoUsdyTask), + #[prost(message, tag = "50")] + MeteoraSwapTask(super::MeteoraSwapTask), + #[prost(message, tag = "51")] + UnixTimeTask(super::UnixTimeTask), + #[prost(message, tag = "52")] + MapleFinanceTask(super::MapleFinanceTask), + #[prost(message, tag = "53")] + GlyphTask(super::GlyphTask), + #[prost(message, tag = "54")] + CorexTask(super::CorexTask), + #[prost(message, tag = "55")] + LlmTask(super::LlmTask), + #[prost(message, tag = "56")] + SolayerSusdTask(super::SolayerSusdTask), + #[prost(message, tag = "57")] + CurveFinanceTask(super::CurveFinanceTask), + #[prost(message, tag = "58")] + TurboEthRedemptionRateTask(super::TurboEthRedemptionRateTask), + #[prost(message, tag = "59")] + BitFluxTask(super::BitFluxTask), + #[prost(message, tag = "60")] + FragmetricTask(super::FragmetricTask), + #[prost(message, tag = "61")] + AftermathTask(super::AftermathTask), + #[prost(message, tag = "63")] + EtherfuseTask(super::EtherfuseTask), + #[prost(message, tag = "64")] + LstHistoricalYieldTask(super::LstHistoricalYieldTask), + #[prost(message, tag = "65")] + PumpAmmTask(super::PumpAmmTask), + #[prost(message, tag = "66")] + PumpAmmLpTokenPriceTask(super::PumpAmmLpTokenPriceTask), + #[prost(message, tag = "67")] + ExponentTask(super::ExponentTask), + #[prost(message, tag = "68")] + ExponentPtLinearPricingTask(super::ExponentPtLinearPricingTask), + #[prost(message, tag = "69")] + SolanaToken2022ExtensionTask(super::SolanaToken2022ExtensionTask), + #[prost(message, tag = "70")] + SwitchboardSurgeTask(super::SwitchboardSurgeTask), + } + } +} +/// Encoded file descriptor set for the `oracle_job` package +pub const FILE_DESCRIPTOR_SET: &[u8] = &[ + 0x0a, 0xe4, 0xbf, 0x05, 0x0a, 0x11, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x22, 0xe3, 0x96, 0x01, 0x0a, 0x09, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x12, 0x30, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x31, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x1a, 0xa0, 0x02, 0x0a, 0x08, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x6c, 0x12, 0x3d, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x12, 0x3f, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x62, 0x6f, 0x64, 0x79, 0x1a, 0x30, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3c, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x4b, 0x4f, + 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x47, + 0x45, 0x54, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x50, + 0x4f, 0x53, 0x54, 0x10, 0x02, 0x1a, 0xd9, 0x01, 0x0a, 0x0d, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x64, 0x0a, 0x12, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4a, + 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x41, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x11, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x22, 0x4e, 0x0a, 0x11, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, + 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x58, + 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x55, 0x4d, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x4d, + 0x45, 0x41, 0x4e, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x4e, 0x10, + 0x05, 0x1a, 0xcd, 0x01, 0x0a, 0x0a, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x30, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0x36, 0x0a, + 0x17, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, + 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x1a, 0x67, 0x0a, 0x08, 0x4d, 0x65, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x30, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x29, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x1a, 0x66, 0x0a, 0x07, 0x4d, 0x61, + 0x78, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x30, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, + 0x62, 0x73, 0x1a, 0x66, 0x0a, 0x07, 0x4d, 0x69, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x30, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x29, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x1a, 0x99, 0x01, 0x0a, 0x09, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x16, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x2d, 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, + 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, + 0x12, 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, + 0x62, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x03, 0x68, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x03, 0x68, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x04, 0x75, 0x74, 0x66, 0x38, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x75, 0x74, 0x66, 0x38, 0x42, 0x07, 0x0a, + 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x8e, 0x01, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, + 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6d, 0x61, + 0x78, 0x44, 0x61, 0x74, 0x61, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x1a, 0x82, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x34, 0x0a, 0x07, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x09, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x1a, 0xa3, 0x01, 0x0a, + 0x0a, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x06, 0x73, + 0x63, 0x61, 0x6c, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x73, + 0x63, 0x61, 0x6c, 0x61, 0x72, 0x12, 0x2d, 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x10, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x00, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, + 0x12, 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, + 0x62, 0x69, 0x67, 0x42, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x1a, 0xa2, 0x01, 0x0a, 0x0c, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x12, 0x2d, 0x0a, + 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x03, + 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x48, 0x00, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x12, 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x62, 0x69, 0x67, 0x42, 0x0a, 0x0a, 0x08, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x1a, 0x9d, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x12, 0x2d, 0x0a, + 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x03, + 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x48, 0x00, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x12, 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x62, 0x69, 0x67, 0x42, 0x0a, 0x0a, 0x08, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa5, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x61, 0x6c, + 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x61, 0x6c, + 0x61, 0x72, 0x12, 0x2d, 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x10, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x12, 0x29, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x00, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x12, 0x0a, 0x03, + 0x62, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x62, 0x69, 0x67, + 0x42, 0x0d, 0x0a, 0x0b, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x82, 0x03, 0x0a, 0x10, 0x4c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x36, 0x0a, 0x16, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, + 0x6c, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, + 0x6c, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x0a, 0x12, + 0x73, 0x61, 0x62, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x61, 0x62, 0x65, + 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, 0x0a, 0x11, + 0x6f, 0x72, 0x63, 0x61, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x6f, 0x72, 0x63, 0x61, 0x50, + 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x72, 0x61, + 0x79, 0x64, 0x69, 0x75, 0x6d, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x12, 0x72, 0x61, 0x79, 0x64, + 0x69, 0x75, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, + 0x0a, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x46, 0x65, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x12, 0x3d, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x6a, + 0x6f, 0x62, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x52, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x46, 0x65, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, + 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x5f, 0x66, 0x61, 0x69, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x46, 0x61, 0x69, 0x72, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x1a, 0xa5, 0x04, 0x0a, 0x12, 0x4c, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, 0x69, + 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x6f, + 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x61, 0x62, + 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x61, 0x62, 0x65, 0x72, 0x50, 0x6f, + 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x44, 0x0a, 0x1c, 0x6f, 0x72, 0x63, + 0x61, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, + 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x18, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x32, 0x0a, 0x14, 0x72, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x12, 0x72, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x72, 0x63, 0x61, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0f, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x32, 0x0a, 0x14, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x12, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x44, 0x0a, 0x05, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x70, 0x45, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x52, 0x05, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x0a, 0x05, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x4f, 0x4c, 0x41, 0x4e, 0x41, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x43, 0x4c, 0x49, 0x50, 0x53, 0x45, 0x10, 0x01, 0x42, 0x0d, 0x0a, + 0x0b, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x4f, 0x0a, 0x10, + 0x52, 0x65, 0x67, 0x65, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x1a, 0x95, 0x01, + 0x0a, 0x0e, 0x58, 0x53, 0x74, 0x65, 0x70, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x3d, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, + 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x65, 0x70, 0x4a, 0x6f, 0x62, 0x12, + 0x36, 0x0a, 0x16, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x14, 0x73, 0x74, 0x65, 0x70, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x53, 0x74, 0x65, 0x70, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xc3, 0x02, 0x0a, 0x08, 0x54, 0x77, 0x61, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x3b, 0x0a, 0x1a, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x78, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x60, 0x0a, 0x1a, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x17, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x78, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x3d, 0x0a, 0x0d, 0x53, + 0x65, 0x72, 0x75, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x2c, 0x0a, 0x12, + 0x73, 0x65, 0x72, 0x75, 0x6d, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x50, + 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x72, 0x0a, 0x07, 0x50, 0x6f, + 0x77, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x12, + 0x2d, 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x62, + 0x69, 0x67, 0x42, 0x0a, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0xc7, + 0x01, 0x0a, 0x0f, 0x4c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x41, 0x0a, + 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x22, 0x36, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x49, 0x45, + 0x4c, 0x44, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x10, + 0x00, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x42, 0x4f, 0x52, 0x52, 0x4f, + 0x57, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x10, 0x01, 0x1a, 0x45, 0x0a, 0x13, 0x4d, 0x61, 0x6e, 0x67, + 0x6f, 0x50, 0x65, 0x72, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x2e, 0x0a, 0x13, 0x70, 0x65, 0x72, 0x70, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x65, + 0x72, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, + 0x8a, 0x05, 0x0a, 0x0f, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, + 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x51, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x09, + 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, + 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x08, 0x64, 0x65, 0x6e, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21, 0x0a, + 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x01, 0x48, 0x01, 0x52, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x23, 0x0a, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x0b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x10, 0x62, 0x61, 0x73, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x13, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x11, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, + 0x61, 0x67, 0x65, 0x12, 0x47, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4a, 0x75, 0x70, 0x69, + 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x24, 0x0a, 0x0a, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, + 0x0a, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x00, 0x12, 0x0e, 0x0a, + 0x0a, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x10, 0x01, 0x42, 0x0f, 0x0a, + 0x0d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0c, + 0x0a, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0xe9, 0x01, 0x0a, + 0x0e, 0x50, 0x65, 0x72, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x32, 0x0a, 0x14, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x12, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x64, 0x72, 0x69, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x12, 0x64, 0x72, 0x69, 0x66, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x7a, 0x65, 0x74, 0x61, 0x5f, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, 0x7a, 0x65, 0x74, 0x61, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x7a, 0x6f, 0x5f, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x7a, 0x6f, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0xc5, 0x08, 0x0a, 0x0a, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x31, 0x0a, 0x13, 0x73, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x12, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x70, 0x79, + 0x74, 0x68, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0b, 0x70, 0x79, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x2d, 0x0a, 0x11, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, + 0x0a, 0x07, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x06, 0x65, 0x64, 0x67, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0b, 0x72, 0x65, 0x64, + 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0a, 0x72, 0x65, 0x64, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x20, + 0x70, 0x79, 0x74, 0x68, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1d, 0x70, 0x79, 0x74, 0x68, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x5e, 0x0a, 0x11, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x73, 0x52, 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x4f, 0x0a, 0x0c, 0x70, 0x79, 0x74, 0x68, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x50, 0x79, + 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x0b, 0x70, 0x79, 0x74, 0x68, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x64, 0x0a, 0x13, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x12, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x4f, 0x0a, 0x0c, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x45, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x52, 0x0b, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x5b, 0x0a, + 0x10, 0x72, 0x65, 0x64, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x52, 0x65, 0x64, 0x73, 0x74, 0x6f, + 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x64, 0x73, 0x74, + 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x2e, 0x0a, 0x10, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0xa1, 0x01, 0x0a, 0x0b, 0x50, + 0x79, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x65, + 0x72, 0x6d, 0x65, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x68, 0x65, 0x72, 0x6d, 0x65, 0x73, 0x55, 0x72, 0x6c, 0x12, 0x47, 0x0a, 0x20, 0x70, 0x79, 0x74, + 0x68, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x1d, 0x70, 0x79, 0x74, 0x68, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6d, + 0x61, 0x78, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x1a, 0x59, + 0x0a, 0x12, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, + 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x45, 0x64, 0x67, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x11, 0x0a, 0x0f, 0x52, 0x65, 0x64, 0x73, + 0x74, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x41, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x1a, 0x59, 0x0a, 0x0f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x2a, 0x0a, 0x10, 0x53, + 0x70, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x1a, 0x80, 0x01, 0x0a, 0x11, 0x53, 0x70, 0x6c, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x34, 0x0a, + 0x15, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x69, 0x6e, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0xf8, 0x03, 0x0a, 0x17, 0x55, + 0x6e, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, + 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x75, 0x74, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, + 0x0e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x22, 0x5f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x19, 0x0a, 0x15, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x5f, 0x44, 0x45, + 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x56, 0x45, + 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x33, 0x5f, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x56, 0x32, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x56, 0x33, 0x10, 0x03, 0x1a, 0xd1, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x73, 0x68, 0x69, 0x73, + 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, + 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x6e, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0xd3, 0x01, 0x0a, 0x1b, 0x50, 0x61, + 0x6e, 0x63, 0x61, 0x6b, 0x65, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, + 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, + 0xb2, 0x01, 0x0a, 0x09, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, + 0x0b, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x59, 0x0a, 0x09, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x03, 0x6a, + 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, + 0x03, 0x6a, 0x6f, 0x62, 0x1a, 0x14, 0x0a, 0x12, 0x53, 0x79, 0x73, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x0a, 0x11, 0x4d, 0x61, + 0x72, 0x69, 0x6e, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x1a, + 0xd1, 0x01, 0x0a, 0x1a, 0x53, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x52, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, + 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x47, 0x0a, 0x07, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, + 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x45, + 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x01, 0x12, + 0x12, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x44, 0x45, 0x56, 0x4e, 0x45, + 0x54, 0x10, 0x02, 0x1a, 0xc1, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x43, 0x0a, 0x05, 0x63, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, + 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x25, 0x0a, 0x09, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x4f, 0x52, 0x41, 0x43, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x59, 0x53, + 0x43, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x01, 0x1a, 0x8f, 0x03, 0x0a, 0x15, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x4a, 0x0a, 0x06, 0x65, 0x6e, 0x64, + 0x69, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x45, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x52, 0x06, 0x65, + 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x12, 0x4f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2b, 0x0a, 0x06, 0x45, 0x6e, 0x64, 0x69, 0x61, 0x6e, + 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x49, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x45, 0x4e, 0x44, 0x49, 0x41, + 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x49, 0x47, 0x5f, 0x45, 0x4e, 0x44, 0x49, 0x41, + 0x4e, 0x10, 0x01, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x06, 0x0a, + 0x02, 0x75, 0x38, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x69, 0x38, 0x10, 0x04, 0x12, 0x07, 0x0a, + 0x03, 0x75, 0x31, 0x36, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x69, 0x31, 0x36, 0x10, 0x06, 0x12, + 0x07, 0x0a, 0x03, 0x75, 0x33, 0x32, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x69, 0x33, 0x32, 0x10, + 0x08, 0x12, 0x07, 0x0a, 0x03, 0x66, 0x33, 0x32, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x75, 0x36, + 0x34, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x69, 0x36, 0x34, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, + 0x66, 0x36, 0x34, 0x10, 0x0c, 0x12, 0x08, 0x0a, 0x04, 0x75, 0x31, 0x32, 0x38, 0x10, 0x0d, 0x12, + 0x08, 0x0a, 0x04, 0x69, 0x31, 0x32, 0x38, 0x10, 0x0e, 0x1a, 0xd0, 0x01, 0x0a, 0x13, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x48, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x22, 0x28, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x0e, 0x0a, 0x0a, + 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, + 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x01, 0x1a, 0x98, 0x01, 0x0a, + 0x08, 0x56, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x1a, 0x69, 0x0a, 0x08, 0x45, 0x77, 0x6d, 0x61, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x2d, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, + 0x6d, 0x62, 0x64, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x6c, 0x61, 0x6d, 0x62, + 0x64, 0x61, 0x1a, 0xc1, 0x04, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2e, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x29, 0x0a, 0x03, 0x6c, 0x68, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x68, 0x73, + 0x12, 0x1d, 0x0a, 0x09, 0x6c, 0x68, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x68, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x29, 0x0a, 0x03, 0x72, 0x68, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x48, 0x01, 0x52, 0x03, 0x72, 0x68, 0x73, 0x12, 0x1d, 0x0a, 0x09, 0x72, 0x68, + 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x08, 0x72, 0x68, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x52, 0x06, 0x6f, 0x6e, 0x54, 0x72, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x75, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x6f, 0x6e, 0x54, 0x72, 0x75, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, + 0x08, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x07, 0x6f, 0x6e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x12, + 0x24, 0x0a, 0x0e, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6e, 0x46, 0x61, 0x6c, 0x73, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x52, 0x09, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6f, + 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x41, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x45, 0x51, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x47, 0x54, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x54, 0x10, 0x02, 0x42, 0x05, 0x0a, 0x03, 0x4c, 0x48, 0x53, 0x42, + 0x05, 0x0a, 0x03, 0x52, 0x48, 0x53, 0x1a, 0x9d, 0x01, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x6e, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x52, 0x6f, 0x75, 0x6e, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, + 0x22, 0x34, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x45, + 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x55, 0x50, 0x10, 0x00, 0x12, + 0x15, 0x0a, 0x11, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x5f, + 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x1a, 0xeb, 0x03, 0x0a, 0x09, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x36, 0x0a, 0x0b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, + 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x12, 0x2a, 0x0a, 0x11, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4a, 0x0a, 0x16, + 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x52, 0x13, 0x6f, 0x6e, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x55, 0x70, + 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3e, 0x0a, 0x1c, 0x6f, 0x6e, 0x5f, 0x65, + 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, + 0x6f, 0x6e, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4a, 0x0a, 0x16, 0x6f, 0x6e, 0x5f, 0x65, + 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, + 0x13, 0x6f, 0x6e, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3e, 0x0a, 0x1c, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x65, + 0x64, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6f, 0x6e, 0x45, 0x78, + 0x63, 0x65, 0x65, 0x64, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x3d, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x1a, 0x5a, 0x0a, 0x13, 0x53, 0x61, 0x6e, 0x63, 0x74, 0x75, 0x6d, 0x4c, 0x73, + 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x73, + 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x73, + 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, + 0x91, 0x01, 0x0a, 0x0c, 0x4f, 0x6e, 0x64, 0x6f, 0x55, 0x73, 0x64, 0x79, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x47, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x6e, 0x64, 0x6f, 0x55, 0x73, + 0x64, 0x79, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, + 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x38, 0x0a, 0x08, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, + 0x59, 0x5f, 0x46, 0x41, 0x49, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x00, 0x12, 0x13, + 0x0a, 0x0f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, + 0x54, 0x10, 0x01, 0x1a, 0x8f, 0x01, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, 0x53, + 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x2e, 0x4d, 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x28, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4c, 0x4d, 0x4d, + 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, + 0x41, 0x52, 0x44, 0x10, 0x01, 0x1a, 0x26, 0x0a, 0x0c, 0x55, 0x6e, 0x69, 0x78, 0x54, 0x69, 0x6d, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x1a, 0x85, 0x01, + 0x0a, 0x10, 0x4d, 0x61, 0x70, 0x6c, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x45, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x61, 0x70, 0x6c, 0x65, 0x46, + 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x2a, 0x0a, 0x06, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x20, 0x0a, 0x1c, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x59, + 0x52, 0x55, 0x50, 0x5f, 0x55, 0x53, 0x44, 0x43, 0x5f, 0x46, 0x41, 0x49, 0x52, 0x5f, 0x50, 0x52, + 0x49, 0x43, 0x45, 0x10, 0x00, 0x1a, 0x50, 0x0a, 0x09, 0x47, 0x6c, 0x79, 0x70, 0x68, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x6f, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x66, 0x6f, + 0x72, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x7a, 0x65, 0x72, + 0x6f, 0x46, 0x6f, 0x72, 0x4f, 0x6e, 0x65, 0x1a, 0x5f, 0x0a, 0x09, 0x43, 0x6f, 0x72, 0x65, 0x78, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x1b, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, + 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x1a, 0x95, 0x01, 0x0a, 0x0d, 0x41, 0x66, 0x74, + 0x65, 0x72, 0x6d, 0x61, 0x74, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x69, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x08, 0x69, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x69, 0x6e, + 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0d, + 0x6f, 0x75, 0x74, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x1a, 0xb5, 0x05, 0x0a, 0x07, 0x4c, 0x6c, 0x6d, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x44, 0x0a, 0x06, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x6c, 0x6d, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x41, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x69, 0x12, 0x3e, 0x0a, 0x04, 0x67, 0x72, 0x6f, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x6c, 0x6d, 0x54, 0x61, 0x73, 0x6b, 0x2e, + 0x47, 0x72, 0x6f, 0x71, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x67, 0x72, + 0x6f, 0x71, 0x12, 0x47, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x6b, 0x78, 0x61, 0x69, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x6c, 0x6d, 0x54, 0x61, + 0x73, 0x6b, 0x2e, 0x47, 0x72, 0x6f, 0x6b, 0x58, 0x41, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x48, 0x00, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x6b, 0x78, 0x61, 0x69, 0x1a, 0x96, 0x01, 0x0a, 0x0c, + 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x14, 0x0a, 0x05, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x70, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, + 0x6d, 0x70, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x70, + 0x69, 0x4b, 0x65, 0x79, 0x1a, 0x94, 0x01, 0x0a, 0x0a, 0x47, 0x72, 0x6f, 0x71, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x65, + 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x13, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x61, 0x70, 0x69, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x1a, 0x97, 0x01, 0x0a, 0x0d, + 0x47, 0x72, 0x6f, 0x6b, 0x58, 0x41, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x14, 0x0a, + 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6d, + 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x50, 0x72, + 0x6f, 0x6d, 0x70, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, + 0x70, 0x69, 0x4b, 0x65, 0x79, 0x42, 0x11, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x11, 0x0a, 0x0f, 0x53, 0x6f, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x53, 0x75, 0x73, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0xd5, 0x01, 0x0a, 0x10, + 0x43, 0x75, 0x72, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x42, 0x0a, 0x05, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2c, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x05, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x44, 0x65, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x22, 0x1b, 0x0a, 0x05, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, + 0x12, 0x0a, 0x0e, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, + 0x4d, 0x10, 0x00, 0x1a, 0x38, 0x0a, 0x1a, 0x54, 0x75, 0x72, 0x62, 0x6f, 0x45, 0x74, 0x68, 0x52, + 0x65, 0x64, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0x84, 0x01, + 0x0a, 0x0b, 0x42, 0x69, 0x74, 0x46, 0x6c, 0x75, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6f, 0x6f, + 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x70, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, + 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x80, 0x01, 0x0a, 0x0e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x40, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x46, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x05, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x46, 0x52, 0x41, 0x47, + 0x5f, 0x53, 0x4f, 0x4c, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, + 0x4e, 0x5f, 0x53, 0x4f, 0x4c, 0x10, 0x01, 0x1a, 0xb0, 0x01, 0x0a, 0x0d, 0x45, 0x74, 0x68, 0x65, + 0x72, 0x66, 0x75, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3f, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x66, 0x75, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5e, 0x0a, 0x05, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x43, 0x45, 0x54, + 0x45, 0x53, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x55, 0x53, + 0x54, 0x52, 0x59, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x45, + 0x55, 0x52, 0x4f, 0x42, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, + 0x54, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x4f, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x4f, 0x4b, + 0x45, 0x4e, 0x5f, 0x47, 0x49, 0x4c, 0x54, 0x53, 0x10, 0x04, 0x1a, 0xfe, 0x01, 0x0a, 0x16, 0x4c, + 0x73, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x59, 0x69, 0x65, 0x6c, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x73, 0x74, 0x4d, 0x69, 0x6e, 0x74, + 0x12, 0x54, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x73, 0x74, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x59, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x22, 0x5b, + 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x4e, 0x10, + 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, + 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x03, 0x1a, 0x8d, 0x01, 0x0a, 0x0b, + 0x50, 0x75, 0x6d, 0x70, 0x41, 0x6d, 0x6d, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, + 0x0a, 0x09, 0x69, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x08, 0x69, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, + 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1b, + 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x78, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x58, 0x46, 0x6f, 0x72, 0x59, 0x1a, 0xaa, 0x01, 0x0a, 0x17, + 0x50, 0x75, 0x6d, 0x70, 0x41, 0x6d, 0x6d, 0x4c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x78, 0x5f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x09, 0x78, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4a, 0x6f, + 0x62, 0x12, 0x35, 0x0a, 0x0b, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x09, 0x79, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x4a, 0x6f, 0x62, 0x1a, 0x24, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x75, 0x6c, 0x74, 0x1a, 0x54, + 0x0a, 0x1b, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x50, 0x54, 0x4c, 0x69, 0x6e, 0x65, + 0x61, 0x72, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x1a, 0xd2, 0x01, 0x0a, 0x1c, 0x53, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x30, 0x32, 0x32, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x74, 0x12, 0x63, 0x0a, 0x09, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x45, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, + 0x30, 0x32, 0x32, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x30, 0x32, 0x32, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x39, + 0x0a, 0x12, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x30, 0x32, 0x32, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x32, 0x30, + 0x32, 0x32, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x41, 0x4d, 0x4f, 0x55, 0x4e, 0x54, + 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x1a, 0xc0, 0x01, 0x0a, 0x14, 0x53, 0x77, + 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x75, 0x72, 0x67, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x75, 0x72, 0x67, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0x45, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x0c, 0x0a, 0x08, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x42, 0x49, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x4f, 0x4b, + 0x58, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x59, 0x42, 0x49, 0x54, 0x10, 0x03, 0x12, 0x0c, + 0x0a, 0x08, 0x43, 0x4f, 0x49, 0x4e, 0x42, 0x41, 0x53, 0x45, 0x10, 0x04, 0x1a, 0xbb, 0x2b, 0x0a, + 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3d, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4d, 0x0a, 0x0f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x43, 0x0a, 0x0b, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0a, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3d, 0x0a, 0x09, 0x6d, 0x65, 0x61, 0x6e, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x4d, 0x65, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x6d, + 0x65, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4c, 0x0a, 0x0e, 0x77, 0x65, 0x62, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x43, 0x0a, 0x0b, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x2e, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0a, + 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x49, 0x0a, 0x0d, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x79, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x79, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x57, 0x0a, 0x13, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x70, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x10, 0x6c, 0x70, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5d, + 0x0a, 0x15, 0x6c, 0x70, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x12, 0x6c, 0x70, 0x45, 0x78, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x52, 0x0a, + 0x10, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, + 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x40, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x61, 0x78, + 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x56, 0x0a, 0x12, 0x72, 0x65, 0x67, 0x65, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x10, 0x72, 0x65, 0x67, 0x65, 0x78, 0x45, 0x78, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x50, 0x0a, 0x10, 0x78, 0x73, 0x74, 0x65, 0x70, + 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x58, 0x53, 0x74, 0x65, 0x70, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0e, 0x78, 0x73, 0x74, 0x65, 0x70, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3a, 0x0a, 0x08, 0x61, 0x64, 0x64, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x48, 0x00, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x3d, 0x0a, 0x09, 0x74, 0x77, 0x61, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x77, 0x61, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x74, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x4d, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x53, 0x65, 0x72, 0x75, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, + 0x0d, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3a, + 0x0a, 0x08, 0x70, 0x6f, 0x77, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x50, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x48, + 0x00, 0x52, 0x07, 0x70, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x53, 0x0a, 0x11, 0x6c, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0f, + 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x60, 0x0a, 0x16, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x70, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x61, 0x6e, 0x67, 0x6f, 0x50, 0x65, 0x72, 0x70, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x61, + 0x6e, 0x67, 0x6f, 0x50, 0x65, 0x72, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x53, 0x0a, 0x11, 0x6a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x77, 0x61, + 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0f, 0x6a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, + 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x50, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x70, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x50, 0x65, 0x72, 0x70, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x70, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x43, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, + 0x00, 0x52, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x53, 0x0a, + 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x48, + 0x00, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x57, 0x0a, 0x13, 0x73, 0x70, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x70, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, + 0x6f, 0x6f, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x10, 0x73, 0x70, 0x6c, 0x53, 0x74, + 0x61, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5a, 0x0a, 0x14, 0x73, + 0x70, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, + 0x61, 0x73, 0x6b, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x2e, 0x53, 0x70, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x48, 0x00, 0x52, 0x11, 0x73, 0x70, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x6c, 0x0a, 0x1a, 0x75, 0x6e, 0x69, 0x73, 0x77, + 0x61, 0x70, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x17, 0x75, 0x6e, + 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x72, 0x0a, 0x1c, 0x73, 0x75, 0x73, 0x68, 0x69, 0x73, 0x77, + 0x61, 0x70, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x53, 0x75, 0x73, 0x68, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x19, + 0x73, 0x75, 0x73, 0x68, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x78, 0x0a, 0x1e, 0x70, 0x61, 0x6e, + 0x63, 0x61, 0x6b, 0x65, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x21, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x50, 0x61, 0x6e, 0x63, 0x61, 0x6b, 0x65, + 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x1b, 0x70, 0x61, 0x6e, 0x63, 0x61, 0x6b, 0x65, 0x73, + 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x40, 0x0a, 0x0a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5c, 0x0a, 0x14, 0x73, 0x79, 0x73, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x23, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x79, 0x73, 0x63, 0x6c, + 0x6f, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, + 0x12, 0x73, 0x79, 0x73, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x59, 0x0a, 0x13, 0x6d, 0x61, 0x72, 0x69, 0x6e, 0x61, 0x64, 0x65, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x61, 0x64, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x11, 0x6d, 0x61, 0x72, + 0x69, 0x6e, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x76, + 0x0a, 0x1e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x6f, + 0x6c, 0x61, 0x6e, 0x61, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x6f, 0x6c, 0x61, + 0x6e, 0x61, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x66, 0x0a, 0x18, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x5f, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, 0x73, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x15, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4d, + 0x0a, 0x0f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, + 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, + 0x63, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3a, 0x0a, + 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x69, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, + 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5f, 0x0a, 0x15, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x13, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3d, 0x0a, 0x09, 0x76, 0x77, + 0x61, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x56, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, + 0x08, 0x76, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3d, 0x0a, 0x09, 0x65, 0x77, 0x6d, + 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x45, 0x77, 0x6d, 0x61, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, + 0x65, 0x77, 0x6d, 0x61, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4f, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x40, 0x0a, 0x0a, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, + 0x52, 0x09, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x40, 0x0a, 0x0a, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, + 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x46, 0x0a, + 0x0c, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x60, 0x0a, 0x16, 0x73, 0x61, 0x6e, 0x63, 0x74, 0x75, 0x6d, + 0x5f, 0x6c, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, + 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x61, 0x6e, + 0x63, 0x74, 0x75, 0x6d, 0x4c, 0x73, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x48, 0x00, 0x52, 0x13, 0x73, 0x61, 0x6e, 0x63, 0x74, 0x75, 0x6d, 0x4c, 0x73, 0x74, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0e, 0x6f, 0x6e, 0x64, 0x6f, 0x5f, + 0x75, 0x73, 0x64, 0x79, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x6e, 0x64, 0x6f, 0x55, 0x73, 0x64, 0x79, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x6f, 0x6e, 0x64, 0x6f, 0x55, 0x73, 0x64, 0x79, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x53, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, 0x5f, 0x73, + 0x77, 0x61, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, 0x53, 0x77, 0x61, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, + 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0e, 0x75, 0x6e, 0x69, 0x78, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x78, 0x54, 0x69, 0x6d, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x78, 0x54, 0x69, 0x6d, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x56, 0x0a, 0x12, 0x6d, 0x61, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x61, 0x70, 0x6c, 0x65, 0x46, 0x69, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x10, 0x6d, 0x61, 0x70, 0x6c, + 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x40, 0x0a, 0x0a, + 0x67, 0x6c, 0x79, 0x70, 0x68, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x47, 0x6c, 0x79, 0x70, 0x68, 0x54, 0x61, 0x73, + 0x6b, 0x48, 0x00, 0x52, 0x09, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x40, + 0x0a, 0x0a, 0x63, 0x6f, 0x72, 0x65, 0x78, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x36, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x78, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x72, 0x65, 0x78, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x3a, 0x0a, 0x08, 0x6c, 0x6c, 0x6d, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x37, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x6c, 0x6d, 0x54, 0x61, 0x73, + 0x6b, 0x48, 0x00, 0x52, 0x07, 0x6c, 0x6c, 0x6d, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x53, 0x0a, 0x11, + 0x73, 0x6f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x73, 0x64, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, + 0x6f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x75, 0x73, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, + 0x52, 0x0f, 0x73, 0x6f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x75, 0x73, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x56, 0x0a, 0x12, 0x63, 0x75, 0x72, 0x76, 0x65, 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x10, 0x63, 0x75, 0x72, 0x76, 0x65, 0x46, 0x69, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x76, 0x0a, 0x1e, 0x74, 0x75, 0x72, + 0x62, 0x6f, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x64, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x3a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x75, 0x72, 0x62, 0x6f, 0x45, 0x74, + 0x68, 0x52, 0x65, 0x64, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x1a, 0x74, 0x75, 0x72, 0x62, 0x6f, 0x45, 0x74, 0x68, 0x52, + 0x65, 0x64, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x47, 0x0a, 0x0d, 0x62, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x75, 0x78, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x42, 0x69, 0x74, 0x46, 0x6c, 0x75, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0b, 0x62, + 0x69, 0x74, 0x46, 0x6c, 0x75, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4f, 0x0a, 0x0f, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x3c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4c, 0x0a, 0x0e, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x3d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x6d, 0x61, 0x74, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x6d, 0x61, 0x74, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4c, 0x0a, 0x0e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x66, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x3f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x66, 0x75, + 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x74, 0x68, 0x65, 0x72, 0x66, + 0x75, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x69, 0x0a, 0x19, 0x6c, 0x73, 0x74, 0x5f, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x2e, 0x4c, 0x73, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x59, + 0x69, 0x65, 0x6c, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x16, 0x6c, 0x73, 0x74, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x59, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x47, 0x0a, 0x0d, 0x70, 0x75, 0x6d, 0x70, 0x5f, 0x61, 0x6d, 0x6d, 0x5f, 0x74, + 0x61, 0x73, 0x6b, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x2e, 0x50, 0x75, 0x6d, 0x70, 0x41, 0x6d, 0x6d, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0b, + 0x70, 0x75, 0x6d, 0x70, 0x41, 0x6d, 0x6d, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x6e, 0x0a, 0x1c, 0x70, + 0x75, 0x6d, 0x70, 0x5f, 0x61, 0x6d, 0x6d, 0x5f, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x42, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x50, 0x75, 0x6d, 0x70, 0x41, 0x6d, 0x6d, + 0x4c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x48, 0x00, 0x52, 0x17, 0x70, 0x75, 0x6d, 0x70, 0x41, 0x6d, 0x6d, 0x4c, 0x70, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x49, 0x0a, 0x0d, 0x65, + 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x43, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x79, 0x0a, 0x1f, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x5f, 0x70, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x44, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x50, + 0x54, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x48, 0x00, 0x52, 0x1b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x50, 0x74, + 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x7c, 0x0a, 0x20, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x5f, 0x32, 0x30, 0x32, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x53, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x30, + 0x32, 0x32, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, + 0x00, 0x52, 0x1c, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x30, + 0x32, 0x32, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x62, 0x0a, 0x16, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x73, + 0x75, 0x72, 0x67, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x53, 0x75, 0x72, 0x67, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x14, 0x73, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x75, 0x72, 0x67, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x42, 0x06, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x4a, 0x04, 0x08, 0x1b, 0x10, + 0x1c, 0x4a, 0x04, 0x08, 0x1c, 0x10, 0x1d, 0x4a, 0x04, 0x08, 0x3e, 0x10, 0x3f, 0x52, 0x12, 0x64, + 0x65, 0x66, 0x69, 0x5f, 0x6b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x73, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x52, 0x08, 0x74, 0x70, 0x73, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x52, 0x0d, 0x68, 0x6f, 0x70, + 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x4a, 0xda, 0xa8, 0x04, 0x0a, 0x07, + 0x12, 0x05, 0x00, 0x00, 0xb8, 0x0d, 0x01, 0x0a, 0x08, 0x0a, 0x01, 0x0c, 0x12, 0x03, 0x00, 0x00, + 0x12, 0x0a, 0x08, 0x0a, 0x01, 0x02, 0x12, 0x03, 0x02, 0x00, 0x13, 0x0a, 0x52, 0x0a, 0x02, 0x04, + 0x00, 0x12, 0x05, 0x05, 0x00, 0xb8, 0x0d, 0x01, 0x1a, 0x45, 0x2f, 0x20, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x65, 0x72, 0x66, + 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x2e, 0x0a, 0x0a, + 0x0a, 0x0a, 0x03, 0x04, 0x00, 0x01, 0x12, 0x03, 0x05, 0x08, 0x11, 0x0a, 0xeb, 0x04, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x00, 0x12, 0x04, 0x1b, 0x02, 0x38, 0x03, 0x1a, 0xdc, 0x04, 0x0a, 0x54, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x66, 0x75, 0x6c, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x20, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, + 0x0a, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, + 0x6f, 0x20, 0x34, 0x30, 0x30, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x48, 0x74, 0x74, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, + 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6d, 0x79, 0x77, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x22, 0x7d, + 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x75, + 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6d, 0x79, + 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x45, + 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x22, 0x2c, 0x20, 0x22, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x20, 0x7b, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, + 0x3a, 0x20, 0x22, 0x4d, 0x59, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4b, 0x45, 0x59, + 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x59, 0x5f, + 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x22, 0x20, 0x7d, 0x20, + 0x5d, 0x2c, 0x20, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x22, 0x7b, 0x5c, 0x22, 0x4d, + 0x59, 0x5f, 0x42, 0x4f, 0x44, 0x59, 0x5f, 0x4b, 0x45, 0x59, 0x5c, 0x22, 0x3a, 0x5c, 0x22, 0x4d, + 0x59, 0x5f, 0x42, 0x4f, 0x44, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5c, 0x22, 0x7d, 0x22, + 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x03, + 0x00, 0x01, 0x12, 0x03, 0x1b, 0x0a, 0x12, 0x0a, 0x5c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x12, 0x04, 0x1d, 0x04, 0x24, 0x05, 0x1a, 0x4c, 0x2f, 0x20, 0x41, 0x6e, 0x20, 0x65, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6d, + 0x61, 0x6b, 0x65, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, + 0x12, 0x03, 0x1d, 0x09, 0x0f, 0x0a, 0x40, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, + 0x00, 0x12, 0x03, 0x1f, 0x06, 0x18, 0x1a, 0x2f, 0x2f, 0x20, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x20, + 0x48, 0x54, 0x54, 0x50, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x4d, 0x45, 0x54, 0x48, + 0x4f, 0x44, 0x5f, 0x47, 0x45, 0x54, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x1f, 0x06, 0x13, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x03, 0x1f, 0x16, 0x17, 0x0a, 0x32, 0x0a, 0x08, 0x04, + 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x01, 0x12, 0x03, 0x21, 0x06, 0x15, 0x1a, 0x21, 0x2f, 0x20, + 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x6e, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, + 0x27, 0x47, 0x45, 0x54, 0x27, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x0a, 0x0a, + 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x21, 0x06, + 0x10, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x03, + 0x21, 0x13, 0x14, 0x0a, 0x33, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x02, 0x12, + 0x03, 0x23, 0x06, 0x16, 0x1a, 0x22, 0x2f, 0x20, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, + 0x61, 0x6e, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x23, 0x06, 0x11, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x00, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x03, 0x23, 0x14, 0x15, 0x0a, 0x50, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x12, 0x04, 0x27, 0x04, 0x2c, 0x05, 0x1a, 0x40, 0x2f, 0x20, + 0x41, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, + 0x48, 0x54, 0x54, 0x50, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x0a, 0x0a, 0x0e, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x12, 0x03, 0x27, 0x0c, 0x12, 0x0a, 0x4a, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x29, 0x06, 0x1e, 0x1a, + 0x39, 0x2f, 0x20, 0x41, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6b, 0x65, 0x79, 0x20, + 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x60, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x60, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x12, 0x03, 0x29, 0x06, 0x0e, 0x0a, 0x10, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x29, 0x0f, 0x15, 0x0a, 0x10, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x29, 0x16, 0x19, + 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x29, + 0x1c, 0x1d, 0x0a, 0x61, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, + 0x2b, 0x06, 0x20, 0x1a, 0x50, 0x2f, 0x20, 0x41, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x60, 0x42, 0x61, + 0x73, 0x69, 0x63, 0x20, 0x4d, 0x59, 0x41, 0x55, 0x54, 0x48, 0x4b, 0x45, 0x59, 0x60, 0x20, 0x6f, + 0x72, 0x20, 0x60, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x60, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, + 0x01, 0x04, 0x12, 0x03, 0x2b, 0x06, 0x0e, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x03, + 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x2b, 0x0f, 0x15, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x2b, 0x16, 0x1b, 0x0a, 0x10, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x2b, 0x1e, 0x1f, 0x0a, 0x4d, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x2e, 0x04, 0x1c, 0x1a, 0x3e, 0x2f, 0x20, + 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x74, 0x6f, 0x20, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x12, 0x03, 0x2e, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x2e, 0x0d, 0x13, 0x0a, 0x0e, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x2e, 0x14, 0x17, 0x0a, 0x0e, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x2e, 0x1a, 0x1b, 0x0a, 0x33, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x31, 0x04, 0x1f, 0x1a, 0x24, 0x2f, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x2e, + 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x01, 0x04, 0x12, 0x03, 0x31, 0x04, + 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x01, 0x06, 0x12, 0x03, 0x31, 0x0d, + 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x31, 0x14, + 0x1a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x31, 0x1d, + 0x1e, 0x0a, 0x3c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x12, 0x03, 0x34, 0x04, 0x20, + 0x1a, 0x2d, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x0a, + 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x04, 0x12, 0x03, 0x34, 0x04, 0x0c, 0x0a, + 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x06, 0x12, 0x03, 0x34, 0x0d, 0x13, 0x0a, + 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x34, 0x14, 0x1b, 0x0a, + 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x03, 0x12, 0x03, 0x34, 0x1e, 0x1f, 0x0a, + 0x46, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x00, 0x02, 0x03, 0x12, 0x03, 0x37, 0x04, 0x1d, 0x1a, 0x37, + 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x28, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x29, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x48, 0x74, 0x74, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, + 0x03, 0x04, 0x12, 0x03, 0x37, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, + 0x03, 0x05, 0x12, 0x03, 0x37, 0x0d, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, + 0x03, 0x01, 0x12, 0x03, 0x37, 0x14, 0x18, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, + 0x03, 0x03, 0x12, 0x03, 0x37, 0x1b, 0x1c, 0x0a, 0x95, 0x03, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x01, + 0x12, 0x04, 0x48, 0x02, 0x5d, 0x03, 0x1a, 0x86, 0x03, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x61, 0x70, 0x74, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x74, 0x74, 0x70, 0x47, + 0x65, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x20, 0x61, + 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x0a, + 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, + 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x61, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x0a, 0x0a, 0x60, + 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, + 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x01, 0x01, 0x12, 0x03, 0x48, 0x0a, 0x17, 0x0a, 0x79, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x01, 0x02, 0x00, 0x12, 0x03, 0x4b, 0x04, 0x1d, 0x1a, 0x6a, 0x2f, 0x20, + 0x4a, 0x53, 0x4f, 0x4e, 0x50, 0x61, 0x74, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, + 0x74, 0x2e, 0x6c, 0x79, 0x2f, 0x75, 0x4c, 0x74, 0x77, 0x0a, 0x2f, 0x20, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6e, 0x70, 0x6d, 0x6a, 0x73, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x70, 0x61, + 0x74, 0x68, 0x2d, 0x70, 0x6c, 0x75, 0x73, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, + 0x02, 0x00, 0x04, 0x12, 0x03, 0x4b, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, + 0x02, 0x00, 0x05, 0x12, 0x03, 0x4b, 0x0d, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, + 0x02, 0x00, 0x01, 0x12, 0x03, 0x4b, 0x14, 0x18, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, + 0x02, 0x00, 0x03, 0x12, 0x03, 0x4b, 0x1b, 0x1c, 0x0a, 0x48, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x01, + 0x04, 0x00, 0x12, 0x04, 0x4e, 0x04, 0x5a, 0x05, 0x1a, 0x38, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x01, 0x12, 0x03, 0x4e, + 0x09, 0x1a, 0x0a, 0x0f, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x00, 0x12, 0x03, + 0x4f, 0x06, 0x0f, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, + 0x12, 0x03, 0x4f, 0x06, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, + 0x00, 0x02, 0x12, 0x03, 0x4f, 0x0d, 0x0e, 0x0a, 0x3a, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, + 0x00, 0x02, 0x01, 0x12, 0x03, 0x51, 0x06, 0x0e, 0x1a, 0x29, 0x2f, 0x20, 0x47, 0x72, 0x61, 0x62, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x01, 0x01, + 0x12, 0x03, 0x51, 0x06, 0x09, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, + 0x01, 0x02, 0x12, 0x03, 0x51, 0x0c, 0x0d, 0x0a, 0x3a, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, + 0x00, 0x02, 0x02, 0x12, 0x03, 0x53, 0x06, 0x0e, 0x1a, 0x29, 0x2f, 0x20, 0x47, 0x72, 0x61, 0x62, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x02, 0x01, + 0x12, 0x03, 0x53, 0x06, 0x09, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, + 0x02, 0x02, 0x12, 0x03, 0x53, 0x0c, 0x0d, 0x0a, 0x2e, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, + 0x00, 0x02, 0x03, 0x12, 0x03, 0x55, 0x06, 0x0e, 0x1a, 0x1d, 0x2f, 0x20, 0x53, 0x75, 0x6d, 0x20, + 0x75, 0x70, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, + 0x00, 0x02, 0x03, 0x01, 0x12, 0x03, 0x55, 0x06, 0x09, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x01, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x03, 0x55, 0x0c, 0x0d, 0x0a, 0x2f, 0x0a, 0x08, 0x04, + 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x04, 0x12, 0x03, 0x57, 0x06, 0x0f, 0x1a, 0x1e, 0x2f, 0x20, + 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x03, 0x57, 0x06, 0x0a, 0x0a, 0x10, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x03, 0x57, 0x0d, 0x0e, + 0x0a, 0x33, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x05, 0x12, 0x03, 0x59, 0x06, + 0x11, 0x1a, 0x22, 0x2f, 0x20, 0x47, 0x72, 0x61, 0x62, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, + 0x05, 0x01, 0x12, 0x03, 0x59, 0x06, 0x0c, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, + 0x00, 0x02, 0x05, 0x02, 0x12, 0x03, 0x59, 0x0f, 0x10, 0x0a, 0x8c, 0x01, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x01, 0x02, 0x01, 0x12, 0x03, 0x5c, 0x04, 0x36, 0x1a, 0x7d, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x66, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x74, 0x68, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, + 0x02, 0x01, 0x04, 0x12, 0x03, 0x5c, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, + 0x02, 0x01, 0x06, 0x12, 0x03, 0x5c, 0x0d, 0x1e, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, + 0x02, 0x01, 0x01, 0x12, 0x03, 0x5c, 0x1f, 0x31, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, + 0x02, 0x01, 0x03, 0x12, 0x03, 0x5c, 0x34, 0x35, 0x0a, 0x84, 0x07, 0x0a, 0x04, 0x04, 0x00, 0x03, + 0x02, 0x12, 0x04, 0x72, 0x02, 0x7b, 0x03, 0x1a, 0xf5, 0x06, 0x0a, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x28, 0x6d, + 0x69, 0x64, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x64, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x20, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x33, 0x20, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x30, + 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x32, 0x30, 0x7d, 0x7d, 0x2c, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x33, 0x20, 0x6a, 0x6f, 0x62, + 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x6a, 0x6f, 0x62, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, + 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x54, + 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, + 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x2e, 0x75, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, + 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, + 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, + 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, + 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, + 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2d, + 0x70, 0x75, 0x62, 0x2e, 0x62, 0x69, 0x74, 0x66, 0x69, 0x6e, 0x65, 0x78, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x73, 0x3f, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x73, 0x3d, 0x74, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, + 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x5b, 0x30, 0x5d, 0x5b, + 0x37, 0x5d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x02, 0x01, 0x12, 0x03, 0x72, 0x0a, 0x14, 0x0a, 0x54, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x12, 0x03, 0x74, 0x04, 0x1c, 0x1a, 0x45, 0x2f, 0x20, + 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x04, 0x12, 0x03, + 0x74, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x06, 0x12, 0x03, + 0x74, 0x0d, 0x11, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x01, 0x12, 0x03, + 0x74, 0x12, 0x17, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x03, 0x12, 0x03, + 0x74, 0x1a, 0x1b, 0x0a, 0x53, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x02, 0x02, 0x01, 0x12, 0x03, 0x76, + 0x04, 0x20, 0x1a, 0x44, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x73, 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, + 0x02, 0x01, 0x04, 0x12, 0x03, 0x76, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, + 0x02, 0x01, 0x06, 0x12, 0x03, 0x76, 0x0d, 0x16, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, + 0x02, 0x01, 0x01, 0x12, 0x03, 0x76, 0x17, 0x1b, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, + 0x02, 0x01, 0x03, 0x12, 0x03, 0x76, 0x1e, 0x1f, 0x0a, 0x59, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x02, + 0x02, 0x02, 0x12, 0x03, 0x78, 0x04, 0x2f, 0x1a, 0x4a, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x61, + 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x20, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x65, + 0x64, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x02, 0x04, 0x12, 0x03, + 0x78, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x02, 0x05, 0x12, 0x03, + 0x78, 0x0d, 0x12, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x02, 0x01, 0x12, 0x03, + 0x78, 0x13, 0x2a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x02, 0x03, 0x12, 0x03, + 0x78, 0x2d, 0x2e, 0x0a, 0x75, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x02, 0x02, 0x03, 0x12, 0x03, 0x7a, + 0x04, 0x2a, 0x1a, 0x66, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, + 0x75, 0x6c, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, + 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x02, 0x02, 0x03, 0x04, 0x12, 0x03, 0x7a, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x02, 0x02, 0x03, 0x05, 0x12, 0x03, 0x7a, 0x0d, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x02, 0x02, 0x03, 0x01, 0x12, 0x03, 0x7a, 0x14, 0x25, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x02, 0x02, 0x03, 0x03, 0x12, 0x03, 0x7a, 0x28, 0x29, 0x0a, 0x85, 0x07, 0x0a, 0x04, 0x04, + 0x00, 0x03, 0x03, 0x12, 0x06, 0x90, 0x01, 0x02, 0x95, 0x01, 0x03, 0x1a, 0xf4, 0x06, 0x0a, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x20, + 0x28, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x20, 0x4e, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6a, 0x6f, 0x62, 0x73, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x33, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, + 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x65, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x20, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x3a, 0x20, 0x32, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x33, + 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x33, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x7b, 0x22, 0x6d, 0x65, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, + 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, + 0x53, 0x44, 0x54, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, + 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x75, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, + 0x69, 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, + 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, + 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, + 0x70, 0x69, 0x2d, 0x70, 0x75, 0x62, 0x2e, 0x62, 0x69, 0x74, 0x66, 0x69, 0x6e, 0x65, 0x78, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x73, 0x3f, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3d, 0x74, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, + 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x5b, + 0x30, 0x5d, 0x5b, 0x37, 0x5d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, + 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x03, 0x01, 0x12, 0x04, 0x90, 0x01, 0x0a, + 0x12, 0x0a, 0x55, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x03, 0x02, 0x00, 0x12, 0x04, 0x92, 0x01, 0x04, + 0x1c, 0x1a, 0x45, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, + 0x02, 0x00, 0x04, 0x12, 0x04, 0x92, 0x01, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x03, 0x02, 0x00, 0x06, 0x12, 0x04, 0x92, 0x01, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x03, 0x02, 0x00, 0x01, 0x12, 0x04, 0x92, 0x01, 0x12, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x03, 0x02, 0x00, 0x03, 0x12, 0x04, 0x92, 0x01, 0x1a, 0x1b, 0x0a, 0x54, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x03, 0x02, 0x01, 0x12, 0x04, 0x94, 0x01, 0x04, 0x20, 0x1a, 0x44, 0x2f, 0x20, + 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x6f, 0x62, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, 0x02, 0x01, 0x04, 0x12, 0x04, 0x94, + 0x01, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, 0x02, 0x01, 0x06, 0x12, 0x04, + 0x94, 0x01, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, 0x02, 0x01, 0x01, 0x12, + 0x04, 0x94, 0x01, 0x17, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, 0x02, 0x01, 0x03, + 0x12, 0x04, 0x94, 0x01, 0x1e, 0x1f, 0x0a, 0x8c, 0x07, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x04, 0x12, + 0x06, 0xaa, 0x01, 0x02, 0xaf, 0x01, 0x03, 0x1a, 0xfb, 0x06, 0x0a, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x75, + 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x20, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, + 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x33, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, + 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x61, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x3a, 0x20, 0x31, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, + 0x20, 0x32, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x30, + 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x33, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, + 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x61, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x22, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, + 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, + 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x54, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, + 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, + 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, + 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, + 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x75, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, + 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2d, 0x70, 0x75, 0x62, 0x2e, 0x62, 0x69, 0x74, 0x66, 0x69, 0x6e, + 0x65, 0x78, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, + 0x73, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3d, 0x74, 0x53, 0x4f, 0x4c, 0x55, 0x53, + 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, + 0x22, 0x24, 0x5b, 0x30, 0x5d, 0x5b, 0x37, 0x5d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x5d, 0x7d, 0x7d, + 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x04, 0x01, 0x12, 0x04, + 0xaa, 0x01, 0x0a, 0x11, 0x0a, 0x55, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x04, 0x02, 0x00, 0x12, 0x04, + 0xac, 0x01, 0x04, 0x1c, 0x1a, 0x45, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x65, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x04, 0x02, 0x00, 0x04, 0x12, 0x04, 0xac, 0x01, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x04, 0x02, 0x00, 0x06, 0x12, 0x04, 0xac, 0x01, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, 0x00, 0x01, 0x12, 0x04, 0xac, 0x01, 0x12, 0x17, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, 0x00, 0x03, 0x12, 0x04, 0xac, 0x01, 0x1a, 0x1b, 0x0a, + 0x54, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x04, 0x02, 0x01, 0x12, 0x04, 0xae, 0x01, 0x04, 0x20, 0x1a, + 0x44, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, + 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, 0x01, 0x04, + 0x12, 0x04, 0xae, 0x01, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, 0x01, + 0x06, 0x12, 0x04, 0xae, 0x01, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, + 0x01, 0x01, 0x12, 0x04, 0xae, 0x01, 0x17, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x04, + 0x02, 0x01, 0x03, 0x12, 0x04, 0xae, 0x01, 0x1e, 0x1f, 0x0a, 0x8c, 0x07, 0x0a, 0x04, 0x04, 0x00, + 0x03, 0x05, 0x12, 0x06, 0xc4, 0x01, 0x02, 0xc9, 0x01, 0x03, 0x1a, 0xfb, 0x06, 0x0a, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, + 0x6d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x73, 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x20, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x33, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, + 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x69, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x3a, 0x20, 0x32, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, + 0x20, 0x33, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, + 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x33, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x0a, 0x0a, + 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x69, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, + 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, + 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x54, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, + 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, + 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x75, 0x73, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, + 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, + 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2d, 0x70, 0x75, 0x62, 0x2e, 0x62, 0x69, 0x74, + 0x66, 0x69, 0x6e, 0x65, 0x78, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x69, 0x63, + 0x6b, 0x65, 0x72, 0x73, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3d, 0x74, 0x53, 0x4f, + 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x3a, 0x20, 0x22, 0x24, 0x5b, 0x30, 0x5d, 0x5b, 0x37, 0x5d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, + 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x05, + 0x01, 0x12, 0x04, 0xc4, 0x01, 0x0a, 0x11, 0x0a, 0x55, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x05, 0x02, + 0x00, 0x12, 0x04, 0xc6, 0x01, 0x04, 0x1c, 0x1a, 0x45, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, 0x02, 0x00, 0x04, 0x12, 0x04, 0xc6, 0x01, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, 0x02, 0x00, 0x06, 0x12, 0x04, 0xc6, 0x01, 0x0d, 0x11, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc6, 0x01, 0x12, + 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc6, 0x01, + 0x1a, 0x1b, 0x0a, 0x54, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x05, 0x02, 0x01, 0x12, 0x04, 0xc8, 0x01, + 0x04, 0x20, 0x1a, 0x44, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x73, 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, + 0x02, 0x01, 0x04, 0x12, 0x04, 0xc8, 0x01, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x05, 0x02, 0x01, 0x06, 0x12, 0x04, 0xc8, 0x01, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x05, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc8, 0x01, 0x17, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x05, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc8, 0x01, 0x1e, 0x1f, 0x0a, 0xc7, 0x03, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x06, 0x12, 0x06, 0xe4, 0x01, 0x02, 0xf1, 0x01, 0x03, 0x1a, 0xb6, 0x03, + 0x0a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x31, 0x30, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x30, 0x7d, 0x20, 0x7d, 0x0a, 0x60, + 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, + 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, + 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, + 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x7d, 0x20, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, + 0x62, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x7b, 0x4f, 0x4e, 0x45, 0x7d, 0x22, 0x7d, 0x20, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x06, 0x01, 0x12, + 0x04, 0xe4, 0x01, 0x0a, 0x13, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x08, 0x00, 0x12, + 0x06, 0xe5, 0x01, 0x04, 0xf0, 0x01, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x08, + 0x00, 0x01, 0x12, 0x04, 0xe5, 0x01, 0x0a, 0x0f, 0x0a, 0x42, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, + 0x02, 0x00, 0x12, 0x04, 0xe7, 0x01, 0x06, 0x17, 0x1a, 0x32, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x06, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe7, 0x01, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe7, 0x01, 0x0d, 0x12, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe7, 0x01, 0x15, 0x16, 0x0a, + 0x41, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x02, 0x01, 0x12, 0x04, 0xe9, 0x01, 0x06, 0x23, 0x1a, + 0x31, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, + 0x75, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe9, + 0x01, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x01, 0x01, 0x12, 0x04, + 0xe9, 0x01, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x01, 0x03, 0x12, + 0x04, 0xe9, 0x01, 0x21, 0x22, 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x02, 0x02, 0x12, + 0x04, 0xeb, 0x01, 0x06, 0x15, 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x2e, 0x20, 0x60, + 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, + 0x78, 0x2e, 0x60, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x02, 0x05, 0x12, + 0x04, 0xeb, 0x01, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xeb, 0x01, 0x0d, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x02, + 0x03, 0x12, 0x04, 0xeb, 0x01, 0x13, 0x14, 0x0a, 0x44, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x02, + 0x03, 0x12, 0x04, 0xed, 0x01, 0x06, 0x15, 0x1a, 0x34, 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x68, 0x65, 0x78, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x28, 0x30, 0x78, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x69, + 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x29, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x03, 0x05, 0x12, 0x04, 0xed, 0x01, 0x06, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x03, 0x01, 0x12, 0x04, 0xed, 0x01, 0x0d, 0x10, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x03, 0x03, 0x12, 0x04, 0xed, 0x01, 0x13, 0x14, + 0x0a, 0x20, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x02, 0x04, 0x12, 0x04, 0xef, 0x01, 0x06, 0x16, + 0x1a, 0x10, 0x20, 0x41, 0x20, 0x75, 0x74, 0x66, 0x38, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x04, 0x05, 0x12, 0x04, 0xef, + 0x01, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x04, 0x01, 0x12, 0x04, + 0xef, 0x01, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x04, 0x03, 0x12, + 0x04, 0xef, 0x01, 0x14, 0x15, 0x0a, 0x9f, 0x04, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x07, 0x12, 0x06, + 0x80, 0x02, 0x02, 0x8a, 0x02, 0x03, 0x1a, 0x8e, 0x04, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, + 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, + 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x73, 0x20, + 0x61, 0x20, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, + 0x22, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x20, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x77, 0x73, 0x73, 0x3a, 0x2f, + 0x2f, 0x77, 0x73, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x2e, 0x63, 0x6f, 0x69, + 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0x2c, 0x20, 0x22, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x7b, 0x5c, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x5c, 0x22, 0x3a, 0x5c, 0x22, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x5c, 0x22, 0x2c, 0x5c, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x73, 0x5c, 0x22, 0x3a, 0x5b, 0x5c, 0x22, 0x42, 0x54, 0x43, 0x2d, 0x55, 0x53, 0x44, 0x5c, + 0x22, 0x5d, 0x2c, 0x5c, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x5c, 0x22, 0x3a, + 0x5b, 0x5c, 0x22, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x5c, 0x22, 0x2c, 0x7b, 0x5c, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x5c, 0x22, 0x3a, 0x5c, 0x22, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x5c, 0x22, + 0x2c, 0x5c, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x5c, 0x22, + 0x3a, 0x5b, 0x5c, 0x22, 0x42, 0x54, 0x43, 0x2d, 0x55, 0x53, 0x44, 0x5c, 0x22, 0x5d, 0x7d, 0x5d, + 0x7d, 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x41, 0x67, 0x65, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x3a, 0x20, 0x31, 0x35, 0x2c, 0x20, 0x22, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x5b, 0x3f, 0x28, 0x40, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x27, 0x20, 0x26, + 0x26, 0x20, 0x40, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x20, 0x3d, + 0x3d, 0x20, 0x27, 0x42, 0x54, 0x43, 0x2d, 0x55, 0x53, 0x44, 0x27, 0x29, 0x5d, 0x22, 0x20, 0x7d, + 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x07, 0x01, + 0x12, 0x04, 0x80, 0x02, 0x0a, 0x17, 0x0a, 0x25, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, + 0x12, 0x04, 0x82, 0x02, 0x04, 0x1c, 0x1a, 0x15, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x77, 0x65, + 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x75, 0x72, 0x6c, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, 0x04, 0x12, 0x04, 0x82, 0x02, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, 0x05, 0x12, 0x04, 0x82, 0x02, 0x0d, 0x13, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, 0x01, 0x12, 0x04, 0x82, 0x02, 0x14, 0x17, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, 0x03, 0x12, 0x04, 0x82, 0x02, 0x1a, + 0x1b, 0x0a, 0x49, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x07, 0x02, 0x01, 0x12, 0x04, 0x84, 0x02, 0x04, + 0x25, 0x1a, 0x39, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x07, 0x02, 0x01, 0x04, 0x12, 0x04, 0x84, 0x02, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x01, 0x05, 0x12, 0x04, 0x84, 0x02, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x01, 0x01, 0x12, 0x04, 0x84, 0x02, 0x14, 0x20, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x01, 0x03, 0x12, 0x04, 0x84, 0x02, 0x23, 0x24, + 0x0a, 0x5a, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x07, 0x02, 0x02, 0x12, 0x04, 0x86, 0x02, 0x04, 0x2c, + 0x1a, 0x4a, 0x2f, 0x20, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x07, 0x02, 0x02, 0x04, 0x12, 0x04, 0x86, 0x02, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x02, 0x05, 0x12, 0x04, 0x86, 0x02, 0x0d, 0x12, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x02, 0x01, 0x12, 0x04, 0x86, 0x02, 0x13, 0x27, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x02, 0x03, 0x12, 0x04, 0x86, 0x02, 0x2a, 0x2b, + 0x0a, 0x76, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x07, 0x02, 0x03, 0x12, 0x04, 0x89, 0x02, 0x04, 0x1f, + 0x1a, 0x66, 0x2f, 0x20, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x50, 0x61, 0x74, 0x68, 0x20, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x0a, 0x2f, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, + 0x20, 0x22, 0x24, 0x5b, 0x3f, 0x28, 0x40, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, + 0x3d, 0x3d, 0x20, 0x27, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x27, 0x20, 0x26, 0x26, 0x20, 0x40, + 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x42, 0x54, 0x43, 0x2f, + 0x55, 0x53, 0x44, 0x27, 0x29, 0x5d, 0x22, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, + 0x02, 0x03, 0x04, 0x12, 0x04, 0x89, 0x02, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x07, 0x02, 0x03, 0x05, 0x12, 0x04, 0x89, 0x02, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x07, 0x02, 0x03, 0x01, 0x12, 0x04, 0x89, 0x02, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x07, 0x02, 0x03, 0x03, 0x12, 0x04, 0x89, 0x02, 0x1d, 0x1e, 0x0a, 0xae, 0x06, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x08, 0x12, 0x06, 0x99, 0x02, 0x02, 0x9f, 0x02, 0x03, 0x1a, 0x9d, 0x06, + 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x72, 0x75, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x60, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x60, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x60, + 0x2e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x60, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x60, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, + 0x61, 0x64, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x60, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x60, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x54, 0x61, 0x73, 0x6b, 0x27, 0x73, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x60, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x60, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x69, 0x74, 0x73, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, + 0x22, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x6a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, + 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x22, 0x45, 0x50, 0x6a, 0x46, 0x57, + 0x64, 0x64, 0x35, 0x41, 0x75, 0x66, 0x71, 0x53, 0x53, 0x71, 0x65, 0x4d, 0x32, 0x71, 0x4e, 0x31, + 0x78, 0x7a, 0x79, 0x62, 0x61, 0x70, 0x43, 0x38, 0x47, 0x34, 0x77, 0x45, 0x47, 0x47, 0x6b, 0x5a, + 0x77, 0x79, 0x54, 0x44, 0x74, 0x31, 0x76, 0x22, 0x2c, 0x22, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x22, 0x44, 0x55, 0x41, 0x4c, + 0x61, 0x34, 0x46, 0x43, 0x32, 0x79, 0x52, 0x45, 0x77, 0x5a, 0x35, 0x39, 0x50, 0x48, 0x65, 0x75, + 0x31, 0x75, 0x6e, 0x34, 0x77, 0x69, 0x73, 0x33, 0x36, 0x76, 0x48, 0x52, 0x76, 0x35, 0x68, 0x57, + 0x56, 0x42, 0x6d, 0x7a, 0x79, 0x6b, 0x43, 0x4a, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, + 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x6c, 0x70, + 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x22, 0x3a, 0x22, 0x37, 0x79, 0x4a, 0x34, 0x67, 0x4d, 0x52, 0x4a, 0x68, 0x45, + 0x6f, 0x43, 0x52, 0x34, 0x38, 0x61, 0x50, 0x45, 0x33, 0x45, 0x41, 0x57, 0x52, 0x6d, 0x43, 0x6f, + 0x79, 0x67, 0x61, 0x6b, 0x69, 0x6b, 0x38, 0x31, 0x5a, 0x53, 0x31, 0x73, 0x61, 0x6a, 0x61, 0x54, + 0x6e, 0x45, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x00, 0x03, 0x08, 0x01, 0x12, 0x04, 0x99, 0x02, 0x0a, 0x19, 0x0a, 0x63, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x08, 0x02, 0x00, 0x12, 0x04, 0x9b, 0x02, 0x04, 0x1e, 0x1a, 0x53, 0x2f, 0x20, + 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x00, 0x04, 0x12, 0x04, 0x9b, 0x02, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x00, 0x06, 0x12, 0x04, 0x9b, + 0x02, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x00, 0x01, 0x12, 0x04, + 0x9b, 0x02, 0x12, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x00, 0x03, 0x12, + 0x04, 0x9b, 0x02, 0x1c, 0x1d, 0x0a, 0x7a, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x12, + 0x04, 0x9e, 0x02, 0x04, 0x21, 0x1a, 0x6a, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69, 0x66, 0x20, + 0x60, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x60, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x2f, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x04, 0x12, 0x04, 0x9e, 0x02, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x06, 0x12, 0x04, 0x9e, + 0x02, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x01, 0x12, 0x04, + 0x9e, 0x02, 0x12, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x03, 0x12, + 0x04, 0x9e, 0x02, 0x1f, 0x20, 0x0a, 0xab, 0x07, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x09, 0x12, 0x06, + 0xba, 0x02, 0x02, 0xc5, 0x02, 0x03, 0x1a, 0x9a, 0x07, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, + 0x61, 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, + 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, + 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x2c, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x62, 0x79, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, + 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, + 0x2c, 0x7b, 0x22, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, + 0x22, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x7d, 0x5d, 0x7d, + 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x62, 0x79, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, + 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x0a, + 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, + 0x22, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, + 0x3a, 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, + 0x32, 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, + 0x61, 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x7d, + 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, + 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x54, 0x45, 0x4e, 0x22, 0x2c, + 0x22, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, + 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x64, + 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x62, 0x69, 0x67, + 0x22, 0x3a, 0x22, 0x24, 0x7b, 0x54, 0x45, 0x4e, 0x7d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, + 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x09, 0x01, 0x12, 0x04, 0xba, 0x02, + 0x0a, 0x14, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x08, 0x00, 0x12, 0x06, 0xbb, 0x02, + 0x04, 0xc4, 0x02, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x08, 0x00, 0x01, 0x12, + 0x04, 0xbb, 0x02, 0x0a, 0x15, 0x0a, 0x45, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x02, 0x00, 0x12, + 0x04, 0xbd, 0x02, 0x06, 0x18, 0x1a, 0x35, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x65, 0x73, 0x20, 0x61, 0x20, 0x62, 0x61, 0x73, 0x69, 0x63, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, + 0x72, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x09, 0x02, 0x00, 0x05, 0x12, 0x04, 0xbd, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x00, 0x01, 0x12, 0x04, 0xbd, 0x02, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x00, 0x03, 0x12, 0x04, 0xbd, 0x02, 0x16, 0x17, 0x0a, + 0x43, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x02, 0x01, 0x12, 0x04, 0xbf, 0x02, 0x06, 0x23, 0x1a, + 0x33, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, + 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x01, 0x05, 0x12, + 0x04, 0xbf, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x01, 0x01, + 0x12, 0x04, 0xbf, 0x02, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x01, + 0x03, 0x12, 0x04, 0xbf, 0x02, 0x21, 0x22, 0x0a, 0x65, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x02, + 0x02, 0x12, 0x04, 0xc1, 0x02, 0x06, 0x18, 0x1a, 0x55, 0x2f, 0x20, 0x41, 0x20, 0x6a, 0x6f, 0x62, + 0x20, 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x02, 0x06, 0x12, 0x04, 0xc1, 0x02, 0x06, 0x0f, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x02, 0x01, 0x12, 0x04, 0xc1, 0x02, 0x10, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x02, 0x03, 0x12, 0x04, 0xc1, 0x02, 0x16, + 0x17, 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x02, 0x03, 0x12, 0x04, 0xc3, 0x02, 0x06, + 0x15, 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, 0x63, 0x63, 0x65, + 0x70, 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x60, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x03, 0x05, 0x12, 0x04, 0xc3, 0x02, 0x06, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x03, 0x01, 0x12, 0x04, 0xc3, 0x02, + 0x0d, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x03, 0x03, 0x12, 0x04, 0xc3, + 0x02, 0x13, 0x14, 0x0a, 0xbc, 0x07, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x0a, 0x12, 0x06, 0xe0, 0x02, + 0x02, 0xeb, 0x02, 0x03, 0x1a, 0xab, 0x07, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, + 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x20, + 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, + 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x2c, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, + 0x79, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, + 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, + 0x7d, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x79, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x22, 0x47, 0x76, 0x44, 0x4d, + 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, 0x59, 0x44, 0x4b, 0x32, + 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, 0x6d, 0x6f, 0x76, 0x38, + 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, + 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, + 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, + 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x54, 0x45, 0x4e, 0x22, 0x2c, 0x22, 0x6a, 0x6f, + 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x79, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x62, 0x69, 0x67, 0x22, + 0x3a, 0x22, 0x24, 0x7b, 0x54, 0x45, 0x4e, 0x7d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, + 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0a, 0x01, 0x12, 0x04, 0xe0, 0x02, 0x0a, + 0x16, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0a, 0x08, 0x00, 0x12, 0x06, 0xe1, 0x02, 0x04, + 0xea, 0x02, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0a, 0x08, 0x00, 0x01, 0x12, 0x04, + 0xe1, 0x02, 0x0a, 0x12, 0x0a, 0x35, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0a, 0x02, 0x00, 0x12, 0x04, + 0xe3, 0x02, 0x06, 0x18, 0x1a, 0x25, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0a, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe3, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0a, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe3, 0x02, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x0a, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe3, 0x02, 0x16, 0x17, 0x0a, 0x3a, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0a, 0x02, 0x01, 0x12, 0x04, 0xe5, 0x02, 0x06, 0x23, 0x1a, 0x2a, + 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x79, 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0a, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe5, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0a, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe5, 0x02, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0a, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe5, 0x02, 0x21, 0x22, 0x0a, 0x68, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x0a, 0x02, 0x02, 0x12, 0x04, 0xe7, 0x02, 0x06, 0x18, 0x1a, 0x58, 0x2f, + 0x20, 0x41, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0a, 0x02, + 0x02, 0x06, 0x12, 0x04, 0xe7, 0x02, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0a, + 0x02, 0x02, 0x01, 0x12, 0x04, 0xe7, 0x02, 0x10, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0a, 0x02, 0x02, 0x03, 0x12, 0x04, 0xe7, 0x02, 0x16, 0x17, 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x0a, 0x02, 0x03, 0x12, 0x04, 0xe9, 0x02, 0x06, 0x15, 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, + 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x60, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0a, 0x02, 0x03, 0x05, 0x12, 0x04, 0xe9, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0a, 0x02, 0x03, 0x01, 0x12, 0x04, 0xe9, 0x02, 0x0d, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0a, 0x02, 0x03, 0x03, 0x12, 0x04, 0xe9, 0x02, 0x13, 0x14, 0x0a, 0xa3, 0x07, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x0b, 0x12, 0x06, 0x86, 0x03, 0x02, 0x91, 0x03, 0x03, 0x1a, 0x92, 0x07, + 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x61, 0x64, 0x64, 0x20, 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, + 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x6a, + 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, + 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x6f, + 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, + 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, + 0x67, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, + 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, + 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x61, 0x64, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, + 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, + 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, + 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, + 0x2c, 0x7b, 0x22, 0x61, 0x64, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, 0x3a, + 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, + 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, + 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x7d, 0x7d, + 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, + 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x60, 0x60, + 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, + 0x7b, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x54, 0x45, 0x4e, + 0x22, 0x2c, 0x22, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x5d, + 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, + 0x22, 0x61, 0x64, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x62, 0x69, 0x67, 0x22, + 0x3a, 0x22, 0x24, 0x7b, 0x54, 0x45, 0x4e, 0x7d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, + 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0b, 0x01, 0x12, 0x04, 0x86, 0x03, 0x0a, + 0x11, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0b, 0x08, 0x00, 0x12, 0x06, 0x87, 0x03, 0x04, + 0x90, 0x03, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x08, 0x00, 0x01, 0x12, 0x04, + 0x87, 0x03, 0x0a, 0x12, 0x0a, 0x30, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x00, 0x12, 0x04, + 0x89, 0x03, 0x06, 0x18, 0x1a, 0x20, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, + 0x64, 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x00, + 0x05, 0x12, 0x04, 0x89, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, + 0x00, 0x01, 0x12, 0x04, 0x89, 0x03, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, + 0x02, 0x00, 0x03, 0x12, 0x04, 0x89, 0x03, 0x16, 0x17, 0x0a, 0x35, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x0b, 0x02, 0x01, 0x12, 0x04, 0x8b, 0x03, 0x06, 0x23, 0x1a, 0x25, 0x2f, 0x20, 0x53, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x62, 0x79, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x01, 0x05, 0x12, 0x04, 0x8b, 0x03, 0x06, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x01, 0x01, 0x12, 0x04, 0x8b, 0x03, + 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8b, + 0x03, 0x21, 0x22, 0x0a, 0x63, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x02, 0x12, 0x04, 0x8d, + 0x03, 0x06, 0x18, 0x1a, 0x53, 0x2f, 0x20, 0x41, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x77, 0x68, 0x6f, + 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, + 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, + 0x02, 0x02, 0x06, 0x12, 0x04, 0x8d, 0x03, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0b, 0x02, 0x02, 0x01, 0x12, 0x04, 0x8d, 0x03, 0x10, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0b, 0x02, 0x02, 0x03, 0x12, 0x04, 0x8d, 0x03, 0x16, 0x17, 0x0a, 0x4d, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x0b, 0x02, 0x03, 0x12, 0x04, 0x8f, 0x03, 0x06, 0x15, 0x1a, 0x3d, 0x2f, 0x20, 0x41, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x69, 0x67, + 0x2e, 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x60, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0b, 0x02, 0x03, 0x05, 0x12, 0x04, 0x8f, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0b, 0x02, 0x03, 0x01, 0x12, 0x04, 0x8f, 0x03, 0x0d, 0x10, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0b, 0x02, 0x03, 0x03, 0x12, 0x04, 0x8f, 0x03, 0x13, 0x14, 0x0a, 0xbc, 0x07, + 0x0a, 0x04, 0x04, 0x00, 0x03, 0x0c, 0x12, 0x06, 0xac, 0x03, 0x02, 0xb7, 0x03, 0x03, 0x1a, 0xab, + 0x07, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, + 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, + 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x6e, + 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x61, 0x20, 0x6a, + 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, + 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, + 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, + 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x73, 0x75, 0x62, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x6a, 0x6f, + 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, + 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, + 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, + 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, + 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, + 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, + 0x2c, 0x7b, 0x22, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x7b, 0x22, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, + 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, + 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, + 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, + 0x76, 0x52, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, + 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x22, 0x54, 0x45, 0x4e, 0x22, 0x2c, 0x22, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, + 0x7d, 0x5d, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, + 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x62, 0x69, 0x67, 0x22, 0x3a, 0x22, 0x24, 0x7b, 0x54, 0x45, + 0x4e, 0x7d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x03, 0x0c, 0x01, 0x12, 0x04, 0xac, 0x03, 0x0a, 0x16, 0x0a, 0x10, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x0c, 0x08, 0x00, 0x12, 0x06, 0xad, 0x03, 0x04, 0xb6, 0x03, 0x05, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x0c, 0x08, 0x00, 0x01, 0x12, 0x04, 0xad, 0x03, 0x0a, 0x15, 0x0a, 0x35, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x00, 0x12, 0x04, 0xaf, 0x03, 0x06, 0x18, 0x1a, 0x25, + 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x20, 0x73, 0x63, + 0x61, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x00, 0x05, + 0x12, 0x04, 0xaf, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x00, + 0x01, 0x12, 0x04, 0xaf, 0x03, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, + 0x00, 0x03, 0x12, 0x04, 0xaf, 0x03, 0x16, 0x17, 0x0a, 0x3a, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0c, + 0x02, 0x01, 0x12, 0x04, 0xb1, 0x03, 0x06, 0x23, 0x1a, 0x2a, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, + 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x01, 0x05, 0x12, + 0x04, 0xb1, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x01, 0x01, + 0x12, 0x04, 0xb1, 0x03, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x01, + 0x03, 0x12, 0x04, 0xb1, 0x03, 0x21, 0x22, 0x0a, 0x68, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0c, 0x02, + 0x02, 0x12, 0x04, 0xb3, 0x03, 0x06, 0x18, 0x1a, 0x58, 0x2f, 0x20, 0x41, 0x20, 0x6a, 0x6f, 0x62, + 0x20, 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x20, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x72, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x02, 0x06, 0x12, 0x04, 0xb3, 0x03, + 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x02, 0x01, 0x12, 0x04, 0xb3, + 0x03, 0x10, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x02, 0x03, 0x12, 0x04, + 0xb3, 0x03, 0x16, 0x17, 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x03, 0x12, 0x04, + 0xb5, 0x03, 0x06, 0x15, 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, + 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, + 0x2e, 0x60, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x03, 0x05, 0x12, 0x04, + 0xb5, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x03, 0x01, 0x12, + 0x04, 0xb5, 0x03, 0x0d, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x03, 0x03, + 0x12, 0x04, 0xb5, 0x03, 0x13, 0x14, 0x0a, 0x8c, 0x09, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x0d, 0x12, + 0x06, 0xd7, 0x03, 0x02, 0xe8, 0x03, 0x03, 0x1a, 0xfb, 0x08, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x53, 0x65, 0x65, 0x20, + 0x6f, 0x75, 0x72, 0x20, 0x62, 0x6c, 0x6f, 0x67, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x6e, + 0x20, 0x5b, 0x46, 0x61, 0x69, 0x72, 0x20, 0x4c, 0x50, 0x20, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x20, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x5d, 0x28, 0x2f, 0x62, 0x6c, 0x6f, 0x67, 0x2f, 0x32, + 0x30, 0x32, 0x32, 0x2f, 0x30, 0x31, 0x2f, 0x32, 0x30, 0x2f, 0x46, 0x61, 0x69, 0x72, 0x2d, 0x4c, + 0x50, 0x2d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2d, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x29, + 0x0a, 0x0a, 0x2a, 0x4e, 0x4f, 0x54, 0x45, 0x2a, 0x2a, 0x3a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, + 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x0a, + 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, + 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x6e, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x70, 0x6f, 0x6f, 0x6c, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x63, 0x61, + 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x43, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, + 0x22, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x50, 0x44, 0x46, 0x52, 0x4d, + 0x33, 0x48, 0x4d, 0x72, 0x38, 0x43, 0x41, 0x47, 0x58, 0x77, 0x4b, 0x48, 0x69, 0x75, 0x32, 0x66, + 0x35, 0x65, 0x50, 0x53, 0x70, 0x61, 0x69, 0x45, 0x4a, 0x68, 0x61, 0x55, 0x52, 0x77, 0x68, 0x73, + 0x52, 0x72, 0x55, 0x55, 0x74, 0x39, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, + 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x20, 0x4f, 0x72, 0x63, 0x61, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x43, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x60, + 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, + 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x3a, 0x20, 0x22, 0x41, 0x50, 0x44, 0x46, 0x52, 0x4d, 0x33, 0x48, 0x4d, 0x72, 0x38, 0x43, 0x41, + 0x47, 0x58, 0x77, 0x4b, 0x48, 0x69, 0x75, 0x32, 0x66, 0x35, 0x65, 0x50, 0x53, 0x70, 0x61, 0x69, + 0x45, 0x4a, 0x68, 0x61, 0x55, 0x52, 0x77, 0x68, 0x73, 0x52, 0x72, 0x55, 0x55, 0x74, 0x39, 0x22, + 0x2c, 0x20, 0x22, 0x75, 0x73, 0x65, 0x46, 0x61, 0x69, 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x22, 0x70, 0x72, 0x69, 0x63, 0x65, 0x46, 0x65, + 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x20, + 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, + 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, + 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x2c, 0x20, + 0x22, 0x42, 0x6a, 0x55, 0x67, 0x6a, 0x36, 0x59, 0x43, 0x6e, 0x46, 0x42, 0x5a, 0x34, 0x39, 0x77, + 0x46, 0x35, 0x34, 0x64, 0x64, 0x42, 0x56, 0x41, 0x39, 0x71, 0x75, 0x38, 0x54, 0x65, 0x71, 0x6b, + 0x46, 0x74, 0x6b, 0x62, 0x71, 0x6d, 0x5a, 0x63, 0x65, 0x65, 0x38, 0x75, 0x57, 0x22, 0x20, 0x5d, + 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x52, 0x61, + 0x79, 0x64, 0x69, 0x75, 0x6d, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4f, 0x4c, 0x2f, + 0x55, 0x53, 0x44, 0x43, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, + 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x72, 0x61, 0x79, 0x64, + 0x69, 0x75, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, + 0x20, 0x22, 0x35, 0x38, 0x6f, 0x51, 0x43, 0x68, 0x78, 0x34, 0x79, 0x57, 0x6d, 0x76, 0x4b, 0x64, + 0x77, 0x4c, 0x4c, 0x5a, 0x7a, 0x42, 0x69, 0x34, 0x43, 0x68, 0x6f, 0x43, 0x63, 0x32, 0x66, 0x71, + 0x43, 0x55, 0x57, 0x42, 0x6b, 0x77, 0x4d, 0x69, 0x68, 0x4c, 0x59, 0x51, 0x6f, 0x32, 0x22, 0x2c, + 0x20, 0x22, 0x75, 0x73, 0x65, 0x46, 0x61, 0x69, 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x22, 0x70, 0x72, 0x69, 0x63, 0x65, 0x46, 0x65, 0x65, 0x64, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x47, 0x76, + 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, 0x59, 0x44, + 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, 0x6d, 0x6f, + 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x2c, 0x22, 0x42, 0x6a, 0x55, + 0x67, 0x6a, 0x36, 0x59, 0x43, 0x6e, 0x46, 0x42, 0x5a, 0x34, 0x39, 0x77, 0x46, 0x35, 0x34, 0x64, + 0x64, 0x42, 0x56, 0x41, 0x39, 0x71, 0x75, 0x38, 0x54, 0x65, 0x71, 0x6b, 0x46, 0x74, 0x6b, 0x62, + 0x71, 0x6d, 0x5a, 0x63, 0x65, 0x65, 0x38, 0x75, 0x57, 0x22, 0x20, 0x5d, 0x20, 0x7d, 0x20, 0x7d, + 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0d, 0x01, 0x12, 0x04, + 0xd7, 0x03, 0x0a, 0x1a, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x08, 0x00, 0x12, 0x06, + 0xd8, 0x03, 0x04, 0xe1, 0x03, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x08, 0x00, + 0x01, 0x12, 0x04, 0xd8, 0x03, 0x0a, 0x15, 0x0a, 0x8c, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, + 0x02, 0x00, 0x12, 0x04, 0xda, 0x03, 0x06, 0x28, 0x1a, 0x7c, 0x2f, 0x20, 0x4d, 0x65, 0x72, 0x63, + 0x75, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x70, 0x6f, + 0x6f, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, + 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, 0x2d, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x77, 0x61, 0x70, 0x2d, 0x6e, 0x2d, 0x70, 0x6f, + 0x6f, 0x6c, 0x2d, 0x6a, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x00, + 0x05, 0x12, 0x04, 0xda, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xda, 0x03, 0x0d, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, + 0x02, 0x00, 0x03, 0x12, 0x04, 0xda, 0x03, 0x26, 0x27, 0x0a, 0x75, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x0d, 0x02, 0x01, 0x12, 0x04, 0xdc, 0x03, 0x06, 0x24, 0x1a, 0x65, 0x2f, 0x20, 0x53, 0x61, 0x62, + 0x65, 0x72, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, + 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x73, 0x61, 0x62, 0x65, 0x72, 0x2d, 0x68, 0x71, 0x2f, 0x73, 0x61, 0x62, 0x65, + 0x72, 0x2d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2d, 0x64, 0x69, 0x73, 0x74, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x01, 0x05, 0x12, 0x04, 0xdc, 0x03, 0x06, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x01, 0x01, 0x12, 0x04, 0xdc, 0x03, + 0x0d, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x01, 0x03, 0x12, 0x04, 0xdc, + 0x03, 0x22, 0x23, 0x0a, 0x5e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x02, 0x12, 0x04, 0xde, + 0x03, 0x06, 0x23, 0x1a, 0x4e, 0x2f, 0x20, 0x4f, 0x72, 0x63, 0x61, 0x20, 0x70, 0x6f, 0x6f, 0x6c, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x72, 0x63, 0x61, 0x2e, 0x73, 0x6f, 0x2f, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x02, 0x05, 0x12, 0x04, + 0xde, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x02, 0x01, 0x12, + 0x04, 0xde, 0x03, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x02, 0x03, + 0x12, 0x04, 0xde, 0x03, 0x21, 0x22, 0x0a, 0x6c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x03, + 0x12, 0x04, 0xe0, 0x03, 0x06, 0x26, 0x1a, 0x5c, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, 0x61, + 0x79, 0x64, 0x69, 0x75, 0x6d, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x6d, 0x6d, 0x49, 0x64, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x72, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x2e, 0x69, 0x6f, 0x2f, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x03, 0x05, 0x12, + 0x04, 0xe0, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x03, 0x01, + 0x12, 0x04, 0xe0, 0x03, 0x0d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x03, + 0x03, 0x12, 0x04, 0xe0, 0x03, 0x24, 0x25, 0x0a, 0xc3, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, + 0x02, 0x04, 0x12, 0x04, 0xe3, 0x03, 0x04, 0x2d, 0x1a, 0xb2, 0x01, 0x2f, 0x20, 0x41, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, + 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, + 0x72, 0x20, 0x4c, 0x50, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x69, 0x74, 0x69, 0x67, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6c, + 0x61, 0x73, 0x68, 0x20, 0x6c, 0x6f, 0x61, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6d, + 0x61, 0x6e, 0x69, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x04, 0x04, 0x12, 0x04, 0xe3, 0x03, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x04, 0x05, 0x12, 0x04, 0xe3, 0x03, 0x0d, 0x13, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x04, 0x01, 0x12, 0x04, 0xe3, 0x03, 0x14, 0x28, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x04, 0x03, 0x12, 0x04, 0xe3, 0x03, 0x2b, + 0x2c, 0x0a, 0x7b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x12, 0x04, 0xe5, 0x03, 0x04, + 0x2b, 0x1a, 0x6b, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x20, 0x66, 0x65, 0x65, 0x64, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x04, 0x12, 0x04, 0xe5, 0x03, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x06, 0x12, 0x04, 0xe5, 0x03, 0x0d, 0x16, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x01, 0x12, 0x04, 0xe5, 0x03, 0x17, + 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x03, 0x12, 0x04, 0xe5, 0x03, + 0x29, 0x2a, 0x0a, 0x80, 0x02, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x06, 0x12, 0x04, 0xe7, + 0x03, 0x04, 0x25, 0x1a, 0xef, 0x01, 0x2f, 0x20, 0x49, 0x66, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x65, 0x65, + 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x4c, 0x50, 0x20, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x2e, 0x20, 0x53, 0x65, 0x65, 0x20, 0x6f, 0x75, 0x72, 0x20, + 0x62, 0x6c, 0x6f, 0x67, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x6f, + 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x78, 0x79, 0x7a, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x2d, 0x6c, 0x70, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2d, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x2d, 0x39, 0x34, 0x61, 0x34, 0x35, 0x37, 0x63, 0x35, + 0x30, 0x32, 0x33, 0x39, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x06, 0x04, + 0x12, 0x04, 0xe7, 0x03, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x06, + 0x05, 0x12, 0x04, 0xe7, 0x03, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, + 0x06, 0x01, 0x12, 0x04, 0xe7, 0x03, 0x12, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, + 0x02, 0x06, 0x03, 0x12, 0x04, 0xe7, 0x03, 0x23, 0x24, 0x0a, 0xfa, 0x03, 0x0a, 0x04, 0x04, 0x00, + 0x03, 0x0e, 0x12, 0x06, 0xfd, 0x03, 0x02, 0x97, 0x04, 0x03, 0x1a, 0xe9, 0x03, 0x0a, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, + 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, + 0x76, 0x65, 0x6e, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, + 0x72, 0x63, 0x61, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x43, 0x20, 0x70, 0x6f, 0x6f, + 0x6c, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6c, 0x70, + 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x50, 0x44, 0x46, 0x52, 0x4d, 0x33, + 0x48, 0x4d, 0x72, 0x38, 0x43, 0x41, 0x47, 0x58, 0x77, 0x4b, 0x48, 0x69, 0x75, 0x32, 0x66, 0x35, + 0x65, 0x50, 0x53, 0x70, 0x61, 0x69, 0x45, 0x4a, 0x68, 0x61, 0x55, 0x52, 0x77, 0x68, 0x73, 0x52, + 0x72, 0x55, 0x55, 0x74, 0x39, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x52, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x43, + 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, + 0x20, 0x22, 0x6c, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x72, 0x61, 0x79, 0x64, 0x69, 0x75, + 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, + 0x35, 0x38, 0x6f, 0x51, 0x43, 0x68, 0x78, 0x34, 0x79, 0x57, 0x6d, 0x76, 0x4b, 0x64, 0x77, 0x4c, + 0x4c, 0x5a, 0x7a, 0x42, 0x69, 0x34, 0x43, 0x68, 0x6f, 0x43, 0x63, 0x32, 0x66, 0x71, 0x43, 0x55, + 0x57, 0x42, 0x6b, 0x77, 0x4d, 0x69, 0x68, 0x4c, 0x59, 0x51, 0x6f, 0x32, 0x22, 0x20, 0x7d, 0x20, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0e, 0x01, 0x12, + 0x04, 0xfd, 0x03, 0x0a, 0x1c, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x04, 0x00, 0x12, + 0x06, 0xfe, 0x03, 0x04, 0x81, 0x04, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x04, + 0x00, 0x01, 0x12, 0x04, 0xfe, 0x03, 0x09, 0x0e, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x0e, + 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xff, 0x03, 0x06, 0x11, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x0e, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xff, 0x03, 0x06, 0x0c, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x0e, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xff, 0x03, 0x0f, 0x10, + 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x0e, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0x80, 0x04, + 0x06, 0x12, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x0e, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, + 0x04, 0x80, 0x04, 0x06, 0x0d, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x0e, 0x04, 0x00, 0x02, + 0x01, 0x02, 0x12, 0x04, 0x80, 0x04, 0x10, 0x11, 0x0a, 0x5f, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, + 0x02, 0x00, 0x12, 0x04, 0x83, 0x04, 0x04, 0x29, 0x1a, 0x4f, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x64, + 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x65, 0x72, 0x63, 0x75, + 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0e, 0x02, 0x00, 0x04, 0x12, 0x04, 0x83, 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0e, 0x02, 0x00, 0x05, 0x12, 0x04, 0x83, 0x04, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0e, 0x02, 0x00, 0x01, 0x12, 0x04, 0x83, 0x04, 0x14, 0x24, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0e, 0x02, 0x00, 0x03, 0x12, 0x04, 0x83, 0x04, 0x27, 0x28, 0x0a, 0x60, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x01, 0x12, 0x04, 0x85, 0x04, 0x04, 0x2a, 0x1a, 0x50, 0x2f, + 0x20, 0x55, 0x73, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x69, 0x64, 0x65, 0x20, + 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x01, 0x04, 0x12, 0x04, 0x85, 0x04, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x01, 0x05, 0x12, 0x04, 0x85, 0x04, 0x0d, + 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x01, 0x01, 0x12, 0x04, 0x85, 0x04, + 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x01, 0x03, 0x12, 0x04, 0x85, + 0x04, 0x28, 0x29, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x08, 0x00, 0x12, 0x06, 0x86, + 0x04, 0x04, 0x94, 0x04, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x08, 0x00, 0x01, + 0x12, 0x04, 0x86, 0x04, 0x0a, 0x15, 0x0a, 0x8c, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, + 0x02, 0x12, 0x04, 0x88, 0x04, 0x06, 0x28, 0x1a, 0x7c, 0x2f, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x75, + 0x72, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x70, 0x6f, 0x6f, + 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, + 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, 0x2d, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x77, 0x61, 0x70, 0x2d, 0x6e, 0x2d, 0x70, 0x6f, 0x6f, + 0x6c, 0x2d, 0x6a, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x02, 0x05, + 0x12, 0x04, 0x88, 0x04, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x02, + 0x01, 0x12, 0x04, 0x88, 0x04, 0x0d, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, + 0x02, 0x03, 0x12, 0x04, 0x88, 0x04, 0x26, 0x27, 0x0a, 0x75, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, + 0x02, 0x03, 0x12, 0x04, 0x8a, 0x04, 0x06, 0x24, 0x1a, 0x65, 0x2f, 0x20, 0x53, 0x61, 0x62, 0x65, + 0x72, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x20, + 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x73, 0x61, 0x62, 0x65, 0x72, 0x2d, 0x68, 0x71, 0x2f, 0x73, 0x61, 0x62, 0x65, 0x72, + 0x2d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2d, 0x64, 0x69, 0x73, 0x74, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x03, 0x05, 0x12, 0x04, 0x8a, 0x04, 0x06, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x03, 0x01, 0x12, 0x04, 0x8a, 0x04, 0x0d, + 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x03, 0x03, 0x12, 0x04, 0x8a, 0x04, + 0x22, 0x23, 0x0a, 0x36, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x04, 0x12, 0x04, 0x8c, 0x04, + 0x06, 0x40, 0x1a, 0x26, 0x2f, 0x20, 0x2a, 0x2a, 0x40, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x2a, 0x2a, 0x20, 0x55, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, + 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0e, 0x02, 0x04, 0x05, 0x12, 0x04, 0x8c, 0x04, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0e, 0x02, 0x04, 0x01, 0x12, 0x04, 0x8c, 0x04, 0x0d, 0x29, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0e, 0x02, 0x04, 0x03, 0x12, 0x04, 0x8c, 0x04, 0x2c, 0x2d, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x04, 0x08, 0x12, 0x04, 0x8c, 0x04, 0x2e, 0x3f, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x04, 0x08, 0x03, 0x12, 0x04, 0x8c, 0x04, 0x2f, 0x3e, + 0x0a, 0x6c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x05, 0x12, 0x04, 0x8e, 0x04, 0x06, 0x26, + 0x1a, 0x5c, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x20, + 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x61, + 0x6d, 0x6d, 0x49, 0x64, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, + 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x72, 0x61, 0x79, + 0x64, 0x69, 0x75, 0x6d, 0x2e, 0x69, 0x6f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x05, 0x05, 0x12, 0x04, 0x8e, 0x04, 0x06, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x05, 0x01, 0x12, 0x04, 0x8e, 0x04, 0x0d, 0x21, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x05, 0x03, 0x12, 0x04, 0x8e, 0x04, 0x24, + 0x25, 0x0a, 0x8d, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x06, 0x12, 0x04, 0x91, 0x04, + 0x06, 0x23, 0x1a, 0x7d, 0x2f, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x4f, 0x72, 0x63, 0x61, 0x20, 0x4c, + 0x50, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x72, 0x6c, 0x70, + 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x2f, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x72, 0x63, 0x61, 0x20, 0x4c, 0x50, 0x20, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x6f, 0x72, 0x63, 0x61, 0x2e, 0x73, 0x6f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x06, 0x05, 0x12, 0x04, 0x91, 0x04, + 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x06, 0x01, 0x12, 0x04, 0x91, + 0x04, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x06, 0x03, 0x12, 0x04, + 0x91, 0x04, 0x21, 0x22, 0x0a, 0x6f, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x07, 0x12, 0x04, + 0x93, 0x04, 0x06, 0x26, 0x1a, 0x5f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x50, 0x6f, 0x72, 0x74, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x2e, + 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2d, 0x76, 0x31, 0x2e, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x07, 0x05, + 0x12, 0x04, 0x93, 0x04, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x07, + 0x01, 0x12, 0x04, 0x93, 0x04, 0x0d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, + 0x07, 0x03, 0x12, 0x04, 0x93, 0x04, 0x24, 0x25, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, + 0x02, 0x08, 0x12, 0x04, 0x96, 0x04, 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, + 0x02, 0x08, 0x04, 0x12, 0x04, 0x96, 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0e, 0x02, 0x08, 0x06, 0x12, 0x04, 0x96, 0x04, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0e, 0x02, 0x08, 0x01, 0x12, 0x04, 0x96, 0x04, 0x13, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0e, 0x02, 0x08, 0x03, 0x12, 0x04, 0x96, 0x04, 0x1b, 0x1c, 0x0a, 0xe4, 0x04, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x0f, 0x12, 0x06, 0xc1, 0x04, 0x02, 0xc8, 0x04, 0x03, 0x1a, 0xd3, 0x04, + 0x0a, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x67, + 0x75, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x27, 0x73, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x67, 0x65, 0x78, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x0a, + 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, + 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, + 0x7b, 0x0a, 0x22, 0x72, 0x65, 0x67, 0x65, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x22, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x5c, 0x5c, 0x64, 0x2b, 0x22, 0x2c, 0x0a, 0x22, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x30, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, + 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x73, 0x0a, + 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x22, 0x72, 0x65, 0x67, 0x65, + 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x0a, 0x22, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5c, 0x22, 0x28, + 0x5b, 0x5e, 0x5c, 0x22, 0x5d, 0x2b, 0x29, 0x5c, 0x22, 0x22, 0x2c, 0x0a, 0x22, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, 0x0a, 0x7d, 0x0a, 0x7d, + 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x22, 0x72, 0x65, 0x67, + 0x65, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0x0a, 0x22, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5c, 0x5c, + 0x7b, 0x5b, 0x5e, 0x7d, 0x5d, 0x2b, 0x5c, 0x5c, 0x7d, 0x22, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, + 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0f, 0x01, 0x12, 0x04, 0xc1, 0x04, + 0x0a, 0x1a, 0x0a, 0x7e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x12, 0x04, 0xc4, 0x04, + 0x04, 0x20, 0x1a, 0x6e, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, + 0x72, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61, 0x67, + 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x0a, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x61, 0x6e, 0x63, 0x79, 0x2d, 0x72, 0x65, 0x67, 0x65, 0x78, 0x20, 0x52, + 0x75, 0x73, 0x74, 0x20, 0x63, 0x72, 0x61, 0x74, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x04, 0x12, 0x04, 0xc4, + 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x05, 0x12, 0x04, + 0xc4, 0x04, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x01, 0x12, + 0x04, 0xc4, 0x04, 0x14, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x03, + 0x12, 0x04, 0xc4, 0x04, 0x1e, 0x1f, 0x0a, 0x96, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0f, 0x02, + 0x01, 0x12, 0x04, 0xc7, 0x04, 0x04, 0x24, 0x1a, 0x85, 0x01, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, + 0x28, 0x30, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x31, 0x2b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x29, 0x2e, 0x0a, 0x2f, 0x20, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x30, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x01, 0x04, 0x12, 0x04, 0xc7, 0x04, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc7, 0x04, 0x0d, + 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc7, 0x04, + 0x13, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc7, + 0x04, 0x22, 0x23, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x10, 0x12, 0x06, 0xca, 0x04, 0x02, + 0xd1, 0x04, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x10, 0x01, 0x12, 0x04, 0xca, 0x04, + 0x0a, 0x18, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x10, 0x08, 0x00, 0x12, 0x06, 0xcb, 0x04, + 0x04, 0xd0, 0x04, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x08, 0x00, 0x01, 0x12, + 0x04, 0xcb, 0x04, 0x0a, 0x14, 0x0a, 0x59, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x10, 0x02, 0x00, 0x12, + 0x04, 0xcd, 0x04, 0x06, 0x1e, 0x1a, 0x49, 0x2f, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x53, 0x54, 0x45, 0x50, 0x2f, 0x55, 0x53, 0x44, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x00, 0x06, 0x12, 0x04, 0xcd, 0x04, 0x06, + 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x00, 0x01, 0x12, 0x04, 0xcd, 0x04, + 0x11, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x00, 0x03, 0x12, 0x04, 0xcd, + 0x04, 0x1c, 0x1d, 0x0a, 0x3a, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x10, 0x02, 0x01, 0x12, 0x04, 0xcf, + 0x04, 0x06, 0x28, 0x1a, 0x2a, 0x2f, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x70, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x54, 0x45, 0x50, 0x2f, 0x55, 0x53, 0x44, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x01, 0x05, 0x12, 0x04, 0xcf, 0x04, 0x06, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x01, 0x01, 0x12, 0x04, 0xcf, 0x04, 0x0d, + 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x01, 0x03, 0x12, 0x04, 0xcf, 0x04, + 0x26, 0x27, 0x0a, 0x9b, 0x05, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x11, 0x12, 0x06, 0xe0, 0x04, 0x02, + 0xed, 0x04, 0x03, 0x1a, 0x8a, 0x05, 0x0a, 0x54, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x61, 0x20, 0x74, + 0x77, 0x61, 0x70, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x61, 0x20, 0x73, 0x65, 0x74, 0x20, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, + 0x61, 0x69, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x20, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x20, 0x4e, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x54, 0x77, 0x61, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x65, 0x64, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x20, 0x61, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, + 0x76, 0x65, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x2e, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x31, 0x68, 0x72, 0x20, 0x54, 0x77, 0x61, 0x70, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x20, 0x41, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x36, 0x30, 0x20, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x7b, 0x20, 0x22, 0x74, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x20, 0x22, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, + 0x65, 0x79, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, + 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, + 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, + 0x76, 0x52, 0x22, 0x2c, 0x20, 0x22, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x3a, 0x20, 0x33, + 0x36, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x6d, 0x69, 0x6e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x36, 0x30, 0x2c, 0x20, 0x22, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, 0x79, + 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x11, 0x01, 0x12, 0x04, 0xe0, 0x04, 0x0a, 0x12, 0x0a, + 0x36, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, 0x00, 0x12, 0x04, 0xe2, 0x04, 0x04, 0x2a, 0x1a, + 0x26, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x54, 0x57, 0x41, 0x50, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, + 0x00, 0x04, 0x12, 0x04, 0xe2, 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, + 0x02, 0x00, 0x05, 0x12, 0x04, 0xe2, 0x04, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x11, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe2, 0x04, 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x11, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe2, 0x04, 0x28, 0x29, 0x0a, 0x42, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x11, 0x02, 0x01, 0x12, 0x04, 0xe4, 0x04, 0x04, 0x1e, 0x1a, 0x32, 0x2f, 0x20, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x77, 0x61, 0x70, 0x20, 0x73, 0x68, 0x6f, 0x75, + 0x6c, 0x64, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x01, 0x04, 0x12, 0x04, 0xe4, 0x04, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe4, 0x04, 0x0d, + 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe4, 0x04, + 0x13, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe4, + 0x04, 0x1c, 0x1d, 0x0a, 0x3b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x12, 0x04, 0xe6, + 0x04, 0x04, 0x31, 0x1a, 0x2b, 0x2f, 0x20, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x70, + 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x04, 0x12, 0x04, 0xe6, 0x04, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x05, 0x12, 0x04, 0xe6, 0x04, + 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x01, 0x12, 0x04, 0xe6, + 0x04, 0x12, 0x2c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x03, 0x12, 0x04, + 0xe6, 0x04, 0x2f, 0x30, 0x0a, 0x57, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, 0x12, 0x04, + 0xe8, 0x04, 0x04, 0x24, 0x1a, 0x47, 0x2f, 0x20, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, 0x04, 0x12, 0x04, 0xe8, 0x04, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, 0x05, 0x12, 0x04, 0xe8, 0x04, 0x0d, 0x13, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, 0x01, 0x12, 0x04, 0xe8, 0x04, 0x14, 0x1f, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, 0x03, 0x12, 0x04, 0xe8, 0x04, 0x22, + 0x23, 0x0a, 0x40, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, 0x04, 0x12, 0x04, 0xea, 0x04, 0x04, + 0x2d, 0x1a, 0x30, 0x2f, 0x20, 0x45, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x6e, 0x69, 0x78, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x75, 0x70, 0x20, + 0x74, 0x6f, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x04, 0x04, 0x12, 0x04, + 0xea, 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x04, 0x05, 0x12, + 0x04, 0xea, 0x04, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x04, 0x01, + 0x12, 0x04, 0xea, 0x04, 0x13, 0x28, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x04, + 0x03, 0x12, 0x04, 0xea, 0x04, 0x2b, 0x2c, 0x0a, 0x44, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, + 0x05, 0x12, 0x04, 0xec, 0x04, 0x04, 0x3a, 0x1a, 0x34, 0x2f, 0x20, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x67, + 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x6e, + 0x69, 0x78, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x05, 0x04, 0x12, 0x04, 0xec, 0x04, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x05, 0x06, 0x12, 0x04, 0xec, 0x04, 0x0d, 0x1a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x05, 0x01, 0x12, 0x04, 0xec, 0x04, 0x1b, 0x35, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x05, 0x03, 0x12, 0x04, 0xec, 0x04, 0x38, + 0x39, 0x0a, 0x43, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x12, 0x12, 0x06, 0xf0, 0x04, 0x02, 0xf3, 0x04, + 0x03, 0x1a, 0x33, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x20, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x75, 0x6d, 0x27, 0x73, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x62, 0x6f, 0x6f, 0x6b, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x12, 0x01, 0x12, + 0x04, 0xf0, 0x04, 0x0a, 0x17, 0x0a, 0x39, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x12, 0x02, 0x00, 0x12, + 0x04, 0xf2, 0x04, 0x04, 0x2b, 0x1a, 0x29, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, + 0x75, 0x6d, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x12, 0x02, 0x00, 0x04, 0x12, 0x04, 0xf2, 0x04, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x12, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf2, 0x04, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x12, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf2, + 0x04, 0x14, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x12, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xf2, 0x04, 0x29, 0x2a, 0x0a, 0xb5, 0x02, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x13, 0x12, 0x06, 0x82, + 0x05, 0x02, 0x8b, 0x05, 0x03, 0x1a, 0xa4, 0x02, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, + 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x2e, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x52, 0x61, 0x69, 0x73, 0x65, 0x20, 0x32, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x5e, 0x33, 0x0a, + 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x32, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x70, + 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, + 0x22, 0x3a, 0x33, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x03, 0x13, 0x01, 0x12, 0x04, 0x82, 0x05, 0x0a, 0x11, 0x0a, 0x10, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x13, 0x08, 0x00, 0x12, 0x06, 0x83, 0x05, 0x04, 0x8a, 0x05, 0x05, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x13, 0x08, 0x00, 0x01, 0x12, 0x04, 0x83, 0x05, 0x0a, 0x12, 0x0a, 0x43, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x13, 0x02, 0x00, 0x12, 0x04, 0x85, 0x05, 0x06, 0x18, 0x1a, 0x33, + 0x2f, 0x20, 0x54, 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x69, + 0x6e, 0x67, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x00, 0x05, 0x12, 0x04, + 0x85, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x00, 0x01, 0x12, + 0x04, 0x85, 0x05, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x00, 0x03, + 0x12, 0x04, 0x85, 0x05, 0x16, 0x17, 0x0a, 0x53, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x13, 0x02, 0x01, + 0x12, 0x04, 0x87, 0x05, 0x06, 0x23, 0x1a, 0x43, 0x2f, 0x20, 0x54, 0x61, 0x6b, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x13, 0x02, 0x01, 0x05, 0x12, 0x04, 0x87, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x13, 0x02, 0x01, 0x01, 0x12, 0x04, 0x87, 0x05, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x01, 0x03, 0x12, 0x04, 0x87, 0x05, 0x21, 0x22, 0x0a, 0x4d, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x13, 0x02, 0x02, 0x12, 0x04, 0x89, 0x05, 0x06, 0x15, 0x1a, 0x3d, + 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x62, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, + 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x60, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x02, 0x05, 0x12, 0x04, 0x89, 0x05, 0x06, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x02, 0x01, 0x12, 0x04, 0x89, 0x05, 0x0d, 0x10, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x02, 0x03, 0x12, 0x04, 0x89, 0x05, 0x13, 0x14, + 0x0a, 0x47, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x14, 0x12, 0x06, 0x8e, 0x05, 0x02, 0x9a, 0x05, 0x03, + 0x1a, 0x37, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x53, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, + 0x14, 0x01, 0x12, 0x04, 0x8e, 0x05, 0x0a, 0x19, 0x0a, 0x50, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x14, + 0x02, 0x00, 0x12, 0x04, 0x90, 0x05, 0x04, 0x21, 0x1a, 0x40, 0x2f, 0x20, 0x30, 0x31, 0x2c, 0x20, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x75, + 0x6d, 0x2c, 0x20, 0x6a, 0x65, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x72, 0x69, 0x78, 0x2c, 0x20, 0x6d, + 0x61, 0x6e, 0x67, 0x6f, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x73, 0x6f, 0x6c, 0x65, + 0x6e, 0x64, 0x2c, 0x20, 0x74, 0x75, 0x6c, 0x69, 0x70, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x14, 0x02, 0x00, 0x04, 0x12, 0x04, 0x90, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x14, 0x02, 0x00, 0x05, 0x12, 0x04, 0x90, 0x05, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x14, 0x02, 0x00, 0x01, 0x12, 0x04, 0x90, 0x05, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x00, 0x03, 0x12, 0x04, 0x90, 0x05, 0x1f, 0x20, 0x0a, 0x48, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x14, 0x02, 0x01, 0x12, 0x04, 0x92, 0x05, 0x04, 0x23, 0x1a, 0x38, + 0x2f, 0x20, 0x41, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6d, 0x69, 0x6e, 0x74, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x6f, 0x73, 0x65, 0x6e, 0x20, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, + 0x02, 0x01, 0x04, 0x12, 0x04, 0x92, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x14, 0x02, 0x01, 0x05, 0x12, 0x04, 0x92, 0x05, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x14, 0x02, 0x01, 0x01, 0x12, 0x04, 0x92, 0x05, 0x14, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x14, 0x02, 0x01, 0x03, 0x12, 0x04, 0x92, 0x05, 0x21, 0x22, 0x0a, 0x10, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x12, 0x06, 0x93, 0x05, 0x04, 0x98, 0x05, 0x05, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x01, 0x12, 0x04, 0x93, 0x05, 0x09, 0x0e, 0x0a, + 0x29, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x95, 0x05, 0x06, + 0x1d, 0x1a, 0x17, 0x2f, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x6c, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x74, 0x65, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x14, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x95, 0x05, 0x06, 0x18, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0x95, 0x05, 0x1b, 0x1c, + 0x0a, 0x28, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0x97, 0x05, + 0x06, 0x1c, 0x1a, 0x16, 0x2f, 0x20, 0x62, 0x6f, 0x72, 0x72, 0x6f, 0x77, 0x20, 0x6c, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x74, 0x65, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x14, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x97, 0x05, 0x06, 0x17, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0x97, 0x05, 0x1a, 0x1b, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x12, 0x04, 0x99, 0x05, 0x04, 0x1d, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x04, 0x12, 0x04, 0x99, 0x05, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x06, 0x12, 0x04, 0x99, 0x05, + 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x01, 0x12, 0x04, 0x99, + 0x05, 0x13, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x03, 0x12, 0x04, + 0x99, 0x05, 0x1b, 0x1c, 0x0a, 0x47, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x15, 0x12, 0x06, 0x9d, 0x05, + 0x02, 0xa0, 0x05, 0x03, 0x1a, 0x37, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x4d, 0x61, 0x6e, 0x67, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x70, + 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x0a, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x00, 0x03, 0x15, 0x01, 0x12, 0x04, 0x9d, 0x05, 0x0a, 0x1d, 0x0a, 0xb0, 0x01, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x12, 0x04, 0x9f, 0x05, 0x04, 0x2c, 0x1a, 0x9f, 0x01, + 0x2f, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x6e, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x20, 0x70, 0x65, + 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x20, + 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2d, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x2d, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x76, 0x33, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, + 0x6e, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, 0x64, 0x73, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x04, 0x12, 0x04, 0x9f, 0x05, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x05, 0x12, 0x04, 0x9f, 0x05, 0x0d, + 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x01, 0x12, 0x04, 0x9f, 0x05, + 0x14, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x03, 0x12, 0x04, 0x9f, + 0x05, 0x2a, 0x2b, 0x0a, 0xbc, 0x05, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x16, 0x12, 0x06, 0xb5, 0x05, + 0x02, 0xdb, 0x05, 0x03, 0x1a, 0xab, 0x05, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x6f, 0x6e, 0x20, + 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, + 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, + 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, + 0x6e, 0x20, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6d, 0x69, 0x6e, + 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, + 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x31, 0x20, 0x53, 0x4f, 0x4c, 0x20, 0x69, 0x6e, 0x74, 0x6f, + 0x20, 0x55, 0x53, 0x44, 0x43, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, + 0x7b, 0x20, 0x22, 0x6a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x6f, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x32, 0x22, 0x2c, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x50, 0x6a, 0x46, + 0x57, 0x64, 0x64, 0x35, 0x41, 0x75, 0x66, 0x71, 0x53, 0x53, 0x71, 0x65, 0x4d, 0x32, 0x71, 0x4e, + 0x31, 0x78, 0x7a, 0x79, 0x62, 0x61, 0x70, 0x43, 0x38, 0x47, 0x34, 0x77, 0x45, 0x47, 0x47, 0x6b, + 0x5a, 0x77, 0x79, 0x54, 0x44, 0x74, 0x31, 0x76, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, + 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4a, 0x75, 0x70, 0x69, + 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x31, 0x30, 0x30, + 0x30, 0x20, 0x53, 0x4f, 0x4c, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x55, 0x53, 0x44, 0x43, 0x2e, + 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6a, 0x75, 0x70, + 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x20, 0x22, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x6f, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, 0x22, + 0x2c, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x50, 0x6a, 0x46, 0x57, 0x64, 0x64, 0x35, 0x41, 0x75, + 0x66, 0x71, 0x53, 0x53, 0x71, 0x65, 0x4d, 0x32, 0x71, 0x4e, 0x31, 0x78, 0x7a, 0x79, 0x62, 0x61, + 0x70, 0x43, 0x38, 0x47, 0x34, 0x77, 0x45, 0x47, 0x47, 0x6b, 0x5a, 0x77, 0x79, 0x54, 0x44, 0x74, + 0x31, 0x76, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, + 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x16, 0x01, 0x12, 0x04, 0xb5, 0x05, 0x0a, + 0x19, 0x0a, 0x2b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x12, 0x04, 0xb7, 0x05, 0x04, + 0x29, 0x1a, 0x1b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x04, 0x12, 0x04, 0xb7, 0x05, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x05, 0x12, 0x04, 0xb7, 0x05, 0x0d, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb7, 0x05, 0x14, + 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x03, 0x12, 0x04, 0xb7, 0x05, + 0x27, 0x28, 0x0a, 0x2c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x12, 0x04, 0xb9, 0x05, + 0x04, 0x2a, 0x1a, 0x1c, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x04, 0x12, 0x04, 0xb9, 0x05, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x05, 0x12, 0x04, 0xb9, 0x05, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb9, + 0x05, 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xb9, 0x05, 0x28, 0x29, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x03, 0x00, 0x12, 0x06, + 0xbb, 0x05, 0x04, 0xbe, 0x05, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x03, 0x00, + 0x01, 0x12, 0x04, 0xbb, 0x05, 0x0c, 0x16, 0x0a, 0x5b, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x16, 0x03, + 0x00, 0x02, 0x00, 0x12, 0x04, 0xbd, 0x05, 0x06, 0x21, 0x1a, 0x49, 0x2f, 0x20, 0x41, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x20, 0x41, + 0x4d, 0x4d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, + 0x20, 0x27, 0x52, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x27, 0x2c, 0x20, 0x27, 0x4f, 0x72, 0x63, + 0x61, 0x27, 0x29, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x16, 0x03, 0x00, 0x02, 0x00, + 0x04, 0x12, 0x04, 0xbd, 0x05, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x16, 0x03, + 0x00, 0x02, 0x00, 0x05, 0x12, 0x04, 0xbd, 0x05, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x16, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xbd, 0x05, 0x16, 0x1c, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x16, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x04, 0xbd, 0x05, 0x1f, 0x20, + 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x08, 0x00, 0x12, 0x06, 0xc0, 0x05, 0x04, 0xc5, + 0x05, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x08, 0x00, 0x01, 0x12, 0x04, 0xc0, + 0x05, 0x0a, 0x17, 0x0a, 0x32, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x02, 0x12, 0x04, 0xc2, + 0x05, 0x06, 0x20, 0x1a, 0x22, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, + 0x02, 0x06, 0x12, 0x04, 0xc2, 0x05, 0x06, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, + 0x02, 0x02, 0x01, 0x12, 0x04, 0xc2, 0x05, 0x11, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x16, 0x02, 0x02, 0x03, 0x12, 0x04, 0xc2, 0x05, 0x1e, 0x1f, 0x0a, 0x31, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x16, 0x02, 0x03, 0x12, 0x04, 0xc4, 0x05, 0x06, 0x1f, 0x1a, 0x21, 0x2f, 0x20, 0x41, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x03, 0x06, 0x12, 0x04, 0xc4, 0x05, 0x06, 0x10, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x03, 0x01, 0x12, 0x04, 0xc4, 0x05, 0x11, 0x1a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x03, 0x03, 0x12, 0x04, 0xc4, 0x05, 0x1d, 0x1e, + 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x08, 0x01, 0x12, 0x06, 0xc7, 0x05, 0x04, 0xd0, + 0x05, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x08, 0x01, 0x01, 0x12, 0x04, 0xc7, + 0x05, 0x0a, 0x14, 0x0a, 0x43, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x04, 0x12, 0x04, 0xc9, + 0x05, 0x06, 0x1d, 0x1a, 0x33, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x60, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, + 0x02, 0x04, 0x05, 0x12, 0x04, 0xc9, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x16, 0x02, 0x04, 0x01, 0x12, 0x04, 0xc9, 0x05, 0x0d, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x16, 0x02, 0x04, 0x03, 0x12, 0x04, 0xc9, 0x05, 0x1b, 0x1c, 0x0a, 0x44, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x16, 0x02, 0x05, 0x12, 0x04, 0xcb, 0x05, 0x06, 0x1e, 0x1a, 0x34, 0x2f, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x6f, 0x75, + 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x60, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x05, 0x05, 0x12, 0x04, 0xcb, 0x05, + 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x05, 0x01, 0x12, 0x04, 0xcb, + 0x05, 0x0d, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x05, 0x03, 0x12, 0x04, + 0xcb, 0x05, 0x1c, 0x1d, 0x0a, 0x43, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x06, 0x12, 0x04, + 0xcd, 0x05, 0x06, 0x24, 0x1a, 0x33, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x60, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x16, 0x02, 0x06, 0x05, 0x12, 0x04, 0xcd, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x16, 0x02, 0x06, 0x01, 0x12, 0x04, 0xcd, 0x05, 0x0d, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x16, 0x02, 0x06, 0x03, 0x12, 0x04, 0xcd, 0x05, 0x22, 0x23, 0x0a, 0x44, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x16, 0x02, 0x07, 0x12, 0x04, 0xcf, 0x05, 0x06, 0x25, 0x1a, 0x34, 0x2f, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x6f, + 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x60, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x07, 0x05, 0x12, 0x04, 0xcf, + 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x07, 0x01, 0x12, 0x04, + 0xcf, 0x05, 0x0d, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x07, 0x03, 0x12, + 0x04, 0xcf, 0x05, 0x23, 0x24, 0x0a, 0x61, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x08, 0x12, + 0x04, 0xd3, 0x05, 0x04, 0x21, 0x1a, 0x51, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x20, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x64, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x28, 0x65, 0x2e, 0x67, + 0x2e, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x69, 0x73, 0x20, 0x30, 0x2e, 0x35, 0x25, 0x20, 0x73, 0x6c, + 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, + 0x02, 0x08, 0x04, 0x12, 0x04, 0xd3, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x16, 0x02, 0x08, 0x05, 0x12, 0x04, 0xd3, 0x05, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x16, 0x02, 0x08, 0x01, 0x12, 0x04, 0xd3, 0x05, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x16, 0x02, 0x08, 0x03, 0x12, 0x04, 0xd3, 0x05, 0x1f, 0x20, 0x0a, 0x10, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x16, 0x04, 0x00, 0x12, 0x06, 0xd5, 0x05, 0x04, 0xd8, 0x05, 0x05, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x04, 0x00, 0x01, 0x12, 0x04, 0xd5, 0x05, 0x09, 0x10, 0x0a, + 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x16, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xd6, 0x05, 0x06, + 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x16, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, + 0xd6, 0x05, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x16, 0x04, 0x00, 0x02, 0x00, + 0x02, 0x12, 0x04, 0xd6, 0x05, 0x13, 0x14, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x16, 0x04, + 0x00, 0x02, 0x01, 0x12, 0x04, 0xd7, 0x05, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x16, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd7, 0x05, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x16, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xd7, 0x05, 0x13, 0x14, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x09, 0x12, 0x04, 0xda, 0x05, 0x04, 0x22, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x09, 0x04, 0x12, 0x04, 0xda, 0x05, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x09, 0x06, 0x12, 0x04, 0xda, 0x05, 0x0d, + 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x09, 0x01, 0x12, 0x04, 0xda, 0x05, + 0x15, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x09, 0x03, 0x12, 0x04, 0xda, + 0x05, 0x1f, 0x21, 0x0a, 0x41, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x17, 0x12, 0x06, 0xde, 0x05, 0x02, + 0xe9, 0x05, 0x03, 0x1a, 0x31, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x17, 0x01, 0x12, + 0x04, 0xde, 0x05, 0x0a, 0x18, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x17, 0x08, 0x00, 0x12, + 0x06, 0xdf, 0x05, 0x04, 0xe8, 0x05, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x08, + 0x00, 0x01, 0x12, 0x04, 0xdf, 0x05, 0x0a, 0x17, 0x0a, 0xaf, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x17, 0x02, 0x00, 0x12, 0x04, 0xe1, 0x05, 0x06, 0x26, 0x1a, 0x9e, 0x01, 0x2f, 0x20, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, + 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2d, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, + 0x76, 0x33, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x73, 0x72, 0x63, + 0x2f, 0x69, 0x64, 0x73, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x17, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe1, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x17, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe1, 0x05, 0x0d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x17, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe1, 0x05, 0x24, 0x25, 0x0a, 0xb2, 0x01, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x17, 0x02, 0x01, 0x12, 0x04, 0xe3, 0x05, 0x06, 0x26, 0x1a, 0xa1, + 0x01, 0x2f, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x72, 0x69, 0x66, 0x74, 0x20, 0x70, 0x65, + 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x20, + 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x64, 0x72, 0x69, 0x66, 0x74, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2d, 0x76, 0x31, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, + 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe3, + 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x01, 0x01, 0x12, 0x04, + 0xe3, 0x05, 0x0d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x01, 0x03, 0x12, + 0x04, 0xe3, 0x05, 0x24, 0x25, 0x0a, 0x3e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x17, 0x02, 0x02, 0x12, + 0x04, 0xe5, 0x05, 0x06, 0x25, 0x1a, 0x2e, 0x2f, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x7a, 0x65, + 0x74, 0x61, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x02, 0x05, + 0x12, 0x04, 0xe5, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x02, + 0x01, 0x12, 0x04, 0xe5, 0x05, 0x0d, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, + 0x02, 0x03, 0x12, 0x04, 0xe5, 0x05, 0x23, 0x24, 0x0a, 0x45, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x17, + 0x02, 0x03, 0x12, 0x04, 0xe7, 0x05, 0x06, 0x23, 0x1a, 0x35, 0x2f, 0x20, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x30, 0x31, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, + 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x03, 0x05, 0x12, 0x04, 0xe7, 0x05, 0x06, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x03, 0x01, 0x12, 0x04, 0xe7, 0x05, 0x0d, + 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x03, 0x03, 0x12, 0x04, 0xe7, 0x05, + 0x21, 0x22, 0x0a, 0xdb, 0x04, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x18, 0x12, 0x06, 0x84, 0x06, 0x02, + 0xab, 0x06, 0x03, 0x1a, 0xca, 0x04, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x20, 0x53, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x53, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x20, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x0a, 0x60, + 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, + 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, + 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, + 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x20, 0x7d, 0x20, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x50, 0x79, 0x74, 0x68, 0x20, 0x53, + 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, + 0x22, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, + 0x22, 0x70, 0x79, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, + 0x48, 0x36, 0x41, 0x52, 0x48, 0x66, 0x36, 0x59, 0x58, 0x68, 0x47, 0x59, 0x65, 0x51, 0x66, 0x55, + 0x7a, 0x51, 0x4e, 0x47, 0x6b, 0x36, 0x72, 0x44, 0x4e, 0x6e, 0x4c, 0x42, 0x51, 0x4b, 0x72, 0x65, + 0x6e, 0x4e, 0x37, 0x31, 0x32, 0x4b, 0x34, 0x41, 0x51, 0x4a, 0x45, 0x47, 0x22, 0x20, 0x7d, 0x20, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x20, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, + 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x63, 0x50, 0x56, 0x53, 0x39, + 0x62, 0x71, 0x79, 0x58, 0x62, 0x44, 0x39, 0x63, 0x4c, 0x6e, 0x54, 0x62, 0x68, 0x68, 0x48, 0x61, + 0x7a, 0x4c, 0x73, 0x72, 0x75, 0x61, 0x38, 0x51, 0x4d, 0x46, 0x55, 0x48, 0x54, 0x75, 0x74, 0x50, + 0x74, 0x6a, 0x79, 0x44, 0x7a, 0x71, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x18, 0x01, 0x12, 0x04, 0x84, 0x06, 0x0a, 0x14, 0x0a, + 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x12, 0x06, 0x85, 0x06, 0x04, 0x87, 0x06, + 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x01, 0x12, 0x04, 0x85, 0x06, + 0x0c, 0x1c, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, + 0x86, 0x06, 0x06, 0x23, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x02, 0x00, + 0x04, 0x12, 0x04, 0x86, 0x06, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, + 0x00, 0x02, 0x00, 0x05, 0x12, 0x04, 0x86, 0x06, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x18, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x86, 0x06, 0x16, 0x1e, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x04, 0x86, 0x06, 0x21, 0x22, + 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x12, 0x06, 0x88, 0x06, 0x04, 0x8c, + 0x06, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x01, 0x12, 0x04, 0x88, + 0x06, 0x0c, 0x17, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x00, 0x12, + 0x04, 0x89, 0x06, 0x06, 0x25, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, + 0x00, 0x04, 0x12, 0x04, 0x89, 0x06, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, + 0x03, 0x01, 0x02, 0x00, 0x05, 0x12, 0x04, 0x89, 0x06, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x00, 0x01, 0x12, 0x04, 0x89, 0x06, 0x16, 0x20, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x00, 0x03, 0x12, 0x04, 0x89, 0x06, 0x23, + 0x24, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x01, 0x12, 0x04, 0x8a, + 0x06, 0x06, 0x3b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x01, 0x04, + 0x12, 0x04, 0x8a, 0x06, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, + 0x02, 0x01, 0x05, 0x12, 0x04, 0x8a, 0x06, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x18, 0x03, 0x01, 0x02, 0x01, 0x01, 0x12, 0x04, 0x8a, 0x06, 0x16, 0x36, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8a, 0x06, 0x39, 0x3a, 0x0a, + 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x02, 0x12, 0x04, 0x8b, 0x06, 0x06, + 0x2b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x02, 0x04, 0x12, 0x04, + 0x8b, 0x06, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x02, + 0x05, 0x12, 0x04, 0x8b, 0x06, 0x0f, 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, + 0x01, 0x02, 0x02, 0x01, 0x12, 0x04, 0x8b, 0x06, 0x15, 0x26, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x18, 0x03, 0x01, 0x02, 0x02, 0x03, 0x12, 0x04, 0x8b, 0x06, 0x29, 0x2a, 0x0a, 0x10, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x18, 0x03, 0x02, 0x12, 0x06, 0x8d, 0x06, 0x04, 0x90, 0x06, 0x05, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x03, 0x02, 0x01, 0x12, 0x04, 0x8d, 0x06, 0x0c, 0x1e, + 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x18, 0x03, 0x02, 0x02, 0x00, 0x12, 0x04, 0x8e, 0x06, + 0x06, 0x21, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x02, 0x02, 0x00, 0x04, 0x12, + 0x04, 0x8e, 0x06, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x02, 0x02, + 0x00, 0x05, 0x12, 0x04, 0x8e, 0x06, 0x0f, 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, + 0x03, 0x02, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8e, 0x06, 0x15, 0x1c, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x18, 0x03, 0x02, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8e, 0x06, 0x1f, 0x20, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x18, 0x03, 0x02, 0x02, 0x01, 0x12, 0x04, 0x8f, 0x06, 0x06, 0x22, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x02, 0x02, 0x01, 0x04, 0x12, 0x04, 0x8f, + 0x06, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x02, 0x02, 0x01, 0x06, + 0x12, 0x04, 0x8f, 0x06, 0x0f, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x02, + 0x02, 0x01, 0x01, 0x12, 0x04, 0x8f, 0x06, 0x19, 0x1d, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x18, 0x03, 0x02, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8f, 0x06, 0x20, 0x21, 0x0a, 0x10, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x18, 0x03, 0x03, 0x12, 0x06, 0x91, 0x06, 0x04, 0x92, 0x06, 0x05, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x03, 0x03, 0x01, 0x12, 0x04, 0x91, 0x06, 0x0c, 0x17, 0x0a, + 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x03, 0x04, 0x12, 0x06, 0x93, 0x06, 0x04, 0x94, 0x06, + 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x03, 0x04, 0x01, 0x12, 0x04, 0x93, 0x06, + 0x0c, 0x1b, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x08, 0x00, 0x12, 0x06, 0x95, 0x06, + 0x04, 0x9e, 0x06, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x08, 0x00, 0x01, 0x12, + 0x04, 0x95, 0x06, 0x0a, 0x1b, 0x0a, 0x81, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x00, + 0x12, 0x04, 0x97, 0x06, 0x06, 0x25, 0x1a, 0x71, 0x2f, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x6e, 0x65, + 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x53, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x66, 0x65, 0x65, 0x64, 0x2e, + 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x69, 0x73, 0x20, + 0x64, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, + 0x77, 0x6e, 0x20, 0x66, 0x65, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x18, 0x02, 0x00, 0x05, 0x12, 0x04, 0x97, 0x06, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x18, 0x02, 0x00, 0x01, 0x12, 0x04, 0x97, 0x06, 0x0d, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x18, 0x02, 0x00, 0x03, 0x12, 0x04, 0x97, 0x06, 0x23, 0x24, 0x0a, 0x74, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x12, 0x04, 0x99, 0x06, 0x06, 0x1e, 0x1a, 0x64, 0x2f, 0x20, + 0x4d, 0x61, 0x69, 0x6e, 0x6e, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x50, 0x79, 0x74, 0x68, 0x20, 0x66, 0x65, 0x65, 0x64, 0x2e, + 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x70, 0x79, 0x74, 0x68, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x73, + 0x2f, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x05, 0x12, 0x04, 0x99, + 0x06, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x01, 0x12, 0x04, + 0x99, 0x06, 0x0d, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x03, 0x12, + 0x04, 0x99, 0x06, 0x1c, 0x1d, 0x0a, 0x8d, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x02, + 0x12, 0x04, 0x9b, 0x06, 0x06, 0x23, 0x1a, 0x7d, 0x2f, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x6e, 0x65, + 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x66, 0x65, 0x65, 0x64, 0x2e, 0x20, + 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x2f, 0x73, 0x6f, 0x6c, 0x61, + 0x6e, 0x61, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x73, 0x2d, 0x73, 0x6f, + 0x6c, 0x61, 0x6e, 0x61, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x02, 0x05, + 0x12, 0x04, 0x9b, 0x06, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x02, + 0x01, 0x12, 0x04, 0x9b, 0x06, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, + 0x02, 0x03, 0x12, 0x04, 0x9b, 0x06, 0x21, 0x22, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, + 0x02, 0x03, 0x12, 0x04, 0x9c, 0x06, 0x06, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, + 0x02, 0x03, 0x05, 0x12, 0x04, 0x9c, 0x06, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x18, 0x02, 0x03, 0x01, 0x12, 0x04, 0x9c, 0x06, 0x0d, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x18, 0x02, 0x03, 0x03, 0x12, 0x04, 0x9c, 0x06, 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x18, 0x02, 0x04, 0x12, 0x04, 0x9d, 0x06, 0x06, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x18, 0x02, 0x04, 0x05, 0x12, 0x04, 0x9d, 0x06, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x18, 0x02, 0x04, 0x01, 0x12, 0x04, 0x9d, 0x06, 0x0d, 0x18, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x04, 0x03, 0x12, 0x04, 0x9d, 0x06, 0x1b, 0x1c, 0x0a, 0xf0, + 0x02, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x12, 0x04, 0xa4, 0x06, 0x04, 0x39, 0x1a, + 0xae, 0x02, 0x2f, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x28, 0x61, 0x73, 0x20, 0x61, 0x20, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x29, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x2f, 0x20, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x72, + 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x6a, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x2f, 0x0a, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x61, 0x77, 0x20, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x20, 0x46, + 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x0a, 0x2f, + 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x31, 0x30, 0x25, 0x2c, 0x20, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x61, 0x73, 0x20, 0x31, 0x30, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x30, 0x2e, 0x31, 0x2e, 0x0a, + 0x22, 0x2f, 0x20, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x22, 0x70, + 0x79, 0x74, 0x68, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x04, 0x12, 0x04, 0xa4, 0x06, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x05, 0x12, 0x04, 0xa4, + 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x01, 0x12, 0x04, + 0xa4, 0x06, 0x14, 0x34, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x03, 0x12, + 0x04, 0xa4, 0x06, 0x37, 0x38, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x06, 0x12, + 0x04, 0xa5, 0x06, 0x04, 0x34, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x06, 0x04, + 0x12, 0x04, 0xa5, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x06, + 0x06, 0x12, 0x04, 0xa5, 0x06, 0x0d, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, + 0x06, 0x01, 0x12, 0x04, 0xa5, 0x06, 0x1e, 0x2f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, + 0x02, 0x06, 0x03, 0x12, 0x04, 0xa5, 0x06, 0x32, 0x33, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x18, 0x02, 0x07, 0x12, 0x04, 0xa6, 0x06, 0x04, 0x2a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x18, 0x02, 0x07, 0x04, 0x12, 0x04, 0xa6, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x18, 0x02, 0x07, 0x06, 0x12, 0x04, 0xa6, 0x06, 0x0d, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x18, 0x02, 0x07, 0x01, 0x12, 0x04, 0xa6, 0x06, 0x19, 0x25, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x18, 0x02, 0x07, 0x03, 0x12, 0x04, 0xa6, 0x06, 0x28, 0x29, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x08, 0x12, 0x04, 0xa7, 0x06, 0x04, 0x38, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x08, 0x04, 0x12, 0x04, 0xa7, 0x06, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x08, 0x06, 0x12, 0x04, 0xa7, 0x06, 0x0d, 0x1f, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x08, 0x01, 0x12, 0x04, 0xa7, 0x06, 0x20, 0x33, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x08, 0x03, 0x12, 0x04, 0xa7, 0x06, 0x36, + 0x37, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x09, 0x12, 0x04, 0xa8, 0x06, 0x04, + 0x2b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x09, 0x04, 0x12, 0x04, 0xa8, 0x06, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x09, 0x06, 0x12, 0x04, 0xa8, + 0x06, 0x0d, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x09, 0x01, 0x12, 0x04, + 0xa8, 0x06, 0x19, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x09, 0x03, 0x12, + 0x04, 0xa8, 0x06, 0x28, 0x2a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x0a, 0x12, + 0x04, 0xa9, 0x06, 0x04, 0x33, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x0a, 0x04, + 0x12, 0x04, 0xa9, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x0a, + 0x06, 0x12, 0x04, 0xa9, 0x06, 0x0d, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, + 0x0a, 0x01, 0x12, 0x04, 0xa9, 0x06, 0x1d, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, + 0x02, 0x0a, 0x03, 0x12, 0x04, 0xa9, 0x06, 0x30, 0x32, 0x0a, 0x3f, 0x0a, 0x04, 0x04, 0x00, 0x03, + 0x19, 0x12, 0x06, 0xae, 0x06, 0x02, 0xb3, 0x06, 0x03, 0x1a, 0x2f, 0x2f, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, + 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, + 0x03, 0x19, 0x01, 0x12, 0x04, 0xae, 0x06, 0x0a, 0x19, 0x0a, 0x3a, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x19, 0x02, 0x00, 0x12, 0x04, 0xb0, 0x06, 0x04, 0x23, 0x1a, 0x2a, 0x2f, 0x20, 0x4f, 0x77, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x00, 0x04, + 0x12, 0x04, 0xb0, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x00, + 0x05, 0x12, 0x04, 0xb0, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xb0, 0x06, 0x14, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, + 0x02, 0x00, 0x03, 0x12, 0x04, 0xb0, 0x06, 0x21, 0x22, 0x0a, 0x28, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x19, 0x02, 0x01, 0x12, 0x04, 0xb2, 0x06, 0x04, 0x28, 0x1a, 0x18, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x01, 0x04, 0x12, 0x04, + 0xb2, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x01, 0x05, 0x12, + 0x04, 0xb2, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x01, 0x01, + 0x12, 0x04, 0xb2, 0x06, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x01, + 0x03, 0x12, 0x04, 0xb2, 0x06, 0x26, 0x27, 0x0a, 0x4e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x1a, 0x12, + 0x06, 0xb7, 0x06, 0x02, 0xba, 0x06, 0x03, 0x1a, 0x3e, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x53, + 0x50, 0x4c, 0x20, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1a, 0x01, + 0x12, 0x04, 0xb7, 0x06, 0x0a, 0x1a, 0x0a, 0x34, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, + 0x12, 0x04, 0xb9, 0x06, 0x04, 0x1f, 0x1a, 0x24, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x50, 0x4c, 0x20, + 0x53, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, 0x04, 0x12, 0x04, 0xb9, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, 0x05, 0x12, 0x04, 0xb9, 0x06, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb9, 0x06, 0x14, 0x1a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, 0x03, 0x12, 0x04, 0xb9, 0x06, 0x1d, 0x1e, + 0x0a, 0x46, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x1b, 0x12, 0x06, 0xbd, 0x06, 0x02, 0xc4, 0x06, 0x03, + 0x1a, 0x36, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4a, 0x53, + 0x4f, 0x4e, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x53, 0x50, 0x4c, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x20, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1b, + 0x01, 0x12, 0x04, 0xbd, 0x06, 0x0a, 0x1b, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1b, 0x08, + 0x00, 0x12, 0x06, 0xbe, 0x06, 0x04, 0xc3, 0x06, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x1b, 0x08, 0x00, 0x01, 0x12, 0x04, 0xbe, 0x06, 0x0a, 0x18, 0x0a, 0x4e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x1b, 0x02, 0x00, 0x12, 0x04, 0xc0, 0x06, 0x06, 0x27, 0x1a, 0x3e, 0x2f, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1b, 0x02, 0x00, 0x05, 0x12, 0x04, 0xc0, 0x06, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1b, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc0, 0x06, 0x0d, 0x22, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1b, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc0, 0x06, 0x25, 0x26, 0x0a, 0x3b, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x1b, 0x02, 0x01, 0x12, 0x04, 0xc2, 0x06, 0x06, 0x1e, 0x1a, 0x2b, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6d, 0x69, 0x6e, 0x74, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1b, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc2, 0x06, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc2, 0x06, 0x0d, 0x19, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc2, 0x06, 0x1c, 0x1d, 0x0a, 0x35, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x1c, 0x12, 0x06, 0xc7, 0x06, 0x02, 0xdd, 0x06, 0x03, 0x1a, 0x25, 0x2f, + 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x55, 0x6e, 0x69, 0x53, 0x77, + 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1c, 0x01, 0x12, 0x04, 0xc7, + 0x06, 0x0a, 0x21, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x12, 0x06, 0xc8, + 0x06, 0x04, 0xcd, 0x06, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x01, + 0x12, 0x04, 0xc8, 0x06, 0x09, 0x10, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, + 0x02, 0x00, 0x12, 0x04, 0xc9, 0x06, 0x06, 0x20, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, + 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc9, 0x06, 0x06, 0x1b, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xc9, 0x06, 0x1e, 0x1f, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xca, 0x06, 0x06, 0x20, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xca, + 0x06, 0x06, 0x1b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x01, 0x02, + 0x12, 0x04, 0xca, 0x06, 0x1e, 0x1f, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, + 0x02, 0x02, 0x12, 0x04, 0xcb, 0x06, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, + 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xcb, 0x06, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xcb, 0x06, 0x13, 0x14, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xcc, 0x06, 0x06, 0x15, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0xcc, + 0x06, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x03, 0x02, + 0x12, 0x04, 0xcc, 0x06, 0x13, 0x14, 0x0a, 0x2b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x00, + 0x12, 0x04, 0xcf, 0x06, 0x04, 0x29, 0x1a, 0x1b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x00, 0x04, 0x12, 0x04, + 0xcf, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x00, 0x05, 0x12, + 0x04, 0xcf, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x00, 0x01, + 0x12, 0x04, 0xcf, 0x06, 0x14, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xcf, 0x06, 0x27, 0x28, 0x0a, 0x2c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, + 0x01, 0x12, 0x04, 0xd1, 0x06, 0x04, 0x2a, 0x1a, 0x1c, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x01, 0x04, + 0x12, 0x04, 0xd1, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x01, + 0x05, 0x12, 0x04, 0xd1, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, + 0x01, 0x01, 0x12, 0x04, 0xd1, 0x06, 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, + 0x02, 0x01, 0x03, 0x12, 0x04, 0xd1, 0x06, 0x28, 0x29, 0x0a, 0x30, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x1c, 0x02, 0x02, 0x12, 0x04, 0xd3, 0x06, 0x04, 0x28, 0x1a, 0x20, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1c, 0x02, 0x02, 0x04, 0x12, 0x04, 0xd3, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1c, 0x02, 0x02, 0x05, 0x12, 0x04, 0xd3, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x02, 0x01, 0x12, 0x04, 0xd3, 0x06, 0x14, 0x23, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x02, 0x03, 0x12, 0x04, 0xd3, 0x06, 0x26, 0x27, 0x0a, + 0x42, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x03, 0x12, 0x04, 0xd5, 0x06, 0x04, 0x21, 0x1a, + 0x32, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, + 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x03, 0x04, 0x12, 0x04, + 0xd5, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x03, 0x05, 0x12, + 0x04, 0xd5, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x03, 0x01, + 0x12, 0x04, 0xd5, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x03, + 0x03, 0x12, 0x04, 0xd5, 0x06, 0x1f, 0x20, 0x0a, 0x38, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, + 0x04, 0x12, 0x04, 0xd7, 0x06, 0x04, 0x21, 0x1a, 0x28, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, + 0x50, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x04, 0x04, 0x12, 0x04, 0xd7, 0x06, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x04, 0x05, 0x12, 0x04, 0xd7, + 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x04, 0x01, 0x12, 0x04, + 0xd7, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x04, 0x03, 0x12, + 0x04, 0xd7, 0x06, 0x1f, 0x20, 0x0a, 0x3e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x05, 0x12, + 0x04, 0xd9, 0x06, 0x04, 0x21, 0x1a, 0x2e, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x73, + 0x77, 0x61, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x75, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x05, 0x04, + 0x12, 0x04, 0xd9, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x05, + 0x06, 0x12, 0x04, 0xd9, 0x06, 0x0d, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, + 0x05, 0x01, 0x12, 0x04, 0xd9, 0x06, 0x15, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, + 0x02, 0x05, 0x03, 0x12, 0x04, 0xd9, 0x06, 0x1f, 0x20, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x1c, 0x02, 0x06, 0x12, 0x04, 0xda, 0x06, 0x04, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x1c, 0x02, 0x06, 0x04, 0x12, 0x04, 0xda, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1c, 0x02, 0x06, 0x05, 0x12, 0x04, 0xda, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1c, 0x02, 0x06, 0x01, 0x12, 0x04, 0xda, 0x06, 0x14, 0x22, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1c, 0x02, 0x06, 0x03, 0x12, 0x04, 0xda, 0x06, 0x25, 0x26, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x07, 0x12, 0x04, 0xdb, 0x06, 0x04, 0x28, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x07, 0x04, 0x12, 0x04, 0xdb, 0x06, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x07, 0x05, 0x12, 0x04, 0xdb, 0x06, 0x0d, 0x13, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x07, 0x01, 0x12, 0x04, 0xdb, 0x06, 0x14, 0x23, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x07, 0x03, 0x12, 0x04, 0xdb, 0x06, 0x26, + 0x27, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x08, 0x12, 0x04, 0xdc, 0x06, 0x04, + 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x08, 0x04, 0x12, 0x04, 0xdc, 0x06, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x08, 0x05, 0x12, 0x04, 0xdc, + 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x08, 0x01, 0x12, 0x04, + 0xdc, 0x06, 0x14, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x08, 0x03, 0x12, + 0x04, 0xdc, 0x06, 0x25, 0x26, 0x0a, 0x37, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x1d, 0x12, 0x06, 0xe0, + 0x06, 0x02, 0xeb, 0x06, 0x03, 0x1a, 0x27, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x53, 0x75, 0x73, 0x68, 0x69, 0x53, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1d, 0x01, 0x12, 0x04, 0xe0, 0x06, 0x0a, 0x23, 0x0a, 0x2b, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x00, 0x12, 0x04, 0xe2, 0x06, 0x04, 0x29, 0x1a, 0x1b, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1d, 0x02, 0x00, 0x04, 0x12, 0x04, 0xe2, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1d, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe2, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe2, 0x06, 0x14, 0x24, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe2, 0x06, 0x27, 0x28, 0x0a, 0x2c, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, 0x12, 0x04, 0xe4, 0x06, 0x04, 0x2a, 0x1a, 0x1c, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, 0x04, 0x12, 0x04, 0xe4, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe4, 0x06, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe4, 0x06, 0x14, 0x25, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe4, 0x06, 0x28, 0x29, + 0x0a, 0x30, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x02, 0x12, 0x04, 0xe6, 0x06, 0x04, 0x28, + 0x1a, 0x20, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x02, 0x04, 0x12, 0x04, 0xe6, + 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x02, 0x05, 0x12, 0x04, + 0xe6, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x02, 0x01, 0x12, + 0x04, 0xe6, 0x06, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x02, 0x03, + 0x12, 0x04, 0xe6, 0x06, 0x26, 0x27, 0x0a, 0x42, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x03, + 0x12, 0x04, 0xe8, 0x06, 0x04, 0x21, 0x1a, 0x32, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1d, 0x02, 0x03, 0x04, 0x12, 0x04, 0xe8, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1d, 0x02, 0x03, 0x05, 0x12, 0x04, 0xe8, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1d, 0x02, 0x03, 0x01, 0x12, 0x04, 0xe8, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x03, 0x03, 0x12, 0x04, 0xe8, 0x06, 0x1f, 0x20, 0x0a, 0x38, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x04, 0x12, 0x04, 0xea, 0x06, 0x04, 0x21, 0x1a, 0x28, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, 0x50, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, + 0x02, 0x04, 0x04, 0x12, 0x04, 0xea, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x1d, 0x02, 0x04, 0x05, 0x12, 0x04, 0xea, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1d, 0x02, 0x04, 0x01, 0x12, 0x04, 0xea, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1d, 0x02, 0x04, 0x03, 0x12, 0x04, 0xea, 0x06, 0x1f, 0x20, 0x0a, 0x39, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x1e, 0x12, 0x06, 0xee, 0x06, 0x02, 0xf9, 0x06, 0x03, 0x1a, 0x29, 0x2f, 0x20, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x50, 0x61, 0x6e, 0x63, 0x61, 0x6b, + 0x65, 0x53, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1e, 0x01, + 0x12, 0x04, 0xee, 0x06, 0x0a, 0x25, 0x0a, 0x2b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x00, + 0x12, 0x04, 0xf0, 0x06, 0x04, 0x29, 0x1a, 0x1b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x00, 0x04, 0x12, 0x04, + 0xf0, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x00, 0x05, 0x12, + 0x04, 0xf0, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x00, 0x01, + 0x12, 0x04, 0xf0, 0x06, 0x14, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xf0, 0x06, 0x27, 0x28, 0x0a, 0x2c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1e, 0x02, + 0x01, 0x12, 0x04, 0xf2, 0x06, 0x04, 0x2a, 0x1a, 0x1c, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x01, 0x04, + 0x12, 0x04, 0xf2, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x01, + 0x05, 0x12, 0x04, 0xf2, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, + 0x01, 0x01, 0x12, 0x04, 0xf2, 0x06, 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, + 0x02, 0x01, 0x03, 0x12, 0x04, 0xf2, 0x06, 0x28, 0x29, 0x0a, 0x30, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x1e, 0x02, 0x02, 0x12, 0x04, 0xf4, 0x06, 0x04, 0x28, 0x1a, 0x20, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1e, 0x02, 0x02, 0x04, 0x12, 0x04, 0xf4, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1e, 0x02, 0x02, 0x05, 0x12, 0x04, 0xf4, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x02, 0x01, 0x12, 0x04, 0xf4, 0x06, 0x14, 0x23, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x02, 0x03, 0x12, 0x04, 0xf4, 0x06, 0x26, 0x27, 0x0a, + 0x42, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x03, 0x12, 0x04, 0xf6, 0x06, 0x04, 0x21, 0x1a, + 0x32, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, + 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x03, 0x04, 0x12, 0x04, + 0xf6, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x03, 0x05, 0x12, + 0x04, 0xf6, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x03, 0x01, + 0x12, 0x04, 0xf6, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x03, + 0x03, 0x12, 0x04, 0xf6, 0x06, 0x1f, 0x20, 0x0a, 0x38, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1e, 0x02, + 0x04, 0x12, 0x04, 0xf8, 0x06, 0x04, 0x21, 0x1a, 0x28, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, + 0x50, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x04, 0x04, 0x12, 0x04, 0xf8, 0x06, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x04, 0x05, 0x12, 0x04, 0xf8, + 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x04, 0x01, 0x12, 0x04, + 0xf8, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x04, 0x03, 0x12, + 0x04, 0xf8, 0x06, 0x1f, 0x20, 0x0a, 0xb8, 0x02, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x1f, 0x12, 0x06, + 0x89, 0x07, 0x02, 0x92, 0x07, 0x03, 0x1a, 0xa7, 0x02, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, + 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x24, 0x7b, + 0x4f, 0x4e, 0x45, 0x7d, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x20, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0x20, 0x7b, 0x20, 0x22, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x4e, 0x45, 0x22, 0x2c, 0x20, 0x22, 0x6a, 0x6f, 0x62, + 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x20, + 0x7b, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x20, + 0x5d, 0x20, 0x7d, 0x20, 0x7d, 0x20, 0x5d, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1f, 0x01, 0x12, 0x04, 0x89, 0x07, 0x0a, 0x13, 0x0a, + 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x12, 0x06, 0x8a, 0x07, 0x04, 0x8f, 0x07, + 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x01, 0x12, 0x04, 0x8a, 0x07, + 0x0c, 0x15, 0x0a, 0x6b, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, + 0x8c, 0x07, 0x06, 0x28, 0x1a, 0x59, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, + 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x24, 0x7b, 0x56, 0x41, + 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x00, 0x04, 0x12, 0x04, 0x8c, 0x07, + 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, + 0x04, 0x8c, 0x07, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, + 0x00, 0x01, 0x12, 0x04, 0x8c, 0x07, 0x16, 0x23, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, + 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8c, 0x07, 0x26, 0x27, 0x0a, 0x53, 0x0a, 0x08, 0x04, + 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x01, 0x12, 0x04, 0x8e, 0x07, 0x06, 0x21, 0x1a, 0x41, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, + 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x79, 0x69, 0x65, + 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x0a, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x01, 0x04, 0x12, 0x04, 0x8e, + 0x07, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x01, 0x06, + 0x12, 0x04, 0x8e, 0x07, 0x0f, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, + 0x02, 0x01, 0x01, 0x12, 0x04, 0x8e, 0x07, 0x19, 0x1c, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x1f, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8e, 0x07, 0x1f, 0x20, 0x0a, 0x5e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, 0x12, 0x04, 0x91, 0x07, 0x04, 0x27, 0x1a, 0x4e, 0x2f, 0x20, + 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, + 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6a, + 0x6f, 0x62, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x24, 0x7b, 0x56, 0x41, 0x52, 0x49, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, 0x04, 0x12, 0x04, 0x91, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, 0x06, 0x12, 0x04, 0x91, 0x07, 0x0d, 0x16, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, 0x01, 0x12, 0x04, 0x91, 0x07, 0x17, 0x22, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, 0x03, 0x12, 0x04, 0x91, 0x07, 0x25, 0x26, + 0x0a, 0x74, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x20, 0x12, 0x04, 0x95, 0x07, 0x02, 0x1f, 0x1a, 0x66, + 0x2f, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x66, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, + 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x27, 0x73, 0x20, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x60, + 0x53, 0x59, 0x53, 0x56, 0x41, 0x52, 0x5f, 0x43, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x50, 0x55, 0x42, + 0x4b, 0x45, 0x59, 0x60, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x20, 0x01, 0x12, + 0x04, 0x95, 0x07, 0x0a, 0x1c, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x21, 0x12, 0x04, 0x97, + 0x07, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x21, 0x01, 0x12, 0x04, 0x97, 0x07, + 0x0a, 0x1b, 0x0a, 0x49, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x22, 0x12, 0x06, 0x9a, 0x07, 0x02, 0xa3, + 0x07, 0x03, 0x1a, 0x39, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x00, 0x03, 0x22, 0x01, 0x12, 0x04, 0x9a, 0x07, 0x0a, 0x24, 0x0a, 0x10, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x12, 0x06, 0x9b, 0x07, 0x04, 0x9f, 0x07, 0x05, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x01, 0x12, 0x04, 0x9b, 0x07, 0x09, 0x10, 0x0a, + 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x9c, 0x07, 0x06, + 0x1a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, + 0x9c, 0x07, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x00, + 0x02, 0x12, 0x04, 0x9c, 0x07, 0x18, 0x19, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x22, 0x04, + 0x00, 0x02, 0x01, 0x12, 0x04, 0x9d, 0x07, 0x06, 0x1a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x22, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x9d, 0x07, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0x9d, 0x07, 0x18, 0x19, 0x0a, + 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0x9e, 0x07, 0x06, + 0x19, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, + 0x9e, 0x07, 0x06, 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x02, + 0x02, 0x12, 0x04, 0x9e, 0x07, 0x17, 0x18, 0x0a, 0x47, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x22, 0x02, + 0x00, 0x12, 0x04, 0xa1, 0x07, 0x04, 0x1f, 0x1a, 0x37, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, + 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, 0x00, 0x04, 0x12, 0x04, 0xa1, 0x07, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, 0x00, 0x05, 0x12, 0x04, 0xa1, 0x07, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa1, + 0x07, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xa1, 0x07, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x22, 0x02, 0x01, 0x12, 0x04, + 0xa2, 0x07, 0x04, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, 0x01, 0x04, 0x12, + 0x04, 0xa2, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, 0x01, 0x06, + 0x12, 0x04, 0xa2, 0x07, 0x0d, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, 0x01, + 0x01, 0x12, 0x04, 0xa2, 0x07, 0x15, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, + 0x01, 0x03, 0x12, 0x04, 0xa2, 0x07, 0x1f, 0x20, 0x0a, 0xaf, 0x03, 0x0a, 0x04, 0x04, 0x00, 0x03, + 0x23, 0x12, 0x06, 0xb8, 0x07, 0x02, 0xc5, 0x07, 0x03, 0x1a, 0x9e, 0x03, 0x0a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x63, 0x72, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x78, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x2d, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x59, 0x53, 0x43, 0x4c, 0x4f, 0x43, 0x4b, 0x0a, 0x0a, + 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x63, 0x72, 0x6f, 0x6e, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x72, 0x6f, 0x6e, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x3a, 0x22, 0x2a, 0x20, 0x2a, 0x20, 0x2a, 0x20, 0x2a, + 0x20, 0x2a, 0x20, 0x2a, 0x22, 0x2c, 0x22, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3a, 0x22, 0x53, + 0x59, 0x53, 0x43, 0x4c, 0x4f, 0x43, 0x4b, 0x22, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x78, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x65, 0x78, + 0x74, 0x20, 0x66, 0x72, 0x69, 0x64, 0x61, 0x79, 0x20, 0x61, 0x74, 0x20, 0x35, 0x70, 0x6d, 0x20, + 0x55, 0x54, 0x43, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x63, + 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, + 0x63, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x3a, 0x22, 0x30, 0x20, + 0x31, 0x37, 0x20, 0x2a, 0x20, 0x2a, 0x20, 0x35, 0x22, 0x2c, 0x22, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x3a, 0x30, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, + 0x03, 0x23, 0x01, 0x12, 0x04, 0xb8, 0x07, 0x0a, 0x17, 0x0a, 0x2d, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x23, 0x02, 0x00, 0x12, 0x04, 0xba, 0x07, 0x04, 0x25, 0x1a, 0x1d, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x63, 0x72, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, + 0x02, 0x00, 0x04, 0x12, 0x04, 0xba, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x23, 0x02, 0x00, 0x05, 0x12, 0x04, 0xba, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x23, 0x02, 0x00, 0x01, 0x12, 0x04, 0xba, 0x07, 0x14, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x23, 0x02, 0x00, 0x03, 0x12, 0x04, 0xba, 0x07, 0x23, 0x24, 0x0a, 0x42, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x23, 0x02, 0x01, 0x12, 0x04, 0xbc, 0x07, 0x04, 0x24, 0x1a, 0x32, 0x2f, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x01, 0x04, 0x12, 0x04, 0xbc, 0x07, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x01, 0x05, 0x12, 0x04, 0xbc, 0x07, + 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x01, 0x01, 0x12, 0x04, 0xbc, + 0x07, 0x13, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xbc, 0x07, 0x22, 0x23, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x23, 0x04, 0x00, 0x12, 0x06, + 0xbd, 0x07, 0x04, 0xc2, 0x07, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x04, 0x00, + 0x01, 0x12, 0x04, 0xbd, 0x07, 0x09, 0x12, 0x0a, 0x4b, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x23, 0x04, + 0x00, 0x02, 0x00, 0x12, 0x04, 0xbf, 0x07, 0x06, 0x11, 0x1a, 0x39, 0x2f, 0x20, 0x55, 0x73, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, + 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x23, 0x04, 0x00, 0x02, 0x00, + 0x01, 0x12, 0x04, 0xbf, 0x07, 0x06, 0x0c, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x23, 0x04, + 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xbf, 0x07, 0x0f, 0x10, 0x0a, 0x44, 0x0a, 0x08, 0x04, 0x00, + 0x03, 0x23, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xc1, 0x07, 0x06, 0x13, 0x1a, 0x32, 0x2f, 0x20, + 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x20, 0x53, 0x59, 0x53, 0x43, 0x4c, 0x4f, 0x43, 0x4b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x0a, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x23, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc1, + 0x07, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x23, 0x04, 0x00, 0x02, 0x01, 0x02, + 0x12, 0x04, 0xc1, 0x07, 0x11, 0x12, 0x0a, 0x47, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x23, 0x02, 0x02, + 0x12, 0x04, 0xc4, 0x07, 0x04, 0x21, 0x1a, 0x37, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x27, 0x73, 0x20, 0x63, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x2d, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x59, 0x53, 0x43, 0x4c, 0x4f, 0x43, 0x4b, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x02, 0x04, 0x12, 0x04, 0xc4, 0x07, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x02, 0x06, 0x12, 0x04, 0xc4, 0x07, 0x0d, + 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x02, 0x01, 0x12, 0x04, 0xc4, 0x07, + 0x17, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x02, 0x03, 0x12, 0x04, 0xc4, + 0x07, 0x1f, 0x20, 0x0a, 0x4b, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x24, 0x12, 0x06, 0xc8, 0x07, 0x02, + 0xf3, 0x07, 0x03, 0x1a, 0x3b, 0x2f, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x64, 0x65, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x0a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x24, 0x01, 0x12, 0x04, 0xc8, 0x07, 0x0a, 0x1f, 0x0a, + 0x41, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x24, 0x02, 0x00, 0x12, 0x04, 0xca, 0x07, 0x04, 0x1f, 0x1a, + 0x31, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x64, 0x65, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x00, 0x04, 0x12, 0x04, 0xca, + 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x00, 0x05, 0x12, 0x04, + 0xca, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x00, 0x01, 0x12, + 0x04, 0xca, 0x07, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x00, 0x03, + 0x12, 0x04, 0xca, 0x07, 0x1d, 0x1e, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, + 0x12, 0x06, 0xcb, 0x07, 0x04, 0xd0, 0x07, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, + 0x04, 0x00, 0x01, 0x12, 0x04, 0xcb, 0x07, 0x09, 0x0f, 0x0a, 0x31, 0x0a, 0x08, 0x04, 0x00, 0x03, + 0x24, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xcd, 0x07, 0x06, 0x18, 0x1a, 0x1f, 0x20, 0x55, 0x73, + 0x65, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, + 0x62, 0x79, 0x74, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xcd, 0x07, 0x06, 0x13, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xcd, 0x07, + 0x16, 0x17, 0x0a, 0x2e, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, + 0xcf, 0x07, 0x06, 0x15, 0x1a, 0x1c, 0x20, 0x55, 0x73, 0x65, 0x20, 0x62, 0x69, 0x67, 0x20, 0x65, + 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, + 0x04, 0xcf, 0x07, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x02, + 0x01, 0x02, 0x12, 0x04, 0xcf, 0x07, 0x13, 0x14, 0x0a, 0x36, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x24, + 0x02, 0x01, 0x12, 0x04, 0xd2, 0x07, 0x04, 0x1f, 0x1a, 0x26, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x01, 0x04, 0x12, 0x04, 0xd2, 0x07, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x01, 0x06, 0x12, 0x04, 0xd2, 0x07, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd2, + 0x07, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xd2, 0x07, 0x1d, 0x1e, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x12, 0x06, + 0xd3, 0x07, 0x04, 0xf0, 0x07, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, + 0x01, 0x12, 0x04, 0xd3, 0x07, 0x09, 0x18, 0x0a, 0x22, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, + 0x01, 0x02, 0x00, 0x12, 0x04, 0xd5, 0x07, 0x06, 0x11, 0x1a, 0x10, 0x2f, 0x20, 0x41, 0x20, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd5, 0x07, 0x06, 0x0c, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x00, 0x02, 0x12, 0x04, 0xd5, 0x07, 0x0f, + 0x10, 0x0a, 0x1f, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x01, 0x12, 0x04, 0xd7, + 0x07, 0x06, 0x0f, 0x1a, 0x0d, 0x2f, 0x20, 0x41, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x01, 0x01, 0x12, + 0x04, 0xd7, 0x07, 0x06, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, + 0x01, 0x02, 0x12, 0x04, 0xd7, 0x07, 0x0d, 0x0e, 0x0a, 0x2d, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, + 0x04, 0x01, 0x02, 0x02, 0x12, 0x04, 0xd9, 0x07, 0x06, 0x0d, 0x1a, 0x1b, 0x2f, 0x20, 0x41, 0x6e, + 0x20, 0x38, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, + 0x01, 0x02, 0x02, 0x01, 0x12, 0x04, 0xd9, 0x07, 0x06, 0x08, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x24, 0x04, 0x01, 0x02, 0x02, 0x02, 0x12, 0x04, 0xd9, 0x07, 0x0b, 0x0c, 0x0a, 0x2b, 0x0a, + 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x03, 0x12, 0x04, 0xdb, 0x07, 0x06, 0x0d, 0x1a, + 0x19, 0x2f, 0x20, 0x41, 0x6e, 0x20, 0x38, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x24, 0x04, 0x01, 0x02, 0x03, 0x01, 0x12, 0x04, 0xdb, 0x07, 0x06, 0x08, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x03, 0x02, 0x12, 0x04, 0xdb, 0x07, 0x0b, 0x0c, + 0x0a, 0x2d, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x04, 0x12, 0x04, 0xdd, 0x07, + 0x06, 0x0e, 0x1a, 0x1b, 0x2f, 0x20, 0x41, 0x20, 0x31, 0x36, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, + 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x04, 0x01, 0x12, 0x04, 0xdd, 0x07, + 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x04, 0x02, 0x12, + 0x04, 0xdd, 0x07, 0x0c, 0x0d, 0x0a, 0x2b, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, + 0x05, 0x12, 0x04, 0xdf, 0x07, 0x06, 0x0e, 0x1a, 0x19, 0x2f, 0x20, 0x41, 0x20, 0x31, 0x36, 0x2d, + 0x62, 0x69, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x05, 0x01, 0x12, + 0x04, 0xdf, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, + 0x05, 0x02, 0x12, 0x04, 0xdf, 0x07, 0x0c, 0x0d, 0x0a, 0x2d, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, + 0x04, 0x01, 0x02, 0x06, 0x12, 0x04, 0xe1, 0x07, 0x06, 0x0e, 0x1a, 0x1b, 0x2f, 0x20, 0x41, 0x20, + 0x33, 0x32, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, + 0x01, 0x02, 0x06, 0x01, 0x12, 0x04, 0xe1, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x24, 0x04, 0x01, 0x02, 0x06, 0x02, 0x12, 0x04, 0xe1, 0x07, 0x0c, 0x0d, 0x0a, 0x2b, 0x0a, + 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x07, 0x12, 0x04, 0xe3, 0x07, 0x06, 0x0e, 0x1a, + 0x19, 0x2f, 0x20, 0x41, 0x20, 0x33, 0x32, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x24, 0x04, 0x01, 0x02, 0x07, 0x01, 0x12, 0x04, 0xe3, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x07, 0x02, 0x12, 0x04, 0xe3, 0x07, 0x0c, 0x0d, + 0x0a, 0x38, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x08, 0x12, 0x04, 0xe5, 0x07, + 0x06, 0x0e, 0x1a, 0x26, 0x2f, 0x20, 0x41, 0x20, 0x33, 0x32, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x49, + 0x45, 0x45, 0x45, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x24, 0x04, 0x01, 0x02, 0x08, 0x01, 0x12, 0x04, 0xe5, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x08, 0x02, 0x12, 0x04, 0xe5, 0x07, 0x0c, 0x0d, + 0x0a, 0x2d, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x09, 0x12, 0x04, 0xe7, 0x07, + 0x06, 0x0f, 0x1a, 0x1b, 0x2f, 0x20, 0x41, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, + 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x09, 0x01, 0x12, 0x04, 0xe7, 0x07, + 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x09, 0x02, 0x12, + 0x04, 0xe7, 0x07, 0x0c, 0x0e, 0x0a, 0x2b, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, + 0x0a, 0x12, 0x04, 0xe9, 0x07, 0x06, 0x0f, 0x1a, 0x19, 0x2f, 0x20, 0x41, 0x20, 0x36, 0x34, 0x2d, + 0x62, 0x69, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0a, 0x01, 0x12, + 0x04, 0xe9, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, + 0x0a, 0x02, 0x12, 0x04, 0xe9, 0x07, 0x0c, 0x0e, 0x0a, 0x38, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, + 0x04, 0x01, 0x02, 0x0b, 0x12, 0x04, 0xeb, 0x07, 0x06, 0x0f, 0x1a, 0x26, 0x2f, 0x20, 0x41, 0x20, + 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x49, 0x45, 0x45, 0x45, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0b, 0x01, 0x12, + 0x04, 0xeb, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, + 0x0b, 0x02, 0x12, 0x04, 0xeb, 0x07, 0x0c, 0x0e, 0x0a, 0x2e, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, + 0x04, 0x01, 0x02, 0x0c, 0x12, 0x04, 0xed, 0x07, 0x06, 0x10, 0x1a, 0x1c, 0x2f, 0x20, 0x41, 0x20, + 0x31, 0x32, 0x38, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, + 0x04, 0x01, 0x02, 0x0c, 0x01, 0x12, 0x04, 0xed, 0x07, 0x06, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0c, 0x02, 0x12, 0x04, 0xed, 0x07, 0x0d, 0x0f, 0x0a, 0x2c, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0d, 0x12, 0x04, 0xef, 0x07, 0x06, 0x10, + 0x1a, 0x1a, 0x2f, 0x20, 0x41, 0x20, 0x31, 0x32, 0x38, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0d, 0x01, 0x12, 0x04, 0xef, 0x07, 0x06, 0x0a, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0d, 0x02, 0x12, 0x04, 0xef, 0x07, + 0x0d, 0x0f, 0x0a, 0x34, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x24, 0x02, 0x02, 0x12, 0x04, 0xf2, 0x07, + 0x04, 0x26, 0x1a, 0x24, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, + 0x02, 0x02, 0x04, 0x12, 0x04, 0xf2, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x24, 0x02, 0x02, 0x06, 0x12, 0x04, 0xf2, 0x07, 0x0d, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x24, 0x02, 0x02, 0x01, 0x12, 0x04, 0xf2, 0x07, 0x1d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x24, 0x02, 0x02, 0x03, 0x12, 0x04, 0xf2, 0x07, 0x24, 0x25, 0x0a, 0x0e, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x25, 0x12, 0x06, 0xf5, 0x07, 0x02, 0xfe, 0x07, 0x03, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x03, 0x25, 0x01, 0x12, 0x04, 0xf5, 0x07, 0x0a, 0x1d, 0x0a, 0x10, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x25, 0x04, 0x00, 0x12, 0x06, 0xf6, 0x07, 0x04, 0xfa, 0x07, 0x05, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x01, 0x12, 0x04, 0xf6, 0x07, 0x09, 0x0f, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xf8, 0x07, 0x06, 0x15, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf8, + 0x07, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x02, 0x00, 0x02, + 0x12, 0x04, 0xf8, 0x07, 0x13, 0x14, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, + 0x02, 0x01, 0x12, 0x04, 0xf9, 0x07, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x25, + 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf9, 0x07, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x25, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xf9, 0x07, 0x13, 0x14, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x25, 0x02, 0x00, 0x12, 0x04, 0xfb, 0x07, 0x04, 0x1f, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x00, 0x04, 0x12, 0x04, 0xfb, 0x07, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x00, 0x06, 0x12, 0x04, 0xfb, 0x07, 0x0d, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x00, 0x01, 0x12, 0x04, 0xfb, 0x07, 0x14, + 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x00, 0x03, 0x12, 0x04, 0xfb, 0x07, + 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x25, 0x02, 0x01, 0x12, 0x04, 0xfc, 0x07, + 0x04, 0x2b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x01, 0x04, 0x12, 0x04, 0xfc, + 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x01, 0x05, 0x12, 0x04, + 0xfc, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x01, 0x01, 0x12, + 0x04, 0xfc, 0x07, 0x14, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x01, 0x03, + 0x12, 0x04, 0xfc, 0x07, 0x29, 0x2a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x25, 0x02, 0x02, + 0x12, 0x04, 0xfd, 0x07, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x02, + 0x04, 0x12, 0x04, 0xfd, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, + 0x02, 0x05, 0x12, 0x04, 0xfd, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, + 0x02, 0x02, 0x01, 0x12, 0x04, 0xfd, 0x07, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x25, 0x02, 0x02, 0x03, 0x12, 0x04, 0xfd, 0x07, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, + 0x03, 0x26, 0x12, 0x06, 0x80, 0x08, 0x02, 0x84, 0x08, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, + 0x03, 0x26, 0x01, 0x12, 0x04, 0x80, 0x08, 0x0a, 0x12, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x26, 0x02, 0x00, 0x12, 0x04, 0x81, 0x08, 0x04, 0x31, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x26, 0x02, 0x00, 0x04, 0x12, 0x04, 0x81, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x26, 0x02, 0x00, 0x05, 0x12, 0x04, 0x81, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x26, 0x02, 0x00, 0x01, 0x12, 0x04, 0x81, 0x08, 0x14, 0x2c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x26, 0x02, 0x00, 0x03, 0x12, 0x04, 0x81, 0x08, 0x2f, 0x30, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x26, 0x02, 0x01, 0x12, 0x04, 0x82, 0x08, 0x04, 0x32, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x01, 0x04, 0x12, 0x04, 0x82, 0x08, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x01, 0x05, 0x12, 0x04, 0x82, 0x08, 0x0d, 0x13, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x01, 0x01, 0x12, 0x04, 0x82, 0x08, 0x14, 0x2d, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x01, 0x03, 0x12, 0x04, 0x82, 0x08, 0x30, + 0x31, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x26, 0x02, 0x02, 0x12, 0x04, 0x83, 0x08, 0x04, + 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x02, 0x04, 0x12, 0x04, 0x83, 0x08, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x02, 0x05, 0x12, 0x04, 0x83, + 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x02, 0x01, 0x12, 0x04, + 0x83, 0x08, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x02, 0x03, 0x12, + 0x04, 0x83, 0x08, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x27, 0x12, 0x06, 0x86, + 0x08, 0x02, 0x8a, 0x08, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x27, 0x01, 0x12, 0x04, + 0x86, 0x08, 0x0a, 0x12, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x27, 0x02, 0x00, 0x12, 0x04, + 0x87, 0x08, 0x04, 0x2b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x00, 0x04, 0x12, + 0x04, 0x87, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x00, 0x05, + 0x12, 0x04, 0x87, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x00, + 0x01, 0x12, 0x04, 0x87, 0x08, 0x14, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, + 0x00, 0x03, 0x12, 0x04, 0x87, 0x08, 0x29, 0x2a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x27, + 0x02, 0x01, 0x12, 0x04, 0x88, 0x08, 0x04, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, + 0x02, 0x01, 0x04, 0x12, 0x04, 0x88, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x27, 0x02, 0x01, 0x05, 0x12, 0x04, 0x88, 0x08, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x27, 0x02, 0x01, 0x01, 0x12, 0x04, 0x88, 0x08, 0x13, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x27, 0x02, 0x01, 0x03, 0x12, 0x04, 0x88, 0x08, 0x1c, 0x1d, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, 0x12, 0x04, 0x89, 0x08, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, 0x04, 0x12, 0x04, 0x89, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, 0x05, 0x12, 0x04, 0x89, 0x08, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, 0x01, 0x12, 0x04, 0x89, 0x08, 0x14, 0x1a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, 0x03, 0x12, 0x04, 0x89, 0x08, 0x1d, 0x1e, + 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x28, 0x12, 0x06, 0x8c, 0x08, 0x02, 0xaf, 0x08, 0x03, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x28, 0x01, 0x12, 0x04, 0x8c, 0x08, 0x0a, 0x18, 0x0a, + 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x12, 0x06, 0x8d, 0x08, 0x04, 0x94, 0x08, + 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x01, 0x12, 0x04, 0x8d, 0x08, + 0x09, 0x12, 0x0a, 0x35, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, + 0x8f, 0x08, 0x06, 0x17, 0x1a, 0x23, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x65, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x3d, 0x3d, 0x27, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x28, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8f, 0x08, 0x06, 0x12, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0x8f, 0x08, 0x15, 0x16, 0x0a, + 0x37, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0x91, 0x08, 0x06, + 0x17, 0x1a, 0x25, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x27, 0x3e, 0x27, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x28, + 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x91, 0x08, 0x06, 0x12, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0x91, 0x08, 0x15, 0x16, 0x0a, 0x34, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0x93, 0x08, 0x06, 0x17, + 0x1a, 0x22, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x27, 0x3c, 0x27, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x02, + 0x01, 0x12, 0x04, 0x93, 0x08, 0x06, 0x12, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x28, 0x04, + 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0x93, 0x08, 0x15, 0x16, 0x0a, 0x59, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x28, 0x02, 0x00, 0x12, 0x04, 0x96, 0x08, 0x04, 0x1e, 0x1a, 0x49, 0x2f, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x72, 0x68, 0x73, 0x29, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x00, 0x04, + 0x12, 0x04, 0x96, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x00, + 0x06, 0x12, 0x04, 0x96, 0x08, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, + 0x00, 0x01, 0x12, 0x04, 0x96, 0x08, 0x17, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, + 0x02, 0x00, 0x03, 0x12, 0x04, 0x96, 0x08, 0x1c, 0x1d, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x28, 0x08, 0x00, 0x12, 0x06, 0x97, 0x08, 0x04, 0x9c, 0x08, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x28, 0x08, 0x00, 0x01, 0x12, 0x04, 0x97, 0x08, 0x0a, 0x0d, 0x0a, 0x5e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x28, 0x02, 0x01, 0x12, 0x04, 0x99, 0x08, 0x06, 0x18, 0x1a, 0x4e, 0x2f, 0x20, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, + 0x64, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x28, 0x02, 0x01, 0x06, 0x12, 0x04, 0x99, 0x08, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x01, 0x01, 0x12, 0x04, 0x99, 0x08, 0x10, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x01, 0x03, 0x12, 0x04, 0x99, 0x08, 0x16, 0x17, 0x0a, + 0x54, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x02, 0x12, 0x04, 0x9b, 0x08, 0x06, 0x1b, 0x1a, + 0x44, 0x2f, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x24, 0x7b, + 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x20, 0x72, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, + 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x02, 0x05, + 0x12, 0x04, 0x9b, 0x08, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x02, + 0x01, 0x12, 0x04, 0x9b, 0x08, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, + 0x02, 0x03, 0x12, 0x04, 0x9b, 0x08, 0x19, 0x1a, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, + 0x08, 0x01, 0x12, 0x06, 0x9d, 0x08, 0x04, 0xa2, 0x08, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x28, 0x08, 0x01, 0x01, 0x12, 0x04, 0x9d, 0x08, 0x0a, 0x0d, 0x0a, 0x5f, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x28, 0x02, 0x03, 0x12, 0x04, 0x9f, 0x08, 0x06, 0x18, 0x1a, 0x4f, 0x2f, 0x20, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, + 0x64, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x28, 0x02, 0x03, 0x06, 0x12, 0x04, 0x9f, 0x08, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x03, 0x01, 0x12, 0x04, 0x9f, 0x08, 0x10, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x03, 0x03, 0x12, 0x04, 0x9f, 0x08, 0x16, 0x17, 0x0a, + 0x55, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x04, 0x12, 0x04, 0xa1, 0x08, 0x06, 0x1b, 0x1a, + 0x45, 0x2f, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x24, 0x7b, + 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x20, 0x72, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x04, + 0x05, 0x12, 0x04, 0xa1, 0x08, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, + 0x04, 0x01, 0x12, 0x04, 0xa1, 0x08, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, + 0x02, 0x04, 0x03, 0x12, 0x04, 0xa1, 0x08, 0x19, 0x1a, 0x0a, 0x4f, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x28, 0x02, 0x05, 0x12, 0x04, 0xa4, 0x08, 0x04, 0x23, 0x1a, 0x3f, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x28, 0x02, 0x05, 0x04, 0x12, 0x04, 0xa4, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x28, 0x02, 0x05, 0x06, 0x12, 0x04, 0xa4, 0x08, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x28, 0x02, 0x05, 0x01, 0x12, 0x04, 0xa4, 0x08, 0x17, 0x1e, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x05, 0x03, 0x12, 0x04, 0xa4, 0x08, 0x21, 0x22, 0x0a, 0x68, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x06, 0x12, 0x04, 0xa6, 0x08, 0x04, 0x26, 0x1a, 0x58, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, + 0x75, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, + 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, + 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, + 0x02, 0x06, 0x04, 0x12, 0x04, 0xa6, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x28, 0x02, 0x06, 0x05, 0x12, 0x04, 0xa6, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x28, 0x02, 0x06, 0x01, 0x12, 0x04, 0xa6, 0x08, 0x14, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x28, 0x02, 0x06, 0x03, 0x12, 0x04, 0xa6, 0x08, 0x24, 0x25, 0x0a, 0x50, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x28, 0x02, 0x07, 0x12, 0x04, 0xa8, 0x08, 0x04, 0x24, 0x1a, 0x40, 0x2f, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x07, 0x04, 0x12, 0x04, 0xa8, 0x08, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x07, 0x06, 0x12, 0x04, 0xa8, 0x08, 0x0d, 0x16, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x07, 0x01, 0x12, 0x04, 0xa8, 0x08, 0x17, + 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x07, 0x03, 0x12, 0x04, 0xa8, 0x08, + 0x22, 0x23, 0x0a, 0x69, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x08, 0x12, 0x04, 0xaa, 0x08, + 0x04, 0x27, 0x1a, 0x59, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2e, 0x20, 0x43, 0x61, 0x6e, + 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, + 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x08, 0x04, 0x12, 0x04, 0xaa, 0x08, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x08, 0x05, 0x12, 0x04, 0xaa, 0x08, 0x0d, 0x13, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x08, 0x01, 0x12, 0x04, 0xaa, 0x08, 0x14, 0x22, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x08, 0x03, 0x12, 0x04, 0xaa, 0x08, 0x25, + 0x26, 0x0a, 0x4f, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x09, 0x12, 0x04, 0xac, 0x08, 0x04, + 0x27, 0x1a, 0x3f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x09, 0x04, 0x12, 0x04, 0xac, + 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x09, 0x06, 0x12, 0x04, + 0xac, 0x08, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x09, 0x01, 0x12, + 0x04, 0xac, 0x08, 0x17, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x09, 0x03, + 0x12, 0x04, 0xac, 0x08, 0x24, 0x26, 0x0a, 0x68, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x0a, + 0x12, 0x04, 0xae, 0x08, 0x04, 0x2a, 0x1a, 0x58, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x2e, 0x20, + 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, + 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x0a, 0x04, 0x12, 0x04, 0xae, 0x08, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x0a, 0x05, 0x12, 0x04, 0xae, 0x08, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x0a, 0x01, 0x12, 0x04, 0xae, + 0x08, 0x14, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x0a, 0x03, 0x12, 0x04, + 0xae, 0x08, 0x27, 0x29, 0x0a, 0xe8, 0x02, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x29, 0x12, 0x06, 0xbe, + 0x08, 0x02, 0xc9, 0x08, 0x03, 0x1a, 0xd7, 0x02, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, + 0x65, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, + 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x38, + 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x0a, + 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x52, 0x4f, 0x55, 0x4e, + 0x44, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x38, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x29, 0x01, 0x12, 0x04, 0xbe, 0x08, 0x0a, 0x13, 0x0a, 0x10, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x12, 0x06, 0xbf, 0x08, 0x04, 0xc4, 0x08, 0x05, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x01, 0x12, 0x04, 0xbf, 0x08, 0x09, + 0x0f, 0x0a, 0x2b, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xc1, + 0x08, 0x06, 0x1a, 0x1a, 0x19, 0x2f, 0x20, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x2e, 0x0a, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc1, 0x08, 0x06, + 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, + 0xc1, 0x08, 0x18, 0x19, 0x0a, 0x29, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x02, 0x01, + 0x12, 0x04, 0xc3, 0x08, 0x06, 0x1c, 0x1a, 0x17, 0x2f, 0x20, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x75, 0x70, 0x2e, 0x0a, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc3, 0x08, + 0x06, 0x17, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, + 0x04, 0xc3, 0x08, 0x1a, 0x1b, 0x0a, 0x2e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x29, 0x02, 0x00, 0x12, + 0x04, 0xc6, 0x08, 0x04, 0x1f, 0x1a, 0x1e, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x75, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, 0x00, 0x04, + 0x12, 0x04, 0xc6, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, 0x00, + 0x06, 0x12, 0x04, 0xc6, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xc6, 0x08, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, + 0x02, 0x00, 0x03, 0x12, 0x04, 0xc6, 0x08, 0x1d, 0x1e, 0x0a, 0x36, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x29, 0x02, 0x01, 0x12, 0x04, 0xc8, 0x08, 0x04, 0x20, 0x1a, 0x26, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, 0x01, 0x04, 0x12, 0x04, 0xc8, 0x08, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc8, + 0x08, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, 0x01, 0x01, 0x12, 0x04, + 0xc8, 0x08, 0x13, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, 0x01, 0x03, 0x12, + 0x04, 0xc8, 0x08, 0x1e, 0x1f, 0x0a, 0xf6, 0x03, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x2a, 0x12, 0x06, + 0xd8, 0x08, 0x02, 0xe9, 0x08, 0x03, 0x1a, 0xe5, 0x03, 0x0a, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x61, + 0x6e, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, + 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x6e, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, + 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x65, 0x64, 0x73, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, + 0x65, 0x65, 0x6e, 0x20, 0x30, 0x2e, 0x39, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x2e, 0x31, + 0x30, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6c, 0x6f, 0x77, + 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x30, 0x2e, 0x39, 0x30, 0x22, 0x2c, 0x22, 0x6f, 0x6e, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, + 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x30, 0x2e, 0x39, 0x30, 0x22, 0x2c, 0x22, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x2e, 0x31, + 0x30, 0x22, 0x2c, 0x22, 0x6f, 0x6e, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x55, 0x70, 0x70, + 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x31, 0x2e, 0x31, 0x30, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2a, 0x01, 0x12, 0x04, 0xd8, 0x08, 0x0a, 0x13, 0x0a, 0x46, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x00, 0x12, 0x04, 0xda, 0x08, 0x04, 0x27, 0x1a, 0x36, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, + 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x00, 0x04, + 0x12, 0x04, 0xda, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x00, + 0x06, 0x12, 0x04, 0xda, 0x08, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xda, 0x08, 0x17, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, + 0x02, 0x00, 0x03, 0x12, 0x04, 0xda, 0x08, 0x25, 0x26, 0x0a, 0x58, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x2a, 0x02, 0x01, 0x12, 0x04, 0xdc, 0x08, 0x04, 0x2a, 0x1a, 0x48, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, + 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x01, 0x04, 0x12, 0x04, + 0xdc, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x01, 0x05, 0x12, + 0x04, 0xdc, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x01, 0x01, + 0x12, 0x04, 0xdc, 0x08, 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x01, + 0x03, 0x12, 0x04, 0xdc, 0x08, 0x28, 0x29, 0x0a, 0x46, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, + 0x02, 0x12, 0x04, 0xde, 0x08, 0x04, 0x27, 0x1a, 0x36, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x02, 0x04, 0x12, 0x04, 0xde, 0x08, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x02, 0x06, 0x12, 0x04, 0xde, 0x08, 0x0d, + 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x02, 0x01, 0x12, 0x04, 0xde, 0x08, + 0x17, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x02, 0x03, 0x12, 0x04, 0xde, + 0x08, 0x25, 0x26, 0x0a, 0x58, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x03, 0x12, 0x04, 0xe0, + 0x08, 0x04, 0x2a, 0x1a, 0x48, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x20, 0x43, 0x61, 0x6e, + 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, + 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x03, 0x04, 0x12, 0x04, 0xe0, 0x08, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x03, 0x05, 0x12, 0x04, 0xe0, 0x08, 0x0d, 0x13, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x03, 0x01, 0x12, 0x04, 0xe0, 0x08, 0x14, 0x25, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x03, 0x03, 0x12, 0x04, 0xe0, 0x08, 0x28, + 0x29, 0x0a, 0x4b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x04, 0x12, 0x04, 0xe2, 0x08, 0x04, + 0x32, 0x1a, 0x3b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x04, 0x04, 0x12, 0x04, 0xe2, 0x08, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x04, 0x06, 0x12, 0x04, 0xe2, 0x08, 0x0d, 0x16, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x04, 0x01, 0x12, 0x04, 0xe2, 0x08, 0x17, + 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x04, 0x03, 0x12, 0x04, 0xe2, 0x08, + 0x30, 0x31, 0x0a, 0x63, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x05, 0x12, 0x04, 0xe4, 0x08, + 0x04, 0x35, 0x1a, 0x53, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, + 0x70, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, + 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, + 0x05, 0x04, 0x12, 0x04, 0xe4, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, + 0x02, 0x05, 0x05, 0x12, 0x04, 0xe4, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2a, 0x02, 0x05, 0x01, 0x12, 0x04, 0xe4, 0x08, 0x14, 0x30, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2a, 0x02, 0x05, 0x03, 0x12, 0x04, 0xe4, 0x08, 0x33, 0x34, 0x0a, 0x4b, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x2a, 0x02, 0x06, 0x12, 0x04, 0xe6, 0x08, 0x04, 0x32, 0x1a, 0x3b, 0x2f, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, + 0x02, 0x06, 0x04, 0x12, 0x04, 0xe6, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2a, 0x02, 0x06, 0x06, 0x12, 0x04, 0xe6, 0x08, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2a, 0x02, 0x06, 0x01, 0x12, 0x04, 0xe6, 0x08, 0x17, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2a, 0x02, 0x06, 0x03, 0x12, 0x04, 0xe6, 0x08, 0x30, 0x31, 0x0a, 0x63, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x2a, 0x02, 0x07, 0x12, 0x04, 0xe8, 0x08, 0x04, 0x35, 0x1a, 0x53, 0x2f, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, + 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x07, 0x04, 0x12, 0x04, 0xe8, 0x08, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x07, 0x05, 0x12, 0x04, 0xe8, + 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x07, 0x01, 0x12, 0x04, + 0xe8, 0x08, 0x14, 0x30, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x07, 0x03, 0x12, + 0x04, 0xe8, 0x08, 0x33, 0x34, 0x0a, 0x8c, 0x03, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x2b, 0x12, 0x06, + 0xf8, 0x08, 0x02, 0xfd, 0x08, 0x03, 0x1a, 0xfb, 0x02, 0x0a, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x6c, 0x79, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x77, 0x6e, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x41, 0x6e, 0x79, 0x20, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x65, 0x65, 0x64, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x6e, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x54, + 0x61, 0x73, 0x6b, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, + 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x63, + 0x63, 0x62, 0x32, 0x31, 0x74, 0x55, 0x43, 0x57, 0x6f, 0x63, 0x4a, 0x65, 0x61, 0x36, 0x55, 0x6b, + 0x33, 0x44, 0x67, 0x72, 0x4e, 0x5a, 0x61, 0x77, 0x67, 0x6d, 0x4b, 0x65, 0x67, 0x44, 0x56, 0x65, + 0x48, 0x77, 0x38, 0x63, 0x47, 0x4d, 0x44, 0x50, 0x69, 0x35, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2b, 0x01, 0x12, 0x04, 0xf8, + 0x08, 0x0a, 0x15, 0x0a, 0x49, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x00, 0x12, 0x04, 0xfa, + 0x08, 0x04, 0x22, 0x1a, 0x39, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x00, 0x04, 0x12, 0x04, 0xfa, 0x08, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x00, 0x05, 0x12, 0x04, 0xfa, 0x08, 0x0d, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x00, 0x01, 0x12, 0x04, 0xfa, 0x08, 0x14, + 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x00, 0x03, 0x12, 0x04, 0xfa, 0x08, + 0x20, 0x21, 0x0a, 0x75, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x01, 0x12, 0x04, 0xfc, 0x08, + 0x04, 0x1c, 0x1a, 0x65, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2e, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2e, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2b, 0x02, 0x01, 0x04, 0x12, 0x04, 0xfc, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2b, 0x02, 0x01, 0x05, 0x12, 0x04, 0xfc, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xfc, 0x08, 0x14, 0x17, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xfc, 0x08, 0x1a, 0x1b, 0x0a, 0x44, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x2c, 0x12, 0x06, 0x80, 0x09, 0x02, 0x88, 0x09, 0x03, 0x1a, 0x34, 0x2f, + 0x20, 0x47, 0x72, 0x61, 0x62, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x53, 0x61, 0x6e, 0x63, 0x74, 0x75, 0x6d, 0x20, 0x4c, 0x53, + 0x54, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x4f, + 0x4c, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2c, 0x01, 0x12, 0x04, 0x80, 0x09, + 0x0a, 0x1d, 0x0a, 0x6b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2c, 0x02, 0x00, 0x12, 0x04, 0x84, 0x09, + 0x04, 0x21, 0x1a, 0x5b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x53, 0x54, 0x20, 0x6d, 0x69, 0x6e, + 0x74, 0x2e, 0x0a, 0x2f, 0x0a, 0x2f, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x49, 0x4e, 0x46, 0x20, + 0x2d, 0x20, 0x35, 0x6f, 0x56, 0x4e, 0x42, 0x65, 0x45, 0x45, 0x51, 0x76, 0x59, 0x69, 0x31, 0x63, + 0x58, 0x33, 0x69, 0x72, 0x38, 0x44, 0x78, 0x35, 0x6e, 0x31, 0x50, 0x37, 0x70, 0x64, 0x78, 0x79, + 0x64, 0x62, 0x47, 0x46, 0x32, 0x58, 0x34, 0x54, 0x78, 0x56, 0x75, 0x73, 0x4a, 0x6d, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2c, 0x02, 0x00, 0x04, 0x12, 0x04, 0x84, 0x09, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2c, 0x02, 0x00, 0x05, 0x12, 0x04, 0x84, 0x09, 0x0d, + 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2c, 0x02, 0x00, 0x01, 0x12, 0x04, 0x84, 0x09, + 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2c, 0x02, 0x00, 0x03, 0x12, 0x04, 0x84, + 0x09, 0x1f, 0x20, 0x0a, 0x65, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2c, 0x02, 0x01, 0x12, 0x04, 0x87, + 0x09, 0x04, 0x27, 0x1a, 0x55, 0x2f, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x53, 0x54, 0x20, 0x77, 0x61, 0x73, 0x20, 0x63, 0x72, 0x61, + 0x6e, 0x6b, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2c, 0x02, 0x01, 0x04, 0x12, 0x04, 0x87, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2c, 0x02, 0x01, 0x05, 0x12, 0x04, 0x87, 0x09, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2c, 0x02, 0x01, 0x01, 0x12, 0x04, 0x87, 0x09, 0x12, 0x22, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2c, 0x02, 0x01, 0x03, 0x12, 0x04, 0x87, 0x09, 0x25, 0x26, 0x0a, 0x7f, + 0x0a, 0x04, 0x04, 0x00, 0x03, 0x2d, 0x12, 0x06, 0x8c, 0x09, 0x02, 0x97, 0x09, 0x03, 0x1a, 0x6f, + 0x2f, 0x20, 0x4f, 0x6e, 0x64, 0x6f, 0x55, 0x73, 0x64, 0x79, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x73, 0x6b, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x55, 0x53, 0x44, 0x59, + 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x55, 0x53, 0x44, + 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x0a, 0x2f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x20, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2d, 0x01, 0x12, 0x04, 0x8c, 0x09, 0x0a, 0x16, 0x0a, 0xe4, + 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x12, 0x06, 0x91, 0x09, 0x04, 0x94, 0x09, + 0x05, 0x1a, 0xd1, 0x01, 0x2f, 0x20, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x55, 0x53, 0x44, 0x59, 0x2e, 0x0a, 0x2f, 0x0a, 0x2f, 0x20, 0x2d, 0x20, 0x53, + 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x46, 0x41, 0x49, 0x52, 0x5f, 0x56, 0x41, 0x4c, + 0x55, 0x45, 0x3a, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, + 0x61, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x0a, 0x2f, 0x20, 0x2d, 0x20, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, + 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6c, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x01, + 0x12, 0x04, 0x91, 0x09, 0x09, 0x11, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, + 0x02, 0x00, 0x12, 0x04, 0x92, 0x09, 0x06, 0x1e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2d, + 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x92, 0x09, 0x06, 0x19, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x2d, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0x92, 0x09, 0x1c, 0x1d, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0x93, 0x09, 0x06, 0x1a, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x93, + 0x09, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x02, 0x01, 0x02, + 0x12, 0x04, 0x93, 0x09, 0x18, 0x19, 0x0a, 0x44, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2d, 0x02, 0x00, + 0x12, 0x04, 0x96, 0x09, 0x04, 0x23, 0x1a, 0x34, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, + 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x55, 0x53, 0x44, 0x59, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2d, 0x02, 0x00, 0x04, 0x12, 0x04, 0x96, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2d, 0x02, 0x00, 0x06, 0x12, 0x04, 0x96, 0x09, 0x0d, 0x15, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2d, 0x02, 0x00, 0x01, 0x12, 0x04, 0x96, 0x09, 0x16, 0x1e, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2d, 0x02, 0x00, 0x03, 0x12, 0x04, 0x96, 0x09, 0x21, 0x22, + 0x0a, 0x3b, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x2e, 0x12, 0x06, 0x9a, 0x09, 0x02, 0xa3, 0x09, 0x03, + 0x1a, 0x2b, 0x2f, 0x20, 0x47, 0x72, 0x61, 0x62, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, + 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x4d, + 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x00, 0x03, 0x2e, 0x01, 0x12, 0x04, 0x9a, 0x09, 0x0a, 0x19, 0x0a, 0x10, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x12, 0x06, 0x9b, 0x09, 0x04, 0x9e, 0x09, 0x05, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x01, 0x12, 0x04, 0x9b, 0x09, 0x09, 0x0d, 0x0a, + 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x9c, 0x09, 0x06, + 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, + 0x9c, 0x09, 0x06, 0x0f, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x02, 0x00, + 0x02, 0x12, 0x04, 0x9c, 0x09, 0x12, 0x13, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x2e, 0x04, + 0x00, 0x02, 0x01, 0x12, 0x04, 0x9d, 0x09, 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x2e, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x9d, 0x09, 0x06, 0x13, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0x9d, 0x09, 0x16, 0x17, 0x0a, + 0x2b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x00, 0x12, 0x04, 0xa0, 0x09, 0x04, 0x1d, 0x1a, + 0x1b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2e, 0x02, 0x00, 0x04, 0x12, 0x04, 0xa0, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x00, 0x05, 0x12, 0x04, 0xa0, 0x09, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa0, 0x09, 0x14, 0x18, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x00, 0x03, 0x12, 0x04, 0xa0, 0x09, 0x1b, 0x1c, + 0x0a, 0x21, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, 0x12, 0x04, 0xa2, 0x09, 0x04, 0x1b, + 0x1a, 0x11, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, 0x04, 0x12, 0x04, + 0xa2, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, 0x06, 0x12, + 0x04, 0xa2, 0x09, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, 0x01, + 0x12, 0x04, 0xa2, 0x09, 0x12, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, + 0x03, 0x12, 0x04, 0xa2, 0x09, 0x19, 0x1a, 0x0a, 0x40, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x2f, 0x12, + 0x06, 0xa6, 0x09, 0x02, 0xa9, 0x09, 0x03, 0x1a, 0x30, 0x2f, 0x20, 0x47, 0x65, 0x74, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x55, 0x6e, 0x69, + 0x78, 0x20, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, + 0x2f, 0x01, 0x12, 0x04, 0xa6, 0x09, 0x0a, 0x16, 0x0a, 0x40, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x00, 0x12, 0x04, 0xa8, 0x09, 0x04, 0x1e, 0x1a, 0x30, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x00, 0x04, 0x12, 0x04, 0xa8, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x00, 0x05, 0x12, 0x04, 0xa8, 0x09, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa8, 0x09, 0x13, 0x19, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x00, 0x03, 0x12, 0x04, 0xa8, 0x09, 0x1c, 0x1d, 0x0a, 0xb9, + 0x02, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x30, 0x12, 0x06, 0xb8, 0x09, 0x02, 0xc0, 0x09, 0x03, 0x1a, + 0xa8, 0x02, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x4d, 0x61, 0x70, 0x6c, 0x65, 0x20, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x79, 0x72, 0x75, 0x70, 0x55, 0x53, 0x44, 0x43, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x4d, 0x61, 0x70, 0x6c, 0x65, 0x20, + 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x7b, 0x20, 0x22, 0x6d, 0x61, 0x70, 0x6c, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x59, 0x52, 0x55, 0x50, + 0x5f, 0x55, 0x53, 0x44, 0x43, 0x5f, 0x46, 0x41, 0x49, 0x52, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, + 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, + 0x03, 0x30, 0x01, 0x12, 0x04, 0xb8, 0x09, 0x0a, 0x1a, 0x0a, 0x51, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x30, 0x04, 0x00, 0x12, 0x06, 0xba, 0x09, 0x04, 0xbd, 0x09, 0x05, 0x1a, 0x3f, 0x2f, 0x20, 0x53, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x61, 0x70, 0x6c, 0x65, 0x20, 0x46, 0x69, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x30, 0x04, 0x00, 0x01, 0x12, 0x04, 0xba, 0x09, 0x09, 0x0f, 0x0a, 0x56, 0x0a, + 0x08, 0x04, 0x00, 0x03, 0x30, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xbc, 0x09, 0x06, 0x27, 0x1a, + 0x44, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, + 0x72, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x79, 0x72, 0x75, 0x70, + 0x55, 0x53, 0x44, 0x43, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x70, 0x6c, + 0x65, 0x20, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x65, 0x63, 0x6f, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x30, 0x04, 0x00, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xbc, 0x09, 0x06, 0x22, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x30, + 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xbc, 0x09, 0x25, 0x26, 0x0a, 0x3c, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x30, 0x02, 0x00, 0x12, 0x04, 0xbf, 0x09, 0x04, 0x1f, 0x1a, 0x2c, 0x2f, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x30, 0x02, 0x00, 0x04, 0x12, 0x04, 0xbf, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x30, 0x02, 0x00, 0x06, 0x12, 0x04, 0xbf, 0x09, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x30, 0x02, 0x00, 0x01, 0x12, 0x04, 0xbf, 0x09, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x30, 0x02, 0x00, 0x03, 0x12, 0x04, 0xbf, 0x09, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x31, 0x12, 0x06, 0xc2, 0x09, 0x02, 0xc5, 0x09, 0x03, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x00, 0x03, 0x31, 0x01, 0x12, 0x04, 0xc2, 0x09, 0x0a, 0x13, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x31, 0x02, 0x00, 0x12, 0x04, 0xc3, 0x09, 0x04, 0x25, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x31, 0x02, 0x00, 0x04, 0x12, 0x04, 0xc3, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x31, 0x02, 0x00, 0x05, 0x12, 0x04, 0xc3, 0x09, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x31, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc3, 0x09, 0x14, 0x20, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x31, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc3, 0x09, 0x23, 0x24, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x31, 0x02, 0x01, 0x12, 0x04, 0xc4, 0x09, 0x04, 0x23, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x31, 0x02, 0x01, 0x04, 0x12, 0x04, 0xc4, 0x09, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x31, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc4, 0x09, + 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x31, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc4, + 0x09, 0x12, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x31, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xc4, 0x09, 0x21, 0x22, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x32, 0x12, 0x06, 0xc7, 0x09, + 0x02, 0xcb, 0x09, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x32, 0x01, 0x12, 0x04, 0xc7, + 0x09, 0x0a, 0x13, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x32, 0x02, 0x00, 0x12, 0x04, 0xc8, + 0x09, 0x04, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x32, 0x02, 0x00, 0x04, 0x12, 0x04, + 0xc8, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x32, 0x02, 0x00, 0x05, 0x12, + 0x04, 0xc8, 0x09, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x32, 0x02, 0x00, 0x01, + 0x12, 0x04, 0xc8, 0x09, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x32, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xc8, 0x09, 0x1f, 0x20, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x32, 0x02, + 0x01, 0x12, 0x04, 0xc9, 0x09, 0x04, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x32, 0x02, + 0x01, 0x04, 0x12, 0x04, 0xc9, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x32, + 0x02, 0x01, 0x05, 0x12, 0x04, 0xc9, 0x09, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x32, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc9, 0x09, 0x14, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x32, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc9, 0x09, 0x20, 0x21, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x32, 0x02, 0x02, 0x12, 0x04, 0xca, 0x09, 0x04, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x32, 0x02, 0x02, 0x04, 0x12, 0x04, 0xca, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x32, 0x02, 0x02, 0x05, 0x12, 0x04, 0xca, 0x09, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x32, 0x02, 0x02, 0x01, 0x12, 0x04, 0xca, 0x09, 0x14, 0x1c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x32, 0x02, 0x02, 0x03, 0x12, 0x04, 0xca, 0x09, 0x1f, 0x20, 0x0a, + 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x33, 0x12, 0x06, 0xcd, 0x09, 0x02, 0xd2, 0x09, 0x03, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x33, 0x01, 0x12, 0x04, 0xcd, 0x09, 0x0a, 0x17, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x33, 0x02, 0x00, 0x12, 0x04, 0xce, 0x09, 0x04, 0x25, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x00, 0x04, 0x12, 0x04, 0xce, 0x09, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x00, 0x05, 0x12, 0x04, 0xce, 0x09, 0x0d, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x00, 0x01, 0x12, 0x04, 0xce, 0x09, 0x14, + 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x00, 0x03, 0x12, 0x04, 0xce, 0x09, + 0x23, 0x24, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x33, 0x02, 0x01, 0x12, 0x04, 0xcf, 0x09, + 0x04, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x01, 0x04, 0x12, 0x04, 0xcf, + 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x01, 0x05, 0x12, 0x04, + 0xcf, 0x09, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x01, 0x01, 0x12, + 0x04, 0xcf, 0x09, 0x14, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x01, 0x03, + 0x12, 0x04, 0xcf, 0x09, 0x20, 0x21, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x33, 0x02, 0x02, + 0x12, 0x04, 0xd0, 0x09, 0x04, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x02, + 0x04, 0x12, 0x04, 0xd0, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, + 0x02, 0x05, 0x12, 0x04, 0xd0, 0x09, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x33, + 0x02, 0x02, 0x01, 0x12, 0x04, 0xd0, 0x09, 0x14, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x33, 0x02, 0x02, 0x03, 0x12, 0x04, 0xd0, 0x09, 0x23, 0x24, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x33, 0x02, 0x03, 0x12, 0x04, 0xd1, 0x09, 0x04, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x33, 0x02, 0x03, 0x04, 0x12, 0x04, 0xd1, 0x09, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x33, 0x02, 0x03, 0x05, 0x12, 0x04, 0xd1, 0x09, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x33, 0x02, 0x03, 0x01, 0x12, 0x04, 0xd1, 0x09, 0x14, 0x21, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x33, 0x02, 0x03, 0x03, 0x12, 0x04, 0xd1, 0x09, 0x24, 0x25, 0x0a, 0xd6, + 0x03, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x34, 0x12, 0x06, 0xeb, 0x09, 0x02, 0x86, 0x0a, 0x03, 0x1a, + 0xc5, 0x03, 0x0a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x28, 0x4c, 0x4c, 0x4d, 0x29, 0x20, 0x74, + 0x6f, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, + 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, + 0x65, 0x78, 0x74, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x4c, 0x4d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x70, + 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4f, + 0x70, 0x65, 0x6e, 0x41, 0x49, 0x27, 0x73, 0x20, 0x47, 0x50, 0x54, 0x2d, 0x34, 0x20, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, + 0x61, 0x20, 0x6a, 0x6f, 0x6b, 0x65, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x7b, 0x0a, 0x22, 0x6c, 0x6c, 0x6d, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x0a, + 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, + 0x3a, 0x20, 0x7b, 0x0a, 0x22, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x22, 0x3a, 0x20, 0x7b, 0x0a, + 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x67, 0x70, 0x74, 0x2d, 0x34, 0x22, + 0x2c, 0x0a, 0x22, 0x75, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x65, 0x6c, 0x6c, 0x20, 0x6d, 0x65, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x6b, 0x65, 0x2e, + 0x22, 0x2c, 0x0a, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, + 0x3a, 0x20, 0x30, 0x2e, 0x37, 0x2c, 0x0a, 0x22, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x7b, 0x4f, 0x50, + 0x45, 0x4e, 0x41, 0x49, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x22, 0x0a, 0x7d, + 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x34, 0x01, + 0x12, 0x04, 0xeb, 0x09, 0x0a, 0x11, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, + 0x12, 0x06, 0xec, 0x09, 0x04, 0xf1, 0x09, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x34, + 0x03, 0x00, 0x01, 0x12, 0x04, 0xec, 0x09, 0x0c, 0x18, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, + 0x34, 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, 0xed, 0x09, 0x06, 0x20, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x00, 0x04, 0x12, 0x04, 0xed, 0x09, 0x06, 0x0e, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x04, 0xed, 0x09, 0x0f, + 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, + 0xed, 0x09, 0x16, 0x1b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xed, 0x09, 0x1e, 0x1f, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x34, 0x03, + 0x00, 0x02, 0x01, 0x12, 0x04, 0xee, 0x09, 0x06, 0x26, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x34, 0x03, 0x00, 0x02, 0x01, 0x04, 0x12, 0x04, 0xee, 0x09, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x01, 0x05, 0x12, 0x04, 0xee, 0x09, 0x0f, 0x15, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xee, 0x09, + 0x16, 0x21, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, + 0x04, 0xee, 0x09, 0x24, 0x25, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, + 0x02, 0x12, 0x04, 0xef, 0x09, 0x06, 0x26, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, + 0x00, 0x02, 0x02, 0x04, 0x12, 0x04, 0xef, 0x09, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x34, 0x03, 0x00, 0x02, 0x02, 0x05, 0x12, 0x04, 0xef, 0x09, 0x0f, 0x15, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xef, 0x09, 0x16, 0x21, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x02, 0x03, 0x12, 0x04, 0xef, + 0x09, 0x24, 0x25, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x03, 0x12, + 0x04, 0xf0, 0x09, 0x06, 0x2e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, + 0x03, 0x04, 0x12, 0x04, 0xf0, 0x09, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, + 0x03, 0x00, 0x02, 0x03, 0x05, 0x12, 0x04, 0xf0, 0x09, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0xf0, 0x09, 0x16, 0x29, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x00, 0x02, 0x03, 0x03, 0x12, 0x04, 0xf0, 0x09, 0x2c, + 0x2d, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x12, 0x06, 0xf3, 0x09, 0x04, + 0xf8, 0x09, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x01, 0x12, 0x04, + 0xf3, 0x09, 0x0c, 0x16, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x00, + 0x12, 0x04, 0xf4, 0x09, 0x06, 0x20, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, + 0x02, 0x00, 0x04, 0x12, 0x04, 0xf4, 0x09, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x34, 0x03, 0x01, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf4, 0x09, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf4, 0x09, 0x16, 0x1b, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x00, 0x03, 0x12, 0x04, 0xf4, 0x09, + 0x1e, 0x1f, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x01, 0x12, 0x04, + 0xf5, 0x09, 0x06, 0x26, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x01, + 0x04, 0x12, 0x04, 0xf5, 0x09, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, + 0x01, 0x02, 0x01, 0x05, 0x12, 0x04, 0xf5, 0x09, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x34, 0x03, 0x01, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf5, 0x09, 0x16, 0x21, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x01, 0x03, 0x12, 0x04, 0xf5, 0x09, 0x24, 0x25, + 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x02, 0x12, 0x04, 0xf6, 0x09, + 0x06, 0x26, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x02, 0x04, 0x12, + 0x04, 0xf6, 0x09, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, + 0x02, 0x05, 0x12, 0x04, 0xf6, 0x09, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, + 0x03, 0x01, 0x02, 0x02, 0x01, 0x12, 0x04, 0xf6, 0x09, 0x16, 0x21, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x02, 0x03, 0x12, 0x04, 0xf6, 0x09, 0x24, 0x25, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x03, 0x12, 0x04, 0xf7, 0x09, 0x06, 0x2e, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x03, 0x04, 0x12, 0x04, 0xf7, + 0x09, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, 0x02, 0x03, 0x05, + 0x12, 0x04, 0xf7, 0x09, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x01, + 0x02, 0x03, 0x01, 0x12, 0x04, 0xf7, 0x09, 0x16, 0x29, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x34, 0x03, 0x01, 0x02, 0x03, 0x03, 0x12, 0x04, 0xf7, 0x09, 0x2c, 0x2d, 0x0a, 0x10, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x12, 0x06, 0xfa, 0x09, 0x04, 0xff, 0x09, 0x05, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x01, 0x12, 0x04, 0xfa, 0x09, 0x0c, 0x19, 0x0a, + 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x00, 0x12, 0x04, 0xfb, 0x09, 0x06, + 0x20, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x00, 0x04, 0x12, 0x04, + 0xfb, 0x09, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x00, + 0x05, 0x12, 0x04, 0xfb, 0x09, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, + 0x02, 0x02, 0x00, 0x01, 0x12, 0x04, 0xfb, 0x09, 0x16, 0x1b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x34, 0x03, 0x02, 0x02, 0x00, 0x03, 0x12, 0x04, 0xfb, 0x09, 0x1e, 0x1f, 0x0a, 0x10, 0x0a, + 0x08, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x01, 0x12, 0x04, 0xfc, 0x09, 0x06, 0x26, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x01, 0x04, 0x12, 0x04, 0xfc, 0x09, + 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x01, 0x05, 0x12, + 0x04, 0xfc, 0x09, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, + 0x01, 0x01, 0x12, 0x04, 0xfc, 0x09, 0x16, 0x21, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, + 0x03, 0x02, 0x02, 0x01, 0x03, 0x12, 0x04, 0xfc, 0x09, 0x24, 0x25, 0x0a, 0x10, 0x0a, 0x08, 0x04, + 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x02, 0x12, 0x04, 0xfd, 0x09, 0x06, 0x26, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x02, 0x04, 0x12, 0x04, 0xfd, 0x09, 0x06, 0x0e, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x02, 0x05, 0x12, 0x04, 0xfd, + 0x09, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xfd, 0x09, 0x16, 0x21, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, + 0x02, 0x02, 0x03, 0x12, 0x04, 0xfd, 0x09, 0x24, 0x25, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, + 0x34, 0x03, 0x02, 0x02, 0x03, 0x12, 0x04, 0xfe, 0x09, 0x06, 0x2e, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x03, 0x04, 0x12, 0x04, 0xfe, 0x09, 0x06, 0x0e, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x03, 0x05, 0x12, 0x04, 0xfe, 0x09, 0x0f, + 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x03, 0x01, 0x12, 0x04, + 0xfe, 0x09, 0x16, 0x29, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x34, 0x03, 0x02, 0x02, 0x03, + 0x03, 0x12, 0x04, 0xfe, 0x09, 0x2c, 0x2d, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x34, 0x08, + 0x00, 0x12, 0x06, 0x81, 0x0a, 0x04, 0x85, 0x0a, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x34, 0x08, 0x00, 0x01, 0x12, 0x04, 0x81, 0x0a, 0x0a, 0x19, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x34, 0x02, 0x00, 0x12, 0x04, 0x82, 0x0a, 0x06, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x34, 0x02, 0x00, 0x06, 0x12, 0x04, 0x82, 0x0a, 0x06, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x34, 0x02, 0x00, 0x01, 0x12, 0x04, 0x82, 0x0a, 0x13, 0x19, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x34, 0x02, 0x00, 0x03, 0x12, 0x04, 0x82, 0x0a, 0x1c, 0x1d, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x34, 0x02, 0x01, 0x12, 0x04, 0x83, 0x0a, 0x06, 0x1a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x34, 0x02, 0x01, 0x06, 0x12, 0x04, 0x83, 0x0a, 0x06, 0x10, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x34, 0x02, 0x01, 0x01, 0x12, 0x04, 0x83, 0x0a, 0x11, 0x15, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x34, 0x02, 0x01, 0x03, 0x12, 0x04, 0x83, 0x0a, 0x18, 0x19, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x34, 0x02, 0x02, 0x12, 0x04, 0x84, 0x0a, 0x06, 0x20, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x34, 0x02, 0x02, 0x06, 0x12, 0x04, 0x84, 0x0a, 0x06, + 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x34, 0x02, 0x02, 0x01, 0x12, 0x04, 0x84, 0x0a, + 0x14, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x34, 0x02, 0x02, 0x03, 0x12, 0x04, 0x84, + 0x0a, 0x1e, 0x1f, 0x0a, 0xa8, 0x02, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x35, 0x12, 0x04, 0x95, 0x0a, + 0x02, 0x1c, 0x1a, 0x99, 0x02, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x53, 0x6f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x27, 0x73, 0x20, 0x73, 0x55, 0x53, 0x44, 0x20, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x63, 0x6f, 0x69, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, + 0x73, 0x74, 0x2d, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x69, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, + 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x55, 0x53, 0x44, 0x20, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x55, 0x53, 0x44, 0x20, 0x28, 0x31, 0x2e, 0x30, + 0x20, 0x3d, 0x20, 0x24, 0x31, 0x2e, 0x30, 0x30, 0x29, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x55, 0x53, 0x44, + 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, + 0x7b, 0x20, 0x22, 0x73, 0x6f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x75, 0x73, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x35, 0x01, 0x12, 0x04, 0x95, 0x0a, 0x0a, 0x19, 0x0a, 0x89, 0x05, + 0x0a, 0x04, 0x04, 0x00, 0x03, 0x36, 0x12, 0x06, 0xb7, 0x0a, 0x02, 0xc4, 0x0a, 0x03, 0x1a, 0xf8, + 0x04, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x43, 0x75, 0x72, 0x76, 0x65, 0x20, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2f, 0x65, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x43, 0x75, 0x72, 0x76, + 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x43, + 0x75, 0x72, 0x76, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x6e, 0x20, 0x45, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, + 0x0a, 0x22, 0x63, 0x75, 0x72, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x22, + 0x2c, 0x0a, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, + 0x20, 0x22, 0x30, 0x78, 0x62, 0x65, 0x62, 0x63, 0x34, 0x34, 0x37, 0x38, 0x32, 0x63, 0x37, 0x64, + 0x62, 0x30, 0x61, 0x31, 0x61, 0x36, 0x30, 0x63, 0x62, 0x36, 0x66, 0x65, 0x39, 0x37, 0x64, 0x30, + 0x62, 0x34, 0x38, 0x33, 0x30, 0x33, 0x32, 0x66, 0x66, 0x31, 0x63, 0x37, 0x22, 0x2c, 0x0a, 0x22, + 0x6f, 0x75, 0x74, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x31, 0x38, + 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x52, 0x50, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, + 0x22, 0x63, 0x75, 0x72, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x22, 0x2c, + 0x0a, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x65, 0x74, 0x68, 0x2d, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x65, + 0x74, 0x2e, 0x67, 0x2e, 0x61, 0x6c, 0x63, 0x68, 0x65, 0x6d, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x76, 0x32, 0x2f, 0x59, 0x4f, 0x55, 0x52, 0x2d, 0x41, 0x50, 0x49, 0x2d, 0x4b, 0x45, 0x59, 0x22, + 0x2c, 0x0a, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, + 0x20, 0x22, 0x30, 0x78, 0x62, 0x65, 0x62, 0x63, 0x34, 0x34, 0x37, 0x38, 0x32, 0x63, 0x37, 0x64, + 0x62, 0x30, 0x61, 0x31, 0x61, 0x36, 0x30, 0x63, 0x62, 0x36, 0x66, 0x65, 0x39, 0x37, 0x64, 0x30, + 0x62, 0x34, 0x38, 0x33, 0x30, 0x33, 0x32, 0x66, 0x66, 0x31, 0x63, 0x37, 0x22, 0x2c, 0x0a, 0x22, + 0x6f, 0x75, 0x74, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x31, 0x38, + 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, + 0x36, 0x01, 0x12, 0x04, 0xb7, 0x0a, 0x0a, 0x1a, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x36, + 0x04, 0x00, 0x12, 0x06, 0xb8, 0x0a, 0x04, 0xbb, 0x0a, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x36, 0x04, 0x00, 0x01, 0x12, 0x04, 0xb8, 0x0a, 0x09, 0x0e, 0x0a, 0x50, 0x0a, 0x08, 0x04, + 0x00, 0x03, 0x36, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xba, 0x0a, 0x06, 0x19, 0x1a, 0x3e, 0x2f, + 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x75, 0x72, 0x76, 0x65, 0x20, + 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x36, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xba, 0x0a, 0x06, 0x14, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x36, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xba, + 0x0a, 0x17, 0x18, 0x0a, 0x6b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x36, 0x02, 0x00, 0x12, 0x04, 0xbd, + 0x0a, 0x04, 0x1d, 0x1a, 0x5b, 0x2f, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, + 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x43, 0x75, 0x72, 0x76, 0x65, 0x20, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x00, 0x04, 0x12, 0x04, 0xbd, 0x0a, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x00, 0x06, 0x12, 0x04, 0xbd, 0x0a, + 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x00, 0x01, 0x12, 0x04, 0xbd, + 0x0a, 0x13, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xbd, 0x0a, 0x1b, 0x1c, 0x0a, 0x97, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x36, 0x02, 0x01, 0x12, + 0x04, 0xbf, 0x0a, 0x04, 0x21, 0x1a, 0x86, 0x01, 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, 0x50, 0x43, 0x20, 0x65, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x20, 0x52, 0x50, 0x43, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x01, 0x04, 0x12, 0x04, 0xbf, 0x0a, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x01, 0x05, 0x12, 0x04, 0xbf, 0x0a, 0x0d, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x01, 0x01, 0x12, 0x04, 0xbf, 0x0a, 0x14, + 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x01, 0x03, 0x12, 0x04, 0xbf, 0x0a, + 0x1f, 0x20, 0x0a, 0x5d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x36, 0x02, 0x02, 0x12, 0x04, 0xc1, 0x0a, + 0x04, 0x25, 0x1a, 0x4d, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x43, 0x75, 0x72, 0x76, 0x65, 0x20, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x02, 0x04, 0x12, 0x04, 0xc1, 0x0a, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x02, 0x05, 0x12, 0x04, 0xc1, + 0x0a, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x02, 0x01, 0x12, 0x04, + 0xc1, 0x0a, 0x14, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x02, 0x03, 0x12, + 0x04, 0xc1, 0x0a, 0x23, 0x24, 0x0a, 0x57, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x36, 0x02, 0x03, 0x12, + 0x04, 0xc3, 0x0a, 0x04, 0x25, 0x1a, 0x47, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x03, 0x04, 0x12, 0x04, 0xc3, 0x0a, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x03, 0x05, 0x12, 0x04, 0xc3, 0x0a, 0x0d, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x03, 0x01, 0x12, 0x04, 0xc3, 0x0a, 0x14, + 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x36, 0x02, 0x03, 0x03, 0x12, 0x04, 0xc3, 0x0a, + 0x23, 0x24, 0x0a, 0x33, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x37, 0x12, 0x06, 0xc9, 0x0a, 0x02, 0xcb, + 0x0a, 0x03, 0x1a, 0x23, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x45, 0x54, + 0x48, 0x2f, 0x57, 0x45, 0x54, 0x48, 0x20, 0x72, 0x65, 0x64, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x61, 0x74, 0x65, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x37, 0x01, + 0x12, 0x04, 0xc9, 0x0a, 0x0a, 0x24, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x37, 0x02, 0x00, + 0x12, 0x04, 0xca, 0x0a, 0x04, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x37, 0x02, 0x00, + 0x04, 0x12, 0x04, 0xca, 0x0a, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x37, 0x02, + 0x00, 0x05, 0x12, 0x04, 0xca, 0x0a, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x37, + 0x02, 0x00, 0x01, 0x12, 0x04, 0xca, 0x0a, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x37, 0x02, 0x00, 0x03, 0x12, 0x04, 0xca, 0x0a, 0x1f, 0x20, 0x0a, 0xea, 0x03, 0x0a, 0x04, 0x04, + 0x00, 0x03, 0x38, 0x12, 0x06, 0xe1, 0x0a, 0x02, 0xea, 0x0a, 0x03, 0x1a, 0xd9, 0x03, 0x0a, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x61, 0x20, 0x42, 0x69, 0x74, 0x46, 0x6c, 0x75, 0x78, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, + 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, + 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x52, 0x50, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x22, 0x62, + 0x69, 0x74, 0x46, 0x6c, 0x75, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x22, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x6d, 0x79, 0x2d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x2d, 0x72, 0x70, + 0x63, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0x2c, 0x0a, + 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, + 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x0a, 0x22, 0x69, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x22, 0x2c, 0x0a, 0x22, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x0a, 0x7d, + 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x38, 0x01, + 0x12, 0x04, 0xe1, 0x0a, 0x0a, 0x15, 0x0a, 0x70, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x38, 0x02, 0x00, + 0x12, 0x04, 0xe3, 0x0a, 0x04, 0x21, 0x1a, 0x60, 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, 0x50, 0x43, 0x20, 0x65, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x20, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x52, 0x50, 0x43, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x38, + 0x02, 0x00, 0x04, 0x12, 0x04, 0xe3, 0x0a, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x38, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe3, 0x0a, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x38, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe3, 0x0a, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x38, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe3, 0x0a, 0x1f, 0x20, 0x0a, 0x33, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x38, 0x02, 0x01, 0x12, 0x04, 0xe5, 0x0a, 0x04, 0x25, 0x1a, 0x23, 0x2f, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x42, 0x69, 0x74, 0x46, 0x6c, 0x75, 0x78, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x38, 0x02, 0x01, 0x04, 0x12, 0x04, 0xe5, 0x0a, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x38, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe5, + 0x0a, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x38, 0x02, 0x01, 0x01, 0x12, 0x04, + 0xe5, 0x0a, 0x14, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x38, 0x02, 0x01, 0x03, 0x12, + 0x04, 0xe5, 0x0a, 0x23, 0x24, 0x0a, 0x32, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x38, 0x02, 0x02, 0x12, + 0x04, 0xe7, 0x0a, 0x04, 0x21, 0x1a, 0x22, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x38, 0x02, 0x02, 0x04, 0x12, 0x04, 0xe7, 0x0a, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x38, 0x02, 0x02, 0x05, 0x12, 0x04, 0xe7, 0x0a, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x38, 0x02, 0x02, 0x01, 0x12, 0x04, 0xe7, 0x0a, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x38, 0x02, 0x02, 0x03, 0x12, 0x04, 0xe7, 0x0a, 0x1f, 0x20, 0x0a, 0x33, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x38, 0x02, 0x03, 0x12, 0x04, 0xe9, 0x0a, 0x04, 0x22, 0x1a, 0x23, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x38, 0x02, 0x03, 0x04, 0x12, 0x04, 0xe9, + 0x0a, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x38, 0x02, 0x03, 0x05, 0x12, 0x04, + 0xe9, 0x0a, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x38, 0x02, 0x03, 0x01, 0x12, + 0x04, 0xe9, 0x0a, 0x14, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x38, 0x02, 0x03, 0x03, + 0x12, 0x04, 0xe9, 0x0a, 0x20, 0x21, 0x0a, 0xb6, 0x02, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x39, 0x12, + 0x06, 0xf8, 0x0a, 0x02, 0x81, 0x0b, 0x03, 0x1a, 0xa5, 0x02, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x6b, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x4f, + 0x4c, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x53, 0x4f, 0x4c, 0x29, 0x0a, + 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x72, 0x61, 0x67, 0x53, 0x4f, + 0x4c, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x0a, 0x0a, 0x60, + 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x46, 0x52, 0x41, + 0x47, 0x5f, 0x53, 0x4f, 0x4c, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x39, 0x01, 0x12, 0x04, 0xf8, 0x0a, 0x0a, 0x18, 0x0a, 0x10, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x39, 0x04, 0x00, 0x12, 0x06, 0xf9, 0x0a, 0x04, 0xfe, 0x0a, 0x05, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x39, 0x04, 0x00, 0x01, 0x12, 0x04, 0xf9, 0x0a, 0x09, + 0x0e, 0x0a, 0x42, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x39, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xfb, + 0x0a, 0x06, 0x19, 0x1a, 0x30, 0x2f, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x27, 0x73, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x28, 0x66, 0x72, 0x61, 0x67, + 0x53, 0x4f, 0x4c, 0x29, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x39, 0x04, 0x00, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xfb, 0x0a, 0x06, 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x39, + 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xfb, 0x0a, 0x17, 0x18, 0x0a, 0x3d, 0x0a, 0x08, 0x04, + 0x00, 0x03, 0x39, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xfd, 0x0a, 0x06, 0x16, 0x1a, 0x2b, 0x2f, + 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x27, 0x73, 0x20, 0x6e, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x20, 0x28, 0x6e, 0x53, 0x4f, 0x4c, 0x29, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x39, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xfd, 0x0a, 0x06, 0x11, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x39, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xfd, 0x0a, 0x14, 0x15, + 0x0a, 0x3e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x39, 0x02, 0x00, 0x12, 0x04, 0x80, 0x0b, 0x04, 0x1d, + 0x1a, 0x2e, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x39, 0x02, 0x00, 0x04, 0x12, 0x04, 0x80, 0x0b, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x39, 0x02, 0x00, 0x06, 0x12, 0x04, 0x80, 0x0b, + 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x39, 0x02, 0x00, 0x01, 0x12, 0x04, 0x80, + 0x0b, 0x13, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x39, 0x02, 0x00, 0x03, 0x12, 0x04, + 0x80, 0x0b, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x3a, 0x12, 0x06, 0x83, 0x0b, + 0x02, 0x8c, 0x0b, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x3a, 0x01, 0x12, 0x04, 0x83, + 0x0b, 0x0a, 0x17, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, 0x12, 0x06, 0x84, + 0x0b, 0x04, 0x8a, 0x0b, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, 0x01, + 0x12, 0x04, 0x84, 0x0b, 0x09, 0x0e, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, + 0x02, 0x00, 0x12, 0x04, 0x85, 0x0b, 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3a, + 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x85, 0x0b, 0x06, 0x11, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x3a, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0x85, 0x0b, 0x16, 0x17, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0x86, 0x0b, 0x06, 0x18, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x86, + 0x0b, 0x06, 0x11, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, 0x02, 0x01, 0x02, + 0x12, 0x04, 0x86, 0x0b, 0x16, 0x17, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, + 0x02, 0x02, 0x12, 0x04, 0x87, 0x0b, 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3a, + 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0x87, 0x0b, 0x06, 0x11, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x3a, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0x87, 0x0b, 0x16, 0x17, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0x88, 0x0b, 0x06, 0x18, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0x88, + 0x0b, 0x06, 0x13, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, 0x02, 0x03, 0x02, + 0x12, 0x04, 0x88, 0x0b, 0x16, 0x17, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x3a, 0x04, 0x00, + 0x02, 0x04, 0x12, 0x04, 0x89, 0x0b, 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3a, + 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0x89, 0x0b, 0x06, 0x11, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x3a, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, 0x89, 0x0b, 0x16, 0x17, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3a, 0x02, 0x00, 0x12, 0x04, 0x8b, 0x0b, 0x04, 0x1d, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3a, 0x02, 0x00, 0x04, 0x12, 0x04, 0x8b, 0x0b, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3a, 0x02, 0x00, 0x06, 0x12, 0x04, 0x8b, 0x0b, 0x0d, 0x12, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3a, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8b, 0x0b, 0x13, + 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3a, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8b, 0x0b, + 0x1b, 0x1c, 0x0a, 0x9a, 0x04, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x3b, 0x12, 0x06, 0xa1, 0x0b, 0x02, + 0xb1, 0x0b, 0x03, 0x1a, 0x89, 0x04, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x4c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x20, 0x28, 0x4c, 0x53, 0x54, 0x29, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4c, 0x53, 0x54, 0x20, 0x6d, 0x69, 0x6e, 0x74, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, + 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x62, 0x61, 0x73, + 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x43, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x6e, 0x20, 0x41, 0x50, 0x59, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x4c, 0x53, 0x54, + 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x31, + 0x30, 0x30, 0x20, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, + 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x22, 0x6c, 0x73, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x59, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x0a, 0x22, 0x6c, 0x73, 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x4a, 0x31, 0x74, + 0x6f, 0x73, 0x6f, 0x31, 0x75, 0x43, 0x6b, 0x33, 0x52, 0x4c, 0x6d, 0x6a, 0x6f, 0x72, 0x68, 0x54, + 0x74, 0x72, 0x56, 0x77, 0x59, 0x39, 0x48, 0x4a, 0x37, 0x58, 0x38, 0x56, 0x39, 0x79, 0x59, 0x61, + 0x63, 0x36, 0x59, 0x37, 0x6b, 0x47, 0x43, 0x50, 0x6e, 0x22, 0x2c, 0x0a, 0x22, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x4e, 0x22, 0x2c, 0x0a, 0x22, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x73, 0x22, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x3b, 0x01, 0x12, 0x04, 0xa1, 0x0b, 0x0a, 0x20, 0x0a, 0x10, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, 0x12, 0x06, 0xa2, 0x0b, 0x04, 0xa7, 0x0b, 0x05, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, 0x01, 0x12, 0x04, 0xa2, 0x0b, 0x09, + 0x12, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xa3, + 0x0b, 0x06, 0x1b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, 0x02, 0x00, 0x01, + 0x12, 0x04, 0xa3, 0x0b, 0x06, 0x16, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, + 0x02, 0x00, 0x02, 0x12, 0x04, 0xa3, 0x0b, 0x19, 0x1a, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, + 0x3b, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xa4, 0x0b, 0x06, 0x19, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x3b, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xa4, 0x0b, 0x06, 0x14, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xa4, 0x0b, 0x17, + 0x18, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xa5, + 0x0b, 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xa5, 0x0b, 0x06, 0x13, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, + 0x02, 0x02, 0x02, 0x12, 0x04, 0xa5, 0x0b, 0x16, 0x17, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, + 0x3b, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xa6, 0x0b, 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x3b, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0xa6, 0x0b, 0x06, 0x13, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x3b, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0xa6, 0x0b, 0x16, + 0x17, 0x0a, 0x5d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3b, 0x02, 0x00, 0x12, 0x04, 0xaa, 0x0b, 0x04, + 0x21, 0x1a, 0x4d, 0x2f, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x4c, 0x53, 0x54, 0x20, 0x6d, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x69, 0x73, 0x20, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x64, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x02, 0x00, 0x04, 0x12, 0x04, 0xaa, 0x0b, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x02, 0x00, 0x05, 0x12, 0x04, 0xaa, 0x0b, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x02, 0x00, 0x01, 0x12, 0x04, 0xaa, + 0x0b, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xaa, 0x0b, 0x1f, 0x20, 0x0a, 0x60, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3b, 0x02, 0x01, 0x12, 0x04, + 0xac, 0x0b, 0x04, 0x25, 0x1a, 0x50, 0x2f, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x73, 0x65, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x02, 0x01, + 0x04, 0x12, 0x04, 0xac, 0x0b, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x02, + 0x01, 0x06, 0x12, 0x04, 0xac, 0x0b, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, + 0x02, 0x01, 0x01, 0x12, 0x04, 0xac, 0x0b, 0x17, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x3b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xac, 0x0b, 0x23, 0x24, 0x0a, 0xd8, 0x01, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x3b, 0x02, 0x02, 0x12, 0x04, 0xb0, 0x0b, 0x04, 0x1e, 0x1a, 0xc7, 0x01, 0x2f, 0x20, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x2f, 0x20, + 0x2d, 0x20, 0x49, 0x66, 0x20, 0x60, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x30, + 0x60, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x0a, 0x2f, + 0x20, 0x2d, 0x20, 0x49, 0x66, 0x20, 0x60, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x20, 0x3e, 0x20, + 0x30, 0x60, 0x2c, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x20, 0x60, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x60, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x02, 0x02, 0x04, + 0x12, 0x04, 0xb0, 0x0b, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x02, 0x02, + 0x05, 0x12, 0x04, 0xb0, 0x0b, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, 0x02, + 0x02, 0x01, 0x12, 0x04, 0xb0, 0x0b, 0x13, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3b, + 0x02, 0x02, 0x03, 0x12, 0x04, 0xb0, 0x0b, 0x1c, 0x1d, 0x0a, 0xec, 0x03, 0x0a, 0x04, 0x04, 0x00, + 0x03, 0x3c, 0x12, 0x06, 0xc6, 0x0b, 0x02, 0xd9, 0x0b, 0x03, 0x1a, 0xdb, 0x03, 0x0a, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x74, 0x61, 0x73, + 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x75, 0x6d, 0x70, 0x20, 0x41, 0x4d, + 0x4d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, + 0x69, 0x76, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x50, + 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x2c, + 0x20, 0x6d, 0x61, 0x78, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x73, 0x6c, 0x69, + 0x70, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x75, + 0x6d, 0x70, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x53, 0x77, 0x61, 0x70, 0x20, 0x31, 0x30, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x58, 0x20, 0x74, 0x6f, 0x20, 0x59, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x73, 0x6c, 0x69, 0x70, + 0x70, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x30, 0x2e, 0x35, 0x25, 0x0a, 0x0a, 0x60, 0x60, + 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x22, 0x70, 0x75, 0x6d, 0x70, 0x41, 0x6d, 0x6d, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x66, 0x37, 0x73, 0x58, 0x4d, + 0x6f, 0x50, 0x38, 0x69, 0x52, 0x77, 0x34, 0x69, 0x69, 0x58, 0x6d, 0x4a, 0x31, 0x6e, 0x71, 0x34, + 0x76, 0x78, 0x63, 0x52, 0x79, 0x63, 0x62, 0x47, 0x58, 0x79, 0x35, 0x52, 0x4c, 0x38, 0x61, 0x38, + 0x4c, 0x6e, 0x54, 0x64, 0x33, 0x76, 0x22, 0x2c, 0x0a, 0x22, 0x69, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x22, 0x2c, 0x0a, 0x22, 0x6d, 0x61, 0x78, + 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x30, 0x2e, 0x35, 0x2c, + 0x0a, 0x22, 0x69, 0x73, 0x5f, 0x78, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x79, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x3c, + 0x01, 0x12, 0x04, 0xc6, 0x0b, 0x0a, 0x15, 0x0a, 0x4f, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3c, 0x02, + 0x00, 0x12, 0x04, 0xc8, 0x0b, 0x04, 0x25, 0x1a, 0x3f, 0x2f, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x75, + 0x6d, 0x70, 0x20, 0x41, 0x4d, 0x4d, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3c, + 0x02, 0x00, 0x04, 0x12, 0x04, 0xc8, 0x0b, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x3c, 0x02, 0x00, 0x05, 0x12, 0x04, 0xc8, 0x0b, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x3c, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc8, 0x0b, 0x14, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x3c, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc8, 0x0b, 0x23, 0x24, 0x0a, 0xa6, 0x01, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x3c, 0x02, 0x01, 0x12, 0x04, 0xcd, 0x0b, 0x04, 0x22, 0x1a, 0x95, 0x01, + 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, + 0x0a, 0x2f, 0x20, 0x2d, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x75, + 0x6e, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x0a, 0x2f, 0x20, 0x2d, 0x20, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x60, 0x31, 0x60, 0x20, + 0x28, 0x53, 0x77, 0x61, 0x70, 0x20, 0x31, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x29, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3c, 0x02, 0x01, 0x04, + 0x12, 0x04, 0xcd, 0x0b, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3c, 0x02, 0x01, + 0x05, 0x12, 0x04, 0xcd, 0x0b, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3c, 0x02, + 0x01, 0x01, 0x12, 0x04, 0xcd, 0x0b, 0x14, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3c, + 0x02, 0x01, 0x03, 0x12, 0x04, 0xcd, 0x0b, 0x20, 0x21, 0x0a, 0xca, 0x01, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x3c, 0x02, 0x02, 0x12, 0x04, 0xd2, 0x0b, 0x04, 0x25, 0x1a, 0xb9, 0x01, 0x2f, 0x20, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x73, 0x6c, 0x69, + 0x70, 0x70, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, + 0x61, 0x70, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, + 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x2f, + 0x20, 0x2d, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x20, 0x60, 0x30, 0x2e, 0x35, + 0x60, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x30, 0x2e, 0x35, + 0x25, 0x20, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x0a, 0x2f, 0x20, 0x2d, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x60, 0x33, 0x60, 0x20, 0x28, 0x33, 0x25, + 0x20, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, + 0x6e, 0x63, 0x65, 0x29, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3c, 0x02, 0x02, + 0x04, 0x12, 0x04, 0xd2, 0x0b, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3c, 0x02, + 0x02, 0x05, 0x12, 0x04, 0xd2, 0x0b, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3c, + 0x02, 0x02, 0x01, 0x12, 0x04, 0xd2, 0x0b, 0x14, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x3c, 0x02, 0x02, 0x03, 0x12, 0x04, 0xd2, 0x0b, 0x23, 0x24, 0x0a, 0xab, 0x01, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x3c, 0x02, 0x03, 0x12, 0x04, 0xd8, 0x0b, 0x04, 0x21, 0x1a, 0x9a, 0x01, 0x2f, 0x20, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x20, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, 0x2f, 0x20, 0x2d, 0x20, 0x60, 0x74, 0x72, 0x75, + 0x65, 0x60, 0x3a, 0x20, 0x53, 0x77, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x20, 0x58, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x59, + 0x2e, 0x0a, 0x2f, 0x20, 0x2d, 0x20, 0x60, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x60, 0x3a, 0x20, 0x53, + 0x77, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x59, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x58, 0x2e, 0x0a, 0x2f, 0x20, 0x2d, + 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, + 0x60, 0x74, 0x72, 0x75, 0x65, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3c, + 0x02, 0x03, 0x04, 0x12, 0x04, 0xd8, 0x0b, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x3c, 0x02, 0x03, 0x05, 0x12, 0x04, 0xd8, 0x0b, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x3c, 0x02, 0x03, 0x01, 0x12, 0x04, 0xd8, 0x0b, 0x12, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x3c, 0x02, 0x03, 0x03, 0x12, 0x04, 0xd8, 0x0b, 0x1f, 0x20, 0x0a, 0xcf, 0x04, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x3d, 0x12, 0x06, 0xf3, 0x0b, 0x02, 0xfa, 0x0b, 0x03, 0x1a, 0xbe, 0x04, + 0x0a, 0x20, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, + 0x72, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x50, 0x75, 0x6d, + 0x70, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x2c, 0x20, 0x58, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x20, 0x6a, 0x6f, 0x62, 0x2c, 0x20, 0x59, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x6a, 0x6f, 0x62, 0x2e, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, + 0x72, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x50, + 0x75, 0x6d, 0x70, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, + 0x65, 0x6e, 0x20, 0x50, 0x75, 0x6d, 0x70, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x6c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x20, 0x60, 0x60, 0x60, + 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x22, 0x70, 0x75, 0x6d, 0x70, 0x41, 0x6d, 0x6d, 0x4c, + 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x20, 0x7b, 0x0a, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x66, 0x37, 0x73, 0x58, 0x4d, 0x6f, 0x50, 0x38, 0x69, 0x52, + 0x77, 0x34, 0x69, 0x69, 0x58, 0x6d, 0x4a, 0x31, 0x6e, 0x71, 0x34, 0x76, 0x78, 0x63, 0x52, 0x79, + 0x63, 0x62, 0x47, 0x58, 0x79, 0x35, 0x52, 0x4c, 0x38, 0x61, 0x38, 0x4c, 0x6e, 0x54, 0x64, 0x33, + 0x76, 0x22, 0x2c, 0x20, 0x2f, 0x2f, 0x20, 0x55, 0x53, 0x44, 0x43, 0x2f, 0x53, 0x4f, 0x4c, 0x0a, + 0x22, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x20, 0x7b, + 0x0a, 0x22, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x0a, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x20, 0x2f, 0x2f, 0x20, + 0x55, 0x53, 0x44, 0x43, 0x2f, 0x55, 0x53, 0x44, 0x0a, 0x7d, 0x0a, 0x7d, 0x2c, 0x0a, 0x22, 0x79, + 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x22, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x22, + 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x4f, + 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x3d, 0x01, 0x12, 0x04, 0xf3, 0x0b, 0x0a, 0x21, 0x0a, 0x4f, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x00, 0x12, 0x04, 0xf5, 0x0b, 0x04, 0x25, 0x1a, 0x3f, 0x2f, + 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x50, 0x75, 0x6d, 0x70, 0x20, 0x41, 0x4d, 0x4d, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x00, 0x04, 0x12, 0x04, 0xf5, 0x0b, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf5, 0x0b, 0x0d, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf5, 0x0b, 0x14, + 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xf5, 0x0b, + 0x23, 0x24, 0x0a, 0x56, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x01, 0x12, 0x04, 0xf7, 0x0b, + 0x04, 0x27, 0x1a, 0x46, 0x2f, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6f, + 0x6c, 0x20, 0x78, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x3d, 0x02, 0x01, 0x04, 0x12, 0x04, 0xf7, 0x0b, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x3d, 0x02, 0x01, 0x06, 0x12, 0x04, 0xf7, 0x0b, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x3d, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf7, 0x0b, 0x17, 0x22, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x01, 0x03, 0x12, 0x04, 0xf7, 0x0b, 0x25, 0x26, 0x0a, 0x2f, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x02, 0x12, 0x04, 0xf9, 0x0b, 0x04, 0x27, 0x1a, 0x1f, + 0x2f, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x6a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x02, 0x04, 0x12, 0x04, 0xf9, 0x0b, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x02, 0x06, 0x12, 0x04, 0xf9, 0x0b, 0x0d, + 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x02, 0x01, 0x12, 0x04, 0xf9, 0x0b, + 0x17, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3d, 0x02, 0x02, 0x03, 0x12, 0x04, 0xf9, + 0x0b, 0x25, 0x26, 0x0a, 0x99, 0x03, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x3e, 0x12, 0x06, 0x8b, 0x0c, + 0x02, 0x8d, 0x0c, 0x03, 0x1a, 0x88, 0x03, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x62, + 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x75, 0x6e, + 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x0a, + 0x20, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x56, 0x61, + 0x75, 0x6c, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x62, 0x65, + 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x75, 0x6c, 0x74, 0x20, + 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, + 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x47, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x62, 0x65, 0x74, + 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x70, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, + 0x6e, 0x64, 0x0a, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x0a, 0x20, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, + 0x0a, 0x22, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x0a, 0x22, 0x76, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x39, 0x59, 0x62, + 0x61, 0x69, 0x63, 0x4d, 0x73, 0x58, 0x72, 0x74, 0x75, 0x70, 0x6b, 0x70, 0x44, 0x37, 0x32, 0x70, + 0x64, 0x57, 0x42, 0x66, 0x55, 0x36, 0x52, 0x37, 0x45, 0x4a, 0x66, 0x53, 0x42, 0x79, 0x77, 0x37, + 0x35, 0x73, 0x45, 0x70, 0x44, 0x4d, 0x31, 0x75, 0x48, 0x22, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x3e, 0x01, 0x12, 0x04, 0x8b, 0x0c, 0x0a, 0x16, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3e, 0x02, 0x00, 0x12, 0x04, 0x8c, 0x0c, 0x04, 0x1e, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3e, 0x02, 0x00, 0x04, 0x12, 0x04, 0x8c, 0x0c, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3e, 0x02, 0x00, 0x05, 0x12, 0x04, 0x8c, 0x0c, 0x0d, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3e, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8c, 0x0c, 0x14, + 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3e, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8c, 0x0c, + 0x1c, 0x1d, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x3f, 0x12, 0x06, 0x8f, 0x0c, 0x02, 0x92, + 0x0c, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x3f, 0x01, 0x12, 0x04, 0x8f, 0x0c, 0x0a, + 0x25, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3f, 0x02, 0x00, 0x12, 0x04, 0x90, 0x0c, 0x04, + 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3f, 0x02, 0x00, 0x04, 0x12, 0x04, 0x90, 0x0c, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3f, 0x02, 0x00, 0x05, 0x12, 0x04, 0x90, + 0x0c, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3f, 0x02, 0x00, 0x01, 0x12, 0x04, + 0x90, 0x0c, 0x14, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3f, 0x02, 0x00, 0x03, 0x12, + 0x04, 0x90, 0x0c, 0x1c, 0x1d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x3f, 0x02, 0x01, 0x12, + 0x04, 0x91, 0x0c, 0x04, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3f, 0x02, 0x01, 0x04, + 0x12, 0x04, 0x91, 0x0c, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3f, 0x02, 0x01, + 0x05, 0x12, 0x04, 0x91, 0x0c, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3f, 0x02, + 0x01, 0x01, 0x12, 0x04, 0x91, 0x0c, 0x14, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x3f, + 0x02, 0x01, 0x03, 0x12, 0x04, 0x91, 0x0c, 0x22, 0x23, 0x0a, 0xbd, 0x01, 0x0a, 0x04, 0x04, 0x00, + 0x03, 0x40, 0x12, 0x06, 0x99, 0x0c, 0x02, 0x9f, 0x0c, 0x03, 0x1a, 0xac, 0x01, 0x0a, 0x20, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x20, 0x53, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x20, 0x32, 0x30, 0x32, 0x32, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, + 0x66, 0x65, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x30, 0x32, 0x32, 0x20, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, + 0x40, 0x01, 0x12, 0x04, 0x99, 0x0c, 0x0a, 0x26, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x40, + 0x04, 0x00, 0x12, 0x06, 0x9a, 0x0c, 0x04, 0x9c, 0x0c, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x40, 0x04, 0x00, 0x01, 0x12, 0x04, 0x9a, 0x0c, 0x09, 0x1b, 0x0a, 0x10, 0x0a, 0x08, 0x04, + 0x00, 0x03, 0x40, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x9b, 0x0c, 0x06, 0x2a, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x40, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x9b, 0x0c, 0x06, 0x25, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x40, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0x9b, + 0x0c, 0x28, 0x29, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x40, 0x02, 0x00, 0x12, 0x04, 0x9d, + 0x0c, 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x40, 0x02, 0x00, 0x04, 0x12, 0x04, + 0x9d, 0x0c, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x40, 0x02, 0x00, 0x05, 0x12, + 0x04, 0x9d, 0x0c, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x40, 0x02, 0x00, 0x01, + 0x12, 0x04, 0x9d, 0x0c, 0x14, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x40, 0x02, 0x00, + 0x03, 0x12, 0x04, 0x9d, 0x0c, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x40, 0x02, + 0x01, 0x12, 0x04, 0x9e, 0x0c, 0x04, 0x2e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x40, 0x02, + 0x01, 0x04, 0x12, 0x04, 0x9e, 0x0c, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x40, + 0x02, 0x01, 0x06, 0x12, 0x04, 0x9e, 0x0c, 0x0d, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x40, 0x02, 0x01, 0x01, 0x12, 0x04, 0x9e, 0x0c, 0x20, 0x29, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x40, 0x02, 0x01, 0x03, 0x12, 0x04, 0x9e, 0x0c, 0x2c, 0x2d, 0x0a, 0xc7, 0x0b, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x41, 0x12, 0x06, 0xcf, 0x0c, 0x02, 0xdb, 0x0c, 0x03, 0x1a, 0xb6, 0x0b, 0x0a, + 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x61, 0x20, 0x2a, 0x6c, 0x69, 0x76, 0x65, 0x2a, 0x20, + 0x73, 0x70, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x2a, 0x2a, 0x53, 0x75, 0x72, 0x67, 0x65, 0x2a, 0x2a, 0x20, + 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x0a, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0xe2, 0x80, 0x93, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x73, 0x20, + 0x6f, 0x75, 0x72, 0x20, 0x68, 0x69, 0x67, 0x68, 0x2d, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x6f, + 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x2e, + 0x0a, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x0a, 0x20, + 0xe2, 0x80, 0xa2, 0x20, 0x60, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x60, 0x20, 0xe2, 0x80, 0x93, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x61, 0x69, + 0x72, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, 0x20, 0x61, + 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x0a, 0x20, 0xe2, 0x80, 0xa2, 0x20, 0x60, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x60, 0x20, 0xe2, 0x80, 0x93, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0xe2, 0x80, 0x99, 0x73, 0x20, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x0a, + 0x20, 0x20, 0x20, 0xe2, 0x80, 0xa2, 0x20, 0x60, 0x42, 0x49, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x60, + 0x20, 0x20, 0x20, 0x28, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0xe2, 0x80, 0xa2, 0x20, 0x60, 0x42, 0x59, 0x42, 0x49, 0x54, 0x60, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0xe2, + 0x80, 0xa2, 0x20, 0x60, 0x4f, 0x4b, 0x58, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0xe2, 0x80, 0xa2, + 0x20, 0x60, 0x43, 0x4f, 0x49, 0x4e, 0x42, 0x41, 0x53, 0x45, 0x60, 0x20, 0x20, 0x28, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0xe2, 0x80, 0xa2, 0x20, 0x60, + 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x60, 0x20, 0x20, 0x28, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x29, 0x20, 0xe2, 0x80, 0x93, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x2a, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x6e, 0x2a, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x73, 0x20, 0x28, 0x3c, 0x3d, 0x20, + 0x35, 0x20, 0x73, 0x20, 0x6f, 0x6c, 0x64, 0x29, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x6e, 0x20, + 0x61, 0x62, 0x6f, 0x76, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x0a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, + 0x20, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x68, 0x6f, 0x73, 0x65, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x0a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x73, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, 0x69, + 0x63, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, + 0x20, 0x2a, 0x2a, 0x35, 0x20, 0x73, 0x2a, 0x2a, 0x2e, 0x0a, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x50, 0x75, 0x6c, 0x6c, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x42, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x42, 0x54, 0x43, 0x20, 0x2f, 0x20, 0x55, 0x53, 0x44, 0x54, + 0x0a, 0x20, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x75, 0x72, 0x67, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x49, 0x4e, 0x41, 0x4e, 0x43, + 0x45, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x22, 0x3a, 0x20, 0x22, 0x42, 0x54, 0x43, 0x55, 0x53, 0x44, 0x54, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x7d, 0x0a, 0x20, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x20, 0x5f, 0x2a, 0x2a, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x2d, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x42, 0x54, + 0x43, 0x20, 0x2f, 0x20, 0x55, 0x53, 0x44, 0x54, 0x0a, 0x20, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x53, 0x75, 0x72, 0x67, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x22, 0x2c, 0x20, 0x20, 0x20, 0x2f, + 0x2f, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x20, 0xe2, 0x80, 0x94, 0x20, 0x57, 0x45, + 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x54, 0x43, 0x55, 0x53, 0x44, 0x54, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x7d, 0x0a, 0x20, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x20, 0x5f, 0x2a, + 0x2a, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x2a, 0x2a, 0x5f, 0x0a, 0x20, 0xe2, 0x80, 0xa2, 0x20, 0x53, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2d, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x20, 0x28, 0x63, 0x61, 0x73, 0x65, + 0x2d, 0x69, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x20, 0x70, 0x75, + 0x6e, 0x63, 0x74, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x29, 0x2e, 0x0a, 0x20, 0xe2, 0x80, 0xa2, 0x20, 0x49, 0x66, 0x20, 0x61, 0x20, 0x76, 0x65, + 0x6e, 0x75, 0x65, 0xe2, 0x80, 0x99, 0x73, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x20, 0x28, 0x3e, 0x20, 0x35, 0x20, 0x73, 0x29, 0x20, 0x69, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x0a, 0x20, 0x20, 0x20, + 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x69, 0x66, + 0x20, 0x2a, 0x2a, 0x6e, 0x6f, 0x2a, 0x2a, 0x20, 0x66, 0x72, 0x65, 0x73, 0x68, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2e, 0x0a, 0x20, 0xe2, 0x80, + 0xa2, 0x20, 0x54, 0x68, 0x65, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x2d, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x20, + 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x48, 0x79, 0x70, 0x65, 0x72, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x20, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x20, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x33, 0x20, 0x2f, 0x20, 0x32, 0x20, 0x2f, 0x20, 0x32, 0x20, + 0x2f, 0x20, 0x31, 0x20, 0x2f, 0x20, 0x31, 0x20, 0x2f, 0x20, 0x31, 0x20, 0x2f, 0x20, 0x31, 0x20, + 0x2f, 0x20, 0x31, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x73, 0x20, 0x28, + 0x77, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x66, 0x6f, + 0x75, 0x72, 0x29, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x41, 0x01, 0x12, 0x04, + 0xcf, 0x0c, 0x0a, 0x1e, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x12, 0x06, + 0xd0, 0x0c, 0x04, 0xd6, 0x0c, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, + 0x01, 0x12, 0x04, 0xd0, 0x0c, 0x09, 0x0f, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x41, 0x04, + 0x00, 0x02, 0x00, 0x12, 0x04, 0xd1, 0x0c, 0x06, 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x41, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd1, 0x0c, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xd1, 0x0c, 0x12, 0x13, 0x0a, + 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xd2, 0x0c, 0x06, + 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, + 0xd2, 0x0c, 0x06, 0x0d, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x02, 0x01, + 0x02, 0x12, 0x04, 0xd2, 0x0c, 0x12, 0x13, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x41, 0x04, + 0x00, 0x02, 0x02, 0x12, 0x04, 0xd3, 0x0c, 0x06, 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x41, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xd3, 0x0c, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xd3, 0x0c, 0x12, 0x13, 0x0a, + 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xd4, 0x0c, 0x06, + 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, + 0xd4, 0x0c, 0x06, 0x0b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x02, 0x03, + 0x02, 0x12, 0x04, 0xd4, 0x0c, 0x12, 0x13, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x41, 0x04, + 0x00, 0x02, 0x04, 0x12, 0x04, 0xd5, 0x0c, 0x06, 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x41, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0xd5, 0x0c, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x41, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, 0xd5, 0x0c, 0x12, 0x13, 0x0a, + 0x72, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x41, 0x02, 0x00, 0x12, 0x04, 0xd9, 0x0c, 0x04, 0x1f, 0x1a, + 0x62, 0x20, 0x44, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x69, 0x63, 0x69, + 0x6e, 0x67, 0x2e, 0x0a, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x20, 0x57, 0x45, + 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x20, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x41, 0x02, 0x00, 0x04, 0x12, 0x04, + 0xd9, 0x0c, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x41, 0x02, 0x00, 0x06, 0x12, + 0x04, 0xd9, 0x0c, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x41, 0x02, 0x00, 0x01, + 0x12, 0x04, 0xd9, 0x0c, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x41, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xd9, 0x0c, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x41, 0x02, + 0x01, 0x12, 0x04, 0xda, 0x0c, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x41, 0x02, + 0x01, 0x04, 0x12, 0x04, 0xda, 0x0c, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x41, + 0x02, 0x01, 0x05, 0x12, 0x04, 0xda, 0x0c, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x41, 0x02, 0x01, 0x01, 0x12, 0x04, 0xda, 0x0c, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x41, 0x02, 0x01, 0x03, 0x12, 0x04, 0xda, 0x0c, 0x1d, 0x1e, 0x0a, 0x70, 0x0a, 0x04, 0x04, + 0x00, 0x03, 0x42, 0x12, 0x06, 0xde, 0x0c, 0x02, 0xab, 0x0d, 0x03, 0x1a, 0x60, 0x2f, 0x20, 0x52, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, + 0x75, 0x6c, 0x61, 0x72, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, + 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x61, + 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x00, 0x03, 0x42, 0x01, 0x12, 0x04, 0xde, 0x0c, 0x0a, 0x0e, 0x0a, 0x3c, 0x0a, 0x05, + 0x04, 0x00, 0x03, 0x42, 0x09, 0x12, 0x04, 0xe0, 0x0c, 0x04, 0x10, 0x1a, 0x2d, 0x20, 0x52, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x20, 0x6f, 0x62, 0x73, 0x6f, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, + 0x61, 0x73, 0x6b, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x2f, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x42, 0x09, 0x00, 0x12, 0x04, 0xe0, 0x0c, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x09, 0x00, 0x01, 0x12, 0x04, 0xe0, 0x0c, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x09, 0x00, 0x02, 0x12, 0x04, 0xe0, 0x0c, 0x0d, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x03, 0x42, 0x0a, 0x12, 0x04, 0xe1, 0x0c, 0x04, 0x22, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x42, 0x0a, 0x00, 0x12, 0x04, 0xe1, 0x0c, 0x0d, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x03, 0x42, 0x09, 0x12, 0x04, 0xe2, 0x0c, 0x04, 0x10, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x42, 0x09, 0x01, 0x12, 0x04, 0xe2, 0x0c, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x09, 0x01, 0x01, 0x12, 0x04, 0xe2, 0x0c, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x09, 0x01, 0x02, 0x12, 0x04, 0xe2, 0x0c, 0x0d, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x03, 0x42, 0x0a, 0x12, 0x04, 0xe3, 0x0c, 0x04, 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x42, 0x0a, 0x01, 0x12, 0x04, 0xe3, 0x0c, 0x0d, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x03, 0x42, 0x09, 0x12, 0x04, 0xe4, 0x0c, 0x04, 0x10, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x42, 0x09, 0x02, 0x12, 0x04, 0xe4, 0x0c, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x09, 0x02, 0x01, 0x12, 0x04, 0xe4, 0x0c, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x09, 0x02, 0x02, 0x12, 0x04, 0xe4, 0x0c, 0x0d, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x03, 0x42, 0x0a, 0x12, 0x04, 0xe5, 0x0c, 0x04, 0x1d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x42, 0x0a, 0x02, 0x12, 0x04, 0xe5, 0x0c, 0x0d, 0x1c, 0x0a, 0x10, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x42, 0x08, 0x00, 0x12, 0x06, 0xe7, 0x0c, 0x04, 0xaa, 0x0d, 0x05, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x08, 0x00, 0x01, 0x12, 0x04, 0xe7, 0x0c, 0x0a, 0x0e, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x00, 0x12, 0x04, 0xe8, 0x0c, 0x06, 0x1d, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x00, 0x06, 0x12, 0x04, 0xe8, 0x0c, 0x06, 0x0e, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe8, 0x0c, 0x0f, 0x18, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe8, 0x0c, 0x1b, + 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x01, 0x12, 0x04, 0xe9, 0x0c, 0x06, + 0x28, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x01, 0x06, 0x12, 0x04, 0xe9, 0x0c, + 0x06, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe9, + 0x0c, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xe9, 0x0c, 0x26, 0x27, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x02, 0x12, 0x04, + 0xea, 0x0c, 0x06, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x02, 0x06, 0x12, + 0x04, 0xea, 0x0c, 0x06, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xea, 0x0c, 0x11, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x02, + 0x03, 0x12, 0x04, 0xea, 0x0c, 0x1f, 0x20, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x03, 0x12, 0x04, 0xeb, 0x0c, 0x06, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x03, 0x06, 0x12, 0x04, 0xeb, 0x0c, 0x06, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x03, 0x01, 0x12, 0x04, 0xeb, 0x0c, 0x0f, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x03, 0x03, 0x12, 0x04, 0xeb, 0x0c, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x04, 0x12, 0x04, 0xec, 0x0c, 0x06, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x04, 0x06, 0x12, 0x04, 0xec, 0x0c, 0x06, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x04, 0x01, 0x12, 0x04, 0xec, 0x0c, 0x14, 0x22, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x04, 0x03, 0x12, 0x04, 0xec, 0x0c, 0x25, 0x26, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x05, 0x12, 0x04, 0xed, 0x0c, 0x06, 0x21, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x05, 0x06, 0x12, 0x04, 0xed, 0x0c, 0x06, 0x10, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x05, 0x01, 0x12, 0x04, 0xed, 0x0c, 0x11, 0x1c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x05, 0x03, 0x12, 0x04, 0xed, 0x0c, 0x1f, 0x20, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x06, 0x12, 0x04, 0xee, 0x0c, 0x06, 0x25, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x06, 0x06, 0x12, 0x04, 0xee, 0x0c, 0x06, + 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x06, 0x01, 0x12, 0x04, 0xee, 0x0c, + 0x13, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x06, 0x03, 0x12, 0x04, 0xee, + 0x0c, 0x23, 0x24, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x07, 0x12, 0x04, 0xef, + 0x0c, 0x06, 0x2f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x07, 0x06, 0x12, 0x04, + 0xef, 0x0c, 0x06, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x07, 0x01, 0x12, + 0x04, 0xef, 0x0c, 0x17, 0x2a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x07, 0x03, + 0x12, 0x04, 0xef, 0x0c, 0x2d, 0x2e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x08, + 0x12, 0x04, 0xf0, 0x0c, 0x06, 0x34, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x08, + 0x06, 0x12, 0x04, 0xf0, 0x0c, 0x06, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x08, 0x01, 0x12, 0x04, 0xf0, 0x0c, 0x19, 0x2e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x08, 0x03, 0x12, 0x04, 0xf0, 0x0c, 0x31, 0x33, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x09, 0x12, 0x04, 0xf1, 0x0c, 0x06, 0x2c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x09, 0x06, 0x12, 0x04, 0xf1, 0x0c, 0x06, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x09, 0x01, 0x12, 0x04, 0xf1, 0x0c, 0x16, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x09, 0x03, 0x12, 0x04, 0xf1, 0x0c, 0x29, 0x2b, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x0a, 0x12, 0x04, 0xf2, 0x0c, 0x06, 0x20, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x0a, 0x06, 0x12, 0x04, 0xf2, 0x0c, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0a, 0x01, 0x12, 0x04, 0xf2, 0x0c, 0x10, 0x1a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0a, 0x03, 0x12, 0x04, 0xf2, 0x0c, 0x1d, 0x1f, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0b, 0x12, 0x04, 0xf3, 0x0c, 0x06, 0x1c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0b, 0x06, 0x12, 0x04, 0xf3, 0x0c, 0x06, 0x0d, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0b, 0x01, 0x12, 0x04, 0xf3, 0x0c, 0x0e, + 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0b, 0x03, 0x12, 0x04, 0xf3, 0x0c, + 0x19, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0c, 0x12, 0x04, 0xf4, 0x0c, + 0x06, 0x2f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0c, 0x06, 0x12, 0x04, 0xf4, + 0x0c, 0x06, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0c, 0x01, 0x12, 0x04, + 0xf4, 0x0c, 0x17, 0x29, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0c, 0x03, 0x12, + 0x04, 0xf4, 0x0c, 0x2c, 0x2e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0d, 0x12, + 0x04, 0xf5, 0x0c, 0x06, 0x2b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0d, 0x06, + 0x12, 0x04, 0xf5, 0x0c, 0x06, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0d, + 0x01, 0x12, 0x04, 0xf5, 0x0c, 0x15, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x0d, 0x03, 0x12, 0x04, 0xf5, 0x0c, 0x28, 0x2a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x0e, 0x12, 0x04, 0xf6, 0x0c, 0x06, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x0e, 0x06, 0x12, 0x04, 0xf6, 0x0c, 0x06, 0x0d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x0e, 0x01, 0x12, 0x04, 0xf6, 0x0c, 0x0e, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x0e, 0x03, 0x12, 0x04, 0xf6, 0x0c, 0x19, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x0f, 0x12, 0x04, 0xf7, 0x0c, 0x06, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x0f, 0x06, 0x12, 0x04, 0xf7, 0x0c, 0x06, 0x12, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x0f, 0x01, 0x12, 0x04, 0xf7, 0x0c, 0x13, 0x20, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x0f, 0x03, 0x12, 0x04, 0xf7, 0x0c, 0x23, 0x25, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x10, 0x12, 0x04, 0xf8, 0x0c, 0x06, 0x1e, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x10, 0x06, 0x12, 0x04, 0xf8, 0x0c, 0x06, 0x0e, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x10, 0x01, 0x12, 0x04, 0xf8, 0x0c, 0x0f, 0x18, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x10, 0x03, 0x12, 0x04, 0xf8, 0x0c, 0x1b, + 0x1d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x11, 0x12, 0x04, 0xf9, 0x0c, 0x06, + 0x29, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x11, 0x06, 0x12, 0x04, 0xf9, 0x0c, + 0x06, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x11, 0x01, 0x12, 0x04, 0xf9, + 0x0c, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x11, 0x03, 0x12, 0x04, + 0xf9, 0x0c, 0x26, 0x28, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x12, 0x12, 0x04, + 0xfa, 0x0c, 0x06, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x12, 0x06, 0x12, + 0x04, 0xfa, 0x0c, 0x06, 0x0d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x12, 0x01, + 0x12, 0x04, 0xfa, 0x0c, 0x0e, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x12, + 0x03, 0x12, 0x04, 0xfa, 0x0c, 0x19, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x13, 0x12, 0x04, 0xfb, 0x0c, 0x06, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x13, 0x06, 0x12, 0x04, 0xfb, 0x0c, 0x06, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x13, 0x01, 0x12, 0x04, 0xfb, 0x0c, 0x16, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x13, 0x03, 0x12, 0x04, 0xfb, 0x0c, 0x2a, 0x2c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x14, 0x12, 0x04, 0xfc, 0x0c, 0x06, 0x36, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x14, 0x06, 0x12, 0x04, 0xfc, 0x0c, 0x06, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x14, 0x01, 0x12, 0x04, 0xfc, 0x0c, 0x1a, 0x30, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x14, 0x03, 0x12, 0x04, 0xfc, 0x0c, 0x33, 0x35, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x15, 0x12, 0x04, 0xfd, 0x0c, 0x06, 0x2d, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x15, 0x06, 0x12, 0x04, 0xfd, 0x0c, 0x06, 0x15, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x15, 0x01, 0x12, 0x04, 0xfd, 0x0c, 0x16, 0x27, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x15, 0x03, 0x12, 0x04, 0xfd, 0x0c, 0x2a, 0x2c, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x16, 0x12, 0x04, 0xfe, 0x0c, 0x06, 0x2b, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x16, 0x06, 0x12, 0x04, 0xfe, 0x0c, 0x06, + 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x16, 0x01, 0x12, 0x04, 0xfe, 0x0c, + 0x15, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x16, 0x03, 0x12, 0x04, 0xfe, + 0x0c, 0x28, 0x2a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x17, 0x12, 0x04, 0xff, + 0x0c, 0x06, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x17, 0x06, 0x12, 0x04, + 0xff, 0x0c, 0x06, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x17, 0x01, 0x12, + 0x04, 0xff, 0x0c, 0x11, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x17, 0x03, + 0x12, 0x04, 0xff, 0x0c, 0x1f, 0x21, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x18, + 0x12, 0x04, 0x80, 0x0d, 0x06, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x18, + 0x06, 0x12, 0x04, 0x80, 0x0d, 0x06, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x18, 0x01, 0x12, 0x04, 0x80, 0x0d, 0x16, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x18, 0x03, 0x12, 0x04, 0x80, 0x0d, 0x2a, 0x2c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x19, 0x12, 0x04, 0x81, 0x0d, 0x06, 0x30, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x19, 0x06, 0x12, 0x04, 0x81, 0x0d, 0x06, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x19, 0x01, 0x12, 0x04, 0x81, 0x0d, 0x17, 0x2a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x19, 0x03, 0x12, 0x04, 0x81, 0x0d, 0x2d, 0x2f, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x1a, 0x12, 0x04, 0x82, 0x0d, 0x06, 0x32, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x1a, 0x06, 0x12, 0x04, 0x82, 0x0d, 0x06, 0x17, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1a, 0x01, 0x12, 0x04, 0x82, 0x0d, 0x18, 0x2c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1a, 0x03, 0x12, 0x04, 0x82, 0x0d, 0x2f, 0x31, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1b, 0x12, 0x04, 0x83, 0x0d, 0x06, 0x3e, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1b, 0x06, 0x12, 0x04, 0x83, 0x0d, 0x06, 0x1d, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1b, 0x01, 0x12, 0x04, 0x83, 0x0d, 0x1e, + 0x38, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1b, 0x03, 0x12, 0x04, 0x83, 0x0d, + 0x3b, 0x3d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1c, 0x12, 0x04, 0x84, 0x0d, + 0x06, 0x42, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1c, 0x06, 0x12, 0x04, 0x84, + 0x0d, 0x06, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1c, 0x01, 0x12, 0x04, + 0x84, 0x0d, 0x20, 0x3c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1c, 0x03, 0x12, + 0x04, 0x84, 0x0d, 0x3f, 0x41, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1d, 0x12, + 0x04, 0x85, 0x0d, 0x06, 0x46, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1d, 0x06, + 0x12, 0x04, 0x85, 0x0d, 0x06, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1d, + 0x01, 0x12, 0x04, 0x85, 0x0d, 0x22, 0x40, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x1d, 0x03, 0x12, 0x04, 0x85, 0x0d, 0x43, 0x45, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x1e, 0x12, 0x04, 0x86, 0x0d, 0x06, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x1e, 0x06, 0x12, 0x04, 0x86, 0x0d, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x1e, 0x01, 0x12, 0x04, 0x86, 0x0d, 0x10, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x1e, 0x03, 0x12, 0x04, 0x86, 0x0d, 0x1d, 0x1f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x1f, 0x12, 0x04, 0x87, 0x0d, 0x06, 0x33, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x1f, 0x06, 0x12, 0x04, 0x87, 0x0d, 0x06, 0x18, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x1f, 0x01, 0x12, 0x04, 0x87, 0x0d, 0x19, 0x2d, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x1f, 0x03, 0x12, 0x04, 0x87, 0x0d, 0x30, 0x32, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x20, 0x12, 0x04, 0x88, 0x0d, 0x06, 0x31, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x20, 0x06, 0x12, 0x04, 0x88, 0x0d, 0x06, 0x17, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x20, 0x01, 0x12, 0x04, 0x88, 0x0d, 0x18, 0x2b, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x20, 0x03, 0x12, 0x04, 0x88, 0x0d, 0x2e, + 0x30, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x21, 0x12, 0x04, 0x89, 0x0d, 0x06, + 0x45, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x21, 0x06, 0x12, 0x04, 0x89, 0x0d, + 0x06, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x21, 0x01, 0x12, 0x04, 0x89, + 0x0d, 0x21, 0x3f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x21, 0x03, 0x12, 0x04, + 0x89, 0x0d, 0x42, 0x44, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x22, 0x12, 0x04, + 0x8a, 0x0d, 0x06, 0x3a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x22, 0x06, 0x12, + 0x04, 0x8a, 0x0d, 0x06, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x22, 0x01, + 0x12, 0x04, 0x8a, 0x0d, 0x1c, 0x34, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x22, + 0x03, 0x12, 0x04, 0x8a, 0x0d, 0x37, 0x39, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x23, 0x12, 0x04, 0x8b, 0x0d, 0x06, 0x29, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x23, 0x06, 0x12, 0x04, 0x8b, 0x0d, 0x06, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x23, 0x01, 0x12, 0x04, 0x8b, 0x0d, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x23, 0x03, 0x12, 0x04, 0x8b, 0x0d, 0x26, 0x28, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x24, 0x12, 0x04, 0x8c, 0x0d, 0x06, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x24, 0x06, 0x12, 0x04, 0x8c, 0x0d, 0x06, 0x0d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x24, 0x01, 0x12, 0x04, 0x8c, 0x0d, 0x0e, 0x16, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x24, 0x03, 0x12, 0x04, 0x8c, 0x0d, 0x19, 0x1b, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x25, 0x12, 0x04, 0x8d, 0x0d, 0x06, 0x35, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x25, 0x06, 0x12, 0x04, 0x8d, 0x0d, 0x06, 0x19, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x25, 0x01, 0x12, 0x04, 0x8d, 0x0d, 0x1a, 0x2f, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x25, 0x03, 0x12, 0x04, 0x8d, 0x0d, 0x32, 0x34, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x26, 0x12, 0x04, 0x8e, 0x0d, 0x06, 0x1e, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x26, 0x06, 0x12, 0x04, 0x8e, 0x0d, 0x06, + 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x26, 0x01, 0x12, 0x04, 0x8e, 0x0d, + 0x0f, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x26, 0x03, 0x12, 0x04, 0x8e, + 0x0d, 0x1b, 0x1d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x27, 0x12, 0x04, 0x8f, + 0x0d, 0x06, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x27, 0x06, 0x12, 0x04, + 0x8f, 0x0d, 0x06, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x27, 0x01, 0x12, + 0x04, 0x8f, 0x0d, 0x0f, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x27, 0x03, + 0x12, 0x04, 0x8f, 0x0d, 0x1b, 0x1d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x28, + 0x12, 0x04, 0x90, 0x0d, 0x06, 0x2a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x28, + 0x06, 0x12, 0x04, 0x90, 0x0d, 0x06, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x28, 0x01, 0x12, 0x04, 0x90, 0x0d, 0x15, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x28, 0x03, 0x12, 0x04, 0x90, 0x0d, 0x27, 0x29, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x29, 0x12, 0x04, 0x91, 0x0d, 0x06, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x29, 0x06, 0x12, 0x04, 0x91, 0x0d, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x29, 0x01, 0x12, 0x04, 0x91, 0x0d, 0x10, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x29, 0x03, 0x12, 0x04, 0x91, 0x0d, 0x1d, 0x1f, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x2a, 0x12, 0x04, 0x92, 0x0d, 0x06, 0x20, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x2a, 0x06, 0x12, 0x04, 0x92, 0x0d, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2a, 0x01, 0x12, 0x04, 0x92, 0x0d, 0x10, 0x1a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2a, 0x03, 0x12, 0x04, 0x92, 0x0d, 0x1d, 0x1f, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2b, 0x12, 0x04, 0x93, 0x0d, 0x06, 0x24, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2b, 0x06, 0x12, 0x04, 0x93, 0x0d, 0x06, 0x11, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2b, 0x01, 0x12, 0x04, 0x93, 0x0d, 0x12, + 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2b, 0x03, 0x12, 0x04, 0x93, 0x0d, + 0x21, 0x23, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2c, 0x12, 0x04, 0x94, 0x0d, + 0x06, 0x36, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2c, 0x06, 0x12, 0x04, 0x94, + 0x0d, 0x06, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2c, 0x01, 0x12, 0x04, + 0x94, 0x0d, 0x1a, 0x30, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2c, 0x03, 0x12, + 0x04, 0x94, 0x0d, 0x33, 0x35, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2d, 0x12, + 0x04, 0x95, 0x0d, 0x06, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2d, 0x06, + 0x12, 0x04, 0x95, 0x0d, 0x06, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2d, + 0x01, 0x12, 0x04, 0x95, 0x0d, 0x13, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x2d, 0x03, 0x12, 0x04, 0x95, 0x0d, 0x24, 0x26, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x2e, 0x12, 0x04, 0x96, 0x0d, 0x06, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x2e, 0x06, 0x12, 0x04, 0x96, 0x0d, 0x06, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x2e, 0x01, 0x12, 0x04, 0x96, 0x0d, 0x16, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x2e, 0x03, 0x12, 0x04, 0x96, 0x0d, 0x2a, 0x2c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x2f, 0x12, 0x04, 0x97, 0x0d, 0x06, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x2f, 0x06, 0x12, 0x04, 0x97, 0x0d, 0x06, 0x12, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x2f, 0x01, 0x12, 0x04, 0x97, 0x0d, 0x13, 0x21, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x2f, 0x03, 0x12, 0x04, 0x97, 0x0d, 0x24, 0x26, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x30, 0x12, 0x04, 0x98, 0x0d, 0x06, 0x2f, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x30, 0x06, 0x12, 0x04, 0x98, 0x0d, 0x06, 0x16, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x30, 0x01, 0x12, 0x04, 0x98, 0x0d, 0x17, 0x29, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x30, 0x03, 0x12, 0x04, 0x98, 0x0d, 0x2c, + 0x2e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x31, 0x12, 0x04, 0x99, 0x0d, 0x06, + 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x31, 0x06, 0x12, 0x04, 0x99, 0x0d, + 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x31, 0x01, 0x12, 0x04, 0x99, + 0x0d, 0x10, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x31, 0x03, 0x12, 0x04, + 0x99, 0x0d, 0x1d, 0x1f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x32, 0x12, 0x04, + 0x9a, 0x0d, 0x06, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x32, 0x06, 0x12, + 0x04, 0x9a, 0x0d, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x32, 0x01, + 0x12, 0x04, 0x9a, 0x0d, 0x10, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x32, + 0x03, 0x12, 0x04, 0x9a, 0x0d, 0x1d, 0x1f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x33, 0x12, 0x04, 0x9b, 0x0d, 0x06, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x33, 0x06, 0x12, 0x04, 0x9b, 0x0d, 0x06, 0x0d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x33, 0x01, 0x12, 0x04, 0x9b, 0x0d, 0x0e, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x33, 0x03, 0x12, 0x04, 0x9b, 0x0d, 0x19, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x34, 0x12, 0x04, 0x9c, 0x0d, 0x06, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x34, 0x06, 0x12, 0x04, 0x9c, 0x0d, 0x06, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x34, 0x01, 0x12, 0x04, 0x9c, 0x0d, 0x16, 0x27, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x34, 0x03, 0x12, 0x04, 0x9c, 0x0d, 0x2a, 0x2c, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x35, 0x12, 0x04, 0x9d, 0x0d, 0x06, 0x2f, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x35, 0x06, 0x12, 0x04, 0x9d, 0x0d, 0x06, 0x16, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x35, 0x01, 0x12, 0x04, 0x9d, 0x0d, 0x17, 0x29, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x35, 0x03, 0x12, 0x04, 0x9d, 0x0d, 0x2c, 0x2e, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x36, 0x12, 0x04, 0x9e, 0x0d, 0x06, 0x45, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x36, 0x06, 0x12, 0x04, 0x9e, 0x0d, 0x06, + 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x36, 0x01, 0x12, 0x04, 0x9e, 0x0d, + 0x21, 0x3f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x36, 0x03, 0x12, 0x04, 0x9e, + 0x0d, 0x42, 0x44, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x37, 0x12, 0x04, 0x9f, + 0x0d, 0x06, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x37, 0x06, 0x12, 0x04, + 0x9f, 0x0d, 0x06, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x37, 0x01, 0x12, + 0x04, 0x9f, 0x0d, 0x12, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x37, 0x03, + 0x12, 0x04, 0x9f, 0x0d, 0x22, 0x24, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x38, + 0x12, 0x04, 0xa0, 0x0d, 0x06, 0x2a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x38, + 0x06, 0x12, 0x04, 0xa0, 0x0d, 0x06, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x38, 0x01, 0x12, 0x04, 0xa0, 0x0d, 0x15, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x38, 0x03, 0x12, 0x04, 0xa0, 0x0d, 0x27, 0x29, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x39, 0x12, 0x04, 0xa1, 0x0d, 0x06, 0x28, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x39, 0x06, 0x12, 0x04, 0xa1, 0x0d, 0x06, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x39, 0x01, 0x12, 0x04, 0xa1, 0x0d, 0x14, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x39, 0x03, 0x12, 0x04, 0xa1, 0x0d, 0x25, 0x27, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x3a, 0x12, 0x04, 0xa2, 0x0d, 0x06, 0x28, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x3a, 0x06, 0x12, 0x04, 0xa2, 0x0d, 0x06, 0x13, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3a, 0x01, 0x12, 0x04, 0xa2, 0x0d, 0x14, 0x22, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3a, 0x03, 0x12, 0x04, 0xa2, 0x0d, 0x25, 0x27, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3b, 0x12, 0x04, 0xa3, 0x0d, 0x06, 0x3c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3b, 0x06, 0x12, 0x04, 0xa3, 0x0d, 0x06, 0x1c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3b, 0x01, 0x12, 0x04, 0xa3, 0x0d, 0x1d, + 0x36, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3b, 0x03, 0x12, 0x04, 0xa3, 0x0d, + 0x39, 0x3b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3c, 0x12, 0x04, 0xa4, 0x0d, + 0x06, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3c, 0x06, 0x12, 0x04, 0xa4, + 0x0d, 0x06, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3c, 0x01, 0x12, 0x04, + 0xa4, 0x0d, 0x12, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3c, 0x03, 0x12, + 0x04, 0xa4, 0x0d, 0x22, 0x24, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3d, 0x12, + 0x04, 0xa5, 0x0d, 0x06, 0x40, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3d, 0x06, + 0x12, 0x04, 0xa5, 0x0d, 0x06, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3d, + 0x01, 0x12, 0x04, 0xa5, 0x0d, 0x1e, 0x3a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, + 0x3d, 0x03, 0x12, 0x04, 0xa5, 0x0d, 0x3d, 0x3f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x3e, 0x12, 0x04, 0xa6, 0x0d, 0x06, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, + 0x02, 0x3e, 0x06, 0x12, 0x04, 0xa6, 0x0d, 0x06, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x42, 0x02, 0x3e, 0x01, 0x12, 0x04, 0xa6, 0x0d, 0x13, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x42, 0x02, 0x3e, 0x03, 0x12, 0x04, 0xa6, 0x0d, 0x23, 0x25, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x3f, 0x12, 0x04, 0xa7, 0x0d, 0x06, 0x47, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x42, 0x02, 0x3f, 0x06, 0x12, 0x04, 0xa7, 0x0d, 0x06, 0x21, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x42, 0x02, 0x3f, 0x01, 0x12, 0x04, 0xa7, 0x0d, 0x22, 0x41, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x3f, 0x03, 0x12, 0x04, 0xa7, 0x0d, 0x44, 0x46, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x40, 0x12, 0x04, 0xa8, 0x0d, 0x06, 0x49, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x40, 0x06, 0x12, 0x04, 0xa8, 0x0d, 0x06, 0x22, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x40, 0x01, 0x12, 0x04, 0xa8, 0x0d, 0x23, 0x43, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x40, 0x03, 0x12, 0x04, 0xa8, 0x0d, 0x46, + 0x48, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x42, 0x02, 0x41, 0x12, 0x04, 0xa9, 0x0d, 0x06, + 0x37, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x41, 0x06, 0x12, 0x04, 0xa9, 0x0d, + 0x06, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x41, 0x01, 0x12, 0x04, 0xa9, + 0x0d, 0x1b, 0x31, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x42, 0x02, 0x41, 0x03, 0x12, 0x04, + 0xa9, 0x0d, 0x34, 0x36, 0x0a, 0x42, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xad, 0x0d, + 0x02, 0x1a, 0x1a, 0x34, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x66, + 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, + 0x04, 0x12, 0x04, 0xad, 0x0d, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x06, + 0x12, 0x04, 0xad, 0x0d, 0x0b, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, + 0x04, 0xad, 0x0d, 0x10, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xad, 0x0d, 0x18, 0x19, 0x0a, 0xf5, 0x01, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xb2, + 0x0d, 0x02, 0x2b, 0x1a, 0xe6, 0x01, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x6a, 0x6f, 0x62, 0x27, 0x73, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x6a, 0x6f, 0x62, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, + 0x72, 0x0a, 0x2f, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6a, 0x6f, 0x62, 0x27, 0x73, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6d, 0x6f, 0x72, + 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x0a, + 0x2f, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, + 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x30, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x02, 0x01, 0x04, 0x12, 0x04, 0xb2, 0x0d, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x02, 0x01, 0x05, 0x12, 0x04, 0xb2, 0x0d, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, + 0x02, 0x01, 0x01, 0x12, 0x04, 0xb2, 0x0d, 0x12, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, + 0x01, 0x03, 0x12, 0x04, 0xb2, 0x0d, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, + 0x08, 0x12, 0x04, 0xb2, 0x0d, 0x1d, 0x2a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x07, + 0x12, 0x04, 0xb2, 0x0d, 0x1e, 0x29, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, + 0xb3, 0x0d, 0x02, 0x24, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x04, 0x12, 0x04, 0xb3, + 0x0d, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x05, 0x12, 0x04, 0xb3, 0x0d, + 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xb3, 0x0d, 0x12, + 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x03, 0x12, 0x04, 0xb3, 0x0d, 0x22, 0x23, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xb4, 0x0d, 0x02, 0x22, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x00, 0x02, 0x03, 0x04, 0x12, 0x04, 0xb4, 0x0d, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x00, 0x02, 0x03, 0x05, 0x12, 0x04, 0xb4, 0x0d, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0xb4, 0x0d, 0x12, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x02, 0x03, 0x03, 0x12, 0x04, 0xb4, 0x0d, 0x20, 0x21, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x00, + 0x02, 0x04, 0x12, 0x04, 0xb5, 0x0d, 0x02, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x04, + 0x04, 0x12, 0x04, 0xb5, 0x0d, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x04, 0x05, + 0x12, 0x04, 0xb5, 0x0d, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, + 0x04, 0xb5, 0x0d, 0x12, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x04, 0x03, 0x12, 0x04, + 0xb5, 0x0d, 0x21, 0x22, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x05, 0x12, 0x04, 0xb6, 0x0d, + 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x05, 0x04, 0x12, 0x04, 0xb6, 0x0d, 0x02, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x05, 0x05, 0x12, 0x04, 0xb6, 0x0d, 0x0b, 0x11, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x05, 0x01, 0x12, 0x04, 0xb6, 0x0d, 0x12, 0x16, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x05, 0x03, 0x12, 0x04, 0xb6, 0x0d, 0x19, 0x1a, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x00, 0x02, 0x06, 0x12, 0x04, 0xb7, 0x0d, 0x02, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x02, 0x06, 0x04, 0x12, 0x04, 0xb7, 0x0d, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x02, 0x06, 0x05, 0x12, 0x04, 0xb7, 0x0d, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, + 0x02, 0x06, 0x01, 0x12, 0x04, 0xb7, 0x0d, 0x12, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, + 0x06, 0x03, 0x12, 0x04, 0xb7, 0x0d, 0x1a, 0x1b, +]; +include!("oracle_job.serde.rs"); +// @@protoc_insertion_point(module) diff --git a/programs/switchboard-on-demand/src/client/oracle_job.serde.rs b/programs/switchboard-on-demand/src/client/oracle_job.serde.rs new file mode 100644 index 0000000000..d16628e918 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/oracle_job.serde.rs @@ -0,0 +1,12677 @@ +// @generated +impl serde::Serialize for OracleJob { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + if self.weight.is_some() { + len += 1; + } + if self.min_responses.is_some() { + len += 1; + } + if self.min_samples.is_some() { + len += 1; + } + if self.max_variance.is_some() { + len += 1; + } + if self.name.is_some() { + len += 1; + } + if self.queue.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + if let Some(v) = self.weight.as_ref() { + struct_ser.serialize_field("weight", v)?; + } + if let Some(v) = self.min_responses.as_ref() { + struct_ser.serialize_field("minResponses", v)?; + } + if let Some(v) = self.min_samples.as_ref() { + struct_ser.serialize_field("minSamples", v)?; + } + if let Some(v) = self.max_variance.as_ref() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("maxVariance", ToString::to_string(&v).as_str())?; + } + if let Some(v) = self.name.as_ref() { + struct_ser.serialize_field("name", v)?; + } + if let Some(v) = self.queue.as_ref() { + struct_ser.serialize_field("queue", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for OracleJob { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + "weight", + "min_responses", + "minResponses", + "min_samples", + "minSamples", + "max_variance", + "maxVariance", + "name", + "queue", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + Weight, + MinResponses, + MinSamples, + MaxVariance, + Name, + Queue, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + "weight" => Ok(GeneratedField::Weight), + "minResponses" | "min_responses" => Ok(GeneratedField::MinResponses), + "minSamples" | "min_samples" => Ok(GeneratedField::MinSamples), + "maxVariance" | "max_variance" => Ok(GeneratedField::MaxVariance), + "name" => Ok(GeneratedField::Name), + "queue" => Ok(GeneratedField::Queue), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = OracleJob; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + let mut weight__ = None; + let mut min_responses__ = None; + let mut min_samples__ = None; + let mut max_variance__ = None; + let mut name__ = None; + let mut queue__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + GeneratedField::Weight => { + if weight__.is_some() { + return Err(serde::de::Error::duplicate_field("weight")); + } + weight__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::MinResponses => { + if min_responses__.is_some() { + return Err(serde::de::Error::duplicate_field("minResponses")); + } + min_responses__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::MinSamples => { + if min_samples__.is_some() { + return Err(serde::de::Error::duplicate_field("minSamples")); + } + min_samples__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::MaxVariance => { + if max_variance__.is_some() { + return Err(serde::de::Error::duplicate_field("maxVariance")); + } + max_variance__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Name => { + if name__.is_some() { + return Err(serde::de::Error::duplicate_field("name")); + } + name__ = map_.next_value()?; + } + GeneratedField::Queue => { + if queue__.is_some() { + return Err(serde::de::Error::duplicate_field("queue")); + } + queue__ = map_.next_value()?; + } + } + } + Ok(OracleJob { + tasks: tasks__.unwrap_or_default(), + weight: weight__, + min_responses: min_responses__, + min_samples: min_samples__, + max_variance: max_variance__, + name: name__, + queue: queue__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::AddTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.addition.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.AddTask", len)?; + if let Some(v) = self.addition.as_ref() { + match v { + oracle_job::add_task::Addition::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::add_task::Addition::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::add_task::Addition::Job(v) => { + struct_ser.serialize_field("job", v)?; + } + oracle_job::add_task::Addition::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::AddTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "job", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Job, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "job" => Ok(GeneratedField::Job), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::AddTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.AddTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut addition__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if addition__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + addition__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::add_task::Addition::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if addition__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + addition__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::add_task::Addition::AggregatorPubkey); + } + GeneratedField::Job => { + if addition__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + addition__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::add_task::Addition::Job) +; + } + GeneratedField::Big => { + if addition__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + addition__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::add_task::Addition::Big); + } + } + } + Ok(oracle_job::AddTask { + addition: addition__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.AddTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::AftermathTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pool_address.is_some() { + len += 1; + } + if self.in_amount.is_some() { + len += 1; + } + if self.in_coin_type.is_some() { + len += 1; + } + if self.out_coin_type.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.AftermathTask", len)?; + if let Some(v) = self.pool_address.as_ref() { + struct_ser.serialize_field("poolAddress", v)?; + } + if let Some(v) = self.in_amount.as_ref() { + struct_ser.serialize_field("inAmount", v)?; + } + if let Some(v) = self.in_coin_type.as_ref() { + struct_ser.serialize_field("inCoinType", v)?; + } + if let Some(v) = self.out_coin_type.as_ref() { + struct_ser.serialize_field("outCoinType", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::AftermathTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pool_address", + "poolAddress", + "in_amount", + "inAmount", + "in_coin_type", + "inCoinType", + "out_coin_type", + "outCoinType", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PoolAddress, + InAmount, + InCoinType, + OutCoinType, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "poolAddress" | "pool_address" => Ok(GeneratedField::PoolAddress), + "inAmount" | "in_amount" => Ok(GeneratedField::InAmount), + "inCoinType" | "in_coin_type" => Ok(GeneratedField::InCoinType), + "outCoinType" | "out_coin_type" => Ok(GeneratedField::OutCoinType), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::AftermathTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.AftermathTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pool_address__ = None; + let mut in_amount__ = None; + let mut in_coin_type__ = None; + let mut out_coin_type__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("poolAddress")); + } + pool_address__ = map_.next_value()?; + } + GeneratedField::InAmount => { + if in_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("inAmount")); + } + in_amount__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::InCoinType => { + if in_coin_type__.is_some() { + return Err(serde::de::Error::duplicate_field("inCoinType")); + } + in_coin_type__ = map_.next_value()?; + } + GeneratedField::OutCoinType => { + if out_coin_type__.is_some() { + return Err(serde::de::Error::duplicate_field("outCoinType")); + } + out_coin_type__ = map_.next_value()?; + } + } + } + Ok(oracle_job::AftermathTask { + pool_address: pool_address__, + in_amount: in_amount__, + in_coin_type: in_coin_type__, + out_coin_type: out_coin_type__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.AftermathTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::AnchorFetchTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.program_id.is_some() { + len += 1; + } + if self.account_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.AnchorFetchTask", len)?; + if let Some(v) = self.program_id.as_ref() { + struct_ser.serialize_field("programId", v)?; + } + if let Some(v) = self.account_address.as_ref() { + struct_ser.serialize_field("accountAddress", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::AnchorFetchTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "program_id", + "programId", + "account_address", + "accountAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + ProgramId, + AccountAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "programId" | "program_id" => Ok(GeneratedField::ProgramId), + "accountAddress" | "account_address" => Ok(GeneratedField::AccountAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::AnchorFetchTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.AnchorFetchTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut program_id__ = None; + let mut account_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::ProgramId => { + if program_id__.is_some() { + return Err(serde::de::Error::duplicate_field("programId")); + } + program_id__ = map_.next_value()?; + } + GeneratedField::AccountAddress => { + if account_address__.is_some() { + return Err(serde::de::Error::duplicate_field("accountAddress")); + } + account_address__ = map_.next_value()?; + } + } + } + Ok(oracle_job::AnchorFetchTask { + program_id: program_id__, + account_address: account_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.AnchorFetchTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::BitFluxTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.provider.is_some() { + len += 1; + } + if self.pool_address.is_some() { + len += 1; + } + if self.in_token.is_some() { + len += 1; + } + if self.out_token.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.BitFluxTask", len)?; + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + if let Some(v) = self.pool_address.as_ref() { + struct_ser.serialize_field("poolAddress", v)?; + } + if let Some(v) = self.in_token.as_ref() { + struct_ser.serialize_field("inToken", v)?; + } + if let Some(v) = self.out_token.as_ref() { + struct_ser.serialize_field("outToken", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::BitFluxTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "provider", + "pool_address", + "poolAddress", + "in_token", + "inToken", + "out_token", + "outToken", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Provider, + PoolAddress, + InToken, + OutToken, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "provider" => Ok(GeneratedField::Provider), + "poolAddress" | "pool_address" => Ok(GeneratedField::PoolAddress), + "inToken" | "in_token" => Ok(GeneratedField::InToken), + "outToken" | "out_token" => Ok(GeneratedField::OutToken), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::BitFluxTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.BitFluxTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut provider__ = None; + let mut pool_address__ = None; + let mut in_token__ = None; + let mut out_token__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + GeneratedField::PoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("poolAddress")); + } + pool_address__ = map_.next_value()?; + } + GeneratedField::InToken => { + if in_token__.is_some() { + return Err(serde::de::Error::duplicate_field("inToken")); + } + in_token__ = map_.next_value()?; + } + GeneratedField::OutToken => { + if out_token__.is_some() { + return Err(serde::de::Error::duplicate_field("outToken")); + } + out_token__ = map_.next_value()?; + } + } + } + Ok(oracle_job::BitFluxTask { + provider: provider__, + pool_address: pool_address__, + in_token: in_token__, + out_token: out_token__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.BitFluxTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::BoundTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.lower_bound.is_some() { + len += 1; + } + if self.lower_bound_value.is_some() { + len += 1; + } + if self.upper_bound.is_some() { + len += 1; + } + if self.upper_bound_value.is_some() { + len += 1; + } + if self.on_exceeds_upper_bound.is_some() { + len += 1; + } + if self.on_exceeds_upper_bound_value.is_some() { + len += 1; + } + if self.on_exceeds_lower_bound.is_some() { + len += 1; + } + if self.on_exceeds_lower_bound_value.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.BoundTask", len)?; + if let Some(v) = self.lower_bound.as_ref() { + struct_ser.serialize_field("lowerBound", v)?; + } + if let Some(v) = self.lower_bound_value.as_ref() { + struct_ser.serialize_field("lowerBoundValue", v)?; + } + if let Some(v) = self.upper_bound.as_ref() { + struct_ser.serialize_field("upperBound", v)?; + } + if let Some(v) = self.upper_bound_value.as_ref() { + struct_ser.serialize_field("upperBoundValue", v)?; + } + if let Some(v) = self.on_exceeds_upper_bound.as_ref() { + struct_ser.serialize_field("onExceedsUpperBound", v)?; + } + if let Some(v) = self.on_exceeds_upper_bound_value.as_ref() { + struct_ser.serialize_field("onExceedsUpperBoundValue", v)?; + } + if let Some(v) = self.on_exceeds_lower_bound.as_ref() { + struct_ser.serialize_field("onExceedsLowerBound", v)?; + } + if let Some(v) = self.on_exceeds_lower_bound_value.as_ref() { + struct_ser.serialize_field("onExceedsLowerBoundValue", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::BoundTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "lower_bound", + "lowerBound", + "lower_bound_value", + "lowerBoundValue", + "upper_bound", + "upperBound", + "upper_bound_value", + "upperBoundValue", + "on_exceeds_upper_bound", + "onExceedsUpperBound", + "on_exceeds_upper_bound_value", + "onExceedsUpperBoundValue", + "on_exceeds_lower_bound", + "onExceedsLowerBound", + "on_exceeds_lower_bound_value", + "onExceedsLowerBoundValue", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + LowerBound, + LowerBoundValue, + UpperBound, + UpperBoundValue, + OnExceedsUpperBound, + OnExceedsUpperBoundValue, + OnExceedsLowerBound, + OnExceedsLowerBoundValue, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "lowerBound" | "lower_bound" => Ok(GeneratedField::LowerBound), + "lowerBoundValue" | "lower_bound_value" => Ok(GeneratedField::LowerBoundValue), + "upperBound" | "upper_bound" => Ok(GeneratedField::UpperBound), + "upperBoundValue" | "upper_bound_value" => Ok(GeneratedField::UpperBoundValue), + "onExceedsUpperBound" | "on_exceeds_upper_bound" => Ok(GeneratedField::OnExceedsUpperBound), + "onExceedsUpperBoundValue" | "on_exceeds_upper_bound_value" => Ok(GeneratedField::OnExceedsUpperBoundValue), + "onExceedsLowerBound" | "on_exceeds_lower_bound" => Ok(GeneratedField::OnExceedsLowerBound), + "onExceedsLowerBoundValue" | "on_exceeds_lower_bound_value" => Ok(GeneratedField::OnExceedsLowerBoundValue), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::BoundTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.BoundTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut lower_bound__ = None; + let mut lower_bound_value__ = None; + let mut upper_bound__ = None; + let mut upper_bound_value__ = None; + let mut on_exceeds_upper_bound__ = None; + let mut on_exceeds_upper_bound_value__ = None; + let mut on_exceeds_lower_bound__ = None; + let mut on_exceeds_lower_bound_value__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::LowerBound => { + if lower_bound__.is_some() { + return Err(serde::de::Error::duplicate_field("lowerBound")); + } + lower_bound__ = map_.next_value()?; + } + GeneratedField::LowerBoundValue => { + if lower_bound_value__.is_some() { + return Err(serde::de::Error::duplicate_field("lowerBoundValue")); + } + lower_bound_value__ = map_.next_value()?; + } + GeneratedField::UpperBound => { + if upper_bound__.is_some() { + return Err(serde::de::Error::duplicate_field("upperBound")); + } + upper_bound__ = map_.next_value()?; + } + GeneratedField::UpperBoundValue => { + if upper_bound_value__.is_some() { + return Err(serde::de::Error::duplicate_field("upperBoundValue")); + } + upper_bound_value__ = map_.next_value()?; + } + GeneratedField::OnExceedsUpperBound => { + if on_exceeds_upper_bound__.is_some() { + return Err(serde::de::Error::duplicate_field("onExceedsUpperBound")); + } + on_exceeds_upper_bound__ = map_.next_value()?; + } + GeneratedField::OnExceedsUpperBoundValue => { + if on_exceeds_upper_bound_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onExceedsUpperBoundValue")); + } + on_exceeds_upper_bound_value__ = map_.next_value()?; + } + GeneratedField::OnExceedsLowerBound => { + if on_exceeds_lower_bound__.is_some() { + return Err(serde::de::Error::duplicate_field("onExceedsLowerBound")); + } + on_exceeds_lower_bound__ = map_.next_value()?; + } + GeneratedField::OnExceedsLowerBoundValue => { + if on_exceeds_lower_bound_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onExceedsLowerBoundValue")); + } + on_exceeds_lower_bound_value__ = map_.next_value()?; + } + } + } + Ok(oracle_job::BoundTask { + lower_bound: lower_bound__, + lower_bound_value: lower_bound_value__, + upper_bound: upper_bound__, + upper_bound_value: upper_bound_value__, + on_exceeds_upper_bound: on_exceeds_upper_bound__, + on_exceeds_upper_bound_value: on_exceeds_upper_bound_value__, + on_exceeds_lower_bound: on_exceeds_lower_bound__, + on_exceeds_lower_bound_value: on_exceeds_lower_bound_value__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.BoundTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::BufferLayoutParseTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.offset.is_some() { + len += 1; + } + if self.endian.is_some() { + len += 1; + } + if self.r#type.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.BufferLayoutParseTask", len)?; + if let Some(v) = self.offset.as_ref() { + struct_ser.serialize_field("offset", v)?; + } + if let Some(v) = self.endian.as_ref() { + let v = oracle_job::buffer_layout_parse_task::Endian::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("endian", &v)?; + } + if let Some(v) = self.r#type.as_ref() { + let v = oracle_job::buffer_layout_parse_task::BufferParseType::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("type", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::BufferLayoutParseTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "offset", + "endian", + "type", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Offset, + Endian, + Type, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "offset" => Ok(GeneratedField::Offset), + "endian" => Ok(GeneratedField::Endian), + "type" => Ok(GeneratedField::Type), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::BufferLayoutParseTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.BufferLayoutParseTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut offset__ = None; + let mut endian__ = None; + let mut r#type__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Offset => { + if offset__.is_some() { + return Err(serde::de::Error::duplicate_field("offset")); + } + offset__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Endian => { + if endian__.is_some() { + return Err(serde::de::Error::duplicate_field("endian")); + } + endian__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::Type => { + if r#type__.is_some() { + return Err(serde::de::Error::duplicate_field("type")); + } + r#type__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::BufferLayoutParseTask { + offset: offset__, + endian: endian__, + r#type: r#type__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.BufferLayoutParseTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::buffer_layout_parse_task::BufferParseType { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Pubkey => "pubkey", + Self::Bool => "bool", + Self::U8 => "u8", + Self::I8 => "i8", + Self::U16 => "u16", + Self::I16 => "i16", + Self::U32 => "u32", + Self::I32 => "i32", + Self::F32 => "f32", + Self::U64 => "u64", + Self::I64 => "i64", + Self::F64 => "f64", + Self::U128 => "u128", + Self::I128 => "i128", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::buffer_layout_parse_task::BufferParseType { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pubkey", + "bool", + "u8", + "i8", + "u16", + "i16", + "u32", + "i32", + "f32", + "u64", + "i64", + "f64", + "u128", + "i128", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::buffer_layout_parse_task::BufferParseType; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pubkey" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::Pubkey), + "bool" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::Bool), + "u8" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U8), + "i8" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I8), + "u16" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U16), + "i16" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I16), + "u32" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U32), + "i32" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I32), + "f32" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::F32), + "u64" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U64), + "i64" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I64), + "f64" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::F64), + "u128" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U128), + "i128" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I128), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::buffer_layout_parse_task::Endian { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::LittleEndian => "LITTLE_ENDIAN", + Self::BigEndian => "BIG_ENDIAN", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::buffer_layout_parse_task::Endian { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "LITTLE_ENDIAN", + "BIG_ENDIAN", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::buffer_layout_parse_task::Endian; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "LITTLE_ENDIAN" => Ok(oracle_job::buffer_layout_parse_task::Endian::LittleEndian), + "BIG_ENDIAN" => Ok(oracle_job::buffer_layout_parse_task::Endian::BigEndian), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::CacheTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.cache_items.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.CacheTask", len)?; + if !self.cache_items.is_empty() { + struct_ser.serialize_field("cacheItems", &self.cache_items)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::CacheTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "cache_items", + "cacheItems", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + CacheItems, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "cacheItems" | "cache_items" => Ok(GeneratedField::CacheItems), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::CacheTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.CacheTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut cache_items__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::CacheItems => { + if cache_items__.is_some() { + return Err(serde::de::Error::duplicate_field("cacheItems")); + } + cache_items__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::CacheTask { + cache_items: cache_items__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.CacheTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::cache_task::CacheItem { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.variable_name.is_some() { + len += 1; + } + if self.job.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.CacheTask.CacheItem", len)?; + if let Some(v) = self.variable_name.as_ref() { + struct_ser.serialize_field("variableName", v)?; + } + if let Some(v) = self.job.as_ref() { + struct_ser.serialize_field("job", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::cache_task::CacheItem { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "variable_name", + "variableName", + "job", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + VariableName, + Job, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "variableName" | "variable_name" => Ok(GeneratedField::VariableName), + "job" => Ok(GeneratedField::Job), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::cache_task::CacheItem; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.CacheTask.CacheItem") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut variable_name__ = None; + let mut job__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::VariableName => { + if variable_name__.is_some() { + return Err(serde::de::Error::duplicate_field("variableName")); + } + variable_name__ = map_.next_value()?; + } + GeneratedField::Job => { + if job__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + job__ = map_.next_value()?; + } + } + } + Ok(oracle_job::cache_task::CacheItem { + variable_name: variable_name__, + job: job__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.CacheTask.CacheItem", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ComparisonTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.op.is_some() { + len += 1; + } + if self.on_true.is_some() { + len += 1; + } + if self.on_true_value.is_some() { + len += 1; + } + if self.on_false.is_some() { + len += 1; + } + if self.on_false_value.is_some() { + len += 1; + } + if self.on_failure.is_some() { + len += 1; + } + if self.on_failure_value.is_some() { + len += 1; + } + if self.lhs.is_some() { + len += 1; + } + if self.rhs.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.ComparisonTask", len)?; + if let Some(v) = self.op.as_ref() { + let v = oracle_job::comparison_task::Operation::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("op", &v)?; + } + if let Some(v) = self.on_true.as_ref() { + struct_ser.serialize_field("onTrue", v)?; + } + if let Some(v) = self.on_true_value.as_ref() { + struct_ser.serialize_field("onTrueValue", v)?; + } + if let Some(v) = self.on_false.as_ref() { + struct_ser.serialize_field("onFalse", v)?; + } + if let Some(v) = self.on_false_value.as_ref() { + struct_ser.serialize_field("onFalseValue", v)?; + } + if let Some(v) = self.on_failure.as_ref() { + struct_ser.serialize_field("onFailure", v)?; + } + if let Some(v) = self.on_failure_value.as_ref() { + struct_ser.serialize_field("onFailureValue", v)?; + } + if let Some(v) = self.lhs.as_ref() { + match v { + oracle_job::comparison_task::Lhs::Lhs(v) => { + struct_ser.serialize_field("lhs", v)?; + } + oracle_job::comparison_task::Lhs::LhsValue(v) => { + struct_ser.serialize_field("lhsValue", v)?; + } + } + } + if let Some(v) = self.rhs.as_ref() { + match v { + oracle_job::comparison_task::Rhs::Rhs(v) => { + struct_ser.serialize_field("rhs", v)?; + } + oracle_job::comparison_task::Rhs::RhsValue(v) => { + struct_ser.serialize_field("rhsValue", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ComparisonTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "op", + "on_true", + "onTrue", + "on_true_value", + "onTrueValue", + "on_false", + "onFalse", + "on_false_value", + "onFalseValue", + "on_failure", + "onFailure", + "on_failure_value", + "onFailureValue", + "lhs", + "lhs_value", + "lhsValue", + "rhs", + "rhs_value", + "rhsValue", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Op, + OnTrue, + OnTrueValue, + OnFalse, + OnFalseValue, + OnFailure, + OnFailureValue, + Lhs, + LhsValue, + Rhs, + RhsValue, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "op" => Ok(GeneratedField::Op), + "onTrue" | "on_true" => Ok(GeneratedField::OnTrue), + "onTrueValue" | "on_true_value" => Ok(GeneratedField::OnTrueValue), + "onFalse" | "on_false" => Ok(GeneratedField::OnFalse), + "onFalseValue" | "on_false_value" => Ok(GeneratedField::OnFalseValue), + "onFailure" | "on_failure" => Ok(GeneratedField::OnFailure), + "onFailureValue" | "on_failure_value" => Ok(GeneratedField::OnFailureValue), + "lhs" => Ok(GeneratedField::Lhs), + "lhsValue" | "lhs_value" => Ok(GeneratedField::LhsValue), + "rhs" => Ok(GeneratedField::Rhs), + "rhsValue" | "rhs_value" => Ok(GeneratedField::RhsValue), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ComparisonTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.ComparisonTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut op__ = None; + let mut on_true__ = None; + let mut on_true_value__ = None; + let mut on_false__ = None; + let mut on_false_value__ = None; + let mut on_failure__ = None; + let mut on_failure_value__ = None; + let mut lhs__ = None; + let mut rhs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Op => { + if op__.is_some() { + return Err(serde::de::Error::duplicate_field("op")); + } + op__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::OnTrue => { + if on_true__.is_some() { + return Err(serde::de::Error::duplicate_field("onTrue")); + } + on_true__ = map_.next_value()?; + } + GeneratedField::OnTrueValue => { + if on_true_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onTrueValue")); + } + on_true_value__ = map_.next_value()?; + } + GeneratedField::OnFalse => { + if on_false__.is_some() { + return Err(serde::de::Error::duplicate_field("onFalse")); + } + on_false__ = map_.next_value()?; + } + GeneratedField::OnFalseValue => { + if on_false_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onFalseValue")); + } + on_false_value__ = map_.next_value()?; + } + GeneratedField::OnFailure => { + if on_failure__.is_some() { + return Err(serde::de::Error::duplicate_field("onFailure")); + } + on_failure__ = map_.next_value()?; + } + GeneratedField::OnFailureValue => { + if on_failure_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onFailureValue")); + } + on_failure_value__ = map_.next_value()?; + } + GeneratedField::Lhs => { + if lhs__.is_some() { + return Err(serde::de::Error::duplicate_field("lhs")); + } + lhs__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::comparison_task::Lhs::Lhs) +; + } + GeneratedField::LhsValue => { + if lhs__.is_some() { + return Err(serde::de::Error::duplicate_field("lhsValue")); + } + lhs__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::comparison_task::Lhs::LhsValue); + } + GeneratedField::Rhs => { + if rhs__.is_some() { + return Err(serde::de::Error::duplicate_field("rhs")); + } + rhs__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::comparison_task::Rhs::Rhs) +; + } + GeneratedField::RhsValue => { + if rhs__.is_some() { + return Err(serde::de::Error::duplicate_field("rhsValue")); + } + rhs__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::comparison_task::Rhs::RhsValue); + } + } + } + Ok(oracle_job::ComparisonTask { + op: op__, + on_true: on_true__, + on_true_value: on_true_value__, + on_false: on_false__, + on_false_value: on_false_value__, + on_failure: on_failure__, + on_failure_value: on_failure_value__, + lhs: lhs__, + rhs: rhs__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.ComparisonTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::comparison_task::Operation { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Eq => "OPERATION_EQ", + Self::Gt => "OPERATION_GT", + Self::Lt => "OPERATION_LT", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::comparison_task::Operation { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "OPERATION_EQ", + "OPERATION_GT", + "OPERATION_LT", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::comparison_task::Operation; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "OPERATION_EQ" => Ok(oracle_job::comparison_task::Operation::Eq), + "OPERATION_GT" => Ok(oracle_job::comparison_task::Operation::Gt), + "OPERATION_LT" => Ok(oracle_job::comparison_task::Operation::Lt), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ConditionalTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.attempt.is_empty() { + len += 1; + } + if !self.on_failure.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.ConditionalTask", len)?; + if !self.attempt.is_empty() { + struct_ser.serialize_field("attempt", &self.attempt)?; + } + if !self.on_failure.is_empty() { + struct_ser.serialize_field("onFailure", &self.on_failure)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ConditionalTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "attempt", + "on_failure", + "onFailure", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Attempt, + OnFailure, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "attempt" => Ok(GeneratedField::Attempt), + "onFailure" | "on_failure" => Ok(GeneratedField::OnFailure), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ConditionalTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.ConditionalTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut attempt__ = None; + let mut on_failure__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Attempt => { + if attempt__.is_some() { + return Err(serde::de::Error::duplicate_field("attempt")); + } + attempt__ = Some(map_.next_value()?); + } + GeneratedField::OnFailure => { + if on_failure__.is_some() { + return Err(serde::de::Error::duplicate_field("onFailure")); + } + on_failure__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::ConditionalTask { + attempt: attempt__.unwrap_or_default(), + on_failure: on_failure__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.ConditionalTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::CorexTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token.is_some() { + len += 1; + } + if self.out_token.is_some() { + len += 1; + } + if self.slippage.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.CorexTask", len)?; + if let Some(v) = self.in_token.as_ref() { + struct_ser.serialize_field("inToken", v)?; + } + if let Some(v) = self.out_token.as_ref() { + struct_ser.serialize_field("outToken", v)?; + } + if let Some(v) = self.slippage.as_ref() { + struct_ser.serialize_field("slippage", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::CorexTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token", + "inToken", + "out_token", + "outToken", + "slippage", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InToken, + OutToken, + Slippage, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inToken" | "in_token" => Ok(GeneratedField::InToken), + "outToken" | "out_token" => Ok(GeneratedField::OutToken), + "slippage" => Ok(GeneratedField::Slippage), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::CorexTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.CorexTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token__ = None; + let mut out_token__ = None; + let mut slippage__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InToken => { + if in_token__.is_some() { + return Err(serde::de::Error::duplicate_field("inToken")); + } + in_token__ = map_.next_value()?; + } + GeneratedField::OutToken => { + if out_token__.is_some() { + return Err(serde::de::Error::duplicate_field("outToken")); + } + out_token__ = map_.next_value()?; + } + GeneratedField::Slippage => { + if slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("slippage")); + } + slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::CorexTask { + in_token: in_token__, + out_token: out_token__, + slippage: slippage__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.CorexTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::CronParseTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.cron_pattern.is_some() { + len += 1; + } + if self.clock_offset.is_some() { + len += 1; + } + if self.clock.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.CronParseTask", len)?; + if let Some(v) = self.cron_pattern.as_ref() { + struct_ser.serialize_field("cronPattern", v)?; + } + if let Some(v) = self.clock_offset.as_ref() { + struct_ser.serialize_field("clockOffset", v)?; + } + if let Some(v) = self.clock.as_ref() { + let v = oracle_job::cron_parse_task::ClockType::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("clock", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::CronParseTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "cron_pattern", + "cronPattern", + "clock_offset", + "clockOffset", + "clock", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + CronPattern, + ClockOffset, + Clock, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "cronPattern" | "cron_pattern" => Ok(GeneratedField::CronPattern), + "clockOffset" | "clock_offset" => Ok(GeneratedField::ClockOffset), + "clock" => Ok(GeneratedField::Clock), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::CronParseTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.CronParseTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut cron_pattern__ = None; + let mut clock_offset__ = None; + let mut clock__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::CronPattern => { + if cron_pattern__.is_some() { + return Err(serde::de::Error::duplicate_field("cronPattern")); + } + cron_pattern__ = map_.next_value()?; + } + GeneratedField::ClockOffset => { + if clock_offset__.is_some() { + return Err(serde::de::Error::duplicate_field("clockOffset")); + } + clock_offset__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Clock => { + if clock__.is_some() { + return Err(serde::de::Error::duplicate_field("clock")); + } + clock__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::CronParseTask { + cron_pattern: cron_pattern__, + clock_offset: clock_offset__, + clock: clock__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.CronParseTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::cron_parse_task::ClockType { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Oracle => "ORACLE", + Self::Sysclock => "SYSCLOCK", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::cron_parse_task::ClockType { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "ORACLE", + "SYSCLOCK", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::cron_parse_task::ClockType; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "ORACLE" => Ok(oracle_job::cron_parse_task::ClockType::Oracle), + "SYSCLOCK" => Ok(oracle_job::cron_parse_task::ClockType::Sysclock), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::CurveFinanceTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.chain.is_some() { + len += 1; + } + if self.provider.is_some() { + len += 1; + } + if self.pool_address.is_some() { + len += 1; + } + if self.out_decimals.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.CurveFinanceTask", len)?; + if let Some(v) = self.chain.as_ref() { + let v = oracle_job::curve_finance_task::Chain::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("chain", &v)?; + } + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + if let Some(v) = self.pool_address.as_ref() { + struct_ser.serialize_field("poolAddress", v)?; + } + if let Some(v) = self.out_decimals.as_ref() { + struct_ser.serialize_field("outDecimals", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::CurveFinanceTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "chain", + "provider", + "pool_address", + "poolAddress", + "out_decimals", + "outDecimals", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Chain, + Provider, + PoolAddress, + OutDecimals, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "chain" => Ok(GeneratedField::Chain), + "provider" => Ok(GeneratedField::Provider), + "poolAddress" | "pool_address" => Ok(GeneratedField::PoolAddress), + "outDecimals" | "out_decimals" => Ok(GeneratedField::OutDecimals), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::CurveFinanceTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.CurveFinanceTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut chain__ = None; + let mut provider__ = None; + let mut pool_address__ = None; + let mut out_decimals__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Chain => { + if chain__.is_some() { + return Err(serde::de::Error::duplicate_field("chain")); + } + chain__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + GeneratedField::PoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("poolAddress")); + } + pool_address__ = map_.next_value()?; + } + GeneratedField::OutDecimals => { + if out_decimals__.is_some() { + return Err(serde::de::Error::duplicate_field("outDecimals")); + } + out_decimals__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::CurveFinanceTask { + chain: chain__, + provider: provider__, + pool_address: pool_address__, + out_decimals: out_decimals__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.CurveFinanceTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::curve_finance_task::Chain { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Ethereum => "CHAIN_ETHEREUM", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::curve_finance_task::Chain { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "CHAIN_ETHEREUM", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::curve_finance_task::Chain; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "CHAIN_ETHEREUM" => Ok(oracle_job::curve_finance_task::Chain::Ethereum), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::DivideTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.denominator.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.DivideTask", len)?; + if let Some(v) = self.denominator.as_ref() { + match v { + oracle_job::divide_task::Denominator::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::divide_task::Denominator::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::divide_task::Denominator::Job(v) => { + struct_ser.serialize_field("job", v)?; + } + oracle_job::divide_task::Denominator::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::DivideTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "job", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Job, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "job" => Ok(GeneratedField::Job), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::DivideTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.DivideTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut denominator__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if denominator__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + denominator__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::divide_task::Denominator::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if denominator__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + denominator__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::divide_task::Denominator::AggregatorPubkey); + } + GeneratedField::Job => { + if denominator__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + denominator__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::divide_task::Denominator::Job) +; + } + GeneratedField::Big => { + if denominator__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + denominator__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::divide_task::Denominator::Big); + } + } + } + Ok(oracle_job::DivideTask { + denominator: denominator__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.DivideTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::EtherfuseTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.token.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.EtherfuseTask", len)?; + if let Some(v) = self.token.as_ref() { + let v = oracle_job::etherfuse_task::Token::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("token", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::EtherfuseTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "token", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Token, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "token" => Ok(GeneratedField::Token), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::EtherfuseTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.EtherfuseTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut token__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Token => { + if token__.is_some() { + return Err(serde::de::Error::duplicate_field("token")); + } + token__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::EtherfuseTask { + token: token__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.EtherfuseTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::etherfuse_task::Token { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Cetes => "TOKEN_CETES", + Self::Ustry => "TOKEN_USTRY", + Self::Eurob => "TOKEN_EUROB", + Self::Tesouro => "TOKEN_TESOURO", + Self::Gilts => "TOKEN_GILTS", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::etherfuse_task::Token { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "TOKEN_CETES", + "TOKEN_USTRY", + "TOKEN_EUROB", + "TOKEN_TESOURO", + "TOKEN_GILTS", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::etherfuse_task::Token; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "TOKEN_CETES" => Ok(oracle_job::etherfuse_task::Token::Cetes), + "TOKEN_USTRY" => Ok(oracle_job::etherfuse_task::Token::Ustry), + "TOKEN_EUROB" => Ok(oracle_job::etherfuse_task::Token::Eurob), + "TOKEN_TESOURO" => Ok(oracle_job::etherfuse_task::Token::Tesouro), + "TOKEN_GILTS" => Ok(oracle_job::etherfuse_task::Token::Gilts), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::EwmaTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.aggregator_address.is_some() { + len += 1; + } + if self.period.is_some() { + len += 1; + } + if self.lambda.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.EwmaTask", len)?; + if let Some(v) = self.aggregator_address.as_ref() { + struct_ser.serialize_field("aggregatorAddress", v)?; + } + if let Some(v) = self.period.as_ref() { + struct_ser.serialize_field("period", v)?; + } + if let Some(v) = self.lambda.as_ref() { + struct_ser.serialize_field("lambda", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::EwmaTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "aggregator_address", + "aggregatorAddress", + "period", + "lambda", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + AggregatorAddress, + Period, + Lambda, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "aggregatorAddress" | "aggregator_address" => Ok(GeneratedField::AggregatorAddress), + "period" => Ok(GeneratedField::Period), + "lambda" => Ok(GeneratedField::Lambda), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::EwmaTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.EwmaTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut aggregator_address__ = None; + let mut period__ = None; + let mut lambda__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::AggregatorAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorAddress")); + } + aggregator_address__ = map_.next_value()?; + } + GeneratedField::Period => { + if period__.is_some() { + return Err(serde::de::Error::duplicate_field("period")); + } + period__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Lambda => { + if lambda__.is_some() { + return Err(serde::de::Error::duplicate_field("lambda")); + } + lambda__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::EwmaTask { + aggregator_address: aggregator_address__, + period: period__, + lambda: lambda__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.EwmaTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ExponentPtLinearPricingTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.vault.is_some() { + len += 1; + } + if self.start_price.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.ExponentPTLinearPricingTask", len)?; + if let Some(v) = self.vault.as_ref() { + struct_ser.serialize_field("vault", v)?; + } + if let Some(v) = self.start_price.as_ref() { + struct_ser.serialize_field("startPrice", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ExponentPtLinearPricingTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "vault", + "start_price", + "startPrice", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Vault, + StartPrice, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "vault" => Ok(GeneratedField::Vault), + "startPrice" | "start_price" => Ok(GeneratedField::StartPrice), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ExponentPtLinearPricingTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.ExponentPTLinearPricingTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut vault__ = None; + let mut start_price__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Vault => { + if vault__.is_some() { + return Err(serde::de::Error::duplicate_field("vault")); + } + vault__ = map_.next_value()?; + } + GeneratedField::StartPrice => { + if start_price__.is_some() { + return Err(serde::de::Error::duplicate_field("startPrice")); + } + start_price__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::ExponentPtLinearPricingTask { + vault: vault__, + start_price: start_price__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.ExponentPTLinearPricingTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ExponentTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.vault.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.ExponentTask", len)?; + if let Some(v) = self.vault.as_ref() { + struct_ser.serialize_field("vault", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ExponentTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "vault", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Vault, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "vault" => Ok(GeneratedField::Vault), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ExponentTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.ExponentTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut vault__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Vault => { + if vault__.is_some() { + return Err(serde::de::Error::duplicate_field("vault")); + } + vault__ = map_.next_value()?; + } + } + } + Ok(oracle_job::ExponentTask { + vault: vault__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.ExponentTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::FragmetricTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.token.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.FragmetricTask", len)?; + if let Some(v) = self.token.as_ref() { + let v = oracle_job::fragmetric_task::Token::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("token", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::FragmetricTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "token", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Token, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "token" => Ok(GeneratedField::Token), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::FragmetricTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.FragmetricTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut token__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Token => { + if token__.is_some() { + return Err(serde::de::Error::duplicate_field("token")); + } + token__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::FragmetricTask { + token: token__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.FragmetricTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::fragmetric_task::Token { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::FragSol => "TOKEN_FRAG_SOL", + Self::NSol => "TOKEN_N_SOL", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::fragmetric_task::Token { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "TOKEN_FRAG_SOL", + "TOKEN_N_SOL", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::fragmetric_task::Token; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "TOKEN_FRAG_SOL" => Ok(oracle_job::fragmetric_task::Token::FragSol), + "TOKEN_N_SOL" => Ok(oracle_job::fragmetric_task::Token::NSol), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::GlyphTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pool_address.is_some() { + len += 1; + } + if self.zero_for_one.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.GlyphTask", len)?; + if let Some(v) = self.pool_address.as_ref() { + struct_ser.serialize_field("poolAddress", v)?; + } + if let Some(v) = self.zero_for_one.as_ref() { + struct_ser.serialize_field("zeroForOne", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::GlyphTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pool_address", + "poolAddress", + "zero_for_one", + "zeroForOne", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PoolAddress, + ZeroForOne, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "poolAddress" | "pool_address" => Ok(GeneratedField::PoolAddress), + "zeroForOne" | "zero_for_one" => Ok(GeneratedField::ZeroForOne), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::GlyphTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.GlyphTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pool_address__ = None; + let mut zero_for_one__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("poolAddress")); + } + pool_address__ = map_.next_value()?; + } + GeneratedField::ZeroForOne => { + if zero_for_one__.is_some() { + return Err(serde::de::Error::duplicate_field("zeroForOne")); + } + zero_for_one__ = map_.next_value()?; + } + } + } + Ok(oracle_job::GlyphTask { + pool_address: pool_address__, + zero_for_one: zero_for_one__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.GlyphTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::HistoryFunctionTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.method.is_some() { + len += 1; + } + if self.aggregator_address.is_some() { + len += 1; + } + if self.period.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.HistoryFunctionTask", len)?; + if let Some(v) = self.method.as_ref() { + let v = oracle_job::history_function_task::Method::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("method", &v)?; + } + if let Some(v) = self.aggregator_address.as_ref() { + struct_ser.serialize_field("aggregatorAddress", v)?; + } + if let Some(v) = self.period.as_ref() { + struct_ser.serialize_field("period", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::HistoryFunctionTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "method", + "aggregator_address", + "aggregatorAddress", + "period", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Method, + AggregatorAddress, + Period, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "method" => Ok(GeneratedField::Method), + "aggregatorAddress" | "aggregator_address" => Ok(GeneratedField::AggregatorAddress), + "period" => Ok(GeneratedField::Period), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::HistoryFunctionTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.HistoryFunctionTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut method__ = None; + let mut aggregator_address__ = None; + let mut period__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Method => { + if method__.is_some() { + return Err(serde::de::Error::duplicate_field("method")); + } + method__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::AggregatorAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorAddress")); + } + aggregator_address__ = map_.next_value()?; + } + GeneratedField::Period => { + if period__.is_some() { + return Err(serde::de::Error::duplicate_field("period")); + } + period__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::HistoryFunctionTask { + method: method__, + aggregator_address: aggregator_address__, + period: period__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.HistoryFunctionTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::history_function_task::Method { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Min => "METHOD_MIN", + Self::Max => "METHOD_MAX", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::history_function_task::Method { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "METHOD_MIN", + "METHOD_MAX", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::history_function_task::Method; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "METHOD_MIN" => Ok(oracle_job::history_function_task::Method::Min), + "METHOD_MAX" => Ok(oracle_job::history_function_task::Method::Max), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::HttpTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.url.is_some() { + len += 1; + } + if self.method.is_some() { + len += 1; + } + if !self.headers.is_empty() { + len += 1; + } + if self.body.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.HttpTask", len)?; + if let Some(v) = self.url.as_ref() { + struct_ser.serialize_field("url", v)?; + } + if let Some(v) = self.method.as_ref() { + let v = oracle_job::http_task::Method::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("method", &v)?; + } + if !self.headers.is_empty() { + struct_ser.serialize_field("headers", &self.headers)?; + } + if let Some(v) = self.body.as_ref() { + struct_ser.serialize_field("body", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::HttpTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "url", + "method", + "headers", + "body", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Url, + Method, + Headers, + Body, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "url" => Ok(GeneratedField::Url), + "method" => Ok(GeneratedField::Method), + "headers" => Ok(GeneratedField::Headers), + "body" => Ok(GeneratedField::Body), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::HttpTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.HttpTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut url__ = None; + let mut method__ = None; + let mut headers__ = None; + let mut body__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Url => { + if url__.is_some() { + return Err(serde::de::Error::duplicate_field("url")); + } + url__ = map_.next_value()?; + } + GeneratedField::Method => { + if method__.is_some() { + return Err(serde::de::Error::duplicate_field("method")); + } + method__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::Headers => { + if headers__.is_some() { + return Err(serde::de::Error::duplicate_field("headers")); + } + headers__ = Some(map_.next_value()?); + } + GeneratedField::Body => { + if body__.is_some() { + return Err(serde::de::Error::duplicate_field("body")); + } + body__ = map_.next_value()?; + } + } + } + Ok(oracle_job::HttpTask { + url: url__, + method: method__, + headers: headers__.unwrap_or_default(), + body: body__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.HttpTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::http_task::Header { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.key.is_some() { + len += 1; + } + if self.value.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.HttpTask.Header", len)?; + if let Some(v) = self.key.as_ref() { + struct_ser.serialize_field("key", v)?; + } + if let Some(v) = self.value.as_ref() { + struct_ser.serialize_field("value", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::http_task::Header { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "key", + "value", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Key, + Value, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "key" => Ok(GeneratedField::Key), + "value" => Ok(GeneratedField::Value), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::http_task::Header; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.HttpTask.Header") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut key__ = None; + let mut value__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Key => { + if key__.is_some() { + return Err(serde::de::Error::duplicate_field("key")); + } + key__ = map_.next_value()?; + } + GeneratedField::Value => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("value")); + } + value__ = map_.next_value()?; + } + } + } + Ok(oracle_job::http_task::Header { + key: key__, + value: value__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.HttpTask.Header", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::http_task::Method { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Unkown => "METHOD_UNKOWN", + Self::Get => "METHOD_GET", + Self::Post => "METHOD_POST", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::http_task::Method { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "METHOD_UNKOWN", + "METHOD_GET", + "METHOD_POST", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::http_task::Method; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "METHOD_UNKOWN" => Ok(oracle_job::http_task::Method::Unkown), + "METHOD_GET" => Ok(oracle_job::http_task::Method::Get), + "METHOD_POST" => Ok(oracle_job::http_task::Method::Post), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::JsonParseTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.path.is_some() { + len += 1; + } + if self.aggregation_method.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.JsonParseTask", len)?; + if let Some(v) = self.path.as_ref() { + struct_ser.serialize_field("path", v)?; + } + if let Some(v) = self.aggregation_method.as_ref() { + let v = oracle_job::json_parse_task::AggregationMethod::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("aggregationMethod", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::JsonParseTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "path", + "aggregation_method", + "aggregationMethod", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Path, + AggregationMethod, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "path" => Ok(GeneratedField::Path), + "aggregationMethod" | "aggregation_method" => Ok(GeneratedField::AggregationMethod), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::JsonParseTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.JsonParseTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut path__ = None; + let mut aggregation_method__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Path => { + if path__.is_some() { + return Err(serde::de::Error::duplicate_field("path")); + } + path__ = map_.next_value()?; + } + GeneratedField::AggregationMethod => { + if aggregation_method__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregationMethod")); + } + aggregation_method__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::JsonParseTask { + path: path__, + aggregation_method: aggregation_method__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.JsonParseTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::json_parse_task::AggregationMethod { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::None => "NONE", + Self::Min => "MIN", + Self::Max => "MAX", + Self::Sum => "SUM", + Self::Mean => "MEAN", + Self::Median => "MEDIAN", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::json_parse_task::AggregationMethod { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "NONE", + "MIN", + "MAX", + "SUM", + "MEAN", + "MEDIAN", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::json_parse_task::AggregationMethod; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "NONE" => Ok(oracle_job::json_parse_task::AggregationMethod::None), + "MIN" => Ok(oracle_job::json_parse_task::AggregationMethod::Min), + "MAX" => Ok(oracle_job::json_parse_task::AggregationMethod::Max), + "SUM" => Ok(oracle_job::json_parse_task::AggregationMethod::Sum), + "MEAN" => Ok(oracle_job::json_parse_task::AggregationMethod::Mean), + "MEDIAN" => Ok(oracle_job::json_parse_task::AggregationMethod::Median), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::JupiterSwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.slippage.is_some() { + len += 1; + } + if self.version.is_some() { + len += 1; + } + if self.routes_filters.is_some() { + len += 1; + } + if self.swap_amount.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.JupiterSwapTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.slippage.as_ref() { + struct_ser.serialize_field("slippage", v)?; + } + if let Some(v) = self.version.as_ref() { + let v = oracle_job::jupiter_swap_task::Version::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("version", &v)?; + } + if let Some(v) = self.routes_filters.as_ref() { + match v { + oracle_job::jupiter_swap_task::RoutesFilters::AllowList(v) => { + struct_ser.serialize_field("allowList", v)?; + } + oracle_job::jupiter_swap_task::RoutesFilters::DenyList(v) => { + struct_ser.serialize_field("denyList", v)?; + } + } + } + if let Some(v) = self.swap_amount.as_ref() { + match v { + oracle_job::jupiter_swap_task::SwapAmount::BaseAmount(v) => { + struct_ser.serialize_field("baseAmount", v)?; + } + oracle_job::jupiter_swap_task::SwapAmount::QuoteAmount(v) => { + struct_ser.serialize_field("quoteAmount", v)?; + } + oracle_job::jupiter_swap_task::SwapAmount::BaseAmountString(v) => { + struct_ser.serialize_field("baseAmountString", v)?; + } + oracle_job::jupiter_swap_task::SwapAmount::QuoteAmountString(v) => { + struct_ser.serialize_field("quoteAmountString", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::JupiterSwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "slippage", + "version", + "allow_list", + "allowList", + "deny_list", + "denyList", + "base_amount", + "baseAmount", + "quote_amount", + "quoteAmount", + "base_amount_string", + "baseAmountString", + "quote_amount_string", + "quoteAmountString", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + Slippage, + Version, + AllowList, + DenyList, + BaseAmount, + QuoteAmount, + BaseAmountString, + QuoteAmountString, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "slippage" => Ok(GeneratedField::Slippage), + "version" => Ok(GeneratedField::Version), + "allowList" | "allow_list" => Ok(GeneratedField::AllowList), + "denyList" | "deny_list" => Ok(GeneratedField::DenyList), + "baseAmount" | "base_amount" => Ok(GeneratedField::BaseAmount), + "quoteAmount" | "quote_amount" => Ok(GeneratedField::QuoteAmount), + "baseAmountString" | "base_amount_string" => Ok(GeneratedField::BaseAmountString), + "quoteAmountString" | "quote_amount_string" => Ok(GeneratedField::QuoteAmountString), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::JupiterSwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.JupiterSwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut slippage__ = None; + let mut version__ = None; + let mut routes_filters__ = None; + let mut swap_amount__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::Slippage => { + if slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("slippage")); + } + slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Version => { + if version__.is_some() { + return Err(serde::de::Error::duplicate_field("version")); + } + version__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::AllowList => { + if routes_filters__.is_some() { + return Err(serde::de::Error::duplicate_field("allowList")); + } + routes_filters__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::jupiter_swap_task::RoutesFilters::AllowList) +; + } + GeneratedField::DenyList => { + if routes_filters__.is_some() { + return Err(serde::de::Error::duplicate_field("denyList")); + } + routes_filters__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::jupiter_swap_task::RoutesFilters::DenyList) +; + } + GeneratedField::BaseAmount => { + if swap_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("baseAmount")); + } + swap_amount__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::jupiter_swap_task::SwapAmount::BaseAmount(x.0)); + } + GeneratedField::QuoteAmount => { + if swap_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("quoteAmount")); + } + swap_amount__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::jupiter_swap_task::SwapAmount::QuoteAmount(x.0)); + } + GeneratedField::BaseAmountString => { + if swap_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("baseAmountString")); + } + swap_amount__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::jupiter_swap_task::SwapAmount::BaseAmountString); + } + GeneratedField::QuoteAmountString => { + if swap_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("quoteAmountString")); + } + swap_amount__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::jupiter_swap_task::SwapAmount::QuoteAmountString); + } + } + } + Ok(oracle_job::JupiterSwapTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + slippage: slippage__, + version: version__, + routes_filters: routes_filters__, + swap_amount: swap_amount__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.JupiterSwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::jupiter_swap_task::FilterList { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.labels.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.JupiterSwapTask.FilterList", len)?; + if !self.labels.is_empty() { + struct_ser.serialize_field("labels", &self.labels)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::jupiter_swap_task::FilterList { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "labels", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Labels, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "labels" => Ok(GeneratedField::Labels), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::jupiter_swap_task::FilterList; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.JupiterSwapTask.FilterList") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut labels__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Labels => { + if labels__.is_some() { + return Err(serde::de::Error::duplicate_field("labels")); + } + labels__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::jupiter_swap_task::FilterList { + labels: labels__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.JupiterSwapTask.FilterList", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::jupiter_swap_task::Version { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::V1 => "VERSION_V1", + Self::V2 => "VERSION_V2", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::jupiter_swap_task::Version { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "VERSION_V1", + "VERSION_V2", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::jupiter_swap_task::Version; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "VERSION_V1" => Ok(oracle_job::jupiter_swap_task::Version::V1), + "VERSION_V2" => Ok(oracle_job::jupiter_swap_task::Version::V2), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::LendingRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.protocol.is_some() { + len += 1; + } + if self.asset_mint.is_some() { + len += 1; + } + if self.field.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LendingRateTask", len)?; + if let Some(v) = self.protocol.as_ref() { + struct_ser.serialize_field("protocol", v)?; + } + if let Some(v) = self.asset_mint.as_ref() { + struct_ser.serialize_field("assetMint", v)?; + } + if let Some(v) = self.field.as_ref() { + let v = oracle_job::lending_rate_task::Field::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("field", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::LendingRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "protocol", + "asset_mint", + "assetMint", + "field", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Protocol, + AssetMint, + Field, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "protocol" => Ok(GeneratedField::Protocol), + "assetMint" | "asset_mint" => Ok(GeneratedField::AssetMint), + "field" => Ok(GeneratedField::Field), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::LendingRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LendingRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut protocol__ = None; + let mut asset_mint__ = None; + let mut field__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Protocol => { + if protocol__.is_some() { + return Err(serde::de::Error::duplicate_field("protocol")); + } + protocol__ = map_.next_value()?; + } + GeneratedField::AssetMint => { + if asset_mint__.is_some() { + return Err(serde::de::Error::duplicate_field("assetMint")); + } + asset_mint__ = map_.next_value()?; + } + GeneratedField::Field => { + if field__.is_some() { + return Err(serde::de::Error::duplicate_field("field")); + } + field__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::LendingRateTask { + protocol: protocol__, + asset_mint: asset_mint__, + field: field__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LendingRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::lending_rate_task::Field { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::DepositRate => "FIELD_DEPOSIT_RATE", + Self::BorrowRate => "FIELD_BORROW_RATE", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::lending_rate_task::Field { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "FIELD_DEPOSIT_RATE", + "FIELD_BORROW_RATE", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::lending_rate_task::Field; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "FIELD_DEPOSIT_RATE" => Ok(oracle_job::lending_rate_task::Field::DepositRate), + "FIELD_BORROW_RATE" => Ok(oracle_job::lending_rate_task::Field::BorrowRate), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::LlmTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.provider_config.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LlmTask", len)?; + if let Some(v) = self.provider_config.as_ref() { + match v { + oracle_job::llm_task::ProviderConfig::Openai(v) => { + struct_ser.serialize_field("openai", v)?; + } + oracle_job::llm_task::ProviderConfig::Groq(v) => { + struct_ser.serialize_field("groq", v)?; + } + oracle_job::llm_task::ProviderConfig::Grokxai(v) => { + struct_ser.serialize_field("grokxai", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::LlmTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "openai", + "groq", + "grokxai", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Openai, + Groq, + Grokxai, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "openai" => Ok(GeneratedField::Openai), + "groq" => Ok(GeneratedField::Groq), + "grokxai" => Ok(GeneratedField::Grokxai), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::LlmTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LlmTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut provider_config__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Openai => { + if provider_config__.is_some() { + return Err(serde::de::Error::duplicate_field("openai")); + } + provider_config__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::llm_task::ProviderConfig::Openai) +; + } + GeneratedField::Groq => { + if provider_config__.is_some() { + return Err(serde::de::Error::duplicate_field("groq")); + } + provider_config__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::llm_task::ProviderConfig::Groq) +; + } + GeneratedField::Grokxai => { + if provider_config__.is_some() { + return Err(serde::de::Error::duplicate_field("grokxai")); + } + provider_config__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::llm_task::ProviderConfig::Grokxai) +; + } + } + } + Ok(oracle_job::LlmTask { + provider_config: provider_config__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LlmTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::llm_task::GrokXaiConfig { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.model.is_some() { + len += 1; + } + if self.user_prompt.is_some() { + len += 1; + } + if self.temperature.is_some() { + len += 1; + } + if self.secret_name_api_key.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LlmTask.GrokXAIConfig", len)?; + if let Some(v) = self.model.as_ref() { + struct_ser.serialize_field("model", v)?; + } + if let Some(v) = self.user_prompt.as_ref() { + struct_ser.serialize_field("userPrompt", v)?; + } + if let Some(v) = self.temperature.as_ref() { + struct_ser.serialize_field("temperature", v)?; + } + if let Some(v) = self.secret_name_api_key.as_ref() { + struct_ser.serialize_field("secretNameApiKey", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::llm_task::GrokXaiConfig { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "model", + "user_prompt", + "userPrompt", + "temperature", + "secret_name_api_key", + "secretNameApiKey", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Model, + UserPrompt, + Temperature, + SecretNameApiKey, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "model" => Ok(GeneratedField::Model), + "userPrompt" | "user_prompt" => Ok(GeneratedField::UserPrompt), + "temperature" => Ok(GeneratedField::Temperature), + "secretNameApiKey" | "secret_name_api_key" => Ok(GeneratedField::SecretNameApiKey), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::llm_task::GrokXaiConfig; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LlmTask.GrokXAIConfig") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut model__ = None; + let mut user_prompt__ = None; + let mut temperature__ = None; + let mut secret_name_api_key__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Model => { + if model__.is_some() { + return Err(serde::de::Error::duplicate_field("model")); + } + model__ = map_.next_value()?; + } + GeneratedField::UserPrompt => { + if user_prompt__.is_some() { + return Err(serde::de::Error::duplicate_field("userPrompt")); + } + user_prompt__ = map_.next_value()?; + } + GeneratedField::Temperature => { + if temperature__.is_some() { + return Err(serde::de::Error::duplicate_field("temperature")); + } + temperature__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::SecretNameApiKey => { + if secret_name_api_key__.is_some() { + return Err(serde::de::Error::duplicate_field("secretNameApiKey")); + } + secret_name_api_key__ = map_.next_value()?; + } + } + } + Ok(oracle_job::llm_task::GrokXaiConfig { + model: model__, + user_prompt: user_prompt__, + temperature: temperature__, + secret_name_api_key: secret_name_api_key__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LlmTask.GrokXAIConfig", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::llm_task::GroqConfig { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.model.is_some() { + len += 1; + } + if self.user_prompt.is_some() { + len += 1; + } + if self.temperature.is_some() { + len += 1; + } + if self.secret_name_api_key.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LlmTask.GroqConfig", len)?; + if let Some(v) = self.model.as_ref() { + struct_ser.serialize_field("model", v)?; + } + if let Some(v) = self.user_prompt.as_ref() { + struct_ser.serialize_field("userPrompt", v)?; + } + if let Some(v) = self.temperature.as_ref() { + struct_ser.serialize_field("temperature", v)?; + } + if let Some(v) = self.secret_name_api_key.as_ref() { + struct_ser.serialize_field("secretNameApiKey", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::llm_task::GroqConfig { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "model", + "user_prompt", + "userPrompt", + "temperature", + "secret_name_api_key", + "secretNameApiKey", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Model, + UserPrompt, + Temperature, + SecretNameApiKey, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "model" => Ok(GeneratedField::Model), + "userPrompt" | "user_prompt" => Ok(GeneratedField::UserPrompt), + "temperature" => Ok(GeneratedField::Temperature), + "secretNameApiKey" | "secret_name_api_key" => Ok(GeneratedField::SecretNameApiKey), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::llm_task::GroqConfig; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LlmTask.GroqConfig") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut model__ = None; + let mut user_prompt__ = None; + let mut temperature__ = None; + let mut secret_name_api_key__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Model => { + if model__.is_some() { + return Err(serde::de::Error::duplicate_field("model")); + } + model__ = map_.next_value()?; + } + GeneratedField::UserPrompt => { + if user_prompt__.is_some() { + return Err(serde::de::Error::duplicate_field("userPrompt")); + } + user_prompt__ = map_.next_value()?; + } + GeneratedField::Temperature => { + if temperature__.is_some() { + return Err(serde::de::Error::duplicate_field("temperature")); + } + temperature__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::SecretNameApiKey => { + if secret_name_api_key__.is_some() { + return Err(serde::de::Error::duplicate_field("secretNameApiKey")); + } + secret_name_api_key__ = map_.next_value()?; + } + } + } + Ok(oracle_job::llm_task::GroqConfig { + model: model__, + user_prompt: user_prompt__, + temperature: temperature__, + secret_name_api_key: secret_name_api_key__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LlmTask.GroqConfig", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::llm_task::OpenAiConfig { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.model.is_some() { + len += 1; + } + if self.user_prompt.is_some() { + len += 1; + } + if self.temperature.is_some() { + len += 1; + } + if self.secret_name_api_key.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LlmTask.OpenAIConfig", len)?; + if let Some(v) = self.model.as_ref() { + struct_ser.serialize_field("model", v)?; + } + if let Some(v) = self.user_prompt.as_ref() { + struct_ser.serialize_field("userPrompt", v)?; + } + if let Some(v) = self.temperature.as_ref() { + struct_ser.serialize_field("temperature", v)?; + } + if let Some(v) = self.secret_name_api_key.as_ref() { + struct_ser.serialize_field("secretNameApiKey", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::llm_task::OpenAiConfig { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "model", + "user_prompt", + "userPrompt", + "temperature", + "secret_name_api_key", + "secretNameApiKey", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Model, + UserPrompt, + Temperature, + SecretNameApiKey, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "model" => Ok(GeneratedField::Model), + "userPrompt" | "user_prompt" => Ok(GeneratedField::UserPrompt), + "temperature" => Ok(GeneratedField::Temperature), + "secretNameApiKey" | "secret_name_api_key" => Ok(GeneratedField::SecretNameApiKey), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::llm_task::OpenAiConfig; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LlmTask.OpenAIConfig") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut model__ = None; + let mut user_prompt__ = None; + let mut temperature__ = None; + let mut secret_name_api_key__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Model => { + if model__.is_some() { + return Err(serde::de::Error::duplicate_field("model")); + } + model__ = map_.next_value()?; + } + GeneratedField::UserPrompt => { + if user_prompt__.is_some() { + return Err(serde::de::Error::duplicate_field("userPrompt")); + } + user_prompt__ = map_.next_value()?; + } + GeneratedField::Temperature => { + if temperature__.is_some() { + return Err(serde::de::Error::duplicate_field("temperature")); + } + temperature__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::SecretNameApiKey => { + if secret_name_api_key__.is_some() { + return Err(serde::de::Error::duplicate_field("secretNameApiKey")); + } + secret_name_api_key__ = map_.next_value()?; + } + } + } + Ok(oracle_job::llm_task::OpenAiConfig { + model: model__, + user_prompt: user_prompt__, + temperature: temperature__, + secret_name_api_key: secret_name_api_key__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LlmTask.OpenAIConfig", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::LpExchangeRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.chain.is_some() { + len += 1; + } + if self.pool_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LpExchangeRateTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.chain.as_ref() { + let v = oracle_job::lp_exchange_rate_task::Chain::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("chain", &v)?; + } + if let Some(v) = self.pool_address.as_ref() { + match v { + oracle_job::lp_exchange_rate_task::PoolAddress::MercurialPoolAddress(v) => { + struct_ser.serialize_field("mercurialPoolAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::SaberPoolAddress(v) => { + struct_ser.serialize_field("saberPoolAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::OrcaPoolTokenMintAddress(v) => { + struct_ser.serialize_field("orcaPoolTokenMintAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::RaydiumPoolAddress(v) => { + struct_ser.serialize_field("raydiumPoolAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::OrcaPoolAddress(v) => { + struct_ser.serialize_field("orcaPoolAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::PortReserveAddress(v) => { + struct_ser.serialize_field("portReserveAddress", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::LpExchangeRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "chain", + "mercurial_pool_address", + "mercurialPoolAddress", + "saber_pool_address", + "saberPoolAddress", + "orca_pool_token_mint_address", + "orcaPoolTokenMintAddress", + "raydium_pool_address", + "raydiumPoolAddress", + "orca_pool_address", + "orcaPoolAddress", + "port_reserve_address", + "portReserveAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + Chain, + MercurialPoolAddress, + SaberPoolAddress, + OrcaPoolTokenMintAddress, + RaydiumPoolAddress, + OrcaPoolAddress, + PortReserveAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "chain" => Ok(GeneratedField::Chain), + "mercurialPoolAddress" | "mercurial_pool_address" => Ok(GeneratedField::MercurialPoolAddress), + "saberPoolAddress" | "saber_pool_address" => Ok(GeneratedField::SaberPoolAddress), + "orcaPoolTokenMintAddress" | "orca_pool_token_mint_address" => Ok(GeneratedField::OrcaPoolTokenMintAddress), + "raydiumPoolAddress" | "raydium_pool_address" => Ok(GeneratedField::RaydiumPoolAddress), + "orcaPoolAddress" | "orca_pool_address" => Ok(GeneratedField::OrcaPoolAddress), + "portReserveAddress" | "port_reserve_address" => Ok(GeneratedField::PortReserveAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::LpExchangeRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LpExchangeRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut chain__ = None; + let mut pool_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::Chain => { + if chain__.is_some() { + return Err(serde::de::Error::duplicate_field("chain")); + } + chain__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::MercurialPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("mercurialPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::MercurialPoolAddress); + } + GeneratedField::SaberPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("saberPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::SaberPoolAddress); + } + GeneratedField::OrcaPoolTokenMintAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("orcaPoolTokenMintAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::OrcaPoolTokenMintAddress); + } + GeneratedField::RaydiumPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("raydiumPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::RaydiumPoolAddress); + } + GeneratedField::OrcaPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("orcaPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::OrcaPoolAddress); + } + GeneratedField::PortReserveAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("portReserveAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::PortReserveAddress); + } + } + } + Ok(oracle_job::LpExchangeRateTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + chain: chain__, + pool_address: pool_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LpExchangeRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::lp_exchange_rate_task::Chain { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Solana => "SOLANA", + Self::Eclipse => "ECLIPSE", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::lp_exchange_rate_task::Chain { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "SOLANA", + "ECLIPSE", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::lp_exchange_rate_task::Chain; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "SOLANA" => Ok(oracle_job::lp_exchange_rate_task::Chain::Solana), + "ECLIPSE" => Ok(oracle_job::lp_exchange_rate_task::Chain::Eclipse), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::LpTokenPriceTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.price_feed_addresses.is_empty() { + len += 1; + } + if !self.price_feed_jobs.is_empty() { + len += 1; + } + if self.use_fair_price.is_some() { + len += 1; + } + if self.pool_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LpTokenPriceTask", len)?; + if !self.price_feed_addresses.is_empty() { + struct_ser.serialize_field("priceFeedAddresses", &self.price_feed_addresses)?; + } + if !self.price_feed_jobs.is_empty() { + struct_ser.serialize_field("priceFeedJobs", &self.price_feed_jobs)?; + } + if let Some(v) = self.use_fair_price.as_ref() { + struct_ser.serialize_field("useFairPrice", v)?; + } + if let Some(v) = self.pool_address.as_ref() { + match v { + oracle_job::lp_token_price_task::PoolAddress::MercurialPoolAddress(v) => { + struct_ser.serialize_field("mercurialPoolAddress", v)?; + } + oracle_job::lp_token_price_task::PoolAddress::SaberPoolAddress(v) => { + struct_ser.serialize_field("saberPoolAddress", v)?; + } + oracle_job::lp_token_price_task::PoolAddress::OrcaPoolAddress(v) => { + struct_ser.serialize_field("orcaPoolAddress", v)?; + } + oracle_job::lp_token_price_task::PoolAddress::RaydiumPoolAddress(v) => { + struct_ser.serialize_field("raydiumPoolAddress", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::LpTokenPriceTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "price_feed_addresses", + "priceFeedAddresses", + "price_feed_jobs", + "priceFeedJobs", + "use_fair_price", + "useFairPrice", + "mercurial_pool_address", + "mercurialPoolAddress", + "saber_pool_address", + "saberPoolAddress", + "orca_pool_address", + "orcaPoolAddress", + "raydium_pool_address", + "raydiumPoolAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PriceFeedAddresses, + PriceFeedJobs, + UseFairPrice, + MercurialPoolAddress, + SaberPoolAddress, + OrcaPoolAddress, + RaydiumPoolAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "priceFeedAddresses" | "price_feed_addresses" => Ok(GeneratedField::PriceFeedAddresses), + "priceFeedJobs" | "price_feed_jobs" => Ok(GeneratedField::PriceFeedJobs), + "useFairPrice" | "use_fair_price" => Ok(GeneratedField::UseFairPrice), + "mercurialPoolAddress" | "mercurial_pool_address" => Ok(GeneratedField::MercurialPoolAddress), + "saberPoolAddress" | "saber_pool_address" => Ok(GeneratedField::SaberPoolAddress), + "orcaPoolAddress" | "orca_pool_address" => Ok(GeneratedField::OrcaPoolAddress), + "raydiumPoolAddress" | "raydium_pool_address" => Ok(GeneratedField::RaydiumPoolAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::LpTokenPriceTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LpTokenPriceTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut price_feed_addresses__ = None; + let mut price_feed_jobs__ = None; + let mut use_fair_price__ = None; + let mut pool_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PriceFeedAddresses => { + if price_feed_addresses__.is_some() { + return Err(serde::de::Error::duplicate_field("priceFeedAddresses")); + } + price_feed_addresses__ = Some(map_.next_value()?); + } + GeneratedField::PriceFeedJobs => { + if price_feed_jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("priceFeedJobs")); + } + price_feed_jobs__ = Some(map_.next_value()?); + } + GeneratedField::UseFairPrice => { + if use_fair_price__.is_some() { + return Err(serde::de::Error::duplicate_field("useFairPrice")); + } + use_fair_price__ = map_.next_value()?; + } + GeneratedField::MercurialPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("mercurialPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_token_price_task::PoolAddress::MercurialPoolAddress); + } + GeneratedField::SaberPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("saberPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_token_price_task::PoolAddress::SaberPoolAddress); + } + GeneratedField::OrcaPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("orcaPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_token_price_task::PoolAddress::OrcaPoolAddress); + } + GeneratedField::RaydiumPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("raydiumPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_token_price_task::PoolAddress::RaydiumPoolAddress); + } + } + } + Ok(oracle_job::LpTokenPriceTask { + price_feed_addresses: price_feed_addresses__.unwrap_or_default(), + price_feed_jobs: price_feed_jobs__.unwrap_or_default(), + use_fair_price: use_fair_price__, + pool_address: pool_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LpTokenPriceTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::LstHistoricalYieldTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.lst_mint.is_some() { + len += 1; + } + if self.operation.is_some() { + len += 1; + } + if self.epochs.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LstHistoricalYieldTask", len)?; + if let Some(v) = self.lst_mint.as_ref() { + struct_ser.serialize_field("lstMint", v)?; + } + if let Some(v) = self.operation.as_ref() { + let v = oracle_job::lst_historical_yield_task::Operation::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("operation", &v)?; + } + if let Some(v) = self.epochs.as_ref() { + struct_ser.serialize_field("epochs", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::LstHistoricalYieldTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "lst_mint", + "lstMint", + "operation", + "epochs", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + LstMint, + Operation, + Epochs, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "lstMint" | "lst_mint" => Ok(GeneratedField::LstMint), + "operation" => Ok(GeneratedField::Operation), + "epochs" => Ok(GeneratedField::Epochs), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::LstHistoricalYieldTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LstHistoricalYieldTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut lst_mint__ = None; + let mut operation__ = None; + let mut epochs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::LstMint => { + if lst_mint__.is_some() { + return Err(serde::de::Error::duplicate_field("lstMint")); + } + lst_mint__ = map_.next_value()?; + } + GeneratedField::Operation => { + if operation__.is_some() { + return Err(serde::de::Error::duplicate_field("operation")); + } + operation__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::Epochs => { + if epochs__.is_some() { + return Err(serde::de::Error::duplicate_field("epochs")); + } + epochs__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::LstHistoricalYieldTask { + lst_mint: lst_mint__, + operation: operation__, + epochs: epochs__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LstHistoricalYieldTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::lst_historical_yield_task::Operation { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Median => "OPERATION_MEDIAN", + Self::Mean => "OPERATION_MEAN", + Self::Min => "OPERATION_MIN", + Self::Max => "OPERATION_MAX", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::lst_historical_yield_task::Operation { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "OPERATION_MEDIAN", + "OPERATION_MEAN", + "OPERATION_MIN", + "OPERATION_MAX", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::lst_historical_yield_task::Operation; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "OPERATION_MEDIAN" => Ok(oracle_job::lst_historical_yield_task::Operation::Median), + "OPERATION_MEAN" => Ok(oracle_job::lst_historical_yield_task::Operation::Mean), + "OPERATION_MIN" => Ok(oracle_job::lst_historical_yield_task::Operation::Min), + "OPERATION_MAX" => Ok(oracle_job::lst_historical_yield_task::Operation::Max), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MangoPerpMarketTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.perp_market_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MangoPerpMarketTask", len)?; + if let Some(v) = self.perp_market_address.as_ref() { + struct_ser.serialize_field("perpMarketAddress", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MangoPerpMarketTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "perp_market_address", + "perpMarketAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PerpMarketAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "perpMarketAddress" | "perp_market_address" => Ok(GeneratedField::PerpMarketAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MangoPerpMarketTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MangoPerpMarketTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut perp_market_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PerpMarketAddress => { + if perp_market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("perpMarketAddress")); + } + perp_market_address__ = map_.next_value()?; + } + } + } + Ok(oracle_job::MangoPerpMarketTask { + perp_market_address: perp_market_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MangoPerpMarketTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MapleFinanceTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.method.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MapleFinanceTask", len)?; + if let Some(v) = self.method.as_ref() { + let v = oracle_job::maple_finance_task::Method::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("method", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MapleFinanceTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "method", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Method, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "method" => Ok(GeneratedField::Method), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MapleFinanceTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MapleFinanceTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut method__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Method => { + if method__.is_some() { + return Err(serde::de::Error::duplicate_field("method")); + } + method__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::MapleFinanceTask { + method: method__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MapleFinanceTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::maple_finance_task::Method { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::SyrupUsdcFairPrice => "METHOD_SYRUP_USDC_FAIR_PRICE", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::maple_finance_task::Method { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "METHOD_SYRUP_USDC_FAIR_PRICE", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::maple_finance_task::Method; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "METHOD_SYRUP_USDC_FAIR_PRICE" => Ok(oracle_job::maple_finance_task::Method::SyrupUsdcFairPrice), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MarinadeStateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let len = 0; + let struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MarinadeStateTask", len)?; + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MarinadeStateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + Err(serde::de::Error::unknown_field(value, FIELDS)) + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MarinadeStateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MarinadeStateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; + } + Ok(oracle_job::MarinadeStateTask { + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MarinadeStateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MaxTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + if !self.jobs.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MaxTask", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + if !self.jobs.is_empty() { + struct_ser.serialize_field("jobs", &self.jobs)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MaxTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + "jobs", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + Jobs, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + "jobs" => Ok(GeneratedField::Jobs), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MaxTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MaxTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + let mut jobs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + GeneratedField::Jobs => { + if jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("jobs")); + } + jobs__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::MaxTask { + tasks: tasks__.unwrap_or_default(), + jobs: jobs__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MaxTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MeanTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + if !self.jobs.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MeanTask", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + if !self.jobs.is_empty() { + struct_ser.serialize_field("jobs", &self.jobs)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MeanTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + "jobs", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + Jobs, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + "jobs" => Ok(GeneratedField::Jobs), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MeanTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MeanTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + let mut jobs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + GeneratedField::Jobs => { + if jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("jobs")); + } + jobs__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::MeanTask { + tasks: tasks__.unwrap_or_default(), + jobs: jobs__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MeanTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MedianTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + if !self.jobs.is_empty() { + len += 1; + } + if self.min_successful_required.is_some() { + len += 1; + } + if self.max_range_percent.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MedianTask", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + if !self.jobs.is_empty() { + struct_ser.serialize_field("jobs", &self.jobs)?; + } + if let Some(v) = self.min_successful_required.as_ref() { + struct_ser.serialize_field("minSuccessfulRequired", v)?; + } + if let Some(v) = self.max_range_percent.as_ref() { + struct_ser.serialize_field("maxRangePercent", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MedianTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + "jobs", + "min_successful_required", + "minSuccessfulRequired", + "max_range_percent", + "maxRangePercent", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + Jobs, + MinSuccessfulRequired, + MaxRangePercent, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + "jobs" => Ok(GeneratedField::Jobs), + "minSuccessfulRequired" | "min_successful_required" => Ok(GeneratedField::MinSuccessfulRequired), + "maxRangePercent" | "max_range_percent" => Ok(GeneratedField::MaxRangePercent), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MedianTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MedianTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + let mut jobs__ = None; + let mut min_successful_required__ = None; + let mut max_range_percent__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + GeneratedField::Jobs => { + if jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("jobs")); + } + jobs__ = Some(map_.next_value()?); + } + GeneratedField::MinSuccessfulRequired => { + if min_successful_required__.is_some() { + return Err(serde::de::Error::duplicate_field("minSuccessfulRequired")); + } + min_successful_required__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::MaxRangePercent => { + if max_range_percent__.is_some() { + return Err(serde::de::Error::duplicate_field("maxRangePercent")); + } + max_range_percent__ = map_.next_value()?; + } + } + } + Ok(oracle_job::MedianTask { + tasks: tasks__.unwrap_or_default(), + jobs: jobs__.unwrap_or_default(), + min_successful_required: min_successful_required__, + max_range_percent: max_range_percent__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MedianTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MeteoraSwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pool.is_some() { + len += 1; + } + if self.r#type.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MeteoraSwapTask", len)?; + if let Some(v) = self.pool.as_ref() { + struct_ser.serialize_field("pool", v)?; + } + if let Some(v) = self.r#type.as_ref() { + let v = oracle_job::meteora_swap_task::Type::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("type", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MeteoraSwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pool", + "type", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Pool, + Type, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pool" => Ok(GeneratedField::Pool), + "type" => Ok(GeneratedField::Type), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MeteoraSwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MeteoraSwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pool__ = None; + let mut r#type__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Pool => { + if pool__.is_some() { + return Err(serde::de::Error::duplicate_field("pool")); + } + pool__ = map_.next_value()?; + } + GeneratedField::Type => { + if r#type__.is_some() { + return Err(serde::de::Error::duplicate_field("type")); + } + r#type__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::MeteoraSwapTask { + pool: pool__, + r#type: r#type__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MeteoraSwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::meteora_swap_task::Type { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Dlmm => "TYPE_DLMM", + Self::Standard => "TYPE_STANDARD", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::meteora_swap_task::Type { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "TYPE_DLMM", + "TYPE_STANDARD", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::meteora_swap_task::Type; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "TYPE_DLMM" => Ok(oracle_job::meteora_swap_task::Type::Dlmm), + "TYPE_STANDARD" => Ok(oracle_job::meteora_swap_task::Type::Standard), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MinTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + if !self.jobs.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MinTask", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + if !self.jobs.is_empty() { + struct_ser.serialize_field("jobs", &self.jobs)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MinTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + "jobs", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + Jobs, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + "jobs" => Ok(GeneratedField::Jobs), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MinTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MinTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + let mut jobs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + GeneratedField::Jobs => { + if jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("jobs")); + } + jobs__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::MinTask { + tasks: tasks__.unwrap_or_default(), + jobs: jobs__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MinTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MultiplyTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.multiple.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MultiplyTask", len)?; + if let Some(v) = self.multiple.as_ref() { + match v { + oracle_job::multiply_task::Multiple::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::multiply_task::Multiple::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::multiply_task::Multiple::Job(v) => { + struct_ser.serialize_field("job", v)?; + } + oracle_job::multiply_task::Multiple::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MultiplyTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "job", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Job, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "job" => Ok(GeneratedField::Job), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MultiplyTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MultiplyTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut multiple__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if multiple__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + multiple__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::multiply_task::Multiple::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if multiple__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + multiple__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::multiply_task::Multiple::AggregatorPubkey); + } + GeneratedField::Job => { + if multiple__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + multiple__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::multiply_task::Multiple::Job) +; + } + GeneratedField::Big => { + if multiple__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + multiple__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::multiply_task::Multiple::Big); + } + } + } + Ok(oracle_job::MultiplyTask { + multiple: multiple__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MultiplyTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::OndoUsdyTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.strategy.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OndoUsdyTask", len)?; + if let Some(v) = self.strategy.as_ref() { + let v = oracle_job::ondo_usdy_task::Strategy::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("strategy", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::OndoUsdyTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "strategy", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Strategy, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "strategy" => Ok(GeneratedField::Strategy), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::OndoUsdyTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OndoUsdyTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut strategy__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Strategy => { + if strategy__.is_some() { + return Err(serde::de::Error::duplicate_field("strategy")); + } + strategy__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::OndoUsdyTask { + strategy: strategy__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OndoUsdyTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ondo_usdy_task::Strategy { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::FairValue => "STRATEGY_FAIR_VALUE", + Self::Market => "STRATEGY_MARKET", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ondo_usdy_task::Strategy { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "STRATEGY_FAIR_VALUE", + "STRATEGY_MARKET", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ondo_usdy_task::Strategy; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "STRATEGY_FAIR_VALUE" => Ok(oracle_job::ondo_usdy_task::Strategy::FairValue), + "STRATEGY_MARKET" => Ok(oracle_job::ondo_usdy_task::Strategy::Market), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::OracleTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pyth_allowed_confidence_interval.is_some() { + len += 1; + } + if self.chainlink_configs.is_some() { + len += 1; + } + if self.pyth_configs.is_some() { + len += 1; + } + if self.switchboard_configs.is_some() { + len += 1; + } + if self.edge_configs.is_some() { + len += 1; + } + if self.redstone_configs.is_some() { + len += 1; + } + if self.aggregator_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OracleTask", len)?; + if let Some(v) = self.pyth_allowed_confidence_interval.as_ref() { + struct_ser.serialize_field("pythAllowedConfidenceInterval", v)?; + } + if let Some(v) = self.chainlink_configs.as_ref() { + struct_ser.serialize_field("chainlinkConfigs", v)?; + } + if let Some(v) = self.pyth_configs.as_ref() { + struct_ser.serialize_field("pythConfigs", v)?; + } + if let Some(v) = self.switchboard_configs.as_ref() { + struct_ser.serialize_field("switchboardConfigs", v)?; + } + if let Some(v) = self.edge_configs.as_ref() { + struct_ser.serialize_field("edgeConfigs", v)?; + } + if let Some(v) = self.redstone_configs.as_ref() { + struct_ser.serialize_field("redstoneConfigs", v)?; + } + if let Some(v) = self.aggregator_address.as_ref() { + match v { + oracle_job::oracle_task::AggregatorAddress::SwitchboardAddress(v) => { + struct_ser.serialize_field("switchboardAddress", v)?; + } + oracle_job::oracle_task::AggregatorAddress::PythAddress(v) => { + struct_ser.serialize_field("pythAddress", v)?; + } + oracle_job::oracle_task::AggregatorAddress::ChainlinkAddress(v) => { + struct_ser.serialize_field("chainlinkAddress", v)?; + } + oracle_job::oracle_task::AggregatorAddress::EdgeId(v) => { + struct_ser.serialize_field("edgeId", v)?; + } + oracle_job::oracle_task::AggregatorAddress::RedstoneId(v) => { + struct_ser.serialize_field("redstoneId", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::OracleTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pyth_allowed_confidence_interval", + "pythAllowedConfidenceInterval", + "chainlink_configs", + "chainlinkConfigs", + "pyth_configs", + "pythConfigs", + "switchboard_configs", + "switchboardConfigs", + "edge_configs", + "edgeConfigs", + "redstone_configs", + "redstoneConfigs", + "switchboard_address", + "switchboardAddress", + "pyth_address", + "pythAddress", + "chainlink_address", + "chainlinkAddress", + "edge_id", + "edgeId", + "redstone_id", + "redstoneId", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PythAllowedConfidenceInterval, + ChainlinkConfigs, + PythConfigs, + SwitchboardConfigs, + EdgeConfigs, + RedstoneConfigs, + SwitchboardAddress, + PythAddress, + ChainlinkAddress, + EdgeId, + RedstoneId, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pythAllowedConfidenceInterval" | "pyth_allowed_confidence_interval" => Ok(GeneratedField::PythAllowedConfidenceInterval), + "chainlinkConfigs" | "chainlink_configs" => Ok(GeneratedField::ChainlinkConfigs), + "pythConfigs" | "pyth_configs" => Ok(GeneratedField::PythConfigs), + "switchboardConfigs" | "switchboard_configs" => Ok(GeneratedField::SwitchboardConfigs), + "edgeConfigs" | "edge_configs" => Ok(GeneratedField::EdgeConfigs), + "redstoneConfigs" | "redstone_configs" => Ok(GeneratedField::RedstoneConfigs), + "switchboardAddress" | "switchboard_address" => Ok(GeneratedField::SwitchboardAddress), + "pythAddress" | "pyth_address" => Ok(GeneratedField::PythAddress), + "chainlinkAddress" | "chainlink_address" => Ok(GeneratedField::ChainlinkAddress), + "edgeId" | "edge_id" => Ok(GeneratedField::EdgeId), + "redstoneId" | "redstone_id" => Ok(GeneratedField::RedstoneId), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::OracleTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OracleTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pyth_allowed_confidence_interval__ = None; + let mut chainlink_configs__ = None; + let mut pyth_configs__ = None; + let mut switchboard_configs__ = None; + let mut edge_configs__ = None; + let mut redstone_configs__ = None; + let mut aggregator_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PythAllowedConfidenceInterval => { + if pyth_allowed_confidence_interval__.is_some() { + return Err(serde::de::Error::duplicate_field("pythAllowedConfidenceInterval")); + } + pyth_allowed_confidence_interval__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::ChainlinkConfigs => { + if chainlink_configs__.is_some() { + return Err(serde::de::Error::duplicate_field("chainlinkConfigs")); + } + chainlink_configs__ = map_.next_value()?; + } + GeneratedField::PythConfigs => { + if pyth_configs__.is_some() { + return Err(serde::de::Error::duplicate_field("pythConfigs")); + } + pyth_configs__ = map_.next_value()?; + } + GeneratedField::SwitchboardConfigs => { + if switchboard_configs__.is_some() { + return Err(serde::de::Error::duplicate_field("switchboardConfigs")); + } + switchboard_configs__ = map_.next_value()?; + } + GeneratedField::EdgeConfigs => { + if edge_configs__.is_some() { + return Err(serde::de::Error::duplicate_field("edgeConfigs")); + } + edge_configs__ = map_.next_value()?; + } + GeneratedField::RedstoneConfigs => { + if redstone_configs__.is_some() { + return Err(serde::de::Error::duplicate_field("redstoneConfigs")); + } + redstone_configs__ = map_.next_value()?; + } + GeneratedField::SwitchboardAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("switchboardAddress")); + } + aggregator_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::oracle_task::AggregatorAddress::SwitchboardAddress); + } + GeneratedField::PythAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("pythAddress")); + } + aggregator_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::oracle_task::AggregatorAddress::PythAddress); + } + GeneratedField::ChainlinkAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("chainlinkAddress")); + } + aggregator_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::oracle_task::AggregatorAddress::ChainlinkAddress); + } + GeneratedField::EdgeId => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("edgeId")); + } + aggregator_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::oracle_task::AggregatorAddress::EdgeId); + } + GeneratedField::RedstoneId => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("redstoneId")); + } + aggregator_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::oracle_task::AggregatorAddress::RedstoneId); + } + } + } + Ok(oracle_job::OracleTask { + pyth_allowed_confidence_interval: pyth_allowed_confidence_interval__, + chainlink_configs: chainlink_configs__, + pyth_configs: pyth_configs__, + switchboard_configs: switchboard_configs__, + edge_configs: edge_configs__, + redstone_configs: redstone_configs__, + aggregator_address: aggregator_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OracleTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::oracle_task::ChainlinkConfigs { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.provider.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OracleTask.ChainlinkConfigs", len)?; + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::oracle_task::ChainlinkConfigs { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "provider", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Provider, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "provider" => Ok(GeneratedField::Provider), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::oracle_task::ChainlinkConfigs; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OracleTask.ChainlinkConfigs") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut provider__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + } + } + Ok(oracle_job::oracle_task::ChainlinkConfigs { + provider: provider__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OracleTask.ChainlinkConfigs", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::oracle_task::EdgeConfigs { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let len = 0; + let struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OracleTask.EdgeConfigs", len)?; + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::oracle_task::EdgeConfigs { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + Err(serde::de::Error::unknown_field(value, FIELDS)) + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::oracle_task::EdgeConfigs; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OracleTask.EdgeConfigs") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; + } + Ok(oracle_job::oracle_task::EdgeConfigs { + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OracleTask.EdgeConfigs", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::oracle_task::PythConfigs { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.hermes_url.is_some() { + len += 1; + } + if self.pyth_allowed_confidence_interval.is_some() { + len += 1; + } + if self.max_stale_seconds.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OracleTask.PythConfigs", len)?; + if let Some(v) = self.hermes_url.as_ref() { + struct_ser.serialize_field("hermesUrl", v)?; + } + if let Some(v) = self.pyth_allowed_confidence_interval.as_ref() { + struct_ser.serialize_field("pythAllowedConfidenceInterval", v)?; + } + if let Some(v) = self.max_stale_seconds.as_ref() { + struct_ser.serialize_field("maxStaleSeconds", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::oracle_task::PythConfigs { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "hermes_url", + "hermesUrl", + "pyth_allowed_confidence_interval", + "pythAllowedConfidenceInterval", + "max_stale_seconds", + "maxStaleSeconds", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + HermesUrl, + PythAllowedConfidenceInterval, + MaxStaleSeconds, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "hermesUrl" | "hermes_url" => Ok(GeneratedField::HermesUrl), + "pythAllowedConfidenceInterval" | "pyth_allowed_confidence_interval" => Ok(GeneratedField::PythAllowedConfidenceInterval), + "maxStaleSeconds" | "max_stale_seconds" => Ok(GeneratedField::MaxStaleSeconds), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::oracle_task::PythConfigs; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OracleTask.PythConfigs") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut hermes_url__ = None; + let mut pyth_allowed_confidence_interval__ = None; + let mut max_stale_seconds__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::HermesUrl => { + if hermes_url__.is_some() { + return Err(serde::de::Error::duplicate_field("hermesUrl")); + } + hermes_url__ = map_.next_value()?; + } + GeneratedField::PythAllowedConfidenceInterval => { + if pyth_allowed_confidence_interval__.is_some() { + return Err(serde::de::Error::duplicate_field("pythAllowedConfidenceInterval")); + } + pyth_allowed_confidence_interval__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::MaxStaleSeconds => { + if max_stale_seconds__.is_some() { + return Err(serde::de::Error::duplicate_field("maxStaleSeconds")); + } + max_stale_seconds__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::oracle_task::PythConfigs { + hermes_url: hermes_url__, + pyth_allowed_confidence_interval: pyth_allowed_confidence_interval__, + max_stale_seconds: max_stale_seconds__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OracleTask.PythConfigs", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::oracle_task::RedstoneConfigs { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let len = 0; + let struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OracleTask.RedstoneConfigs", len)?; + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::oracle_task::RedstoneConfigs { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + Err(serde::de::Error::unknown_field(value, FIELDS)) + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::oracle_task::RedstoneConfigs; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OracleTask.RedstoneConfigs") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; + } + Ok(oracle_job::oracle_task::RedstoneConfigs { + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OracleTask.RedstoneConfigs", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::oracle_task::SwitchboardConfigs { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.version.is_some() { + len += 1; + } + if !self.jobs.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OracleTask.SwitchboardConfigs", len)?; + if let Some(v) = self.version.as_ref() { + struct_ser.serialize_field("version", v)?; + } + if !self.jobs.is_empty() { + struct_ser.serialize_field("jobs", &self.jobs)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::oracle_task::SwitchboardConfigs { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "version", + "jobs", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Version, + Jobs, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "version" => Ok(GeneratedField::Version), + "jobs" => Ok(GeneratedField::Jobs), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::oracle_task::SwitchboardConfigs; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OracleTask.SwitchboardConfigs") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut version__ = None; + let mut jobs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Version => { + if version__.is_some() { + return Err(serde::de::Error::duplicate_field("version")); + } + version__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Jobs => { + if jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("jobs")); + } + jobs__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::oracle_task::SwitchboardConfigs { + version: version__, + jobs: jobs__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OracleTask.SwitchboardConfigs", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::PancakeswapExchangeRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.in_token_amount.is_some() { + len += 1; + } + if self.slippage.is_some() { + len += 1; + } + if self.provider.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.PancakeswapExchangeRateTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.in_token_amount.as_ref() { + struct_ser.serialize_field("inTokenAmount", v)?; + } + if let Some(v) = self.slippage.as_ref() { + struct_ser.serialize_field("slippage", v)?; + } + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::PancakeswapExchangeRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "in_token_amount", + "inTokenAmount", + "slippage", + "provider", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + InTokenAmount, + Slippage, + Provider, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "inTokenAmount" | "in_token_amount" => Ok(GeneratedField::InTokenAmount), + "slippage" => Ok(GeneratedField::Slippage), + "provider" => Ok(GeneratedField::Provider), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::PancakeswapExchangeRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.PancakeswapExchangeRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut in_token_amount__ = None; + let mut slippage__ = None; + let mut provider__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::InTokenAmount => { + if in_token_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAmount")); + } + in_token_amount__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Slippage => { + if slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("slippage")); + } + slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + } + } + Ok(oracle_job::PancakeswapExchangeRateTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + in_token_amount: in_token_amount__, + slippage: slippage__, + provider: provider__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.PancakeswapExchangeRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::PerpMarketTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.market_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.PerpMarketTask", len)?; + if let Some(v) = self.market_address.as_ref() { + match v { + oracle_job::perp_market_task::MarketAddress::MangoMarketAddress(v) => { + struct_ser.serialize_field("mangoMarketAddress", v)?; + } + oracle_job::perp_market_task::MarketAddress::DriftMarketAddress(v) => { + struct_ser.serialize_field("driftMarketAddress", v)?; + } + oracle_job::perp_market_task::MarketAddress::ZetaMarketAddress(v) => { + struct_ser.serialize_field("zetaMarketAddress", v)?; + } + oracle_job::perp_market_task::MarketAddress::ZoMarketAddress(v) => { + struct_ser.serialize_field("zoMarketAddress", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::PerpMarketTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "mango_market_address", + "mangoMarketAddress", + "drift_market_address", + "driftMarketAddress", + "zeta_market_address", + "zetaMarketAddress", + "zo_market_address", + "zoMarketAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + MangoMarketAddress, + DriftMarketAddress, + ZetaMarketAddress, + ZoMarketAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "mangoMarketAddress" | "mango_market_address" => Ok(GeneratedField::MangoMarketAddress), + "driftMarketAddress" | "drift_market_address" => Ok(GeneratedField::DriftMarketAddress), + "zetaMarketAddress" | "zeta_market_address" => Ok(GeneratedField::ZetaMarketAddress), + "zoMarketAddress" | "zo_market_address" => Ok(GeneratedField::ZoMarketAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::PerpMarketTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.PerpMarketTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut market_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::MangoMarketAddress => { + if market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("mangoMarketAddress")); + } + market_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::perp_market_task::MarketAddress::MangoMarketAddress); + } + GeneratedField::DriftMarketAddress => { + if market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("driftMarketAddress")); + } + market_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::perp_market_task::MarketAddress::DriftMarketAddress); + } + GeneratedField::ZetaMarketAddress => { + if market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("zetaMarketAddress")); + } + market_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::perp_market_task::MarketAddress::ZetaMarketAddress); + } + GeneratedField::ZoMarketAddress => { + if market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("zoMarketAddress")); + } + market_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::perp_market_task::MarketAddress::ZoMarketAddress); + } + } + } + Ok(oracle_job::PerpMarketTask { + market_address: market_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.PerpMarketTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::PowTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.exponent.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.PowTask", len)?; + if let Some(v) = self.exponent.as_ref() { + match v { + oracle_job::pow_task::Exponent::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::pow_task::Exponent::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::pow_task::Exponent::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::PowTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::PowTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.PowTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut exponent__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if exponent__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + exponent__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::pow_task::Exponent::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if exponent__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + exponent__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::pow_task::Exponent::AggregatorPubkey); + } + GeneratedField::Big => { + if exponent__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + exponent__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::pow_task::Exponent::Big); + } + } + } + Ok(oracle_job::PowTask { + exponent: exponent__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.PowTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::PumpAmmLpTokenPriceTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pool_address.is_some() { + len += 1; + } + if self.x_price_job.is_some() { + len += 1; + } + if self.y_price_job.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.PumpAmmLpTokenPriceTask", len)?; + if let Some(v) = self.pool_address.as_ref() { + struct_ser.serialize_field("poolAddress", v)?; + } + if let Some(v) = self.x_price_job.as_ref() { + struct_ser.serialize_field("xPriceJob", v)?; + } + if let Some(v) = self.y_price_job.as_ref() { + struct_ser.serialize_field("yPriceJob", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::PumpAmmLpTokenPriceTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pool_address", + "poolAddress", + "x_price_job", + "xPriceJob", + "y_price_job", + "yPriceJob", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PoolAddress, + XPriceJob, + YPriceJob, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "poolAddress" | "pool_address" => Ok(GeneratedField::PoolAddress), + "xPriceJob" | "x_price_job" => Ok(GeneratedField::XPriceJob), + "yPriceJob" | "y_price_job" => Ok(GeneratedField::YPriceJob), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::PumpAmmLpTokenPriceTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.PumpAmmLpTokenPriceTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pool_address__ = None; + let mut x_price_job__ = None; + let mut y_price_job__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("poolAddress")); + } + pool_address__ = map_.next_value()?; + } + GeneratedField::XPriceJob => { + if x_price_job__.is_some() { + return Err(serde::de::Error::duplicate_field("xPriceJob")); + } + x_price_job__ = map_.next_value()?; + } + GeneratedField::YPriceJob => { + if y_price_job__.is_some() { + return Err(serde::de::Error::duplicate_field("yPriceJob")); + } + y_price_job__ = map_.next_value()?; + } + } + } + Ok(oracle_job::PumpAmmLpTokenPriceTask { + pool_address: pool_address__, + x_price_job: x_price_job__, + y_price_job: y_price_job__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.PumpAmmLpTokenPriceTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::PumpAmmTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pool_address.is_some() { + len += 1; + } + if self.in_amount.is_some() { + len += 1; + } + if self.max_slippage.is_some() { + len += 1; + } + if self.is_x_for_y.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.PumpAmmTask", len)?; + if let Some(v) = self.pool_address.as_ref() { + struct_ser.serialize_field("poolAddress", v)?; + } + if let Some(v) = self.in_amount.as_ref() { + struct_ser.serialize_field("inAmount", v)?; + } + if let Some(v) = self.max_slippage.as_ref() { + struct_ser.serialize_field("maxSlippage", v)?; + } + if let Some(v) = self.is_x_for_y.as_ref() { + struct_ser.serialize_field("isXForY", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::PumpAmmTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pool_address", + "poolAddress", + "in_amount", + "inAmount", + "max_slippage", + "maxSlippage", + "is_x_for_y", + "isXForY", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PoolAddress, + InAmount, + MaxSlippage, + IsXForY, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "poolAddress" | "pool_address" => Ok(GeneratedField::PoolAddress), + "inAmount" | "in_amount" => Ok(GeneratedField::InAmount), + "maxSlippage" | "max_slippage" => Ok(GeneratedField::MaxSlippage), + "isXForY" | "is_x_for_y" => Ok(GeneratedField::IsXForY), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::PumpAmmTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.PumpAmmTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pool_address__ = None; + let mut in_amount__ = None; + let mut max_slippage__ = None; + let mut is_x_for_y__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("poolAddress")); + } + pool_address__ = map_.next_value()?; + } + GeneratedField::InAmount => { + if in_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("inAmount")); + } + in_amount__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::MaxSlippage => { + if max_slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("maxSlippage")); + } + max_slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::IsXForY => { + if is_x_for_y__.is_some() { + return Err(serde::de::Error::duplicate_field("isXForY")); + } + is_x_for_y__ = map_.next_value()?; + } + } + } + Ok(oracle_job::PumpAmmTask { + pool_address: pool_address__, + in_amount: in_amount__, + max_slippage: max_slippage__, + is_x_for_y: is_x_for_y__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.PumpAmmTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::RegexExtractTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pattern.is_some() { + len += 1; + } + if self.group_number.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.RegexExtractTask", len)?; + if let Some(v) = self.pattern.as_ref() { + struct_ser.serialize_field("pattern", v)?; + } + if let Some(v) = self.group_number.as_ref() { + struct_ser.serialize_field("groupNumber", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::RegexExtractTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pattern", + "group_number", + "groupNumber", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Pattern, + GroupNumber, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pattern" => Ok(GeneratedField::Pattern), + "groupNumber" | "group_number" => Ok(GeneratedField::GroupNumber), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::RegexExtractTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.RegexExtractTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pattern__ = None; + let mut group_number__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Pattern => { + if pattern__.is_some() { + return Err(serde::de::Error::duplicate_field("pattern")); + } + pattern__ = map_.next_value()?; + } + GeneratedField::GroupNumber => { + if group_number__.is_some() { + return Err(serde::de::Error::duplicate_field("groupNumber")); + } + group_number__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::RegexExtractTask { + pattern: pattern__, + group_number: group_number__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.RegexExtractTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::RoundTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.method.is_some() { + len += 1; + } + if self.decimals.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.RoundTask", len)?; + if let Some(v) = self.method.as_ref() { + let v = oracle_job::round_task::Method::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("method", &v)?; + } + if let Some(v) = self.decimals.as_ref() { + struct_ser.serialize_field("decimals", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::RoundTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "method", + "decimals", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Method, + Decimals, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "method" => Ok(GeneratedField::Method), + "decimals" => Ok(GeneratedField::Decimals), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::RoundTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.RoundTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut method__ = None; + let mut decimals__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Method => { + if method__.is_some() { + return Err(serde::de::Error::duplicate_field("method")); + } + method__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::Decimals => { + if decimals__.is_some() { + return Err(serde::de::Error::duplicate_field("decimals")); + } + decimals__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::RoundTask { + method: method__, + decimals: decimals__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.RoundTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::round_task::Method { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::RoundUp => "METHOD_ROUND_UP", + Self::RoundDown => "METHOD_ROUND_DOWN", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::round_task::Method { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "METHOD_ROUND_UP", + "METHOD_ROUND_DOWN", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::round_task::Method; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "METHOD_ROUND_UP" => Ok(oracle_job::round_task::Method::RoundUp), + "METHOD_ROUND_DOWN" => Ok(oracle_job::round_task::Method::RoundDown), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SanctumLstPriceTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.lst_mint.is_some() { + len += 1; + } + if self.skip_epoch_check.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SanctumLstPriceTask", len)?; + if let Some(v) = self.lst_mint.as_ref() { + struct_ser.serialize_field("lstMint", v)?; + } + if let Some(v) = self.skip_epoch_check.as_ref() { + struct_ser.serialize_field("skipEpochCheck", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SanctumLstPriceTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "lst_mint", + "lstMint", + "skip_epoch_check", + "skipEpochCheck", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + LstMint, + SkipEpochCheck, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "lstMint" | "lst_mint" => Ok(GeneratedField::LstMint), + "skipEpochCheck" | "skip_epoch_check" => Ok(GeneratedField::SkipEpochCheck), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SanctumLstPriceTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SanctumLstPriceTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut lst_mint__ = None; + let mut skip_epoch_check__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::LstMint => { + if lst_mint__.is_some() { + return Err(serde::de::Error::duplicate_field("lstMint")); + } + lst_mint__ = map_.next_value()?; + } + GeneratedField::SkipEpochCheck => { + if skip_epoch_check__.is_some() { + return Err(serde::de::Error::duplicate_field("skipEpochCheck")); + } + skip_epoch_check__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SanctumLstPriceTask { + lst_mint: lst_mint__, + skip_epoch_check: skip_epoch_check__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SanctumLstPriceTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SecretsTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.authority.is_some() { + len += 1; + } + if self.url.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SecretsTask", len)?; + if let Some(v) = self.authority.as_ref() { + struct_ser.serialize_field("authority", v)?; + } + if let Some(v) = self.url.as_ref() { + struct_ser.serialize_field("url", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SecretsTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "authority", + "url", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Authority, + Url, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "authority" => Ok(GeneratedField::Authority), + "url" => Ok(GeneratedField::Url), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SecretsTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SecretsTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut authority__ = None; + let mut url__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Authority => { + if authority__.is_some() { + return Err(serde::de::Error::duplicate_field("authority")); + } + authority__ = map_.next_value()?; + } + GeneratedField::Url => { + if url__.is_some() { + return Err(serde::de::Error::duplicate_field("url")); + } + url__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SecretsTask { + authority: authority__, + url: url__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SecretsTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SerumSwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.serum_pool_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SerumSwapTask", len)?; + if let Some(v) = self.serum_pool_address.as_ref() { + struct_ser.serialize_field("serumPoolAddress", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SerumSwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "serum_pool_address", + "serumPoolAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + SerumPoolAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "serumPoolAddress" | "serum_pool_address" => Ok(GeneratedField::SerumPoolAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SerumSwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SerumSwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut serum_pool_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::SerumPoolAddress => { + if serum_pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("serumPoolAddress")); + } + serum_pool_address__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SerumSwapTask { + serum_pool_address: serum_pool_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SerumSwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SolanaAccountDataFetchTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pubkey.is_some() { + len += 1; + } + if self.network.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SolanaAccountDataFetchTask", len)?; + if let Some(v) = self.pubkey.as_ref() { + struct_ser.serialize_field("pubkey", v)?; + } + if let Some(v) = self.network.as_ref() { + let v = oracle_job::solana_account_data_fetch_task::Network::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("network", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SolanaAccountDataFetchTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pubkey", + "network", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Pubkey, + Network, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pubkey" => Ok(GeneratedField::Pubkey), + "network" => Ok(GeneratedField::Network), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SolanaAccountDataFetchTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SolanaAccountDataFetchTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pubkey__ = None; + let mut network__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Pubkey => { + if pubkey__.is_some() { + return Err(serde::de::Error::duplicate_field("pubkey")); + } + pubkey__ = map_.next_value()?; + } + GeneratedField::Network => { + if network__.is_some() { + return Err(serde::de::Error::duplicate_field("network")); + } + network__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::SolanaAccountDataFetchTask { + pubkey: pubkey__, + network: network__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SolanaAccountDataFetchTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::solana_account_data_fetch_task::Network { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Mainnet => "NETWORK_MAINNET", + Self::Testnet => "NETWORK_TESTNET", + Self::Devnet => "NETWORK_DEVNET", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::solana_account_data_fetch_task::Network { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "NETWORK_MAINNET", + "NETWORK_TESTNET", + "NETWORK_DEVNET", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::solana_account_data_fetch_task::Network; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "NETWORK_MAINNET" => Ok(oracle_job::solana_account_data_fetch_task::Network::Mainnet), + "NETWORK_TESTNET" => Ok(oracle_job::solana_account_data_fetch_task::Network::Testnet), + "NETWORK_DEVNET" => Ok(oracle_job::solana_account_data_fetch_task::Network::Devnet), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SolanaToken2022ExtensionTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.mint.is_some() { + len += 1; + } + if self.extension.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SolanaToken2022ExtensionTask", len)?; + if let Some(v) = self.mint.as_ref() { + struct_ser.serialize_field("mint", v)?; + } + if let Some(v) = self.extension.as_ref() { + let v = oracle_job::solana_token2022_extension_task::Token2022Extension::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("extension", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SolanaToken2022ExtensionTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "mint", + "extension", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Mint, + Extension, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "mint" => Ok(GeneratedField::Mint), + "extension" => Ok(GeneratedField::Extension), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SolanaToken2022ExtensionTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SolanaToken2022ExtensionTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut mint__ = None; + let mut extension__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Mint => { + if mint__.is_some() { + return Err(serde::de::Error::duplicate_field("mint")); + } + mint__ = map_.next_value()?; + } + GeneratedField::Extension => { + if extension__.is_some() { + return Err(serde::de::Error::duplicate_field("extension")); + } + extension__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::SolanaToken2022ExtensionTask { + mint: mint__, + extension: extension__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SolanaToken2022ExtensionTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::solana_token2022_extension_task::Token2022Extension { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Token2022ScaledAmountFactor => "TOKEN_2022_SCALED_AMOUNT_FACTOR", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::solana_token2022_extension_task::Token2022Extension { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "TOKEN_2022_SCALED_AMOUNT_FACTOR", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::solana_token2022_extension_task::Token2022Extension; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "TOKEN_2022_SCALED_AMOUNT_FACTOR" => Ok(oracle_job::solana_token2022_extension_task::Token2022Extension::Token2022ScaledAmountFactor), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SolayerSusdTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let len = 0; + let struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SolayerSusdTask", len)?; + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SolayerSusdTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + Err(serde::de::Error::unknown_field(value, FIELDS)) + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SolayerSusdTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SolayerSusdTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; + } + Ok(oracle_job::SolayerSusdTask { + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SolayerSusdTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SplStakePoolTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pubkey.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SplStakePoolTask", len)?; + if let Some(v) = self.pubkey.as_ref() { + struct_ser.serialize_field("pubkey", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SplStakePoolTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pubkey", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Pubkey, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pubkey" => Ok(GeneratedField::Pubkey), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SplStakePoolTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SplStakePoolTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pubkey__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Pubkey => { + if pubkey__.is_some() { + return Err(serde::de::Error::duplicate_field("pubkey")); + } + pubkey__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SplStakePoolTask { + pubkey: pubkey__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SplStakePoolTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SplTokenParseTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.account_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SplTokenParseTask", len)?; + if let Some(v) = self.account_address.as_ref() { + match v { + oracle_job::spl_token_parse_task::AccountAddress::TokenAccountAddress(v) => { + struct_ser.serialize_field("tokenAccountAddress", v)?; + } + oracle_job::spl_token_parse_task::AccountAddress::MintAddress(v) => { + struct_ser.serialize_field("mintAddress", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SplTokenParseTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "token_account_address", + "tokenAccountAddress", + "mint_address", + "mintAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + TokenAccountAddress, + MintAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tokenAccountAddress" | "token_account_address" => Ok(GeneratedField::TokenAccountAddress), + "mintAddress" | "mint_address" => Ok(GeneratedField::MintAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SplTokenParseTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SplTokenParseTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut account_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::TokenAccountAddress => { + if account_address__.is_some() { + return Err(serde::de::Error::duplicate_field("tokenAccountAddress")); + } + account_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::spl_token_parse_task::AccountAddress::TokenAccountAddress); + } + GeneratedField::MintAddress => { + if account_address__.is_some() { + return Err(serde::de::Error::duplicate_field("mintAddress")); + } + account_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::spl_token_parse_task::AccountAddress::MintAddress); + } + } + } + Ok(oracle_job::SplTokenParseTask { + account_address: account_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SplTokenParseTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SubtractTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.subtraction.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SubtractTask", len)?; + if let Some(v) = self.subtraction.as_ref() { + match v { + oracle_job::subtract_task::Subtraction::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::subtract_task::Subtraction::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::subtract_task::Subtraction::Job(v) => { + struct_ser.serialize_field("job", v)?; + } + oracle_job::subtract_task::Subtraction::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SubtractTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "job", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Job, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "job" => Ok(GeneratedField::Job), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SubtractTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SubtractTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut subtraction__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if subtraction__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + subtraction__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::subtract_task::Subtraction::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if subtraction__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + subtraction__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::subtract_task::Subtraction::AggregatorPubkey); + } + GeneratedField::Job => { + if subtraction__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + subtraction__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::subtract_task::Subtraction::Job) +; + } + GeneratedField::Big => { + if subtraction__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + subtraction__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::subtract_task::Subtraction::Big); + } + } + } + Ok(oracle_job::SubtractTask { + subtraction: subtraction__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SubtractTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SushiswapExchangeRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.in_token_amount.is_some() { + len += 1; + } + if self.slippage.is_some() { + len += 1; + } + if self.provider.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SushiswapExchangeRateTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.in_token_amount.as_ref() { + struct_ser.serialize_field("inTokenAmount", v)?; + } + if let Some(v) = self.slippage.as_ref() { + struct_ser.serialize_field("slippage", v)?; + } + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SushiswapExchangeRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "in_token_amount", + "inTokenAmount", + "slippage", + "provider", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + InTokenAmount, + Slippage, + Provider, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "inTokenAmount" | "in_token_amount" => Ok(GeneratedField::InTokenAmount), + "slippage" => Ok(GeneratedField::Slippage), + "provider" => Ok(GeneratedField::Provider), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SushiswapExchangeRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SushiswapExchangeRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut in_token_amount__ = None; + let mut slippage__ = None; + let mut provider__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::InTokenAmount => { + if in_token_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAmount")); + } + in_token_amount__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Slippage => { + if slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("slippage")); + } + slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SushiswapExchangeRateTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + in_token_amount: in_token_amount__, + slippage: slippage__, + provider: provider__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SushiswapExchangeRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SwitchboardSurgeTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.source.is_some() { + len += 1; + } + if self.symbol.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SwitchboardSurgeTask", len)?; + if let Some(v) = self.source.as_ref() { + let v = oracle_job::switchboard_surge_task::Source::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("source", &v)?; + } + if let Some(v) = self.symbol.as_ref() { + struct_ser.serialize_field("symbol", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SwitchboardSurgeTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "source", + "symbol", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Source, + Symbol, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "source" => Ok(GeneratedField::Source), + "symbol" => Ok(GeneratedField::Symbol), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SwitchboardSurgeTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SwitchboardSurgeTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut source__ = None; + let mut symbol__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Source => { + if source__.is_some() { + return Err(serde::de::Error::duplicate_field("source")); + } + source__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::Symbol => { + if symbol__.is_some() { + return Err(serde::de::Error::duplicate_field("symbol")); + } + symbol__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SwitchboardSurgeTask { + source: source__, + symbol: symbol__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SwitchboardSurgeTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::switchboard_surge_task::Source { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Weighted => "WEIGHTED", + Self::Binance => "BINANCE", + Self::Okx => "OKX", + Self::Bybit => "BYBIT", + Self::Coinbase => "COINBASE", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::switchboard_surge_task::Source { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "WEIGHTED", + "BINANCE", + "OKX", + "BYBIT", + "COINBASE", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::switchboard_surge_task::Source; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "WEIGHTED" => Ok(oracle_job::switchboard_surge_task::Source::Weighted), + "BINANCE" => Ok(oracle_job::switchboard_surge_task::Source::Binance), + "OKX" => Ok(oracle_job::switchboard_surge_task::Source::Okx), + "BYBIT" => Ok(oracle_job::switchboard_surge_task::Source::Bybit), + "COINBASE" => Ok(oracle_job::switchboard_surge_task::Source::Coinbase), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SysclockOffsetTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let len = 0; + let struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SysclockOffsetTask", len)?; + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SysclockOffsetTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + Err(serde::de::Error::unknown_field(value, FIELDS)) + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SysclockOffsetTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SysclockOffsetTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; + } + Ok(oracle_job::SysclockOffsetTask { + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SysclockOffsetTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::Task { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.task.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.Task", len)?; + if let Some(v) = self.task.as_ref() { + match v { + oracle_job::task::Task::HttpTask(v) => { + struct_ser.serialize_field("httpTask", v)?; + } + oracle_job::task::Task::JsonParseTask(v) => { + struct_ser.serialize_field("jsonParseTask", v)?; + } + oracle_job::task::Task::MedianTask(v) => { + struct_ser.serialize_field("medianTask", v)?; + } + oracle_job::task::Task::MeanTask(v) => { + struct_ser.serialize_field("meanTask", v)?; + } + oracle_job::task::Task::WebsocketTask(v) => { + struct_ser.serialize_field("websocketTask", v)?; + } + oracle_job::task::Task::DivideTask(v) => { + struct_ser.serialize_field("divideTask", v)?; + } + oracle_job::task::Task::MultiplyTask(v) => { + struct_ser.serialize_field("multiplyTask", v)?; + } + oracle_job::task::Task::LpTokenPriceTask(v) => { + struct_ser.serialize_field("lpTokenPriceTask", v)?; + } + oracle_job::task::Task::LpExchangeRateTask(v) => { + struct_ser.serialize_field("lpExchangeRateTask", v)?; + } + oracle_job::task::Task::ConditionalTask(v) => { + struct_ser.serialize_field("conditionalTask", v)?; + } + oracle_job::task::Task::ValueTask(v) => { + struct_ser.serialize_field("valueTask", v)?; + } + oracle_job::task::Task::MaxTask(v) => { + struct_ser.serialize_field("maxTask", v)?; + } + oracle_job::task::Task::RegexExtractTask(v) => { + struct_ser.serialize_field("regexExtractTask", v)?; + } + oracle_job::task::Task::XstepPriceTask(v) => { + struct_ser.serialize_field("xstepPriceTask", v)?; + } + oracle_job::task::Task::AddTask(v) => { + struct_ser.serialize_field("addTask", v)?; + } + oracle_job::task::Task::SubtractTask(v) => { + struct_ser.serialize_field("subtractTask", v)?; + } + oracle_job::task::Task::TwapTask(v) => { + struct_ser.serialize_field("twapTask", v)?; + } + oracle_job::task::Task::SerumSwapTask(v) => { + struct_ser.serialize_field("serumSwapTask", v)?; + } + oracle_job::task::Task::PowTask(v) => { + struct_ser.serialize_field("powTask", v)?; + } + oracle_job::task::Task::LendingRateTask(v) => { + struct_ser.serialize_field("lendingRateTask", v)?; + } + oracle_job::task::Task::MangoPerpMarketTask(v) => { + struct_ser.serialize_field("mangoPerpMarketTask", v)?; + } + oracle_job::task::Task::JupiterSwapTask(v) => { + struct_ser.serialize_field("jupiterSwapTask", v)?; + } + oracle_job::task::Task::PerpMarketTask(v) => { + struct_ser.serialize_field("perpMarketTask", v)?; + } + oracle_job::task::Task::OracleTask(v) => { + struct_ser.serialize_field("oracleTask", v)?; + } + oracle_job::task::Task::AnchorFetchTask(v) => { + struct_ser.serialize_field("anchorFetchTask", v)?; + } + oracle_job::task::Task::SplStakePoolTask(v) => { + struct_ser.serialize_field("splStakePoolTask", v)?; + } + oracle_job::task::Task::SplTokenParseTask(v) => { + struct_ser.serialize_field("splTokenParseTask", v)?; + } + oracle_job::task::Task::UniswapExchangeRateTask(v) => { + struct_ser.serialize_field("uniswapExchangeRateTask", v)?; + } + oracle_job::task::Task::SushiswapExchangeRateTask(v) => { + struct_ser.serialize_field("sushiswapExchangeRateTask", v)?; + } + oracle_job::task::Task::PancakeswapExchangeRateTask(v) => { + struct_ser.serialize_field("pancakeswapExchangeRateTask", v)?; + } + oracle_job::task::Task::CacheTask(v) => { + struct_ser.serialize_field("cacheTask", v)?; + } + oracle_job::task::Task::SysclockOffsetTask(v) => { + struct_ser.serialize_field("sysclockOffsetTask", v)?; + } + oracle_job::task::Task::MarinadeStateTask(v) => { + struct_ser.serialize_field("marinadeStateTask", v)?; + } + oracle_job::task::Task::SolanaAccountDataFetchTask(v) => { + struct_ser.serialize_field("solanaAccountDataFetchTask", v)?; + } + oracle_job::task::Task::BufferLayoutParseTask(v) => { + struct_ser.serialize_field("bufferLayoutParseTask", v)?; + } + oracle_job::task::Task::CronParseTask(v) => { + struct_ser.serialize_field("cronParseTask", v)?; + } + oracle_job::task::Task::MinTask(v) => { + struct_ser.serialize_field("minTask", v)?; + } + oracle_job::task::Task::HistoryFunctionTask(v) => { + struct_ser.serialize_field("historyFunctionTask", v)?; + } + oracle_job::task::Task::VwapTask(v) => { + struct_ser.serialize_field("vwapTask", v)?; + } + oracle_job::task::Task::EwmaTask(v) => { + struct_ser.serialize_field("ewmaTask", v)?; + } + oracle_job::task::Task::ComparisonTask(v) => { + struct_ser.serialize_field("comparisonTask", v)?; + } + oracle_job::task::Task::RoundTask(v) => { + struct_ser.serialize_field("roundTask", v)?; + } + oracle_job::task::Task::BoundTask(v) => { + struct_ser.serialize_field("boundTask", v)?; + } + oracle_job::task::Task::SecretsTask(v) => { + struct_ser.serialize_field("secretsTask", v)?; + } + oracle_job::task::Task::SanctumLstPriceTask(v) => { + struct_ser.serialize_field("sanctumLstPriceTask", v)?; + } + oracle_job::task::Task::OndoUsdyTask(v) => { + struct_ser.serialize_field("ondoUsdyTask", v)?; + } + oracle_job::task::Task::MeteoraSwapTask(v) => { + struct_ser.serialize_field("meteoraSwapTask", v)?; + } + oracle_job::task::Task::UnixTimeTask(v) => { + struct_ser.serialize_field("unixTimeTask", v)?; + } + oracle_job::task::Task::MapleFinanceTask(v) => { + struct_ser.serialize_field("mapleFinanceTask", v)?; + } + oracle_job::task::Task::GlyphTask(v) => { + struct_ser.serialize_field("glyphTask", v)?; + } + oracle_job::task::Task::CorexTask(v) => { + struct_ser.serialize_field("corexTask", v)?; + } + oracle_job::task::Task::LlmTask(v) => { + struct_ser.serialize_field("llmTask", v)?; + } + oracle_job::task::Task::SolayerSusdTask(v) => { + struct_ser.serialize_field("solayerSusdTask", v)?; + } + oracle_job::task::Task::CurveFinanceTask(v) => { + struct_ser.serialize_field("curveFinanceTask", v)?; + } + oracle_job::task::Task::TurboEthRedemptionRateTask(v) => { + struct_ser.serialize_field("turboEthRedemptionRateTask", v)?; + } + oracle_job::task::Task::BitFluxTask(v) => { + struct_ser.serialize_field("bitFluxTask", v)?; + } + oracle_job::task::Task::FragmetricTask(v) => { + struct_ser.serialize_field("fragmetricTask", v)?; + } + oracle_job::task::Task::AftermathTask(v) => { + struct_ser.serialize_field("aftermathTask", v)?; + } + oracle_job::task::Task::EtherfuseTask(v) => { + struct_ser.serialize_field("etherfuseTask", v)?; + } + oracle_job::task::Task::LstHistoricalYieldTask(v) => { + struct_ser.serialize_field("lstHistoricalYieldTask", v)?; + } + oracle_job::task::Task::PumpAmmTask(v) => { + struct_ser.serialize_field("pumpAmmTask", v)?; + } + oracle_job::task::Task::PumpAmmLpTokenPriceTask(v) => { + struct_ser.serialize_field("pumpAmmLpTokenPriceTask", v)?; + } + oracle_job::task::Task::ExponentTask(v) => { + struct_ser.serialize_field("exponentTask", v)?; + } + oracle_job::task::Task::ExponentPtLinearPricingTask(v) => { + struct_ser.serialize_field("exponentPtLinearPricingTask", v)?; + } + oracle_job::task::Task::SolanaToken2022ExtensionTask(v) => { + struct_ser.serialize_field("solanaToken2022ExtensionTask", v)?; + } + oracle_job::task::Task::SwitchboardSurgeTask(v) => { + struct_ser.serialize_field("switchboardSurgeTask", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::Task { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "http_task", + "httpTask", + "json_parse_task", + "jsonParseTask", + "median_task", + "medianTask", + "mean_task", + "meanTask", + "websocket_task", + "websocketTask", + "divide_task", + "divideTask", + "multiply_task", + "multiplyTask", + "lp_token_price_task", + "lpTokenPriceTask", + "lp_exchange_rate_task", + "lpExchangeRateTask", + "conditional_task", + "conditionalTask", + "value_task", + "valueTask", + "max_task", + "maxTask", + "regex_extract_task", + "regexExtractTask", + "xstep_price_task", + "xstepPriceTask", + "add_task", + "addTask", + "subtract_task", + "subtractTask", + "twap_task", + "twapTask", + "serum_swap_task", + "serumSwapTask", + "pow_task", + "powTask", + "lending_rate_task", + "lendingRateTask", + "mango_perp_market_task", + "mangoPerpMarketTask", + "jupiter_swap_task", + "jupiterSwapTask", + "perp_market_task", + "perpMarketTask", + "oracle_task", + "oracleTask", + "anchor_fetch_task", + "anchorFetchTask", + "spl_stake_pool_task", + "splStakePoolTask", + "spl_token_parse_task", + "splTokenParseTask", + "uniswap_exchange_rate_task", + "uniswapExchangeRateTask", + "sushiswap_exchange_rate_task", + "sushiswapExchangeRateTask", + "pancakeswap_exchange_rate_task", + "pancakeswapExchangeRateTask", + "cache_task", + "cacheTask", + "sysclock_offset_task", + "sysclockOffsetTask", + "marinade_state_task", + "marinadeStateTask", + "solana_account_data_fetch_task", + "solanaAccountDataFetchTask", + "buffer_layout_parse_task", + "bufferLayoutParseTask", + "cron_parse_task", + "cronParseTask", + "min_task", + "minTask", + "history_function_task", + "historyFunctionTask", + "vwap_task", + "vwapTask", + "ewma_task", + "ewmaTask", + "comparison_task", + "comparisonTask", + "round_task", + "roundTask", + "bound_task", + "boundTask", + "secrets_task", + "secretsTask", + "sanctum_lst_price_task", + "sanctumLstPriceTask", + "ondo_usdy_task", + "ondoUsdyTask", + "meteora_swap_task", + "meteoraSwapTask", + "unix_time_task", + "unixTimeTask", + "maple_finance_task", + "mapleFinanceTask", + "glyph_task", + "glyphTask", + "corex_task", + "corexTask", + "llm_task", + "llmTask", + "solayer_susd_task", + "solayerSusdTask", + "curve_finance_task", + "curveFinanceTask", + "turbo_eth_redemption_rate_task", + "turboEthRedemptionRateTask", + "bit_flux_task", + "bitFluxTask", + "fragmetric_task", + "fragmetricTask", + "aftermath_task", + "aftermathTask", + "etherfuse_task", + "etherfuseTask", + "lst_historical_yield_task", + "lstHistoricalYieldTask", + "pump_amm_task", + "pumpAmmTask", + "pump_amm_lp_token_price_task", + "pumpAmmLpTokenPriceTask", + "exponent_task", + "exponentTask", + "exponent_pt_linear_pricing_task", + "exponentPtLinearPricingTask", + "solana_token_2022_extension_task", + "solanaToken2022ExtensionTask", + "switchboard_surge_task", + "switchboardSurgeTask", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + HttpTask, + JsonParseTask, + MedianTask, + MeanTask, + WebsocketTask, + DivideTask, + MultiplyTask, + LpTokenPriceTask, + LpExchangeRateTask, + ConditionalTask, + ValueTask, + MaxTask, + RegexExtractTask, + XstepPriceTask, + AddTask, + SubtractTask, + TwapTask, + SerumSwapTask, + PowTask, + LendingRateTask, + MangoPerpMarketTask, + JupiterSwapTask, + PerpMarketTask, + OracleTask, + AnchorFetchTask, + SplStakePoolTask, + SplTokenParseTask, + UniswapExchangeRateTask, + SushiswapExchangeRateTask, + PancakeswapExchangeRateTask, + CacheTask, + SysclockOffsetTask, + MarinadeStateTask, + SolanaAccountDataFetchTask, + BufferLayoutParseTask, + CronParseTask, + MinTask, + HistoryFunctionTask, + VwapTask, + EwmaTask, + ComparisonTask, + RoundTask, + BoundTask, + SecretsTask, + SanctumLstPriceTask, + OndoUsdyTask, + MeteoraSwapTask, + UnixTimeTask, + MapleFinanceTask, + GlyphTask, + CorexTask, + LlmTask, + SolayerSusdTask, + CurveFinanceTask, + TurboEthRedemptionRateTask, + BitFluxTask, + FragmetricTask, + AftermathTask, + EtherfuseTask, + LstHistoricalYieldTask, + PumpAmmTask, + PumpAmmLpTokenPriceTask, + ExponentTask, + ExponentPtLinearPricingTask, + SolanaToken2022ExtensionTask, + SwitchboardSurgeTask, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "httpTask" | "http_task" => Ok(GeneratedField::HttpTask), + "jsonParseTask" | "json_parse_task" => Ok(GeneratedField::JsonParseTask), + "medianTask" | "median_task" => Ok(GeneratedField::MedianTask), + "meanTask" | "mean_task" => Ok(GeneratedField::MeanTask), + "websocketTask" | "websocket_task" => Ok(GeneratedField::WebsocketTask), + "divideTask" | "divide_task" => Ok(GeneratedField::DivideTask), + "multiplyTask" | "multiply_task" => Ok(GeneratedField::MultiplyTask), + "lpTokenPriceTask" | "lp_token_price_task" => Ok(GeneratedField::LpTokenPriceTask), + "lpExchangeRateTask" | "lp_exchange_rate_task" => Ok(GeneratedField::LpExchangeRateTask), + "conditionalTask" | "conditional_task" => Ok(GeneratedField::ConditionalTask), + "valueTask" | "value_task" => Ok(GeneratedField::ValueTask), + "maxTask" | "max_task" => Ok(GeneratedField::MaxTask), + "regexExtractTask" | "regex_extract_task" => Ok(GeneratedField::RegexExtractTask), + "xstepPriceTask" | "xstep_price_task" => Ok(GeneratedField::XstepPriceTask), + "addTask" | "add_task" => Ok(GeneratedField::AddTask), + "subtractTask" | "subtract_task" => Ok(GeneratedField::SubtractTask), + "twapTask" | "twap_task" => Ok(GeneratedField::TwapTask), + "serumSwapTask" | "serum_swap_task" => Ok(GeneratedField::SerumSwapTask), + "powTask" | "pow_task" => Ok(GeneratedField::PowTask), + "lendingRateTask" | "lending_rate_task" => Ok(GeneratedField::LendingRateTask), + "mangoPerpMarketTask" | "mango_perp_market_task" => Ok(GeneratedField::MangoPerpMarketTask), + "jupiterSwapTask" | "jupiter_swap_task" => Ok(GeneratedField::JupiterSwapTask), + "perpMarketTask" | "perp_market_task" => Ok(GeneratedField::PerpMarketTask), + "oracleTask" | "oracle_task" => Ok(GeneratedField::OracleTask), + "anchorFetchTask" | "anchor_fetch_task" => Ok(GeneratedField::AnchorFetchTask), + "splStakePoolTask" | "spl_stake_pool_task" => Ok(GeneratedField::SplStakePoolTask), + "splTokenParseTask" | "spl_token_parse_task" => Ok(GeneratedField::SplTokenParseTask), + "uniswapExchangeRateTask" | "uniswap_exchange_rate_task" => Ok(GeneratedField::UniswapExchangeRateTask), + "sushiswapExchangeRateTask" | "sushiswap_exchange_rate_task" => Ok(GeneratedField::SushiswapExchangeRateTask), + "pancakeswapExchangeRateTask" | "pancakeswap_exchange_rate_task" => Ok(GeneratedField::PancakeswapExchangeRateTask), + "cacheTask" | "cache_task" => Ok(GeneratedField::CacheTask), + "sysclockOffsetTask" | "sysclock_offset_task" => Ok(GeneratedField::SysclockOffsetTask), + "marinadeStateTask" | "marinade_state_task" => Ok(GeneratedField::MarinadeStateTask), + "solanaAccountDataFetchTask" | "solana_account_data_fetch_task" => Ok(GeneratedField::SolanaAccountDataFetchTask), + "bufferLayoutParseTask" | "buffer_layout_parse_task" => Ok(GeneratedField::BufferLayoutParseTask), + "cronParseTask" | "cron_parse_task" => Ok(GeneratedField::CronParseTask), + "minTask" | "min_task" => Ok(GeneratedField::MinTask), + "historyFunctionTask" | "history_function_task" => Ok(GeneratedField::HistoryFunctionTask), + "vwapTask" | "vwap_task" => Ok(GeneratedField::VwapTask), + "ewmaTask" | "ewma_task" => Ok(GeneratedField::EwmaTask), + "comparisonTask" | "comparison_task" => Ok(GeneratedField::ComparisonTask), + "roundTask" | "round_task" => Ok(GeneratedField::RoundTask), + "boundTask" | "bound_task" => Ok(GeneratedField::BoundTask), + "secretsTask" | "secrets_task" => Ok(GeneratedField::SecretsTask), + "sanctumLstPriceTask" | "sanctum_lst_price_task" => Ok(GeneratedField::SanctumLstPriceTask), + "ondoUsdyTask" | "ondo_usdy_task" => Ok(GeneratedField::OndoUsdyTask), + "meteoraSwapTask" | "meteora_swap_task" => Ok(GeneratedField::MeteoraSwapTask), + "unixTimeTask" | "unix_time_task" => Ok(GeneratedField::UnixTimeTask), + "mapleFinanceTask" | "maple_finance_task" => Ok(GeneratedField::MapleFinanceTask), + "glyphTask" | "glyph_task" => Ok(GeneratedField::GlyphTask), + "corexTask" | "corex_task" => Ok(GeneratedField::CorexTask), + "llmTask" | "llm_task" => Ok(GeneratedField::LlmTask), + "solayerSusdTask" | "solayer_susd_task" => Ok(GeneratedField::SolayerSusdTask), + "curveFinanceTask" | "curve_finance_task" => Ok(GeneratedField::CurveFinanceTask), + "turboEthRedemptionRateTask" | "turbo_eth_redemption_rate_task" => Ok(GeneratedField::TurboEthRedemptionRateTask), + "bitFluxTask" | "bit_flux_task" => Ok(GeneratedField::BitFluxTask), + "fragmetricTask" | "fragmetric_task" => Ok(GeneratedField::FragmetricTask), + "aftermathTask" | "aftermath_task" => Ok(GeneratedField::AftermathTask), + "etherfuseTask" | "etherfuse_task" => Ok(GeneratedField::EtherfuseTask), + "lstHistoricalYieldTask" | "lst_historical_yield_task" => Ok(GeneratedField::LstHistoricalYieldTask), + "pumpAmmTask" | "pump_amm_task" => Ok(GeneratedField::PumpAmmTask), + "pumpAmmLpTokenPriceTask" | "pump_amm_lp_token_price_task" => Ok(GeneratedField::PumpAmmLpTokenPriceTask), + "exponentTask" | "exponent_task" => Ok(GeneratedField::ExponentTask), + "exponentPtLinearPricingTask" | "exponent_pt_linear_pricing_task" => Ok(GeneratedField::ExponentPtLinearPricingTask), + "solanaToken2022ExtensionTask" | "solana_token_2022_extension_task" => Ok(GeneratedField::SolanaToken2022ExtensionTask), + "switchboardSurgeTask" | "switchboard_surge_task" => Ok(GeneratedField::SwitchboardSurgeTask), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::Task; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.Task") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut task__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::HttpTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("httpTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::HttpTask) +; + } + GeneratedField::JsonParseTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("jsonParseTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::JsonParseTask) +; + } + GeneratedField::MedianTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("medianTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MedianTask) +; + } + GeneratedField::MeanTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("meanTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MeanTask) +; + } + GeneratedField::WebsocketTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("websocketTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::WebsocketTask) +; + } + GeneratedField::DivideTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("divideTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::DivideTask) +; + } + GeneratedField::MultiplyTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("multiplyTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MultiplyTask) +; + } + GeneratedField::LpTokenPriceTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("lpTokenPriceTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::LpTokenPriceTask) +; + } + GeneratedField::LpExchangeRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("lpExchangeRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::LpExchangeRateTask) +; + } + GeneratedField::ConditionalTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("conditionalTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::ConditionalTask) +; + } + GeneratedField::ValueTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("valueTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::ValueTask) +; + } + GeneratedField::MaxTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("maxTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MaxTask) +; + } + GeneratedField::RegexExtractTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("regexExtractTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::RegexExtractTask) +; + } + GeneratedField::XstepPriceTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("xstepPriceTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::XstepPriceTask) +; + } + GeneratedField::AddTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("addTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::AddTask) +; + } + GeneratedField::SubtractTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("subtractTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SubtractTask) +; + } + GeneratedField::TwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("twapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::TwapTask) +; + } + GeneratedField::SerumSwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("serumSwapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SerumSwapTask) +; + } + GeneratedField::PowTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("powTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::PowTask) +; + } + GeneratedField::LendingRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("lendingRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::LendingRateTask) +; + } + GeneratedField::MangoPerpMarketTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("mangoPerpMarketTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MangoPerpMarketTask) +; + } + GeneratedField::JupiterSwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("jupiterSwapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::JupiterSwapTask) +; + } + GeneratedField::PerpMarketTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("perpMarketTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::PerpMarketTask) +; + } + GeneratedField::OracleTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("oracleTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::OracleTask) +; + } + GeneratedField::AnchorFetchTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("anchorFetchTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::AnchorFetchTask) +; + } + GeneratedField::SplStakePoolTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("splStakePoolTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SplStakePoolTask) +; + } + GeneratedField::SplTokenParseTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("splTokenParseTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SplTokenParseTask) +; + } + GeneratedField::UniswapExchangeRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("uniswapExchangeRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::UniswapExchangeRateTask) +; + } + GeneratedField::SushiswapExchangeRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("sushiswapExchangeRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SushiswapExchangeRateTask) +; + } + GeneratedField::PancakeswapExchangeRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("pancakeswapExchangeRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::PancakeswapExchangeRateTask) +; + } + GeneratedField::CacheTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("cacheTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::CacheTask) +; + } + GeneratedField::SysclockOffsetTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("sysclockOffsetTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SysclockOffsetTask) +; + } + GeneratedField::MarinadeStateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("marinadeStateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MarinadeStateTask) +; + } + GeneratedField::SolanaAccountDataFetchTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("solanaAccountDataFetchTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SolanaAccountDataFetchTask) +; + } + GeneratedField::BufferLayoutParseTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("bufferLayoutParseTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::BufferLayoutParseTask) +; + } + GeneratedField::CronParseTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("cronParseTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::CronParseTask) +; + } + GeneratedField::MinTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("minTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MinTask) +; + } + GeneratedField::HistoryFunctionTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("historyFunctionTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::HistoryFunctionTask) +; + } + GeneratedField::VwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("vwapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::VwapTask) +; + } + GeneratedField::EwmaTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("ewmaTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::EwmaTask) +; + } + GeneratedField::ComparisonTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("comparisonTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::ComparisonTask) +; + } + GeneratedField::RoundTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("roundTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::RoundTask) +; + } + GeneratedField::BoundTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("boundTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::BoundTask) +; + } + GeneratedField::SecretsTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("secretsTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SecretsTask) +; + } + GeneratedField::SanctumLstPriceTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("sanctumLstPriceTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SanctumLstPriceTask) +; + } + GeneratedField::OndoUsdyTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("ondoUsdyTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::OndoUsdyTask) +; + } + GeneratedField::MeteoraSwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("meteoraSwapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MeteoraSwapTask) +; + } + GeneratedField::UnixTimeTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("unixTimeTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::UnixTimeTask) +; + } + GeneratedField::MapleFinanceTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("mapleFinanceTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MapleFinanceTask) +; + } + GeneratedField::GlyphTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("glyphTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::GlyphTask) +; + } + GeneratedField::CorexTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("corexTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::CorexTask) +; + } + GeneratedField::LlmTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("llmTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::LlmTask) +; + } + GeneratedField::SolayerSusdTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("solayerSusdTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SolayerSusdTask) +; + } + GeneratedField::CurveFinanceTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("curveFinanceTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::CurveFinanceTask) +; + } + GeneratedField::TurboEthRedemptionRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("turboEthRedemptionRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::TurboEthRedemptionRateTask) +; + } + GeneratedField::BitFluxTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("bitFluxTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::BitFluxTask) +; + } + GeneratedField::FragmetricTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("fragmetricTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::FragmetricTask) +; + } + GeneratedField::AftermathTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("aftermathTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::AftermathTask) +; + } + GeneratedField::EtherfuseTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("etherfuseTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::EtherfuseTask) +; + } + GeneratedField::LstHistoricalYieldTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("lstHistoricalYieldTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::LstHistoricalYieldTask) +; + } + GeneratedField::PumpAmmTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("pumpAmmTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::PumpAmmTask) +; + } + GeneratedField::PumpAmmLpTokenPriceTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("pumpAmmLpTokenPriceTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::PumpAmmLpTokenPriceTask) +; + } + GeneratedField::ExponentTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("exponentTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::ExponentTask) +; + } + GeneratedField::ExponentPtLinearPricingTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("exponentPtLinearPricingTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::ExponentPtLinearPricingTask) +; + } + GeneratedField::SolanaToken2022ExtensionTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("solanaToken2022ExtensionTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SolanaToken2022ExtensionTask) +; + } + GeneratedField::SwitchboardSurgeTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("switchboardSurgeTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SwitchboardSurgeTask) +; + } + } + } + Ok(oracle_job::Task { + task: task__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.Task", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::TurboEthRedemptionRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.provider.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.TurboEthRedemptionRateTask", len)?; + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::TurboEthRedemptionRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "provider", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Provider, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "provider" => Ok(GeneratedField::Provider), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::TurboEthRedemptionRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.TurboEthRedemptionRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut provider__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + } + } + Ok(oracle_job::TurboEthRedemptionRateTask { + provider: provider__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.TurboEthRedemptionRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::TwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.aggregator_pubkey.is_some() { + len += 1; + } + if self.period.is_some() { + len += 1; + } + if self.weight_by_propagation_time.is_some() { + len += 1; + } + if self.min_samples.is_some() { + len += 1; + } + if self.ending_unix_timestamp.is_some() { + len += 1; + } + if self.ending_unix_timestamp_task.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.TwapTask", len)?; + if let Some(v) = self.aggregator_pubkey.as_ref() { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + if let Some(v) = self.period.as_ref() { + struct_ser.serialize_field("period", v)?; + } + if let Some(v) = self.weight_by_propagation_time.as_ref() { + struct_ser.serialize_field("weightByPropagationTime", v)?; + } + if let Some(v) = self.min_samples.as_ref() { + struct_ser.serialize_field("minSamples", v)?; + } + if let Some(v) = self.ending_unix_timestamp.as_ref() { + struct_ser.serialize_field("endingUnixTimestamp", v)?; + } + if let Some(v) = self.ending_unix_timestamp_task.as_ref() { + struct_ser.serialize_field("endingUnixTimestampTask", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::TwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "aggregator_pubkey", + "aggregatorPubkey", + "period", + "weight_by_propagation_time", + "weightByPropagationTime", + "min_samples", + "minSamples", + "ending_unix_timestamp", + "endingUnixTimestamp", + "ending_unix_timestamp_task", + "endingUnixTimestampTask", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + AggregatorPubkey, + Period, + WeightByPropagationTime, + MinSamples, + EndingUnixTimestamp, + EndingUnixTimestampTask, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "period" => Ok(GeneratedField::Period), + "weightByPropagationTime" | "weight_by_propagation_time" => Ok(GeneratedField::WeightByPropagationTime), + "minSamples" | "min_samples" => Ok(GeneratedField::MinSamples), + "endingUnixTimestamp" | "ending_unix_timestamp" => Ok(GeneratedField::EndingUnixTimestamp), + "endingUnixTimestampTask" | "ending_unix_timestamp_task" => Ok(GeneratedField::EndingUnixTimestampTask), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::TwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.TwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut aggregator_pubkey__ = None; + let mut period__ = None; + let mut weight_by_propagation_time__ = None; + let mut min_samples__ = None; + let mut ending_unix_timestamp__ = None; + let mut ending_unix_timestamp_task__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::AggregatorPubkey => { + if aggregator_pubkey__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + aggregator_pubkey__ = map_.next_value()?; + } + GeneratedField::Period => { + if period__.is_some() { + return Err(serde::de::Error::duplicate_field("period")); + } + period__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::WeightByPropagationTime => { + if weight_by_propagation_time__.is_some() { + return Err(serde::de::Error::duplicate_field("weightByPropagationTime")); + } + weight_by_propagation_time__ = map_.next_value()?; + } + GeneratedField::MinSamples => { + if min_samples__.is_some() { + return Err(serde::de::Error::duplicate_field("minSamples")); + } + min_samples__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::EndingUnixTimestamp => { + if ending_unix_timestamp__.is_some() { + return Err(serde::de::Error::duplicate_field("endingUnixTimestamp")); + } + ending_unix_timestamp__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::EndingUnixTimestampTask => { + if ending_unix_timestamp_task__.is_some() { + return Err(serde::de::Error::duplicate_field("endingUnixTimestampTask")); + } + ending_unix_timestamp_task__ = map_.next_value()?; + } + } + } + Ok(oracle_job::TwapTask { + aggregator_pubkey: aggregator_pubkey__, + period: period__, + weight_by_propagation_time: weight_by_propagation_time__, + min_samples: min_samples__, + ending_unix_timestamp: ending_unix_timestamp__, + ending_unix_timestamp_task: ending_unix_timestamp_task__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.TwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::UniswapExchangeRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.in_token_amount.is_some() { + len += 1; + } + if self.slippage.is_some() { + len += 1; + } + if self.provider.is_some() { + len += 1; + } + if self.version.is_some() { + len += 1; + } + if self.router_address.is_some() { + len += 1; + } + if self.factory_address.is_some() { + len += 1; + } + if self.quoter_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.UniswapExchangeRateTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.in_token_amount.as_ref() { + struct_ser.serialize_field("inTokenAmount", v)?; + } + if let Some(v) = self.slippage.as_ref() { + struct_ser.serialize_field("slippage", v)?; + } + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + if let Some(v) = self.version.as_ref() { + let v = oracle_job::uniswap_exchange_rate_task::Version::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("version", &v)?; + } + if let Some(v) = self.router_address.as_ref() { + struct_ser.serialize_field("routerAddress", v)?; + } + if let Some(v) = self.factory_address.as_ref() { + struct_ser.serialize_field("factoryAddress", v)?; + } + if let Some(v) = self.quoter_address.as_ref() { + struct_ser.serialize_field("quoterAddress", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::UniswapExchangeRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "in_token_amount", + "inTokenAmount", + "slippage", + "provider", + "version", + "router_address", + "routerAddress", + "factory_address", + "factoryAddress", + "quoter_address", + "quoterAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + InTokenAmount, + Slippage, + Provider, + Version, + RouterAddress, + FactoryAddress, + QuoterAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "inTokenAmount" | "in_token_amount" => Ok(GeneratedField::InTokenAmount), + "slippage" => Ok(GeneratedField::Slippage), + "provider" => Ok(GeneratedField::Provider), + "version" => Ok(GeneratedField::Version), + "routerAddress" | "router_address" => Ok(GeneratedField::RouterAddress), + "factoryAddress" | "factory_address" => Ok(GeneratedField::FactoryAddress), + "quoterAddress" | "quoter_address" => Ok(GeneratedField::QuoterAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::UniswapExchangeRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.UniswapExchangeRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut in_token_amount__ = None; + let mut slippage__ = None; + let mut provider__ = None; + let mut version__ = None; + let mut router_address__ = None; + let mut factory_address__ = None; + let mut quoter_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::InTokenAmount => { + if in_token_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAmount")); + } + in_token_amount__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Slippage => { + if slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("slippage")); + } + slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + GeneratedField::Version => { + if version__.is_some() { + return Err(serde::de::Error::duplicate_field("version")); + } + version__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::RouterAddress => { + if router_address__.is_some() { + return Err(serde::de::Error::duplicate_field("routerAddress")); + } + router_address__ = map_.next_value()?; + } + GeneratedField::FactoryAddress => { + if factory_address__.is_some() { + return Err(serde::de::Error::duplicate_field("factoryAddress")); + } + factory_address__ = map_.next_value()?; + } + GeneratedField::QuoterAddress => { + if quoter_address__.is_some() { + return Err(serde::de::Error::duplicate_field("quoterAddress")); + } + quoter_address__ = map_.next_value()?; + } + } + } + Ok(oracle_job::UniswapExchangeRateTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + in_token_amount: in_token_amount__, + slippage: slippage__, + provider: provider__, + version: version__, + router_address: router_address__, + factory_address: factory_address__, + quoter_address: quoter_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.UniswapExchangeRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::uniswap_exchange_rate_task::Version { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::V2Deprecated => "VERSION_V2_DEPRECATED", + Self::V3Deprecated => "VERSION_V3_DEPRECATED", + Self::V2 => "VERSION_V2", + Self::V3 => "VERSION_V3", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::uniswap_exchange_rate_task::Version { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "VERSION_V2_DEPRECATED", + "VERSION_V3_DEPRECATED", + "VERSION_V2", + "VERSION_V3", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::uniswap_exchange_rate_task::Version; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "VERSION_V2_DEPRECATED" => Ok(oracle_job::uniswap_exchange_rate_task::Version::V2Deprecated), + "VERSION_V3_DEPRECATED" => Ok(oracle_job::uniswap_exchange_rate_task::Version::V3Deprecated), + "VERSION_V2" => Ok(oracle_job::uniswap_exchange_rate_task::Version::V2), + "VERSION_V3" => Ok(oracle_job::uniswap_exchange_rate_task::Version::V3), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::UnixTimeTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.offset.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.UnixTimeTask", len)?; + if let Some(v) = self.offset.as_ref() { + struct_ser.serialize_field("offset", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::UnixTimeTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "offset", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Offset, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "offset" => Ok(GeneratedField::Offset), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::UnixTimeTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.UnixTimeTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut offset__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Offset => { + if offset__.is_some() { + return Err(serde::de::Error::duplicate_field("offset")); + } + offset__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::UnixTimeTask { + offset: offset__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.UnixTimeTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ValueTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.value.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.ValueTask", len)?; + if let Some(v) = self.value.as_ref() { + match v { + oracle_job::value_task::Value::Value(v) => { + struct_ser.serialize_field("value", v)?; + } + oracle_job::value_task::Value::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::value_task::Value::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + oracle_job::value_task::Value::Hex(v) => { + struct_ser.serialize_field("hex", v)?; + } + oracle_job::value_task::Value::Utf8(v) => { + struct_ser.serialize_field("utf8", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ValueTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "value", + "aggregator_pubkey", + "aggregatorPubkey", + "big", + "hex", + "utf8", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Value, + AggregatorPubkey, + Big, + Hex, + Utf8, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "value" => Ok(GeneratedField::Value), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "big" => Ok(GeneratedField::Big), + "hex" => Ok(GeneratedField::Hex), + "utf8" => Ok(GeneratedField::Utf8), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ValueTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.ValueTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut value__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Value => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("value")); + } + value__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::value_task::Value::Value(x.0)); + } + GeneratedField::AggregatorPubkey => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + value__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::value_task::Value::AggregatorPubkey); + } + GeneratedField::Big => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + value__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::value_task::Value::Big); + } + GeneratedField::Hex => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("hex")); + } + value__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::value_task::Value::Hex); + } + GeneratedField::Utf8 => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("utf8")); + } + value__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::value_task::Value::Utf8); + } + } + } + Ok(oracle_job::ValueTask { + value: value__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.ValueTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::VwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.price_aggregator_address.is_some() { + len += 1; + } + if self.volume_aggregator_address.is_some() { + len += 1; + } + if self.period.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.VwapTask", len)?; + if let Some(v) = self.price_aggregator_address.as_ref() { + struct_ser.serialize_field("priceAggregatorAddress", v)?; + } + if let Some(v) = self.volume_aggregator_address.as_ref() { + struct_ser.serialize_field("volumeAggregatorAddress", v)?; + } + if let Some(v) = self.period.as_ref() { + struct_ser.serialize_field("period", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::VwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "price_aggregator_address", + "priceAggregatorAddress", + "volume_aggregator_address", + "volumeAggregatorAddress", + "period", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PriceAggregatorAddress, + VolumeAggregatorAddress, + Period, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "priceAggregatorAddress" | "price_aggregator_address" => Ok(GeneratedField::PriceAggregatorAddress), + "volumeAggregatorAddress" | "volume_aggregator_address" => Ok(GeneratedField::VolumeAggregatorAddress), + "period" => Ok(GeneratedField::Period), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::VwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.VwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut price_aggregator_address__ = None; + let mut volume_aggregator_address__ = None; + let mut period__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PriceAggregatorAddress => { + if price_aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("priceAggregatorAddress")); + } + price_aggregator_address__ = map_.next_value()?; + } + GeneratedField::VolumeAggregatorAddress => { + if volume_aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("volumeAggregatorAddress")); + } + volume_aggregator_address__ = map_.next_value()?; + } + GeneratedField::Period => { + if period__.is_some() { + return Err(serde::de::Error::duplicate_field("period")); + } + period__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::VwapTask { + price_aggregator_address: price_aggregator_address__, + volume_aggregator_address: volume_aggregator_address__, + period: period__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.VwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::WebsocketTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.url.is_some() { + len += 1; + } + if self.subscription.is_some() { + len += 1; + } + if self.max_data_age_seconds.is_some() { + len += 1; + } + if self.filter.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.WebsocketTask", len)?; + if let Some(v) = self.url.as_ref() { + struct_ser.serialize_field("url", v)?; + } + if let Some(v) = self.subscription.as_ref() { + struct_ser.serialize_field("subscription", v)?; + } + if let Some(v) = self.max_data_age_seconds.as_ref() { + struct_ser.serialize_field("maxDataAgeSeconds", v)?; + } + if let Some(v) = self.filter.as_ref() { + struct_ser.serialize_field("filter", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::WebsocketTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "url", + "subscription", + "max_data_age_seconds", + "maxDataAgeSeconds", + "filter", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Url, + Subscription, + MaxDataAgeSeconds, + Filter, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "url" => Ok(GeneratedField::Url), + "subscription" => Ok(GeneratedField::Subscription), + "maxDataAgeSeconds" | "max_data_age_seconds" => Ok(GeneratedField::MaxDataAgeSeconds), + "filter" => Ok(GeneratedField::Filter), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::WebsocketTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.WebsocketTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut url__ = None; + let mut subscription__ = None; + let mut max_data_age_seconds__ = None; + let mut filter__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Url => { + if url__.is_some() { + return Err(serde::de::Error::duplicate_field("url")); + } + url__ = map_.next_value()?; + } + GeneratedField::Subscription => { + if subscription__.is_some() { + return Err(serde::de::Error::duplicate_field("subscription")); + } + subscription__ = map_.next_value()?; + } + GeneratedField::MaxDataAgeSeconds => { + if max_data_age_seconds__.is_some() { + return Err(serde::de::Error::duplicate_field("maxDataAgeSeconds")); + } + max_data_age_seconds__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Filter => { + if filter__.is_some() { + return Err(serde::de::Error::duplicate_field("filter")); + } + filter__ = map_.next_value()?; + } + } + } + Ok(oracle_job::WebsocketTask { + url: url__, + subscription: subscription__, + max_data_age_seconds: max_data_age_seconds__, + filter: filter__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.WebsocketTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::XStepPriceTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.step_source.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.XStepPriceTask", len)?; + if let Some(v) = self.step_source.as_ref() { + match v { + oracle_job::x_step_price_task::StepSource::StepJob(v) => { + struct_ser.serialize_field("stepJob", v)?; + } + oracle_job::x_step_price_task::StepSource::StepAggregatorPubkey(v) => { + struct_ser.serialize_field("stepAggregatorPubkey", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::XStepPriceTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "step_job", + "stepJob", + "step_aggregator_pubkey", + "stepAggregatorPubkey", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + StepJob, + StepAggregatorPubkey, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "stepJob" | "step_job" => Ok(GeneratedField::StepJob), + "stepAggregatorPubkey" | "step_aggregator_pubkey" => Ok(GeneratedField::StepAggregatorPubkey), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::XStepPriceTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.XStepPriceTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut step_source__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::StepJob => { + if step_source__.is_some() { + return Err(serde::de::Error::duplicate_field("stepJob")); + } + step_source__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::x_step_price_task::StepSource::StepJob) +; + } + GeneratedField::StepAggregatorPubkey => { + if step_source__.is_some() { + return Err(serde::de::Error::duplicate_field("stepAggregatorPubkey")); + } + step_source__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::x_step_price_task::StepSource::StepAggregatorPubkey); + } + } + } + Ok(oracle_job::XStepPriceTask { + step_source: step_source__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.XStepPriceTask", FIELDS, GeneratedVisitor) + } +} diff --git a/programs/switchboard-on-demand/src/client/pull_feed.rs b/programs/switchboard-on-demand/src/client/pull_feed.rs new file mode 100644 index 0000000000..62f4dd569c --- /dev/null +++ b/programs/switchboard-on-demand/src/client/pull_feed.rs @@ -0,0 +1,596 @@ +use super::secp256k1::Secp256k1InstructionUtils; +use super::secp256k1::SecpSignature; +use super::Gateway; +use super::accounts::{OracleAccountData, State, PullFeedAccountData, QueueAccountData}; +use super::lut_owner::{self}; +use super::instructions::*; +use super::crossbar::CrossbarClient; +use super::gateway::{FeedConfig, encode_jobs, FetchSignaturesParams, FetchSignaturesConsensusParams}; +use super::oracle_job::OracleJob; +use super::lut_owner::load_lookup_tables; +use super::recent_slothashes::SlotHashSysvar; +use crate::get_switchboard_on_demand_program_id; +use anyhow::anyhow; +use anyhow::Context; +use anyhow::Error as AnyhowError; +use super::associated_token_account::get_associated_token_address; +use super::associated_token_account::NATIVE_MINT; +use super::associated_token_account::SPL_TOKEN_PROGRAM_ID; +use base64::{engine::general_purpose::STANDARD as base64, Engine as _}; +use bs58; +use bytemuck; +use dashmap::DashMap; +use rust_decimal::Decimal; +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; +use crate::solana_compat::solana_client::nonblocking::rpc_client::RpcClient; +use anchor_client::solana_sdk::address_lookup_table::AddressLookupTableAccount; +use anchor_client::solana_sdk::instruction::Instruction; +use crate::{Pubkey, SYSTEM_PROGRAM_ID}; +use std::result::Result; +use std::sync::Arc; +use tokio::join; +use tokio::sync::OnceCell; + +type LutCache = DashMap; +type JobCache = DashMap<[u8; 32], OnceCell>>; +type PullFeedCache = DashMap>; + +pub fn generate_combined_checksum( + queue_key: &[u8; 32], + feeds: &[PullFeedAccountData], + signed_slothash: &[u8; 32], + submission_values: &[i128], +) -> [u8; 32] { + let mut hasher = Sha256::new(); + hasher.update(queue_key); + + for feed in feeds { + hasher.update(feed.feed_hash); + hasher.update(feed.max_variance.to_le_bytes()); + hasher.update(feed.min_responses.to_le_bytes()); + } + + hasher.update(signed_slothash); + for &value in submission_values { + hasher.update(value.to_le_bytes()); + } + + // Finalize and return the hash. + hasher.finalize().into() +} + +pub struct SbContext { + pub lut_cache: LutCache, + pub job_cache: JobCache, + pub pull_feed_cache: PullFeedCache, +} +impl SbContext { + pub fn new() -> Arc { + Arc::new(SbContext { + lut_cache: DashMap::new(), + job_cache: DashMap::new(), + pull_feed_cache: DashMap::new(), + }) + } +} + +pub async fn fetch_and_cache_luts( + client: &RpcClient, + context: Arc, + oracle_keys: &[Pubkey], +) -> Result, AnyhowError> { + let mut luts = Vec::new(); + let mut keys_to_fetch = Vec::new(); + + for &key in oracle_keys { + if let Some(cached_lut) = context.lut_cache.get(&key) { + luts.push(cached_lut.clone()); + } else { + keys_to_fetch.push(key); + } + } + + if !keys_to_fetch.is_empty() { + let fetched_luts = load_lookup_tables::(client, &keys_to_fetch).await?; + for (key, lut) in keys_to_fetch.into_iter().zip(fetched_luts.into_iter()) { + context.lut_cache.insert(key, lut.clone()); + luts.push(lut); + } + } + + Ok(luts) +} + +#[derive(Clone, Debug)] +pub struct OracleResponse { + pub value: Option, + pub error: String, + pub oracle: Pubkey, + pub signature: [u8; 64], + pub recovery_id: u8, +} + +#[derive(Clone, Debug, Default)] +pub struct FetchUpdateParams { + pub feed: Pubkey, + pub payer: Pubkey, + pub gateway: Gateway, + pub crossbar: Option, + pub num_signatures: Option, + pub debug: Option, +} + +#[derive(Clone, Debug, Default)] +pub struct FetchUpdateManyParams { + pub feeds: Vec, + pub payer: Pubkey, + pub gateway: Gateway, + pub crossbar: Option, + pub num_signatures: Option, + pub debug: Option, +} + +#[derive(Clone, Debug, Default)] +pub struct FetchUpdateBatchParams { + pub feeds: Vec, + pub payer: Pubkey, + pub gateway: Gateway, + pub crossbar: Option, + pub num_signatures: Option, + pub debug: Option, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct SolanaSubmitSignaturesParams { + pub queue: Pubkey, + pub feed: Pubkey, + pub payer: Pubkey, +} + +pub struct PullFeed; + +impl PullFeed { + pub async fn load_data( + client: &RpcClient, + key: &Pubkey, + ) -> Result { + let account = client + .get_account_data(&key.to_bytes().into()) + .await + .map_err(|_| anyhow!("PullFeed.load_data: Account not found"))?; + let account = account[8..].to_vec(); + let data = bytemuck::try_from_bytes::(&account) + .map_err(|_| anyhow!("PullFeed.load_data: Failed to parse data"))?; + Ok(*data) + } + + fn get_solana_submit_signatures_ix( + slot: u64, + responses: Vec, + params: SolanaSubmitSignaturesParams, + ) -> Result { + let mut submissions = Vec::new(); + for resp in &responses { + let mut value_i128 = i128::MAX; + if let Some(mut val) = resp.value { + val.rescale(18); + value_i128 = val.mantissa(); + } + submissions.push(Submission { + value: value_i128, + signature: resp.signature, + recovery_id: resp.recovery_id, + offset: 0, + }); + } + let mut remaining_accounts = Vec::new(); + for resp in &responses { + remaining_accounts.push(anchor_client::solana_sdk::instruction::AccountMeta::new_readonly(resp.oracle.to_bytes().into(), false)); + } + for resp in responses { + let stats_key = OracleAccountData::stats_key(&resp.oracle); + remaining_accounts.push(anchor_client::solana_sdk::instruction::AccountMeta::new(stats_key.to_bytes().into(), false)); + } + let mut submit_ix = Instruction { + program_id: get_switchboard_on_demand_program_id(), + data: PullFeedSubmitResponseParams { slot, submissions }.data(), + accounts: PullFeedSubmitResponse { + feed: params.feed, + queue: params.queue, + program_state: State::key(), + recent_slothashes: crate::solana_sdk::sysvar::slot_hashes::ID.to_bytes().into(), + payer: params.payer, + system_program: SYSTEM_PROGRAM_ID, + reward_vault: get_associated_token_address(¶ms.queue, &NATIVE_MINT), + token_program: *SPL_TOKEN_PROGRAM_ID, + token_mint: *NATIVE_MINT, + } + .to_account_metas(None) + .into_iter() + .map(|meta| anchor_client::solana_sdk::instruction::AccountMeta { + pubkey: meta.pubkey.to_bytes().into(), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + }; + submit_ix.accounts.extend(remaining_accounts); + Ok(submit_ix) + } + + pub async fn fetch_update_ix( + context: Arc, + client: &RpcClient, + params: FetchUpdateParams, + ) -> Result< + ( + Instruction, + Vec, + usize, + Vec, + ), + AnyhowError, + > { + let latest_slot = SlotHashSysvar::get_latest_slothash(client) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch latest slot")?; + + let feed_data = *context + .pull_feed_cache + .entry(params.feed) + .or_insert_with(OnceCell::new) + .get_or_try_init(|| PullFeed::load_data(client, ¶ms.feed)) + .await?; + + let feed_hash = feed_data.feed_hash; + let jobs = context + .job_cache + .entry(feed_hash) + .or_insert_with(OnceCell::new) + .get_or_try_init(|| { + let crossbar = params.crossbar.clone().unwrap_or_default(); + async move { + let jobs_data = crossbar + .fetch(&hex::encode(feed_hash)) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch jobs")?; + + let jobs: Vec = + serde_json::from_value(jobs_data.get("jobs").unwrap().clone()) + .context("PullFeed.fetchUpdateIx: Failed to deserialize jobs")?; + + Ok::, AnyhowError>(jobs) + } + }) + .await? + .clone(); + + let encoded_jobs = encode_jobs(&jobs); + let gateway = params.gateway; + + let num_signatures = if params.num_signatures.is_none() { + (feed_data.min_sample_size as f64 + ((feed_data.min_sample_size as f64) / 3.0).ceil()) + as u32 + } else { + params.num_signatures.unwrap() + }; + + let price_signatures = gateway + .fetch_signatures_from_encoded(FetchSignaturesParams { + recent_hash: Some(bs58::encode(latest_slot.hash).into_string()), + encoded_jobs: encoded_jobs.clone(), + num_signatures, + max_variance: Some((feed_data.max_variance / 1_000_000_000) as u32), + min_responses: Some(feed_data.min_responses), + use_timestamp: Some(false), + }) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch signatures")?; + + let mut num_successes = 0; + let oracle_responses: Vec = price_signatures + .responses + .iter() + .map(|x| { + let value = x.success_value.parse::().ok(); + let mut formatted_value = None; + if let Some(val) = value { + num_successes += 1; + formatted_value = Some(Decimal::from_i128_with_scale(val, 18)); + } + OracleResponse { + value: formatted_value, + error: x.failure_error.clone(), + oracle: Pubkey::new_from_array( + hex::decode(x.oracle_pubkey.clone()) + .unwrap() + .try_into() + .unwrap(), + ), + recovery_id: x.recovery_id as u8, + signature: base64 + .decode(x.signature.clone()) + .unwrap_or_default() + .try_into() + .unwrap_or([0; 64]), + } + }) + .collect(); + + if params.debug.unwrap_or(false) { + println!("priceSignatures: {:?}", price_signatures); + } + + if num_successes == 0 { + return Err(anyhow::Error::msg( + "PullFeed.fetchUpdateIx Failure: No successful responses".to_string(), + )); + } + + let submit_signatures_ix = PullFeed::get_solana_submit_signatures_ix( + latest_slot.slot, + oracle_responses.clone(), + SolanaSubmitSignaturesParams { + feed: params.feed, + queue: feed_data.queue, + payer: params.payer, + }, + ) + .context("PullFeed.fetchUpdateIx: Failed to create submit signatures instruction")?; + + let oracle_keys: Vec = oracle_responses.iter().map(|x| x.oracle).collect(); + let feed_key = [params.feed]; + let queue_key = [feed_data.queue]; + + let (oracle_luts, pull_feed_lut, queue_lut) = join!( + fetch_and_cache_luts::(client, context.clone(), &oracle_keys), + fetch_and_cache_luts::(client, context.clone(), &feed_key), + fetch_and_cache_luts::(client, context.clone(), &queue_key) + ); + let oracle_luts = oracle_luts?; + let pull_feed_lut = pull_feed_lut?; + let queue_lut = queue_lut?; + + let mut luts = oracle_luts; + luts.extend(pull_feed_lut); + luts.extend(queue_lut); + + Ok((submit_signatures_ix, oracle_responses, num_successes, luts)) + } + + /// Fetch the oracle responses for multiple feeds via the consensus endpoint, + /// build the necessary secp256k1 verification instruction and the feed update instruction, + /// and return these instructions along with the required lookup tables. + /// + /// # Arguments + /// * `context` - Shared context holding caches for feeds, jobs, and lookup tables. + /// * `client` - The RPC client for connecting to the cluster. + /// * `params` - Parameters for fetching updates, including: + /// - `feeds`: A vector of feed public keys. + /// - `payer`: The payer public key. + /// - `gateway`: A Gateway instance for the API calls. + /// - `crossbar`: Optional CrossbarClient instance. + /// - `num_signatures`: Optional override for the number of signatures to fetch. + /// - `debug`: Optional flag to print debug logs. + /// + /// # Returns + /// A tuple containing: + /// 1. A vector of two Instructions (first is secp256k1 verification, second is the feed update). + /// 2. A vector of AddressLookupTableAccount to include in the transaction. + pub async fn fetch_update_consensus_ix( + context: Arc, + client: &RpcClient, + params: FetchUpdateManyParams, + ) -> Result<(Vec, Vec), AnyhowError> { + let gateway = params.gateway; + let mut num_signatures = params.num_signatures.unwrap_or(1); + let mut feed_configs = Vec::new(); + let mut queue = Pubkey::default(); + let mut feed_datas = Vec::new(); + // For each feed, load its on-chain data and build its configuration (jobs, encoded jobs, etc.) + for feed in ¶ms.feeds { + let data = *context + .pull_feed_cache + .entry(*feed) + .or_insert_with(OnceCell::new) + .get_or_try_init(|| PullFeed::load_data(client, feed)) + .await?; + feed_datas.push((feed, data)); + let num_sig_lower_bound = + data.min_sample_size as u32 + ((data.min_sample_size as f64) / 3.0).ceil() as u32; + if num_signatures < num_sig_lower_bound { + num_signatures = num_sig_lower_bound; + } + queue = data.queue; + // Fetch jobs from the crossbar (or use cache) and encode them. + let jobs = context + .job_cache + .entry(data.feed_hash) + .or_insert_with(OnceCell::new) + .get_or_try_init(|| { + let crossbar = params.crossbar.clone().unwrap_or_default(); + async move { + let jobs_data = crossbar + .fetch(&hex::encode(data.feed_hash)) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch jobs")?; + + let jobs: Vec = + serde_json::from_value(jobs_data.get("jobs").unwrap().clone()) + .context("PullFeed.fetchUpdateIx: Failed to deserialize jobs")?; + + Ok::, AnyhowError>(jobs) + } + }) + .await? + .clone(); + let encoded_jobs = encode_jobs(&jobs); + let max_variance = (data.max_variance / 1_000_000_000) as u32; + let min_responses = data.min_responses; + // Build the feed configuration required by the gateway. + feed_configs.push(FeedConfig { + encoded_jobs, + max_variance: Some(max_variance), + min_responses: Some(min_responses), + }); + } + + // Get the latest slot. + let latest_slot = SlotHashSysvar::get_latest_slothash(client) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch latest slot")?; + + // Call the gateway consensus endpoint and fetch signatures + let price_signatures = gateway + .fetch_signatures_consensus(FetchSignaturesConsensusParams { + recent_hash: Some(bs58::encode(latest_slot.hash).into_string()), + num_signatures: Some(num_signatures), + feed_configs, + use_timestamp: Some(false), + }) + .await + .context("PullFeed.fetchUpdateIx: fetch signatures consensus failure")?; + if params.debug.unwrap_or(false) { + println!("priceSignatures: {:?}", price_signatures); + } + + // Parse the median responses into i128 values and build the consensus payload. + let consensus_values: Vec = price_signatures + .median_responses + .iter() + .map(|mr| mr.value.parse::().unwrap_or(i128::MAX)) + .collect(); + // Build the consensus Ix data. + let consensus_ix_data = PullFeedSubmitResponseConsensusParams { + slot: latest_slot.slot, + values: consensus_values, + }; + // Extract oracle keys from the gateway responses. + let mut remaining_accounts = Vec::new(); + if price_signatures.oracle_responses.is_empty() { + return Err(anyhow::Error::msg( + "PullFeed.fetchUpdateConsensusIx Failure: No oracle responses".to_string(), + )); + } + if price_signatures.median_responses.is_empty() { + return Err(anyhow::Error::msg( + "PullFeed.fetchUpdateConsensusIx Failure: No success responses found".to_string(), + )); + } + let oracle_keys: Vec = price_signatures + .oracle_responses + .iter() + .map(|x| { + Pubkey::new_from_array( + hex::decode(x.feed_responses.first().unwrap().oracle_pubkey.clone()) + .unwrap_or_default() + .try_into() + .unwrap(), + ) + }) + .collect(); + // Map the gateway oracle responses to our SecpSignature struct. + let secp_signatures: Vec = price_signatures + .oracle_responses + .iter() + .map(|oracle_response| SecpSignature { + eth_address: hex::decode(&oracle_response.eth_address) + .unwrap() + .try_into() + .expect("slice with incorrect length"), + signature: base64 + .decode(&oracle_response.signature) + .unwrap() + .try_into() + .expect("slice with incorrect length"), + message: base64 + .decode(&oracle_response.checksum) + .unwrap() + .try_into() + .expect("slice with incorrect length"), + recovery_id: oracle_response.recovery_id as u8, + }) + .collect(); + + // Build the secp256k1 instruction: + let secp_ix = Secp256k1InstructionUtils::build_secp256k1_instruction(&secp_signatures, 0) + .map_err(|_| { + anyhow!("Feed failed to produce signatures: Failed to build secp256k1 instruction") + })?; + + // Match each median response to its corresponding feed account by comparing feed hashes. + let feed_pubkeys: Vec = price_signatures + .median_responses + .iter() + .map(|median_response| { + let matching = feed_datas.iter().find(|(_, data)| { + let feed_hash_hex = hex::encode(data.feed_hash); + feed_hash_hex == median_response.feed_hash + }); + if let Some((feed, _)) = matching { + **feed + } else { + if params.debug.unwrap_or(false) { + eprintln!("Feed not found for hash: {}", median_response.feed_hash); + } + Pubkey::default() + } + }) + .collect(); + + // Attach feed accounts and oracle accounts (plus their stats accounts) as remaining accounts. + for feed in &feed_pubkeys { + remaining_accounts.push(anchor_client::solana_sdk::instruction::AccountMeta::new(feed.to_bytes().into(), false)); + } + for oracle in oracle_keys.iter() { + remaining_accounts.push(anchor_client::solana_sdk::instruction::AccountMeta::new_readonly(oracle.to_bytes().into(), false)); + let stats_key = OracleAccountData::stats_key(oracle); + remaining_accounts.push(anchor_client::solana_sdk::instruction::AccountMeta::new(stats_key.to_bytes().into(), false)); + } + // Load lookup tables for oracle, feed, and queue accounts concurrently. + let queue_key = [queue]; + let (oracle_luts_result, pull_feed_luts_result, queue_lut_result) = join!( + fetch_and_cache_luts::(client, context.clone(), &oracle_keys), + fetch_and_cache_luts::(client, context.clone(), ¶ms.feeds), + fetch_and_cache_luts::(client, context.clone(), &queue_key) + ); + + // Handle the results after they are all awaited + let oracle_luts = oracle_luts_result?; + let pull_feed_luts = pull_feed_luts_result?; + let queue_lut = queue_lut_result?; + + let mut luts = oracle_luts; + luts.extend(pull_feed_luts); + luts.extend(queue_lut); + + // Construct the instruction that updates the feed consensus using the consensus payload. + let mut submit_ix = Instruction { + program_id: get_switchboard_on_demand_program_id(), + data: consensus_ix_data.data(), + accounts: PullFeedSubmitResponseConsensus { + queue, + program_state: State::key(), + recent_slothashes: crate::solana_sdk::sysvar::slot_hashes::ID.to_bytes().into(), + payer: params.payer, + system_program: SYSTEM_PROGRAM_ID, + reward_vault: get_associated_token_address(&queue, &NATIVE_MINT), + token_program: *SPL_TOKEN_PROGRAM_ID, + token_mint: *NATIVE_MINT, + } + .to_account_metas(None) + .into_iter() + .map(|meta| anchor_client::solana_sdk::instruction::AccountMeta { + pubkey: meta.pubkey.to_bytes().into(), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + }; + submit_ix.accounts.extend(remaining_accounts); + let ixs = vec![secp_ix, submit_ix]; + + Ok((ixs, luts)) + } +} diff --git a/programs/switchboard-on-demand/src/client/recent_slothashes.rs b/programs/switchboard-on-demand/src/client/recent_slothashes.rs new file mode 100644 index 0000000000..8491e6f45d --- /dev/null +++ b/programs/switchboard-on-demand/src/client/recent_slothashes.rs @@ -0,0 +1,47 @@ +use anyhow::Context; +use anyhow::Error as AnyhowError; +use arrayref::array_ref; +use bytemuck; +use crate::solana_compat::solana_client::nonblocking::rpc_client::RpcClient; +use crate::solana_compat::solana_client::rpc_config::RpcAccountInfoConfig; +use crate::solana_compat::solana_sdk::commitment_config::CommitmentConfig; +use std::result::Result; + +#[repr(C)] +#[derive(bytemuck::Pod, bytemuck::Zeroable, Debug, Clone, Copy)] +pub struct SlotHash { + pub slot: u64, + pub hash: [u8; 32], +} + +impl SlotHash { + /// Returns the base58-encoded hash as a `String`. + pub fn to_base58_hash(&self) -> String { + bs58::encode(self.hash).into_string() + } +} + +pub struct SlotHashSysvar; +impl SlotHashSysvar { + pub async fn get_latest_slothash(client: &RpcClient) -> Result { + let slot_hashes_id = anchor_client::solana_sdk::sysvar::slot_hashes::ID; + let config = RpcAccountInfoConfig { + commitment: Some(CommitmentConfig::confirmed()), + ..Default::default() + }; + let slots_data = client + .get_account_with_config( + &slot_hashes_id.to_bytes().into(), + config, + ) + .await + .context("Failed to fetch slot hashes")? + .value + .context("Failed to fetch slot hashes")? + .data; + let slots: &[u8] = array_ref![slots_data, 8, 20_480]; + // 20_480 / 40 = 512 + let slots: &[SlotHash] = bytemuck::cast_slice::(slots); + Ok(slots[0]) + } +} diff --git a/programs/switchboard-on-demand/src/client/secp256k1.rs b/programs/switchboard-on-demand/src/client/secp256k1.rs new file mode 100644 index 0000000000..602c0d377f --- /dev/null +++ b/programs/switchboard-on-demand/src/client/secp256k1.rs @@ -0,0 +1,128 @@ +use anchor_client::solana_sdk::instruction::Instruction; +use anchor_client::solana_sdk::secp256k1_program; + +// Constants per Solana's secp256k1 instruction specification: +const SIGNATURE_SERIALIZED_SIZE: usize = 64; +const HASHED_PUBKEY_SERIALIZED_SIZE: usize = 20; +const SIGNATURE_OFFSETS_SERIALIZED_SIZE: usize = 11; + +/// This struct holds a single secp256k1 signature bundle. +#[derive(Clone)] +pub struct SecpSignature { + pub signature: [u8; SIGNATURE_SERIALIZED_SIZE], + pub recovery_id: u8, + pub eth_address: [u8; HASHED_PUBKEY_SERIALIZED_SIZE], + pub message: Vec, +} + +pub struct Secp256k1InstructionUtils; + +impl Secp256k1InstructionUtils { + /// Builds a secp256k1 verification instruction using the provided signatures. + /// + /// # Arguments + /// + /// * `signatures` - A slice of [`SecpSignature`] which must all share the same message. + /// * `instruction_index` - The instruction index to encode (usually 0). + /// + /// # Returns + /// + /// A [`Result`] with the constructed [`Instruction`] on success. + pub fn build_secp256k1_instruction( + signatures: &[SecpSignature], + instruction_index: u8, + ) -> Result> { + // Use your function to produce the raw instruction data. + let data = make_secp256k1_instruction_data_unique_message(signatures, instruction_index)?; + Ok(Instruction { + program_id: secp256k1_program::ID, + accounts: vec![], + data, + }) + } +} + +/// Constructs secp256k1 instruction data that bundles multiple signatures with a single common message. +pub fn make_secp256k1_instruction_data_unique_message( + signatures: &[SecpSignature], + instruction_index: u8, +) -> std::result::Result, Box> { + if signatures.is_empty() { + return Err("No signatures provided".into()); + } + // Ensure that every signature in the slice has the same message. + let common_message = &signatures[0].message; + for sig in signatures.iter() { + if sig.message != *common_message { + return Err("Not all signatures share the same message".into()); + } + } + let message_size = common_message.len(); + // For each signature block, we now only include: + // - Signature (64 bytes) + // - Recovery ID (1 byte) + // - Ethereum address (20 bytes) + // Total = 85 bytes per signature. + let signature_block_size = SIGNATURE_SERIALIZED_SIZE + 1 + HASHED_PUBKEY_SERIALIZED_SIZE; + let count = signatures.len(); + // The offsets area comes first: 1 byte for count + count * 11 bytes. + let offsets_area_size = 1 + count * SIGNATURE_OFFSETS_SERIALIZED_SIZE; + // The signature blocks will take up count * signature_block_size bytes. + // Then, we append the common message once. + // The message offset (for every signature) will be the same, equal to: + let message_offset = offsets_area_size + count * signature_block_size; + + let mut signature_offsets = Vec::with_capacity(count); + let mut signature_buffer = Vec::new(); + + for sig in signatures { + // For this signature block, compute its starting offset relative to the start of the instruction data. + let current_offset = offsets_area_size + signature_buffer.len(); + let signature_offset = current_offset; // where the 64-byte signature begins + let eth_address_offset = current_offset + SIGNATURE_SERIALIZED_SIZE + 1; // after signature and recovery id + + // The message is stored only once (after all signature blocks). + let message_data_offset = message_offset; + let message_data_size = message_size; // size of the common message + + // Convert to u16 + let signature_offset = u16::try_from(signature_offset)?; + let eth_address_offset = u16::try_from(eth_address_offset)?; + let message_data_offset = u16::try_from(message_data_offset)?; + let message_data_size = u16::try_from(message_data_size)?; + + let mut offsets_bytes = Vec::with_capacity(SIGNATURE_OFFSETS_SERIALIZED_SIZE); + offsets_bytes.extend(&signature_offset.to_le_bytes()); + offsets_bytes.push(instruction_index); // signature_instruction_index + offsets_bytes.extend(ð_address_offset.to_le_bytes()); + offsets_bytes.push(instruction_index); // eth_address_instruction_index + offsets_bytes.extend(&message_data_offset.to_le_bytes()); + offsets_bytes.extend(&message_data_size.to_le_bytes()); + offsets_bytes.push(instruction_index); // message_instruction_index + + if offsets_bytes.len() != SIGNATURE_OFFSETS_SERIALIZED_SIZE { + return Err("Invalid offsets length".into()); + } + signature_offsets.push(offsets_bytes); + + // Append the signature block (without the message) + signature_buffer.extend(&sig.signature); + signature_buffer.push(sig.recovery_id); + signature_buffer.extend(&sig.eth_address); + // Do not append the message here. + } + + // Build the final instruction data: + // 1. Count byte + let mut instr_data = vec![count as u8]; + // 2. Offsets area + for offs in signature_offsets { + instr_data.extend(offs); + } + // 3. Signature blocks + instr_data.extend(signature_buffer); + // 4. Common message (only one copy) + instr_data.extend(common_message); + + Ok(instr_data) +} diff --git a/programs/switchboard-on-demand/src/client/transaction_builder.rs b/programs/switchboard-on-demand/src/client/transaction_builder.rs new file mode 100644 index 0000000000..ac657d0e66 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/transaction_builder.rs @@ -0,0 +1,856 @@ +use crate::*; + +use crate::Pubkey; +use crate::solana_program::instruction::{Instruction, AccountMeta}; +use anchor_client::solana_sdk::address_lookup_table::state::AddressLookupTable; +use anchor_client::solana_client::nonblocking::rpc_client::RpcClient; +use anchor_client::solana_sdk::address_lookup_table::AddressLookupTableAccount; +use crate::solana_program::hash::Hash; +use anchor_client::solana_sdk::compute_budget::ComputeBudgetInstruction; +use anchor_client::solana_sdk::signer::Signer; +use anchor_client::solana_sdk::transaction::VersionedTransaction; +use tokio::sync::RwLockReadGuard; +use std::ops::Deref; +use std::sync::Arc; +use anchor_client::solana_sdk::transaction::Transaction; +pub use anchor_client::solana_sdk::signer::keypair::Keypair; + +/// A trait for types that can act as signers for transactions. +pub trait AsSigner: Send + Sync { + /// Returns a reference to the signer. + fn as_signer(&self) -> &dyn Signer; + + fn signer_pubkey(&self) -> Pubkey { + let anchor_pubkey = self.as_signer().pubkey(); + Pubkey::new_from_array(anchor_pubkey.to_bytes()) + } +} + +pub trait ToKeypair: Send + Sync { + fn keypair(&self) -> &Keypair; +} + +// Implement AsSigner for any type that implements ToKeypair +impl AsSigner for T +where + T: ToKeypair, +{ + fn as_signer(&self) -> &dyn Signer { + // Use the keypair method from the ToKeypair trait to get the Keypair + // and then return a reference to it as a &dyn Signer. + // The Keypair struct already implements the Signer trait. + self.keypair() + } +} + +// Implementations + +impl ToKeypair for Keypair { + fn keypair(&self) -> &Keypair { + self + } +} +impl<'a> ToKeypair for &'a Keypair { + fn keypair(&self) -> &'a Keypair { + self + } +} + +// Arc + +impl ToKeypair for Arc { + fn keypair(&self) -> &Keypair { + self.as_ref() + } +} +impl AsSigner for Arc<&Keypair> { + fn as_signer(&self) -> &dyn Signer { + *self.as_ref() + } +} +impl ToKeypair for &Arc { + fn keypair(&self) -> &Keypair { + self.as_ref() + } +} +impl ToKeypair for Arc> { + fn keypair(&self) -> &Keypair { + self + } +} +impl ToKeypair for Arc>> { + fn keypair(&self) -> &Keypair { + self + } +} + +// Box + +impl ToKeypair for Box +where + T: ToKeypair + ?Sized, +{ + fn keypair(&self) -> &Keypair { + self.as_ref().keypair() + } +} + +// Tokio RwLock + +impl<'a, T> ToKeypair for RwLockReadGuard<'a, T> +where + T: ToKeypair + ?Sized, +{ + fn keypair(&self) -> &Keypair { + self.deref().keypair() + } +} + +impl<'a, T> ToKeypair for Arc> +where + T: ToKeypair + ?Sized, +{ + fn keypair(&self) -> &Keypair { + self.as_ref().keypair() + } +} + +impl<'a> AsSigner for &RwLockReadGuard<'a, Keypair> { + fn as_signer(&self) -> &dyn Signer { + (*self).deref() + } +} +impl<'a> AsSigner for &Arc> { + fn as_signer(&self) -> &dyn Signer { + self.as_ref().deref() + } +} + +/// Represents a transaction object used for building Solana transactions. +/// +/// The `TransactionBuilder` struct provides methods for constructing and manipulating Solana transactions. +/// It allows setting the payer, adding instructions, signers, and other transaction parameters. +/// The transaction can be converted to a legacy transaction format or executed directly using the Solana RPC client. +/// +/// # Examples +/// +/// Creating a new transaction object with a payer: +/// +/// ```rust +/// use anchor_client::solana_sdk::pubkey::Pubkey; +/// use anchor_client::solana_sdk::instruction::Instruction; +/// use std::sync::Arc; +/// +/// let payer = Pubkey::new_unique(); +/// let transaction = TransactionBuilder::new(payer); +/// ``` +/// +/// Adding an instruction to the transaction: +/// +/// ```rust +/// use anchor_client::solana_sdk::pubkey::Pubkey; +/// use anchor_client::solana_sdk::instruction::Instruction; +/// use std::sync::Arc; +/// +/// let payer = Pubkey::new_unique(); +/// let instruction = Instruction::new_with_bincode(program_id, data); +/// let transaction = TransactionBuilder::new(payer) +/// .add_ix(instruction); +/// ``` +/// +/// Converting the transaction object to a legacy transaction: +/// +/// ```rust +/// use anchor_client::solana_sdk::pubkey::Pubkey; +/// use anchor_client::solana_sdk::instruction::Instruction; +/// use std::sync::Arc; +/// +/// let payer = Pubkey::new_unique(); +/// let instruction = Instruction::new_with_bincode(program_id, data); +/// let transaction = TransactionBuilder::new(payer) +/// .add_ix(instruction) +/// .to_legacy_tx(); +/// ``` +#[derive(Default, Clone)] +pub struct TransactionBuilder { + payer: Pubkey, + ixs: Vec, + compute_units: Option, + priority_fees: Option, + recent_blockhash: Option, + min_context_slot: Option, + address_lookup_tables: Vec, + signers: Vec>, +} +impl TransactionBuilder { + pub fn new(payer: Pubkey) -> Self { + Self { + payer, + ..Default::default() + } + } + pub fn new_with_payer(payer: Arc) -> Self { + Self { + payer: payer.signer_pubkey(), + signers: vec![Arc::clone(&payer)], + ..Default::default() + } + } + + pub fn new_with_ixs(payer: Pubkey, ixs: impl IntoIterator) -> Self { + Self { + payer, + ixs: ixs.into_iter().collect::>(), + ..Default::default() + } + } + pub fn new_with_payer_and_ixs( + payer: Arc, + ixs: impl IntoIterator, + ) -> Self { + Self { + payer: payer.signer_pubkey(), + signers: vec![Arc::clone(&payer)], + ixs: ixs.into_iter().collect::>(), + ..Default::default() + } + } + + // Builder methods, consumes self and returns self + pub fn set_compute_units(mut self, compute_units: u32) -> Self { + self.compute_units = Some(compute_units); + self + } + pub fn set_priority_fees(mut self, priority_fees: u64) -> Self { + self.priority_fees = Some(priority_fees); + self + } + pub fn add_ix(mut self, ix: Instruction) -> Self { + self.ixs.push(ix); + self + } + pub fn has_signer(&self, signer: Pubkey) -> bool { + self.signers + .iter() + .any(|s| s.as_signer().pubkey().to_bytes() == signer.to_bytes()) + } + pub fn has_payer(&self) -> bool { + self.has_signer(self.payer) + } + pub fn add_signer(mut self, signer: Arc) -> TransactionBuilder { + let signer_key = signer.as_signer().pubkey(); + if !self + .signers + .iter().any(|s| s.as_signer().pubkey() == signer_key) + { + self.signers.push(Arc::clone(&signer)); + } + + self + } + pub fn add_signers(mut self, signers: Vec>) -> TransactionBuilder { + for signer in signers { + let signer_key = signer.as_signer().pubkey(); + if !self + .signers + .iter().any(|s| s.as_signer().pubkey() == signer_key) + { + self.signers.push(Arc::clone(&signer)); + } + } + + self + } + pub fn set_recent_blockhash(mut self, blockhash: Hash) -> Self { + self.recent_blockhash = Some(blockhash); + self + } + pub fn set_min_context_slot(mut self, min_context_slot: u64) -> Self { + self.min_context_slot = Some(min_context_slot); + self + } + + pub fn add_address_lookup_account( + mut self, + address_lookup_table: AddressLookupTableAccount, + ) -> Self { + self.address_lookup_tables.push(address_lookup_table); + self + } + pub fn add_address_lookup_accounts( + mut self, + address_lookup_tables: &mut Vec, + ) -> Self { + self.address_lookup_tables + .append(address_lookup_tables); + self + } + pub async fn add_address_lookup_table( + mut self, + rpc: &RpcClient, + address_lookup_table_pubkey: Pubkey, + ) -> Self { + if let Ok(address_lookup_table) = + TransactionBuilder::fetch_address_lookup_account(rpc, address_lookup_table_pubkey).await + { + self = self.add_address_lookup_account(address_lookup_table); + } + + self + } + pub async fn add_address_lookup_tables( + mut self, + rpc: &RpcClient, + address_lookup_table_pubkeys: Vec, + ) -> Self { + if let Ok(mut address_lookup_tables) = + TransactionBuilder::fetch_multiple_address_lookup_accounts( + rpc, + address_lookup_table_pubkeys, + ) + .await + { + self = self.add_address_lookup_accounts(&mut address_lookup_tables); + } + + self + } + + // Getters + pub fn payer(&self) -> Pubkey { + self.payer + } + + /// Return a vec of all of the required signers for the transaction. + pub fn required_signers(&self) -> Vec { + let mut signers_required: Vec = vec![]; + for ixn in self.ixs.clone() { + for account in ixn.accounts { + if account.is_signer && !signers_required.contains(&account.pubkey) { + signers_required.push(account.pubkey); + } + } + } + signers_required + } + + /// Returns the stored signers for the transaction, removing any un-needed signers using the provided ixn's AccountMeta's. + pub fn signers(&self) -> Result, OnDemandError> { + let mut signers: Vec<&dyn Signer> = vec![]; + for required_signer in self.required_signers().iter() { + let mut found = false; + + for signer in &self.signers { + let signer_key = signer.as_signer().pubkey(); + if signer_key.to_bytes() == required_signer.to_bytes() { + found = true; + signers.push(signer.as_signer()); + break; + } + } + if !found { + return Err(OnDemandError::SolanaMissingSigner); + } + } + + Ok(signers) + } + fn signers_with_payer<'a, T: AsSigner>( + &'a self, + payer: &'a T, + ) -> Result, OnDemandError> { + let payer_signer = payer.as_signer(); + + if payer_signer.pubkey().to_bytes() != self.payer.to_bytes() { + return Err(OnDemandError::SolanaPayerMismatch); + } + + let mut signers: Vec<&dyn Signer> = vec![]; + for required_signer in self.required_signers().iter() { + if required_signer == &self.payer { + signers.push(payer_signer); + continue; + } + + let mut found = false; + + for signer in self.signers.iter() { + let signer_key = signer.as_signer().pubkey(); + if signer_key.to_bytes() == required_signer.to_bytes() { + found = true; + signers.push(signer.as_signer()); + break; + } + } + if !found { + return Err(OnDemandError::SolanaMissingSigner); + } + } + + Ok(signers) + } + pub fn ixs(&self) -> Result, OnDemandError> { + if self.ixs.is_empty() { + return Err(OnDemandError::SolanaInstructionsEmpty); + } + + let mut pre_ixs = vec![]; + + if let Some(compute_units) = self.compute_units { + pre_ixs.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_units.clamp(200_000, 1_400_000), + )); + } + // want this first so we unshift last + if let Some(priority_fees) = self.priority_fees { + pre_ixs.push(ComputeBudgetInstruction::set_compute_unit_price( + std::cmp::min(10_000, priority_fees), + )); + } + + // Convert pre_ixs to compatible type + let converted_pre_ixs: Vec = pre_ixs.iter().map(|ix| { + Instruction { + program_id: ix.program_id.to_bytes().into(), + accounts: ix.accounts.iter().map(|acc| AccountMeta { + pubkey: acc.pubkey.to_bytes().into(), + is_signer: acc.is_signer, + is_writable: acc.is_writable, + }).collect(), + data: ix.data.clone(), + } + }).collect(); + + let ixs = [converted_pre_ixs, self.ixs.clone()].concat(); + + if ixs.len() > 10 { + return Err(OnDemandError::SolanaInstructionOverflow); + } + + Ok(ixs) + } + pub fn build_legacy_tx( + payer: Pubkey, + ixs: Vec, + signers: Vec<&dyn Signer>, + recent_blockhash: Hash, + ) -> Result { + // Convert to anchor-client types + let converted_ixs: Vec = ixs.iter().map(|ix| { + anchor_client::solana_sdk::instruction::Instruction { + program_id: ix.program_id.to_bytes().into(), + accounts: ix.accounts.iter().map(|acc| anchor_client::solana_sdk::instruction::AccountMeta { + pubkey: acc.pubkey.to_bytes().into(), + is_signer: acc.is_signer, + is_writable: acc.is_writable, + }).collect(), + data: ix.data.clone(), + } + }).collect(); + let converted_payer: anchor_client::solana_sdk::pubkey::Pubkey = payer.to_bytes().into(); + let converted_blockhash: anchor_client::solana_sdk::hash::Hash = recent_blockhash.to_bytes().into(); + + let mut tx = Transaction::new_with_payer(&converted_ixs, Some(&converted_payer)); + tx.try_sign(&signers, converted_blockhash).map_err(|_| OnDemandError::SolanaSignError)?; + Ok(tx) + } + pub fn to_legacy_tx(&self) -> Result { + if !self.has_payer() { + return Err(OnDemandError::SolanaPayerSignerMissing); + } + + TransactionBuilder::build_legacy_tx( + self.payer, + self.ixs()?, + self.signers()?, + self.recent_blockhash.unwrap_or_default(), + ) + } + pub fn to_legacy_tx_with_payer( + &self, + payer: T, + ) -> Result { + if payer.as_signer().pubkey().to_bytes() != self.payer.to_bytes() { + return Err(OnDemandError::SolanaPayerMismatch); + } + + TransactionBuilder::build_legacy_tx( + self.payer, + self.ixs()?, + self.signers_with_payer(&payer)?, + self.recent_blockhash.unwrap_or_default(), + ) + } + pub fn to_legacy_tx_with_payer_and_blockhash( + &self, + payer: T, + recent_blockhash: Option, + ) -> Result { + if payer.as_signer().pubkey().to_bytes() != self.payer.to_bytes() { + return Err(OnDemandError::SolanaPayerMismatch); + } + + TransactionBuilder::build_legacy_tx( + self.payer, + self.ixs()?, + self.signers_with_payer(&payer)?, + recent_blockhash.unwrap_or(self.recent_blockhash.unwrap_or_default()), + ) + } + pub fn to_legacy_tx_with_blockhash( + &self, + recent_blockhash: Option, + ) -> Result { + TransactionBuilder::build_legacy_tx( + self.payer, + self.ixs()?, + self.signers()?, + self.recent_blockhash + .unwrap_or(recent_blockhash.unwrap_or_default()), + ) + } + + pub async fn fetch_address_lookup_account( + rpc: &RpcClient, + address_lookup_table_pubkey: Pubkey, + ) -> Result { + let converted_pubkey: anchor_client::solana_sdk::pubkey::Pubkey = address_lookup_table_pubkey.to_bytes().into(); + let account = rpc + .get_account(&converted_pubkey) + .await + .map_err(|_e| OnDemandError::NetworkError)?; + let address_lookup_table = + AddressLookupTable::deserialize(&account.data).map_err(|_| OnDemandError::AccountDeserializeError)?; + let address_lookup_table_account = AddressLookupTableAccount { + key: address_lookup_table_pubkey.to_bytes().into(), + addresses: address_lookup_table.addresses.to_vec(), + }; + Ok(address_lookup_table_account) + } + + pub async fn fetch_multiple_address_lookup_accounts( + rpc: &RpcClient, + address_lookup_pubkeys: Vec, + ) -> Result, OnDemandError> { + let address_lookup_accounts: Vec = + if address_lookup_pubkeys.is_empty() { + vec![] + } else { + let converted_pubkeys: Vec = address_lookup_pubkeys.iter().map(|pk| pk.to_bytes().into()).collect(); + let accounts = rpc + .get_multiple_accounts(&converted_pubkeys) + .await + .map_err(|_| OnDemandError::NetworkError)?; + + let mut address_lookup_accounts: Vec = vec![]; + for (i, account) in accounts.iter().enumerate() { + let account = account.as_ref().ok_or(OnDemandError::AccountNotFound)?; + let address_lookup_table = AddressLookupTable::deserialize(&account.data) + .map_err(|_| OnDemandError::AccountDeserializeError)?; + let address_lookup_table_account = AddressLookupTableAccount { + key: address_lookup_pubkeys[i].to_bytes().into(), + addresses: address_lookup_table.addresses.to_vec(), + }; + address_lookup_accounts.push(address_lookup_table_account); + } + + address_lookup_accounts + }; + + Ok(address_lookup_accounts) + } + + pub fn build_v0_tx( + payer: Pubkey, + ixs: Vec, + signers: Vec<&dyn Signer>, + address_lookup_accounts: Vec, + recent_blockhash: Hash, + ) -> Result { + // Convert types directly for solana_sdk compatibility + let converted_payer: anchor_client::solana_sdk::pubkey::Pubkey = payer.to_bytes().into(); + let converted_ixs: Vec = ixs.iter().map(|ix| { + anchor_client::solana_sdk::instruction::Instruction { + program_id: ix.program_id.to_bytes().into(), + accounts: ix.accounts.iter().map(|acc| anchor_client::solana_sdk::instruction::AccountMeta { + pubkey: acc.pubkey.to_bytes().into(), + is_signer: acc.is_signer, + is_writable: acc.is_writable, + }).collect(), + data: ix.data.clone(), + } + }).collect(); + let converted_lookup_accounts: Vec = address_lookup_accounts.iter().map(|lut| { + anchor_client::solana_sdk::message::AddressLookupTableAccount { + key: lut.key.to_bytes().into(), + addresses: lut.addresses.iter().map(|addr| addr.to_bytes().into()).collect(), + } + }).collect(); + let converted_blockhash: anchor_client::solana_sdk::hash::Hash = anchor_client::solana_sdk::hash::Hash::new_from_array(recent_blockhash.to_bytes()); + + let v0_message = anchor_client::solana_sdk::message::v0::Message::try_compile( + &converted_payer, + &converted_ixs, + &converted_lookup_accounts, + converted_blockhash + ).unwrap(); + + let v0_tx = VersionedTransaction::try_new(anchor_client::solana_sdk::message::VersionedMessage::V0(v0_message), &signers) + .unwrap(); + + Ok(v0_tx) + } + + pub fn to_v0_tx(&self) -> Result { + TransactionBuilder::build_v0_tx( + self.payer, + self.ixs()?, + self.signers()?, + self.address_lookup_tables.clone(), + self.recent_blockhash.unwrap_or_default(), + ) + } + + pub fn to_v0_tx_with_payer( + &self, + payer: T, + ) -> Result { + if payer.as_signer().pubkey().to_bytes() != self.payer.to_bytes() { + return Err(OnDemandError::SolanaPayerMismatch); + } + + TransactionBuilder::build_v0_tx( + self.payer, + self.ixs()?, + self.signers_with_payer(&payer)?, + self.address_lookup_tables.clone(), + self.recent_blockhash.unwrap_or_default(), + ) + } +} + +impl TryFrom for Transaction { + type Error = OnDemandError; + + fn try_from(builder: TransactionBuilder) -> Result { + builder.to_legacy_tx() + } +} + +impl TryFrom for VersionedTransaction { + type Error = OnDemandError; + + fn try_from(builder: TransactionBuilder) -> Result { + builder.to_v0_tx() + } +} +// Types for TypeState builder pattern + +// #[derive(Default, Clone)] +// pub struct EmptyIxs; + +// #[derive(Default, Clone)] +// pub struct TransactionIxs(Vec); + +// #[derive(Default, Clone)] +// pub struct TransactionBuilderV0 { +// payer: Pubkey, +// ixs: U, +// compute_units: Option, +// priority_fees: Option, +// recent_blockhash: Option, +// min_context_slot: Option, +// address_lookup_tables: Vec, +// signers: Vec>, +// } +// impl TransactionBuilderV0 { +// pub fn new(payer: Pubkey) -> Self { +// Self { +// payer, +// ..Default::default() +// } +// } + +// pub fn add_ix(&self, ix: Instruction) -> TransactionBuilderV0 { +// TransactionBuilderV0 { +// payer: self.payer, +// ixs: TransactionIxs(vec![ix]), +// compute_units: self.compute_units, +// priority_fees: self.priority_fees, +// recent_blockhash: self.recent_blockhash, +// min_context_slot: self.min_context_slot, +// address_lookup_tables: self.address_lookup_tables.clone(), +// signers: self.signers.clone(), +// } +// } +// } + +#[cfg(test)] +mod tests { + use super::*; + use ::solana_program::instruction::AccountMeta; + use anchor_client::solana_sdk::signer::keypair::Keypair; + use tokio::sync::{OnceCell, RwLock}; + + // #[test] + // fn test_missing_signer() { + // let program_id = Pubkey::new_unique(); + // let payer = Arc::new(Keypair::new()); + // let missing_signer = Arc::new(Keypair::new()); +// + // let ixn = Instruction::new_with_bytes( + // program_id, + // &vec![1u8, 2u8, 3u8, 4u8], + // vec![ + // AccountMeta::new(payer.pubkey(), true), + // AccountMeta::new_readonly(missing_signer.pubkey(), true), // missing signer here + // AccountMeta::new_readonly(Pubkey::new_unique(), false), + // ], + // ); +// + // let mut tx = TransactionBuilder::new(payer.pubkey()).add_ix(ixn); +// + // assert_eq!(tx.ixs().unwrap_or_default().len(), 1); + // assert_eq!(tx.payer(), payer.pubkey()); + // assert!(!tx.has_payer()); +// + // // 1. Should fail with missing payer + // let to_tx_result = tx.to_legacy_tx(); + // assert!(to_tx_result.is_err()); +// + // if let OnDemandError::SolanaPayerSignerMissing(expected_payer) = + // to_tx_result.as_ref().unwrap_err() + // { + // if *expected_payer != payer.pubkey().to_string() { + // panic!("Unexpected error message: {}", to_tx_result.unwrap_err()) + // } + // } else { + // panic!("Unexpected error: {:?}", to_tx_result.unwrap_err()) + // } +// + // // 2. Should fail with missing signer + // let to_tx_result = tx.to_legacy_tx_with_payer(payer.clone()); + // assert!(to_tx_result.is_err()); +// + // if let OnDemandError::SolanaMissingSigner(signer) = to_tx_result.as_ref().unwrap_err() { + // if *signer != missing_signer.pubkey().to_string() { + // panic!("Unexpected error message: {}", to_tx_result.unwrap_err()) + // } + // } else { + // panic!("Unexpected error: {:?}", to_tx_result.unwrap_err()) + // } +// + // // 3. Should succeed with missing signer added + // tx = tx.add_signer(missing_signer); + // let to_tx_result = tx.to_legacy_tx_with_payer(payer.clone()); + // assert!(to_tx_result.is_ok()); + // } + + #[test] + fn test_add_compute_budget_ixs() { + let payer = Arc::new(Keypair::new()); + let payer_pubkey = payer.pubkey(); + let payer_pubkey_converted = ::solana_program::pubkey::Pubkey::new_from_array(payer_pubkey.to_bytes()); + + let tx = TransactionBuilder::new_with_payer(payer.clone()) + .add_ix(Instruction::new_with_bytes( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_pubkey_converted, true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000); + assert_eq!(tx.ixs().unwrap_or_default().len(), 2); + + let tx = TransactionBuilder::new_with_payer(payer.clone()) + .add_ix(Instruction::new_with_bytes( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_pubkey_converted, true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_priority_fees(500); + assert_eq!(tx.ixs().unwrap_or_default().len(), 2); + + let tx = TransactionBuilder::new_with_payer(payer.clone()) + .add_ix(Instruction::new_with_bytes( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_pubkey_converted, true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000) + .set_priority_fees(500); + assert_eq!(tx.ixs().unwrap_or_default().len(), 3); + } + + #[test] + fn test_transaction_builder_with_arc_payer() { + let payer = Arc::new(Keypair::new()); + + let tx = TransactionBuilder::new_with_payer(payer.clone()) + .add_ix(Instruction::new_with_bytes( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer.signer_pubkey(), true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000); + + assert_eq!(tx.payer.to_bytes(), payer.pubkey().to_bytes()); + } + + pub static PAYER_KEYPAIR: OnceCell>>> = OnceCell::const_new(); + + async fn get_payer_keypair() -> &'static Arc>> { + PAYER_KEYPAIR + .get_or_init(|| async { Arc::new(RwLock::new(Arc::new(Keypair::new()))) }) + .await + } + + #[tokio::test] + async fn test_transaction_builder_with_rwlock_payer() { + let payer = get_payer_keypair().await; + let payer_arc = payer.read().await.clone(); + + let tx = TransactionBuilder::new_with_payer(payer_arc.clone()) + .add_ix(Instruction::new_with_bytes( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_arc.signer_pubkey(), true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000); + + assert_eq!(tx.payer.to_bytes(), payer_arc.pubkey().to_bytes()); + } + + #[tokio::test] + async fn test_transaction_builder_with_arcswap_payer() { + let payer = arc_swap::ArcSwap::new(Arc::new(Keypair::new())); + let payer_arc = payer.load(); + + let tx = TransactionBuilder::new_with_payer(payer_arc.clone()) + .add_ix(Instruction::new_with_bytes( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_arc.signer_pubkey(), true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000); + + assert_eq!(tx.payer.to_bytes(), payer_arc.pubkey().to_bytes()); + } +} diff --git a/programs/switchboard-on-demand/src/client/utils.rs b/programs/switchboard-on-demand/src/client/utils.rs new file mode 100644 index 0000000000..1eb2f8c6d4 --- /dev/null +++ b/programs/switchboard-on-demand/src/client/utils.rs @@ -0,0 +1,434 @@ +use crate::prelude::*; +use anyhow::anyhow; +use sha2::{Digest, Sha256}; +use anchor_client::solana_sdk::client::SyncClient; +use anchor_client::solana_sdk::signer::keypair::{keypair_from_seed, read_keypair_file, Keypair}; +use anchor_client::solana_sdk::signer::Signer; +use std::env; +use std::result::Result; +use std::str::FromStr; +use std::sync::Arc; +use tokio::sync::RwLock; +use anchor_client::solana_sdk::transaction::Transaction; +use crate::anchor_traits::*; +use crate::Pubkey; +use anchor_client::anchor_lang::AccountDeserialize; +use anyhow::Error as AnyhowError; +use anchor_client::solana_sdk::message::v0::Message as V0Message; +use anchor_client::solana_sdk::transaction::VersionedTransaction; +use anchor_client::solana_sdk::compute_budget::ComputeBudgetInstruction; +use crate::solana_program::hash::Hash; +use anchor_client::solana_client::nonblocking::rpc_client::RpcClient; +use anchor_client::solana_sdk::address_lookup_table::AddressLookupTableAccount; +use anchor_client::solana_sdk::message::VersionedMessage::V0; + +pub async fn ix_to_tx_v0( + rpc_client: &RpcClient, + ixs: &[Instruction], + signers: &[&Keypair], + blockhash: Hash, + luts: &[AddressLookupTableAccount], +) -> Result { + let payer_original = signers[0].pubkey(); + let payer: anchor_client::solana_sdk::pubkey::Pubkey = payer_original.to_bytes().into(); + + // Auto-detect Compute Unit Limit + let compute_unit_limit = estimate_compute_units(rpc_client, ixs, luts, blockhash, signers).await.unwrap_or(1_400_000); // Default to 1.4M units if estimate fails + + // Add Compute Budget Instruction (Optional but improves execution) + let cus = std::cmp::min((compute_unit_limit as f64 * 1.4) as u32, 1_400_000); + let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_limit(cus); + // TODO: make dynamic + let priority_fee_ix = ComputeBudgetInstruction::set_compute_unit_price(10_000); + + // Convert SDK instructions to program instructions + let compute_budget_ix_converted = Instruction { + program_id: compute_budget_ix.program_id.to_bytes().into(), + accounts: compute_budget_ix.accounts.iter().map(|acc| AccountMeta { + pubkey: acc.pubkey.to_bytes().into(), + is_signer: acc.is_signer, + is_writable: acc.is_writable, + }).collect(), + data: compute_budget_ix.data.clone(), + }; + + let priority_fee_ix_converted = Instruction { + program_id: priority_fee_ix.program_id.to_bytes().into(), + accounts: priority_fee_ix.accounts.iter().map(|acc| AccountMeta { + pubkey: acc.pubkey.to_bytes().into(), + is_signer: acc.is_signer, + is_writable: acc.is_writable, + }).collect(), + data: priority_fee_ix.data.clone(), + }; + + let mut final_ixs = vec![ + compute_budget_ix_converted, + priority_fee_ix_converted, + ]; + final_ixs.extend_from_slice(ixs); + + // Convert AddressLookupTableAccount types + let converted_luts: Vec = luts.iter().map(|lut| { + anchor_client::solana_sdk::message::AddressLookupTableAccount { + key: lut.key.to_bytes().into(), + addresses: lut.addresses.iter().map(|addr| addr.to_bytes().into()).collect(), + } + }).collect(); + + // Convert instructions to anchor-client types + let converted_ixs: Vec = final_ixs.iter().map(|ix| { + anchor_client::solana_sdk::instruction::Instruction { + program_id: ix.program_id.to_bytes().into(), + accounts: ix.accounts.iter().map(|acc| anchor_client::solana_sdk::instruction::AccountMeta { + pubkey: acc.pubkey.to_bytes().into(), + is_signer: acc.is_signer, + is_writable: acc.is_writable, + }).collect(), + data: ix.data.clone(), + } + }).collect(); + + // Create Message with Address Lookup Tables (ALTs) + let converted_blockhash: anchor_client::solana_sdk::hash::Hash = blockhash.to_bytes().into(); + let message = V0Message::try_compile(&payer, &converted_ixs, &converted_luts, converted_blockhash) + .map_err(|_| OnDemandError::SolanaSignError)?; + + let message = V0(message); + // if message.header().num_required_signatures as usize != signers.len() { + // // Skips all signature validation + // return Ok(VersionedTransaction { + // message: message, + // signatures: vec![], + // }) + // } + // Create Versioned Transaction + let tx = VersionedTransaction::try_new(message, signers) + .map_err(|_| OnDemandError::SolanaSignError)?; + + Ok(tx) +} + +/// Estimates Compute Unit Limit for Instructions +async fn estimate_compute_units(rpc_client: &RpcClient, ixs: &[Instruction], luts: &[AddressLookupTableAccount], blockhash: Hash, signers: &[&Keypair]) -> Result { + let payer_original = signers[0].pubkey(); + let payer: anchor_client::solana_sdk::pubkey::Pubkey = payer_original.to_bytes().into(); + let mut ixs = ixs.to_vec(); + let compute_limit_ix = ComputeBudgetInstruction::set_compute_unit_limit(1_400_000); + let compute_limit_ix_converted = Instruction { + program_id: compute_limit_ix.program_id.to_bytes().into(), + accounts: compute_limit_ix.accounts.iter().map(|acc| AccountMeta { + pubkey: acc.pubkey.to_bytes().into(), + is_signer: acc.is_signer, + is_writable: acc.is_writable, + }).collect(), + data: compute_limit_ix.data.clone(), + }; + ixs.insert(0, compute_limit_ix_converted); + + // Convert AddressLookupTableAccount types for this function too + let converted_luts: Vec = luts.iter().map(|lut| { + anchor_client::solana_sdk::message::AddressLookupTableAccount { + key: lut.key.to_bytes().into(), + addresses: lut.addresses.iter().map(|addr| addr.to_bytes().into()).collect(), + } + }).collect(); + + // Convert instructions to anchor-client types + let converted_ixs: Vec = ixs.iter().map(|ix| { + anchor_client::solana_sdk::instruction::Instruction { + program_id: ix.program_id.to_bytes().into(), + accounts: ix.accounts.iter().map(|acc| anchor_client::solana_sdk::instruction::AccountMeta { + pubkey: acc.pubkey.to_bytes().into(), + is_signer: acc.is_signer, + is_writable: acc.is_writable, + }).collect(), + data: ix.data.clone(), + } + }).collect(); + let converted_blockhash: anchor_client::solana_sdk::hash::Hash = blockhash.to_bytes().into(); + + let message = V0Message::try_compile(&payer, &converted_ixs, &converted_luts, converted_blockhash) + .map_err(|_| OnDemandError::SolanaSignError)?; + + // Create Versioned Transaction + let tx = VersionedTransaction::try_new(V0(message), signers) + .map_err(|_| OnDemandError::SolanaSignError)?; + // Simulate Transaction to Estimate Compute Usage + let sim_result = rpc_client.simulate_transaction(&tx) + .await + .map_err(|_| anyhow!("Failed to simulate transaction"))?; + + if let Some(units) = sim_result.value.units_consumed { + Ok(units as u32) + } else { + Err(anyhow!("Failed to estimate compute units")) + } +} + +pub fn ix_to_tx( + ixs: &[Instruction], + signers: &[&Keypair], + blockhash: crate::solana_program::hash::Hash, +) -> Result { + // Convert instructions to compatible type for solana_sdk + let converted_ixs: Vec = ixs.iter().map(|ix| { + anchor_client::solana_sdk::instruction::Instruction { + program_id: ix.program_id.to_bytes().into(), + accounts: ix.accounts.iter().map(|acc| anchor_client::solana_sdk::instruction::AccountMeta { + pubkey: acc.pubkey.to_bytes().into(), + is_signer: acc.is_signer, + is_writable: acc.is_writable, + }).collect(), + data: ix.data.clone(), + } + }).collect(); + + let converted_msg = anchor_client::solana_sdk::message::Message::new(&converted_ixs, Some(&signers[0].pubkey().to_bytes().into())); + let mut tx = Transaction::new_unsigned(converted_msg); + let converted_blockhash: anchor_client::solana_sdk::hash::Hash = blockhash.to_bytes().into(); + tx.try_sign(&signers.to_vec(), converted_blockhash) + .map_err(|_e| OnDemandError::SolanaSignError)?; + Ok(tx) +} + +pub async fn get_enclave_signer_pubkey( + enclave_signer: &Arc>, +) -> Result, OnDemandError> { + let enclave_signer = enclave_signer.clone(); + let ro_enclave_signer = enclave_signer.read().await; + let pubkey_bytes = ro_enclave_signer.pubkey().to_bytes(); + let pubkey = Arc::new(Pubkey::new_from_array(pubkey_bytes)); + Ok(pubkey) +} + +pub fn load_env_pubkey(key: &str) -> Result { + Pubkey::from_str(&env::var(key).unwrap_or_default()) + .map_err(|_| OnDemandError::EnvVariableMissing) +} + +/// Parse a string into an optional Pubkey. If the string is empty, return None. +pub fn parse_optional_pubkey(var: &str) -> Option { + if var.is_empty() { + None + } else { + match Pubkey::from_str(var) { + Ok(pubkey) => { + if pubkey != Pubkey::default() { + Some(pubkey) + } else { + None + } + } + Err(_) => None, + } + } +} + +/// Generates a keypair from a base seed, secret key, optional additional bytes, and an optional program ID. +/// +/// # Arguments +/// +/// * `base` - The base seed as a string. +/// * `secret_key` - The secret key as a vector of bytes. +/// * `more_bytes` - Optional additional bytes to include in the seed. +/// * `program_id` - Optional program ID to include in the seed. +/// +/// # Returns +/// +/// Returns a `Result` containing an `Arc` if the keypair is successfully derived, or an `OnDemandError` if there is an error. +/// +/// # Errors +/// +/// Returns an `OnDemandError` with the message "InvalidSecretKey" if the length of the secret key is not 32 bytes. +/// Returns an `OnDemandError` with the message "Failed to derive keypair" if there is an error deriving the keypair. +/// +/// # Example +/// +/// ```rust +/// use solana_sdk::pubkey::Pubkey; +/// use solana_sdk::signature::{Keypair, keypair_from_seed}; +/// use solana_sdk::hash::Hash; +/// use sha2::{Digest, Sha256}; +/// use std::sync::Arc; +/// use switchboard_solana::OnDemandError; +/// +/// let base = "base_seed"; +/// let secret_key = vec![0; 32]; +/// let more_bytes = Some(vec![1, 2, 3]); +/// let program_id = Some(Pubkey::new_unique()); +/// +/// let result = switchboard_solana::client::utils::keypair_from_base_seed(base, secret_key, more_bytes, program_id); +/// match result { +/// Ok(keypair) => { +/// // Key pair successfully derived +/// println!("Derived keypair: {:?}", keypair); +/// } +/// Err(error) => { +/// // Error deriving key pair +/// println!("Failed to derive keypair: {:?}", error); +/// } +/// } +/// ``` +pub fn keypair_from_base_seed( + base: &str, + secret_key: Vec, + more_bytes: Option>, + program_id: Option, +) -> Result, OnDemandError> { + if secret_key.len() != 32 { + return Err(OnDemandError::InvalidSecretKey); + } + + let mut seed = base.as_bytes().to_vec(); + seed.extend_from_slice(&secret_key); + + if let Some(bytes) = more_bytes.as_ref() { + seed.extend_from_slice(bytes); + } + + // Optionally, allow the progam ID to be included in the bytes so we + // can create new environments on different program IDs without collisions. + if let Some(program_id) = program_id.as_ref() { + seed.extend_from_slice(program_id.as_ref()); + } else { + seed.extend_from_slice(crate::get_switchboard_on_demand_program_id().as_ref()); + } + + match keypair_from_seed(&Sha256::digest(&seed)) { + Ok(keypair) => Ok(Arc::new(keypair)), + Err(e) => { + if let Some(err) = e.source() { + println!("Failed to derive keypair -- {}", err); + } + + Err(OnDemandError::KeyDerivationFailed) + } + } +} + +pub fn signer_to_pubkey(signer: Arc) -> std::result::Result { + let pubkey_bytes = signer.pubkey().to_bytes(); + Ok(Pubkey::new_from_array(pubkey_bytes)) +} + +pub fn load_keypair_fs(fs_path: &str) -> Result, OnDemandError> { + match read_keypair_file(fs_path) { + Ok(keypair) => Ok(Arc::new(keypair)), + Err(e) => { + if let Some(err) = e.source() { + println!("Failed to read keypair file -- {}", err); + } + + Err(OnDemandError::IoError) + } + } +} + +/// Fetches a zero-copy account from the Solana blockchain. +/// +/// # Arguments +/// +/// * `client` - The Solana RPC client used to interact with the blockchain. +/// * `pubkey` - The public key of the account to fetch. +/// +/// # Returns +/// +/// Returns a result containing the fetched account data as the specified type `T`, or an `OnDemandError` if an error occurs. +/// +/// # Errors +/// +/// This function can return the following errors: +/// +/// * `OnDemandError::AccountNotFound` - If the account with the specified public key is not found. +/// * `OnDemandError::Message("no discriminator found")` - If no discriminator is found in the account data. +/// * `OnDemandError::Message("Discriminator error, check the account type")` - If the discriminator in the account data does not match the expected discriminator for type `T`. +/// * `OnDemandError::Message("AnchorParseError")` - If an error occurs while parsing the account data into type `T`. +pub async fn fetch_zerocopy_account( + client: &crate::RpcClient, + pubkey: Pubkey, +) -> Result { + let data = client + .get_account_data(&pubkey.to_bytes().into()) + .await + .map_err(|_| OnDemandError::AccountNotFound)?; + + if data.len() < T::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != T::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(*bytemuck::try_from_bytes::(&data[8..]) + .map_err(|_| OnDemandError::AnchorParseError)?) +} + +/// Fetches the account data synchronously from the Solana blockchain using the provided client. +/// +/// # Arguments +/// +/// * `client` - The client used to interact with the Solana blockchain. +/// * `pubkey` - The public key of the account to fetch. +/// +/// # Generic Parameters +/// +/// * `C` - The type of the client, which must implement the `SyncClient` trait. +/// * `T` - The type of the account data, which must implement the `bytemuck::Pod`, `Discriminator`, and `Owner` traits. +/// +/// # Returns +/// +/// Returns a `Result` containing the fetched account data of type `T` if successful, or an `OnDemandError` if an error occurs. +pub fn fetch_zerocopy_account_sync( + client: &C, + pubkey: Pubkey, +) -> Result { + let data = client + .get_account_data(&pubkey.to_bytes().into()) + .map_err(|_| OnDemandError::AccountNotFound)? + .ok_or(OnDemandError::AccountNotFound)?; + + if data.len() < T::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != T::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(*bytemuck::try_from_bytes::(&data[8..]) + .map_err(|_| OnDemandError::AnchorParseError)?) +} + +pub async fn fetch_borsh_account( + client: &crate::RpcClient, + pubkey: Pubkey, +) -> Result { + let account_data = client + .get_account_data(&pubkey.to_bytes().into()) + .await + .map_err(|_| OnDemandError::AccountNotFound)?; + + T::try_deserialize(&mut account_data.as_slice()) + .map_err(|_| OnDemandError::AnchorParseError) +} + +pub fn fetch_borsh_account_sync( + client: &C, + pubkey: Pubkey, +) -> Result { + let data = client + .get_account_data(&pubkey.to_bytes().into()) + .map_err(|_| OnDemandError::AccountNotFound)? + .ok_or(OnDemandError::AccountNotFound)?; + + T::try_deserialize(&mut data.as_slice()).map_err(|_| OnDemandError::AnchorParseError) +} + + +// type GenericError = Box; diff --git a/programs/switchboard-on-demand/src/decimal.rs b/programs/switchboard-on-demand/src/decimal.rs new file mode 100644 index 0000000000..53266409d4 --- /dev/null +++ b/programs/switchboard-on-demand/src/decimal.rs @@ -0,0 +1,230 @@ +// #![allow(unaligned_references)] +use core::cmp::Ordering; + +use borsh::{BorshDeserialize, BorshSerialize}; +use rust_decimal::prelude::FromPrimitive; +use rust_decimal::Decimal; + +use crate::prelude::*; + +/// A decimal number serializable with Borsh +#[derive(Default, Eq, PartialEq, Copy, Clone, BorshSerialize, BorshDeserialize)] +pub struct BorshDecimal { + /// The mantissa (significant digits) of the decimal + pub mantissa: i128, + /// The scale (number of decimal places) + pub scale: u32, +} +impl From for BorshDecimal { + fn from(s: Decimal) -> Self { + Self { + mantissa: s.mantissa(), + scale: s.scale(), + } + } +} +impl From<&Decimal> for BorshDecimal { + fn from(s: &Decimal) -> Self { + Self { + mantissa: s.mantissa(), + scale: s.scale(), + } + } +} +impl From for BorshDecimal { + fn from(s: SwitchboardDecimal) -> Self { + Self { + mantissa: s.mantissa, + scale: s.scale, + } + } +} +impl From for SwitchboardDecimal { + fn from(val: BorshDecimal) -> Self { + SwitchboardDecimal { + mantissa: val.mantissa, + scale: val.scale, + } + } +} +impl TryInto for &BorshDecimal { + type Error = OnDemandError; + fn try_into(self) -> std::result::Result { + Decimal::try_from_i128_with_scale(self.mantissa, self.scale) + .map_err(|_| OnDemandError::DecimalConversionError) + } +} + +impl TryInto for BorshDecimal { + type Error = OnDemandError; + fn try_into(self) -> std::result::Result { + Decimal::try_from_i128_with_scale(self.mantissa, self.scale) + .map_err(|_| OnDemandError::DecimalConversionError) + } +} + +/// Switchboard's internal decimal representation for oracle data +#[repr(packed)] +#[derive(Default, Debug, Eq, PartialEq, BorshDeserialize)] +pub struct SwitchboardDecimal { + /// The part of a floating-point number that represents the significant digits of that number, and that is multiplied by the base, 10, raised to the power of scale to give the actual value of the number. + pub mantissa: i128, + /// The number of decimal places to move to the left to yield the actual value. + pub scale: u32, +} + +impl SwitchboardDecimal { + /// Creates a new SwitchboardDecimal with the given mantissa and scale + pub fn new(mantissa: i128, scale: u32) -> SwitchboardDecimal { + Self { mantissa, scale } + } + /// Converts from rust_decimal::Decimal to SwitchboardDecimal + pub fn from_rust_decimal(d: Decimal) -> SwitchboardDecimal { + Self::new(d.mantissa(), d.scale()) + } + /// Creates a SwitchboardDecimal from a 64-bit floating point number + pub fn from_f64(v: f64) -> SwitchboardDecimal { + let dec = Decimal::from_f64(v).unwrap(); + Self::from_rust_decimal(dec) + } + /// Scales the decimal to a new scale, returning the mantissa + pub fn scale_to(&self, new_scale: u32) -> i128 { + match { self.scale }.cmp(&new_scale) { + std::cmp::Ordering::Greater => self + .mantissa + .checked_div(10_i128.pow(self.scale - new_scale)) + .unwrap(), + std::cmp::Ordering::Less => self + .mantissa + .checked_mul(10_i128.pow(new_scale - self.scale)) + .unwrap(), + std::cmp::Ordering::Equal => self.mantissa, + } + } + /// Returns a new SwitchboardDecimal with the specified scale + pub fn new_with_scale(&self, new_scale: u32) -> Self { + let mantissa = self.scale_to(new_scale); + SwitchboardDecimal { + mantissa, + scale: new_scale, + } + } +} +impl From for SwitchboardDecimal { + fn from(val: Decimal) -> Self { + SwitchboardDecimal::new(val.mantissa(), val.scale()) + } +} +impl TryInto for &SwitchboardDecimal { + type Error = OnDemandError; + fn try_into(self) -> std::result::Result { + Decimal::try_from_i128_with_scale(self.mantissa, self.scale) + .map_err(|_| OnDemandError::DecimalConversionError) + } +} + +impl TryInto for SwitchboardDecimal { + type Error = OnDemandError; + fn try_into(self) -> std::result::Result { + Decimal::try_from_i128_with_scale(self.mantissa, self.scale) + .map_err(|_| OnDemandError::DecimalConversionError) + } +} + +impl Ord for SwitchboardDecimal { + fn cmp(&self, other: &Self) -> Ordering { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s.cmp(&other) + } +} + +impl PartialOrd for SwitchboardDecimal { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } + fn lt(&self, other: &Self) -> bool { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s < other + } + fn le(&self, other: &Self) -> bool { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s <= other + } + fn gt(&self, other: &Self) -> bool { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s > other + } + fn ge(&self, other: &Self) -> bool { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s >= other + } +} + +impl From for bool { + fn from(s: SwitchboardDecimal) -> Self { + let dec: Decimal = (&s).try_into().unwrap(); + dec.round().mantissa() != 0 + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn switchboard_decimal_into_rust_decimal() { + let swb_decimal = &SwitchboardDecimal { + mantissa: 12345, + scale: 2, + }; + let decimal: Decimal = swb_decimal.try_into().unwrap(); + assert_eq!(decimal.mantissa(), 12345); + assert_eq!(decimal.scale(), 2); + } + + #[test] + fn empty_switchboard_decimal_is_false() { + let swb_decimal = SwitchboardDecimal { + mantissa: 0, + scale: 0, + }; + let b: bool = swb_decimal.into(); + assert!(!b); + let swb_decimal_neg = SwitchboardDecimal { + mantissa: -0, + scale: 0, + }; + let b: bool = swb_decimal_neg.into(); + assert!(!b); + } + + // #[test] + // fn switchboard_decimal_to_u64() { + // // 1234.5678 + // let swb_decimal = SwitchboardDecimal { + // mantissa: 12345678, + // scale: 4, + // }; + // let b: u64 = swb_decimal.try_into().unwrap(); + // assert_eq!(b, 1234); + // } + // + // #[test] + // fn switchboard_decimal_to_f64() { + // // 1234.5678 + // let swb_decimal = SwitchboardDecimal { + // mantissa: 12345678, + // scale: 4, + // }; + // let b: f64 = swb_decimal.try_into().unwrap(); + // assert_eq!(b, 1234.5678); + // + // let swb_f64 = SwitchboardDecimal::from_f64(1234.5678); + // assert_eq!(swb_decimal, swb_f64); + // } +} diff --git a/programs/switchboard-on-demand/src/instruction_compat.rs b/programs/switchboard-on-demand/src/instruction_compat.rs new file mode 100644 index 0000000000..7e21121072 --- /dev/null +++ b/programs/switchboard-on-demand/src/instruction_compat.rs @@ -0,0 +1,144 @@ +//! Instruction compatibility layer for mixed Solana SDK versions +//! +//! When both solana-v2 and client features are enabled, this module provides +//! a unified Instruction type that can be used throughout the codebase. + +#[cfg(all(feature = "solana-v2", feature = "client"))] +use anchor_lang::solana_program as v3_program; + +#[cfg(all(feature = "solana-v2", feature = "client"))] +use crate::solana_compat as v2_compat; + +/// When both features are enabled, create wrapper types that can convert between versions +#[cfg(all(feature = "solana-v2", feature = "client"))] +pub mod mixed_version { + use super::*; + + /// Wrapper for instructions that need to work with both SDK versions + pub struct CompatInstruction { + inner_v3: v3_program::instruction::Instruction, + } + + impl CompatInstruction { + /// Create from v3 Instruction (used by build_ix when anchor is enabled) + pub fn from_v3(ix: v3_program::instruction::Instruction) -> Self { + Self { inner_v3: ix } + } + + /// Convert to v2 Instruction for return values + pub fn to_v2(self) -> v2_compat::Instruction { + v2_compat::Instruction { + program_id: v2_compat::Pubkey::from(self.inner_v3.program_id.to_bytes()), + accounts: self + .inner_v3 + .accounts + .into_iter() + .map(|meta| v2_compat::AccountMeta { + pubkey: v2_compat::Pubkey::from(meta.pubkey.to_bytes()), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + data: self.inner_v3.data, + } + } + + /// Access the inner v3 instruction mutably + pub fn inner_mut(&mut self) -> &mut v3_program::instruction::Instruction { + &mut self.inner_v3 + } + + /// Access the inner v3 instruction + pub fn inner(&self) -> &v3_program::instruction::Instruction { + &self.inner_v3 + } + } + + /// Implement From for v3_program path + impl From for CompatInstruction { + fn from(ix: v3_program::instruction::Instruction) -> Self { + Self::from_v3(ix) + } + } + + /// Generic conversion function that works with any Instruction type using unsafe transmute + /// + /// This is safe because all Solana Instruction types (v2, v3, anchor) have identical memory layout: + /// - program_id: Pubkey (32 bytes) + /// - accounts: Vec + /// - data: Vec + /// + /// SAFETY: The caller must ensure the input type has the exact same memory layout as + /// v3_program::instruction::Instruction + pub unsafe fn convert_any_instruction_to_compat_unsafe(ix: T) -> CompatInstruction { + // Transmute to v3 instruction - this is safe because all Solana Instruction types + // have identical memory layout + let v3_ix: v3_program::instruction::Instruction = std::mem::transmute_copy(&ix); + std::mem::forget(ix); // Prevent double-free + CompatInstruction::from_v3(v3_ix) + } + + /// Safe wrapper for trait-based conversion + pub fn convert_any_instruction_to_compat(ix: T) -> CompatInstruction + where + T: IntoInstructionBytes, + { + let (program_id_bytes, accounts_data, data) = ix.into_bytes(); + + // Reconstruct as v3 Instruction + let v3_ix = v3_program::instruction::Instruction { + program_id: v3_program::pubkey::Pubkey::from(program_id_bytes), + accounts: accounts_data + .into_iter() + .map(|(pubkey_bytes, is_signer, is_writable)| { + if is_writable { + if is_signer { + v3_program::instruction::AccountMeta::new( + v3_program::pubkey::Pubkey::from(pubkey_bytes), + true, + ) + } else { + v3_program::instruction::AccountMeta::new( + v3_program::pubkey::Pubkey::from(pubkey_bytes), + false, + ) + } + } else if is_signer { + v3_program::instruction::AccountMeta::new_readonly( + v3_program::pubkey::Pubkey::from(pubkey_bytes), + true, + ) + } else { + v3_program::instruction::AccountMeta::new_readonly( + v3_program::pubkey::Pubkey::from(pubkey_bytes), + false, + ) + } + }) + .collect(), + data, + }; + + CompatInstruction::from_v3(v3_ix) + } + + /// Trait for extracting bytes from any Instruction type + /// + /// This trait is implemented at the crate root (lib.rs) to ensure it's always in scope + pub trait IntoInstructionBytes { + fn into_bytes(self) -> ([u8; 32], Vec<([u8; 32], bool, bool)>, Vec); + } +} + +/// Macro helper to convert any instruction type +#[cfg(all(feature = "solana-v2", feature = "client"))] +#[macro_export] +macro_rules! to_compat_ix { + ($ix:expr) => {{ + $crate::instruction_compat::mixed_version::convert_any_instruction_to_compat($ix) + }}; +} + +/// Re-export for convenience +#[cfg(all(feature = "solana-v2", feature = "client"))] +pub use mixed_version::CompatInstruction; diff --git a/programs/switchboard-on-demand/src/instructions.rs b/programs/switchboard-on-demand/src/instructions.rs new file mode 100644 index 0000000000..088a31d92b --- /dev/null +++ b/programs/switchboard-on-demand/src/instructions.rs @@ -0,0 +1 @@ +pub use crate::on_demand::instructions::*; diff --git a/programs/switchboard-on-demand/src/lib.rs b/programs/switchboard-on-demand/src/lib.rs index 80779e43a5..501175e4b0 100644 --- a/programs/switchboard-on-demand/src/lib.rs +++ b/programs/switchboard-on-demand/src/lib.rs @@ -11,6 +11,44 @@ declare_id!("Aio4gaXjXzJNVLtzwtNVmSqGKpANtXhybbkhtAC94ji2"); #[program] pub mod switchboard_on_demand {} + +pub mod solana_compat; +pub mod anchor_traits; +pub mod utils; +pub mod macros; +pub mod smallvec; +pub mod on_demand; + +// Only export sysvar for client features or when needed +#[cfg(any(feature = "client", not(target_os = "solana")))] +pub mod sysvar; + +pub mod program_id; +pub use program_id::*; + +// Re-export commonly used items +pub use solana_compat::solana_program; +pub use on_demand::oracle_quote::switchboard_quote::SwitchboardQuote; + +// Error types +#[derive(Debug, Clone, Copy)] +pub enum OnDemandError { + InvalidDiscriminator, + InvalidData, + AccountBorrowError, + AccountDeserializeError, + NotEnoughSamples, + IllegalFeedValue, + StaleResult, + NetworkError, +} + +impl From for anchor_lang::error::Error { + fn from(_e: OnDemandError) -> Self { + anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::AccountDidNotDeserialize) + } +} + pub const SB_ON_DEMAND_PRECISION: u32 = 18; #[repr(C)] diff --git a/programs/switchboard-on-demand/src/macros.rs b/programs/switchboard-on-demand/src/macros.rs new file mode 100644 index 0000000000..5e5f9b1fd3 --- /dev/null +++ b/programs/switchboard-on-demand/src/macros.rs @@ -0,0 +1,179 @@ +/// Macro used to include code if the target_os is not 'solana'. +/// This is intended to be used for code that is primarily for off-chain Switchboard Functions. +#[macro_export] +macro_rules! cfg_client { + ($($item:item)*) => { + $( + #[cfg(all(feature = "client"))] + $item + )* + }; +} + +/// Helper macro to conditionally convert instruction types when both solana-v2 and client features are enabled +#[macro_export] +macro_rules! build_ix_compat { + ($program_id:expr, $accounts:expr, $params:expr) => {{ + $crate::utils::build_ix($program_id, $accounts, $params) + }}; +} + +/// Helper macro to wrap the final instruction return with type conversion if needed +/// When both solana-v2 and client features are enabled, code inside cfg_client! blocks +/// uses anchor's v3 types, but must return v2 types for compatibility +/// +/// SAFETY: This uses unsafe transmute internally, which is safe because all Solana +/// Instruction types (v2, v3, anchor) have identical memory layout +#[macro_export] +macro_rules! return_ix_compat { + ($ix:expr) => {{ + #[cfg(all(feature = "solana-v2", feature = "client"))] + { + // SAFETY: All Solana Instruction types have identical memory layout + // (program_id: Pubkey, accounts: Vec, data: Vec) + Ok(unsafe { + $crate::instruction_compat::mixed_version::convert_any_instruction_to_compat_unsafe( + $ix, + ) + } + .to_v2()) + } + #[cfg(not(all(feature = "solana-v2", feature = "client")))] + { + Ok($ix) + } + }}; +} + +/// Macro used to include code if the feature 'secrets' is enabled. +/// This is intended to be used for code that is primarily for off-chain Switchboard Secrets. +#[macro_export] +macro_rules! cfg_secrets { + ($($item:item)*) => { + $( + #[cfg(all(feature = "secrets"))] + $item + )* + }; +} + +/// Macro used to include storage code if the storage feature is enabled. +#[macro_export] +macro_rules! cfg_storage { + ($($item:item)*) => { + $( + #[cfg(all(feature = "storage"))] + $item + )* + }; +} + +/// Retry a given expression a specified number of times with a delay between each attempt. +/// +/// # Arguments +/// +/// * `attempts` - The number of attempts to make. +/// * `delay_ms` - The delay in milliseconds between each attempt. +/// * `expr` - The expression to be retried. +/// +/// # Returns +/// +/// Returns a `Result` containing the value of the expression if it succeeds within the specified number of attempts, +/// or an error if it fails on all attempts. +/// +/// # Examples +/// ``` +/// use switchboard_solana::retry; +/// +/// // Retry a blockhash fetch 3 times with a delay of 500ms in between each failure +/// let blockhash = retry!(3, 500, rpc.get_latest_blockhash().await) +/// .await +/// .map_err(|e| OnDemandError::SolanaBlockhashFetchError(Arc::new(e)))?; +/// ``` +#[macro_export] +macro_rules! retry { + ($attempts:expr, $delay_ms:expr, $expr:expr) => {{ + async { + let mut attempts = $attempts; + loop { + match $expr { + Ok(val) => break Ok(val), + Err(_) if attempts > 1 => { + attempts -= 1; + tokio::time::sleep(tokio::time::Duration::from_millis($delay_ms)).await; + } + Err(e) => break Err(e), + } + } + } + }}; +} + +/// Retry a given expression a specified number of times with a delay between each attempt. +/// This will block the current thread until a value is resolved or the maximum number of attempts is reached. +/// +/// # Arguments +/// +/// * `attempts` - The number of attempts to make. +/// * `delay_ms` - The delay in milliseconds between each attempt. +/// * `expr` - The expression to be retried. +/// +/// # Returns +/// +/// Returns a `Result` containing the value of the expression if it succeeds within the specified number of attempts, +/// or an error if it fails on all attempts. +/// +/// # Examples +/// ``` +/// use switchboard_solana::blocking_retry; +/// +/// // Retry a blockhash fetch 3 times with a delay of 500ms in between each failure +/// let blockhash = blocking_retry!(3, 500, rpc.get_latest_blockhash()) +/// .map_err(|e| OnDemandError::SolanaBlockhashFetchError(Arc::new(e)))?; +/// ``` +#[macro_export] +macro_rules! blocking_retry { + ($attempts:expr, $delay_ms:expr, $expr:expr) => {{ + let mut attempts = $attempts; + loop { + match $expr { + Ok(val) => break Ok(val), + Err(_) if attempts > 1 => { + attempts -= 1; + std::thread::sleep(tokio::time::Duration::from_millis($delay_ms)); + } + Err(e) => break Err(e), + } + } + }}; +} + +/// Implements AccountDeserialize trait for Anchor compatibility +#[macro_export] +macro_rules! impl_account_deserialize { + ($struct_name:ident) => { + use anchor_client; + use anchor_lang::prelude::{Error, ErrorCode}; + + impl anchor_client::anchor_lang::AccountDeserialize for $struct_name { + fn try_deserialize(buf: &mut &[u8]) -> Result { + use $crate::anchor_traits::Discriminator; + if buf.len() < $struct_name::discriminator().len() { + return Err(ErrorCode::AccountDiscriminatorMismatch.into()); + } + let given_disc = &buf[..8]; + if $struct_name::discriminator() != given_disc { + return Err(ErrorCode::AccountDiscriminatorMismatch.into()); + } + Self::try_deserialize_unchecked(buf) + } + + fn try_deserialize_unchecked(buf: &mut &[u8]) -> Result { + let data: &[u8] = &buf[8..]; + bytemuck::try_from_bytes(data) + .map(|r: &Self| *r) + .map_err(|_| ErrorCode::AccountDidNotDeserialize.into()) + } + } + }; +} diff --git a/programs/switchboard-on-demand/src/on_demand/accounts/mod.rs b/programs/switchboard-on-demand/src/on_demand/accounts/mod.rs new file mode 100644 index 0000000000..4a7dc523d3 --- /dev/null +++ b/programs/switchboard-on-demand/src/on_demand/accounts/mod.rs @@ -0,0 +1,6 @@ +/// Pull feed data structures and utilities +pub mod pull_feed; +/// Queue account for managing oracle operations +pub mod queue; +pub use pull_feed::*; +pub use queue::*; diff --git a/programs/switchboard-on-demand/src/on_demand/accounts/pull_feed.rs b/programs/switchboard-on-demand/src/on_demand/accounts/pull_feed.rs new file mode 100644 index 0000000000..d519aa11f1 --- /dev/null +++ b/programs/switchboard-on-demand/src/on_demand/accounts/pull_feed.rs @@ -0,0 +1,492 @@ +use std::cell::Ref; + +// Compatibility shim for anchor-lang borsh macros +#[cfg(feature = "anchor")] +mod borsh { + pub use anchor_lang::prelude::borsh::*; + pub mod maybestd { + pub mod io { + pub use std::io::*; + } + } +} +use anchor_lang::{AnchorDeserialize, AnchorSerialize, Discriminator, Owner, ZeroCopy}; +use bytemuck; +use rust_decimal::Decimal; +use sha2::{Digest, Sha256}; +use crate::{Pubkey, get_sb_program_id, OnDemandError}; + + +/// Default decimal precision for Switchboard oracle values +pub const PRECISION: u32 = 18; + +/// Returns the Switchboard On-Demand program ID +pub fn sb_pid() -> Pubkey { + let pid = if crate::utils::is_devnet() { + get_sb_program_id("devnet") + } else { + get_sb_program_id("mainnet") + }; + pid.to_bytes().into() +} + +/// Current oracle aggregation result with statistics +#[repr(C)] +#[derive(Clone, Copy, Debug, bytemuck::Pod, bytemuck::Zeroable)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct CurrentResult { + /// The median value of the submissions needed for quorom size + pub value: i128, + /// The standard deviation of the submissions needed for quorom size + pub std_dev: i128, + /// The mean of the submissions needed for quorom size + pub mean: i128, + /// The range of the submissions needed for quorom size + pub range: i128, + /// The minimum value of the submissions needed for quorom size + pub min_value: i128, + /// The maximum value of the submissions needed for quorom size + pub max_value: i128, + /// The number of samples used to calculate this result + pub num_samples: u8, + /// The index of the submission that was used to calculate this result + pub submission_idx: u8, + /// Padding bytes for alignment + pub padding1: [u8; 6], + /// The slot at which this value was signed. + pub slot: u64, + /// The slot at which the first considered submission was made + pub min_slot: u64, + /// The slot at which the last considered submission was made + pub max_slot: u64, +} +impl CurrentResult { + /// Force override result values (debug builds only) + pub fn debug_only_force_override(&mut self, value: i128, slot: u64) { + self.value = value; + self.slot = slot; + self.std_dev = 0; + self.mean = value; + self.range = 0; + self.min_value = value; + self.max_value = value; + self.num_samples = u8::MAX; + self.submission_idx = 0; + self.min_slot = slot; + self.max_slot = slot; + } + + /// The median value of the submissions needed for quorom size + pub fn value(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.value, PRECISION)) + } + + /// The standard deviation of the submissions needed for quorom size + pub fn std_dev(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.std_dev, PRECISION)) + } + + /// The mean of the submissions needed for quorom size + pub fn mean(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.mean, PRECISION)) + } + + /// The range of the submissions needed for quorom size + pub fn range(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.range, PRECISION)) + } + + /// The minimum value of the submissions needed for quorom size + pub fn min_value(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.min_value, PRECISION)) + } + + /// The maximum value of the submissions needed for quorom size + pub fn max_value(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.max_value, PRECISION)) + } + + /// Returns the slot when this result was recorded + pub fn result_slot(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(self.slot) + } + + /// Returns the minimum slot of submissions used in this result + pub fn min_slot(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(self.min_slot) + } + + /// Returns the maximum slot of submissions used in this result + pub fn max_slot(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(self.max_slot) + } +} + +/// Individual oracle submission data +#[repr(C)] +#[derive(Clone, Copy, Debug, bytemuck::Pod, bytemuck::Zeroable)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct OracleSubmission { + /// The public key of the oracle that submitted this value. + pub oracle: Pubkey, + /// The slot at which this value was signed. + pub slot: u64, + /// The slot at which this value was landed on chain. + pub landed_at: u64, + /// The value that was submitted. + pub value: i128, +} + +/// Compact historical oracle result for storage efficiency +#[repr(C)] +#[derive(Clone, Copy, Debug, bytemuck::Pod, bytemuck::Zeroable)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct CompactResult { + /// The standard deviation of the submissions needed for quorom size + pub std_dev: f32, + /// The mean of the submissions needed for quorom size + pub mean: f32, + /// The slot at which this value was signed. + pub slot: u64, +} + +/// A representation of the data in a pull feed account. +#[repr(C)] +#[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct PullFeedAccountData { + /// The oracle submissions for this feed. + pub submissions: [OracleSubmission; 32], + /// The public key of the authority that can update the feed hash that + /// this account will use for registering updates. + pub authority: Pubkey, + /// The public key of the queue which oracles must be bound to in order to + /// submit data to this feed. + pub queue: Pubkey, + /// SHA-256 hash of the job schema oracles will execute to produce data + /// for this feed. + pub feed_hash: [u8; 32], + /// The slot at which this account was initialized. + pub initialized_at: i64, + /// Permission flags for feed operations + pub permissions: u64, + /// Maximum allowed variance between oracle submissions + pub max_variance: u64, + /// Minimum number of oracle responses required + pub min_responses: u32, + /// Human-readable name for this feed + pub name: [u8; 32], + padding1: [u8; 2], + /// Index for the next historical result entry + pub historical_result_idx: u8, + /// Minimum number of samples required for a valid result + pub min_sample_size: u8, + /// Unix timestamp of the last feed update + pub last_update_timestamp: i64, + /// Slot number for address lookup table + pub lut_slot: u64, + _reserved1: [u8; 32], + /// Current aggregated result from oracle submissions + pub result: CurrentResult, + /// Maximum age in slots before data is considered stale + pub max_staleness: u32, + padding2: [u8; 12], + /// Array of historical oracle results + pub historical_results: [CompactResult; 32], + _ebuf4: [u8; 8], + _ebuf3: [u8; 24], + /// Timestamps of oracle submissions + pub submission_timestamps: [i64; 32], +} + +impl OracleSubmission { + /// Returns true if this submission is empty (uninitialized) + pub fn is_empty(&self) -> bool { + self.slot == 0 + } + + /// Returns the submitted value as a Decimal with standard precision + pub fn value(&self) -> Decimal { + Decimal::from_i128_with_scale(self.value, PRECISION) + } +} + +impl PullFeedAccountData { + /// Returns true if the value in the current result is within + /// staleness threshold + pub fn is_result_vaild(&self, clock_slot: u64) -> bool { + self.result.slot >= clock_slot - self.max_staleness as u64 + } + + /// Returns the oracle submission that was used for the current result + pub fn result_submission(&self) -> &OracleSubmission { + &self.submissions[self.result.submission_idx as usize] + } + + /// Returns the timestamp of the submission used for current result + pub fn result_ts(&self) -> i64 { + let idx = self.result.submission_idx as usize; + self.submission_timestamps[idx] + } + + /// Returns the slot when the current result submission landed on-chain + pub fn result_land_slot(&self) -> u64 { + let submission = self.submissions[self.result.submission_idx as usize]; + submission.landed_at + } + + /// Parses pull feed account data from raw bytes + pub fn parse<'info>(data: Ref<'info, &mut [u8]>) -> Result, OnDemandError> { + if data.len() < Self::DISCRIMINATOR.len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != Self::DISCRIMINATOR { + return Err(OnDemandError::InvalidDiscriminator); + } + + // Check size before attempting to parse + let expected_size = std::mem::size_of::() + 8; + if data.len() < expected_size { + return Err(OnDemandError::InvalidData); + } + + // Validate the slice can be safely cast before using from_bytes + let slice_to_parse = &data[8..expected_size]; + if slice_to_parse.len() != std::mem::size_of::() { + return Err(OnDemandError::InvalidData); + } + + // Check alignment requirements for bytemuck + match bytemuck::try_from_bytes::(slice_to_parse) { + Ok(_) => { + // If try_from_bytes succeeds, we know from_bytes will also succeed + Ok(Ref::map(data, |data: &&mut [u8]| { + bytemuck::from_bytes(&data[8..std::mem::size_of::() + 8]) + })) + } + Err(_) => Err(OnDemandError::AccountDeserializeError), + } + } + + /// Generate a checksum for the given feed hash, result, slothash, max_variance and min_responses + /// This is signed by the oracle and used to verify that the data submitted by the oracles is valid. + pub fn generate_checksum(&self, result: i128, slothash: [u8; 32]) -> [u8; 32] { + Self::generate_checksum_inner( + self.queue, + self.feed_hash, + result, + slothash, + self.max_variance, + self.min_responses, + ) + } + + /// Generate a checksum for the given feed hash, result, slothash, max_variance and min_responses + /// This is signed by the oracle and used to verify that the data submitted by the oracles is valid. + pub fn generate_checksum_inner( + queue: Pubkey, + feed_hash: [u8; 32], + result: i128, + slothash: [u8; 32], + max_variance: u64, + min_responses: u32, + ) -> [u8; 32] { + let mut hasher = Sha256::new(); + hasher.update(queue.to_bytes()); + hasher.update(feed_hash); + hasher.update(result.to_le_bytes()); + hasher.update(slothash); + hasher.update(max_variance.to_le_bytes()); + hasher.update(min_responses.to_le_bytes()); + hasher.finalize().to_vec().try_into().unwrap() + } + + /// Generate a checksum for the given feed hash, result, slothash, max_variance and min_responses + /// This is signed by the oracle and used to verify that the data submitted by the oracles is valid. + pub fn generate_checksum_with_timestamp( + queue: Pubkey, + feed_hash: [u8; 32], + result: i128, + slothash: [u8; 32], + max_variance: u64, + min_responses: u32, + timestamp: u64, + ) -> [u8; 32] { + let mut hasher = Sha256::new(); + hasher.update(queue.to_bytes()); + hasher.update(feed_hash); + hasher.update(result.to_le_bytes()); + hasher.update(slothash); + hasher.update(max_variance.to_le_bytes()); + hasher.update(min_responses.to_le_bytes()); + hasher.update(timestamp.to_le_bytes()); + hasher.finalize().to_vec().try_into().unwrap() + } + + /// **method** + /// get_value + /// Returns the median value of the submissions in the last `max_staleness` slots. + /// If there are fewer than `min_samples` submissions, returns an error. + /// **arguments** + /// * `clock` - the clock to use for the current slot + /// * `max_staleness` - the maximum number of slots to consider + /// * `min_samples` - the minimum number of samples required to return a value + /// **returns** + /// * `Ok(Decimal)` - the median value of the submissions in the last `max_staleness` slots + pub fn get_value( + &self, + clock_slot: u64, + max_staleness: u64, + min_samples: u32, + only_positive: bool, + ) -> Result { + let submissions = self + .submissions + .iter() + .take_while(|s| !s.is_empty()) + .filter(|s| s.slot >= clock_slot - max_staleness) + .collect::>(); + if submissions.len() < min_samples as usize { + return Err(OnDemandError::NotEnoughSamples); + } + let median = + lower_bound_median(&mut submissions.iter().map(|s| s.value).collect::>()) + .ok_or(OnDemandError::NotEnoughSamples)?; + if only_positive && median <= 0 { + return Err(OnDemandError::IllegalFeedValue); + } + + Ok(Decimal::from_i128_with_scale(median, PRECISION)) + } + + /// List of samples that are valid for the current slot + pub fn valid_samples(&self, clock_slot: u64) -> Vec<&OracleSubmission> { + self.submissions + .iter() + .take_while(|s| !s.is_empty()) + .filter(|s| s.slot >= clock_slot - self.max_staleness as u64) + .collect() + } + + /// Gets all the samples used in the current result + pub fn current_result_samples(&self) -> Vec<(usize, &OracleSubmission)> { + let last_update_slot = self.last_update_slot(); + let slot_threshold = last_update_slot - self.max_staleness as u64; + self.submissions + .iter() + .enumerate() + .take_while(|(_, s)| !s.is_empty()) + .filter(|(_, s)| s.slot >= slot_threshold) + .collect() + } + + /// Gets the minimum timestamp of the submissions used in the current result + pub fn current_result_ts_range(&self) -> (i64, i64) { + let samples = self.current_result_samples(); + let timestamps = samples + .iter() + .map(|(idx, _)| self.submission_timestamps[*idx]) + .collect::>(); + let min_ts = *timestamps.iter().min().unwrap_or(&0); + let max_ts = *timestamps.iter().max().unwrap_or(&0); + (min_ts, max_ts) + } + + /// Returns the slot of the most recent submission + pub fn last_update_slot(&self) -> u64 { + self.submissions + .iter() + .map(|s| s.landed_at) + .max() + .unwrap_or(0) + } + + /// The median value of the submissions needed for quorom size + /// Fails if the result is not valid or stale. + pub fn value(&self, clock_slot: u64) -> Result { + if self.result.result_slot().unwrap_or(0) < clock_slot - self.max_staleness as u64 { + return Err(OnDemandError::StaleResult); + } + self.result.value().ok_or(OnDemandError::StaleResult) + } + + /// The standard deviation of the submissions needed for quorom size + pub fn std_dev(&self) -> Option { + self.result.std_dev() + } + + /// The mean of the submissions needed for quorom size + pub fn mean(&self) -> Option { + self.result.mean() + } + + /// The range of the submissions needed for quorom size + pub fn range(&self) -> Option { + self.result.range() + } + + /// The minimum value of the submissions needed for quorom size + pub fn min_value(&self) -> Option { + self.result.min_value() + } + + /// The maximum value of the submissions needed for quorom size + pub fn max_value(&self) -> Option { + self.result.max_value() + } +} + +impl ZeroCopy for PullFeedAccountData {} +impl Owner for PullFeedAccountData { + fn owner() -> Pubkey { + sb_pid().to_bytes().into() + } +} +impl Discriminator for PullFeedAccountData { + const DISCRIMINATOR: [u8; 8] = [196, 27, 108, 196, 10, 215, 219, 40]; +} + +/// Type alias for PullFeedAccountData for backward compatibility +pub type SbFeed = PullFeedAccountData; + +// takes the rounded down median of a list of numbers +/// Calculates the lower bound median of oracle submission values +pub fn lower_bound_median(numbers: &mut [i128]) -> Option { + numbers.sort(); // Sort the numbers in ascending order. + + let len = numbers.len(); + if len == 0 { + return None; // Return None for an empty list. + } + Some(numbers[len / 2]) +} diff --git a/programs/switchboard-on-demand/src/on_demand/accounts/queue.rs b/programs/switchboard-on-demand/src/on_demand/accounts/queue.rs new file mode 100644 index 0000000000..198b68d1e3 --- /dev/null +++ b/programs/switchboard-on-demand/src/on_demand/accounts/queue.rs @@ -0,0 +1,330 @@ +#[cfg(feature = "pinocchio")] +type Ref<'a, T> = pinocchio::account_info::Ref<'a, T>; + +#[cfg(not(feature = "pinocchio"))] +use std::cell::Ref; + +use bytemuck::{Pod, Zeroable}; + +// Use our AccountInfo type alias that conditionally uses pinocchio or anchor/solana-program +use crate::AccountInfo; +use crate::{get_sb_program_id, cfg_client, OnDemandError}; +use crate::Pubkey; + +cfg_client! { + use spl_associated_token_account::solana_program::address_lookup_table_account::AddressLookupTableAccount; +} + +/// Queue account data containing oracle management and configuration +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct QueueAccountData { + /// The address of the authority which is permitted to add/remove allowed enclave measurements. + pub authority: Pubkey, + /// Allowed enclave measurements. + pub mr_enclaves: [[u8; 32]; 32], + /// The addresses of the quote oracles who have a valid + /// verification status and have heartbeated on-chain recently. + pub oracle_keys: [Pubkey; 78], + reserved1: [u8; 40], + /// SECP256K1 signing keys for oracles + pub secp_oracle_signing_keys: [[u8; 20]; 30], + /// ED25519 signing keys for oracles + pub ed25519_oracle_signing_keys: [Pubkey; 30], + /// The maximum allowable time until a EnclaveAccount needs to be re-verified on-chain. + pub max_quote_verification_age: i64, + /// The unix timestamp when the last quote oracle heartbeated on-chain. + pub last_heartbeat: i64, + /// Timeout period for oracle nodes in seconds + pub node_timeout: i64, + /// The minimum number of lamports a quote oracle needs to lock-up in order to heartbeat and verify other quotes. + pub oracle_min_stake: u64, + /// Time after which authority override is allowed + pub allow_authority_override_after: i64, + + /// The number of allowed enclave measurements. + pub mr_enclaves_len: u32, + /// The length of valid quote oracles for the given attestation queue. + pub oracle_keys_len: u32, + /// The reward paid to quote oracles for attesting on-chain. + pub reward: u32, + /// Incrementer used to track the current quote oracle permitted to run any available functions. + pub curr_idx: u32, + /// Incrementer used to garbage collect and remove stale quote oracles. + pub gc_idx: u32, + + /// Whether authority permission is required for heartbeat + pub require_authority_heartbeat_permission: u8, + /// Whether authority permission is required for verification + pub require_authority_verify_permission: u8, + /// Whether usage permissions are required + pub require_usage_permissions: u8, + /// PDA bump seed for the queue signer + pub signer_bump: u8, + + /// Token mint for queue operations + pub mint: Pubkey, + /// Address lookup table slot + pub lut_slot: u64, + /// Whether subsidies are allowed for oracle operations + pub allow_subsidies: u8, + + _ebuf6: [u8; 15], + /// Network coordination node public key + pub ncn: Pubkey, + _resrved: u64, // only necessary for multiple vaults at once, otherwise we can use the ncn + // tickets + /// Array of vault information for rewards + pub vaults: [VaultInfo; 4], + /// Last epoch when queue rewards were distributed + pub last_reward_epoch: u64, + _ebuf4: [u8; 32], + _ebuf2: [u8; 256], + _ebuf1: [u8; 504], // was 512 change to 504 to make room for new u64 +} +unsafe impl Pod for QueueAccountData {} +unsafe impl Zeroable for QueueAccountData {} + +/// Information about reward vault for oracle incentives +#[repr(C)] +#[derive(PartialEq, Debug, Copy, Clone)] +pub struct VaultInfo { + /// Public key of the vault account + pub vault_key: Pubkey, + /// Last epoch when rewards were distributed + pub last_reward_epoch: u64, +} +unsafe impl Pod for VaultInfo {} +unsafe impl Zeroable for VaultInfo {} + +/// Anchor discriminator for QueueAccountData +pub const QUEUE_ACCOUNT_DISCRIMINATOR: [u8; 8] = [217, 194, 55, 127, 184, 83, 138, 1]; + +// Always implement internal traits for client functionality +impl crate::anchor_traits::Discriminator for QueueAccountData { + const DISCRIMINATOR: &'static [u8] = &QUEUE_ACCOUNT_DISCRIMINATOR; +} + +impl crate::anchor_traits::Owner for QueueAccountData { + fn owner() -> Pubkey { + let pid = if crate::utils::is_devnet() { + get_sb_program_id("devnet") + } else { + get_sb_program_id("mainnet") + }; + pid.to_bytes().into() + } +} + +impl crate::anchor_traits::ZeroCopy for QueueAccountData {} + +// Implement anchor traits when anchor feature is enabled +#[cfg(feature = "anchor")] +impl anchor_lang::Discriminator for QueueAccountData { + const DISCRIMINATOR: [u8; 8] = QUEUE_ACCOUNT_DISCRIMINATOR; +} + +#[cfg(feature = "anchor")] +impl anchor_lang::Owner for QueueAccountData { + fn owner() -> Pubkey { + let pid = if crate::utils::is_devnet() { + get_sb_program_id("devnet") + } else { + get_sb_program_id("mainnet") + }; + pid.to_bytes().into() + } +} + +#[cfg(feature = "anchor")] +impl anchor_lang::ZeroCopy for QueueAccountData {} + +#[cfg(feature = "idl-build")] +impl anchor_lang::IdlBuild for QueueAccountData {} + +impl QueueAccountData { + /// Returns the total size of a queue account in bytes + pub fn size() -> usize { + 8 + std::mem::size_of::() + } + + /// Returns the deserialized Switchboard AttestationQueue account + /// + /// # Arguments + /// + /// * `attestation_queue_account_info` - A Solana AccountInfo referencing an existing Switchboard AttestationQueue + /// + /// # Examples + /// + /// ```ignore + /// use switchboard_solana::QueueAccountData; + /// + /// let attestation_queue = QueueAccountData::new(attestation_queue_account_info)?; + /// ``` + pub fn new<'info>( + attestation_queue_account_info: &'info AccountInfo, + ) -> Result, OnDemandError> { + let data = attestation_queue_account_info + .try_borrow_data() + .map_err(|_| OnDemandError::AccountBorrowError)?; + if data.len() < QUEUE_ACCOUNT_DISCRIMINATOR.len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != QUEUE_ACCOUNT_DISCRIMINATOR { + return Err(OnDemandError::InvalidDiscriminator); + } + + // Check size before attempting to parse + let expected_size = std::mem::size_of::() + 8; + if data.len() < expected_size { + return Err(OnDemandError::InvalidData); + } + + // Validate the slice can be safely cast before using from_bytes + let slice_to_parse = &data[8..expected_size]; + if slice_to_parse.len() != std::mem::size_of::() { + return Err(OnDemandError::InvalidData); + } + + // Check alignment requirements for bytemuck + match bytemuck::try_from_bytes::(slice_to_parse) { + Ok(_) => { + // If try_from_bytes succeeds, we know from_bytes will also succeed + Ok(Ref::map(data, |data| { + bytemuck::from_bytes::( + &data[8..std::mem::size_of::() + 8], + ) + })) + } + Err(_) => Err(OnDemandError::AccountDeserializeError), + } + } + + /// Returns the deserialized Switchboard AttestationQueue account + /// + /// # Arguments + /// + /// * `data` - A Solana AccountInfo's data buffer + /// + /// # Examples + /// + /// ```ignore + /// use switchboard_solana::QueueAccountData; + /// + /// let attestation_queue = QueueAccountData::new(attestation_queue_account_info.try_borrow_data()?)?; + /// ``` + pub fn new_from_bytes(data: &[u8]) -> Result<&QueueAccountData, OnDemandError> { + if data.len() < QUEUE_ACCOUNT_DISCRIMINATOR.len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != QUEUE_ACCOUNT_DISCRIMINATOR { + return Err(OnDemandError::InvalidDiscriminator); + } + + // Check size before attempting to parse + let expected_size = std::mem::size_of::() + 8; + if data.len() < expected_size { + return Err(OnDemandError::InvalidData); + } + + // Validate the slice can be safely cast before using from_bytes + let slice_to_parse = &data[8..expected_size]; + if slice_to_parse.len() != std::mem::size_of::() { + return Err(OnDemandError::InvalidData); + } + + // Use try_from_bytes for safety + match bytemuck::try_from_bytes::(slice_to_parse) { + Ok(queue_data) => Ok(queue_data), + Err(_) => Err(OnDemandError::AccountDeserializeError), + } + } + + /// Returns true if the given MR_ENCLAVE measurement is permitted + pub fn has_mr_enclave(&self, mr_enclave: &[u8]) -> bool { + self.mr_enclaves[..self.mr_enclaves_len as usize] + .iter() + .any(|x| x.to_vec() == mr_enclave.to_vec()) + } + + /// Returns a vector of all permitted enclave measurements + pub fn permitted_enclaves(&self) -> Vec<[u8; 32]> { + self.mr_enclaves[..self.mr_enclaves_len as usize].to_vec() + } + + /// Returns the garbage collection node public key if set + pub fn garbage_collection_node(&self) -> Option { + let gc_node = self.oracle_keys[self.gc_idx as usize]; + if gc_node != Pubkey::default() { + Some(gc_node) + } else { + None + } + } + + /// Returns the index of an oracle in the queue's oracle list + pub fn idx_of_oracle(&self, oracle: &Pubkey) -> Option { + self.oracle_keys[..self.oracle_keys_len as usize] + .iter() + .position(|x| x == oracle) + } + + /// Returns a vector of all active oracle public keys in the queue + pub fn oracle_keys(&self) -> Vec { + self.oracle_keys[..self.oracle_keys_len as usize].to_vec() + } + + cfg_client! { + + /// Fetches a queue account asynchronously from the Solana network + pub async fn fetch_async( + client: &crate::RpcClient, + pubkey: Pubkey, + ) -> std::result::Result { + let pubkey = pubkey.to_bytes().into(); + crate::client::fetch_zerocopy_account(client, pubkey).await + } + + /// Fetches all oracle accounts associated with this queue + pub async fn fetch_oracles( + &self, + client: &crate::RpcClient, + ) -> std::result::Result, crate::OnDemandError> { + let oracles = &self.oracle_keys[..self.oracle_keys_len as usize]; + let converted_oracles: Vec = oracles.iter().map(|pk| pk.to_bytes().into()).collect(); + let datas: Vec<_> = client + .get_multiple_accounts(&converted_oracles) + .await + .map_err(|_e| crate::OnDemandError::NetworkError)? + .into_iter() + .flatten() + .map(|x| x.data.clone()) + .collect::>() + .iter() + .map(|x| OracleAccountData::new_from_bytes(x)) + .filter_map(|x| x.ok()) + .copied() + .collect(); + Ok(oracles.iter().cloned().zip(datas).collect()) + } + + /// Fetches the address lookup table associated with this queue + pub async fn fetch_lut( + &self, + pubkey: &Pubkey, + client: &crate::RpcClient, + ) -> std::result::Result { + use spl_associated_token_account::solana_program::address_lookup_table::instruction::derive_lookup_table_address; + let lut_slot = self.lut_slot; + let lut_signer: Pubkey = crate::find_lut_signer(pubkey); + let lut = derive_lookup_table_address(&lut_signer.to_bytes().into(), lut_slot).0; + crate::address_lookup_table::fetch(client, &lut.to_bytes().into()).await + } + } +} diff --git a/programs/switchboard-on-demand/src/on_demand/mod.rs b/programs/switchboard-on-demand/src/on_demand/mod.rs new file mode 100644 index 0000000000..abf1df9d0a --- /dev/null +++ b/programs/switchboard-on-demand/src/on_demand/mod.rs @@ -0,0 +1,81 @@ +/// Switchboard account definitions and parsers +pub mod accounts; +pub use accounts::*; +/// Oracle quote verification and data extraction +pub mod oracle_quote; +pub use oracle_quote::*; + +use crate::solana_compat::pubkey; +use crate::Pubkey; + +// Re-export PRECISION from pull_feed +pub use accounts::PRECISION; + +/// Address Lookup Table program ID +pub const ADDRESS_LOOKUP_TABLE_PROGRAM_ID: Pubkey = + pubkey!("AddressLookupTab1e1111111111111111111111111"); + +pub const SPL_TOKEN_PROGRAM_ID: Pubkey = + pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); + +/// Derives associated token address and bump seed for given wallet and mint +pub fn get_associated_token_address_and_bump_seed( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + program_id: &Pubkey, + token_program_id: &Pubkey, +) -> (Pubkey, u8) { + get_associated_token_address_and_bump_seed_internal( + wallet_address, + token_mint_address, + program_id, + token_program_id, + ) +} + +/// Derives the associated token account address for the given wallet address +/// and token mint +pub fn get_associated_token_address( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, +) -> Pubkey { + get_associated_token_address_with_program_id( + wallet_address, + token_mint_address, + &SPL_TOKEN_PROGRAM_ID + ) +} + +/// Derives the associated token account address for the given wallet address, +/// token mint and token program id +pub fn get_associated_token_address_with_program_id( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + token_program_id: &Pubkey, +) -> Pubkey { + get_associated_token_address_and_bump_seed( + wallet_address, + token_mint_address, + &pubkey!("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL") + .to_bytes() + .into(), + token_program_id, + ) + .0 +} + +fn get_associated_token_address_and_bump_seed_internal( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + program_id: &Pubkey, + token_program_id: &Pubkey, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + &wallet_address.to_bytes(), + &token_program_id.to_bytes(), + &token_mint_address.to_bytes(), + ], + program_id, + ) +} diff --git a/programs/switchboard-on-demand/src/on_demand/oracle_quote/feed_info.rs b/programs/switchboard-on-demand/src/on_demand/oracle_quote/feed_info.rs new file mode 100644 index 0000000000..2d7cb37e0f --- /dev/null +++ b/programs/switchboard-on-demand/src/on_demand/oracle_quote/feed_info.rs @@ -0,0 +1,181 @@ +//! Packed feed information data structures for oracle quotes +//! +//! This module defines zero-copy data structures for efficiently storing and accessing +//! oracle feed data within quotes. The structures use `#[repr(packed)]` to ensure +//! consistent memory layout across platforms and minimize space usage. + +use faster_hex::hex_string; +use rust_decimal::prelude::*; +use crate::on_demand::PRECISION; + +/// Packed quote header containing the signed slot hash +/// +/// This header is signed by all oracles in the quote and contains the slot hash +/// that is used to validate the quote's freshness against the slot hash sysvar. +/// +/// Size: 32 bytes +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[repr(packed)] +pub struct PackedQuoteHeader { + /// The 32-byte slot hash that was signed by all oracles in the quote + pub signed_slothash: [u8; 32], +} + +impl anchor_lang::prelude::borsh::BorshSerialize for PackedQuoteHeader { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + writer.write_all(&self.signed_slothash) + } +} + +impl anchor_lang::prelude::borsh::BorshDeserialize for PackedQuoteHeader { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let mut signed_slothash = [0u8; 32]; + reader.read_exact(&mut signed_slothash)?; + Ok(Self { signed_slothash }) + } +} + +/// Packed feed information containing ID, value, and validation requirements +/// +/// This structure stores individual feed data within a quote. The layout is optimized +/// for compatibility with JavaScript serialization, with the feed ID first, followed +/// by the value and minimum sample requirement. +/// +/// Size: 49 bytes (32 + 16 + 1) +#[derive(Copy, Clone, Debug)] +#[repr(packed)] +pub struct PackedFeedInfo { + /// 32-byte unique identifier for this feed + pub(crate) feed_id: [u8; 32], + /// Feed value as a fixed-point integer (scaled by PRECISION) + feed_value: i128, + /// Minimum number of oracle samples required for this feed to be considered valid + min_oracle_samples: u8, +} + +impl PartialEq for PackedFeedInfo { + fn eq(&self, other: &Self) -> bool { + self.feed_id == other.feed_id && + self.feed_value == other.feed_value && + self.min_oracle_samples == other.min_oracle_samples + } +} + +impl Eq for PackedFeedInfo {} + +impl anchor_lang::prelude::borsh::BorshSerialize for PackedFeedInfo { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + writer.write_all(&self.feed_id)?; + writer.write_all(&self.feed_value.to_le_bytes())?; + writer.write_all(&[self.min_oracle_samples])?; + Ok(()) + } +} + +impl anchor_lang::prelude::borsh::BorshDeserialize for PackedFeedInfo { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let mut feed_id = [0u8; 32]; + reader.read_exact(&mut feed_id)?; + let mut value_bytes = [0u8; 16]; + reader.read_exact(&mut value_bytes)?; + let feed_value = i128::from_le_bytes(value_bytes); + let mut min_samples = [0u8; 1]; + reader.read_exact(&mut min_samples)?; + Ok(Self { + feed_id, + feed_value, + min_oracle_samples: min_samples[0], + }) + } +} + +impl PackedFeedInfo { + /// The size in bytes of this packed structure + pub const PACKED_SIZE: usize = 49; + + /// Returns a reference to the 32-byte feed ID + #[inline(always)] + pub fn feed_id(&self) -> &[u8; 32] { + &self.feed_id + } + + /// Returns the feed ID as a hexadecimal string with "0x" prefix + /// + /// This is useful for displaying feed IDs in a human-readable format + /// or for use in APIs that expect hex-encoded identifiers. + #[inline(always)] + pub fn hex_id(&self) -> String { + String::from("0x") + &hex_string(self.feed_id()) + } + + /// Returns the raw feed value as a fixed-point integer + /// + /// This value is scaled by the program-wide `PRECISION` constant. + /// Use [`value()`](Self::value) to get the human-readable decimal form. + #[inline(always)] + pub fn feed_value(&self) -> i128 { + self.feed_value + } + + /// Returns the feed value as a `Decimal`, scaled using the program-wide `PRECISION`. + /// + /// This converts the raw fixed-point integer into a human-readable decimal form. + /// For example, if the raw value is 115525650000000000000000 and PRECISION is 18, + /// this will return approximately 115525.65. + #[inline(always)] + pub fn value(&self) -> Decimal { + Decimal::from_i128_with_scale(self.feed_value(), PRECISION).normalize() + } + + /// Returns the minimum number of oracle samples required for this feed + #[inline(always)] + pub fn min_oracle_samples(&self) -> u8 { + self.min_oracle_samples + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[test] + fn test_packed_feed_info_layout() { + // Simulate JavaScript serialized data: feed_id (32) + feed_value (16) + min_oracle_samples (1) + let mut data = [0u8; 49]; + + // Feed ID (32 bytes) - some test hash + data[0..32].fill(0x42); + + // Feed value at offset 32: 115525650000000000000000 (i128, scaled by 18 decimals) + // This should decode to approximately 115525.65 + let feed_value_scaled: i128 = 115525650000000000000000i128; + let value_bytes = feed_value_scaled.to_le_bytes(); + data[32..48].copy_from_slice(&value_bytes); + + // Min oracle samples (1 byte) at offset 48 + data[48] = 5; + + // Cast to PackedFeedInfo + let feed_info = unsafe { &*(data.as_ptr() as *const PackedFeedInfo) }; + + // Test reading the feed value + let raw_value = feed_info.feed_value(); + println!("Raw feed value: {}", raw_value); + println!("Expected: {}", feed_value_scaled); + assert_eq!(raw_value, feed_value_scaled); + + // Test the decimal conversion + let decimal_value = feed_info.value(); + println!("Decimal value: {}", decimal_value); + + // Test other fields + assert_eq!(feed_info.min_oracle_samples(), 5); + assert_eq!(feed_info.feed_id()[0], 0x42); + + println!( + "✅ Test passed! Feed value reads correctly: {}", + decimal_value + ); + } +} diff --git a/programs/switchboard-on-demand/src/on_demand/oracle_quote/instruction_parser.rs b/programs/switchboard-on-demand/src/on_demand/oracle_quote/instruction_parser.rs new file mode 100644 index 0000000000..6f73fe51fa --- /dev/null +++ b/programs/switchboard-on-demand/src/on_demand/oracle_quote/instruction_parser.rs @@ -0,0 +1,301 @@ +//! Parser for ED25519 instruction data into owned structures +//! +//! This module provides functions to parse the raw ED25519 instruction format +//! into owned (non-reference) data structures that can be serialized with Borsh. + +// Re-export for derive macros +use anchor_lang::prelude::borsh; +use borsh::{BorshDeserialize, BorshSerialize}; + +use crate::on_demand::oracle_quote::feed_info::{PackedFeedInfo, PackedQuoteHeader}; + +// Import Ed25519SignatureOffsets conditionally +#[cfg(any(feature = "client", not(target_os = "solana")))] +use crate::sysvar::ed25519_sysvar::{ + Ed25519SignatureOffsets, ED25519_PUBKEY_SERIALIZED_SIZE, ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE, + ED25519_SIGNATURE_SERIALIZED_SIZE, +}; + +// Define constants for on-chain use +#[cfg(all(not(feature = "client"), target_os = "solana"))] +pub const ED25519_PUBKEY_SERIALIZED_SIZE: usize = 32; +#[cfg(all(not(feature = "client"), target_os = "solana"))] +pub const ED25519_SIGNATURE_SERIALIZED_SIZE: usize = 64; +#[cfg(all(not(feature = "client"), target_os = "solana"))] +pub const ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE: usize = 14; + +// Import from switchboard_quote for on-chain use +#[cfg(all(not(feature = "client"), target_os = "solana"))] +use super::switchboard_quote::Ed25519SignatureOffsets; + +/// Parsed ED25519 instruction data with owned values (not references) +/// +/// This structure represents the complete ED25519 instruction data parsed +/// from the raw offset-based format into a sequential, owned representation +/// suitable for Borsh serialization. +#[derive(Debug, Clone, PartialEq, BorshSerialize, BorshDeserialize)] +pub struct ParsedEd25519Instruction { + /// Number of oracle signatures + pub num_signatures: u8, + /// Padding byte + pub padding: u8, + /// Array of signature data (offsets + pubkey + signature) + pub signatures: Vec, + /// Quote header containing the signed slot hash + pub quote_header: PackedQuoteHeader, + /// Array of feed information + pub feeds: Vec, + /// Oracle indices corresponding to queue's oracle array + pub oracle_idxs: Vec, + /// Slot number for freshness validation + pub slot: u64, + /// Version byte + pub version: u8, + /// Tail discriminator "SBOD" + pub discriminator: [u8; 4], +} + +/// Oracle signature data with offsets, pubkey, and signature +/// +/// This is the owned version that stores actual data instead of pointers +#[derive(Debug, Clone, Copy, PartialEq, Eq, BorshSerialize, BorshDeserialize)] +pub struct OracleSignatureData { + /// Offsets structure (kept for reference/debugging) + pub offsets: Ed25519SignatureOffsets, + /// ED25519 public key (32 bytes) + pub pubkey: [u8; 32], + /// ED25519 signature (64 bytes) + pub signature: [u8; 64], +} + +/// Simple error type for parsing failures +#[derive(Debug)] +pub struct ParseError(pub String); + +impl core::fmt::Display for ParseError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl ParsedEd25519Instruction { + /// Parse ED25519 instruction data from raw bytes + /// + /// This function reads the offset-based ED25519 instruction format and + /// extracts all data into owned structures. The format is: + /// + /// ```text + /// [Header: num_signatures(u8) + padding(u8)] + /// [Offsets: Ed25519SignatureOffsets[] (14 bytes each)] + /// [Data Section: signatures, pubkeys at various offsets] + /// [Message: PackedQuoteHeader + PackedFeedInfo[]] + /// [Suffix: oracle_idxs + slot(u64) + version(u8) + "SBOD"(4)] + /// ``` + /// + /// # Arguments + /// * `data` - Raw ED25519 instruction data bytes + /// + /// # Returns + /// * `Ok(ParsedEd25519Instruction)` - Successfully parsed instruction with owned data + /// * `Err` - Failed to parse the instruction data + pub fn parse(data: &[u8]) -> Result { + let data_len = data.len(); + + // Validate minimum size for header + if data_len < 2 { + return Err(ParseError("Data too short for Ed25519SignatureHeader".to_string())); + } + + // Parse header + let num_signatures = data[0]; + let padding = data[1]; + + if num_signatures == 0 { + return Err(ParseError("No signatures found in instruction data".to_string())); + } + if num_signatures > 8 { + return Err(ParseError("Too many signatures - maximum 8 supported".to_string())); + } + + // Extract suffix data from the end + let suffix_len = num_signatures as usize + 13; // oracle_idxs + slot(8) + version(1) + discriminator(4) + if data_len < suffix_len { + return Err(ParseError(format!( + "Data too short for suffix: need {} bytes, got {}", + suffix_len, data_len + ))); + } + + let end_of_message = data_len - suffix_len; + let suffix = &data[end_of_message..]; + + // Parse suffix + let oracle_idxs = suffix[..num_signatures as usize].to_vec(); + let slot_bytes = &suffix[num_signatures as usize..num_signatures as usize + 8]; + let slot = u64::from_le_bytes(slot_bytes.try_into().unwrap()); + let version = suffix[num_signatures as usize + 8]; + let discriminator: [u8; 4] = suffix[num_signatures as usize + 9..num_signatures as usize + 13] + .try_into() + .unwrap(); + + // Parse offsets and extract signature data + let message_data = &data[..end_of_message]; + let mut signatures = Vec::with_capacity(num_signatures as usize); + let mut offset = 2usize; // Skip header + + // Parse first signature to get message location + if offset + ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE > message_data.len() { + return Err(ParseError("Data too short for first signature offsets".to_string())); + } + + let first_offsets = Self::read_offsets(&message_data[offset..offset + ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE]); + let message_offset = first_offsets.message_data_offset as usize; + let message_size = first_offsets.message_data_size as usize; + + // Extract all signatures + for i in 0..num_signatures { + let offsets = Self::read_offsets(&message_data[offset..offset + ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE]); + + // Read pubkey + let pubkey_offset = offsets.public_key_offset as usize; + if pubkey_offset + ED25519_PUBKEY_SERIALIZED_SIZE > message_data.len() { + return Err(ParseError("Pubkey offset out of bounds".to_string())); + } + let pubkey: [u8; 32] = message_data[pubkey_offset..pubkey_offset + ED25519_PUBKEY_SERIALIZED_SIZE] + .try_into() + .unwrap(); + + // Read signature + let sig_offset = offsets.signature_offset as usize; + if sig_offset + ED25519_SIGNATURE_SERIALIZED_SIZE > message_data.len() { + return Err(ParseError("Signature offset out of bounds".to_string())); + } + let signature: [u8; 64] = message_data[sig_offset..sig_offset + ED25519_SIGNATURE_SERIALIZED_SIZE] + .try_into() + .unwrap(); + + signatures.push(OracleSignatureData { + offsets, + pubkey, + signature, + }); + + offset += ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE; + + // Verify message consistency for subsequent signatures + if i > 0 { + if offsets.message_data_offset != first_offsets.message_data_offset { + return Err(ParseError("Message offset mismatch".to_string())); + } + if offsets.message_data_size != first_offsets.message_data_size { + return Err(ParseError("Message size mismatch".to_string())); + } + } + } + + // Parse message: PackedQuoteHeader + PackedFeedInfo[] + if message_offset + message_size > message_data.len() { + return Err(ParseError("Message offset/size out of bounds".to_string())); + } + let message = &message_data[message_offset..message_offset + message_size]; + + // Parse quote header using Borsh deserialization + if message.len() < 32 { + return Err(ParseError("Message too short for PackedQuoteHeader".to_string())); + } + let quote_header = PackedQuoteHeader::try_from_slice(&message[0..32]) + .map_err(|e| ParseError(format!("Failed to deserialize PackedQuoteHeader: {}", e)))?; + + // Parse feeds using Borsh deserialization + let mut feeds = Vec::new(); + let mut feed_offset = 32; // After quote header + while feed_offset + 49 <= message.len() { + let feed_bytes = &message[feed_offset..feed_offset + 49]; + // Use Borsh deserialization since PackedFeedInfo implements BorshDeserialize + let feed = PackedFeedInfo::try_from_slice(feed_bytes) + .map_err(|e| ParseError(format!("Failed to deserialize PackedFeedInfo: {}", e)))?; + feeds.push(feed); + feed_offset += 49; + } + + Ok(Self { + num_signatures, + padding, + signatures, + quote_header, + feeds, + oracle_idxs, + slot, + version, + discriminator, + }) + } + + /// Read Ed25519SignatureOffsets from bytes + fn read_offsets(data: &[u8]) -> Ed25519SignatureOffsets { + assert!(data.len() >= ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE); + + Ed25519SignatureOffsets { + signature_offset: u16::from_le_bytes([data[0], data[1]]), + signature_instruction_index: u16::from_le_bytes([data[2], data[3]]), + public_key_offset: u16::from_le_bytes([data[4], data[5]]), + public_key_instruction_index: u16::from_le_bytes([data[6], data[7]]), + message_data_offset: u16::from_le_bytes([data[8], data[9]]), + message_data_size: u16::from_le_bytes([data[10], data[11]]), + message_instruction_index: u16::from_le_bytes([data[12], data[13]]), + } + } + + /// Serialize this parsed instruction back to raw ED25519 instruction format + /// + /// This reconstructs the offset-based format from the owned data. + /// This is useful if you need to write data back in the original format. + pub fn to_instruction_bytes(&self) -> Vec { + // This is complex - we'd need to reconstruct the offset-based layout + // For now, we'll implement a simple sequential layout + // TODO: Implement proper offset-based serialization if needed + unimplemented!("Reconstructing offset-based format not yet implemented") + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_owned_structure() { + // This test verifies the structure compiles and has correct types + let parsed = ParsedEd25519Instruction { + num_signatures: 1, + padding: 0, + signatures: vec![OracleSignatureData { + offsets: Ed25519SignatureOffsets { + signature_offset: 0, + signature_instruction_index: 0, + public_key_offset: 0, + public_key_instruction_index: 0, + message_data_offset: 0, + message_data_size: 0, + message_instruction_index: 0, + }, + pubkey: [0u8; 32], + signature: [0u8; 64], + }], + quote_header: PackedQuoteHeader { + signed_slothash: [0u8; 32], + }, + feeds: vec![], + oracle_idxs: vec![0], + slot: 0, + version: 0, + discriminator: *b"SBOD", + }; + + // Test Borsh serialization round-trip + let serialized = anchor_lang::prelude::borsh::to_vec(&parsed).expect("Failed to serialize"); + let deserialized: ParsedEd25519Instruction = + anchor_lang::prelude::borsh::from_slice(&serialized).expect("Failed to deserialize"); + + assert_eq!(parsed, deserialized); + } +} diff --git a/programs/switchboard-on-demand/src/on_demand/oracle_quote/mod.rs b/programs/switchboard-on-demand/src/on_demand/oracle_quote/mod.rs new file mode 100644 index 0000000000..04b796e32c --- /dev/null +++ b/programs/switchboard-on-demand/src/on_demand/oracle_quote/mod.rs @@ -0,0 +1,54 @@ +//! Oracle quote verification and data extraction +//! +//! This module provides functionality for verifying and extracting data from oracle quotes +//! that have been cryptographically signed by multiple oracles. The main components are: +//! +//! - [`OracleQuote`] - A verified quote containing oracle feed data +//! - [`QuoteVerifier`] - Builder pattern for configuring and performing verification +//! - [`PackedFeedInfo`] and [`PackedQuoteHeader`] - Zero-copy data structures for efficient access +//! +//! # Usage with Anchor +//! +//! The QuoteVerifier is designed to work seamlessly with Anchor's account wrapper types: +//! +//! ```rust,ignore +//! use anchor_lang::prelude::*; +//! use switchboard_on_demand::QuoteVerifier; +//! +//! pub fn verify_oracle_data(ctx: Context) -> Result<()> { +//! // Destructure accounts - works without lifetime issues +//! let VerifyCtx { queue, oracle, sysvars, .. } = ctx.accounts; +//! let clock_slot = switchboard_on_demand::clock::get_slot(&sysvars.clock); +//! +//! // Build and verify - accepts Anchor wrapper types directly +//! let quote = QuoteVerifier::new() +//! .queue(&queue) // Works with AccountLoader +//! .slothash_sysvar(&sysvars.slothashes) // Works with Sysvar +//! .ix_sysvar(&sysvars.instructions) // Works with Sysvar +//! .clock_slot(clock_slot) // Uses clock slot +//! .max_age(150) +//! .verify_account(&oracle)?; // Works with AccountLoader +//! +//! // Access verified feed data +//! for feed in quote.feeds() { +//! msg!("Feed {}: ${}", feed.hex_id(), feed.value()); +//! } +//! Ok(()) +//! } +//! ``` +//! +//! # Key Features +//! +//! - **Anchor Integration**: All methods accept types implementing `AsAccountInfo` +//! - **Flexible API**: Works with both raw `AccountInfo` and Anchor wrapper types +//! - **Lifetime Safety**: No unsafe code, proper lifetime management through ownership +//! - **Context Destructuring**: Supports destructuring Anchor contexts without lifetime issues + +pub mod feed_info; +pub use feed_info::*; + +pub mod instruction_parser; +pub use instruction_parser::*; + +pub mod switchboard_quote; +pub use switchboard_quote::*; diff --git a/programs/switchboard-on-demand/src/on_demand/oracle_quote/switchboard_quote.rs b/programs/switchboard-on-demand/src/on_demand/oracle_quote/switchboard_quote.rs new file mode 100644 index 0000000000..89fd4f0d18 --- /dev/null +++ b/programs/switchboard-on-demand/src/on_demand/oracle_quote/switchboard_quote.rs @@ -0,0 +1,464 @@ +use crate::smallvec::{SmallVec, U8Prefix, U16Prefix}; +use crate::on_demand::oracle_quote::feed_info::{PackedFeedInfo, PackedQuoteHeader}; +use crate::Pubkey; + +// Compatibility shim for anchor-lang borsh macros +#[cfg(feature = "anchor")] +mod borsh { + pub use anchor_lang::prelude::borsh::*; + pub mod maybestd { + pub mod io { + pub use std::io::*; + } + } +} + +// Import Ed25519SignatureOffsets conditionally +#[cfg(any(feature = "client", not(target_os = "solana")))] +use crate::sysvar::ed25519_sysvar::Ed25519SignatureOffsets; + +// Define Ed25519SignatureOffsets for on-chain use +#[cfg(all(not(feature = "client"), target_os = "solana"))] +#[repr(C)] +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub struct Ed25519SignatureOffsets { + pub signature_offset: u16, + pub signature_instruction_index: u16, + pub public_key_offset: u16, + pub public_key_instruction_index: u16, + pub message_data_offset: u16, + pub message_data_size: u16, + pub message_instruction_index: u16, +} + +#[cfg(all(not(feature = "client"), target_os = "solana"))] +impl anchor_lang::prelude::borsh::BorshSerialize for Ed25519SignatureOffsets { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + writer.write_all(&self.signature_offset.to_le_bytes())?; + writer.write_all(&self.signature_instruction_index.to_le_bytes())?; + writer.write_all(&self.public_key_offset.to_le_bytes())?; + writer.write_all(&self.public_key_instruction_index.to_le_bytes())?; + writer.write_all(&self.message_data_offset.to_le_bytes())?; + writer.write_all(&self.message_data_size.to_le_bytes())?; + writer.write_all(&self.message_instruction_index.to_le_bytes())?; + Ok(()) + } +} + +#[cfg(all(not(feature = "client"), target_os = "solana"))] +impl anchor_lang::prelude::borsh::BorshDeserialize for Ed25519SignatureOffsets { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let mut buf = [0u8; 2]; + reader.read_exact(&mut buf)?; + let signature_offset = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let signature_instruction_index = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let public_key_offset = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let public_key_instruction_index = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let message_data_offset = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let message_data_size = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let message_instruction_index = u16::from_le_bytes(buf); + Ok(Self { + signature_offset, + signature_instruction_index, + public_key_offset, + public_key_instruction_index, + message_data_offset, + message_data_size, + message_instruction_index, + }) + } +} + +pub const QUOTE_DISCRIMINATOR: [u8; 8] = *b"SBOracle"; + +/// Oracle signature data with offsets +#[cfg_attr(feature = "anchor", derive(anchor_lang::AnchorSerialize, anchor_lang::AnchorDeserialize))] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[repr(C)] +pub struct OracleSignature { + /// Offsets to locate signature data within instruction + pub offsets: Ed25519SignatureOffsets, + /// ED25519 public key + pub pubkey: Pubkey, + /// ED25519 signature (64 bytes) + pub signature: [u8; 64], +} + +#[cfg(not(feature = "anchor"))] +impl anchor_lang::prelude::borsh::BorshSerialize for OracleSignature { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + self.offsets.serialize(writer)?; + writer.write_all(self.pubkey.as_ref())?; + writer.write_all(&self.signature)?; + Ok(()) + } +} + +#[cfg(not(feature = "anchor"))] +impl anchor_lang::prelude::borsh::BorshDeserialize for OracleSignature { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let offsets = Ed25519SignatureOffsets::deserialize_reader(reader)?; + let mut pubkey_bytes = [0u8; 32]; + reader.read_exact(&mut pubkey_bytes)?; + let pubkey = Pubkey::new_from_array(pubkey_bytes); + let mut signature = [0u8; 64]; + reader.read_exact(&mut signature)?; + Ok(Self { + offsets, + pubkey, + signature, + }) + } +} + +#[cfg(feature = "idl-build")] +impl anchor_lang::IdlBuild for OracleSignature {} + +/// Switchboard oracle quote account structure +/// +/// # On-chain Layout (excluding 8-byte discriminator): +/// ```text +/// [0..32] queue: Queue pubkey (32 bytes) +/// [34..] signatures: SmallVec of OracleSignature (2-byte u16 length + 110 bytes each) +/// - Ed25519SignatureOffsets (14 bytes) +/// - pubkey (32 bytes) +/// - signature (64 bytes) +/// [..] quote_header: PackedQuoteHeader (32 bytes) +/// [..] feeds: SmallVec of PackedFeedInfo (1-byte u8 length + 49 bytes each) +/// [..] oracle_idxs: SmallVec of oracle indices (1-byte u8 length + u8 each) +/// [..] slot: Slot number (u64, 8 bytes) +/// [..] version: Version (u8, 1 byte) +/// [..] tail_discriminator: "SBOD" (4 bytes) +/// ``` +/// +/// # Length Prefix Sizes +/// - `signatures`: 2-byte (u16) length prefix - allows up to 65535 signatures +/// - `feeds`: 1-byte (u8) length prefix - max 255 feeds +/// - `oracle_idxs`: 1-byte (u8) length prefix - max 255 indices +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SwitchboardQuote { + /// Queue pubkey that this oracle quote belongs to + pub queue: Pubkey, + /// Uses 2-byte (u16) length prefix + pub signatures: SmallVec, + /// Quote header containing the signed slot hash + pub quote_header: PackedQuoteHeader, + /// Array of feed information (max 255) + /// Uses 1-byte (u8) length prefix + pub feeds: SmallVec, + /// Oracle indices that correspond to the queue's oracle array (max 255) + /// Uses 1-byte (u8) length prefix + pub oracle_idxs: SmallVec, + /// Recent slot from the ED25519 instruction data used for freshness validation + pub slot: u64, + /// Version from the ED25519 instruction data + pub version: u8, + /// Tail discriminator "SBOD" for validation + pub tail_discriminator: [u8; 4], +} + +impl anchor_lang::prelude::borsh::BorshSerialize for SwitchboardQuote { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + writer.write_all(self.queue.as_ref())?; + self.signatures.serialize(writer)?; + self.quote_header.serialize(writer)?; + self.feeds.serialize(writer)?; + self.oracle_idxs.serialize(writer)?; + self.slot.serialize(writer)?; + self.version.serialize(writer)?; + self.tail_discriminator.serialize(writer)?; + Ok(()) + } +} + +impl anchor_lang::prelude::borsh::BorshDeserialize for SwitchboardQuote { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let mut queue_bytes = [0u8; 32]; + reader.read_exact(&mut queue_bytes)?; + Ok(Self { + queue: Pubkey::new_from_array(queue_bytes), + signatures: anchor_lang::prelude::borsh::BorshDeserialize::deserialize_reader(reader)?, + quote_header: anchor_lang::prelude::borsh::BorshDeserialize::deserialize_reader(reader)?, + feeds: anchor_lang::prelude::borsh::BorshDeserialize::deserialize_reader(reader)?, + oracle_idxs: anchor_lang::prelude::borsh::BorshDeserialize::deserialize_reader(reader)?, + slot: anchor_lang::prelude::borsh::BorshDeserialize::deserialize_reader(reader)?, + version: anchor_lang::prelude::borsh::BorshDeserialize::deserialize_reader(reader)?, + tail_discriminator: anchor_lang::prelude::borsh::BorshDeserialize::deserialize_reader(reader)?, + }) + } +} + +#[cfg(feature = "anchor")] +impl anchor_lang::Discriminator for SwitchboardQuote { + const DISCRIMINATOR: [u8; 8] = QUOTE_DISCRIMINATOR; +} + +#[cfg(feature = "anchor")] +impl anchor_lang::AccountSerialize for SwitchboardQuote { + fn try_serialize(&self, writer: &mut W) -> anchor_lang::Result<()> { + use anchor_lang::Discriminator; + + // Write discriminator (8 bytes) + writer.write_all(&Self::DISCRIMINATOR)?; + + // Write queue pubkey (32 bytes) + writer.write_all(self.queue.as_ref())?; + + // Serialize the delimited data to a buffer first to get length + let mut delimited_buf = Vec::new(); + anchor_lang::prelude::borsh::BorshSerialize::serialize(&self.signatures, &mut delimited_buf) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + anchor_lang::prelude::borsh::BorshSerialize::serialize(&self.quote_header, &mut delimited_buf) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + anchor_lang::prelude::borsh::BorshSerialize::serialize(&self.feeds, &mut delimited_buf) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + anchor_lang::prelude::borsh::BorshSerialize::serialize(&self.oracle_idxs, &mut delimited_buf) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + anchor_lang::prelude::borsh::BorshSerialize::serialize(&self.slot, &mut delimited_buf) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + anchor_lang::prelude::borsh::BorshSerialize::serialize(&self.version, &mut delimited_buf) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + anchor_lang::prelude::borsh::BorshSerialize::serialize(&self.tail_discriminator, &mut delimited_buf) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + + // Write u16 length prefix + let len = delimited_buf.len() as u16; + writer.write_all(&len.to_le_bytes())?; + + // Write delimited data + writer.write_all(&delimited_buf)?; + + Ok(()) + } +} + +#[cfg(feature = "anchor")] +impl anchor_lang::AccountDeserialize for SwitchboardQuote { + fn try_deserialize(buf: &mut &[u8]) -> anchor_lang::Result { + use anchor_lang::Discriminator; + use crate::on_demand::oracle_quote::instruction_parser::ParsedEd25519Instruction; + + // Check minimum size: discriminator (8) + queue (32) = 40 bytes minimum + if buf.len() < 40 { + return Err(anchor_lang::error::ErrorCode::AccountDiscriminatorNotFound.into()); + } + + // Check discriminator + let given_disc = &buf[..Self::DISCRIMINATOR.len()]; + if given_disc != Self::DISCRIMINATOR { + return Err(anchor_lang::error::ErrorCode::AccountDiscriminatorMismatch.into()); + } + + // Extract queue pubkey (bytes 8-40) + let queue = Pubkey::new_from_array(buf[8..40].try_into().unwrap()); + + // Parse length-delimited ED25519 instruction data starting at byte 40 + let data = &buf[40..]; + if data.len() < 2 { + return Err(anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into()); + } + + // Read u16 length prefix + let len = u16::from_le_bytes([data[0], data[1]]) as usize; + if data.len() < len + 2 { + return Err(anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into()); + } + + // Parse the ED25519 instruction data + let ed25519_data = &data[2..len + 2]; + let parsed = ParsedEd25519Instruction::parse(ed25519_data) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize)?; + + // Convert Vec to SmallVec (will fail if exceeds capacity) + let signatures = parsed.signatures.into_iter() + .map(|sig| OracleSignature { + offsets: sig.offsets, + pubkey: Pubkey::new_from_array(sig.pubkey), + signature: sig.signature, + }) + .collect::>() + .try_into() + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize)?; + + let feeds = parsed.feeds.into_iter() + .collect::>() + .try_into() + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize)?; + + let oracle_idxs = parsed.oracle_idxs.into_iter() + .collect::>() + .try_into() + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize)?; + + Ok(Self { + queue, + signatures, + quote_header: parsed.quote_header, + feeds, + oracle_idxs, + slot: parsed.slot, + version: parsed.version, + tail_discriminator: parsed.discriminator, + }) + } + + fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result { + use crate::on_demand::oracle_quote::instruction_parser::ParsedEd25519Instruction; + + if buf.len() < 40 { + return Err(anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into()); + } + + let full_buf = *buf; + *buf = &[]; // Consume the buffer + + // Extract queue pubkey (bytes 8-40) - skip discriminator check for unchecked + let queue = Pubkey::new_from_array(full_buf[8..40].try_into().unwrap()); + + // Parse length-delimited ED25519 instruction data starting at byte 40 + let data = &full_buf[40..]; + if data.len() < 2 { + return Err(anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into()); + } + + // Read u16 length prefix + let len = u16::from_le_bytes([data[0], data[1]]) as usize; + if data.len() < len + 2 { + return Err(anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into()); + } + + // Parse the ED25519 instruction data + let ed25519_data = &data[2..len + 2]; + let parsed = ParsedEd25519Instruction::parse(ed25519_data) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize)?; + + // Convert Vec to SmallVec (will fail if exceeds capacity) + let signatures = parsed.signatures.into_iter() + .map(|sig| OracleSignature { + offsets: sig.offsets, + pubkey: Pubkey::new_from_array(sig.pubkey), + signature: sig.signature, + }) + .collect::>() + .try_into() + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize)?; + + let feeds = parsed.feeds.into_iter() + .collect::>() + .try_into() + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize)?; + + let oracle_idxs = parsed.oracle_idxs.into_iter() + .collect::>() + .try_into() + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize)?; + + Ok(Self { + queue, + signatures, + quote_header: parsed.quote_header, + feeds, + oracle_idxs, + slot: parsed.slot, + version: parsed.version, + tail_discriminator: parsed.discriminator, + }) + } +} + +#[cfg(feature = "idl-build")] +impl anchor_lang::IdlBuild for SwitchboardQuote {} + +impl SwitchboardQuote { + /// Maximum serialized size estimate for account initialization + /// This is conservative: queue(32) + max_sigs(2 + 8*110) + quote_header(32) + max_feeds(1 + 8*49) + oracle_idxs(1 + 8) + slot(8) + version(1) + tail(4) + pub const MAX_LEN: usize = 32 + (2 + 8 * 110) + 32 + (1 + 8 * 49) + (1 + 8) + 8 + 1 + 4; + + /// Minimum size for empty quote + pub const MIN_LEN: usize = 32 + 2 + 32 + 1 + 1 + 8 + 1 + 4; + + /// Returns a reference to the feed information array + /// + /// # Example + /// ```rust,ignore + /// let feeds = quote.feeds_slice(); + /// for feed in feeds { + /// println!("Feed {}: {}", feed.hex_id(), feed.value()); + /// } + /// ``` + pub fn feeds_slice(&self) -> &[PackedFeedInfo] { + self.feeds.as_slice() + } + + /// Get the canonical oracle account public key for the given feed IDs + /// + /// This method derives the canonical oracle account that the quote program + /// creates and manages for storing verified oracle data. + /// + /// ## Parameters + /// - `queue_key`: The queue public key to use as the first seed + /// - `feed_ids`: Array of feed ID byte arrays (32 bytes each) + /// - `program_id`: The quote program ID to use for derivation + /// + /// ## Returns + /// The canonical oracle account public key + /// + /// ## Example + /// ```rust,ignore + /// let oracle_key = SwitchboardQuote::get_canonical_key(&queue_key, &[feed_id_bytes], "e_program_id); + /// ``` + #[cfg(feature = "anchor")] + pub fn get_canonical_key( + queue_key: &anchor_lang::solana_program::pubkey::Pubkey, + feed_ids: &[&[u8; 32]], + program_id: &anchor_lang::solana_program::pubkey::Pubkey, + ) -> anchor_lang::solana_program::pubkey::Pubkey { + let mut seeds: Vec<&[u8]> = Vec::with_capacity(feed_ids.len() + 1); + seeds.push(queue_key.as_ref()); + for id in feed_ids { + seeds.push(id.as_slice()); + } + let (oracle_account, _) = + anchor_lang::solana_program::pubkey::Pubkey::find_program_address(&seeds, program_id); + oracle_account + } + + /// Get the canonical oracle account for this quote's feeds + /// + /// Convenience method that extracts feed IDs from the current quote + /// and derives the canonical oracle account using the provided owner. + /// + /// ## Parameters + /// - `queue_key`: The queue public key to use as the first seed + /// - `owner`: The program ID that owns this oracle account (usually the quote program) + /// + /// ## Returns + /// The canonical oracle account public key for this quote's feeds + /// + /// ## Example + /// ```rust,ignore + /// let canonical_key = quote.canonical_key(&queue_key, &oracle_account.owner); + /// ``` + #[cfg(feature = "anchor")] + pub fn canonical_key( + &self, + queue_key: &anchor_lang::solana_program::pubkey::Pubkey, + owner: &anchor_lang::solana_program::pubkey::Pubkey, + ) -> anchor_lang::solana_program::pubkey::Pubkey { + let feed_ids: Vec<&[u8; 32]> = self.feeds.iter().map(|feed| feed.feed_id()).collect(); + Self::get_canonical_key(queue_key, &feed_ids, owner) + } +} + +#[cfg(feature = "anchor")] +impl anchor_lang::Owner for SwitchboardQuote { + fn owner() -> anchor_lang::solana_program::pubkey::Pubkey { + crate::QUOTE_PROGRAM_ID.to_bytes().into() + } +} diff --git a/programs/switchboard-on-demand/src/prelude.rs b/programs/switchboard-on-demand/src/prelude.rs new file mode 100644 index 0000000000..0f095ea27c --- /dev/null +++ b/programs/switchboard-on-demand/src/prelude.rs @@ -0,0 +1,24 @@ +// Note: Most client items are NOT re-exported in prelude to avoid naming conflicts. +// Access client functionality via: use switchboard_on_demand::client::{Gateway, PullFeed}; +pub use std::result::Result; + +pub use rust_decimal; +pub use solana_program::entrypoint::ProgramResult; +pub use solana_program::instruction::{AccountMeta, Instruction}; +pub use solana_program::program::{invoke, invoke_signed}; + +pub use crate::accounts::*; +// Client utility functions +#[cfg(feature = "client")] +pub use crate::client::utils::{ix_to_tx, ix_to_tx_v0}; +pub use crate::decimal::*; +pub use crate::instructions::*; +// Use solana_program and Pubkey from the compat layer +pub use crate::solana_compat::{pubkey, solana_program, Pubkey}; +pub use crate::sysvar::*; +pub use crate::types::*; +pub use crate::utils::check_pubkey_eq; +pub use crate::AsAccountInfo; +// When both solana-v2 and client are enabled, export the conversion trait +#[cfg(all(feature = "solana-v2", feature = "client"))] +pub use crate::IntoV2Instruction; diff --git a/programs/switchboard-on-demand/src/program_id.rs b/programs/switchboard-on-demand/src/program_id.rs new file mode 100644 index 0000000000..29c8f8e43c --- /dev/null +++ b/programs/switchboard-on-demand/src/program_id.rs @@ -0,0 +1,34 @@ +#[allow(unused_imports)] +use std::str::FromStr; + +use crate::solana_compat::pubkey; +use crate::Pubkey; + +/// Program id for the Switchboard oracle program +/// SW1TCH7qEPTdLsDHRgPuMQjbQxKdH2aBStViMFnt64f +pub const SWITCHBOARD_PROGRAM_ID: Pubkey = pubkey!("SW1TCH7qEPTdLsDHRgPuMQjbQxKdH2aBStViMFnt64f"); + +/// Switchboard On-Demand program ID for mainnet +pub const ON_DEMAND_MAINNET_PID: Pubkey = pubkey!("SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv"); +/// Switchboard On-Demand program ID for devnet +pub const ON_DEMAND_DEVNET_PID: Pubkey = pubkey!("Aio4gaXjXzJNVLtzwtNVmSqGKpANtXhybbkhtAC94ji2"); + +pub const QUOTE_PROGRAM_ID: Pubkey = pubkey!("orac1eFjzWL5R3RbbdMV68K9H6TaCVVcL6LjvQQWAbz"); + +/// Gets the Switchboard on-demand program ID based on the current network +pub fn get_switchboard_on_demand_program_id() -> Pubkey { + if crate::utils::is_devnet() { + ON_DEMAND_DEVNET_PID + } else { + ON_DEMAND_MAINNET_PID + } +} + +/// Gets the Switchboard program ID for a specific cluster +pub fn get_sb_program_id(cluster: &str) -> Pubkey { + if !cluster.starts_with("mainnet") { + ON_DEMAND_DEVNET_PID + } else { + ON_DEMAND_MAINNET_PID + } +} diff --git a/programs/switchboard-on-demand/src/smallvec.rs b/programs/switchboard-on-demand/src/smallvec.rs new file mode 100644 index 0000000000..23dcdc5c73 --- /dev/null +++ b/programs/switchboard-on-demand/src/smallvec.rs @@ -0,0 +1,376 @@ +//! Small vector types with compact length prefixes for Borsh serialization. +//! +//! Standard Borsh uses 4-byte (u32) length prefixes for vectors. These types +//! use smaller prefixes (1 or 2 bytes) to save space when the maximum length +//! is known to be small. +//! +//! SmallVec is stack-allocated with a maximum capacity of 8 elements. + +use anchor_lang::prelude::borsh::{BorshDeserialize, BorshSerialize}; +use core::mem::MaybeUninit; + +/// Trait for length prefix encoding/decoding +pub trait LengthPrefix: Copy { + /// Maximum capacity this prefix can represent + const MAX_CAPACITY: usize; + + /// Serialize the length to a writer + fn serialize_length(len: usize, writer: &mut W) -> std::io::Result<()>; + + /// Deserialize the length from a reader + fn deserialize_length(reader: &mut R) -> std::io::Result; +} + +/// 1-byte (u8) length prefix - max 255 elements +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct U8Prefix; + +impl LengthPrefix for U8Prefix { + const MAX_CAPACITY: usize = u8::MAX as usize; + + fn serialize_length(len: usize, writer: &mut W) -> std::io::Result<()> { + if len > Self::MAX_CAPACITY { + return Err(std::io::Error::new( + std::io::ErrorKind::InvalidData, + format!("Length {} exceeds u8::MAX ({})", len, Self::MAX_CAPACITY), + )); + } + writer.write_all(&[len as u8]) + } + + fn deserialize_length(reader: &mut R) -> std::io::Result { + let mut buf = [0u8; 1]; + reader.read_exact(&mut buf)?; + Ok(buf[0] as usize) + } +} + +/// 2-byte (u16) length prefix - max 65535 elements +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct U16Prefix; + +impl LengthPrefix for U16Prefix { + const MAX_CAPACITY: usize = u16::MAX as usize; + + fn serialize_length(len: usize, writer: &mut W) -> std::io::Result<()> { + if len > Self::MAX_CAPACITY { + return Err(std::io::Error::new( + std::io::ErrorKind::InvalidData, + format!("Length {} exceeds u16::MAX ({})", len, Self::MAX_CAPACITY), + )); + } + writer.write_all(&(len as u16).to_le_bytes()) + } + + fn deserialize_length(reader: &mut R) -> std::io::Result { + let mut buf = [0u8; 2]; + reader.read_exact(&mut buf)?; + Ok(u16::from_le_bytes(buf) as usize) + } +} + +/// Small vector with configurable length prefix size for compact Borsh serialization. +/// +/// **Stack-allocated with maximum 8 elements.** +/// +/// **Key Difference from Standard Borsh:** +/// - Standard Borsh Vec: Uses 4-byte (u32) length prefix, heap-allocated +/// - SmallVec: Uses 1-byte (u8) length prefix, stack-allocated (max 8 elements) +/// - SmallVec: Uses 2-byte (u16) length prefix, stack-allocated (max 8 elements) +/// +/// # Serialization Format +/// ```text +/// [length: 1 or 2 bytes][element_0][element_1]...[element_n] +/// ``` +/// +/// # Example Size Comparison +/// For a Vec with 3 elements: +/// - Standard Vec: 4 bytes (length) + 12 bytes (data) = 16 bytes +/// - SmallVec<_, U8Prefix>: 1 byte (length) + 12 bytes (data) = 13 bytes (3 bytes saved) +/// - SmallVec<_, U16Prefix>: 2 bytes (length) + 12 bytes (data) = 14 bytes (2 bytes saved) +/// +/// # Examples +/// +/// ```rust +/// use switchboard_on_demand::smallvec::{SmallVec, U8Prefix, U16Prefix}; +/// +/// // For small arrays (max 8 elements) +/// let feeds: SmallVec = vec![1, 2, 3].into(); +/// +/// // For signatures (max 8 elements) +/// let signatures: SmallVec = vec![10, 20, 30].into(); +/// ``` +pub struct SmallVec { + data: [MaybeUninit; 8], + len: u8, + _phantom: core::marker::PhantomData

, +} + +impl SmallVec { + /// Maximum capacity for SmallVec (stack-allocated) + pub const MAX_CAPACITY: usize = 8; + + /// Creates an empty SmallVec + pub fn new() -> Self { + Self { + data: unsafe { MaybeUninit::uninit().assume_init() }, + len: 0, + _phantom: core::marker::PhantomData, + } + } + + /// Creates a SmallVec with the specified capacity (reserved for future use) + pub fn with_capacity(_capacity: usize) -> Self { + Self::new() + } + + /// Appends an element to the back of the collection + pub fn push(&mut self, value: T) { + assert!( + (self.len as usize) < Self::MAX_CAPACITY, + "SmallVec exceeds max capacity: {} >= {}", + self.len, + Self::MAX_CAPACITY + ); + self.data[self.len as usize] = MaybeUninit::new(value); + self.len += 1; + } + + /// Returns the number of elements in the vector + pub fn len(&self) -> usize { + self.len as usize + } + + /// Returns true if the vector contains no elements + pub fn is_empty(&self) -> bool { + self.len == 0 + } + + /// Extracts a slice containing the entire vector + pub fn as_slice(&self) -> &[T] { + unsafe { + core::slice::from_raw_parts( + self.data.as_ptr() as *const T, + self.len as usize + ) + } + } + + /// Returns a mutable slice + pub fn as_mut_slice(&mut self) -> &mut [T] { + unsafe { + core::slice::from_raw_parts_mut( + self.data.as_mut_ptr() as *mut T, + self.len as usize + ) + } + } + + /// Returns an iterator over the slice + pub fn iter(&self) -> core::slice::Iter<'_, T> { + self.as_slice().iter() + } + + /// Returns a mutable iterator over the slice + pub fn iter_mut(&mut self) -> core::slice::IterMut<'_, T> { + self.as_mut_slice().iter_mut() + } +} + +impl Drop for SmallVec { + fn drop(&mut self) { + // Drop all initialized elements + for i in 0..self.len as usize { + unsafe { + self.data[i].assume_init_drop(); + } + } + } +} + +impl Clone for SmallVec { + fn clone(&self) -> Self { + let mut result = Self::new(); + for item in self.as_slice() { + result.push(item.clone()); + } + result + } +} + +impl core::fmt::Debug for SmallVec { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.debug_list().entries(self.as_slice()).finish() + } +} + +impl PartialEq for SmallVec { + fn eq(&self, other: &Self) -> bool { + self.as_slice() == other.as_slice() + } +} + +impl Eq for SmallVec {} + +impl Default for SmallVec { + fn default() -> Self { + Self::new() + } +} + +impl core::ops::Deref for SmallVec { + type Target = [T]; + + fn deref(&self) -> &Self::Target { + self.as_slice() + } +} + +impl core::ops::DerefMut for SmallVec { + fn deref_mut(&mut self) -> &mut Self::Target { + self.as_mut_slice() + } +} + +impl From> for SmallVec { + fn from(vec: Vec) -> Self { + assert!( + vec.len() <= Self::MAX_CAPACITY, + "Vec length {} exceeds SmallVec max capacity {}", + vec.len(), + Self::MAX_CAPACITY + ); + let mut result = Self::new(); + for item in vec { + result.push(item); + } + result + } +} + +impl BorshSerialize for SmallVec { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + // Write length using the prefix strategy + P::serialize_length(self.len as usize, writer)?; + + // Write each element + for item in self.as_slice() { + item.serialize(writer)?; + } + Ok(()) + } +} + +impl BorshDeserialize for SmallVec { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + // Read length using the prefix strategy + let len = P::deserialize_length(reader)?; + + if len > Self::MAX_CAPACITY { + return Err(std::io::Error::new( + std::io::ErrorKind::InvalidData, + format!("Deserialized length {} exceeds max capacity {}", len, Self::MAX_CAPACITY), + )); + } + + // Read elements + let mut result = Self::new(); + for _ in 0..len { + result.push(T::deserialize_reader(reader)?); + } + Ok(result) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_u8_prefix_serialization() { + let small_vec: SmallVec = vec![1, 2, 3].into(); + let mut serialized = Vec::new(); + small_vec.serialize(&mut serialized).unwrap(); + + // First byte should be the length (3) + assert_eq!(serialized[0], 3u8, "First byte should be length as u8"); + + // Total size: 1 byte (length) + 3 * 4 bytes (u32s) = 13 bytes + assert_eq!(serialized.len(), 1 + 3 * 4); + + // Test deserialization + let mut slice = serialized.as_slice(); + let deserialized = SmallVec::::deserialize(&mut slice).unwrap(); + assert_eq!(deserialized.as_slice(), &[1, 2, 3]); + } + + #[test] + fn test_u16_prefix_serialization() { + let small_vec: SmallVec = vec![1, 2, 3].into(); + let mut serialized = Vec::new(); + small_vec.serialize(&mut serialized).unwrap(); + + // First 2 bytes should be the length (3) as u16 little-endian + assert_eq!(serialized[0..2], [3u8, 0u8], "First 2 bytes should be length as u16 LE"); + + // Total size: 2 bytes (length) + 3 * 4 bytes (u32s) = 14 bytes + assert_eq!(serialized.len(), 2 + 3 * 4); + + // Test deserialization + let mut slice = serialized.as_slice(); + let deserialized = SmallVec::::deserialize(&mut slice).unwrap(); + assert_eq!(deserialized.as_slice(), &[1, 2, 3]); + } + + #[test] + fn test_size_comparison() { + // Standard Vec + let regular_vec = vec![1u32, 2u32, 3u32]; + let mut regular_serialized = Vec::new(); + regular_vec.serialize(&mut regular_serialized).unwrap(); + + // SmallVec with U8Prefix + let small_vec_u8: SmallVec = vec![1, 2, 3].into(); + let mut small_u8_serialized = Vec::new(); + small_vec_u8.serialize(&mut small_u8_serialized).unwrap(); + + // SmallVec with U16Prefix + let small_vec_u16: SmallVec = vec![1, 2, 3].into(); + let mut small_u16_serialized = Vec::new(); + small_vec_u16.serialize(&mut small_u16_serialized).unwrap(); + + println!("Size comparison for Vec with 3 elements:"); + println!(" Standard Vec: {} bytes", regular_serialized.len()); + println!(" SmallVec<_, U8Prefix>: {} bytes (saves {} bytes)", + small_u8_serialized.len(), + regular_serialized.len() - small_u8_serialized.len()); + println!(" SmallVec<_, U16Prefix>: {} bytes (saves {} bytes)", + small_u16_serialized.len(), + regular_serialized.len() - small_u16_serialized.len()); + + assert_eq!(regular_serialized.len(), 16); // 4 + 12 + assert_eq!(small_u8_serialized.len(), 13); // 1 + 12 + assert_eq!(small_u16_serialized.len(), 14); // 2 + 12 + } + + #[test] + #[should_panic(expected = "exceeds max capacity")] + fn test_overflow() { + let mut small_vec: SmallVec = SmallVec::new(); + // Try to push 9 elements into an 8-element capacity vector + for i in 0..=8 { + small_vec.push(i); + } + } + + #[test] + fn test_max_capacity() { + let mut small_vec: SmallVec = SmallVec::new(); + // Should be able to push exactly 8 elements + for i in 0..8 { + small_vec.push(i); + } + assert_eq!(small_vec.len(), 8); + assert_eq!(small_vec.as_slice(), &[0, 1, 2, 3, 4, 5, 6, 7]); + } +} diff --git a/programs/switchboard-on-demand/src/solana_compat.rs b/programs/switchboard-on-demand/src/solana_compat.rs new file mode 100644 index 0000000000..fa99b8bb98 --- /dev/null +++ b/programs/switchboard-on-demand/src/solana_compat.rs @@ -0,0 +1,95 @@ +//! Solana version compatibility layer +//! +//! This module provides compatibility between different Solana versions, +//! ensuring the correct types and modules are available regardless of which +//! version of the Solana SDK is being used. + +// ===== Compile-time feature compatibility checks ===== + +// Ensure only one Solana version is enabled +#[cfg(all(feature = "solana-v2", feature = "solana-v3"))] +compile_error!("Cannot enable both 'solana-v2' and 'solana-v3' features at the same time. Choose one."); + +// Ensure only one client version is enabled +#[cfg(all(feature = "client", feature = "client-v3"))] +compile_error!("Cannot enable both 'client' and 'client-v3' features at the same time. Use 'client' for Solana v2 or 'client-v3' for Solana v3."); + +#[cfg(all(feature = "client-v2", feature = "client-v3"))] +compile_error!("Cannot enable both 'client-v2' and 'client-v3' features at the same time. Use 'client-v2' for Solana v2 or 'client-v3' for Solana v3."); + +// When anchor is enabled, use anchor's solana_program (v2.x) +#[cfg(feature = "anchor")] +pub use anchor_lang::solana_program; + +// When anchor is NOT enabled, use version-specific solana_program +// v3 takes precedence when both v2 and v3 are enabled +#[cfg(all(not(feature = "anchor"), feature = "solana-v3"))] +pub extern crate solana_program_v3; +#[cfg(all(not(feature = "anchor"), feature = "solana-v3"))] +pub use solana_program_v3 as solana_program; + +#[cfg(all( + not(feature = "anchor"), + not(feature = "solana-v3"), + feature = "solana-v2" +))] +pub use solana_program as solana_program; + +// Default to using anchor's solana_program when no specific version is enabled +#[cfg(all( + not(feature = "anchor"), + not(feature = "solana-v2"), + not(feature = "solana-v3") +))] +pub use anchor_lang::solana_program; + +// ===== solana_sdk (only when client is enabled) ===== +// The client feature requires anchor-client, which provides solana_sdk + +// When client is enabled, use anchor_client's solana_sdk (which is v2) +#[cfg(feature = "client")] +pub use anchor_client::solana_sdk; + +// ===== solana_client (when client or client-v3 is enabled) ===== +// Version-specific solana-client selection based on features + +// When client-v3 is enabled, use solana-client v3 +#[cfg(feature = "client-v3")] +pub use solana_client_v3 as solana_client; + +// When client is enabled (default v2), use solana-client v2 +#[cfg(feature = "client")] +pub use solana_client_v2 as solana_client; + +// Re-export common types for easier access +pub use solana_program::{ + account_info::AccountInfo, + hash, + instruction::{AccountMeta, Instruction}, + msg, + pubkey::Pubkey, + sysvar, +}; + +// pubkey! macro is exported at the crate root +pub use solana_program::pubkey; + +// System program ID constant (same across all versions) +pub const SYSTEM_PROGRAM_ID: Pubkey = pubkey!("11111111111111111111111111111111"); + +// Address lookup table program ID constant +pub const ADDRESS_LOOKUP_TABLE_PROGRAM_ID: Pubkey = + pubkey!("AddressLookupTab1e1111111111111111111111111"); + +// Re-export sol_memcpy_ based on version +// In v2, it's a direct import from the definitions module +#[cfg(any(feature = "anchor", feature = "solana-v2"))] +extern "C" { + pub fn sol_memcpy_(dst: *mut u8, src: *const u8, n: u64); +} + +// In v3+, declare it as extern (syscalls module doesn't re-export it) +#[cfg(all(not(feature = "anchor"), not(feature = "solana-v2")))] +extern "C" { + pub fn sol_memcpy_(dst: *mut u8, src: *const u8, n: u64); +} diff --git a/programs/switchboard-on-demand/src/sysvar/address_lookup_table.rs b/programs/switchboard-on-demand/src/sysvar/address_lookup_table.rs new file mode 100644 index 0000000000..82602ddf57 --- /dev/null +++ b/programs/switchboard-on-demand/src/sysvar/address_lookup_table.rs @@ -0,0 +1,37 @@ +use crate::Pubkey; + +use crate::{cfg_client, utils, ON_DEMAND_DEVNET_PID, ON_DEMAND_MAINNET_PID}; + +const LUT_SIGNER_SEED: &[u8] = b"LutSigner"; + +/// Finds the address lookup table signer PDA for a given key +pub fn find_lut_signer, P: From<[u8; 32]>>(k: &K) -> P { + let pid = if utils::is_devnet() { + ON_DEMAND_DEVNET_PID + } else { + ON_DEMAND_MAINNET_PID + }; + let (pk, _) = Pubkey::find_program_address(&[LUT_SIGNER_SEED, k.as_ref()], &pid); + P::from(pk.to_bytes()) +} + +cfg_client! { + use crate::OnDemandError; + use anchor_client::solana_client::nonblocking::rpc_client::RpcClient; + use spl_associated_token_account::solana_program::address_lookup_table::state::AddressLookupTable; + use spl_associated_token_account::solana_program::address_lookup_table::AddressLookupTableAccount; + + pub async fn fetch(client: &RpcClient, address: &Pubkey) -> Result { + let converted_address: anchor_client::solana_sdk::pubkey::Pubkey = address.to_bytes().into(); + let account = client.get_account_data(&converted_address) + .await + .map_err(|_| OnDemandError::AddressLookupTableFetchError)?; + let lut = AddressLookupTable::deserialize(&account) + .map_err(|_| OnDemandError::AddressLookupTableDeserializeError)?; + let out = AddressLookupTableAccount { + key: address.to_bytes().into(), + addresses: lut.addresses.iter().cloned().collect(), + }; + Ok(out) + } +} diff --git a/programs/switchboard-on-demand/src/sysvar/clock.rs b/programs/switchboard-on-demand/src/sysvar/clock.rs new file mode 100644 index 0000000000..15d85efebd --- /dev/null +++ b/programs/switchboard-on-demand/src/sysvar/clock.rs @@ -0,0 +1,63 @@ +use crate::{borrow_account_data, check_pubkey_eq, get_account_key, solana_program, AsAccountInfo}; + +/// Optimized function to extract the slot value from a Clock sysvar. +/// +/// This function extracts just the slot value from any type that implements +/// `AsAccountInfo`, making it compatible with Anchor's `Sysvar` wrapper and pinocchio AccountInfo. +/// This is more efficient than parsing the entire Clock struct when you only need the slot. +/// +/// # Arguments +/// * `clock_sysvar` - Any type that implements `AsAccountInfo` (e.g., `Sysvar`, direct `AccountInfo` reference, pinocchio AccountInfo) +/// +/// # Returns +/// The current slot value as a `u64`. +/// +/// # Example with Anchor +/// ```rust,ignore +/// use anchor_lang::prelude::*; +/// use switchboard_on_demand::clock::get_slot; +/// +/// pub fn my_function(ctx: Context) -> Result<()> { +/// let MyCtx { sysvars, .. } = ctx.accounts; +/// let clock_slot = get_slot(&sysvars.clock); // Works with Sysvar +/// +/// // Use the slot value +/// msg!("Current slot: {}", clock_slot); +/// Ok(()) +/// } +/// ``` +/// +/// # Safety +/// This function uses unsafe operations to directly read from the sysvar data. +/// It is safe because it validates the account key against the Clock sysvar ID first +/// and uses unaligned reads to safely extract the slot value. +#[inline(always)] +pub fn get_slot<'a, T>(clock_sysvar: T) -> u64 +where + T: AsAccountInfo<'a>, +{ + assert!(check_pubkey_eq( + *get_account_key!(clock_sysvar.as_account_info()), + solana_program::sysvar::clock::ID + )); + unsafe { + let clock_data = borrow_account_data!(clock_sysvar.as_account_info()); + core::ptr::read_unaligned(clock_data.as_ptr() as *const u64) + } +} + +crate::cfg_client! { + use crate::OnDemandError; + use futures::TryFutureExt; + pub async fn fetch_async( + client: &crate::RpcClient, + ) -> std::result::Result { + let pubkey = anchor_client::solana_sdk::sysvar::clock::id(); + let data = client + .get_account_data(&pubkey) + .map_err(|_| OnDemandError::AccountNotFound) + .await? + .to_vec(); + bincode::deserialize(&data).map_err(|_| OnDemandError::AccountNotFound) + } +} diff --git a/programs/switchboard-on-demand/src/sysvar/ed25519_sysvar.rs b/programs/switchboard-on-demand/src/sysvar/ed25519_sysvar.rs new file mode 100644 index 0000000000..8642bf4dd5 --- /dev/null +++ b/programs/switchboard-on-demand/src/sysvar/ed25519_sysvar.rs @@ -0,0 +1,362 @@ +use anyhow::{bail, Result}; + +use crate::on_demand::oracle_quote::feed_info::{PackedFeedInfo, PackedQuoteHeader}; + +/// Type alias for complex return type to improve readability +pub type ParsedInstructionResult<'a> = Result<( + [ParsedEd25519SignatureDataRef<'a>; 8], + u8, + &'a [u8], + u64, + u8, +)>; + +/// Size of a serialized ED25519 public key in bytes +pub const ED25519_PUBKEY_SERIALIZED_SIZE: usize = 32; +/// Size of a serialized ED25519 signature in bytes +pub const ED25519_SIGNATURE_SERIALIZED_SIZE: usize = 64; +/// Size of ED25519 signature offset structure in bytes +pub const ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE: usize = 14; // 2+2+2+2+2+2+2 = 14 bytes + +// const SBOD_DISCRIMINATOR: u32 = u32::from_le_bytes(*b"SBOD"); + +/// Header structure for ED25519 signature instruction data +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Ed25519SignatureHeader { + /// Number of signatures in the instruction + pub num_signatures: u8, + /// Padding byte for alignment + pub padding: u8, +} + +/// ED25519 signature data offsets within instruction data +#[repr(C)] +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub struct Ed25519SignatureOffsets { + /// Offset to the signature data + pub signature_offset: u16, + /// Instruction index containing the signature + pub signature_instruction_index: u16, + /// Offset to the public key data + pub public_key_offset: u16, + /// Instruction index containing the public key + pub public_key_instruction_index: u16, + /// Offset to the message data + pub message_data_offset: u16, + /// Size of the message data in bytes + pub message_data_size: u16, + /// Instruction index containing the message + pub message_instruction_index: u16, +} + +impl anchor_lang::prelude::borsh::BorshSerialize for Ed25519SignatureOffsets { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + writer.write_all(&self.signature_offset.to_le_bytes())?; + writer.write_all(&self.signature_instruction_index.to_le_bytes())?; + writer.write_all(&self.public_key_offset.to_le_bytes())?; + writer.write_all(&self.public_key_instruction_index.to_le_bytes())?; + writer.write_all(&self.message_data_offset.to_le_bytes())?; + writer.write_all(&self.message_data_size.to_le_bytes())?; + writer.write_all(&self.message_instruction_index.to_le_bytes())?; + Ok(()) + } +} + +impl anchor_lang::prelude::borsh::BorshDeserialize for Ed25519SignatureOffsets { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let mut buf = [0u8; 2]; + reader.read_exact(&mut buf)?; + let signature_offset = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let signature_instruction_index = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let public_key_offset = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let public_key_instruction_index = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let message_data_offset = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let message_data_size = u16::from_le_bytes(buf); + reader.read_exact(&mut buf)?; + let message_instruction_index = u16::from_le_bytes(buf); + Ok(Self { + signature_offset, + signature_instruction_index, + public_key_offset, + public_key_instruction_index, + message_data_offset, + message_data_size, + message_instruction_index, + }) + } +} + +/// Parsed ED25519 signature data with lifetime-bound references +#[derive(Debug, Copy, Clone)] +pub struct ParsedEd25519SignatureDataRef<'a> { + /// Signature data offsets + pub offsets: Ed25519SignatureOffsets, + /// Pointer to the public key data + pub pubkey: *const [u8; ED25519_PUBKEY_SERIALIZED_SIZE], + /// Pointer to the signature data + pub signature: *const [u8; ED25519_SIGNATURE_SERIALIZED_SIZE], + /// Pointer to the message data + pub message: *const u8, + /// Length of the message data + pub message_len: usize, + /// Pointer to the packed quote header + pub bundle_header: *const PackedQuoteHeader, + /// Pointer to the feed information array + pub feed_infos: *const PackedFeedInfo, + /// Number of feeds in the feed information array + pub feed_count: usize, + _phantom: core::marker::PhantomData<&'a ()>, +} + +impl<'a> ParsedEd25519SignatureDataRef<'a> { + /// Creates an empty ParsedEd25519SignatureDataRef with all null pointers + #[inline(always)] + pub fn default_empty() -> Self { + unsafe { core::mem::zeroed() } + } + + #[inline(always)] + /// Returns true if the signature data has valid pointers + pub fn is_valid(&self) -> bool { + !self.pubkey.is_null() + } + + #[inline(always)] + /// Returns the ED25519 public key from the signature + /// # Safety + /// This function assumes the signature data is properly formatted and aligned + pub unsafe fn pubkey(&self) -> &'a [u8; ED25519_PUBKEY_SERIALIZED_SIZE] { + &*self.pubkey + } + + #[inline(always)] + /// Returns the ED25519 signature bytes + /// # Safety + /// This function assumes the signature data is properly formatted and aligned + pub unsafe fn signature(&self) -> &'a [u8; ED25519_SIGNATURE_SERIALIZED_SIZE] { + &*self.signature + } + + #[inline(always)] + /// Returns the message that was signed + /// # Safety + /// This function assumes the message data is properly formatted + pub unsafe fn message(&self) -> &'a [u8] { + core::slice::from_raw_parts(self.message, self.message_len) + } + + #[inline(always)] + /// Returns the oracle quote header from the message + /// # Safety + /// This function assumes the message contains a valid PackedQuoteHeader + pub unsafe fn quote_header(&self) -> &'a PackedQuoteHeader { + &*self.bundle_header + } + + #[inline(always)] + /// Returns the array of feed information from the oracle quote + /// # Safety + /// This function assumes the message contains valid PackedFeedInfo data + pub unsafe fn feed_infos(&self) -> &'a [PackedFeedInfo] { + core::slice::from_raw_parts(self.feed_infos, self.feed_count) + } +} + +/// Utility for parsing ED25519 signature verification sysvar data +pub struct Ed25519Sysvar; +impl Ed25519Sysvar { + /// Ultra-efficient zero-copy ED25519 instruction parsing + /// Supports variable length messages unlike secp256k1 + /// Returns (signatures, sig_count, oracle_idxs, recent_slot, version) + #[inline(always)] + pub fn parse_instruction(data: &[u8]) -> ParsedInstructionResult<'_> { + let data_len = data.len(); // Update data_len to reflect actual ED25519 data length + // Validate minimum size for header before unsafe cast + if data_len < core::mem::size_of::() { + bail!("Data too short for Ed25519SignatureHeader"); + } + + // Parse the header (num_signatures + padding byte) + let header: &Ed25519SignatureHeader = unsafe { std::mem::transmute(&data[0]) }; + let num_signatures = header.num_signatures as usize; + if num_signatures > 8 { + bail!("Too many signatures - maximum 8 supported"); + } + if num_signatures == 0 { + bail!("No signatures found in instruction data"); + } + + // Extract recent_slot and version from the end of instruction data first + // Check for underflow before subtraction + if data_len < 13 + num_signatures { + bail!( + "Data too short for oracle indices and metadata: need {} bytes, got {}", + 13 + num_signatures, + data_len + ); + } + // Discriminator length is 4, slot is 8, version is 1 + let end_of_message = data_len - num_signatures - 13; + let suffix = &data[end_of_message..]; + let oracle_idxs: &[u8] = unsafe { suffix.get_unchecked(..num_signatures) }; + let suffix = unsafe { suffix.get_unchecked(num_signatures..) }; + let slot: u64 = unsafe { + // Direct u64 read for 64-bit machines - data already little-endian + core::ptr::read_unaligned(&suffix[0] as *const u8 as *const u64) + }; + let version: u8 = unsafe { *suffix.get_unchecked(8) }; + + let message_data = &data[..end_of_message]; + + let message_data_ptr = message_data.as_ptr(); + + // Use MaybeUninit to avoid unnecessary initialization + let mut parsed_sigs_array = + unsafe { core::mem::zeroed::<[ParsedEd25519SignatureDataRef; 8]>() }; + let parsed_sigs_ptr = parsed_sigs_array.as_mut_ptr(); + + unsafe { + let mut offset = 2usize; // Skip padding byte after count byte + + // Parse the first signature to get shared message structure + let offset_ptr = message_data_ptr.add(offset); + let first_offsets = *(offset_ptr as *const Ed25519SignatureOffsets); + let first_message_offset = first_offsets.message_data_offset as usize; + let first_message_size = first_offsets.message_data_size as usize; + + // Parse message structure once for all signatures + let message = core::slice::from_raw_parts( + message_data_ptr.add(first_message_offset), + first_message_size, + ); + + if first_message_size < core::mem::size_of::() { + bail!("Message too short for bundle header"); + } + let shared_header: &PackedQuoteHeader = std::mem::transmute(&message[0]); + + const HEADER_SIZE: usize = core::mem::size_of::(); + const FEED_INFO_SIZE: usize = core::mem::size_of::(); + let remaining_bytes = first_message_size - HEADER_SIZE; + + if remaining_bytes % FEED_INFO_SIZE != 0 { + bail!("Invalid message size: remaining bytes not divisible by feed info size, got {}, with feed info size {}", remaining_bytes, FEED_INFO_SIZE); + } + + let shared_feed_count = remaining_bytes / FEED_INFO_SIZE; + if shared_feed_count > 8 { + bail!( + "Too many feeds in message: {} feeds but maximum is 8", + shared_feed_count + ); + } + + let shared_feed_infos = core::slice::from_raw_parts( + message.as_ptr().add(HEADER_SIZE) as *const PackedFeedInfo, + shared_feed_count, + ); + + // Process first signature (i=0) outside the loop + let first_signature_offset = first_offsets.signature_offset as usize; + let first_pubkey_offset = first_offsets.public_key_offset as usize; + let first_message_instruction_index = first_offsets.message_instruction_index; + + let first_pubkey = &*(message_data_ptr.add(first_pubkey_offset) + as *const [u8; ED25519_PUBKEY_SERIALIZED_SIZE]); + let first_signature = &*(message_data_ptr.add(first_signature_offset) + as *const [u8; ED25519_SIGNATURE_SERIALIZED_SIZE]); + + // Write first signature to array + parsed_sigs_ptr.write(ParsedEd25519SignatureDataRef { + offsets: first_offsets, + pubkey: first_pubkey as *const _, + signature: first_signature as *const _, + message: message_data_ptr.add(first_message_offset), + message_len: first_message_size, + bundle_header: shared_header as *const _, + feed_infos: shared_feed_infos.as_ptr(), + feed_count: shared_feed_count, + _phantom: core::marker::PhantomData, + }); + + offset += ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE; + + // Process remaining signatures (i=1 to num_signatures-1) + for i in 1..num_signatures { + // Ultra-fast direct access - no endianness conversion needed + let offset_ptr = message_data_ptr.add(offset); + let offsets = *(offset_ptr as *const Ed25519SignatureOffsets); + + // Direct access without endianness conversion (assumes little-endian or native format) + let signature_offset = offsets.signature_offset as usize; + let pubkey_offset = offsets.public_key_offset as usize; + let message_offset = offsets.message_data_offset as usize; + let message_size = offsets.message_data_size as usize; + + // Verify all messages are identical + if message_offset != first_message_offset || message_size != first_message_size { + bail!("Inconsistent message offsets or sizes"); + } + + // Validate that all instruction indexes match the first signature's message_instruction_index + if offsets.signature_instruction_index != first_message_instruction_index { + bail!( + "Signature instruction index mismatch: expected {}, got {}", + first_message_instruction_index, + offsets.signature_instruction_index + ); + } + if offsets.public_key_instruction_index != first_message_instruction_index { + bail!( + "Public key instruction index mismatch: expected {}, got {}", + first_message_instruction_index, + offsets.public_key_instruction_index + ); + } + if offsets.message_instruction_index != first_message_instruction_index { + bail!( + "Message instruction index mismatch: expected {}, got {}", + first_message_instruction_index, + offsets.message_instruction_index + ); + } + + // Zero-copy references - no copying or allocation + let pubkey = &*(message_data_ptr.add(pubkey_offset) + as *const [u8; ED25519_PUBKEY_SERIALIZED_SIZE]); + let signature = &*(message_data_ptr.add(signature_offset) + as *const [u8; ED25519_SIGNATURE_SERIALIZED_SIZE]); + + // Write directly to final array position - no intermediate copy + parsed_sigs_ptr.add(i).write(ParsedEd25519SignatureDataRef { + offsets, + pubkey: pubkey as *const _, + signature: signature as *const _, + message: message_data_ptr.add(message_offset), + message_len: message_size, + bundle_header: shared_header as *const _, + feed_infos: shared_feed_infos.as_ptr(), + feed_count: shared_feed_count, + _phantom: core::marker::PhantomData, + }); + + offset += ED25519_SIGNATURE_OFFSETS_SERIALIZED_SIZE; + } + + // Array is now fully initialized, safe to assume_init + Ok(( + parsed_sigs_array, + num_signatures as u8, + oracle_idxs, + slot, + version, + )) + } + } +} diff --git a/programs/switchboard-on-demand/src/sysvar/ix_sysvar.rs b/programs/switchboard-on-demand/src/sysvar/ix_sysvar.rs new file mode 100644 index 0000000000..ce13ec6cb5 --- /dev/null +++ b/programs/switchboard-on-demand/src/sysvar/ix_sysvar.rs @@ -0,0 +1,234 @@ +use core::ptr::read_unaligned; + +use solana_program::ed25519_program::ID as ED25519_PROGRAM_ID; +use solana_program::sysvar::instructions::ID as INSTRUCTIONS_SYSVAR_ID; + +use crate::{ + borrow_account_data, check_pubkey_eq, get_account_key, solana_program, AsAccountInfo, Pubkey, +}; + +/// Optimized wrapper for Solana's Instructions sysvar with fast instruction data extraction. +/// +/// This struct provides high-performance access to instruction data from the Instructions sysvar, +/// specifically optimized for ED25519 signature verification workflows. +#[derive(Clone, Default)] +#[cfg_attr(feature = "anchor", derive(serde::Serialize, serde::Deserialize))] +pub struct Instructions; + +/* +#[repr(C)] +pub struct Ed25519SignatureOffsets { + pub signature_offset: u16, + pub signature_instruction_index: u16, + pub public_key_offset: u16, + pub public_key_instruction_index: u16, + pub message_data_offset: u16, + pub message_data_size: u16, + pub message_instruction_index: u16, +} +*/ + +impl Instructions { + /// Extracts instruction data at the specified index. + /// + /// # Arguments + /// * `ix_sysvar` - Reference to the Instructions sysvar account + /// * `idx` - Index of the instruction to extract + /// + /// # Returns + /// * `&[u8]` - Reference to the instruction data + /// + /// # Performance + /// Returns a reference to avoid copying data, saving compute units. + #[inline(always)] + pub fn extract_ix_data<'a, T>(ix_sysvar: T, idx: usize) -> &'a [u8] + where + T: AsAccountInfo<'a>, + { + let ix_sysvar = ix_sysvar.as_account_info(); + assert!(check_pubkey_eq( + *get_account_key!(ix_sysvar), + INSTRUCTIONS_SYSVAR_ID + )); + unsafe { + let data = borrow_account_data!(ix_sysvar); + let base = data.as_ptr(); + + // Read num_instructions from offset + let num_instructions = read_unaligned(base as *const u16) as usize; + + // Ensure idx is within bounds - all instruction indexes MUST match idx + assert!( + idx < num_instructions, + "Instruction index {} out of bounds (max: {})", + idx, + num_instructions + ); + + // Read instruction offset from offset table at position (2 + idx * 2) + let start_offset = read_unaligned(base.add(2 + (idx << 1)) as *const u16) as usize; + + let mut p = base.add(start_offset); + + let num_accounts = read_unaligned(p as *const u16) as usize; + + // Bounds check for account metas (1 byte meta + 32 byte pubkey each) + p = p.add(2 + num_accounts * 33); + + // Read program_id (32 bytes) - return reference to avoid copying + let program_id = &*(p as *const Pubkey); + + // Read data length + let instruction_data_len = read_unaligned(p.add(32) as *const u16) as usize; + + let ix_data_ptr = p.add(34); + let instruction_data = core::slice::from_raw_parts(ix_data_ptr, instruction_data_len); + + // Validate Ed25519SignatureOffsets if this appears to be an Ed25519 instruction + assert!(check_pubkey_eq(program_id, ED25519_PROGRAM_ID)); + assert!(instruction_data_len >= 16); + // Read the first Ed25519SignatureOffsets from instruction data + // Skip 2-byte header (num_signatures + padding), then read offsets struct + // This only checks the first header, the verify call checks that the rest of the + // signatures match this index. + let signature_instruction_index = + read_unaligned(ix_data_ptr.add(4) as *const u16) as usize; + let public_key_instruction_index = + read_unaligned(ix_data_ptr.add(8) as *const u16) as usize; + let message_instruction_index = + read_unaligned(ix_data_ptr.add(14) as *const u16) as usize; + + // All instruction indexes MUST match the current instruction index + assert!( + signature_instruction_index == idx, + "Signature instruction index {} does not match current instruction index {}", + signature_instruction_index, + idx + ); + assert!( + public_key_instruction_index == idx, + "Public key instruction index {} does not match current instruction index {}", + public_key_instruction_index, + idx + ); + assert!( + message_instruction_index == idx, + "Message instruction index {} does not match current instruction index {}", + message_instruction_index, + idx + ); + + instruction_data + } + } + + #[inline(always)] + pub fn extract_ix_data_unchecked<'a, T>(ix_sysvar: T, idx: usize) -> &'a [u8] + where + T: AsAccountInfo<'a>, + { + let ix_sysvar = ix_sysvar.as_account_info(); + unsafe { + let data = borrow_account_data!(ix_sysvar); + let base = data.as_ptr(); + let start_offset = read_unaligned(base.add(2 + (idx << 1)) as *const u16) as usize; + let mut p = base.add(start_offset); + let num_accounts = read_unaligned(p as *const u16) as usize; + p = p.add(2 + num_accounts * 33); + let instruction_data_len = read_unaligned(p.add(32) as *const u16) as usize; + core::slice::from_raw_parts(p.add(34), instruction_data_len) + } + } + + /// Parses instruction data from the Instructions sysvar at the specified index into an OracleQuote without verification. + /// + /// **WARNING**: This function does NOT perform cryptographic verification: + /// - No ED25519 signature validation + /// - No oracle authorization checks + /// - No slot hash verification + /// + /// Use only for data extraction and analysis. For production use, use verified parsing methods. + /// + /// # Arguments + /// * `ix_sysvar` - Reference to the Instructions sysvar account + /// * `idx` - Index of the instruction to parse + /// + /// # Returns + /// * `OracleQuote` - Parsed but unverified oracle quote + /// + /// # Performance + /// Returns references to avoid copying data, saving compute units. + #[inline(always)] + pub fn parse_ix_data_unverified<'a, T>( + ix_sysvar: T, + idx: usize, + ) -> Result, anyhow::Error> + where + T: AsAccountInfo<'a>, + { + let instruction_data = Self::extract_ix_data(ix_sysvar, idx); + + // Create a temporary verifier to parse the instruction data + let verifier = crate::on_demand::oracle_quote::quote_verifier::QuoteVerifier::new(); + let oracle_quote = verifier.parse_unverified(instruction_data)?; + + Ok(oracle_quote) + } +} + +#[cfg(feature = "anchor")] +impl anchor_lang::Owner for Instructions { + fn owner() -> Pubkey { + anchor_lang::solana_program::sysvar::instructions::id() + .to_bytes() + .into() + } +} + +#[cfg(feature = "anchor")] +impl anchor_lang::AccountDeserialize for Instructions { + fn try_deserialize_unchecked(_buf: &mut &[u8]) -> anchor_lang::Result { + // This should not be called for sysvars, but we provide a stub + Err(anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into()) + } +} + +#[cfg(feature = "anchor")] +impl anchor_lang::AccountSerialize for Instructions { + fn try_serialize(&self, _writer: &mut W) -> anchor_lang::Result<()> { + // This should not be called for sysvars, but we provide a stub + Err(anchor_lang::error::ErrorCode::AccountDidNotSerialize.into()) + } +} + +#[cfg(feature = "anchor")] +impl anchor_lang::solana_program::sysvar::SysvarId for Instructions { + fn id() -> anchor_lang::solana_program::pubkey::Pubkey { + anchor_lang::solana_program::sysvar::instructions::id() + } + + fn check_id(pubkey: &anchor_lang::solana_program::pubkey::Pubkey) -> bool { + pubkey == &Self::id() + } +} + +#[cfg(feature = "anchor")] +impl anchor_lang::solana_program::sysvar::Sysvar for Instructions { + fn size_of() -> usize { + // Instructions sysvar has variable size, return 0 as it's not used for deserialization + 0 + } + + fn from_account_info( + account_info: &anchor_lang::solana_program::account_info::AccountInfo, + ) -> core::result::Result { + use anchor_lang::solana_program::sysvar::SysvarId; + // We don't actually deserialize the Instructions sysvar data since we access it directly + // Just validate that it's the correct account + if Self::check_id(account_info.key) { + Ok(Self) + } else { + Err(anchor_lang::solana_program::program_error::ProgramError::InvalidAccountData) + } + } +} diff --git a/programs/switchboard-on-demand/src/sysvar/mod.rs b/programs/switchboard-on-demand/src/sysvar/mod.rs new file mode 100644 index 0000000000..2550c771dc --- /dev/null +++ b/programs/switchboard-on-demand/src/sysvar/mod.rs @@ -0,0 +1,20 @@ +/// Address lookup table utilities +pub mod address_lookup_table; +#[allow(unused_imports)] +pub use address_lookup_table::*; + +/// Slot hash sysvar utilities +pub mod slothash_sysvar; +pub use slothash_sysvar::*; + +/// Instruction sysvar utilities +pub mod ix_sysvar; +pub use ix_sysvar::*; + +/// ED25519 signature verification sysvar utilities +pub mod ed25519_sysvar; +pub use ed25519_sysvar::*; + +/// Clock sysvar utilities +pub mod clock; +pub use clock::*; diff --git a/programs/switchboard-on-demand/src/sysvar/slothash_sysvar.rs b/programs/switchboard-on-demand/src/sysvar/slothash_sysvar.rs new file mode 100644 index 0000000000..4379a825ff --- /dev/null +++ b/programs/switchboard-on-demand/src/sysvar/slothash_sysvar.rs @@ -0,0 +1,110 @@ +use anyhow::{anyhow, bail, Result}; +use arrayref::array_ref; +use bytemuck; + +use crate::solana_compat::{msg, sysvar}; +use crate::{borrow_account_data, check_pubkey_eq, get_account_key}; + +/// Solana slot hash data structure containing slot number and corresponding hash +#[repr(C)] +#[derive(bytemuck::Pod, bytemuck::Zeroable, Debug, Clone, Copy)] +pub struct SlotHash { + /// Slot number + pub slot: u64, + /// 32-byte hash for this slot + pub hash: [u8; 32], +} + +/// Finds the index of a specific slot in the slot hashes array using binary search +/// since slots are often skipped +pub fn find_idx(slot_hashes: &[SlotHash], slot: u64) -> Option { + slot_hashes.binary_search_by(|x| slot.cmp(&x.slot)).ok() +} + +/// Slot hashes sysvar for Solana slot hash verification +#[derive(Copy, Clone, Default, serde::Serialize, serde::Deserialize)] +pub struct SlotHashes; + +#[cfg(feature = "anchor")] +impl anchor_lang::solana_program::sysvar::SysvarId for SlotHashes { + fn id() -> anchor_lang::solana_program::pubkey::Pubkey { + sysvar::slot_hashes::id().to_bytes().into() + } + + fn check_id(id: &anchor_lang::solana_program::pubkey::Pubkey) -> bool { + sysvar::slot_hashes::id() == id.to_bytes().into() + } +} +#[cfg(feature = "anchor")] +impl anchor_lang::solana_program::sysvar::Sysvar for SlotHashes { + // override + fn size_of() -> usize { + // hard-coded so that we don't have to construct an empty + 20_488 // golden, update if MAX_ENTRIES changes + } + + fn from_account_info( + _account_info: &anchor_lang::prelude::AccountInfo, + ) -> Result { + Ok(Self {}) + } +} + +impl<'a> SlotHashes { + /// Gets slot hash using lower byte optimization for performance + #[inline(always)] + pub fn get_slothash_from_lower_byte( + slot_hashes: &crate::AccountInfo, + slot: u16, + ) -> Result { + let (upper_slot, lower_slot) = { + #[allow(unused_unsafe)] + let slots_data = unsafe { borrow_account_data!(slot_hashes) }; + let slots: &[u8] = array_ref![slots_data, 8, 20_480]; + // 20_480 / 40 = 512 + let slots: &[SlotHash] = + unsafe { std::slice::from_raw_parts(slots.as_ptr() as *const SlotHash, 512) }; + let upper_slot = (slots[0].slot & 0xFFFFFFFFFFFF0000) | slot as u64; + let lower_slot = (slots[slots.len() - 1].slot & 0xFFFFFFFFFFFF0000) | slot as u64; + (upper_slot, lower_slot) + }; + if let Ok(slothash) = Self::get_slothash(slot_hashes, upper_slot) { + return Ok(SlotHash { + slot: upper_slot, + hash: slothash, + }); + } + Self::get_slothash(slot_hashes, lower_slot).map(|hash| SlotHash { + slot: lower_slot, + hash, + }) + } + + /// Gets the slot hash for a specific slot from the slot hashes sysvar + pub fn get_slothash(slot_sysvar: &crate::AccountInfo, slot: u64) -> Result<[u8; 32]> { + assert!(check_pubkey_eq( + sysvar::slot_hashes::ID, + *get_account_key!(slot_sysvar) + )); + let slot_hashes = slot_sysvar; + #[allow(unused_unsafe)] + let slots_data = unsafe { borrow_account_data!(slot_hashes) }; + let slots: &[u8] = array_ref![slots_data, 8, 20_480]; + // 20_480 / 40 = 512 + let slots: &[SlotHash] = + unsafe { std::slice::from_raw_parts(slots.as_ptr() as *const SlotHash, 512) }; + if slot > slots[0].slot { + msg!("Error: Your provided slot is too new. Please use confirmed commitment for your connection and processed for simulation."); + bail!("SwitchboardError::InvalidSlotNumber"); + } + let idx = find_idx(slots, slot).ok_or_else(|| anyhow!("InvalidSlotNumber"))?; + let signed_slot = slots[idx]; + assert_eq!(signed_slot.slot, slot); + Ok(signed_slot.hash) + } + + /// Parses slot hash data from raw bytes into SlotHash array + pub fn parse(data: &'a [u8]) -> &'a [SlotHash] { + unsafe { std::slice::from_raw_parts(data[8..].as_ptr() as *const SlotHash, 512) } + } +} diff --git a/programs/switchboard-on-demand/src/test_ids.rs b/programs/switchboard-on-demand/src/test_ids.rs new file mode 100644 index 0000000000..cd4d46770d --- /dev/null +++ b/programs/switchboard-on-demand/src/test_ids.rs @@ -0,0 +1,25 @@ +#[cfg(test)] +mod tests { + use crate::solana_program::sysvar::instructions::ID as INSTRUCTIONS_SYSVAR_ID; + + #[test] + fn print_instructions_sysvar_id() { + let bytes = INSTRUCTIONS_SYSVAR_ID.to_bytes(); + println!("Instructions sysvar ID bytes: {:02x?}", bytes); + + // Convert to u64 array for assembly + let ptr = bytes.as_ptr() as *const u64; + unsafe { + let u64_0 = ptr.read_unaligned(); + let u64_1 = ptr.add(1).read_unaligned(); + let u64_2 = ptr.add(2).read_unaligned(); + let u64_3 = ptr.add(3).read_unaligned(); + + println!("As u64 array for assembly:"); + println!(" [0]: 0x{:016x}", u64_0); + println!(" [1]: 0x{:016x}", u64_1); + println!(" [2]: 0x{:016x}", u64_2); + println!(" [3]: 0x{:016x}", u64_3); + } + } +} \ No newline at end of file diff --git a/programs/switchboard-on-demand/src/types.rs b/programs/switchboard-on-demand/src/types.rs new file mode 100644 index 0000000000..05dc8c2984 --- /dev/null +++ b/programs/switchboard-on-demand/src/types.rs @@ -0,0 +1,2 @@ +pub use crate::decimal::SwitchboardDecimal; +pub use crate::on_demand::*; diff --git a/programs/switchboard-on-demand/src/utils.rs b/programs/switchboard-on-demand/src/utils.rs new file mode 100644 index 0000000000..ebdf0a165f --- /dev/null +++ b/programs/switchboard-on-demand/src/utils.rs @@ -0,0 +1,128 @@ +use crate::solana_program::instruction::Instruction; +use crate::anchor_traits::*; +use crate::solana_compat::{hash, pubkey}; +use crate::Pubkey; + +/// Check if devnet environment is enabled via feature flag OR SB_ENV environment variable +#[inline(always)] +pub fn is_devnet() -> bool { + cfg!(feature = "devnet") || std::env::var("SB_ENV").unwrap_or_default() == "devnet" +} + +/// Default devnet queue address +pub const DEFAULT_DEVNET_QUEUE: Pubkey = pubkey!("EYiAmGSdsQTuCw413V5BzaruWuCCSDgTPtBGvLkXHbe7"); +/// Default mainnet queue address +pub const DEFAULT_MAINNET_QUEUE: Pubkey = pubkey!("A43DyUGA7s8eXPxqEjJY6EBu1KKbNgfxF8h17VAHn13w"); + +/// Returns the default queue address based on the environment (devnet or mainnet) +#[inline(always)] +pub fn default_queue() -> Pubkey { + if is_devnet() { + DEFAULT_DEVNET_QUEUE + } else { + DEFAULT_MAINNET_QUEUE + } +} + +/// SPL Associated Token Account program ID +pub const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID: Pubkey = + pubkey!("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); + +/// SPL Token program ID +pub const SPL_TOKEN_PROGRAM_ID: Pubkey = pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); + +/// Finds the associated token account address for a given owner and mint +pub fn find_associated_token_address(owner: &Pubkey, mint: &Pubkey) -> Pubkey { + let (akey, _bump) = Pubkey::find_program_address( + &[owner.as_ref(), SPL_TOKEN_PROGRAM_ID.as_ref(), mint.as_ref()], + &SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + ); + akey +} + +/// Gets the instruction discriminator for a given instruction name +pub fn get_ixn_discriminator(ixn_name: &str) -> [u8; 8] { + let preimage = format!("global:{}", ixn_name); + let mut sighash = [0u8; 8]; + sighash.copy_from_slice(&solana_program::hash::hash(preimage.as_bytes()).to_bytes()[..8]); + sighash +} + +/// Gets the account discriminator for a given account name +pub fn get_account_discriminator(account_name: &str) -> [u8; 8] { + let id = format!("account:{}", account_name); + hash::hash(id.as_bytes()).to_bytes()[..8] + .try_into() + .unwrap() +} + +/// Reads a u64 value from a pointer at a given offset (unsafe) +/// +/// # Safety +/// The caller must ensure that: +/// - `ptr` is a valid pointer +/// - `ptr.add(offset)` is within bounds and valid +/// - The memory at `ptr.add(offset)` contains a valid u64 value +#[inline(always)] +pub unsafe fn read_u64_at(ptr: *const u64, offset: usize) -> u64 { + core::ptr::read_unaligned(ptr.add(offset)) +} + +/// Reads a u64 value from a pointer (unsafe) +/// +/// # Safety +/// The caller must ensure that: +/// - `ptr` is valid and properly aligned for u64 access +/// - `ptr.add(offset)` is within bounds and valid +/// - The memory at `ptr.add(offset)` contains a valid u64 value +#[inline(always)] +pub unsafe fn read(ptr: *const u64, offset: usize) -> u64 { + *ptr.add(offset) +} + +/// Efficiently compares two Pubkeys for equality +#[inline(always)] +pub fn check_pubkey_eq, R: AsRef<[u8]>>(lhs: L, rhs: R) -> bool { + let lhs_bytes = lhs.as_ref(); + let rhs_bytes = rhs.as_ref(); + + unsafe { + let lhs_ptr = lhs_bytes.as_ptr() as *const u64; + let rhs_ptr = rhs_bytes.as_ptr() as *const u64; + core::ptr::read_unaligned(lhs_ptr) == core::ptr::read_unaligned(rhs_ptr) + && core::ptr::read_unaligned(lhs_ptr.add(1)) + == core::ptr::read_unaligned(rhs_ptr.add(1)) + && core::ptr::read_unaligned(lhs_ptr.add(2)) + == core::ptr::read_unaligned(rhs_ptr.add(2)) + && core::ptr::read_unaligned(lhs_ptr.add(3)) + == core::ptr::read_unaligned(rhs_ptr.add(3)) + } +} + +/// Efficiently compares two 32-byte arrays via u64 pointers (unsafe) +/// +/// # Safety +/// The caller must ensure that: +/// - Both `lhs_ptr` and `rhs_ptr` are valid pointers +/// - Both pointers point to memory regions of at least 32 bytes (4 u64 values) +/// - The memory regions are accessible for the duration of the function call +#[inline(always)] +pub unsafe fn check_p64_eq(lhs_ptr: *const u64, rhs_ptr: *const u64) -> bool { + core::ptr::read_unaligned(lhs_ptr) == core::ptr::read_unaligned(rhs_ptr) + && core::ptr::read_unaligned(lhs_ptr.add(1)) == core::ptr::read_unaligned(rhs_ptr.add(1)) + && core::ptr::read_unaligned(lhs_ptr.add(2)) == core::ptr::read_unaligned(rhs_ptr.add(2)) + && core::ptr::read_unaligned(lhs_ptr.add(3)) == core::ptr::read_unaligned(rhs_ptr.add(3)) +} + +/// Builds a Solana instruction from account metas and instruction data +pub fn build_ix( + program_id: &Pubkey, + accounts: &A, + params: &I, +) -> Instruction { + Instruction { + program_id: *program_id, + accounts: accounts.to_account_metas(None), + data: params.data(), + } +} diff --git a/programs/switchboard-on-demand/src/v2_client_compat.rs b/programs/switchboard-on-demand/src/v2_client_compat.rs new file mode 100644 index 0000000000..abf4a49164 --- /dev/null +++ b/programs/switchboard-on-demand/src/v2_client_compat.rs @@ -0,0 +1,105 @@ +//! Type compatibility layer for using solana-v2 with client features +//! +//! When both features are enabled, this module provides conversion utilities +//! between Solana SDK v2 types (used by on-chain code) and Solana SDK v3 types +//! (used by anchor-client). + +use anchor_client::solana_sdk; + +/// Convert v3 Instruction to v2 Instruction +/// +/// This accepts the specific anchor_lang::solana_program::instruction::Instruction type +/// and converts it to v2 by extracting bytes and reconstructing. +pub fn instruction_v3_to_v2( + ix: anchor_lang::solana_program::instruction::Instruction, +) -> crate::solana_compat::Instruction { + crate::solana_compat::Instruction { + program_id: crate::solana_compat::Pubkey::from(ix.program_id.to_bytes()), + accounts: ix + .accounts + .into_iter() + .map(|meta| crate::solana_compat::AccountMeta { + pubkey: crate::solana_compat::Pubkey::from(meta.pubkey.to_bytes()), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + data: ix.data, + } +} + +/// Trait for converting any instruction type to v2 +pub trait IntoV2Instruction { + fn into_v2_instruction(self) -> crate::solana_compat::Instruction; +} + +/// Implement for anchor_lang's solana_program Instruction type +/// +/// When anchor feature is enabled, `use anchor_lang::solana_program` brings this type into scope, +/// and this is what cfg_client! blocks use +impl IntoV2Instruction for anchor_lang::solana_program::instruction::Instruction { + fn into_v2_instruction(self) -> crate::solana_compat::Instruction { + crate::solana_compat::Instruction { + program_id: crate::solana_compat::Pubkey::from(self.program_id.to_bytes()), + accounts: self + .accounts + .into_iter() + .map(|meta| crate::solana_compat::AccountMeta { + pubkey: crate::solana_compat::Pubkey::from(meta.pubkey.to_bytes()), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + data: self.data, + } + } +} + +/// Convert a Solana v2 Instruction to v3 Instruction +pub fn instruction_v2_to_v3( + ix: crate::solana_compat::Instruction, +) -> solana_sdk::instruction::Instruction { + solana_sdk::instruction::Instruction { + program_id: pubkey_v2_to_v3(ix.program_id), + accounts: ix.accounts.into_iter().map(account_meta_v2_to_v3).collect(), + data: ix.data, + } +} + +/// Convert a Solana v3 Pubkey to v2 Pubkey +pub fn pubkey_v3_to_v2(pubkey: solana_sdk::pubkey::Pubkey) -> crate::solana_compat::Pubkey { + crate::solana_compat::Pubkey::from(pubkey.to_bytes()) +} + +/// Convert a Solana v2 Pubkey to v3 Pubkey +pub fn pubkey_v2_to_v3(pubkey: crate::solana_compat::Pubkey) -> solana_sdk::pubkey::Pubkey { + solana_sdk::pubkey::Pubkey::from(pubkey.to_bytes()) +} + +/// Convert a Solana v3 AccountMeta to v2 AccountMeta +pub fn account_meta_v3_to_v2( + meta: solana_sdk::instruction::AccountMeta, +) -> crate::solana_compat::AccountMeta { + crate::solana_compat::AccountMeta { + pubkey: pubkey_v3_to_v2(meta.pubkey), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + } +} + +/// Convert a Solana v2 AccountMeta to v3 AccountMeta +pub fn account_meta_v2_to_v3( + meta: crate::solana_compat::AccountMeta, +) -> solana_sdk::instruction::AccountMeta { + if meta.is_writable { + if meta.is_signer { + solana_sdk::instruction::AccountMeta::new(pubkey_v2_to_v3(meta.pubkey), true) + } else { + solana_sdk::instruction::AccountMeta::new(pubkey_v2_to_v3(meta.pubkey), false) + } + } else if meta.is_signer { + solana_sdk::instruction::AccountMeta::new_readonly(pubkey_v2_to_v3(meta.pubkey), true) + } else { + solana_sdk::instruction::AccountMeta::new_readonly(pubkey_v2_to_v3(meta.pubkey), false) + } +} diff --git a/programs/switchboard/Cargo.toml b/programs/switchboard/Cargo.toml index 6c6cafb802..e82a93f4b0 100644 --- a/programs/switchboard/Cargo.toml +++ b/programs/switchboard/Cargo.toml @@ -16,7 +16,8 @@ mainnet-beta=[] anchor-test= [] [dependencies] -anchor-lang = "0.29.0" +anchor-lang = "=0.29.0" +ahash = "=0.8.6" [dev-dependencies] base64 = "0.13.0" diff --git a/programs/token_faucet/Cargo.toml b/programs/token_faucet/Cargo.toml index 249906b2cb..31ed4b4b73 100644 --- a/programs/token_faucet/Cargo.toml +++ b/programs/token_faucet/Cargo.toml @@ -15,7 +15,8 @@ mainnet-beta=[] anchor-test= [] [dependencies] -anchor-lang = "0.29.0" +anchor-lang = "=0.29.0" solana-program = "1.16" anchor-spl = "0.29.0" -bytemuck = { version = "1.4.0" } \ No newline at end of file +bytemuck = { version = "1.4.0" } +ahash = "=0.8.6" diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000000..b78a8dbfe7 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +components = ["rustfmt", "clippy"] +channel = "nightly-2024-11-19"