[INFO] fetching crate rhdxmr-publish-test3 0.1.0... [INFO] documenting rhdxmr-publish-test3-0.1.0 against 1.61.0 for beta-1.62-rustdoc-1 [INFO] extracting crate rhdxmr-publish-test3 0.1.0 into /workspace/builds/worker-12/source [INFO] validating manifest of crates.io crate rhdxmr-publish-test3 0.1.0 on toolchain 1.61.0 [INFO] running `Command { std: "/workspace/cargo-home/bin/cargo" "+1.61.0" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] started tweaking crates.io crate rhdxmr-publish-test3 0.1.0 [INFO] finished tweaking crates.io crate rhdxmr-publish-test3 0.1.0 [INFO] tweaked toml for crates.io crate rhdxmr-publish-test3 0.1.0 written to /workspace/builds/worker-12/source/Cargo.toml [INFO] crate crates.io crate rhdxmr-publish-test3 0.1.0 already has a lockfile, it will not be regenerated [INFO] running `Command { std: "/workspace/cargo-home/bin/cargo" "+1.61.0" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded zero v0.1.2 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-12/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-12/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d190cb871061d98bc6d0581d85cb2ecb09a0f8a142ba5463de30be9999fc3251" "/opt/rustwide/cargo-home/bin/cargo" "+1.61.0" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 9c1995288c9c6aaa5aa35a22a33cd0c05c2b34aac6bb26f522734219578bebf9 [INFO] running `Command { std: "docker" "start" "-a" "9c1995288c9c6aaa5aa35a22a33cd0c05c2b34aac6bb26f522734219578bebf9", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "9c1995288c9c6aaa5aa35a22a33cd0c05c2b34aac6bb26f522734219578bebf9", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "9c1995288c9c6aaa5aa35a22a33cd0c05c2b34aac6bb26f522734219578bebf9", kill_on_drop: false }` [INFO] [stdout] 9c1995288c9c6aaa5aa35a22a33cd0c05c2b34aac6bb26f522734219578bebf9 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-12/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-12/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d190cb871061d98bc6d0581d85cb2ecb09a0f8a142ba5463de30be9999fc3251" "/opt/rustwide/cargo-home/bin/cargo" "+1.61.0" "doc" "--frozen" "--no-deps" "--document-private-items" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] acbdda718c0950b7d214df50bd7555f47891dd42b394079cc5d4d09ab398d176 [INFO] running `Command { std: "docker" "start" "-a" "acbdda718c0950b7d214df50bd7555f47891dd42b394079cc5d4d09ab398d176", kill_on_drop: false }` [INFO] [stderr] Compiling memchr v2.4.1 [INFO] [stderr] Compiling radium v0.5.3 [INFO] [stderr] Compiling libc v0.2.102 [INFO] [stderr] Compiling version_check v0.9.3 [INFO] [stderr] Compiling glob v0.3.0 [INFO] [stderr] Compiling proc-macro2 v1.0.29 [INFO] [stderr] Compiling funty v1.1.0 [INFO] [stderr] Compiling tap v1.0.1 [INFO] [stderr] Compiling wyz v0.2.0 [INFO] [stderr] Compiling cfg-if v1.0.0 [INFO] [stderr] Compiling unicode-xid v0.2.2 [INFO] [stderr] Compiling bindgen v0.59.1 [INFO] [stderr] Compiling regex-syntax v0.6.25 [INFO] [stderr] Compiling rustc-hash v1.1.0 [INFO] [stderr] Compiling lazycell v1.3.0 [INFO] [stderr] Compiling lazy_static v1.4.0 [INFO] [stderr] Compiling bitflags v1.3.2 [INFO] [stderr] Compiling peeking_take_while v0.1.2 [INFO] [stderr] Compiling shlex v1.1.0 [INFO] [stderr] Compiling cc v1.0.70 [INFO] [stderr] Checking zero v0.1.2 [INFO] [stderr] Compiling libloading v0.7.0 [INFO] [stderr] Compiling nom v6.1.2 [INFO] [stderr] Compiling clang-sys v1.2.2 [INFO] [stderr] Compiling bitvec v0.19.5 [INFO] [stderr] Checking aho-corasick v0.7.18 [INFO] [stderr] Compiling quote v1.0.9 [INFO] [stderr] Checking regex v1.5.4 [INFO] [stderr] Compiling cexpr v0.5.0 [INFO] [stderr] Compiling rhdxmr-publish-test3 v0.1.0 (/opt/rustwide/workdir) [INFO] [stderr] Documenting rhdxmr-publish-test3 v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: could not parse code block as Rust code [INFO] [stdout] --> /opt/rustwide/target/debug/build/rhdxmr-publish-test3-ca3a5ccc900ce0dc/out/perf_reader_bindings.rs:3:27938 [INFO] [stdout] | [INFO] [stdout] 3 | ... ; # [doc = " DOC: eBPF Syscall Preamble"] # [doc = ""] # [doc = " The operation to be performed by the **bpf**\\ () system call is determined"] # [doc = " by the *cmd* argument. Each operation takes an accompanying argument,"] # [doc = " provided via *attr*, which is a pointer to a union of type *bpf_attr* (see"] # [doc = " below). The size argument is the size of the union pointed to by *attr*."] # [doc = " DOC: eBPF Syscall Commands"] # [doc = ""] # [doc = " BPF_MAP_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate a map and return a file descriptor that refers to the"] # [doc = "\t\tmap. The close-on-exec file descriptor flag (see **fcntl**\\ (2))"] # [doc = "\t\tis automatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_MAP_CREATE** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with a given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *map_fd*."] # [doc = ""] # [doc = "\t\tThe *flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tCreate or update an element (key/value pair) in a specified map."] # [doc = ""] # [doc = "\t\tThe *flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate a new element or update an existing element."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate a new element only if it did not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate an existing element."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate a spin_lock-ed map element."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**,"] # [doc = "\t\t**E2BIG**, **EEXIST**, or **ENOENT**."] # [doc = ""] # [doc = "\t\t**E2BIG**"] # [doc = "\t\t\tThe number of elements in the map reached the"] # [doc = "\t\t\t*max_entries* limit specified at map creation time."] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up and delete an element by key in a specified map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_KEY"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element by key in a specified map and return the key"] # [doc = "\t\tof the next element. Can be used to iterate over all elements"] # [doc = "\t\tin the map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tThe following cases can be used to iterate over all elements of"] # [doc = "\t\tthe map:"] # [doc = ""] # [doc = "\t\t* If *key* is not found, the operation returns zero and sets"] # [doc = "\t\t the *next_key* pointer to the key of the first element."] # [doc = "\t\t* If *key* is found, the operation returns zero and sets the"] # [doc = "\t\t *next_key* pointer to the key of the next element."] # [doc = "\t\t* If *key* is the last element, returns -1 and *errno* is set"] # [doc = "\t\t to **ENOENT**."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or"] # [doc = "\t\t**EINVAL** on error."] # [doc = ""] # [doc = " BPF_PROG_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load an eBPF program, returning a new file"] # [doc = "\t\tdescriptor associated with the program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_PROG_LOAD** will unload the eBPF program (but see NOTES)."] # [doc = ""] # [doc = "\t\tThe close-on-exec file descriptor flag (see **fcntl**\\ (2)) is"] # [doc = "\t\tautomatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_PIN"] # [doc = "\tDescription"] # [doc = "\t\tPin an eBPF program or map referred by the specified *bpf_fd*"] # [doc = "\t\tto the provided *pathname* on the filesystem."] # [doc = ""] # [doc = "\t\tThe *pathname* argument must not contain a dot (\".\")."] # [doc = ""] # [doc = "\t\tOn success, *pathname* retains a reference to the eBPF object,"] # [doc = "\t\tpreventing deallocation of the object when the original"] # [doc = "\t\t*bpf_fd* is closed. This allow the eBPF object to live beyond"] # [doc = "\t\t**close**\\ (\\ *bpf_fd*\\ ), and hence the lifetime of the parent"] # [doc = "\t\tprocess."] # [doc = ""] # [doc = "\t\tApplying **unlink**\\ (2) or similar calls to the *pathname*"] # [doc = "\t\tunpins the object from the filesystem, removing the reference."] # [doc = "\t\tIf no other file descriptors or filesystem nodes refer to the"] # [doc = "\t\tsame object, it will be deallocated (see NOTES)."] # [doc = ""] # [doc = "\t\tThe filesystem type for the parent directory of *pathname* must"] # [doc = "\t\tbe **BPF_FS_MAGIC**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_OBJ_GET"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF object pinned to the"] # [doc = "\t\tspecified *pathname*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_PROG_ATTACH"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *attach_type* specifies the eBPF attachment point to"] # [doc = "\t\tattach the program to, and must be one of *bpf_attach_type*"] # [doc = "\t\t(see below)."] # [doc = ""] # [doc = "\t\tThe *attach_bpf_fd* must be a valid file descriptor for a"] # [doc = "\t\tloaded eBPF program of a cgroup, flow dissector, LIRC, sockmap"] # [doc = "\t\tor sock_ops type corresponding to the specified *attach_type*."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_SK_MSG**"] # [doc = ""] # [doc = "\t\t\teBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tDetach the eBPF program associated with the *target_fd* at the"] # [doc = "\t\thook specified by *attach_type*. The program must have been"] # [doc = "\t\tpreviously attached using **BPF_PROG_ATTACH**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_TEST_RUN"] # [doc = "\tDescription"] # [doc = "\t\tRun the eBPF program associated with the *prog_fd* a *repeat*"] # [doc = "\t\tnumber of times against a provided program context *ctx_in* and"] # [doc = "\t\tdata *data_in*, and return the modified program context"] # [doc = "\t\t*ctx_out*, *data_out* (for example, packet data), result of the"] # [doc = "\t\texecution *retval*, and *duration* of the test run."] # [doc = ""] # [doc = "\t\tThe sizes of the buffers provided as input and output"] # [doc = "\t\tparameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must"] # [doc = "\t\tbe provided in the corresponding variables *ctx_size_in*,"] # [doc = "\t\t*ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any"] # [doc = "\t\tof these parameters are not provided (ie set to NULL), the"] # [doc = "\t\tcorresponding size field must be zero."] # [doc = ""] # [doc = "\t\tSome program types have particular requirements:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_LOOKUP**"] # [doc = "\t\t\t*data_in* and *data_out* must be NULL."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT**,"] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE**"] # [doc = ""] # [doc = "\t\t\t*ctx_out*, *data_in* and *data_out* must be NULL."] # [doc = "\t\t\t*repeat* must be zero."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\t**ENOSPC**"] # [doc = "\t\t\tEither *data_size_out* or *ctx_size_out* is too small."] # [doc = "\t\t**ENOTSUPP**"] # [doc = "\t\t\tThis command is not supported by the program type of"] # [doc = "\t\t\tthe program referred to by *prog_fd*."] # [doc = ""] # [doc = " BPF_PROG_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF program currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF program with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF programs"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF map currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF map with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF maps"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_PROG_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF program corresponding to"] # [doc = "\t\t*prog_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF map corresponding to"] # [doc = "\t\t*map_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_GET_INFO_BY_FD"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about the eBPF object corresponding to"] # [doc = "\t\t*bpf_fd*."] # [doc = ""] # [doc = "\t\tPopulates up to *info_len* bytes of *info*, which will be in"] # [doc = "\t\tone of the following formats depending on the eBPF object type"] # [doc = "\t\tof *bpf_fd*:"] # [doc = ""] # [doc = "\t\t* **struct bpf_prog_info**"] # [doc = "\t\t* **struct bpf_map_info**"] # [doc = "\t\t* **struct bpf_btf_info**"] # [doc = "\t\t* **struct bpf_link_info**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\tspecified *attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_QUERY** always fetches the number of programs"] # [doc = "\t\tattached and the *attach_flags* which were used to attach those"] # [doc = "\t\tprograms. Additionally, if *prog_ids* is nonzero and the number"] # [doc = "\t\tof attached programs is less than *prog_cnt*, populates"] # [doc = "\t\t*prog_ids* with the eBPF program ids of the programs attached"] # [doc = "\t\tat *target_fd*."] # [doc = ""] # [doc = "\t\tThe following flags may alter the result:"] # [doc = ""] # [doc = "\t\t**BPF_F_QUERY_EFFECTIVE**"] # [doc = "\t\t\tOnly return information regarding programs which are"] # [doc = "\t\t\tcurrently effective at the specified *target_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_RAW_TRACEPOINT_OPEN"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a tracepoint *name* to access kernel"] # [doc = "\t\tinternal arguments of the tracepoint in their raw form."] # [doc = ""] # [doc = "\t\tThe *prog_fd* must be a valid file descriptor associated with"] # [doc = "\t\ta loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**."] # [doc = ""] # [doc = "\t\tNo ABI guarantees are made about the content of tracepoint"] # [doc = "\t\targuments exposed to the corresponding eBPF program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load BPF Type Format (BTF) metadata into the kernel,"] # [doc = "\t\treturning a new file descriptor associated with the metadata."] # [doc = "\t\tBTF is described in more detail at"] # [doc = "\t\thttps://www.kernel.org/doc/html/latest/bpf/btf.html."] # [doc = ""] # [doc = "\t\tThe *btf* parameter must point to valid memory providing"] # [doc = "\t\t*btf_size* bytes of BTF binary metadata."] # [doc = ""] # [doc = "\t\tThe returned file descriptor can be passed to other **bpf**\\ ()"] # [doc = "\t\tsubcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to"] # [doc = "\t\tassociate the BTF with those objects."] # [doc = ""] # [doc = "\t\tSimilar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional"] # [doc = "\t\tparameters to specify a *btf_log_buf*, *btf_log_size* and"] # [doc = "\t\t*btf_log_level* which allow the kernel to return freeform log"] # [doc = "\t\toutput regarding the BTF verification process."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the BPF Type Format (BTF)"] # [doc = "\t\tcorresponding to *btf_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_TASK_FD_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\ttarget process identified by *pid* and *fd*."] # [doc = ""] # [doc = "\t\tIf the *pid* and *fd* are associated with a tracepoint, kprobe"] # [doc = "\t\tor uprobe perf event, then the *prog_id* and *fd_type* will"] # [doc = "\t\tbe populated with the eBPF program id and file descriptor type"] # [doc = "\t\tof type **bpf_task_fd_type**. If associated with a kprobe or"] # [doc = "\t\tuprobe, the *probe_offset* and *probe_addr* will also be"] # [doc = "\t\tpopulated. Optionally, if *buf* is provided, then up to"] # [doc = "\t\t*buf_len* bytes of *buf* will be populated with the name of"] # [doc = "\t\tthe tracepoint, kprobe or uprobe."] # [doc = ""] # [doc = "\t\tThe resulting *prog_id* may be introspected in deeper detail"] # [doc = "\t\tusing **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with the given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *fd*, and if found, delete the element."] # [doc = ""] # [doc = "\t\tFor **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map"] # [doc = "\t\ttypes, the *flags* argument needs to be set to 0, but for other"] # [doc = "\t\tmap types, it may be specified as:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up and delete the value of a spin-locked map"] # [doc = "\t\t\twithout returning the lock. This must be specified if"] # [doc = "\t\t\tthe elements contain a spinlock."] # [doc = ""] # [doc = "\t\tThe **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types"] # [doc = "\t\timplement this command as a \"pop\" operation, deleting the top"] # [doc = "\t\telement rather than one corresponding to *key*."] # [doc = "\t\tThe *key* and *key_len* parameters should be zeroed when"] # [doc = "\t\tissuing this operation for these map types."] # [doc = ""] # [doc = "\t\tThis command is only valid for the following map types:"] # [doc = "\t\t* **BPF_MAP_TYPE_QUEUE**"] # [doc = "\t\t* **BPF_MAP_TYPE_STACK**"] # [doc = "\t\t* **BPF_MAP_TYPE_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_PERCPU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_PERCPU_HASH**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_FREEZE"] # [doc = "\tDescription"] # [doc = "\t\tFreeze the permissions of the specified map."] # [doc = ""] # [doc = "\t\tWrite permissions may be frozen by passing zero *flags*."] # [doc = "\t\tUpon success, no future syscall invocations may alter the"] # [doc = "\t\tmap state of *map_fd*. Write operations from eBPF programs"] # [doc = "\t\tare still possible for a frozen map."] # [doc = ""] # [doc = "\t\tNot supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_BTF_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next BPF Type Format (BTF) object currently loaded"] # [doc = "\t\tinto the kernel."] # [doc = ""] # [doc = "\t\tLooks for the BTF object with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other BTF objects"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and fetch multiple elements in a map."] # [doc = ""] # [doc = "\t\tTwo opaque values are used to manage batch operations,"] # [doc = "\t\t*in_batch* and *out_batch*. Initially, *in_batch* must be set"] # [doc = "\t\tto NULL to begin the batched operation. After each subsequent"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant"] # [doc = "\t\t*out_batch* as the *in_batch* for the next operation to"] # [doc = "\t\tcontinue iteration from the current point."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are output parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are copied into the"] # [doc = "\t\tuser buffer, with the keys copied into *keys* and the values"] # [doc = "\t\tcopied into the corresponding indices in *values*."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOSPC** to indicate that *keys* or"] # [doc = "\t\t*values* is too small to dump an entire bucket during"] # [doc = "\t\titeration of a hash-based map type."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and delete all elements in a map."] # [doc = ""] # [doc = "\t\tThis operation has the same behavior as"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH** with two exceptions:"] # [doc = ""] # [doc = "\t\t* Every element that is successfully returned is also deleted"] # [doc = "\t\t from the map. This is at least *count* elements. Note that"] # [doc = "\t\t *count* is both an input and an output parameter."] # [doc = "\t\t* Upon returning with *errno* set to **EFAULT**, up to"] # [doc = "\t\t *count* elements may be deleted without returning the keys"] # [doc = "\t\t and values of the deleted elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tUpdate multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are input parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially updated to the"] # [doc = "\t\tvalue in the corresponding index in *values*. The *in_batch*"] # [doc = "\t\tand *out_batch* parameters are ignored and should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate new elements or update a existing elements."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate new elements only if they do not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate existing elements."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate spin_lock-ed map elements. This must be"] # [doc = "\t\t\tspecified if the map value contains a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or"] # [doc = "\t\t**E2BIG**. **E2BIG** indicates that the number of elements in"] # [doc = "\t\tthe map reached the *max_entries* limit specified at map"] # [doc = "\t\tcreation time."] # [doc = ""] # [doc = "\t\tMay set *errno* to one of the following error codes under"] # [doc = "\t\tspecific circumstances:"] # [doc = ""] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tDelete multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* parameter is an input parameter which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tsize of the map *map_fd*, that is, *key_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially deleted. The"] # [doc = "\t\t*in_batch*, *out_batch*, and *values* parameters are ignored"] # [doc = "\t\tand should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements. If"] # [doc = "\t\t*errno* is **EFAULT**, up to *count* elements may be been"] # [doc = "\t\tdeleted."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook and return a file descriptor handle for"] # [doc = "\t\tmanaging the link."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_UPDATE"] # [doc = "\tDescription"] # [doc = "\t\tUpdate the eBPF program in the specified *link_fd* to"] # [doc = "\t\t*new_prog_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF Link corresponding to"] # [doc = "\t\t*link_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF link currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF link with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF links"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_ENABLE_STATS"] # [doc = "\tDescription"] # [doc = "\t\tEnable eBPF runtime statistics gathering."] # [doc = ""] # [doc = "\t\tRuntime statistics gathering for the eBPF runtime is disabled"] # [doc = "\t\tby default to minimize the corresponding performance overhead."] # [doc = "\t\tThis command enables statistics globally."] # [doc = ""] # [doc = "\t\tMultiple programs may independently enable statistics."] # [doc = "\t\tAfter gathering the desired statistics, eBPF runtime statistics"] # [doc = "\t\tmay be disabled again by calling **close**\\ (2) for the file"] # [doc = "\t\tdescriptor returned by this function. Statistics will only be"] # [doc = "\t\tdisabled system-wide when all outstanding file descriptors"] # [doc = "\t\treturned by prior calls for this subcommand are closed."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_ITER_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate an iterator on top of the specified *link_fd* (as"] # [doc = "\t\tpreviously created using **BPF_LINK_CREATE**) and return a"] # [doc = "\t\tfile descriptor that can be used to trigger the iteration."] # [doc = ""] # [doc = "\t\tIf the resulting file descriptor is pinned to the filesystem"] # [doc = "\t\tusing **BPF_OBJ_PIN**, then subsequent **read**\\ (2) syscalls"] # [doc = "\t\tfor that path will trigger the iterator to read kernel state"] # [doc = "\t\tusing the eBPF program attached to *link_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tForcefully detach the specified *link_fd* from its"] # [doc = "\t\tcorresponding attachment point."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_BIND_MAP"] # [doc = "\tDescription"] # [doc = "\t\tBind a map to the lifetime of an eBPF program."] # [doc = ""] # [doc = "\t\tThe map identified by *map_fd* is bound to the program"] # [doc = "\t\tidentified by *prog_fd* and only released when *prog_fd* is"] # [doc = "\t\treleased. This may be used in cases where metadata should be"] # [doc = "\t\tassociated with a program which otherwise does not contain any"] # [doc = "\t\treferences to the map (for example, embedded in the eBPF"] # [doc = "\t\tprogram instructions)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " NOTES"] # [doc = "\teBPF objects (maps and programs) can be shared between processes."] # [doc = ""] # [doc = "\t* After **fork**\\ (2), the child inherits file descriptors"] # [doc = "\t referring to the same eBPF objects."] # [doc = "\t* File descriptors referring to eBPF objects can be transferred over"] # [doc = "\t **unix**\\ (7) domain sockets."] # [doc = "\t* File descriptors referring to eBPF objects can be duplicated in the"] # [doc = "\t usual way, using **dup**\\ (2) and similar calls."] # [doc = "\t* File descriptors referring to eBPF objects can be pinned to the"] # [doc = "\t filesystem using the **BPF_OBJ_PIN** command of **bpf**\\ (2)."] # [doc = ""] # [doc = "\tAn eBPF object is deallocated only after all file descriptors referring"] # [doc = "\tto the object have been closed and no references remain pinned to the"] # [doc = "\tfilesystem or attached (for example, bound to a program or device)."] pu... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(rustdoc::invalid_rust_codeblocks)]` on by default [INFO] [stdout] = note: error from rustc: unknown start of token: \ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: could not parse code block as Rust code [INFO] [stdout] --> /opt/rustwide/target/debug/build/rhdxmr-publish-test3-ca3a5ccc900ce0dc/out/libbpf_bindings.rs:3:119978 [INFO] [stdout] | [INFO] [stdout] 3 | ... ; # [doc = " DOC: eBPF Syscall Preamble"] # [doc = ""] # [doc = " The operation to be performed by the **bpf**\\ () system call is determined"] # [doc = " by the *cmd* argument. Each operation takes an accompanying argument,"] # [doc = " provided via *attr*, which is a pointer to a union of type *bpf_attr* (see"] # [doc = " below). The size argument is the size of the union pointed to by *attr*."] # [doc = " DOC: eBPF Syscall Commands"] # [doc = ""] # [doc = " BPF_MAP_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate a map and return a file descriptor that refers to the"] # [doc = "\t\tmap. The close-on-exec file descriptor flag (see **fcntl**\\ (2))"] # [doc = "\t\tis automatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_MAP_CREATE** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with a given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *map_fd*."] # [doc = ""] # [doc = "\t\tThe *flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tCreate or update an element (key/value pair) in a specified map."] # [doc = ""] # [doc = "\t\tThe *flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate a new element or update an existing element."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate a new element only if it did not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate an existing element."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate a spin_lock-ed map element."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**,"] # [doc = "\t\t**E2BIG**, **EEXIST**, or **ENOENT**."] # [doc = ""] # [doc = "\t\t**E2BIG**"] # [doc = "\t\t\tThe number of elements in the map reached the"] # [doc = "\t\t\t*max_entries* limit specified at map creation time."] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up and delete an element by key in a specified map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_KEY"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element by key in a specified map and return the key"] # [doc = "\t\tof the next element. Can be used to iterate over all elements"] # [doc = "\t\tin the map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tThe following cases can be used to iterate over all elements of"] # [doc = "\t\tthe map:"] # [doc = ""] # [doc = "\t\t* If *key* is not found, the operation returns zero and sets"] # [doc = "\t\t the *next_key* pointer to the key of the first element."] # [doc = "\t\t* If *key* is found, the operation returns zero and sets the"] # [doc = "\t\t *next_key* pointer to the key of the next element."] # [doc = "\t\t* If *key* is the last element, returns -1 and *errno* is set"] # [doc = "\t\t to **ENOENT**."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or"] # [doc = "\t\t**EINVAL** on error."] # [doc = ""] # [doc = " BPF_PROG_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load an eBPF program, returning a new file"] # [doc = "\t\tdescriptor associated with the program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_PROG_LOAD** will unload the eBPF program (but see NOTES)."] # [doc = ""] # [doc = "\t\tThe close-on-exec file descriptor flag (see **fcntl**\\ (2)) is"] # [doc = "\t\tautomatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_PIN"] # [doc = "\tDescription"] # [doc = "\t\tPin an eBPF program or map referred by the specified *bpf_fd*"] # [doc = "\t\tto the provided *pathname* on the filesystem."] # [doc = ""] # [doc = "\t\tThe *pathname* argument must not contain a dot (\".\")."] # [doc = ""] # [doc = "\t\tOn success, *pathname* retains a reference to the eBPF object,"] # [doc = "\t\tpreventing deallocation of the object when the original"] # [doc = "\t\t*bpf_fd* is closed. This allow the eBPF object to live beyond"] # [doc = "\t\t**close**\\ (\\ *bpf_fd*\\ ), and hence the lifetime of the parent"] # [doc = "\t\tprocess."] # [doc = ""] # [doc = "\t\tApplying **unlink**\\ (2) or similar calls to the *pathname*"] # [doc = "\t\tunpins the object from the filesystem, removing the reference."] # [doc = "\t\tIf no other file descriptors or filesystem nodes refer to the"] # [doc = "\t\tsame object, it will be deallocated (see NOTES)."] # [doc = ""] # [doc = "\t\tThe filesystem type for the parent directory of *pathname* must"] # [doc = "\t\tbe **BPF_FS_MAGIC**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_OBJ_GET"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF object pinned to the"] # [doc = "\t\tspecified *pathname*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_PROG_ATTACH"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *attach_type* specifies the eBPF attachment point to"] # [doc = "\t\tattach the program to, and must be one of *bpf_attach_type*"] # [doc = "\t\t(see below)."] # [doc = ""] # [doc = "\t\tThe *attach_bpf_fd* must be a valid file descriptor for a"] # [doc = "\t\tloaded eBPF program of a cgroup, flow dissector, LIRC, sockmap"] # [doc = "\t\tor sock_ops type corresponding to the specified *attach_type*."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_SK_MSG**"] # [doc = ""] # [doc = "\t\t\teBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tDetach the eBPF program associated with the *target_fd* at the"] # [doc = "\t\thook specified by *attach_type*. The program must have been"] # [doc = "\t\tpreviously attached using **BPF_PROG_ATTACH**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_TEST_RUN"] # [doc = "\tDescription"] # [doc = "\t\tRun the eBPF program associated with the *prog_fd* a *repeat*"] # [doc = "\t\tnumber of times against a provided program context *ctx_in* and"] # [doc = "\t\tdata *data_in*, and return the modified program context"] # [doc = "\t\t*ctx_out*, *data_out* (for example, packet data), result of the"] # [doc = "\t\texecution *retval*, and *duration* of the test run."] # [doc = ""] # [doc = "\t\tThe sizes of the buffers provided as input and output"] # [doc = "\t\tparameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must"] # [doc = "\t\tbe provided in the corresponding variables *ctx_size_in*,"] # [doc = "\t\t*ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any"] # [doc = "\t\tof these parameters are not provided (ie set to NULL), the"] # [doc = "\t\tcorresponding size field must be zero."] # [doc = ""] # [doc = "\t\tSome program types have particular requirements:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_LOOKUP**"] # [doc = "\t\t\t*data_in* and *data_out* must be NULL."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT**,"] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE**"] # [doc = ""] # [doc = "\t\t\t*ctx_out*, *data_in* and *data_out* must be NULL."] # [doc = "\t\t\t*repeat* must be zero."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\t**ENOSPC**"] # [doc = "\t\t\tEither *data_size_out* or *ctx_size_out* is too small."] # [doc = "\t\t**ENOTSUPP**"] # [doc = "\t\t\tThis command is not supported by the program type of"] # [doc = "\t\t\tthe program referred to by *prog_fd*."] # [doc = ""] # [doc = " BPF_PROG_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF program currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF program with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF programs"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF map currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF map with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF maps"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_PROG_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF program corresponding to"] # [doc = "\t\t*prog_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF map corresponding to"] # [doc = "\t\t*map_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_GET_INFO_BY_FD"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about the eBPF object corresponding to"] # [doc = "\t\t*bpf_fd*."] # [doc = ""] # [doc = "\t\tPopulates up to *info_len* bytes of *info*, which will be in"] # [doc = "\t\tone of the following formats depending on the eBPF object type"] # [doc = "\t\tof *bpf_fd*:"] # [doc = ""] # [doc = "\t\t* **struct bpf_prog_info**"] # [doc = "\t\t* **struct bpf_map_info**"] # [doc = "\t\t* **struct bpf_btf_info**"] # [doc = "\t\t* **struct bpf_link_info**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\tspecified *attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_QUERY** always fetches the number of programs"] # [doc = "\t\tattached and the *attach_flags* which were used to attach those"] # [doc = "\t\tprograms. Additionally, if *prog_ids* is nonzero and the number"] # [doc = "\t\tof attached programs is less than *prog_cnt*, populates"] # [doc = "\t\t*prog_ids* with the eBPF program ids of the programs attached"] # [doc = "\t\tat *target_fd*."] # [doc = ""] # [doc = "\t\tThe following flags may alter the result:"] # [doc = ""] # [doc = "\t\t**BPF_F_QUERY_EFFECTIVE**"] # [doc = "\t\t\tOnly return information regarding programs which are"] # [doc = "\t\t\tcurrently effective at the specified *target_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_RAW_TRACEPOINT_OPEN"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a tracepoint *name* to access kernel"] # [doc = "\t\tinternal arguments of the tracepoint in their raw form."] # [doc = ""] # [doc = "\t\tThe *prog_fd* must be a valid file descriptor associated with"] # [doc = "\t\ta loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**."] # [doc = ""] # [doc = "\t\tNo ABI guarantees are made about the content of tracepoint"] # [doc = "\t\targuments exposed to the corresponding eBPF program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load BPF Type Format (BTF) metadata into the kernel,"] # [doc = "\t\treturning a new file descriptor associated with the metadata."] # [doc = "\t\tBTF is described in more detail at"] # [doc = "\t\thttps://www.kernel.org/doc/html/latest/bpf/btf.html."] # [doc = ""] # [doc = "\t\tThe *btf* parameter must point to valid memory providing"] # [doc = "\t\t*btf_size* bytes of BTF binary metadata."] # [doc = ""] # [doc = "\t\tThe returned file descriptor can be passed to other **bpf**\\ ()"] # [doc = "\t\tsubcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to"] # [doc = "\t\tassociate the BTF with those objects."] # [doc = ""] # [doc = "\t\tSimilar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional"] # [doc = "\t\tparameters to specify a *btf_log_buf*, *btf_log_size* and"] # [doc = "\t\t*btf_log_level* which allow the kernel to return freeform log"] # [doc = "\t\toutput regarding the BTF verification process."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the BPF Type Format (BTF)"] # [doc = "\t\tcorresponding to *btf_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_TASK_FD_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\ttarget process identified by *pid* and *fd*."] # [doc = ""] # [doc = "\t\tIf the *pid* and *fd* are associated with a tracepoint, kprobe"] # [doc = "\t\tor uprobe perf event, then the *prog_id* and *fd_type* will"] # [doc = "\t\tbe populated with the eBPF program id and file descriptor type"] # [doc = "\t\tof type **bpf_task_fd_type**. If associated with a kprobe or"] # [doc = "\t\tuprobe, the *probe_offset* and *probe_addr* will also be"] # [doc = "\t\tpopulated. Optionally, if *buf* is provided, then up to"] # [doc = "\t\t*buf_len* bytes of *buf* will be populated with the name of"] # [doc = "\t\tthe tracepoint, kprobe or uprobe."] # [doc = ""] # [doc = "\t\tThe resulting *prog_id* may be introspected in deeper detail"] # [doc = "\t\tusing **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with the given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *fd*, and if found, delete the element."] # [doc = ""] # [doc = "\t\tFor **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map"] # [doc = "\t\ttypes, the *flags* argument needs to be set to 0, but for other"] # [doc = "\t\tmap types, it may be specified as:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up and delete the value of a spin-locked map"] # [doc = "\t\t\twithout returning the lock. This must be specified if"] # [doc = "\t\t\tthe elements contain a spinlock."] # [doc = ""] # [doc = "\t\tThe **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types"] # [doc = "\t\timplement this command as a \"pop\" operation, deleting the top"] # [doc = "\t\telement rather than one corresponding to *key*."] # [doc = "\t\tThe *key* and *key_len* parameters should be zeroed when"] # [doc = "\t\tissuing this operation for these map types."] # [doc = ""] # [doc = "\t\tThis command is only valid for the following map types:"] # [doc = "\t\t* **BPF_MAP_TYPE_QUEUE**"] # [doc = "\t\t* **BPF_MAP_TYPE_STACK**"] # [doc = "\t\t* **BPF_MAP_TYPE_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_PERCPU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_PERCPU_HASH**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_FREEZE"] # [doc = "\tDescription"] # [doc = "\t\tFreeze the permissions of the specified map."] # [doc = ""] # [doc = "\t\tWrite permissions may be frozen by passing zero *flags*."] # [doc = "\t\tUpon success, no future syscall invocations may alter the"] # [doc = "\t\tmap state of *map_fd*. Write operations from eBPF programs"] # [doc = "\t\tare still possible for a frozen map."] # [doc = ""] # [doc = "\t\tNot supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_BTF_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next BPF Type Format (BTF) object currently loaded"] # [doc = "\t\tinto the kernel."] # [doc = ""] # [doc = "\t\tLooks for the BTF object with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other BTF objects"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and fetch multiple elements in a map."] # [doc = ""] # [doc = "\t\tTwo opaque values are used to manage batch operations,"] # [doc = "\t\t*in_batch* and *out_batch*. Initially, *in_batch* must be set"] # [doc = "\t\tto NULL to begin the batched operation. After each subsequent"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant"] # [doc = "\t\t*out_batch* as the *in_batch* for the next operation to"] # [doc = "\t\tcontinue iteration from the current point."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are output parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are copied into the"] # [doc = "\t\tuser buffer, with the keys copied into *keys* and the values"] # [doc = "\t\tcopied into the corresponding indices in *values*."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOSPC** to indicate that *keys* or"] # [doc = "\t\t*values* is too small to dump an entire bucket during"] # [doc = "\t\titeration of a hash-based map type."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and delete all elements in a map."] # [doc = ""] # [doc = "\t\tThis operation has the same behavior as"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH** with two exceptions:"] # [doc = ""] # [doc = "\t\t* Every element that is successfully returned is also deleted"] # [doc = "\t\t from the map. This is at least *count* elements. Note that"] # [doc = "\t\t *count* is both an input and an output parameter."] # [doc = "\t\t* Upon returning with *errno* set to **EFAULT**, up to"] # [doc = "\t\t *count* elements may be deleted without returning the keys"] # [doc = "\t\t and values of the deleted elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tUpdate multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are input parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially updated to the"] # [doc = "\t\tvalue in the corresponding index in *values*. The *in_batch*"] # [doc = "\t\tand *out_batch* parameters are ignored and should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate new elements or update a existing elements."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate new elements only if they do not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate existing elements."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate spin_lock-ed map elements. This must be"] # [doc = "\t\t\tspecified if the map value contains a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or"] # [doc = "\t\t**E2BIG**. **E2BIG** indicates that the number of elements in"] # [doc = "\t\tthe map reached the *max_entries* limit specified at map"] # [doc = "\t\tcreation time."] # [doc = ""] # [doc = "\t\tMay set *errno* to one of the following error codes under"] # [doc = "\t\tspecific circumstances:"] # [doc = ""] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tDelete multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* parameter is an input parameter which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tsize of the map *map_fd*, that is, *key_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially deleted. The"] # [doc = "\t\t*in_batch*, *out_batch*, and *values* parameters are ignored"] # [doc = "\t\tand should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements. If"] # [doc = "\t\t*errno* is **EFAULT**, up to *count* elements may be been"] # [doc = "\t\tdeleted."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook and return a file descriptor handle for"] # [doc = "\t\tmanaging the link."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_UPDATE"] # [doc = "\tDescription"] # [doc = "\t\tUpdate the eBPF program in the specified *link_fd* to"] # [doc = "\t\t*new_prog_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF Link corresponding to"] # [doc = "\t\t*link_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF link currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF link with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF links"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_ENABLE_STATS"] # [doc = "\tDescription"] # [doc = "\t\tEnable eBPF runtime statistics gathering."] # [doc = ""] # [doc = "\t\tRuntime statistics gathering for the eBPF runtime is disabled"] # [doc = "\t\tby default to minimize the corresponding performance overhead."] # [doc = "\t\tThis command enables statistics globally."] # [doc = ""] # [doc = "\t\tMultiple programs may independently enable statistics."] # [doc = "\t\tAfter gathering the desired statistics, eBPF runtime statistics"] # [doc = "\t\tmay be disabled again by calling **close**\\ (2) for the file"] # [doc = "\t\tdescriptor returned by this function. Statistics will only be"] # [doc = "\t\tdisabled system-wide when all outstanding file descriptors"] # [doc = "\t\treturned by prior calls for this subcommand are closed."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_ITER_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate an iterator on top of the specified *link_fd* (as"] # [doc = "\t\tpreviously created using **BPF_LINK_CREATE**) and return a"] # [doc = "\t\tfile descriptor that can be used to trigger the iteration."] # [doc = ""] # [doc = "\t\tIf the resulting file descriptor is pinned to the filesystem"] # [doc = "\t\tusing **BPF_OBJ_PIN**, then subsequent **read**\\ (2) syscalls"] # [doc = "\t\tfor that path will trigger the iterator to read kernel state"] # [doc = "\t\tusing the eBPF program attached to *link_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tForcefully detach the specified *link_fd* from its"] # [doc = "\t\tcorresponding attachment point."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_BIND_MAP"] # [doc = "\tDescription"] # [doc = "\t\tBind a map to the lifetime of an eBPF program."] # [doc = ""] # [doc = "\t\tThe map identified by *map_fd* is bound to the program"] # [doc = "\t\tidentified by *prog_fd* and only released when *prog_fd* is"] # [doc = "\t\treleased. This may be used in cases where metadata should be"] # [doc = "\t\tassociated with a program which otherwise does not contain any"] # [doc = "\t\treferences to the map (for example, embedded in the eBPF"] # [doc = "\t\tprogram instructions)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " NOTES"] # [doc = "\teBPF objects (maps and programs) can be shared between processes."] # [doc = ""] # [doc = "\t* After **fork**\\ (2), the child inherits file descriptors"] # [doc = "\t referring to the same eBPF objects."] # [doc = "\t* File descriptors referring to eBPF objects can be transferred over"] # [doc = "\t **unix**\\ (7) domain sockets."] # [doc = "\t* File descriptors referring to eBPF objects can be duplicated in the"] # [doc = "\t usual way, using **dup**\\ (2) and similar calls."] # [doc = "\t* File descriptors referring to eBPF objects can be pinned to the"] # [doc = "\t filesystem using the **BPF_OBJ_PIN** command of **bpf**\\ (2)."] # [doc = ""] # [doc = "\tAn eBPF object is deallocated only after all file descriptors referring"] # [doc = "\tto the object have been closed and no references remain pinned to the"] # [doc = "\tfilesystem or attached (for example, bound to a program or device)."] pu... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: error from rustc: unknown start of token: \ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this URL is not a hyperlink [INFO] [stdout] --> /opt/rustwide/target/debug/build/rhdxmr-publish-test3-ca3a5ccc900ce0dc/out/perf_reader_bindings.rs:3:27938 [INFO] [stdout] | [INFO] [stdout] 3 | ... ; # [doc = " DOC: eBPF Syscall Preamble"] # [doc = ""] # [doc = " The operation to be performed by the **bpf**\\ () system call is determined"] # [doc = " by the *cmd* argument. Each operation takes an accompanying argument,"] # [doc = " provided via *attr*, which is a pointer to a union of type *bpf_attr* (see"] # [doc = " below). The size argument is the size of the union pointed to by *attr*."] # [doc = " DOC: eBPF Syscall Commands"] # [doc = ""] # [doc = " BPF_MAP_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate a map and return a file descriptor that refers to the"] # [doc = "\t\tmap. The close-on-exec file descriptor flag (see **fcntl**\\ (2))"] # [doc = "\t\tis automatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_MAP_CREATE** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with a given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *map_fd*."] # [doc = ""] # [doc = "\t\tThe *flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tCreate or update an element (key/value pair) in a specified map."] # [doc = ""] # [doc = "\t\tThe *flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate a new element or update an existing element."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate a new element only if it did not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate an existing element."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate a spin_lock-ed map element."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**,"] # [doc = "\t\t**E2BIG**, **EEXIST**, or **ENOENT**."] # [doc = ""] # [doc = "\t\t**E2BIG**"] # [doc = "\t\t\tThe number of elements in the map reached the"] # [doc = "\t\t\t*max_entries* limit specified at map creation time."] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up and delete an element by key in a specified map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_KEY"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element by key in a specified map and return the key"] # [doc = "\t\tof the next element. Can be used to iterate over all elements"] # [doc = "\t\tin the map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tThe following cases can be used to iterate over all elements of"] # [doc = "\t\tthe map:"] # [doc = ""] # [doc = "\t\t* If *key* is not found, the operation returns zero and sets"] # [doc = "\t\t the *next_key* pointer to the key of the first element."] # [doc = "\t\t* If *key* is found, the operation returns zero and sets the"] # [doc = "\t\t *next_key* pointer to the key of the next element."] # [doc = "\t\t* If *key* is the last element, returns -1 and *errno* is set"] # [doc = "\t\t to **ENOENT**."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or"] # [doc = "\t\t**EINVAL** on error."] # [doc = ""] # [doc = " BPF_PROG_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load an eBPF program, returning a new file"] # [doc = "\t\tdescriptor associated with the program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_PROG_LOAD** will unload the eBPF program (but see NOTES)."] # [doc = ""] # [doc = "\t\tThe close-on-exec file descriptor flag (see **fcntl**\\ (2)) is"] # [doc = "\t\tautomatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_PIN"] # [doc = "\tDescription"] # [doc = "\t\tPin an eBPF program or map referred by the specified *bpf_fd*"] # [doc = "\t\tto the provided *pathname* on the filesystem."] # [doc = ""] # [doc = "\t\tThe *pathname* argument must not contain a dot (\".\")."] # [doc = ""] # [doc = "\t\tOn success, *pathname* retains a reference to the eBPF object,"] # [doc = "\t\tpreventing deallocation of the object when the original"] # [doc = "\t\t*bpf_fd* is closed. This allow the eBPF object to live beyond"] # [doc = "\t\t**close**\\ (\\ *bpf_fd*\\ ), and hence the lifetime of the parent"] # [doc = "\t\tprocess."] # [doc = ""] # [doc = "\t\tApplying **unlink**\\ (2) or similar calls to the *pathname*"] # [doc = "\t\tunpins the object from the filesystem, removing the reference."] # [doc = "\t\tIf no other file descriptors or filesystem nodes refer to the"] # [doc = "\t\tsame object, it will be deallocated (see NOTES)."] # [doc = ""] # [doc = "\t\tThe filesystem type for the parent directory of *pathname* must"] # [doc = "\t\tbe **BPF_FS_MAGIC**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_OBJ_GET"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF object pinned to the"] # [doc = "\t\tspecified *pathname*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_PROG_ATTACH"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *attach_type* specifies the eBPF attachment point to"] # [doc = "\t\tattach the program to, and must be one of *bpf_attach_type*"] # [doc = "\t\t(see below)."] # [doc = ""] # [doc = "\t\tThe *attach_bpf_fd* must be a valid file descriptor for a"] # [doc = "\t\tloaded eBPF program of a cgroup, flow dissector, LIRC, sockmap"] # [doc = "\t\tor sock_ops type corresponding to the specified *attach_type*."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_SK_MSG**"] # [doc = ""] # [doc = "\t\t\teBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tDetach the eBPF program associated with the *target_fd* at the"] # [doc = "\t\thook specified by *attach_type*. The program must have been"] # [doc = "\t\tpreviously attached using **BPF_PROG_ATTACH**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_TEST_RUN"] # [doc = "\tDescription"] # [doc = "\t\tRun the eBPF program associated with the *prog_fd* a *repeat*"] # [doc = "\t\tnumber of times against a provided program context *ctx_in* and"] # [doc = "\t\tdata *data_in*, and return the modified program context"] # [doc = "\t\t*ctx_out*, *data_out* (for example, packet data), result of the"] # [doc = "\t\texecution *retval*, and *duration* of the test run."] # [doc = ""] # [doc = "\t\tThe sizes of the buffers provided as input and output"] # [doc = "\t\tparameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must"] # [doc = "\t\tbe provided in the corresponding variables *ctx_size_in*,"] # [doc = "\t\t*ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any"] # [doc = "\t\tof these parameters are not provided (ie set to NULL), the"] # [doc = "\t\tcorresponding size field must be zero."] # [doc = ""] # [doc = "\t\tSome program types have particular requirements:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_LOOKUP**"] # [doc = "\t\t\t*data_in* and *data_out* must be NULL."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT**,"] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE**"] # [doc = ""] # [doc = "\t\t\t*ctx_out*, *data_in* and *data_out* must be NULL."] # [doc = "\t\t\t*repeat* must be zero."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\t**ENOSPC**"] # [doc = "\t\t\tEither *data_size_out* or *ctx_size_out* is too small."] # [doc = "\t\t**ENOTSUPP**"] # [doc = "\t\t\tThis command is not supported by the program type of"] # [doc = "\t\t\tthe program referred to by *prog_fd*."] # [doc = ""] # [doc = " BPF_PROG_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF program currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF program with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF programs"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF map currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF map with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF maps"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_PROG_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF program corresponding to"] # [doc = "\t\t*prog_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF map corresponding to"] # [doc = "\t\t*map_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_GET_INFO_BY_FD"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about the eBPF object corresponding to"] # [doc = "\t\t*bpf_fd*."] # [doc = ""] # [doc = "\t\tPopulates up to *info_len* bytes of *info*, which will be in"] # [doc = "\t\tone of the following formats depending on the eBPF object type"] # [doc = "\t\tof *bpf_fd*:"] # [doc = ""] # [doc = "\t\t* **struct bpf_prog_info**"] # [doc = "\t\t* **struct bpf_map_info**"] # [doc = "\t\t* **struct bpf_btf_info**"] # [doc = "\t\t* **struct bpf_link_info**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\tspecified *attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_QUERY** always fetches the number of programs"] # [doc = "\t\tattached and the *attach_flags* which were used to attach those"] # [doc = "\t\tprograms. Additionally, if *prog_ids* is nonzero and the number"] # [doc = "\t\tof attached programs is less than *prog_cnt*, populates"] # [doc = "\t\t*prog_ids* with the eBPF program ids of the programs attached"] # [doc = "\t\tat *target_fd*."] # [doc = ""] # [doc = "\t\tThe following flags may alter the result:"] # [doc = ""] # [doc = "\t\t**BPF_F_QUERY_EFFECTIVE**"] # [doc = "\t\t\tOnly return information regarding programs which are"] # [doc = "\t\t\tcurrently effective at the specified *target_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_RAW_TRACEPOINT_OPEN"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a tracepoint *name* to access kernel"] # [doc = "\t\tinternal arguments of the tracepoint in their raw form."] # [doc = ""] # [doc = "\t\tThe *prog_fd* must be a valid file descriptor associated with"] # [doc = "\t\ta loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**."] # [doc = ""] # [doc = "\t\tNo ABI guarantees are made about the content of tracepoint"] # [doc = "\t\targuments exposed to the corresponding eBPF program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load BPF Type Format (BTF) metadata into the kernel,"] # [doc = "\t\treturning a new file descriptor associated with the metadata."] # [doc = "\t\tBTF is described in more detail at"] # [doc = "\t\thttps://www.kernel.org/doc/html/latest/bpf/btf.html."] # [doc = ""] # [doc = "\t\tThe *btf* parameter must point to valid memory providing"] # [doc = "\t\t*btf_size* bytes of BTF binary metadata."] # [doc = ""] # [doc = "\t\tThe returned file descriptor can be passed to other **bpf**\\ ()"] # [doc = "\t\tsubcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to"] # [doc = "\t\tassociate the BTF with those objects."] # [doc = ""] # [doc = "\t\tSimilar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional"] # [doc = "\t\tparameters to specify a *btf_log_buf*, *btf_log_size* and"] # [doc = "\t\t*btf_log_level* which allow the kernel to return freeform log"] # [doc = "\t\toutput regarding the BTF verification process."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the BPF Type Format (BTF)"] # [doc = "\t\tcorresponding to *btf_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_TASK_FD_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\ttarget process identified by *pid* and *fd*."] # [doc = ""] # [doc = "\t\tIf the *pid* and *fd* are associated with a tracepoint, kprobe"] # [doc = "\t\tor uprobe perf event, then the *prog_id* and *fd_type* will"] # [doc = "\t\tbe populated with the eBPF program id and file descriptor type"] # [doc = "\t\tof type **bpf_task_fd_type**. If associated with a kprobe or"] # [doc = "\t\tuprobe, the *probe_offset* and *probe_addr* will also be"] # [doc = "\t\tpopulated. Optionally, if *buf* is provided, then up to"] # [doc = "\t\t*buf_len* bytes of *buf* will be populated with the name of"] # [doc = "\t\tthe tracepoint, kprobe or uprobe."] # [doc = ""] # [doc = "\t\tThe resulting *prog_id* may be introspected in deeper detail"] # [doc = "\t\tusing **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with the given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *fd*, and if found, delete the element."] # [doc = ""] # [doc = "\t\tFor **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map"] # [doc = "\t\ttypes, the *flags* argument needs to be set to 0, but for other"] # [doc = "\t\tmap types, it may be specified as:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up and delete the value of a spin-locked map"] # [doc = "\t\t\twithout returning the lock. This must be specified if"] # [doc = "\t\t\tthe elements contain a spinlock."] # [doc = ""] # [doc = "\t\tThe **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types"] # [doc = "\t\timplement this command as a \"pop\" operation, deleting the top"] # [doc = "\t\telement rather than one corresponding to *key*."] # [doc = "\t\tThe *key* and *key_len* parameters should be zeroed when"] # [doc = "\t\tissuing this operation for these map types."] # [doc = ""] # [doc = "\t\tThis command is only valid for the following map types:"] # [doc = "\t\t* **BPF_MAP_TYPE_QUEUE**"] # [doc = "\t\t* **BPF_MAP_TYPE_STACK**"] # [doc = "\t\t* **BPF_MAP_TYPE_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_PERCPU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_PERCPU_HASH**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_FREEZE"] # [doc = "\tDescription"] # [doc = "\t\tFreeze the permissions of the specified map."] # [doc = ""] # [doc = "\t\tWrite permissions may be frozen by passing zero *flags*."] # [doc = "\t\tUpon success, no future syscall invocations may alter the"] # [doc = "\t\tmap state of *map_fd*. Write operations from eBPF programs"] # [doc = "\t\tare still possible for a frozen map."] # [doc = ""] # [doc = "\t\tNot supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_BTF_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next BPF Type Format (BTF) object currently loaded"] # [doc = "\t\tinto the kernel."] # [doc = ""] # [doc = "\t\tLooks for the BTF object with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other BTF objects"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and fetch multiple elements in a map."] # [doc = ""] # [doc = "\t\tTwo opaque values are used to manage batch operations,"] # [doc = "\t\t*in_batch* and *out_batch*. Initially, *in_batch* must be set"] # [doc = "\t\tto NULL to begin the batched operation. After each subsequent"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant"] # [doc = "\t\t*out_batch* as the *in_batch* for the next operation to"] # [doc = "\t\tcontinue iteration from the current point."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are output parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are copied into the"] # [doc = "\t\tuser buffer, with the keys copied into *keys* and the values"] # [doc = "\t\tcopied into the corresponding indices in *values*."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOSPC** to indicate that *keys* or"] # [doc = "\t\t*values* is too small to dump an entire bucket during"] # [doc = "\t\titeration of a hash-based map type."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and delete all elements in a map."] # [doc = ""] # [doc = "\t\tThis operation has the same behavior as"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH** with two exceptions:"] # [doc = ""] # [doc = "\t\t* Every element that is successfully returned is also deleted"] # [doc = "\t\t from the map. This is at least *count* elements. Note that"] # [doc = "\t\t *count* is both an input and an output parameter."] # [doc = "\t\t* Upon returning with *errno* set to **EFAULT**, up to"] # [doc = "\t\t *count* elements may be deleted without returning the keys"] # [doc = "\t\t and values of the deleted elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tUpdate multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are input parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially updated to the"] # [doc = "\t\tvalue in the corresponding index in *values*. The *in_batch*"] # [doc = "\t\tand *out_batch* parameters are ignored and should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate new elements or update a existing elements."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate new elements only if they do not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate existing elements."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate spin_lock-ed map elements. This must be"] # [doc = "\t\t\tspecified if the map value contains a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or"] # [doc = "\t\t**E2BIG**. **E2BIG** indicates that the number of elements in"] # [doc = "\t\tthe map reached the *max_entries* limit specified at map"] # [doc = "\t\tcreation time."] # [doc = ""] # [doc = "\t\tMay set *errno* to one of the following error codes under"] # [doc = "\t\tspecific circumstances:"] # [doc = ""] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tDelete multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* parameter is an input parameter which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tsize of the map *map_fd*, that is, *key_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially deleted. The"] # [doc = "\t\t*in_batch*, *out_batch*, and *values* parameters are ignored"] # [doc = "\t\tand should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements. If"] # [doc = "\t\t*errno* is **EFAULT**, up to *count* elements may be been"] # [doc = "\t\tdeleted."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook and return a file descriptor handle for"] # [doc = "\t\tmanaging the link."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_UPDATE"] # [doc = "\tDescription"] # [doc = "\t\tUpdate the eBPF program in the specified *link_fd* to"] # [doc = "\t\t*new_prog_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF Link corresponding to"] # [doc = "\t\t*link_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF link currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF link with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF links"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_ENABLE_STATS"] # [doc = "\tDescription"] # [doc = "\t\tEnable eBPF runtime statistics gathering."] # [doc = ""] # [doc = "\t\tRuntime statistics gathering for the eBPF runtime is disabled"] # [doc = "\t\tby default to minimize the corresponding performance overhead."] # [doc = "\t\tThis command enables statistics globally."] # [doc = ""] # [doc = "\t\tMultiple programs may independently enable statistics."] # [doc = "\t\tAfter gathering the desired statistics, eBPF runtime statistics"] # [doc = "\t\tmay be disabled again by calling **close**\\ (2) for the file"] # [doc = "\t\tdescriptor returned by this function. Statistics will only be"] # [doc = "\t\tdisabled system-wide when all outstanding file descriptors"] # [doc = "\t\treturned by prior calls for this subcommand are closed."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_ITER_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate an iterator on top of the specified *link_fd* (as"] # [doc = "\t\tpreviously created using **BPF_LINK_CREATE**) and return a"] # [doc = "\t\tfile descriptor that can be used to trigger the iteration."] # [doc = ""] # [doc = "\t\tIf the resulting file descriptor is pinned to the filesystem"] # [doc = "\t\tusing **BPF_OBJ_PIN**, then subsequent **read**\\ (2) syscalls"] # [doc = "\t\tfor that path will trigger the iterator to read kernel state"] # [doc = "\t\tusing the eBPF program attached to *link_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tForcefully detach the specified *link_fd* from its"] # [doc = "\t\tcorresponding attachment point."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_BIND_MAP"] # [doc = "\tDescription"] # [doc = "\t\tBind a map to the lifetime of an eBPF program."] # [doc = ""] # [doc = "\t\tThe map identified by *map_fd* is bound to the program"] # [doc = "\t\tidentified by *prog_fd* and only released when *prog_fd* is"] # [doc = "\t\treleased. This may be used in cases where metadata should be"] # [doc = "\t\tassociated with a program which otherwise does not contain any"] # [doc = "\t\treferences to the map (for example, embedded in the eBPF"] # [doc = "\t\tprogram instructions)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " NOTES"] # [doc = "\teBPF objects (maps and programs) can be shared between processes."] # [doc = ""] # [doc = "\t* After **fork**\\ (2), the child inherits file descriptors"] # [doc = "\t referring to the same eBPF objects."] # [doc = "\t* File descriptors referring to eBPF objects can be transferred over"] # [doc = "\t **unix**\\ (7) domain sockets."] # [doc = "\t* File descriptors referring to eBPF objects can be duplicated in the"] # [doc = "\t usual way, using **dup**\\ (2) and similar calls."] # [doc = "\t* File descriptors referring to eBPF objects can be pinned to the"] # [doc = "\t filesystem using the **BPF_OBJ_PIN** command of **bpf**\\ (2)."] # [doc = ""] # [doc = "\tAn eBPF object is deallocated only after all file descriptors referring"] # [doc = "\tto the object have been closed and no references remain pinned to the"] # [doc = "\tfilesystem or attached (for example, bound to a program or device)."] pu... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use an automatic link instead: `` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(rustdoc::bare_urls)]` on by default [INFO] [stdout] = note: bare URLs are not automatically turned into clickable links [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this URL is not a hyperlink [INFO] [stdout] --> /opt/rustwide/target/debug/build/rhdxmr-publish-test3-ca3a5ccc900ce0dc/out/libbpf_bindings.rs:3:119978 [INFO] [stdout] | [INFO] [stdout] 3 | ... ; # [doc = " DOC: eBPF Syscall Preamble"] # [doc = ""] # [doc = " The operation to be performed by the **bpf**\\ () system call is determined"] # [doc = " by the *cmd* argument. Each operation takes an accompanying argument,"] # [doc = " provided via *attr*, which is a pointer to a union of type *bpf_attr* (see"] # [doc = " below). The size argument is the size of the union pointed to by *attr*."] # [doc = " DOC: eBPF Syscall Commands"] # [doc = ""] # [doc = " BPF_MAP_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate a map and return a file descriptor that refers to the"] # [doc = "\t\tmap. The close-on-exec file descriptor flag (see **fcntl**\\ (2))"] # [doc = "\t\tis automatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_MAP_CREATE** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with a given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *map_fd*."] # [doc = ""] # [doc = "\t\tThe *flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tCreate or update an element (key/value pair) in a specified map."] # [doc = ""] # [doc = "\t\tThe *flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate a new element or update an existing element."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate a new element only if it did not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate an existing element."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate a spin_lock-ed map element."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**,"] # [doc = "\t\t**E2BIG**, **EEXIST**, or **ENOENT**."] # [doc = ""] # [doc = "\t\t**E2BIG**"] # [doc = "\t\t\tThe number of elements in the map reached the"] # [doc = "\t\t\t*max_entries* limit specified at map creation time."] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up and delete an element by key in a specified map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_KEY"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element by key in a specified map and return the key"] # [doc = "\t\tof the next element. Can be used to iterate over all elements"] # [doc = "\t\tin the map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tThe following cases can be used to iterate over all elements of"] # [doc = "\t\tthe map:"] # [doc = ""] # [doc = "\t\t* If *key* is not found, the operation returns zero and sets"] # [doc = "\t\t the *next_key* pointer to the key of the first element."] # [doc = "\t\t* If *key* is found, the operation returns zero and sets the"] # [doc = "\t\t *next_key* pointer to the key of the next element."] # [doc = "\t\t* If *key* is the last element, returns -1 and *errno* is set"] # [doc = "\t\t to **ENOENT**."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or"] # [doc = "\t\t**EINVAL** on error."] # [doc = ""] # [doc = " BPF_PROG_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load an eBPF program, returning a new file"] # [doc = "\t\tdescriptor associated with the program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_PROG_LOAD** will unload the eBPF program (but see NOTES)."] # [doc = ""] # [doc = "\t\tThe close-on-exec file descriptor flag (see **fcntl**\\ (2)) is"] # [doc = "\t\tautomatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_PIN"] # [doc = "\tDescription"] # [doc = "\t\tPin an eBPF program or map referred by the specified *bpf_fd*"] # [doc = "\t\tto the provided *pathname* on the filesystem."] # [doc = ""] # [doc = "\t\tThe *pathname* argument must not contain a dot (\".\")."] # [doc = ""] # [doc = "\t\tOn success, *pathname* retains a reference to the eBPF object,"] # [doc = "\t\tpreventing deallocation of the object when the original"] # [doc = "\t\t*bpf_fd* is closed. This allow the eBPF object to live beyond"] # [doc = "\t\t**close**\\ (\\ *bpf_fd*\\ ), and hence the lifetime of the parent"] # [doc = "\t\tprocess."] # [doc = ""] # [doc = "\t\tApplying **unlink**\\ (2) or similar calls to the *pathname*"] # [doc = "\t\tunpins the object from the filesystem, removing the reference."] # [doc = "\t\tIf no other file descriptors or filesystem nodes refer to the"] # [doc = "\t\tsame object, it will be deallocated (see NOTES)."] # [doc = ""] # [doc = "\t\tThe filesystem type for the parent directory of *pathname* must"] # [doc = "\t\tbe **BPF_FS_MAGIC**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_OBJ_GET"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF object pinned to the"] # [doc = "\t\tspecified *pathname*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_PROG_ATTACH"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *attach_type* specifies the eBPF attachment point to"] # [doc = "\t\tattach the program to, and must be one of *bpf_attach_type*"] # [doc = "\t\t(see below)."] # [doc = ""] # [doc = "\t\tThe *attach_bpf_fd* must be a valid file descriptor for a"] # [doc = "\t\tloaded eBPF program of a cgroup, flow dissector, LIRC, sockmap"] # [doc = "\t\tor sock_ops type corresponding to the specified *attach_type*."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_SK_MSG**"] # [doc = ""] # [doc = "\t\t\teBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tDetach the eBPF program associated with the *target_fd* at the"] # [doc = "\t\thook specified by *attach_type*. The program must have been"] # [doc = "\t\tpreviously attached using **BPF_PROG_ATTACH**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_TEST_RUN"] # [doc = "\tDescription"] # [doc = "\t\tRun the eBPF program associated with the *prog_fd* a *repeat*"] # [doc = "\t\tnumber of times against a provided program context *ctx_in* and"] # [doc = "\t\tdata *data_in*, and return the modified program context"] # [doc = "\t\t*ctx_out*, *data_out* (for example, packet data), result of the"] # [doc = "\t\texecution *retval*, and *duration* of the test run."] # [doc = ""] # [doc = "\t\tThe sizes of the buffers provided as input and output"] # [doc = "\t\tparameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must"] # [doc = "\t\tbe provided in the corresponding variables *ctx_size_in*,"] # [doc = "\t\t*ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any"] # [doc = "\t\tof these parameters are not provided (ie set to NULL), the"] # [doc = "\t\tcorresponding size field must be zero."] # [doc = ""] # [doc = "\t\tSome program types have particular requirements:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_LOOKUP**"] # [doc = "\t\t\t*data_in* and *data_out* must be NULL."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT**,"] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE**"] # [doc = ""] # [doc = "\t\t\t*ctx_out*, *data_in* and *data_out* must be NULL."] # [doc = "\t\t\t*repeat* must be zero."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\t**ENOSPC**"] # [doc = "\t\t\tEither *data_size_out* or *ctx_size_out* is too small."] # [doc = "\t\t**ENOTSUPP**"] # [doc = "\t\t\tThis command is not supported by the program type of"] # [doc = "\t\t\tthe program referred to by *prog_fd*."] # [doc = ""] # [doc = " BPF_PROG_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF program currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF program with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF programs"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF map currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF map with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF maps"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_PROG_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF program corresponding to"] # [doc = "\t\t*prog_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF map corresponding to"] # [doc = "\t\t*map_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_GET_INFO_BY_FD"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about the eBPF object corresponding to"] # [doc = "\t\t*bpf_fd*."] # [doc = ""] # [doc = "\t\tPopulates up to *info_len* bytes of *info*, which will be in"] # [doc = "\t\tone of the following formats depending on the eBPF object type"] # [doc = "\t\tof *bpf_fd*:"] # [doc = ""] # [doc = "\t\t* **struct bpf_prog_info**"] # [doc = "\t\t* **struct bpf_map_info**"] # [doc = "\t\t* **struct bpf_btf_info**"] # [doc = "\t\t* **struct bpf_link_info**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\tspecified *attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_QUERY** always fetches the number of programs"] # [doc = "\t\tattached and the *attach_flags* which were used to attach those"] # [doc = "\t\tprograms. Additionally, if *prog_ids* is nonzero and the number"] # [doc = "\t\tof attached programs is less than *prog_cnt*, populates"] # [doc = "\t\t*prog_ids* with the eBPF program ids of the programs attached"] # [doc = "\t\tat *target_fd*."] # [doc = ""] # [doc = "\t\tThe following flags may alter the result:"] # [doc = ""] # [doc = "\t\t**BPF_F_QUERY_EFFECTIVE**"] # [doc = "\t\t\tOnly return information regarding programs which are"] # [doc = "\t\t\tcurrently effective at the specified *target_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_RAW_TRACEPOINT_OPEN"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a tracepoint *name* to access kernel"] # [doc = "\t\tinternal arguments of the tracepoint in their raw form."] # [doc = ""] # [doc = "\t\tThe *prog_fd* must be a valid file descriptor associated with"] # [doc = "\t\ta loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**."] # [doc = ""] # [doc = "\t\tNo ABI guarantees are made about the content of tracepoint"] # [doc = "\t\targuments exposed to the corresponding eBPF program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load BPF Type Format (BTF) metadata into the kernel,"] # [doc = "\t\treturning a new file descriptor associated with the metadata."] # [doc = "\t\tBTF is described in more detail at"] # [doc = "\t\thttps://www.kernel.org/doc/html/latest/bpf/btf.html."] # [doc = ""] # [doc = "\t\tThe *btf* parameter must point to valid memory providing"] # [doc = "\t\t*btf_size* bytes of BTF binary metadata."] # [doc = ""] # [doc = "\t\tThe returned file descriptor can be passed to other **bpf**\\ ()"] # [doc = "\t\tsubcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to"] # [doc = "\t\tassociate the BTF with those objects."] # [doc = ""] # [doc = "\t\tSimilar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional"] # [doc = "\t\tparameters to specify a *btf_log_buf*, *btf_log_size* and"] # [doc = "\t\t*btf_log_level* which allow the kernel to return freeform log"] # [doc = "\t\toutput regarding the BTF verification process."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the BPF Type Format (BTF)"] # [doc = "\t\tcorresponding to *btf_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_TASK_FD_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\ttarget process identified by *pid* and *fd*."] # [doc = ""] # [doc = "\t\tIf the *pid* and *fd* are associated with a tracepoint, kprobe"] # [doc = "\t\tor uprobe perf event, then the *prog_id* and *fd_type* will"] # [doc = "\t\tbe populated with the eBPF program id and file descriptor type"] # [doc = "\t\tof type **bpf_task_fd_type**. If associated with a kprobe or"] # [doc = "\t\tuprobe, the *probe_offset* and *probe_addr* will also be"] # [doc = "\t\tpopulated. Optionally, if *buf* is provided, then up to"] # [doc = "\t\t*buf_len* bytes of *buf* will be populated with the name of"] # [doc = "\t\tthe tracepoint, kprobe or uprobe."] # [doc = ""] # [doc = "\t\tThe resulting *prog_id* may be introspected in deeper detail"] # [doc = "\t\tusing **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with the given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *fd*, and if found, delete the element."] # [doc = ""] # [doc = "\t\tFor **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map"] # [doc = "\t\ttypes, the *flags* argument needs to be set to 0, but for other"] # [doc = "\t\tmap types, it may be specified as:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up and delete the value of a spin-locked map"] # [doc = "\t\t\twithout returning the lock. This must be specified if"] # [doc = "\t\t\tthe elements contain a spinlock."] # [doc = ""] # [doc = "\t\tThe **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types"] # [doc = "\t\timplement this command as a \"pop\" operation, deleting the top"] # [doc = "\t\telement rather than one corresponding to *key*."] # [doc = "\t\tThe *key* and *key_len* parameters should be zeroed when"] # [doc = "\t\tissuing this operation for these map types."] # [doc = ""] # [doc = "\t\tThis command is only valid for the following map types:"] # [doc = "\t\t* **BPF_MAP_TYPE_QUEUE**"] # [doc = "\t\t* **BPF_MAP_TYPE_STACK**"] # [doc = "\t\t* **BPF_MAP_TYPE_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_PERCPU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_PERCPU_HASH**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_FREEZE"] # [doc = "\tDescription"] # [doc = "\t\tFreeze the permissions of the specified map."] # [doc = ""] # [doc = "\t\tWrite permissions may be frozen by passing zero *flags*."] # [doc = "\t\tUpon success, no future syscall invocations may alter the"] # [doc = "\t\tmap state of *map_fd*. Write operations from eBPF programs"] # [doc = "\t\tare still possible for a frozen map."] # [doc = ""] # [doc = "\t\tNot supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_BTF_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next BPF Type Format (BTF) object currently loaded"] # [doc = "\t\tinto the kernel."] # [doc = ""] # [doc = "\t\tLooks for the BTF object with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other BTF objects"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and fetch multiple elements in a map."] # [doc = ""] # [doc = "\t\tTwo opaque values are used to manage batch operations,"] # [doc = "\t\t*in_batch* and *out_batch*. Initially, *in_batch* must be set"] # [doc = "\t\tto NULL to begin the batched operation. After each subsequent"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant"] # [doc = "\t\t*out_batch* as the *in_batch* for the next operation to"] # [doc = "\t\tcontinue iteration from the current point."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are output parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are copied into the"] # [doc = "\t\tuser buffer, with the keys copied into *keys* and the values"] # [doc = "\t\tcopied into the corresponding indices in *values*."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOSPC** to indicate that *keys* or"] # [doc = "\t\t*values* is too small to dump an entire bucket during"] # [doc = "\t\titeration of a hash-based map type."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and delete all elements in a map."] # [doc = ""] # [doc = "\t\tThis operation has the same behavior as"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH** with two exceptions:"] # [doc = ""] # [doc = "\t\t* Every element that is successfully returned is also deleted"] # [doc = "\t\t from the map. This is at least *count* elements. Note that"] # [doc = "\t\t *count* is both an input and an output parameter."] # [doc = "\t\t* Upon returning with *errno* set to **EFAULT**, up to"] # [doc = "\t\t *count* elements may be deleted without returning the keys"] # [doc = "\t\t and values of the deleted elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tUpdate multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are input parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially updated to the"] # [doc = "\t\tvalue in the corresponding index in *values*. The *in_batch*"] # [doc = "\t\tand *out_batch* parameters are ignored and should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate new elements or update a existing elements."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate new elements only if they do not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate existing elements."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate spin_lock-ed map elements. This must be"] # [doc = "\t\t\tspecified if the map value contains a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or"] # [doc = "\t\t**E2BIG**. **E2BIG** indicates that the number of elements in"] # [doc = "\t\tthe map reached the *max_entries* limit specified at map"] # [doc = "\t\tcreation time."] # [doc = ""] # [doc = "\t\tMay set *errno* to one of the following error codes under"] # [doc = "\t\tspecific circumstances:"] # [doc = ""] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tDelete multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* parameter is an input parameter which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tsize of the map *map_fd*, that is, *key_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially deleted. The"] # [doc = "\t\t*in_batch*, *out_batch*, and *values* parameters are ignored"] # [doc = "\t\tand should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements. If"] # [doc = "\t\t*errno* is **EFAULT**, up to *count* elements may be been"] # [doc = "\t\tdeleted."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook and return a file descriptor handle for"] # [doc = "\t\tmanaging the link."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_UPDATE"] # [doc = "\tDescription"] # [doc = "\t\tUpdate the eBPF program in the specified *link_fd* to"] # [doc = "\t\t*new_prog_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF Link corresponding to"] # [doc = "\t\t*link_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF link currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF link with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF links"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_ENABLE_STATS"] # [doc = "\tDescription"] # [doc = "\t\tEnable eBPF runtime statistics gathering."] # [doc = ""] # [doc = "\t\tRuntime statistics gathering for the eBPF runtime is disabled"] # [doc = "\t\tby default to minimize the corresponding performance overhead."] # [doc = "\t\tThis command enables statistics globally."] # [doc = ""] # [doc = "\t\tMultiple programs may independently enable statistics."] # [doc = "\t\tAfter gathering the desired statistics, eBPF runtime statistics"] # [doc = "\t\tmay be disabled again by calling **close**\\ (2) for the file"] # [doc = "\t\tdescriptor returned by this function. Statistics will only be"] # [doc = "\t\tdisabled system-wide when all outstanding file descriptors"] # [doc = "\t\treturned by prior calls for this subcommand are closed."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_ITER_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate an iterator on top of the specified *link_fd* (as"] # [doc = "\t\tpreviously created using **BPF_LINK_CREATE**) and return a"] # [doc = "\t\tfile descriptor that can be used to trigger the iteration."] # [doc = ""] # [doc = "\t\tIf the resulting file descriptor is pinned to the filesystem"] # [doc = "\t\tusing **BPF_OBJ_PIN**, then subsequent **read**\\ (2) syscalls"] # [doc = "\t\tfor that path will trigger the iterator to read kernel state"] # [doc = "\t\tusing the eBPF program attached to *link_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tForcefully detach the specified *link_fd* from its"] # [doc = "\t\tcorresponding attachment point."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_BIND_MAP"] # [doc = "\tDescription"] # [doc = "\t\tBind a map to the lifetime of an eBPF program."] # [doc = ""] # [doc = "\t\tThe map identified by *map_fd* is bound to the program"] # [doc = "\t\tidentified by *prog_fd* and only released when *prog_fd* is"] # [doc = "\t\treleased. This may be used in cases where metadata should be"] # [doc = "\t\tassociated with a program which otherwise does not contain any"] # [doc = "\t\treferences to the map (for example, embedded in the eBPF"] # [doc = "\t\tprogram instructions)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " NOTES"] # [doc = "\teBPF objects (maps and programs) can be shared between processes."] # [doc = ""] # [doc = "\t* After **fork**\\ (2), the child inherits file descriptors"] # [doc = "\t referring to the same eBPF objects."] # [doc = "\t* File descriptors referring to eBPF objects can be transferred over"] # [doc = "\t **unix**\\ (7) domain sockets."] # [doc = "\t* File descriptors referring to eBPF objects can be duplicated in the"] # [doc = "\t usual way, using **dup**\\ (2) and similar calls."] # [doc = "\t* File descriptors referring to eBPF objects can be pinned to the"] # [doc = "\t filesystem using the **BPF_OBJ_PIN** command of **bpf**\\ (2)."] # [doc = ""] # [doc = "\tAn eBPF object is deallocated only after all file descriptors referring"] # [doc = "\tto the object have been closed and no references remain pinned to the"] # [doc = "\tfilesystem or attached (for example, bound to a program or device)."] pu... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use an automatic link instead: `` [INFO] [stdout] | [INFO] [stdout] = note: bare URLs are not automatically turned into clickable links [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: 4 warnings emitted [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 29.41s [INFO] running `Command { std: "docker" "inspect" "acbdda718c0950b7d214df50bd7555f47891dd42b394079cc5d4d09ab398d176", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "acbdda718c0950b7d214df50bd7555f47891dd42b394079cc5d4d09ab398d176", kill_on_drop: false }` [INFO] [stdout] acbdda718c0950b7d214df50bd7555f47891dd42b394079cc5d4d09ab398d176 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-12/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-12/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTC_BOOTSTRAP=1" "-e" "DOCS_RS=1" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d190cb871061d98bc6d0581d85cb2ecb09a0f8a142ba5463de30be9999fc3251" "/opt/rustwide/cargo-home/bin/cargo" "+1.61.0" "rustdoc" "--lib" "-Zrustdoc-map" "--all-features" "--frozen" "--message-format=json" "--" "-Z" "unstable-options" "--document-private-items", kill_on_drop: false }` [INFO] [stdout] e70b9355c004bf605832fe62485091597276210f6ef78f5b19bfc61c64f1ae6f [INFO] running `Command { std: "docker" "start" "-a" "e70b9355c004bf605832fe62485091597276210f6ef78f5b19bfc61c64f1ae6f", kill_on_drop: false }` [INFO] [stderr] Compiling memchr v2.4.1 [INFO] [stderr] Compiling radium v0.5.3 [INFO] [stderr] Compiling libc v0.2.102 [INFO] [stderr] Compiling version_check v0.9.3 [INFO] [stderr] Compiling glob v0.3.0 [INFO] [stderr] Compiling proc-macro2 v1.0.29 [INFO] [stderr] Compiling tap v1.0.1 [INFO] [stderr] Compiling funty v1.1.0 [INFO] [stderr] Compiling wyz v0.2.0 [INFO] [stderr] Compiling unicode-xid v0.2.2 [INFO] [stderr] Compiling cfg-if v1.0.0 [INFO] [stderr] Compiling bindgen v0.59.1 [INFO] [stderr] Compiling regex-syntax v0.6.25 [INFO] [stderr] Compiling shlex v1.1.0 [INFO] [stderr] Compiling lazy_static v1.4.0 [INFO] [stderr] Compiling lazycell v1.3.0 [INFO] [stderr] Compiling peeking_take_while v0.1.2 [INFO] [stderr] Compiling bitflags v1.3.2 [INFO] [stderr] Compiling rustc-hash v1.1.0 [INFO] [stderr] Compiling cc v1.0.70 [INFO] [stderr] Checking zero v0.1.2 [INFO] [stderr] Compiling libloading v0.7.0 [INFO] [stderr] Compiling nom v6.1.2 [INFO] [stderr] Compiling clang-sys v1.2.2 [INFO] [stderr] Compiling bitvec v0.19.5 [INFO] [stderr] Compiling aho-corasick v0.7.18 [INFO] [stderr] Compiling quote v1.0.9 [INFO] [stderr] Checking regex v1.5.4 [INFO] [stderr] Compiling cexpr v0.5.0 [INFO] [stderr] Compiling rhdxmr-publish-test3 v0.1.0 (/opt/rustwide/workdir) [INFO] [stderr] Documenting rhdxmr-publish-test3 v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: could not parse code block as Rust code [INFO] [stdout] --> /opt/rustwide/target/debug/build/rhdxmr-publish-test3-ca3a5ccc900ce0dc/out/perf_reader_bindings.rs:3:27938 [INFO] [stdout] | [INFO] [stdout] 3 | ... ; # [doc = " DOC: eBPF Syscall Preamble"] # [doc = ""] # [doc = " The operation to be performed by the **bpf**\\ () system call is determined"] # [doc = " by the *cmd* argument. Each operation takes an accompanying argument,"] # [doc = " provided via *attr*, which is a pointer to a union of type *bpf_attr* (see"] # [doc = " below). The size argument is the size of the union pointed to by *attr*."] # [doc = " DOC: eBPF Syscall Commands"] # [doc = ""] # [doc = " BPF_MAP_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate a map and return a file descriptor that refers to the"] # [doc = "\t\tmap. The close-on-exec file descriptor flag (see **fcntl**\\ (2))"] # [doc = "\t\tis automatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_MAP_CREATE** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with a given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *map_fd*."] # [doc = ""] # [doc = "\t\tThe *flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tCreate or update an element (key/value pair) in a specified map."] # [doc = ""] # [doc = "\t\tThe *flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate a new element or update an existing element."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate a new element only if it did not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate an existing element."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate a spin_lock-ed map element."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**,"] # [doc = "\t\t**E2BIG**, **EEXIST**, or **ENOENT**."] # [doc = ""] # [doc = "\t\t**E2BIG**"] # [doc = "\t\t\tThe number of elements in the map reached the"] # [doc = "\t\t\t*max_entries* limit specified at map creation time."] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up and delete an element by key in a specified map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_KEY"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element by key in a specified map and return the key"] # [doc = "\t\tof the next element. Can be used to iterate over all elements"] # [doc = "\t\tin the map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tThe following cases can be used to iterate over all elements of"] # [doc = "\t\tthe map:"] # [doc = ""] # [doc = "\t\t* If *key* is not found, the operation returns zero and sets"] # [doc = "\t\t the *next_key* pointer to the key of the first element."] # [doc = "\t\t* If *key* is found, the operation returns zero and sets the"] # [doc = "\t\t *next_key* pointer to the key of the next element."] # [doc = "\t\t* If *key* is the last element, returns -1 and *errno* is set"] # [doc = "\t\t to **ENOENT**."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or"] # [doc = "\t\t**EINVAL** on error."] # [doc = ""] # [doc = " BPF_PROG_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load an eBPF program, returning a new file"] # [doc = "\t\tdescriptor associated with the program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_PROG_LOAD** will unload the eBPF program (but see NOTES)."] # [doc = ""] # [doc = "\t\tThe close-on-exec file descriptor flag (see **fcntl**\\ (2)) is"] # [doc = "\t\tautomatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_PIN"] # [doc = "\tDescription"] # [doc = "\t\tPin an eBPF program or map referred by the specified *bpf_fd*"] # [doc = "\t\tto the provided *pathname* on the filesystem."] # [doc = ""] # [doc = "\t\tThe *pathname* argument must not contain a dot (\".\")."] # [doc = ""] # [doc = "\t\tOn success, *pathname* retains a reference to the eBPF object,"] # [doc = "\t\tpreventing deallocation of the object when the original"] # [doc = "\t\t*bpf_fd* is closed. This allow the eBPF object to live beyond"] # [doc = "\t\t**close**\\ (\\ *bpf_fd*\\ ), and hence the lifetime of the parent"] # [doc = "\t\tprocess."] # [doc = ""] # [doc = "\t\tApplying **unlink**\\ (2) or similar calls to the *pathname*"] # [doc = "\t\tunpins the object from the filesystem, removing the reference."] # [doc = "\t\tIf no other file descriptors or filesystem nodes refer to the"] # [doc = "\t\tsame object, it will be deallocated (see NOTES)."] # [doc = ""] # [doc = "\t\tThe filesystem type for the parent directory of *pathname* must"] # [doc = "\t\tbe **BPF_FS_MAGIC**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_OBJ_GET"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF object pinned to the"] # [doc = "\t\tspecified *pathname*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_PROG_ATTACH"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *attach_type* specifies the eBPF attachment point to"] # [doc = "\t\tattach the program to, and must be one of *bpf_attach_type*"] # [doc = "\t\t(see below)."] # [doc = ""] # [doc = "\t\tThe *attach_bpf_fd* must be a valid file descriptor for a"] # [doc = "\t\tloaded eBPF program of a cgroup, flow dissector, LIRC, sockmap"] # [doc = "\t\tor sock_ops type corresponding to the specified *attach_type*."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_SK_MSG**"] # [doc = ""] # [doc = "\t\t\teBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tDetach the eBPF program associated with the *target_fd* at the"] # [doc = "\t\thook specified by *attach_type*. The program must have been"] # [doc = "\t\tpreviously attached using **BPF_PROG_ATTACH**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_TEST_RUN"] # [doc = "\tDescription"] # [doc = "\t\tRun the eBPF program associated with the *prog_fd* a *repeat*"] # [doc = "\t\tnumber of times against a provided program context *ctx_in* and"] # [doc = "\t\tdata *data_in*, and return the modified program context"] # [doc = "\t\t*ctx_out*, *data_out* (for example, packet data), result of the"] # [doc = "\t\texecution *retval*, and *duration* of the test run."] # [doc = ""] # [doc = "\t\tThe sizes of the buffers provided as input and output"] # [doc = "\t\tparameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must"] # [doc = "\t\tbe provided in the corresponding variables *ctx_size_in*,"] # [doc = "\t\t*ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any"] # [doc = "\t\tof these parameters are not provided (ie set to NULL), the"] # [doc = "\t\tcorresponding size field must be zero."] # [doc = ""] # [doc = "\t\tSome program types have particular requirements:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_LOOKUP**"] # [doc = "\t\t\t*data_in* and *data_out* must be NULL."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT**,"] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE**"] # [doc = ""] # [doc = "\t\t\t*ctx_out*, *data_in* and *data_out* must be NULL."] # [doc = "\t\t\t*repeat* must be zero."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\t**ENOSPC**"] # [doc = "\t\t\tEither *data_size_out* or *ctx_size_out* is too small."] # [doc = "\t\t**ENOTSUPP**"] # [doc = "\t\t\tThis command is not supported by the program type of"] # [doc = "\t\t\tthe program referred to by *prog_fd*."] # [doc = ""] # [doc = " BPF_PROG_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF program currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF program with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF programs"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF map currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF map with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF maps"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_PROG_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF program corresponding to"] # [doc = "\t\t*prog_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF map corresponding to"] # [doc = "\t\t*map_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_GET_INFO_BY_FD"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about the eBPF object corresponding to"] # [doc = "\t\t*bpf_fd*."] # [doc = ""] # [doc = "\t\tPopulates up to *info_len* bytes of *info*, which will be in"] # [doc = "\t\tone of the following formats depending on the eBPF object type"] # [doc = "\t\tof *bpf_fd*:"] # [doc = ""] # [doc = "\t\t* **struct bpf_prog_info**"] # [doc = "\t\t* **struct bpf_map_info**"] # [doc = "\t\t* **struct bpf_btf_info**"] # [doc = "\t\t* **struct bpf_link_info**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\tspecified *attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_QUERY** always fetches the number of programs"] # [doc = "\t\tattached and the *attach_flags* which were used to attach those"] # [doc = "\t\tprograms. Additionally, if *prog_ids* is nonzero and the number"] # [doc = "\t\tof attached programs is less than *prog_cnt*, populates"] # [doc = "\t\t*prog_ids* with the eBPF program ids of the programs attached"] # [doc = "\t\tat *target_fd*."] # [doc = ""] # [doc = "\t\tThe following flags may alter the result:"] # [doc = ""] # [doc = "\t\t**BPF_F_QUERY_EFFECTIVE**"] # [doc = "\t\t\tOnly return information regarding programs which are"] # [doc = "\t\t\tcurrently effective at the specified *target_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_RAW_TRACEPOINT_OPEN"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a tracepoint *name* to access kernel"] # [doc = "\t\tinternal arguments of the tracepoint in their raw form."] # [doc = ""] # [doc = "\t\tThe *prog_fd* must be a valid file descriptor associated with"] # [doc = "\t\ta loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**."] # [doc = ""] # [doc = "\t\tNo ABI guarantees are made about the content of tracepoint"] # [doc = "\t\targuments exposed to the corresponding eBPF program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load BPF Type Format (BTF) metadata into the kernel,"] # [doc = "\t\treturning a new file descriptor associated with the metadata."] # [doc = "\t\tBTF is described in more detail at"] # [doc = "\t\thttps://www.kernel.org/doc/html/latest/bpf/btf.html."] # [doc = ""] # [doc = "\t\tThe *btf* parameter must point to valid memory providing"] # [doc = "\t\t*btf_size* bytes of BTF binary metadata."] # [doc = ""] # [doc = "\t\tThe returned file descriptor can be passed to other **bpf**\\ ()"] # [doc = "\t\tsubcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to"] # [doc = "\t\tassociate the BTF with those objects."] # [doc = ""] # [doc = "\t\tSimilar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional"] # [doc = "\t\tparameters to specify a *btf_log_buf*, *btf_log_size* and"] # [doc = "\t\t*btf_log_level* which allow the kernel to return freeform log"] # [doc = "\t\toutput regarding the BTF verification process."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the BPF Type Format (BTF)"] # [doc = "\t\tcorresponding to *btf_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_TASK_FD_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\ttarget process identified by *pid* and *fd*."] # [doc = ""] # [doc = "\t\tIf the *pid* and *fd* are associated with a tracepoint, kprobe"] # [doc = "\t\tor uprobe perf event, then the *prog_id* and *fd_type* will"] # [doc = "\t\tbe populated with the eBPF program id and file descriptor type"] # [doc = "\t\tof type **bpf_task_fd_type**. If associated with a kprobe or"] # [doc = "\t\tuprobe, the *probe_offset* and *probe_addr* will also be"] # [doc = "\t\tpopulated. Optionally, if *buf* is provided, then up to"] # [doc = "\t\t*buf_len* bytes of *buf* will be populated with the name of"] # [doc = "\t\tthe tracepoint, kprobe or uprobe."] # [doc = ""] # [doc = "\t\tThe resulting *prog_id* may be introspected in deeper detail"] # [doc = "\t\tusing **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with the given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *fd*, and if found, delete the element."] # [doc = ""] # [doc = "\t\tFor **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map"] # [doc = "\t\ttypes, the *flags* argument needs to be set to 0, but for other"] # [doc = "\t\tmap types, it may be specified as:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up and delete the value of a spin-locked map"] # [doc = "\t\t\twithout returning the lock. This must be specified if"] # [doc = "\t\t\tthe elements contain a spinlock."] # [doc = ""] # [doc = "\t\tThe **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types"] # [doc = "\t\timplement this command as a \"pop\" operation, deleting the top"] # [doc = "\t\telement rather than one corresponding to *key*."] # [doc = "\t\tThe *key* and *key_len* parameters should be zeroed when"] # [doc = "\t\tissuing this operation for these map types."] # [doc = ""] # [doc = "\t\tThis command is only valid for the following map types:"] # [doc = "\t\t* **BPF_MAP_TYPE_QUEUE**"] # [doc = "\t\t* **BPF_MAP_TYPE_STACK**"] # [doc = "\t\t* **BPF_MAP_TYPE_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_PERCPU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_PERCPU_HASH**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_FREEZE"] # [doc = "\tDescription"] # [doc = "\t\tFreeze the permissions of the specified map."] # [doc = ""] # [doc = "\t\tWrite permissions may be frozen by passing zero *flags*."] # [doc = "\t\tUpon success, no future syscall invocations may alter the"] # [doc = "\t\tmap state of *map_fd*. Write operations from eBPF programs"] # [doc = "\t\tare still possible for a frozen map."] # [doc = ""] # [doc = "\t\tNot supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_BTF_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next BPF Type Format (BTF) object currently loaded"] # [doc = "\t\tinto the kernel."] # [doc = ""] # [doc = "\t\tLooks for the BTF object with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other BTF objects"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and fetch multiple elements in a map."] # [doc = ""] # [doc = "\t\tTwo opaque values are used to manage batch operations,"] # [doc = "\t\t*in_batch* and *out_batch*. Initially, *in_batch* must be set"] # [doc = "\t\tto NULL to begin the batched operation. After each subsequent"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant"] # [doc = "\t\t*out_batch* as the *in_batch* for the next operation to"] # [doc = "\t\tcontinue iteration from the current point."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are output parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are copied into the"] # [doc = "\t\tuser buffer, with the keys copied into *keys* and the values"] # [doc = "\t\tcopied into the corresponding indices in *values*."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOSPC** to indicate that *keys* or"] # [doc = "\t\t*values* is too small to dump an entire bucket during"] # [doc = "\t\titeration of a hash-based map type."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and delete all elements in a map."] # [doc = ""] # [doc = "\t\tThis operation has the same behavior as"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH** with two exceptions:"] # [doc = ""] # [doc = "\t\t* Every element that is successfully returned is also deleted"] # [doc = "\t\t from the map. This is at least *count* elements. Note that"] # [doc = "\t\t *count* is both an input and an output parameter."] # [doc = "\t\t* Upon returning with *errno* set to **EFAULT**, up to"] # [doc = "\t\t *count* elements may be deleted without returning the keys"] # [doc = "\t\t and values of the deleted elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tUpdate multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are input parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially updated to the"] # [doc = "\t\tvalue in the corresponding index in *values*. The *in_batch*"] # [doc = "\t\tand *out_batch* parameters are ignored and should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate new elements or update a existing elements."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate new elements only if they do not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate existing elements."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate spin_lock-ed map elements. This must be"] # [doc = "\t\t\tspecified if the map value contains a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or"] # [doc = "\t\t**E2BIG**. **E2BIG** indicates that the number of elements in"] # [doc = "\t\tthe map reached the *max_entries* limit specified at map"] # [doc = "\t\tcreation time."] # [doc = ""] # [doc = "\t\tMay set *errno* to one of the following error codes under"] # [doc = "\t\tspecific circumstances:"] # [doc = ""] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tDelete multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* parameter is an input parameter which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tsize of the map *map_fd*, that is, *key_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially deleted. The"] # [doc = "\t\t*in_batch*, *out_batch*, and *values* parameters are ignored"] # [doc = "\t\tand should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements. If"] # [doc = "\t\t*errno* is **EFAULT**, up to *count* elements may be been"] # [doc = "\t\tdeleted."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook and return a file descriptor handle for"] # [doc = "\t\tmanaging the link."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_UPDATE"] # [doc = "\tDescription"] # [doc = "\t\tUpdate the eBPF program in the specified *link_fd* to"] # [doc = "\t\t*new_prog_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF Link corresponding to"] # [doc = "\t\t*link_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF link currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF link with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF links"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_ENABLE_STATS"] # [doc = "\tDescription"] # [doc = "\t\tEnable eBPF runtime statistics gathering."] # [doc = ""] # [doc = "\t\tRuntime statistics gathering for the eBPF runtime is disabled"] # [doc = "\t\tby default to minimize the corresponding performance overhead."] # [doc = "\t\tThis command enables statistics globally."] # [doc = ""] # [doc = "\t\tMultiple programs may independently enable statistics."] # [doc = "\t\tAfter gathering the desired statistics, eBPF runtime statistics"] # [doc = "\t\tmay be disabled again by calling **close**\\ (2) for the file"] # [doc = "\t\tdescriptor returned by this function. Statistics will only be"] # [doc = "\t\tdisabled system-wide when all outstanding file descriptors"] # [doc = "\t\treturned by prior calls for this subcommand are closed."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_ITER_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate an iterator on top of the specified *link_fd* (as"] # [doc = "\t\tpreviously created using **BPF_LINK_CREATE**) and return a"] # [doc = "\t\tfile descriptor that can be used to trigger the iteration."] # [doc = ""] # [doc = "\t\tIf the resulting file descriptor is pinned to the filesystem"] # [doc = "\t\tusing **BPF_OBJ_PIN**, then subsequent **read**\\ (2) syscalls"] # [doc = "\t\tfor that path will trigger the iterator to read kernel state"] # [doc = "\t\tusing the eBPF program attached to *link_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tForcefully detach the specified *link_fd* from its"] # [doc = "\t\tcorresponding attachment point."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_BIND_MAP"] # [doc = "\tDescription"] # [doc = "\t\tBind a map to the lifetime of an eBPF program."] # [doc = ""] # [doc = "\t\tThe map identified by *map_fd* is bound to the program"] # [doc = "\t\tidentified by *prog_fd* and only released when *prog_fd* is"] # [doc = "\t\treleased. This may be used in cases where metadata should be"] # [doc = "\t\tassociated with a program which otherwise does not contain any"] # [doc = "\t\treferences to the map (for example, embedded in the eBPF"] # [doc = "\t\tprogram instructions)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " NOTES"] # [doc = "\teBPF objects (maps and programs) can be shared between processes."] # [doc = ""] # [doc = "\t* After **fork**\\ (2), the child inherits file descriptors"] # [doc = "\t referring to the same eBPF objects."] # [doc = "\t* File descriptors referring to eBPF objects can be transferred over"] # [doc = "\t **unix**\\ (7) domain sockets."] # [doc = "\t* File descriptors referring to eBPF objects can be duplicated in the"] # [doc = "\t usual way, using **dup**\\ (2) and similar calls."] # [doc = "\t* File descriptors referring to eBPF objects can be pinned to the"] # [doc = "\t filesystem using the **BPF_OBJ_PIN** command of **bpf**\\ (2)."] # [doc = ""] # [doc = "\tAn eBPF object is deallocated only after all file descriptors referring"] # [doc = "\tto the object have been closed and no references remain pinned to the"] # [doc = "\tfilesystem or attached (for example, bound to a program or device)."] pu... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(rustdoc::invalid_rust_codeblocks)]` on by default [INFO] [stdout] = note: error from rustc: unknown start of token: \ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: could not parse code block as Rust code [INFO] [stdout] --> /opt/rustwide/target/debug/build/rhdxmr-publish-test3-ca3a5ccc900ce0dc/out/libbpf_bindings.rs:3:119978 [INFO] [stdout] | [INFO] [stdout] 3 | ... ; # [doc = " DOC: eBPF Syscall Preamble"] # [doc = ""] # [doc = " The operation to be performed by the **bpf**\\ () system call is determined"] # [doc = " by the *cmd* argument. Each operation takes an accompanying argument,"] # [doc = " provided via *attr*, which is a pointer to a union of type *bpf_attr* (see"] # [doc = " below). The size argument is the size of the union pointed to by *attr*."] # [doc = " DOC: eBPF Syscall Commands"] # [doc = ""] # [doc = " BPF_MAP_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate a map and return a file descriptor that refers to the"] # [doc = "\t\tmap. The close-on-exec file descriptor flag (see **fcntl**\\ (2))"] # [doc = "\t\tis automatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_MAP_CREATE** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with a given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *map_fd*."] # [doc = ""] # [doc = "\t\tThe *flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tCreate or update an element (key/value pair) in a specified map."] # [doc = ""] # [doc = "\t\tThe *flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate a new element or update an existing element."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate a new element only if it did not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate an existing element."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate a spin_lock-ed map element."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**,"] # [doc = "\t\t**E2BIG**, **EEXIST**, or **ENOENT**."] # [doc = ""] # [doc = "\t\t**E2BIG**"] # [doc = "\t\t\tThe number of elements in the map reached the"] # [doc = "\t\t\t*max_entries* limit specified at map creation time."] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up and delete an element by key in a specified map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_KEY"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element by key in a specified map and return the key"] # [doc = "\t\tof the next element. Can be used to iterate over all elements"] # [doc = "\t\tin the map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tThe following cases can be used to iterate over all elements of"] # [doc = "\t\tthe map:"] # [doc = ""] # [doc = "\t\t* If *key* is not found, the operation returns zero and sets"] # [doc = "\t\t the *next_key* pointer to the key of the first element."] # [doc = "\t\t* If *key* is found, the operation returns zero and sets the"] # [doc = "\t\t *next_key* pointer to the key of the next element."] # [doc = "\t\t* If *key* is the last element, returns -1 and *errno* is set"] # [doc = "\t\t to **ENOENT**."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or"] # [doc = "\t\t**EINVAL** on error."] # [doc = ""] # [doc = " BPF_PROG_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load an eBPF program, returning a new file"] # [doc = "\t\tdescriptor associated with the program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_PROG_LOAD** will unload the eBPF program (but see NOTES)."] # [doc = ""] # [doc = "\t\tThe close-on-exec file descriptor flag (see **fcntl**\\ (2)) is"] # [doc = "\t\tautomatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_PIN"] # [doc = "\tDescription"] # [doc = "\t\tPin an eBPF program or map referred by the specified *bpf_fd*"] # [doc = "\t\tto the provided *pathname* on the filesystem."] # [doc = ""] # [doc = "\t\tThe *pathname* argument must not contain a dot (\".\")."] # [doc = ""] # [doc = "\t\tOn success, *pathname* retains a reference to the eBPF object,"] # [doc = "\t\tpreventing deallocation of the object when the original"] # [doc = "\t\t*bpf_fd* is closed. This allow the eBPF object to live beyond"] # [doc = "\t\t**close**\\ (\\ *bpf_fd*\\ ), and hence the lifetime of the parent"] # [doc = "\t\tprocess."] # [doc = ""] # [doc = "\t\tApplying **unlink**\\ (2) or similar calls to the *pathname*"] # [doc = "\t\tunpins the object from the filesystem, removing the reference."] # [doc = "\t\tIf no other file descriptors or filesystem nodes refer to the"] # [doc = "\t\tsame object, it will be deallocated (see NOTES)."] # [doc = ""] # [doc = "\t\tThe filesystem type for the parent directory of *pathname* must"] # [doc = "\t\tbe **BPF_FS_MAGIC**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_OBJ_GET"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF object pinned to the"] # [doc = "\t\tspecified *pathname*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_PROG_ATTACH"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *attach_type* specifies the eBPF attachment point to"] # [doc = "\t\tattach the program to, and must be one of *bpf_attach_type*"] # [doc = "\t\t(see below)."] # [doc = ""] # [doc = "\t\tThe *attach_bpf_fd* must be a valid file descriptor for a"] # [doc = "\t\tloaded eBPF program of a cgroup, flow dissector, LIRC, sockmap"] # [doc = "\t\tor sock_ops type corresponding to the specified *attach_type*."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_SK_MSG**"] # [doc = ""] # [doc = "\t\t\teBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tDetach the eBPF program associated with the *target_fd* at the"] # [doc = "\t\thook specified by *attach_type*. The program must have been"] # [doc = "\t\tpreviously attached using **BPF_PROG_ATTACH**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_TEST_RUN"] # [doc = "\tDescription"] # [doc = "\t\tRun the eBPF program associated with the *prog_fd* a *repeat*"] # [doc = "\t\tnumber of times against a provided program context *ctx_in* and"] # [doc = "\t\tdata *data_in*, and return the modified program context"] # [doc = "\t\t*ctx_out*, *data_out* (for example, packet data), result of the"] # [doc = "\t\texecution *retval*, and *duration* of the test run."] # [doc = ""] # [doc = "\t\tThe sizes of the buffers provided as input and output"] # [doc = "\t\tparameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must"] # [doc = "\t\tbe provided in the corresponding variables *ctx_size_in*,"] # [doc = "\t\t*ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any"] # [doc = "\t\tof these parameters are not provided (ie set to NULL), the"] # [doc = "\t\tcorresponding size field must be zero."] # [doc = ""] # [doc = "\t\tSome program types have particular requirements:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_LOOKUP**"] # [doc = "\t\t\t*data_in* and *data_out* must be NULL."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT**,"] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE**"] # [doc = ""] # [doc = "\t\t\t*ctx_out*, *data_in* and *data_out* must be NULL."] # [doc = "\t\t\t*repeat* must be zero."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\t**ENOSPC**"] # [doc = "\t\t\tEither *data_size_out* or *ctx_size_out* is too small."] # [doc = "\t\t**ENOTSUPP**"] # [doc = "\t\t\tThis command is not supported by the program type of"] # [doc = "\t\t\tthe program referred to by *prog_fd*."] # [doc = ""] # [doc = " BPF_PROG_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF program currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF program with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF programs"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF map currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF map with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF maps"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_PROG_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF program corresponding to"] # [doc = "\t\t*prog_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF map corresponding to"] # [doc = "\t\t*map_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_GET_INFO_BY_FD"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about the eBPF object corresponding to"] # [doc = "\t\t*bpf_fd*."] # [doc = ""] # [doc = "\t\tPopulates up to *info_len* bytes of *info*, which will be in"] # [doc = "\t\tone of the following formats depending on the eBPF object type"] # [doc = "\t\tof *bpf_fd*:"] # [doc = ""] # [doc = "\t\t* **struct bpf_prog_info**"] # [doc = "\t\t* **struct bpf_map_info**"] # [doc = "\t\t* **struct bpf_btf_info**"] # [doc = "\t\t* **struct bpf_link_info**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\tspecified *attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_QUERY** always fetches the number of programs"] # [doc = "\t\tattached and the *attach_flags* which were used to attach those"] # [doc = "\t\tprograms. Additionally, if *prog_ids* is nonzero and the number"] # [doc = "\t\tof attached programs is less than *prog_cnt*, populates"] # [doc = "\t\t*prog_ids* with the eBPF program ids of the programs attached"] # [doc = "\t\tat *target_fd*."] # [doc = ""] # [doc = "\t\tThe following flags may alter the result:"] # [doc = ""] # [doc = "\t\t**BPF_F_QUERY_EFFECTIVE**"] # [doc = "\t\t\tOnly return information regarding programs which are"] # [doc = "\t\t\tcurrently effective at the specified *target_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_RAW_TRACEPOINT_OPEN"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a tracepoint *name* to access kernel"] # [doc = "\t\tinternal arguments of the tracepoint in their raw form."] # [doc = ""] # [doc = "\t\tThe *prog_fd* must be a valid file descriptor associated with"] # [doc = "\t\ta loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**."] # [doc = ""] # [doc = "\t\tNo ABI guarantees are made about the content of tracepoint"] # [doc = "\t\targuments exposed to the corresponding eBPF program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load BPF Type Format (BTF) metadata into the kernel,"] # [doc = "\t\treturning a new file descriptor associated with the metadata."] # [doc = "\t\tBTF is described in more detail at"] # [doc = "\t\thttps://www.kernel.org/doc/html/latest/bpf/btf.html."] # [doc = ""] # [doc = "\t\tThe *btf* parameter must point to valid memory providing"] # [doc = "\t\t*btf_size* bytes of BTF binary metadata."] # [doc = ""] # [doc = "\t\tThe returned file descriptor can be passed to other **bpf**\\ ()"] # [doc = "\t\tsubcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to"] # [doc = "\t\tassociate the BTF with those objects."] # [doc = ""] # [doc = "\t\tSimilar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional"] # [doc = "\t\tparameters to specify a *btf_log_buf*, *btf_log_size* and"] # [doc = "\t\t*btf_log_level* which allow the kernel to return freeform log"] # [doc = "\t\toutput regarding the BTF verification process."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the BPF Type Format (BTF)"] # [doc = "\t\tcorresponding to *btf_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_TASK_FD_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\ttarget process identified by *pid* and *fd*."] # [doc = ""] # [doc = "\t\tIf the *pid* and *fd* are associated with a tracepoint, kprobe"] # [doc = "\t\tor uprobe perf event, then the *prog_id* and *fd_type* will"] # [doc = "\t\tbe populated with the eBPF program id and file descriptor type"] # [doc = "\t\tof type **bpf_task_fd_type**. If associated with a kprobe or"] # [doc = "\t\tuprobe, the *probe_offset* and *probe_addr* will also be"] # [doc = "\t\tpopulated. Optionally, if *buf* is provided, then up to"] # [doc = "\t\t*buf_len* bytes of *buf* will be populated with the name of"] # [doc = "\t\tthe tracepoint, kprobe or uprobe."] # [doc = ""] # [doc = "\t\tThe resulting *prog_id* may be introspected in deeper detail"] # [doc = "\t\tusing **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with the given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *fd*, and if found, delete the element."] # [doc = ""] # [doc = "\t\tFor **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map"] # [doc = "\t\ttypes, the *flags* argument needs to be set to 0, but for other"] # [doc = "\t\tmap types, it may be specified as:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up and delete the value of a spin-locked map"] # [doc = "\t\t\twithout returning the lock. This must be specified if"] # [doc = "\t\t\tthe elements contain a spinlock."] # [doc = ""] # [doc = "\t\tThe **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types"] # [doc = "\t\timplement this command as a \"pop\" operation, deleting the top"] # [doc = "\t\telement rather than one corresponding to *key*."] # [doc = "\t\tThe *key* and *key_len* parameters should be zeroed when"] # [doc = "\t\tissuing this operation for these map types."] # [doc = ""] # [doc = "\t\tThis command is only valid for the following map types:"] # [doc = "\t\t* **BPF_MAP_TYPE_QUEUE**"] # [doc = "\t\t* **BPF_MAP_TYPE_STACK**"] # [doc = "\t\t* **BPF_MAP_TYPE_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_PERCPU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_PERCPU_HASH**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_FREEZE"] # [doc = "\tDescription"] # [doc = "\t\tFreeze the permissions of the specified map."] # [doc = ""] # [doc = "\t\tWrite permissions may be frozen by passing zero *flags*."] # [doc = "\t\tUpon success, no future syscall invocations may alter the"] # [doc = "\t\tmap state of *map_fd*. Write operations from eBPF programs"] # [doc = "\t\tare still possible for a frozen map."] # [doc = ""] # [doc = "\t\tNot supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_BTF_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next BPF Type Format (BTF) object currently loaded"] # [doc = "\t\tinto the kernel."] # [doc = ""] # [doc = "\t\tLooks for the BTF object with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other BTF objects"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and fetch multiple elements in a map."] # [doc = ""] # [doc = "\t\tTwo opaque values are used to manage batch operations,"] # [doc = "\t\t*in_batch* and *out_batch*. Initially, *in_batch* must be set"] # [doc = "\t\tto NULL to begin the batched operation. After each subsequent"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant"] # [doc = "\t\t*out_batch* as the *in_batch* for the next operation to"] # [doc = "\t\tcontinue iteration from the current point."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are output parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are copied into the"] # [doc = "\t\tuser buffer, with the keys copied into *keys* and the values"] # [doc = "\t\tcopied into the corresponding indices in *values*."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOSPC** to indicate that *keys* or"] # [doc = "\t\t*values* is too small to dump an entire bucket during"] # [doc = "\t\titeration of a hash-based map type."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and delete all elements in a map."] # [doc = ""] # [doc = "\t\tThis operation has the same behavior as"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH** with two exceptions:"] # [doc = ""] # [doc = "\t\t* Every element that is successfully returned is also deleted"] # [doc = "\t\t from the map. This is at least *count* elements. Note that"] # [doc = "\t\t *count* is both an input and an output parameter."] # [doc = "\t\t* Upon returning with *errno* set to **EFAULT**, up to"] # [doc = "\t\t *count* elements may be deleted without returning the keys"] # [doc = "\t\t and values of the deleted elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tUpdate multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are input parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially updated to the"] # [doc = "\t\tvalue in the corresponding index in *values*. The *in_batch*"] # [doc = "\t\tand *out_batch* parameters are ignored and should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate new elements or update a existing elements."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate new elements only if they do not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate existing elements."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate spin_lock-ed map elements. This must be"] # [doc = "\t\t\tspecified if the map value contains a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or"] # [doc = "\t\t**E2BIG**. **E2BIG** indicates that the number of elements in"] # [doc = "\t\tthe map reached the *max_entries* limit specified at map"] # [doc = "\t\tcreation time."] # [doc = ""] # [doc = "\t\tMay set *errno* to one of the following error codes under"] # [doc = "\t\tspecific circumstances:"] # [doc = ""] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tDelete multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* parameter is an input parameter which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tsize of the map *map_fd*, that is, *key_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially deleted. The"] # [doc = "\t\t*in_batch*, *out_batch*, and *values* parameters are ignored"] # [doc = "\t\tand should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements. If"] # [doc = "\t\t*errno* is **EFAULT**, up to *count* elements may be been"] # [doc = "\t\tdeleted."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook and return a file descriptor handle for"] # [doc = "\t\tmanaging the link."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_UPDATE"] # [doc = "\tDescription"] # [doc = "\t\tUpdate the eBPF program in the specified *link_fd* to"] # [doc = "\t\t*new_prog_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF Link corresponding to"] # [doc = "\t\t*link_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF link currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF link with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF links"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_ENABLE_STATS"] # [doc = "\tDescription"] # [doc = "\t\tEnable eBPF runtime statistics gathering."] # [doc = ""] # [doc = "\t\tRuntime statistics gathering for the eBPF runtime is disabled"] # [doc = "\t\tby default to minimize the corresponding performance overhead."] # [doc = "\t\tThis command enables statistics globally."] # [doc = ""] # [doc = "\t\tMultiple programs may independently enable statistics."] # [doc = "\t\tAfter gathering the desired statistics, eBPF runtime statistics"] # [doc = "\t\tmay be disabled again by calling **close**\\ (2) for the file"] # [doc = "\t\tdescriptor returned by this function. Statistics will only be"] # [doc = "\t\tdisabled system-wide when all outstanding file descriptors"] # [doc = "\t\treturned by prior calls for this subcommand are closed."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_ITER_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate an iterator on top of the specified *link_fd* (as"] # [doc = "\t\tpreviously created using **BPF_LINK_CREATE**) and return a"] # [doc = "\t\tfile descriptor that can be used to trigger the iteration."] # [doc = ""] # [doc = "\t\tIf the resulting file descriptor is pinned to the filesystem"] # [doc = "\t\tusing **BPF_OBJ_PIN**, then subsequent **read**\\ (2) syscalls"] # [doc = "\t\tfor that path will trigger the iterator to read kernel state"] # [doc = "\t\tusing the eBPF program attached to *link_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tForcefully detach the specified *link_fd* from its"] # [doc = "\t\tcorresponding attachment point."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_BIND_MAP"] # [doc = "\tDescription"] # [doc = "\t\tBind a map to the lifetime of an eBPF program."] # [doc = ""] # [doc = "\t\tThe map identified by *map_fd* is bound to the program"] # [doc = "\t\tidentified by *prog_fd* and only released when *prog_fd* is"] # [doc = "\t\treleased. This may be used in cases where metadata should be"] # [doc = "\t\tassociated with a program which otherwise does not contain any"] # [doc = "\t\treferences to the map (for example, embedded in the eBPF"] # [doc = "\t\tprogram instructions)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " NOTES"] # [doc = "\teBPF objects (maps and programs) can be shared between processes."] # [doc = ""] # [doc = "\t* After **fork**\\ (2), the child inherits file descriptors"] # [doc = "\t referring to the same eBPF objects."] # [doc = "\t* File descriptors referring to eBPF objects can be transferred over"] # [doc = "\t **unix**\\ (7) domain sockets."] # [doc = "\t* File descriptors referring to eBPF objects can be duplicated in the"] # [doc = "\t usual way, using **dup**\\ (2) and similar calls."] # [doc = "\t* File descriptors referring to eBPF objects can be pinned to the"] # [doc = "\t filesystem using the **BPF_OBJ_PIN** command of **bpf**\\ (2)."] # [doc = ""] # [doc = "\tAn eBPF object is deallocated only after all file descriptors referring"] # [doc = "\tto the object have been closed and no references remain pinned to the"] # [doc = "\tfilesystem or attached (for example, bound to a program or device)."] pu... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: error from rustc: unknown start of token: \ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this URL is not a hyperlink [INFO] [stdout] --> /opt/rustwide/target/debug/build/rhdxmr-publish-test3-ca3a5ccc900ce0dc/out/perf_reader_bindings.rs:3:27938 [INFO] [stdout] | [INFO] [stdout] 3 | ... ; # [doc = " DOC: eBPF Syscall Preamble"] # [doc = ""] # [doc = " The operation to be performed by the **bpf**\\ () system call is determined"] # [doc = " by the *cmd* argument. Each operation takes an accompanying argument,"] # [doc = " provided via *attr*, which is a pointer to a union of type *bpf_attr* (see"] # [doc = " below). The size argument is the size of the union pointed to by *attr*."] # [doc = " DOC: eBPF Syscall Commands"] # [doc = ""] # [doc = " BPF_MAP_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate a map and return a file descriptor that refers to the"] # [doc = "\t\tmap. The close-on-exec file descriptor flag (see **fcntl**\\ (2))"] # [doc = "\t\tis automatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_MAP_CREATE** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with a given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *map_fd*."] # [doc = ""] # [doc = "\t\tThe *flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tCreate or update an element (key/value pair) in a specified map."] # [doc = ""] # [doc = "\t\tThe *flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate a new element or update an existing element."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate a new element only if it did not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate an existing element."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate a spin_lock-ed map element."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**,"] # [doc = "\t\t**E2BIG**, **EEXIST**, or **ENOENT**."] # [doc = ""] # [doc = "\t\t**E2BIG**"] # [doc = "\t\t\tThe number of elements in the map reached the"] # [doc = "\t\t\t*max_entries* limit specified at map creation time."] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up and delete an element by key in a specified map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_KEY"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element by key in a specified map and return the key"] # [doc = "\t\tof the next element. Can be used to iterate over all elements"] # [doc = "\t\tin the map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tThe following cases can be used to iterate over all elements of"] # [doc = "\t\tthe map:"] # [doc = ""] # [doc = "\t\t* If *key* is not found, the operation returns zero and sets"] # [doc = "\t\t the *next_key* pointer to the key of the first element."] # [doc = "\t\t* If *key* is found, the operation returns zero and sets the"] # [doc = "\t\t *next_key* pointer to the key of the next element."] # [doc = "\t\t* If *key* is the last element, returns -1 and *errno* is set"] # [doc = "\t\t to **ENOENT**."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or"] # [doc = "\t\t**EINVAL** on error."] # [doc = ""] # [doc = " BPF_PROG_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load an eBPF program, returning a new file"] # [doc = "\t\tdescriptor associated with the program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_PROG_LOAD** will unload the eBPF program (but see NOTES)."] # [doc = ""] # [doc = "\t\tThe close-on-exec file descriptor flag (see **fcntl**\\ (2)) is"] # [doc = "\t\tautomatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_PIN"] # [doc = "\tDescription"] # [doc = "\t\tPin an eBPF program or map referred by the specified *bpf_fd*"] # [doc = "\t\tto the provided *pathname* on the filesystem."] # [doc = ""] # [doc = "\t\tThe *pathname* argument must not contain a dot (\".\")."] # [doc = ""] # [doc = "\t\tOn success, *pathname* retains a reference to the eBPF object,"] # [doc = "\t\tpreventing deallocation of the object when the original"] # [doc = "\t\t*bpf_fd* is closed. This allow the eBPF object to live beyond"] # [doc = "\t\t**close**\\ (\\ *bpf_fd*\\ ), and hence the lifetime of the parent"] # [doc = "\t\tprocess."] # [doc = ""] # [doc = "\t\tApplying **unlink**\\ (2) or similar calls to the *pathname*"] # [doc = "\t\tunpins the object from the filesystem, removing the reference."] # [doc = "\t\tIf no other file descriptors or filesystem nodes refer to the"] # [doc = "\t\tsame object, it will be deallocated (see NOTES)."] # [doc = ""] # [doc = "\t\tThe filesystem type for the parent directory of *pathname* must"] # [doc = "\t\tbe **BPF_FS_MAGIC**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_OBJ_GET"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF object pinned to the"] # [doc = "\t\tspecified *pathname*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_PROG_ATTACH"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *attach_type* specifies the eBPF attachment point to"] # [doc = "\t\tattach the program to, and must be one of *bpf_attach_type*"] # [doc = "\t\t(see below)."] # [doc = ""] # [doc = "\t\tThe *attach_bpf_fd* must be a valid file descriptor for a"] # [doc = "\t\tloaded eBPF program of a cgroup, flow dissector, LIRC, sockmap"] # [doc = "\t\tor sock_ops type corresponding to the specified *attach_type*."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_SK_MSG**"] # [doc = ""] # [doc = "\t\t\teBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tDetach the eBPF program associated with the *target_fd* at the"] # [doc = "\t\thook specified by *attach_type*. The program must have been"] # [doc = "\t\tpreviously attached using **BPF_PROG_ATTACH**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_TEST_RUN"] # [doc = "\tDescription"] # [doc = "\t\tRun the eBPF program associated with the *prog_fd* a *repeat*"] # [doc = "\t\tnumber of times against a provided program context *ctx_in* and"] # [doc = "\t\tdata *data_in*, and return the modified program context"] # [doc = "\t\t*ctx_out*, *data_out* (for example, packet data), result of the"] # [doc = "\t\texecution *retval*, and *duration* of the test run."] # [doc = ""] # [doc = "\t\tThe sizes of the buffers provided as input and output"] # [doc = "\t\tparameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must"] # [doc = "\t\tbe provided in the corresponding variables *ctx_size_in*,"] # [doc = "\t\t*ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any"] # [doc = "\t\tof these parameters are not provided (ie set to NULL), the"] # [doc = "\t\tcorresponding size field must be zero."] # [doc = ""] # [doc = "\t\tSome program types have particular requirements:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_LOOKUP**"] # [doc = "\t\t\t*data_in* and *data_out* must be NULL."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT**,"] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE**"] # [doc = ""] # [doc = "\t\t\t*ctx_out*, *data_in* and *data_out* must be NULL."] # [doc = "\t\t\t*repeat* must be zero."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\t**ENOSPC**"] # [doc = "\t\t\tEither *data_size_out* or *ctx_size_out* is too small."] # [doc = "\t\t**ENOTSUPP**"] # [doc = "\t\t\tThis command is not supported by the program type of"] # [doc = "\t\t\tthe program referred to by *prog_fd*."] # [doc = ""] # [doc = " BPF_PROG_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF program currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF program with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF programs"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF map currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF map with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF maps"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_PROG_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF program corresponding to"] # [doc = "\t\t*prog_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF map corresponding to"] # [doc = "\t\t*map_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_GET_INFO_BY_FD"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about the eBPF object corresponding to"] # [doc = "\t\t*bpf_fd*."] # [doc = ""] # [doc = "\t\tPopulates up to *info_len* bytes of *info*, which will be in"] # [doc = "\t\tone of the following formats depending on the eBPF object type"] # [doc = "\t\tof *bpf_fd*:"] # [doc = ""] # [doc = "\t\t* **struct bpf_prog_info**"] # [doc = "\t\t* **struct bpf_map_info**"] # [doc = "\t\t* **struct bpf_btf_info**"] # [doc = "\t\t* **struct bpf_link_info**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\tspecified *attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_QUERY** always fetches the number of programs"] # [doc = "\t\tattached and the *attach_flags* which were used to attach those"] # [doc = "\t\tprograms. Additionally, if *prog_ids* is nonzero and the number"] # [doc = "\t\tof attached programs is less than *prog_cnt*, populates"] # [doc = "\t\t*prog_ids* with the eBPF program ids of the programs attached"] # [doc = "\t\tat *target_fd*."] # [doc = ""] # [doc = "\t\tThe following flags may alter the result:"] # [doc = ""] # [doc = "\t\t**BPF_F_QUERY_EFFECTIVE**"] # [doc = "\t\t\tOnly return information regarding programs which are"] # [doc = "\t\t\tcurrently effective at the specified *target_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_RAW_TRACEPOINT_OPEN"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a tracepoint *name* to access kernel"] # [doc = "\t\tinternal arguments of the tracepoint in their raw form."] # [doc = ""] # [doc = "\t\tThe *prog_fd* must be a valid file descriptor associated with"] # [doc = "\t\ta loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**."] # [doc = ""] # [doc = "\t\tNo ABI guarantees are made about the content of tracepoint"] # [doc = "\t\targuments exposed to the corresponding eBPF program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load BPF Type Format (BTF) metadata into the kernel,"] # [doc = "\t\treturning a new file descriptor associated with the metadata."] # [doc = "\t\tBTF is described in more detail at"] # [doc = "\t\thttps://www.kernel.org/doc/html/latest/bpf/btf.html."] # [doc = ""] # [doc = "\t\tThe *btf* parameter must point to valid memory providing"] # [doc = "\t\t*btf_size* bytes of BTF binary metadata."] # [doc = ""] # [doc = "\t\tThe returned file descriptor can be passed to other **bpf**\\ ()"] # [doc = "\t\tsubcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to"] # [doc = "\t\tassociate the BTF with those objects."] # [doc = ""] # [doc = "\t\tSimilar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional"] # [doc = "\t\tparameters to specify a *btf_log_buf*, *btf_log_size* and"] # [doc = "\t\t*btf_log_level* which allow the kernel to return freeform log"] # [doc = "\t\toutput regarding the BTF verification process."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the BPF Type Format (BTF)"] # [doc = "\t\tcorresponding to *btf_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_TASK_FD_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\ttarget process identified by *pid* and *fd*."] # [doc = ""] # [doc = "\t\tIf the *pid* and *fd* are associated with a tracepoint, kprobe"] # [doc = "\t\tor uprobe perf event, then the *prog_id* and *fd_type* will"] # [doc = "\t\tbe populated with the eBPF program id and file descriptor type"] # [doc = "\t\tof type **bpf_task_fd_type**. If associated with a kprobe or"] # [doc = "\t\tuprobe, the *probe_offset* and *probe_addr* will also be"] # [doc = "\t\tpopulated. Optionally, if *buf* is provided, then up to"] # [doc = "\t\t*buf_len* bytes of *buf* will be populated with the name of"] # [doc = "\t\tthe tracepoint, kprobe or uprobe."] # [doc = ""] # [doc = "\t\tThe resulting *prog_id* may be introspected in deeper detail"] # [doc = "\t\tusing **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with the given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *fd*, and if found, delete the element."] # [doc = ""] # [doc = "\t\tFor **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map"] # [doc = "\t\ttypes, the *flags* argument needs to be set to 0, but for other"] # [doc = "\t\tmap types, it may be specified as:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up and delete the value of a spin-locked map"] # [doc = "\t\t\twithout returning the lock. This must be specified if"] # [doc = "\t\t\tthe elements contain a spinlock."] # [doc = ""] # [doc = "\t\tThe **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types"] # [doc = "\t\timplement this command as a \"pop\" operation, deleting the top"] # [doc = "\t\telement rather than one corresponding to *key*."] # [doc = "\t\tThe *key* and *key_len* parameters should be zeroed when"] # [doc = "\t\tissuing this operation for these map types."] # [doc = ""] # [doc = "\t\tThis command is only valid for the following map types:"] # [doc = "\t\t* **BPF_MAP_TYPE_QUEUE**"] # [doc = "\t\t* **BPF_MAP_TYPE_STACK**"] # [doc = "\t\t* **BPF_MAP_TYPE_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_PERCPU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_PERCPU_HASH**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_FREEZE"] # [doc = "\tDescription"] # [doc = "\t\tFreeze the permissions of the specified map."] # [doc = ""] # [doc = "\t\tWrite permissions may be frozen by passing zero *flags*."] # [doc = "\t\tUpon success, no future syscall invocations may alter the"] # [doc = "\t\tmap state of *map_fd*. Write operations from eBPF programs"] # [doc = "\t\tare still possible for a frozen map."] # [doc = ""] # [doc = "\t\tNot supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_BTF_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next BPF Type Format (BTF) object currently loaded"] # [doc = "\t\tinto the kernel."] # [doc = ""] # [doc = "\t\tLooks for the BTF object with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other BTF objects"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and fetch multiple elements in a map."] # [doc = ""] # [doc = "\t\tTwo opaque values are used to manage batch operations,"] # [doc = "\t\t*in_batch* and *out_batch*. Initially, *in_batch* must be set"] # [doc = "\t\tto NULL to begin the batched operation. After each subsequent"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant"] # [doc = "\t\t*out_batch* as the *in_batch* for the next operation to"] # [doc = "\t\tcontinue iteration from the current point."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are output parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are copied into the"] # [doc = "\t\tuser buffer, with the keys copied into *keys* and the values"] # [doc = "\t\tcopied into the corresponding indices in *values*."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOSPC** to indicate that *keys* or"] # [doc = "\t\t*values* is too small to dump an entire bucket during"] # [doc = "\t\titeration of a hash-based map type."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and delete all elements in a map."] # [doc = ""] # [doc = "\t\tThis operation has the same behavior as"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH** with two exceptions:"] # [doc = ""] # [doc = "\t\t* Every element that is successfully returned is also deleted"] # [doc = "\t\t from the map. This is at least *count* elements. Note that"] # [doc = "\t\t *count* is both an input and an output parameter."] # [doc = "\t\t* Upon returning with *errno* set to **EFAULT**, up to"] # [doc = "\t\t *count* elements may be deleted without returning the keys"] # [doc = "\t\t and values of the deleted elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tUpdate multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are input parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially updated to the"] # [doc = "\t\tvalue in the corresponding index in *values*. The *in_batch*"] # [doc = "\t\tand *out_batch* parameters are ignored and should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate new elements or update a existing elements."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate new elements only if they do not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate existing elements."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate spin_lock-ed map elements. This must be"] # [doc = "\t\t\tspecified if the map value contains a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or"] # [doc = "\t\t**E2BIG**. **E2BIG** indicates that the number of elements in"] # [doc = "\t\tthe map reached the *max_entries* limit specified at map"] # [doc = "\t\tcreation time."] # [doc = ""] # [doc = "\t\tMay set *errno* to one of the following error codes under"] # [doc = "\t\tspecific circumstances:"] # [doc = ""] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tDelete multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* parameter is an input parameter which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tsize of the map *map_fd*, that is, *key_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially deleted. The"] # [doc = "\t\t*in_batch*, *out_batch*, and *values* parameters are ignored"] # [doc = "\t\tand should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements. If"] # [doc = "\t\t*errno* is **EFAULT**, up to *count* elements may be been"] # [doc = "\t\tdeleted."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook and return a file descriptor handle for"] # [doc = "\t\tmanaging the link."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_UPDATE"] # [doc = "\tDescription"] # [doc = "\t\tUpdate the eBPF program in the specified *link_fd* to"] # [doc = "\t\t*new_prog_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF Link corresponding to"] # [doc = "\t\t*link_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF link currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF link with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF links"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_ENABLE_STATS"] # [doc = "\tDescription"] # [doc = "\t\tEnable eBPF runtime statistics gathering."] # [doc = ""] # [doc = "\t\tRuntime statistics gathering for the eBPF runtime is disabled"] # [doc = "\t\tby default to minimize the corresponding performance overhead."] # [doc = "\t\tThis command enables statistics globally."] # [doc = ""] # [doc = "\t\tMultiple programs may independently enable statistics."] # [doc = "\t\tAfter gathering the desired statistics, eBPF runtime statistics"] # [doc = "\t\tmay be disabled again by calling **close**\\ (2) for the file"] # [doc = "\t\tdescriptor returned by this function. Statistics will only be"] # [doc = "\t\tdisabled system-wide when all outstanding file descriptors"] # [doc = "\t\treturned by prior calls for this subcommand are closed."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_ITER_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate an iterator on top of the specified *link_fd* (as"] # [doc = "\t\tpreviously created using **BPF_LINK_CREATE**) and return a"] # [doc = "\t\tfile descriptor that can be used to trigger the iteration."] # [doc = ""] # [doc = "\t\tIf the resulting file descriptor is pinned to the filesystem"] # [doc = "\t\tusing **BPF_OBJ_PIN**, then subsequent **read**\\ (2) syscalls"] # [doc = "\t\tfor that path will trigger the iterator to read kernel state"] # [doc = "\t\tusing the eBPF program attached to *link_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tForcefully detach the specified *link_fd* from its"] # [doc = "\t\tcorresponding attachment point."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_BIND_MAP"] # [doc = "\tDescription"] # [doc = "\t\tBind a map to the lifetime of an eBPF program."] # [doc = ""] # [doc = "\t\tThe map identified by *map_fd* is bound to the program"] # [doc = "\t\tidentified by *prog_fd* and only released when *prog_fd* is"] # [doc = "\t\treleased. This may be used in cases where metadata should be"] # [doc = "\t\tassociated with a program which otherwise does not contain any"] # [doc = "\t\treferences to the map (for example, embedded in the eBPF"] # [doc = "\t\tprogram instructions)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " NOTES"] # [doc = "\teBPF objects (maps and programs) can be shared between processes."] # [doc = ""] # [doc = "\t* After **fork**\\ (2), the child inherits file descriptors"] # [doc = "\t referring to the same eBPF objects."] # [doc = "\t* File descriptors referring to eBPF objects can be transferred over"] # [doc = "\t **unix**\\ (7) domain sockets."] # [doc = "\t* File descriptors referring to eBPF objects can be duplicated in the"] # [doc = "\t usual way, using **dup**\\ (2) and similar calls."] # [doc = "\t* File descriptors referring to eBPF objects can be pinned to the"] # [doc = "\t filesystem using the **BPF_OBJ_PIN** command of **bpf**\\ (2)."] # [doc = ""] # [doc = "\tAn eBPF object is deallocated only after all file descriptors referring"] # [doc = "\tto the object have been closed and no references remain pinned to the"] # [doc = "\tfilesystem or attached (for example, bound to a program or device)."] pu... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use an automatic link instead: `` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(rustdoc::bare_urls)]` on by default [INFO] [stdout] = note: bare URLs are not automatically turned into clickable links [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this URL is not a hyperlink [INFO] [stdout] --> /opt/rustwide/target/debug/build/rhdxmr-publish-test3-ca3a5ccc900ce0dc/out/libbpf_bindings.rs:3:119978 [INFO] [stdout] | [INFO] [stdout] 3 | ... ; # [doc = " DOC: eBPF Syscall Preamble"] # [doc = ""] # [doc = " The operation to be performed by the **bpf**\\ () system call is determined"] # [doc = " by the *cmd* argument. Each operation takes an accompanying argument,"] # [doc = " provided via *attr*, which is a pointer to a union of type *bpf_attr* (see"] # [doc = " below). The size argument is the size of the union pointed to by *attr*."] # [doc = " DOC: eBPF Syscall Commands"] # [doc = ""] # [doc = " BPF_MAP_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate a map and return a file descriptor that refers to the"] # [doc = "\t\tmap. The close-on-exec file descriptor flag (see **fcntl**\\ (2))"] # [doc = "\t\tis automatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_MAP_CREATE** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with a given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *map_fd*."] # [doc = ""] # [doc = "\t\tThe *flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tCreate or update an element (key/value pair) in a specified map."] # [doc = ""] # [doc = "\t\tThe *flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate a new element or update an existing element."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate a new element only if it did not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate an existing element."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate a spin_lock-ed map element."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**,"] # [doc = "\t\t**E2BIG**, **EEXIST**, or **ENOENT**."] # [doc = ""] # [doc = "\t\t**E2BIG**"] # [doc = "\t\t\tThe number of elements in the map reached the"] # [doc = "\t\t\t*max_entries* limit specified at map creation time."] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up and delete an element by key in a specified map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_KEY"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element by key in a specified map and return the key"] # [doc = "\t\tof the next element. Can be used to iterate over all elements"] # [doc = "\t\tin the map."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tThe following cases can be used to iterate over all elements of"] # [doc = "\t\tthe map:"] # [doc = ""] # [doc = "\t\t* If *key* is not found, the operation returns zero and sets"] # [doc = "\t\t the *next_key* pointer to the key of the first element."] # [doc = "\t\t* If *key* is found, the operation returns zero and sets the"] # [doc = "\t\t *next_key* pointer to the key of the next element."] # [doc = "\t\t* If *key* is the last element, returns -1 and *errno* is set"] # [doc = "\t\t to **ENOENT**."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or"] # [doc = "\t\t**EINVAL** on error."] # [doc = ""] # [doc = " BPF_PROG_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load an eBPF program, returning a new file"] # [doc = "\t\tdescriptor associated with the program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_PROG_LOAD** will unload the eBPF program (but see NOTES)."] # [doc = ""] # [doc = "\t\tThe close-on-exec file descriptor flag (see **fcntl**\\ (2)) is"] # [doc = "\t\tautomatically enabled for the new file descriptor."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_PIN"] # [doc = "\tDescription"] # [doc = "\t\tPin an eBPF program or map referred by the specified *bpf_fd*"] # [doc = "\t\tto the provided *pathname* on the filesystem."] # [doc = ""] # [doc = "\t\tThe *pathname* argument must not contain a dot (\".\")."] # [doc = ""] # [doc = "\t\tOn success, *pathname* retains a reference to the eBPF object,"] # [doc = "\t\tpreventing deallocation of the object when the original"] # [doc = "\t\t*bpf_fd* is closed. This allow the eBPF object to live beyond"] # [doc = "\t\t**close**\\ (\\ *bpf_fd*\\ ), and hence the lifetime of the parent"] # [doc = "\t\tprocess."] # [doc = ""] # [doc = "\t\tApplying **unlink**\\ (2) or similar calls to the *pathname*"] # [doc = "\t\tunpins the object from the filesystem, removing the reference."] # [doc = "\t\tIf no other file descriptors or filesystem nodes refer to the"] # [doc = "\t\tsame object, it will be deallocated (see NOTES)."] # [doc = ""] # [doc = "\t\tThe filesystem type for the parent directory of *pathname* must"] # [doc = "\t\tbe **BPF_FS_MAGIC**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_OBJ_GET"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF object pinned to the"] # [doc = "\t\tspecified *pathname*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_PROG_ATTACH"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *attach_type* specifies the eBPF attachment point to"] # [doc = "\t\tattach the program to, and must be one of *bpf_attach_type*"] # [doc = "\t\t(see below)."] # [doc = ""] # [doc = "\t\tThe *attach_bpf_fd* must be a valid file descriptor for a"] # [doc = "\t\tloaded eBPF program of a cgroup, flow dissector, LIRC, sockmap"] # [doc = "\t\tor sock_ops type corresponding to the specified *attach_type*."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_SK_MSG**"] # [doc = ""] # [doc = "\t\t\teBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tDetach the eBPF program associated with the *target_fd* at the"] # [doc = "\t\thook specified by *attach_type*. The program must have been"] # [doc = "\t\tpreviously attached using **BPF_PROG_ATTACH**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_TEST_RUN"] # [doc = "\tDescription"] # [doc = "\t\tRun the eBPF program associated with the *prog_fd* a *repeat*"] # [doc = "\t\tnumber of times against a provided program context *ctx_in* and"] # [doc = "\t\tdata *data_in*, and return the modified program context"] # [doc = "\t\t*ctx_out*, *data_out* (for example, packet data), result of the"] # [doc = "\t\texecution *retval*, and *duration* of the test run."] # [doc = ""] # [doc = "\t\tThe sizes of the buffers provided as input and output"] # [doc = "\t\tparameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must"] # [doc = "\t\tbe provided in the corresponding variables *ctx_size_in*,"] # [doc = "\t\t*ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any"] # [doc = "\t\tof these parameters are not provided (ie set to NULL), the"] # [doc = "\t\tcorresponding size field must be zero."] # [doc = ""] # [doc = "\t\tSome program types have particular requirements:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_SK_LOOKUP**"] # [doc = "\t\t\t*data_in* and *data_out* must be NULL."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT**,"] # [doc = "\t\t**BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE**"] # [doc = ""] # [doc = "\t\t\t*ctx_out*, *data_in* and *data_out* must be NULL."] # [doc = "\t\t\t*repeat* must be zero."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\t**ENOSPC**"] # [doc = "\t\t\tEither *data_size_out* or *ctx_size_out* is too small."] # [doc = "\t\t**ENOTSUPP**"] # [doc = "\t\t\tThis command is not supported by the program type of"] # [doc = "\t\t\tthe program referred to by *prog_fd*."] # [doc = ""] # [doc = " BPF_PROG_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF program currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF program with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF programs"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF map currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF map with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF maps"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_PROG_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF program corresponding to"] # [doc = "\t\t*prog_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_MAP_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF map corresponding to"] # [doc = "\t\t*map_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_OBJ_GET_INFO_BY_FD"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about the eBPF object corresponding to"] # [doc = "\t\t*bpf_fd*."] # [doc = ""] # [doc = "\t\tPopulates up to *info_len* bytes of *info*, which will be in"] # [doc = "\t\tone of the following formats depending on the eBPF object type"] # [doc = "\t\tof *bpf_fd*:"] # [doc = ""] # [doc = "\t\t* **struct bpf_prog_info**"] # [doc = "\t\t* **struct bpf_map_info**"] # [doc = "\t\t* **struct bpf_btf_info**"] # [doc = "\t\t* **struct bpf_link_info**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\tspecified *attach_type* hook."] # [doc = ""] # [doc = "\t\tThe *target_fd* must be a valid file descriptor for a kernel"] # [doc = "\t\tobject which depends on the attach type of *attach_bpf_fd*:"] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_DEVICE**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SKB**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCK_ADDR**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SOCKOPT**,"] # [doc = "\t\t**BPF_PROG_TYPE_CGROUP_SYSCTL**,"] # [doc = "\t\t**BPF_PROG_TYPE_SOCK_OPS**"] # [doc = ""] # [doc = "\t\t\tControl Group v2 hierarchy with the eBPF controller"] # [doc = "\t\t\tenabled. Requires the kernel to be compiled with"] # [doc = "\t\t\t**CONFIG_CGROUP_BPF**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_FLOW_DISSECTOR**"] # [doc = ""] # [doc = "\t\t\tNetwork namespace (eg /proc/self/ns/net)."] # [doc = ""] # [doc = "\t\t**BPF_PROG_TYPE_LIRC_MODE2**"] # [doc = ""] # [doc = "\t\t\tLIRC device path (eg /dev/lircN). Requires the kernel"] # [doc = "\t\t\tto be compiled with **CONFIG_BPF_LIRC_MODE2**."] # [doc = ""] # [doc = "\t\t**BPF_PROG_QUERY** always fetches the number of programs"] # [doc = "\t\tattached and the *attach_flags* which were used to attach those"] # [doc = "\t\tprograms. Additionally, if *prog_ids* is nonzero and the number"] # [doc = "\t\tof attached programs is less than *prog_cnt*, populates"] # [doc = "\t\t*prog_ids* with the eBPF program ids of the programs attached"] # [doc = "\t\tat *target_fd*."] # [doc = ""] # [doc = "\t\tThe following flags may alter the result:"] # [doc = ""] # [doc = "\t\t**BPF_F_QUERY_EFFECTIVE**"] # [doc = "\t\t\tOnly return information regarding programs which are"] # [doc = "\t\t\tcurrently effective at the specified *target_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_RAW_TRACEPOINT_OPEN"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a tracepoint *name* to access kernel"] # [doc = "\t\tinternal arguments of the tracepoint in their raw form."] # [doc = ""] # [doc = "\t\tThe *prog_fd* must be a valid file descriptor associated with"] # [doc = "\t\ta loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**."] # [doc = ""] # [doc = "\t\tNo ABI guarantees are made about the content of tracepoint"] # [doc = "\t\targuments exposed to the corresponding eBPF program."] # [doc = ""] # [doc = "\t\tApplying **close**\\ (2) to the file descriptor returned by"] # [doc = "\t\t**BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_LOAD"] # [doc = "\tDescription"] # [doc = "\t\tVerify and load BPF Type Format (BTF) metadata into the kernel,"] # [doc = "\t\treturning a new file descriptor associated with the metadata."] # [doc = "\t\tBTF is described in more detail at"] # [doc = "\t\thttps://www.kernel.org/doc/html/latest/bpf/btf.html."] # [doc = ""] # [doc = "\t\tThe *btf* parameter must point to valid memory providing"] # [doc = "\t\t*btf_size* bytes of BTF binary metadata."] # [doc = ""] # [doc = "\t\tThe returned file descriptor can be passed to other **bpf**\\ ()"] # [doc = "\t\tsubcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to"] # [doc = "\t\tassociate the BTF with those objects."] # [doc = ""] # [doc = "\t\tSimilar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional"] # [doc = "\t\tparameters to specify a *btf_log_buf*, *btf_log_size* and"] # [doc = "\t\t*btf_log_level* which allow the kernel to return freeform log"] # [doc = "\t\toutput regarding the BTF verification process."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_BTF_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the BPF Type Format (BTF)"] # [doc = "\t\tcorresponding to *btf_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_TASK_FD_QUERY"] # [doc = "\tDescription"] # [doc = "\t\tObtain information about eBPF programs associated with the"] # [doc = "\t\ttarget process identified by *pid* and *fd*."] # [doc = ""] # [doc = "\t\tIf the *pid* and *fd* are associated with a tracepoint, kprobe"] # [doc = "\t\tor uprobe perf event, then the *prog_id* and *fd_type* will"] # [doc = "\t\tbe populated with the eBPF program id and file descriptor type"] # [doc = "\t\tof type **bpf_task_fd_type**. If associated with a kprobe or"] # [doc = "\t\tuprobe, the *probe_offset* and *probe_addr* will also be"] # [doc = "\t\tpopulated. Optionally, if *buf* is provided, then up to"] # [doc = "\t\t*buf_len* bytes of *buf* will be populated with the name of"] # [doc = "\t\tthe tracepoint, kprobe or uprobe."] # [doc = ""] # [doc = "\t\tThe resulting *prog_id* may be introspected in deeper detail"] # [doc = "\t\tusing **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_ELEM"] # [doc = "\tDescription"] # [doc = "\t\tLook up an element with the given *key* in the map referred to"] # [doc = "\t\tby the file descriptor *fd*, and if found, delete the element."] # [doc = ""] # [doc = "\t\tFor **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map"] # [doc = "\t\ttypes, the *flags* argument needs to be set to 0, but for other"] # [doc = "\t\tmap types, it may be specified as:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up and delete the value of a spin-locked map"] # [doc = "\t\t\twithout returning the lock. This must be specified if"] # [doc = "\t\t\tthe elements contain a spinlock."] # [doc = ""] # [doc = "\t\tThe **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types"] # [doc = "\t\timplement this command as a \"pop\" operation, deleting the top"] # [doc = "\t\telement rather than one corresponding to *key*."] # [doc = "\t\tThe *key* and *key_len* parameters should be zeroed when"] # [doc = "\t\tissuing this operation for these map types."] # [doc = ""] # [doc = "\t\tThis command is only valid for the following map types:"] # [doc = "\t\t* **BPF_MAP_TYPE_QUEUE**"] # [doc = "\t\t* **BPF_MAP_TYPE_STACK**"] # [doc = "\t\t* **BPF_MAP_TYPE_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_PERCPU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_HASH**"] # [doc = "\t\t* **BPF_MAP_TYPE_LRU_PERCPU_HASH**"] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_FREEZE"] # [doc = "\tDescription"] # [doc = "\t\tFreeze the permissions of the specified map."] # [doc = ""] # [doc = "\t\tWrite permissions may be frozen by passing zero *flags*."] # [doc = "\t\tUpon success, no future syscall invocations may alter the"] # [doc = "\t\tmap state of *map_fd*. Write operations from eBPF programs"] # [doc = "\t\tare still possible for a frozen map."] # [doc = ""] # [doc = "\t\tNot supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_BTF_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next BPF Type Format (BTF) object currently loaded"] # [doc = "\t\tinto the kernel."] # [doc = ""] # [doc = "\t\tLooks for the BTF object with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other BTF objects"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and fetch multiple elements in a map."] # [doc = ""] # [doc = "\t\tTwo opaque values are used to manage batch operations,"] # [doc = "\t\t*in_batch* and *out_batch*. Initially, *in_batch* must be set"] # [doc = "\t\tto NULL to begin the batched operation. After each subsequent"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant"] # [doc = "\t\t*out_batch* as the *in_batch* for the next operation to"] # [doc = "\t\tcontinue iteration from the current point."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are output parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are copied into the"] # [doc = "\t\tuser buffer, with the keys copied into *keys* and the values"] # [doc = "\t\tcopied into the corresponding indices in *values*."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **ENOSPC** to indicate that *keys* or"] # [doc = "\t\t*values* is too small to dump an entire bucket during"] # [doc = "\t\titeration of a hash-based map type."] # [doc = ""] # [doc = " BPF_MAP_LOOKUP_AND_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tIterate and delete all elements in a map."] # [doc = ""] # [doc = "\t\tThis operation has the same behavior as"] # [doc = "\t\t**BPF_MAP_LOOKUP_BATCH** with two exceptions:"] # [doc = ""] # [doc = "\t\t* Every element that is successfully returned is also deleted"] # [doc = "\t\t from the map. This is at least *count* elements. Note that"] # [doc = "\t\t *count* is both an input and an output parameter."] # [doc = "\t\t* Upon returning with *errno* set to **EFAULT**, up to"] # [doc = "\t\t *count* elements may be deleted without returning the keys"] # [doc = "\t\t and values of the deleted elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_MAP_UPDATE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tUpdate multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* and *values* are input parameters which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tand value size of the map *map_fd*. The *keys* buffer must be"] # [doc = "\t\tof *key_size* * *count*. The *values* buffer must be of"] # [doc = "\t\t*value_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially updated to the"] # [doc = "\t\tvalue in the corresponding index in *values*. The *in_batch*"] # [doc = "\t\tand *out_batch* parameters are ignored and should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument should be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_ANY**"] # [doc = "\t\t\tCreate new elements or update a existing elements."] # [doc = "\t\t**BPF_NOEXIST**"] # [doc = "\t\t\tCreate new elements only if they do not exist."] # [doc = "\t\t**BPF_EXIST**"] # [doc = "\t\t\tUpdate existing elements."] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tUpdate spin_lock-ed map elements. This must be"] # [doc = "\t\t\tspecified if the map value contains a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = "\t\tMay set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or"] # [doc = "\t\t**E2BIG**. **E2BIG** indicates that the number of elements in"] # [doc = "\t\tthe map reached the *max_entries* limit specified at map"] # [doc = "\t\tcreation time."] # [doc = ""] # [doc = "\t\tMay set *errno* to one of the following error codes under"] # [doc = "\t\tspecific circumstances:"] # [doc = ""] # [doc = "\t\t**EEXIST**"] # [doc = "\t\t\tIf *flags* specifies **BPF_NOEXIST** and the element"] # [doc = "\t\t\twith *key* already exists in the map."] # [doc = "\t\t**ENOENT**"] # [doc = "\t\t\tIf *flags* specifies **BPF_EXIST** and the element with"] # [doc = "\t\t\t*key* does not exist in the map."] # [doc = ""] # [doc = " BPF_MAP_DELETE_BATCH"] # [doc = "\tDescription"] # [doc = "\t\tDelete multiple elements in a map by *key*."] # [doc = ""] # [doc = "\t\tThe *keys* parameter is an input parameter which must point"] # [doc = "\t\tto memory large enough to hold *count* items based on the key"] # [doc = "\t\tsize of the map *map_fd*, that is, *key_size* * *count*."] # [doc = ""] # [doc = "\t\tEach element specified in *keys* is sequentially deleted. The"] # [doc = "\t\t*in_batch*, *out_batch*, and *values* parameters are ignored"] # [doc = "\t\tand should be zeroed."] # [doc = ""] # [doc = "\t\tThe *elem_flags* argument may be specified as one of the"] # [doc = "\t\tfollowing:"] # [doc = ""] # [doc = "\t\t**BPF_F_LOCK**"] # [doc = "\t\t\tLook up the value of a spin-locked map without"] # [doc = "\t\t\treturning the lock. This must be specified if the"] # [doc = "\t\t\telements contain a spinlock."] # [doc = ""] # [doc = "\t\tOn success, *count* elements from the map are updated."] # [doc = ""] # [doc = "\t\tIf an error is returned and *errno* is not **EFAULT**, *count*"] # [doc = "\t\tis set to the number of successfully processed elements. If"] # [doc = "\t\t*errno* is **EFAULT**, up to *count* elements may be been"] # [doc = "\t\tdeleted."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tAttach an eBPF program to a *target_fd* at the specified"] # [doc = "\t\t*attach_type* hook and return a file descriptor handle for"] # [doc = "\t\tmanaging the link."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_UPDATE"] # [doc = "\tDescription"] # [doc = "\t\tUpdate the eBPF program in the specified *link_fd* to"] # [doc = "\t\t*new_prog_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_LINK_GET_FD_BY_ID"] # [doc = "\tDescription"] # [doc = "\t\tOpen a file descriptor for the eBPF Link corresponding to"] # [doc = "\t\t*link_id*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_GET_NEXT_ID"] # [doc = "\tDescription"] # [doc = "\t\tFetch the next eBPF link currently loaded into the kernel."] # [doc = ""] # [doc = "\t\tLooks for the eBPF link with an id greater than *start_id*"] # [doc = "\t\tand updates *next_id* on success. If no other eBPF links"] # [doc = "\t\tremain with ids higher than *start_id*, returns -1 and sets"] # [doc = "\t\t*errno* to **ENOENT**."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, or when no id remains, -1"] # [doc = "\t\tis returned and *errno* is set appropriately."] # [doc = ""] # [doc = " BPF_ENABLE_STATS"] # [doc = "\tDescription"] # [doc = "\t\tEnable eBPF runtime statistics gathering."] # [doc = ""] # [doc = "\t\tRuntime statistics gathering for the eBPF runtime is disabled"] # [doc = "\t\tby default to minimize the corresponding performance overhead."] # [doc = "\t\tThis command enables statistics globally."] # [doc = ""] # [doc = "\t\tMultiple programs may independently enable statistics."] # [doc = "\t\tAfter gathering the desired statistics, eBPF runtime statistics"] # [doc = "\t\tmay be disabled again by calling **close**\\ (2) for the file"] # [doc = "\t\tdescriptor returned by this function. Statistics will only be"] # [doc = "\t\tdisabled system-wide when all outstanding file descriptors"] # [doc = "\t\treturned by prior calls for this subcommand are closed."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_ITER_CREATE"] # [doc = "\tDescription"] # [doc = "\t\tCreate an iterator on top of the specified *link_fd* (as"] # [doc = "\t\tpreviously created using **BPF_LINK_CREATE**) and return a"] # [doc = "\t\tfile descriptor that can be used to trigger the iteration."] # [doc = ""] # [doc = "\t\tIf the resulting file descriptor is pinned to the filesystem"] # [doc = "\t\tusing **BPF_OBJ_PIN**, then subsequent **read**\\ (2) syscalls"] # [doc = "\t\tfor that path will trigger the iterator to read kernel state"] # [doc = "\t\tusing the eBPF program attached to *link_fd*."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tA new file descriptor (a nonnegative integer), or -1 if an"] # [doc = "\t\terror occurred (in which case, *errno* is set appropriately)."] # [doc = ""] # [doc = " BPF_LINK_DETACH"] # [doc = "\tDescription"] # [doc = "\t\tForcefully detach the specified *link_fd* from its"] # [doc = "\t\tcorresponding attachment point."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " BPF_PROG_BIND_MAP"] # [doc = "\tDescription"] # [doc = "\t\tBind a map to the lifetime of an eBPF program."] # [doc = ""] # [doc = "\t\tThe map identified by *map_fd* is bound to the program"] # [doc = "\t\tidentified by *prog_fd* and only released when *prog_fd* is"] # [doc = "\t\treleased. This may be used in cases where metadata should be"] # [doc = "\t\tassociated with a program which otherwise does not contain any"] # [doc = "\t\treferences to the map (for example, embedded in the eBPF"] # [doc = "\t\tprogram instructions)."] # [doc = ""] # [doc = "\tReturn"] # [doc = "\t\tReturns zero on success. On error, -1 is returned and *errno*"] # [doc = "\t\tis set appropriately."] # [doc = ""] # [doc = " NOTES"] # [doc = "\teBPF objects (maps and programs) can be shared between processes."] # [doc = ""] # [doc = "\t* After **fork**\\ (2), the child inherits file descriptors"] # [doc = "\t referring to the same eBPF objects."] # [doc = "\t* File descriptors referring to eBPF objects can be transferred over"] # [doc = "\t **unix**\\ (7) domain sockets."] # [doc = "\t* File descriptors referring to eBPF objects can be duplicated in the"] # [doc = "\t usual way, using **dup**\\ (2) and similar calls."] # [doc = "\t* File descriptors referring to eBPF objects can be pinned to the"] # [doc = "\t filesystem using the **BPF_OBJ_PIN** command of **bpf**\\ (2)."] # [doc = ""] # [doc = "\tAn eBPF object is deallocated only after all file descriptors referring"] # [doc = "\tto the object have been closed and no references remain pinned to the"] # [doc = "\tfilesystem or attached (for example, bound to a program or device)."] pu... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use an automatic link instead: `` [INFO] [stdout] | [INFO] [stdout] = note: bare URLs are not automatically turned into clickable links [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: 4 warnings emitted [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 23.32s [INFO] running `Command { std: "docker" "inspect" "e70b9355c004bf605832fe62485091597276210f6ef78f5b19bfc61c64f1ae6f", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "e70b9355c004bf605832fe62485091597276210f6ef78f5b19bfc61c64f1ae6f", kill_on_drop: false }` [INFO] [stdout] e70b9355c004bf605832fe62485091597276210f6ef78f5b19bfc61c64f1ae6f