From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 53B8FC43381 for ; Tue, 12 Mar 2019 08:20:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EC9B52147C for ; Tue, 12 Mar 2019 08:20:16 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NvKxeXd2" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727523AbfCLIUQ (ORCPT ); Tue, 12 Mar 2019 04:20:16 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:42573 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727456AbfCLIUP (ORCPT ); Tue, 12 Mar 2019 04:20:15 -0400 Received: by mail-lj1-f196.google.com with SMTP id l16so1449341ljc.9 for ; Tue, 12 Mar 2019 01:20:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VlCSZG0jNtzAMvEBQgepJbmq1P42XHWrKxJHVVUyCPA=; b=NvKxeXd2Tr2WSLWwMkm51aN3KaIj9f7qt/O1f1583Ib3HbWAmJV0hKf0jATyY7HZsg 9OZ9UWlE3AOxBjLc7HtKOAfuZuC/83tQLCP2mPLZ5SQXpMbyfyIO8cOanOt6sYjmyZOJ KYxFIAqOFtRBHbvVAlyG0Q4x4iS+Ikhcp7lgyZNU5ssT5kKJzqWQSOUjjIB+KZIzSUGB ktX+VKb+I4EhFbtqMYzy2K4BcAcNZB9sSdTbDeB5DHp99EBIETMRvDoBfj3hWhUtOyzZ OGOy0blqkPDnc26BjBqMUxCyyPJxN32pELLladwRoCl2jhEldl8d2fq4s6uTpg4lOCQp 2B1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VlCSZG0jNtzAMvEBQgepJbmq1P42XHWrKxJHVVUyCPA=; b=qkKY0q9aWKg8Qh4z7jyalKxFayqjupxG+hO08+F+hK6Wf+nqyndDmEIZgjXzWiw8zF dp/WTifaKrQEziKODfOBegsM7iwhzEzysyT4gsJN1Lx9OEqf/354ooMZcyV6fZKaEG0c eewEXwE90FHz2yldRSTLvB9P/aEimw2eh4rR7aiK0yea6rUiE/xADxz1Xe54uI6YBfhQ xqChseXBvQlW2tn3S+vFP8QRrQnN8aeOnN9UNKFkywH1MtoCVKKpwKLZwWQOrdpID9Bp YTvhbDYjMhjg+88bPNZSX7+xEKHyVHPzBq42OVK+B+CvH340Lx6bb7WGN6iwdv3GGxPJ SadA== X-Gm-Message-State: APjAAAW9TqMiBDm4I4dx9ubETS2wtb5Z2sRPcEAcuxYEjgYeWG+o2hzn RaibFWHO45JLQ8skGgqocC0= X-Google-Smtp-Source: APXvYqwXSw7kD+/dBqzAVg3vAFmpP4ZjVrpp5vLlVjxkmMSDgokMT7T8IcsXsaZUcgtYQ+kuFYHgZw== X-Received: by 2002:a2e:88d1:: with SMTP id a17mr19006074ljk.169.1552378808698; Tue, 12 Mar 2019 01:20:08 -0700 (PDT) Received: from a2k-HP-ProDesk-600-G2-SFF.kyiv.epam.com (ll-22.209.223.85.sovam.net.ua. [85.223.209.22]) by smtp.gmail.com with ESMTPSA id j1sm55539lfk.26.2019.03.12.01.20.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 Mar 2019 01:20:08 -0700 (PDT) From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com, hverkuil@xs4all.nl Cc: Oleksandr Andrushchenko Subject: [Xen-devel][PATCH v5 1/1] cameraif: add ABI for para-virtual camera Date: Tue, 12 Mar 2019 10:20:00 +0200 Message-Id: <20190312082000.32181-2-andr2000@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190312082000.32181-1-andr2000@gmail.com> References: <20190312082000.32181-1-andr2000@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org From: Oleksandr Andrushchenko This is the ABI for the two halves of a para-virtualized camera driver which extends Xen's reach multimedia capabilities even farther enabling it for video conferencing, In-Vehicle Infotainment, high definition maps etc. The initial goal is to support most needed functionality with the final idea to make it possible to extend the protocol if need be: 1. Provide means for base virtual device configuration: - pixel formats - resolutions - frame rates 2. Support basic camera controls: - contrast - brightness - hue - saturation 3. Support streaming control Signed-off-by: Oleksandr Andrushchenko --- xen/include/public/io/cameraif.h | 1370 ++++++++++++++++++++++++++++++ 1 file changed, 1370 insertions(+) create mode 100644 xen/include/public/io/cameraif.h diff --git a/xen/include/public/io/cameraif.h b/xen/include/public/io/cameraif.h new file mode 100644 index 000000000000..1ae4c51ea758 --- /dev/null +++ b/xen/include/public/io/cameraif.h @@ -0,0 +1,1370 @@ +/****************************************************************************** + * cameraif.h + * + * Unified camera device I/O interface for Xen guest OSes. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (C) 2018-2019 EPAM Systems Inc. + * + * Author: Oleksandr Andrushchenko + */ + +#ifndef __XEN_PUBLIC_IO_CAMERAIF_H__ +#define __XEN_PUBLIC_IO_CAMERAIF_H__ + +#include "ring.h" +#include "../grant_table.h" + +/* + ****************************************************************************** + * Protocol version + ****************************************************************************** + */ +#define XENCAMERA_PROTOCOL_VERSION "1" + +/* + ****************************************************************************** + * Feature and Parameter Negotiation + ****************************************************************************** + * + * Front->back notifications: when enqueuing a new request, sending a + * notification can be made conditional on xencamera_req (i.e., the generic + * hold-off mechanism provided by the ring macros). Backends must set + * xencamera_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). + * + * Back->front notifications: when enqueuing a new response, sending a + * notification can be made conditional on xencamera_resp (i.e., the generic + * hold-off mechanism provided by the ring macros). Frontends must set + * xencamera_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). + * + * The two halves of a para-virtual camera driver utilize nodes within + * XenStore to communicate capabilities and to negotiate operating parameters. + * This section enumerates these nodes which reside in the respective front and + * backend portions of XenStore, following the XenBus convention. + * + * All data in XenStore is stored as strings. Nodes specifying numeric + * values are encoded in decimal. Integer value ranges listed below are + * expressed as fixed sized integer types capable of storing the conversion + * of a properly formatted node string, without loss of information. + * + ****************************************************************************** + * Example configuration + ****************************************************************************** + * + * This is an example of backend and frontend configuration: + * + *--------------------------------- Backend ----------------------------------- + * + * /local/domain/0/backend/vcamera/1/0/frontend-id = "1" + * /local/domain/0/backend/vcamera/1/0/frontend = "/local/domain/1/device/vcamera/0" + * /local/domain/0/backend/vcamera/1/0/state = "4" + * /local/domain/0/backend/vcamera/1/0/versions = "1,2" + * + *--------------------------------- Frontend ---------------------------------- + * + * /local/domain/1/device/vcamera/0/backend-id = "0" + * /local/domain/1/device/vcamera/0/backend = "/local/domain/0/backend/vcamera/1" + * /local/domain/1/device/vcamera/0/state = "4" + * /local/domain/1/device/vcamera/0/version = "1" + * /local/domain/1/device/vcamera/0/be-alloc = "1" + * + *---------------------------- Device 0 configuration ------------------------- + * + * /local/domain/1/device/vcamera/0/max-buffers = "3" + * /local/domain/1/device/vcamera/0/controls = "contrast,hue" + * /local/domain/1/device/vcamera/0/formats/YUYV/640x480/frame-rates = "30/1,15/1" + * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080/frame-rates = "15/2" + * /local/domain/1/device/vcamera/0/formats/BGRA/640x480/frame-rates = "15/1,15/2" + * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720/frame-rates = "15/2" + * /local/domain/1/device/vcamera/0/unique-id = "0" + * /local/domain/1/device/vcamera/0/req-ring-ref = "2832" + * /local/domain/1/device/vcamera/0/req-event-channel = "15" + * /local/domain/1/device/vcamera/0/evt-ring-ref = "387" + * /local/domain/1/device/vcamera/0/evt-event-channel = "16" + * + *---------------------------- Device 1 configuration ------------------------- + * + * /local/domain/1/device/vcamera/1/max-buffers = "8" + * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue" + * /local/domain/1/device/vcamera/1/formats/YUYV/640x480/frame-rates = "30/1,15/2" + * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080/frame-rates = "15/2" + * /local/domain/1/device/vcamera/1/unique-id = "1" + * /local/domain/1/device/vcamera/1/req-ring-ref = "2833" + * /local/domain/1/device/vcamera/1/req-event-channel = "17" + * /local/domain/1/device/vcamera/1/evt-ring-ref = "388" + * /local/domain/1/device/vcamera/1/evt-event-channel = "18" + * + ****************************************************************************** + * Backend XenBus Nodes + ****************************************************************************** + * + *----------------------------- Protocol version ------------------------------ + * + * versions + * Values: + * + * List of XENCAMERA_LIST_SEPARATOR separated protocol versions supported + * by the backend. For example "1,2,3". + * + ****************************************************************************** + * Frontend XenBus Nodes + ****************************************************************************** + * + *-------------------------------- Addressing --------------------------------- + * + * dom-id + * Values: + * + * Domain identifier. + * + * dev-id + * Values: + * + * Device identifier. + * + * /local/domain//device/vcamera//... + * + *----------------------------- Protocol version ------------------------------ + * + * version + * Values: + * + * Protocol version, chosen among the ones supported by the backend. + * + *------------------------- Backend buffer allocation ------------------------- + * + * be-alloc + * Values: "0", "1" + * + * If value is set to "1", then backend will be the buffer + * provider/allocator for this domain during XENCAMERA_OP_BUF_CREATE + * operation. + * If value is not "1" or omitted frontend must allocate buffers itself. + * + *------------------------------- Camera settings ----------------------------- + * + * unique-id + * Values: + * + * After device instance initialization each camera is assigned a + * unique ID, so it can be identified by the backend by this ID. + * This can be UUID or such. + * + * max-buffers + * Values: + * + * Maximum number of camera buffers this frontend may use. + * + * controls + * Values: + * + * List of supported camera controls separated by XENCAMERA_LIST_SEPARATOR. + * Camera controls are expressed as a list of string values w/o any + * ordering requirement. + * + * formats + * Values: + * + * Formats are organized as a set of directories one per each + * supported pixel format. The name of the directory is the + * corresponding FOURCC string label. The next level of + * the directory under represents supported resolutions. + * If the format represents a big-endian variant of a little + * endian format, then the "-BE" suffix must be added. E.g. 'AR15' vs + * 'AR15-BE'. + * If FOURCC string label has spaces then those are only allowed to + * be at the end of the label and must be trimmed, for example + * 'Y16' and 'Y16-BE' will be trimmed. + * + * resolution + * Values: x + * + * Resolutions are organized as a set of directories one per each + * supported resolution under corresponding directory. + * The name of the directory is the supported width and height + * of the camera resolution in pixels. + * + * frame-rates + * Values: / + * + * List of XENCAMERA_FRAME_RATE_SEPARATOR separated supported frame rates + * of the camera expressed as numerator and denominator of the + * corresponding frame rate. + * + *------------------- Camera Request Transport Parameters --------------------- + * + * This communication path is used to deliver requests from frontend to backend + * and get the corresponding responses from backend to frontend, + * set up per virtual camera device. + * + * req-event-channel + * Values: + * + * The identifier of the Xen camera's control event channel + * used to signal activity in the ring buffer. + * + * req-ring-ref + * Values: + * + * The Xen grant reference granting permission for the backend to map + * a sole page of camera's control ring buffer. + * + *-------------------- Camera Event Transport Parameters ---------------------- + * + * This communication path is used to deliver asynchronous events from backend + * to frontend, set up per virtual camera device. + * + * evt-event-channel + * Values: + * + * The identifier of the Xen camera's event channel + * used to signal activity in the ring buffer. + * + * evt-ring-ref + * Values: + * + * The Xen grant reference granting permission for the backend to map + * a sole page of camera's event ring buffer. + */ + +/* + ****************************************************************************** + * STATE DIAGRAMS + ****************************************************************************** + * + * Tool stack creates front and back state nodes with initial state + * XenbusStateInitialising. + * Tool stack creates and sets up frontend camera configuration + * nodes per domain. + * + *-------------------------------- Normal flow -------------------------------- + * + * Front Back + * ================================= ===================================== + * XenbusStateInitialising XenbusStateInitialising + * o Query backend device identification + * data. + * o Open and validate backend device. + * | + * | + * V + * XenbusStateInitWait + * + * o Query frontend configuration + * o Allocate and initialize + * event channels per configured + * camera. + * o Publish transport parameters + * that will be in effect during + * this connection. + * | + * | + * V + * XenbusStateInitialised + * + * o Query frontend transport parameters. + * o Connect to the event channels. + * | + * | + * V + * XenbusStateConnected + * + * o Create and initialize OS + * virtual camera as per + * configuration. + * | + * | + * V + * XenbusStateConnected + * + * XenbusStateUnknown + * XenbusStateClosed + * XenbusStateClosing + * o Remove virtual camera device + * o Remove event channels + * | + * | + * V + * XenbusStateClosed + * + *------------------------------- Recovery flow ------------------------------- + * + * In case of frontend unrecoverable errors backend handles that as + * if frontend goes into the XenbusStateClosed state. + * + * In case of backend unrecoverable errors frontend tries removing + * the virtualized device. If this is possible at the moment of error, + * then frontend goes into the XenbusStateInitialising state and is ready for + * new connection with backend. If the virtualized device is still in use and + * cannot be removed, then frontend goes into the XenbusStateReconfiguring state + * until either the virtualized device is removed or backend initiates a new + * connection. On the virtualized device removal frontend goes into the + * XenbusStateInitialising state. + * + * Note on XenbusStateReconfiguring state of the frontend: if backend has + * unrecoverable errors then frontend cannot send requests to the backend + * and thus cannot provide functionality of the virtualized device anymore. + * After backend is back to normal the virtualized device may still hold some + * state: configuration in use, allocated buffers, client application state etc. + * In most cases, this will require frontend to implement complex recovery + * reconnect logic. Instead, by going into XenbusStateReconfiguring state, + * frontend will make sure no new clients of the virtualized device are + * accepted, allow existing client(s) to exit gracefully by signaling error + * state etc. + * Once all the clients are gone frontend can reinitialize the virtualized + * device and get into XenbusStateInitialising state again signaling the + * backend that a new connection can be made. + * + * There are multiple conditions possible under which frontend will go from + * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS + * specific. For example: + * 1. The underlying OS framework may provide callbacks to signal that the last + * client of the virtualized device has gone and the device can be removed + * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) + * to periodically check if this is the right time to re-try removal of + * the virtualized device. + * 3. By any other means. + * + ****************************************************************************** + * REQUEST CODES + ****************************************************************************** + */ +#define XENCAMERA_OP_CONFIG_SET 0x00 +#define XENCAMERA_OP_CONFIG_GET 0x01 +#define XENCAMERA_OP_CONFIG_VALIDATE 0x02 +#define XENCAMERA_OP_FRAME_RATE_SET 0x03 +#define XENCAMERA_OP_BUF_GET_LAYOUT 0x04 +#define XENCAMERA_OP_BUF_REQUEST 0x05 +#define XENCAMERA_OP_BUF_CREATE 0x06 +#define XENCAMERA_OP_BUF_DESTROY 0x07 +#define XENCAMERA_OP_BUF_QUEUE 0x08 +#define XENCAMERA_OP_BUF_DEQUEUE 0x09 +#define XENCAMERA_OP_CTRL_ENUM 0x0a +#define XENCAMERA_OP_CTRL_SET 0x0b +#define XENCAMERA_OP_CTRL_GET 0x0c +#define XENCAMERA_OP_STREAM_START 0x0d +#define XENCAMERA_OP_STREAM_STOP 0x0e + +#define XENCAMERA_CTRL_BRIGHTNESS 0 +#define XENCAMERA_CTRL_CONTRAST 1 +#define XENCAMERA_CTRL_SATURATION 2 +#define XENCAMERA_CTRL_HUE 3 + +/* Number of supported controls. */ +#define XENCAMERA_MAX_CTRL 4 + +/* Control is read-only. */ +#define XENCAMERA_CTRL_FLG_RO (1 << 0) +/* Control is write-only. */ +#define XENCAMERA_CTRL_FLG_WO (1 << 1) +/* Control's value is volatile. */ +#define XENCAMERA_CTRL_FLG_VOLATILE (1 << 2) + +/* Supported color spaces. */ +#define XENCAMERA_COLORSPACE_DEFAULT 0 +#define XENCAMERA_COLORSPACE_SMPTE170M 1 +#define XENCAMERA_COLORSPACE_REC709 2 +#define XENCAMERA_COLORSPACE_SRGB 3 +#define XENCAMERA_COLORSPACE_OPRGB 4 +#define XENCAMERA_COLORSPACE_BT2020 5 +#define XENCAMERA_COLORSPACE_DCI_P3 6 + +/* Color space transfer function. */ +#define XENCAMERA_XFER_FUNC_DEFAULT 0 +#define XENCAMERA_XFER_FUNC_709 1 +#define XENCAMERA_XFER_FUNC_SRGB 2 +#define XENCAMERA_XFER_FUNC_OPRGB 3 +#define XENCAMERA_XFER_FUNC_NONE 4 +#define XENCAMERA_XFER_FUNC_DCI_P3 5 +#define XENCAMERA_XFER_FUNC_SMPTE2084 6 + +/* Color space Y’CbCr encoding. */ +#define XENCAMERA_YCBCR_ENC_IGNORE 0 +#define XENCAMERA_YCBCR_ENC_601 1 +#define XENCAMERA_YCBCR_ENC_709 2 +#define XENCAMERA_YCBCR_ENC_XV601 3 +#define XENCAMERA_YCBCR_ENC_XV709 4 +#define XENCAMERA_YCBCR_ENC_BT2020 5 +#define XENCAMERA_YCBCR_ENC_BT2020_CONST_LUM 6 + +/* Quantization range. */ +#define XENCAMERA_QUANTIZATION_DEFAULT 0 +#define XENCAMERA_QUANTIZATION_FULL_RANGE 1 +#define XENCAMERA_QUANTIZATION_LIM_RANGE 2 + +/* + ****************************************************************************** + * EVENT CODES + ****************************************************************************** + */ +#define XENCAMERA_EVT_FRAME_AVAIL 0x00 +#define XENCAMERA_EVT_CTRL_CHANGE 0x01 + +/* + ****************************************************************************** + * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS + ****************************************************************************** + */ +#define XENCAMERA_DRIVER_NAME "vcamera" + +#define XENCAMERA_LIST_SEPARATOR "," +#define XENCAMERA_RESOLUTION_SEPARATOR "x" +#define XENCAMERA_FRACTION_SEPARATOR "/" + +#define XENCAMERA_FIELD_BE_VERSIONS "versions" +#define XENCAMERA_FIELD_FE_VERSION "version" +#define XENCAMERA_FIELD_REQ_RING_REF "req-ring-ref" +#define XENCAMERA_FIELD_REQ_CHANNEL "req-event-channel" +#define XENCAMERA_FIELD_EVT_RING_REF "evt-ring-ref" +#define XENCAMERA_FIELD_EVT_CHANNEL "evt-event-channel" +#define XENCAMERA_FIELD_MAX_BUFFERS "max-buffers" +#define XENCAMERA_FIELD_CONTROLS "controls" +#define XENCAMERA_FIELD_FORMATS "formats" +#define XENCAMERA_FIELD_FRAME_RATES "frame-rates" +#define XENCAMERA_FIELD_BE_ALLOC "be-alloc" +#define XENCAMERA_FIELD_UNIQUE_ID "unique-id" + +#define XENCAMERA_CTRL_BRIGHTNESS_STR "brightness" +#define XENCAMERA_CTRL_CONTRAST_STR "contrast" +#define XENCAMERA_CTRL_SATURATION_STR "saturation" +#define XENCAMERA_CTRL_HUE_STR "hue" + +#define XENCAMERA_FOURCC_BIGENDIAN_STR "-BE" + +/* Maximum number of buffer planes supported. */ +#define XENCAMERA_MAX_PLANE 4 + +/* + ****************************************************************************** + * STATUS RETURN CODES + ****************************************************************************** + * + * Status return code is zero on success and -XEN_EXX on failure. + * + ****************************************************************************** + * Assumptions + ****************************************************************************** + * + * - usage of grant reference 0 as invalid grant reference: + * grant reference 0 is valid, but never exposed to a PV driver, + * because of the fact it is already in use/reserved by the PV console. + * - all references in this document to page sizes must be treated + * as pages of size XEN_PAGE_SIZE unless otherwise noted. + * - all FOURCC mappings used for configuration and messaging are + * Linux V4L2 ones: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/videodev2.h + * with the following exceptions: + * - characters are allowed in [0x20; 0x7f] range + * - when used for XenStore configuration entries the following + * are not allowed: + * - '/', '\', ' ' (space), '<', '>', ':', '"', '|', '?', '*' + * - if trailing spaces are part of the FOURCC code then those must be + * trimmed + * + * + ****************************************************************************** + * Description of the protocol between frontend and backend driver + ****************************************************************************** + * + * The two halves of a Para-virtual camera driver communicate with + * each other using shared pages and event channels. + * Shared page contains a ring with request/response packets. + * + * All reserved fields in the structures below must be 0. + * + * For all request/response/event packets: + * - frame rate parameter is represented as a pair of 4 octet long + * numerator and denominator: + * - frame_rate_numer - uint32_t, numerator of the frame rate + * - frame_rate_denom - uint32_t, denominator of the frame rate + * The corresponding frame rate (Hz) is calculated as: + * frame_rate = frame_rate_numer / frame_rate_denom + * - buffer index is a zero based index of the buffer. Must be less than + * the value of XENCAMERA_OP_CONFIG_SET.num_bufs response: + * - index - uint8_t, index of the buffer. + * + * + *---------------------------------- Requests --------------------------------- + * + * All request packets have the same length (64 octets). + * All request packets have common header: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | operation | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * id - uint16_t, private guest value, echoed in response. + * operation - uint8_t, operation code, XENCAMERA_OP_XXX. + * + * + * Request to set/validate the configuration - request to set the + * configuration/mode of the camera (XENCAMERA_OP_CONFIG_SET) or to + * check if the configuration is valid and can be used + * (XENCAMERA_OP_CONFIG_VALIDATE): + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CONFIG_XXX | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | pixel format | 12 + * +----------------+----------------+----------------+----------------+ + * | width | 16 + * +----------------+----------------+----------------+----------------+ + * | height | 20 + * +----------------+----------------+----------------+----------------+ + * | reserved | 24 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * pixel_format - uint32_t, pixel format to be used, FOURCC code. + * width - uint32_t, width in pixels. + * height - uint32_t, height in pixels. + * + * See response format for this request. + * + * Notes: + * - the only difference between XENCAMERA_OP_CONFIG_VALIDATE and + * XENCAMERA_OP_CONFIG_SET is that the former doesn't actually change + * camera configuration, but queries if the configuration is valid. + * This can be used while stream is active and/or buffers allocated. + * - frontend must check the corresponding response in order to see + * if the values reported back by the backend do match the desired ones + * and can be accepted. + * - frontend may send multiple XENCAMERA_OP_CONFIG_SET requests before + * sending XENCAMERA_OP_STREAM_START request to update or tune the + * final stream configuration. + * - configuration cannot be changed during active streaming, e.g. + * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP + * requests. + */ +struct xencamera_config_req { + uint32_t pixel_format; + uint32_t width; + uint32_t height; +}; + +/* + * Request current configuration of the camera: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CONFIG_GET | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * + * Request to set the frame rate of the stream: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _FRAME_RATE_SET| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_numer | 12 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_denom | 16 + * +----------------+----------------+----------------+----------------+ + * | reserved | 20 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * frame_rate_numer - uint32_t, numerator of the frame rate. + * frame_rate_denom - uint32_t, denominator of the frame rate. + * + * Notes: + * - to query the current (actual) frame rate use XENCAMERA_OP_CONFIG_GET + * request. + * - this request can be used with camera buffers allocated, but stream + * stopped, e.g. frontend is allowed to stop the stream with + * XENCAMERA_OP_STREAM_STOP, hold the buffers allocated (e.g. keep the + * configuration set with XENCAMERA_OP_CONFIG_SET), change the + * frame rate of the stream and (re)start the stream again with + * XENCAMERA_OP_STREAM_START. + * - frame rate cannot be changed during active streaming, e.g. + * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP + * commands. + */ +struct xencamera_frame_rate_req { + uint32_t frame_rate_numer; + uint32_t frame_rate_denom; +}; + +/* + * Request camera buffer's layout: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _BUF_GET_LAYOUT| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * + * Request number of buffers to be used: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_REQUEST| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | num_bufs | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * num_bufs - uint8_t, desired number of buffers to be used. + * + * If num_bufs is not zero then the backend validates the requested number of + * buffers and responds with the number of buffers allowed for this frontend. + * Frontend is responsible for checking the corresponding response in order to + * see if the values reported back by the backend do match the desired ones + * and can be accepted. + * Frontend is allowed to send multiple XENCAMERA_OP_BUF_REQUEST requests + * before sending XENCAMERA_OP_STREAM_START request to update or tune the + * final configuration. + * Frontend is not allowed to change the number of buffers and/or camera + * configuration after the streaming has started. + * + * If num_bufs is 0 and streaming has not started yet, then the backend will + * free all previously allocated buffers (if any). + * Trying to call this if streaming is in progress will result in an error. + * + * If camera reconfiguration is required then the streaming must be stopped + * and this request must be sent with num_bufs set to zero and finally + * buffers destroyed. + * + * Please note, that the number of buffers in this request must not exceed + * the value configured in XenStore.max-buffers. + * + * See response format for this request. + */ +struct xencamera_buf_request { + uint8_t num_bufs; +}; + +/* + * Request camera buffer creation: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_CREATE | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[0] | 16 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[1] | 20 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[2] | 24 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[3] | 28 + * +----------------+----------------+----------------+----------------+ + * | gref_directory | 32 + * +----------------+----------------+----------------+----------------+ + * | reserved | 36 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * An attempt to create multiple buffers with the same index is an error. + * index can be re-used after destroying the corresponding camera buffer. + * + * index - uint8_t, index of the buffer to be created in the range + * from 0 to the num_bufs field returned in response for + * XENCAMERA_OP_BUF_REQUEST request + * plane_offset - array of uint32_t, offset of the corresponding plane + * in octets from the buffer start. Number of offsets returned is + * equal to the value returned in XENCAMERA_OP_BUF_GET_LAYOUT.num_planes. + * gref_directory - grant_ref_t, a reference to the first shared page + * describing shared buffer references. The size of the buffer is equal to + * XENCAMERA_OP_BUF_GET_LAYOUT.size response. At least one page exists. If + * shared buffer size exceeds what can be addressed by this single page, + * then reference to the next shared page must be supplied (see + * gref_dir_next_page below). + * + * If XENCAMERA_FIELD_BE_ALLOC configuration entry is set, then backend will + * allocate the buffer with the parameters provided in this request and page + * directory is handled as follows: + * Frontend on request: + * - allocates pages for the directory (gref_directory, + * gref_dir_next_page(s) + * - grants permissions for the pages of the directory to the backend + * - sets gref_dir_next_page fields + * Backend on response: + * - grants permissions for the pages of the buffer allocated to + * the frontend + * - fills in page directory with grant references + * (gref[] in struct xencamera_page_directory) + */ +struct xencamera_buf_create_req { + uint8_t index; + uint8_t reserved[3]; + uint32_t plane_offset[XENCAMERA_MAX_PLANE]; + grant_ref_t gref_directory; +}; + +/* + * Shared page for XENCAMERA_OP_BUF_CREATE buffer descriptor (gref_directory in + * the request) employs a list of pages, describing all pages of the shared + * data buffer: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | gref_dir_next_page | 4 + * +----------------+----------------+----------------+----------------+ + * | gref[0] | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | gref[i] | i*4+8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | gref[N - 1] | N*4+8 + * +----------------+----------------+----------------+----------------+ + * + * gref_dir_next_page - grant_ref_t, reference to the next page describing + * page directory. Must be 0 if there are no more pages in the list. + * gref[i] - grant_ref_t, reference to a shared page of the buffer + * allocated at XENCAMERA_OP_BUF_CREATE. + * + * Number of grant_ref_t entries in the whole page directory is not + * passed, but instead can be calculated as: + * num_grefs_total = (XENCAMERA_OP_BUF_REQUEST.size + XEN_PAGE_SIZE - 1) / + * XEN_PAGE_SIZE + */ +struct xencamera_page_directory { + grant_ref_t gref_dir_next_page; + grant_ref_t gref[1]; /* Variable length */ +}; + +/* + * Request buffer destruction - destroy a previously allocated camera buffer: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_DESTROY| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * index - uint8_t, index of the buffer to be destroyed. + * + * + * Request queueing of the buffer for backend use: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_QUEUE | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * Notes: + * - frontends must not access the buffer content after this request until + * response to XENCAMERA_OP_BUF_DEQUEUE has been received. + * - buffers must be queued to the backend before destroying them with + * XENCAMERA_OP_BUF_DESTROY. + * + * index - uint8_t, index of the buffer to be queued. + * + * + * Request dequeueing of the buffer for frontend use: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_BUF_DEQUEUE | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * Notes: + * - frontend is allowed to access the buffer content after the corresponding + * response to this request. + * + * index - uint8_t, index of the buffer to be queued. + * + * + * Request camera control details: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CTRL_ENUM | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * index - uint8_t, index of the control to be queried. + */ +struct xencamera_index { + uint8_t index; +}; + +/* + * Request camera control change: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_SET_CTRL | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * | value low 32-bit | 20 + * +----------------+----------------+----------------+----------------+ + * | value high 32-bit | 24 + * +----------------+----------------+----------------+----------------+ + * | reserved | 28 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * value - int64_t, new value of the control. + */ +struct xencamera_ctrl_value { + uint8_t type; + uint8_t reserved[7]; + int64_t value; +}; + +/* + * Request camera control state: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_GET_CTRL | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + */ +struct xencamera_get_ctrl_req { + uint8_t type; +}; + +/* + * Request camera capture stream start: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_STREAM_START| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * + * Request camera capture stream stop: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_STREAM_STOP | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * + *---------------------------------- Responses -------------------------------- + * + * All response packets have the same length (64 octets). + * + * All response packets have common header: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | operation | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * + * id - uint16_t, copied from the request. + * operation - uint8_t, XENCAMERA_OP_* - copied from request. + * status - int32_t, response status, zero on success and -XEN_EXX on failure. + * + * + * Configuration response - response for XENCAMERA_OP_CONFIG_SET, + * XENCAMERA_OP_CONFIG_GET and XENCAMERA_OP_CONFIG_VALIDATE requests: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CONFIG_XXX | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | pixel format | 12 + * +----------------+----------------+----------------+----------------+ + * | width | 16 + * +----------------+----------------+----------------+----------------+ + * | height | 20 + * +----------------+----------------+----------------+----------------+ + * | colorspace | 24 + * +----------------+----------------+----------------+----------------+ + * | xfer_func | 28 + * +----------------+----------------+----------------+----------------+ + * | ycbcr_enc | 32 + * +----------------+----------------+----------------+----------------+ + * | quantization | 36 + * +----------------+----------------+----------------+----------------+ + * | displ_asp_ratio_numer | 40 + * +----------------+----------------+----------------+----------------+ + * | displ_asp_ratio_denom | 44 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_numer | 48 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_denom | 52 + * +----------------+----------------+----------------+----------------+ + * | reserved | 56 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * Meaning of the corresponding values in this response is the same as for + * XENCAMERA_OP_CONFIG_SET and XENCAMERA_OP_FRAME_RATE_SET requests. + * + * colorspace - uint32_t, this supplements pixel_format parameter, + * one of the XENCAMERA_COLORSPACE_XXX. + * xfer_func - uint32_t, this supplements colorspace parameter, + * one of the XENCAMERA_XFER_FUNC_XXX. + * ycbcr_enc - uint32_t, this supplements colorspace parameter, + * one of the XENCAMERA_YCBCR_ENC_XXX. Please note, that ycbcr_enc is only + * valid for YCbCr pixelformats and should be ignored otherwise. + * quantization - uint32_t, this supplements colorspace parameter, + * one of the XENCAMERA_QUANTIZATION_XXX. + * displ_asp_ratio_numer - uint32_t, numerator of the display aspect ratio. + * displ_asp_ratio_denom - uint32_t, denominator of the display aspect ratio. + */ +struct xencamera_config_resp { + uint32_t pixel_format; + uint32_t width; + uint32_t height; + uint32_t colorspace; + uint32_t xfer_func; + uint32_t ycbcr_enc; + uint32_t quantization; + uint32_t displ_asp_ratio_numer; + uint32_t displ_asp_ratio_denom; + uint32_t frame_rate_numer; + uint32_t frame_rate_denom; +}; + +/* + * Request buffer response - response for XENCAMERA_OP_BUF_GET_LAYOUT + * request: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_BUF_GET_LAYOUT | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | num_planes | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | size | 16 + * +----------------+----------------+----------------+----------------+ + * | plane_size[0] | 20 + * +----------------+----------------+----------------+----------------+ + * | plane_size[1] | 24 + * +----------------+----------------+----------------+----------------+ + * | plane_size[2] | 28 + * +----------------+----------------+----------------+----------------+ + * | plane_size[3] | 32 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[0] | 36 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[1] | 40 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[2] | 44 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[3] | 48 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * num_planes - uint8_t, number of planes of the buffer. + * size - uint32_t, overall size of the buffer including sizes of the + * individual planes and padding if applicable. + * plane_size - array of uint32_t, size in octets of the corresponding plane + * including padding. + * plane_stride - array of uint32_t, size in octets occupied by the + * corresponding single image line including padding if applicable. + * + * Note! The sizes and strides in this response apply to all buffers created + * with XENCAMERA_OP_BUF_CREATE command, but individual buffers may have + * different plane offsets, see XENCAMERA_OP_BUF_REQUEST.plane_offset. + */ +struct xencamera_buf_get_layout_resp { + uint8_t num_planes; + uint8_t reserved[3]; + uint32_t size; + uint32_t plane_size[XENCAMERA_MAX_PLANE]; + uint32_t plane_stride[XENCAMERA_MAX_PLANE]; +}; + +/* + * Request buffer response - response for XENCAMERA_OP_BUF_REQUEST + * request: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_BUF_REQUEST | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | num_buffers | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * num_buffers - uint8_t, number of buffers to be used. + * + * + * Control enumerate response - response for XENCAMERA_OP_CTRL_ENUM: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CTRL_ENUM | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | index | type | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | flags | 16 + * +----------------+----------------+----------------+----------------+ + * | min low 32-bits | 20 + * +----------------+----------------+----------------+----------------+ + * | min high 32-bits | 24 + * +----------------+----------------+----------------+----------------+ + * | max low 32-bits | 28 + * +----------------+----------------+----------------+----------------+ + * | max high 32-bits | 32 + * +----------------+----------------+----------------+----------------+ + * | step low 32-bits | 36 + * +----------------+----------------+----------------+----------------+ + * | step high 32-bits | 40 + * +----------------+----------------+----------------+----------------+ + * | def_val low 32-bits | 44 + * +----------------+----------------+----------------+----------------+ + * | def_val high 32-bits | 48 + * +----------------+----------------+----------------+----------------+ + * | reserved | 52 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * index - uint8_t, index of the camera control in response. + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * flags - uint32_t, flags of the control, one of the XENCAMERA_CTRL_FLG_XXX. + * min - int64_t, minimum value of the control. + * max - int64_t, maximum value of the control. + * step - int64_t, minimum size in which control value can be changed. + * def_val - int64_t, default value of the control. + */ +struct xencamera_ctrl_enum_resp { + uint8_t index; + uint8_t type; + uint8_t reserved[2]; + uint32_t flags; + int64_t min; + int64_t max; + int64_t step; + int64_t def_val; +}; + +/* + * Get control response - response for XENCAMERA_OP_CTRL_GET: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CTRL_GET | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * | reserved | 20 + * +----------------+----------------+----------------+----------------+ + * | value low 32-bit | 24 + * +----------------+----------------+----------------+----------------+ + * | value high 32-bit | 28 + * +----------------+----------------+----------------+----------------+ + * | reserved | 32 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * value - int64_t, new value of the control. + */ + +/* + *----------------------------------- Events ---------------------------------- + * + * Events are sent via a shared page allocated by the front and propagated by + * evt-event-channel/evt-ring-ref XenStore entries. + * + * All event packets have the same length (64 octets). + * All event packets have common header: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | type | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * + * id - uint16_t, event id, may be used by front. + * type - uint8_t, type of the event. + * + * + * Frame captured event - event from back to front when a new captured + * frame is available: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_EVT_FRAME_AVAIL| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | used_sz | 16 + * +----------------+----------------+----------------+----------------+ + * | seq_num | 20 + * +----------------+----------------+----------------+----------------+ + * | reserved | 24 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * index - uint8_t, index of the buffer that contains new captured frame, + * see XENCAMERA_OP_BUF_CREATE description on the range + * used_sz - uint32_t, number of octets this frame has. This can be less + * than the XENCAMERA_OP_BUF_REQUEST.size (response) for compressed formats. + * seq_num - uint32_t, sequential number of the frame. Must be + * monotonically increasing. If skips are detected in seq_num then that + * means that the frames in-between were dropped. Note however that not + * all video capture hardware is capable of detecting dropped frames. + * In that case there will be no skips in the sequence counter. + */ +struct xencamera_frame_avail_evt { + uint8_t index; + uint8_t reserved[3]; + uint32_t used_sz; + uint32_t seq_num; +}; + +/* + * Control change event- event from back to front when camera control + * has changed: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_EVT_CTRL_CHANGE| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * | value low 32-bit | 20 + * +----------------+----------------+----------------+----------------+ + * | value high 32-bit | 24 + * +----------------+----------------+----------------+----------------+ + * | reserved | 28 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * value - int64_t, new value of the control. + * + * Notes: + * - this event is not sent for write-only controls + * - this event is not sent to the originator of the control change + * - this event is not sent when frontend first connects, e.g. initial + * control state must be explicitly queried + */ + +struct xencamera_req { + uint16_t id; + uint8_t operation; + uint8_t reserved[5]; + union { + struct xencamera_config_req config; + struct xencamera_frame_rate_req frame_rate; + struct xencamera_buf_request buf_request; + struct xencamera_buf_create_req buf_create; + struct xencamera_index index; + struct xencamera_ctrl_value ctrl_value; + struct xencamera_get_ctrl_req get_ctrl; + uint8_t reserved[56]; + } req; +}; + +struct xencamera_resp { + uint16_t id; + uint8_t operation; + uint8_t reserved; + int32_t status; + union { + struct xencamera_config_resp config; + struct xencamera_buf_get_layout_resp buf_layout; + struct xencamera_buf_request buf_request; + struct xencamera_ctrl_enum_resp ctrl_enum; + struct xencamera_ctrl_value ctrl_value; + uint8_t reserved1[56]; + } resp; +}; + +struct xencamera_evt { + uint16_t id; + uint8_t type; + uint8_t reserved[5]; + union { + struct xencamera_frame_avail_evt frame_avail; + struct xencamera_ctrl_value ctrl_value; + uint8_t reserved[56]; + } evt; +}; + +DEFINE_RING_TYPES(xen_cameraif, struct xencamera_req, struct xencamera_resp); + +/* + ****************************************************************************** + * Back to front events delivery + ****************************************************************************** + * In order to deliver asynchronous events from back to front a shared page is + * allocated by front and its granted reference propagated to back via + * XenStore entries (evt-ring-ref/evt-event-channel). + * This page has a common header used by both front and back to synchronize + * access and control event's ring buffer, while back being a producer of the + * events and front being a consumer. The rest of the page after the header + * is used for event packets. + * + * Upon reception of an event(s) front may confirm its reception + * for either each event, group of events or none. + */ + +struct xencamera_event_page { + uint32_t in_cons; + uint32_t in_prod; + uint8_t reserved[56]; +}; + +#define XENCAMERA_EVENT_PAGE_SIZE 4096 +#define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page)) +#define XENCAMERA_IN_RING_SIZE (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS) +#define XENCAMERA_IN_RING_LEN (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt)) +#define XENCAMERA_IN_RING(page) \ + ((struct xencamera_evt *)((char *)(page) + XENCAMERA_IN_RING_OFFS)) +#define XENCAMERA_IN_RING_REF(page, idx) \ + (XENCAMERA_IN_RING((page))[(idx) % XENCAMERA_IN_RING_LEN]) + +#endif /* __XEN_PUBLIC_IO_CAMERAIF_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ -- 2.21.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: [PATCH v5 1/1] cameraif: add ABI for para-virtual camera Date: Tue, 12 Mar 2019 10:20:00 +0200 Message-ID: <20190312082000.32181-2-andr2000@gmail.com> References: <20190312082000.32181-1-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1h3cdz-00009w-LJ for xen-devel@lists.xenproject.org; Tue, 12 Mar 2019 08:20:15 +0000 Received: by mail-lj1-x242.google.com with SMTP id g80so1466536ljg.6 for ; Tue, 12 Mar 2019 01:20:11 -0700 (PDT) In-Reply-To: <20190312082000.32181-1-andr2000@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com, hverkuil@xs4all.nl Cc: Oleksandr Andrushchenko List-Id: xen-devel@lists.xenproject.org RnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVw YW0uY29tPgoKVGhpcyBpcyB0aGUgQUJJIGZvciB0aGUgdHdvIGhhbHZlcyBvZiBhIHBhcmEtdmly dHVhbGl6ZWQKY2FtZXJhIGRyaXZlciB3aGljaCBleHRlbmRzIFhlbidzIHJlYWNoIG11bHRpbWVk aWEgY2FwYWJpbGl0aWVzIGV2ZW4KZmFydGhlciBlbmFibGluZyBpdCBmb3IgdmlkZW8gY29uZmVy ZW5jaW5nLCBJbi1WZWhpY2xlIEluZm90YWlubWVudCwKaGlnaCBkZWZpbml0aW9uIG1hcHMgZXRj LgoKVGhlIGluaXRpYWwgZ29hbCBpcyB0byBzdXBwb3J0IG1vc3QgbmVlZGVkIGZ1bmN0aW9uYWxp dHkgd2l0aCB0aGUKZmluYWwgaWRlYSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGV4dGVuZCB0aGUg cHJvdG9jb2wgaWYgbmVlZCBiZToKCjEuIFByb3ZpZGUgbWVhbnMgZm9yIGJhc2UgdmlydHVhbCBk ZXZpY2UgY29uZmlndXJhdGlvbjoKIC0gcGl4ZWwgZm9ybWF0cwogLSByZXNvbHV0aW9ucwogLSBm cmFtZSByYXRlcwoyLiBTdXBwb3J0IGJhc2ljIGNhbWVyYSBjb250cm9sczoKIC0gY29udHJhc3QK IC0gYnJpZ2h0bmVzcwogLSBodWUKIC0gc2F0dXJhdGlvbgozLiBTdXBwb3J0IHN0cmVhbWluZyBj b250cm9sCgpTaWduZWQtb2ZmLWJ5OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRy X2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Ci0tLQogeGVuL2luY2x1ZGUvcHVibGljL2lvL2NhbWVy YWlmLmggfCAxMzcwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxlIGNoYW5n ZWQsIDEzNzAgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9pbmNsdWRlL3B1 YmxpYy9pby9jYW1lcmFpZi5oCgpkaWZmIC0tZ2l0IGEveGVuL2luY2x1ZGUvcHVibGljL2lvL2Nh bWVyYWlmLmggYi94ZW4vaW5jbHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjFhZTRjNTFlYTc1OAotLS0gL2Rldi9udWxsCisr KyBiL3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1lcmFpZi5oCkBAIC0wLDAgKzEsMTM3MCBAQAor LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgorICogY2FtZXJhaWYuaAorICoKKyAqIFVuaWZpZWQgY2Ft ZXJhIGRldmljZSBJL08gaW50ZXJmYWNlIGZvciBYZW4gZ3Vlc3QgT1Nlcy4KKyAqCisgKiBQZXJt aXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBv YnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3Vt ZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyAqIGRlYWwgaW4gdGhlIFNvZnR3 YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhl CisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmli dXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwg YW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNo ZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAq IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNo YWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25z IG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElT IiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwg SU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC SUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklO R0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhP TERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJ TElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNF LCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZU V0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisg KgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMTkgRVBBTSBTeXN0ZW1zIEluYy4KKyAqCisgKiBB dXRob3I6IE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIDxvbGVrc2FuZHJfYW5kcnVzaGNoZW5rb0Bl cGFtLmNvbT4KKyAqLworCisjaWZuZGVmIF9fWEVOX1BVQkxJQ19JT19DQU1FUkFJRl9IX18KKyNk ZWZpbmUgX19YRU5fUFVCTElDX0lPX0NBTUVSQUlGX0hfXworCisjaW5jbHVkZSAicmluZy5oIgor I2luY2x1ZGUgIi4uL2dyYW50X3RhYmxlLmgiCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sIHZlcnNpb24KKyAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKKyAqLworI2RlZmluZSBYRU5DQU1FUkFfUFJPVE9DT0xfVkVSU0lPTiAg ICAgIjEiCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAg IEZlYXR1cmUgYW5kIFBhcmFtZXRlciBOZWdvdGlhdGlvbgorICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KgorICoKKyAqIEZyb250LT5iYWNrIG5vdGlmaWNhdGlvbnM6IHdoZW4gZW5xdWV1aW5nIGEgbmV3 IHJlcXVlc3QsIHNlbmRpbmcgYQorICogbm90aWZpY2F0aW9uIGNhbiBiZSBtYWRlIGNvbmRpdGlv bmFsIG9uIHhlbmNhbWVyYV9yZXEgKGkuZS4sIHRoZSBnZW5lcmljCisgKiBob2xkLW9mZiBtZWNo YW5pc20gcHJvdmlkZWQgYnkgdGhlIHJpbmcgbWFjcm9zKS4gQmFja2VuZHMgbXVzdCBzZXQKKyAq IHhlbmNhbWVyYV9yZXEgYXBwcm9wcmlhdGVseSAoZS5nLiwgdXNpbmcgUklOR19GSU5BTF9DSEVD S19GT1JfUkVRVUVTVFMoKSkuCisgKgorICogQmFjay0+ZnJvbnQgbm90aWZpY2F0aW9uczogd2hl biBlbnF1ZXVpbmcgYSBuZXcgcmVzcG9uc2UsIHNlbmRpbmcgYQorICogbm90aWZpY2F0aW9uIGNh biBiZSBtYWRlIGNvbmRpdGlvbmFsIG9uIHhlbmNhbWVyYV9yZXNwIChpLmUuLCB0aGUgZ2VuZXJp YworICogaG9sZC1vZmYgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IHRoZSByaW5nIG1hY3JvcykuIEZy b250ZW5kcyBtdXN0IHNldAorICogeGVuY2FtZXJhX3Jlc3AgYXBwcm9wcmlhdGVseSAoZS5nLiwg dXNpbmcgUklOR19GSU5BTF9DSEVDS19GT1JfUkVTUE9OU0VTKCkpLgorICoKKyAqIFRoZSB0d28g aGFsdmVzIG9mIGEgcGFyYS12aXJ0dWFsIGNhbWVyYSBkcml2ZXIgdXRpbGl6ZSBub2RlcyB3aXRo aW4KKyAqIFhlblN0b3JlIHRvIGNvbW11bmljYXRlIGNhcGFiaWxpdGllcyBhbmQgdG8gbmVnb3Rp YXRlIG9wZXJhdGluZyBwYXJhbWV0ZXJzLgorICogVGhpcyBzZWN0aW9uIGVudW1lcmF0ZXMgdGhl c2Ugbm9kZXMgd2hpY2ggcmVzaWRlIGluIHRoZSByZXNwZWN0aXZlIGZyb250IGFuZAorICogYmFj a2VuZCBwb3J0aW9ucyBvZiBYZW5TdG9yZSwgZm9sbG93aW5nIHRoZSBYZW5CdXMgY29udmVudGlv bi4KKyAqCisgKiBBbGwgZGF0YSBpbiBYZW5TdG9yZSBpcyBzdG9yZWQgYXMgc3RyaW5ncy4gTm9k ZXMgc3BlY2lmeWluZyBudW1lcmljCisgKiB2YWx1ZXMgYXJlIGVuY29kZWQgaW4gZGVjaW1hbC4g SW50ZWdlciB2YWx1ZSByYW5nZXMgbGlzdGVkIGJlbG93IGFyZQorICogZXhwcmVzc2VkIGFzIGZp eGVkIHNpemVkIGludGVnZXIgdHlwZXMgY2FwYWJsZSBvZiBzdG9yaW5nIHRoZSBjb252ZXJzaW9u CisgKiBvZiBhIHByb3Blcmx5IGZvcm1hdHRlZCBub2RlIHN0cmluZywgd2l0aG91dCBsb3NzIG9m IGluZm9ybWF0aW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAg ICAgICAgICAgICAgRXhhbXBsZSBjb25maWd1cmF0aW9uCisgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CisgKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGJhY2tlbmQgYW5kIGZyb250ZW5kIGNvbmZp Z3VyYXRpb246CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmFja2Vu ZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIC9sb2NhbC9kb21h aW4vMC9iYWNrZW5kL3ZjYW1lcmEvMS8wL2Zyb250ZW5kLWlkID0gIjEiCisgKiAvbG9jYWwvZG9t YWluLzAvYmFja2VuZC92Y2FtZXJhLzEvMC9mcm9udGVuZCA9ICIvbG9jYWwvZG9tYWluLzEvZGV2 aWNlL3ZjYW1lcmEvMCIKKyAqIC9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3ZjYW1lcmEvMS8wL3N0 YXRlID0gIjQiCisgKiAvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92Y2FtZXJhLzEvMC92ZXJzaW9u cyA9ICIxLDIiCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnJvbnRl bmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIC9sb2NhbC9kb21h aW4vMS9kZXZpY2UvdmNhbWVyYS8wL2JhY2tlbmQtaWQgPSAiMCIKKyAqIC9sb2NhbC9kb21haW4v MS9kZXZpY2UvdmNhbWVyYS8wL2JhY2tlbmQgPSAiL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmNh bWVyYS8xIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvc3RhdGUgPSAiNCIK KyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL3ZlcnNpb24gPSAiMSIKKyAqIC9s b2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL2JlLWFsbG9jID0gIjEiCisgKgorICotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERldmljZSAwIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8w L21heC1idWZmZXJzID0gIjMiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9j b250cm9scyA9ICJjb250cmFzdCxodWUiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1l cmEvMC9mb3JtYXRzL1lVWVYvNjQweDQ4MC9mcmFtZS1yYXRlcyA9ICIzMC8xLDE1LzEiCisgKiAv bG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9mb3JtYXRzL1lVWVYvMTkyMHgxMDgwL2Zy YW1lLXJhdGVzID0gIjE1LzIiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9m b3JtYXRzL0JHUkEvNjQweDQ4MC9mcmFtZS1yYXRlcyA9ICIxNS8xLDE1LzIiCisgKiAvbG9jYWwv ZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9mb3JtYXRzL0JHUkEvMTIwMHg3MjAvZnJhbWUtcmF0 ZXMgPSAiMTUvMiIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL3VuaXF1ZS1p ZCA9ICIwIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvcmVxLXJpbmctcmVm ID0gIjI4MzIiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9yZXEtZXZlbnQt Y2hhbm5lbCA9ICIxNSIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL2V2dC1y aW5nLXJlZiA9ICIzODciCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9ldnQt ZXZlbnQtY2hhbm5lbCA9ICIxNiIKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g RGV2aWNlIDEgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICog L2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvbWF4LWJ1ZmZlcnMgPSAiOCIKKyAqIC9s b2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL2NvbnRyb2xzID0gImJyaWdodG5lc3Msc2F0 dXJhdGlvbixodWUiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS9mb3JtYXRz L1lVWVYvNjQweDQ4MC9mcmFtZS1yYXRlcyA9ICIzMC8xLDE1LzIiCisgKiAvbG9jYWwvZG9tYWlu LzEvZGV2aWNlL3ZjYW1lcmEvMS9mb3JtYXRzL1lVWVYvMTkyMHgxMDgwL2ZyYW1lLXJhdGVzID0g IjE1LzIiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS91bmlxdWUtaWQgPSAi MSIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL3JlcS1yaW5nLXJlZiA9ICIy ODMzIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvcmVxLWV2ZW50LWNoYW5u ZWwgPSAiMTciCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS9ldnQtcmluZy1y ZWYgPSAiMzg4IgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvZXZ0LWV2ZW50 LWNoYW5uZWwgPSAiMTgiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAg ICAgICAgICAgICAgICAgICAgQmFja2VuZCBYZW5CdXMgTm9kZXMKKyAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RvY29sIHZlcnNp b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogdmVyc2lvbnMKKyAqICAg ICAgVmFsdWVzOiAgICAgICAgIDxzdHJpbmc+CisgKgorICogICAgICBMaXN0IG9mIFhFTkNBTUVS QV9MSVNUX1NFUEFSQVRPUiBzZXBhcmF0ZWQgcHJvdG9jb2wgdmVyc2lvbnMgc3VwcG9ydGVkCisg KiAgICAgIGJ5IHRoZSBiYWNrZW5kLiBGb3IgZXhhbXBsZSAiMSwyLDMiLgorICoKKyAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kIFhl bkJ1cyBOb2RlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0gQWRkcmVzc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAqCisgKiBkb20taWQKKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDx1aW50MTZfdD4K KyAqCisgKiAgICAgIERvbWFpbiBpZGVudGlmaWVyLgorICoKKyAqIGRldi1pZAorICogICAgICBW YWx1ZXM6ICAgICAgICAgPHVpbnQxNl90PgorICoKKyAqICAgICAgRGV2aWNlIGlkZW50aWZpZXIu CisgKgorICogICAgICAvbG9jYWwvZG9tYWluLzxkb20taWQ+L2RldmljZS92Y2FtZXJhLzxkZXYt aWQ+Ly4uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdG9jb2wgdmVy c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiB2ZXJzaW9uCisgKiAg ICAgIFZhbHVlczogICAgICAgICA8c3RyaW5nPgorICoKKyAqICAgICAgUHJvdG9jb2wgdmVyc2lv biwgY2hvc2VuIGFtb25nIHRoZSBvbmVzIHN1cHBvcnRlZCBieSB0aGUgYmFja2VuZC4KKyAqCisg Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmFja2VuZCBidWZmZXIgYWxsb2NhdGlvbiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogYmUtYWxsb2MKKyAqICAgICAgVmFsdWVzOiAg ICAgICAgICIwIiwgIjEiCisgKgorICogICAgICBJZiB2YWx1ZSBpcyBzZXQgdG8gIjEiLCB0aGVu IGJhY2tlbmQgd2lsbCBiZSB0aGUgYnVmZmVyCisgKiAgICAgIHByb3ZpZGVyL2FsbG9jYXRvciBm b3IgdGhpcyBkb21haW4gZHVyaW5nIFhFTkNBTUVSQV9PUF9CVUZfQ1JFQVRFCisgKiAgICAgIG9w ZXJhdGlvbi4KKyAqICAgICAgSWYgdmFsdWUgaXMgbm90ICIxIiBvciBvbWl0dGVkIGZyb250ZW5k IG11c3QgYWxsb2NhdGUgYnVmZmVycyBpdHNlbGYuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tIENhbWVyYSBzZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorICoKKyAqIHVuaXF1ZS1pZAorICogICAgICBWYWx1ZXM6ICAgICAgICAgPHN0cmluZz4KKyAq CisgKiAgICAgIEFmdGVyIGRldmljZSBpbnN0YW5jZSBpbml0aWFsaXphdGlvbiBlYWNoIGNhbWVy YSBpcyBhc3NpZ25lZCBhCisgKiAgICAgIHVuaXF1ZSBJRCwgc28gaXQgY2FuIGJlIGlkZW50aWZp ZWQgYnkgdGhlIGJhY2tlbmQgYnkgdGhpcyBJRC4KKyAqICAgICAgVGhpcyBjYW4gYmUgVVVJRCBv ciBzdWNoLgorICoKKyAqIG1heC1idWZmZXJzCisgKiAgICAgIFZhbHVlczogICAgICAgICA8dWlu dDhfdD4KKyAqCisgKiAgICAgIE1heGltdW0gbnVtYmVyIG9mIGNhbWVyYSBidWZmZXJzIHRoaXMg ZnJvbnRlbmQgbWF5IHVzZS4KKyAqCisgKiBjb250cm9scworICogICAgICBWYWx1ZXM6ICAgICAg ICAgPGxpc3Qgb2Ygc3RyaW5nPgorICoKKyAqICAgICAgTGlzdCBvZiBzdXBwb3J0ZWQgY2FtZXJh IGNvbnRyb2xzIHNlcGFyYXRlZCBieSBYRU5DQU1FUkFfTElTVF9TRVBBUkFUT1IuCisgKiAgICAg IENhbWVyYSBjb250cm9scyBhcmUgZXhwcmVzc2VkIGFzIGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVz IHcvbyBhbnkKKyAqICAgICAgb3JkZXJpbmcgcmVxdWlyZW1lbnQuCisgKgorICogZm9ybWF0cwor ICogICAgICBWYWx1ZXM6ICAgICAgICAgPGZvcm1hdCwgY2hhcls3XT4KKyAqCisgKiAgICAgIEZv cm1hdHMgYXJlIG9yZ2FuaXplZCBhcyBhIHNldCBvZiBkaXJlY3RvcmllcyBvbmUgcGVyIGVhY2gK KyAqICAgICAgc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9y eSBpcyB0aGUKKyAqICAgICAgY29ycmVzcG9uZGluZyBGT1VSQ0Mgc3RyaW5nIGxhYmVsLiBUaGUg bmV4dCBsZXZlbCBvZgorICogICAgICB0aGUgZGlyZWN0b3J5IHVuZGVyIDxmb3JtYXRzPiByZXBy ZXNlbnRzIHN1cHBvcnRlZCByZXNvbHV0aW9ucy4KKyAqICAgICAgSWYgdGhlIGZvcm1hdCByZXBy ZXNlbnRzIGEgYmlnLWVuZGlhbiB2YXJpYW50IG9mIGEgbGl0dGxlCisgKiAgICAgIGVuZGlhbiBm b3JtYXQsIHRoZW4gdGhlICItQkUiIHN1ZmZpeCBtdXN0IGJlIGFkZGVkLiBFLmcuICdBUjE1JyB2 cworICogICAgICAnQVIxNS1CRScuCisgKiAgICAgIElmIEZPVVJDQyBzdHJpbmcgbGFiZWwgaGFz IHNwYWNlcyB0aGVuIHRob3NlIGFyZSBvbmx5IGFsbG93ZWQgdG8KKyAqICAgICAgYmUgYXQgdGhl IGVuZCBvZiB0aGUgbGFiZWwgYW5kIG11c3QgYmUgdHJpbW1lZCwgZm9yIGV4YW1wbGUKKyAqICAg ICAgJ1kxNicgYW5kICdZMTYtQkUnIHdpbGwgYmUgdHJpbW1lZC4KKyAqCisgKiByZXNvbHV0aW9u CisgKiAgICAgIFZhbHVlczogICAgICAgICA8d2lkdGgsIHVpbnQzMl90Png8aGVpZ2h0LCB1aW50 MzJfdD4KKyAqCisgKiAgICAgIFJlc29sdXRpb25zIGFyZSBvcmdhbml6ZWQgYXMgYSBzZXQgb2Yg ZGlyZWN0b3JpZXMgb25lIHBlciBlYWNoCisgKiAgICAgIHN1cHBvcnRlZCByZXNvbHV0aW9uIHVu ZGVyIGNvcnJlc3BvbmRpbmcgPGZvcm1hdHM+IGRpcmVjdG9yeS4KKyAqICAgICAgVGhlIG5hbWUg b2YgdGhlIGRpcmVjdG9yeSBpcyB0aGUgc3VwcG9ydGVkIHdpZHRoIGFuZCBoZWlnaHQKKyAqICAg ICAgb2YgdGhlIGNhbWVyYSByZXNvbHV0aW9uIGluIHBpeGVscy4KKyAqCisgKiBmcmFtZS1yYXRl cworICogICAgICBWYWx1ZXM6ICAgICAgICAgPG51bWVyYXRvciwgdWludDMyX3Q+LzxkZW5vbWlu YXRvciwgdWludDMyX3Q+CisgKgorICogICAgICBMaXN0IG9mIFhFTkNBTUVSQV9GUkFNRV9SQVRF X1NFUEFSQVRPUiBzZXBhcmF0ZWQgc3VwcG9ydGVkIGZyYW1lIHJhdGVzCisgKiAgICAgIG9mIHRo ZSBjYW1lcmEgZXhwcmVzc2VkIGFzIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3Igb2YgdGhlCisg KiAgICAgIGNvcnJlc3BvbmRpbmcgZnJhbWUgcmF0ZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0t LS0gQ2FtZXJhIFJlcXVlc3QgVHJhbnNwb3J0IFBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgKgorICogVGhpcyBjb21tdW5pY2F0aW9uIHBhdGggaXMgdXNlZCB0byBkZWxpdmVyIHJl cXVlc3RzIGZyb20gZnJvbnRlbmQgdG8gYmFja2VuZAorICogYW5kIGdldCB0aGUgY29ycmVzcG9u ZGluZyByZXNwb25zZXMgZnJvbSBiYWNrZW5kIHRvIGZyb250ZW5kLAorICogc2V0IHVwIHBlciB2 aXJ0dWFsIGNhbWVyYSBkZXZpY2UuCisgKgorICogcmVxLWV2ZW50LWNoYW5uZWwKKyAqICAgICAg VmFsdWVzOiAgICAgICAgIDx1aW50MzJfdD4KKyAqCisgKiAgICAgIFRoZSBpZGVudGlmaWVyIG9m IHRoZSBYZW4gY2FtZXJhJ3MgY29udHJvbCBldmVudCBjaGFubmVsCisgKiAgICAgIHVzZWQgdG8g c2lnbmFsIGFjdGl2aXR5IGluIHRoZSByaW5nIGJ1ZmZlci4KKyAqCisgKiByZXEtcmluZy1yZWYK KyAqICAgICAgVmFsdWVzOiAgICAgICAgIDx1aW50MzJfdD4KKyAqCisgKiAgICAgIFRoZSBYZW4g Z3JhbnQgcmVmZXJlbmNlIGdyYW50aW5nIHBlcm1pc3Npb24gZm9yIHRoZSBiYWNrZW5kIHRvIG1h cAorICogICAgICBhIHNvbGUgcGFnZSBvZiBjYW1lcmEncyBjb250cm9sIHJpbmcgYnVmZmVyLgor ICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FtZXJhIEV2ZW50IFRyYW5zcG9ydCBQYXJhbWV0 ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIGNvbW11bmljYXRpb24gcGF0 aCBpcyB1c2VkIHRvIGRlbGl2ZXIgYXN5bmNocm9ub3VzIGV2ZW50cyBmcm9tIGJhY2tlbmQKKyAq IHRvIGZyb250ZW5kLCBzZXQgdXAgcGVyIHZpcnR1YWwgY2FtZXJhIGRldmljZS4KKyAqCisgKiBl dnQtZXZlbnQtY2hhbm5lbAorICogICAgICBWYWx1ZXM6ICAgICAgICAgPHVpbnQzMl90PgorICoK KyAqICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhlbiBjYW1lcmEncyBldmVudCBjaGFubmVs CisgKiAgICAgIHVzZWQgdG8gc2lnbmFsIGFjdGl2aXR5IGluIHRoZSByaW5nIGJ1ZmZlci4KKyAq CisgKiBldnQtcmluZy1yZWYKKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDx1aW50MzJfdD4KKyAq CisgKiAgICAgIFRoZSBYZW4gZ3JhbnQgcmVmZXJlbmNlIGdyYW50aW5nIHBlcm1pc3Npb24gZm9y IHRoZSBiYWNrZW5kIHRvIG1hcAorICogICAgICBhIHNvbGUgcGFnZSBvZiBjYW1lcmEncyBldmVu dCByaW5nIGJ1ZmZlci4KKyAqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEUgRElBR1JBTVMKKyAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioKKyAqCisgKiBUb29sIHN0YWNrIGNyZWF0ZXMgZnJvbnQgYW5kIGJhY2sgc3RhdGUg bm9kZXMgd2l0aCBpbml0aWFsIHN0YXRlCisgKiBYZW5idXNTdGF0ZUluaXRpYWxpc2luZy4KKyAq IFRvb2wgc3RhY2sgY3JlYXRlcyBhbmQgc2V0cyB1cCBmcm9udGVuZCBjYW1lcmEgY29uZmlndXJh dGlvbgorICogbm9kZXMgcGVyIGRvbWFpbi4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tIE5vcm1hbCBmbG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg KgorICogRnJvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2sKKyAqID09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09CisgKiBYZW5idXNTdGF0ZUluaXRpYWxpc2luZyAgICAgICAgICAgICAgWGVu YnVzU3RhdGVJbml0aWFsaXNpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbyBRdWVyeSBiYWNrZW5kIGRldmljZSBpZGVudGlmaWNhdGlvbgorICogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuCisgKiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIG8gT3BlbiBhbmQgdmFsaWRhdGUgYmFja2VuZCBkZXZpY2Uu CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVJbml0V2FpdAorICoKKyAq IG8gUXVlcnkgZnJvbnRlbmQgY29uZmlndXJhdGlvbgorICogbyBBbGxvY2F0ZSBhbmQgaW5pdGlh bGl6ZQorICogICBldmVudCBjaGFubmVscyBwZXIgY29uZmlndXJlZAorICogICBjYW1lcmEuCisg KiBvIFB1Ymxpc2ggdHJhbnNwb3J0IHBhcmFtZXRlcnMKKyAqICAgdGhhdCB3aWxsIGJlIGluIGVm ZmVjdCBkdXJpbmcKKyAqICAgdGhpcyBjb25uZWN0aW9uLgorICogICAgICAgICAgICAgIHwKKyAq ICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgVgorICogWGVuYnVzU3RhdGVJbml0aWFs aXNlZAorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBRdWVy eSBmcm9udGVuZCB0cmFuc3BvcnQgcGFyYW1ldGVycy4KKyAqICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbyBDb25uZWN0IHRvIHRoZSBldmVudCBjaGFubmVscy4KKyAqICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYKKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBYZW5idXNTdGF0ZUNvbm5lY3RlZAorICoKKyAqICBvIENy ZWF0ZSBhbmQgaW5pdGlhbGl6ZSBPUworICogICAgdmlydHVhbCBjYW1lcmEgYXMgcGVyCisgKiAg ICBjb25maWd1cmF0aW9uLgorICogICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICB8Cisg KiAgICAgICAgICAgICAgVgorICogWGVuYnVzU3RhdGVDb25uZWN0ZWQKKyAqCisgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVVbmtub3duCisgKiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVDbG9zZWQKKyAqICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYZW5idXNTdGF0ZUNsb3NpbmcKKyAq IG8gUmVtb3ZlIHZpcnR1YWwgY2FtZXJhIGRldmljZQorICogbyBSZW1vdmUgZXZlbnQgY2hhbm5l bHMKKyAqICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAg IFYKKyAqIFhlbmJ1c1N0YXRlQ2xvc2VkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tIFJlY292ZXJ5IGZsb3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoK KyAqIEluIGNhc2Ugb2YgZnJvbnRlbmQgdW5yZWNvdmVyYWJsZSBlcnJvcnMgYmFja2VuZCBoYW5k bGVzIHRoYXQgYXMKKyAqIGlmIGZyb250ZW5kIGdvZXMgaW50byB0aGUgWGVuYnVzU3RhdGVDbG9z ZWQgc3RhdGUuCisgKgorICogSW4gY2FzZSBvZiBiYWNrZW5kIHVucmVjb3ZlcmFibGUgZXJyb3Jz IGZyb250ZW5kIHRyaWVzIHJlbW92aW5nCisgKiB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlLiBJZiB0 aGlzIGlzIHBvc3NpYmxlIGF0IHRoZSBtb21lbnQgb2YgZXJyb3IsCisgKiB0aGVuIGZyb250ZW5k IGdvZXMgaW50byB0aGUgWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcgc3RhdGUgYW5kIGlzIHJlYWR5 IGZvcgorICogbmV3IGNvbm5lY3Rpb24gd2l0aCBiYWNrZW5kLiBJZiB0aGUgdmlydHVhbGl6ZWQg ZGV2aWNlIGlzIHN0aWxsIGluIHVzZSBhbmQKKyAqIGNhbm5vdCBiZSByZW1vdmVkLCB0aGVuIGZy b250ZW5kIGdvZXMgaW50byB0aGUgWGVuYnVzU3RhdGVSZWNvbmZpZ3VyaW5nIHN0YXRlCisgKiB1 bnRpbCBlaXRoZXIgdGhlIHZpcnR1YWxpemVkIGRldmljZSBpcyByZW1vdmVkIG9yIGJhY2tlbmQg aW5pdGlhdGVzIGEgbmV3CisgKiBjb25uZWN0aW9uLiBPbiB0aGUgdmlydHVhbGl6ZWQgZGV2aWNl IHJlbW92YWwgZnJvbnRlbmQgZ29lcyBpbnRvIHRoZQorICogWGVuYnVzU3RhdGVJbml0aWFsaXNp bmcgc3RhdGUuCisgKgorICogTm90ZSBvbiBYZW5idXNTdGF0ZVJlY29uZmlndXJpbmcgc3RhdGUg b2YgdGhlIGZyb250ZW5kOiBpZiBiYWNrZW5kIGhhcworICogdW5yZWNvdmVyYWJsZSBlcnJvcnMg dGhlbiBmcm9udGVuZCBjYW5ub3Qgc2VuZCByZXF1ZXN0cyB0byB0aGUgYmFja2VuZAorICogYW5k IHRodXMgY2Fubm90IHByb3ZpZGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgdmlydHVhbGl6ZWQgZGV2 aWNlIGFueW1vcmUuCisgKiBBZnRlciBiYWNrZW5kIGlzIGJhY2sgdG8gbm9ybWFsIHRoZSB2aXJ0 dWFsaXplZCBkZXZpY2UgbWF5IHN0aWxsIGhvbGQgc29tZQorICogc3RhdGU6IGNvbmZpZ3VyYXRp b24gaW4gdXNlLCBhbGxvY2F0ZWQgYnVmZmVycywgY2xpZW50IGFwcGxpY2F0aW9uIHN0YXRlIGV0 Yy4KKyAqIEluIG1vc3QgY2FzZXMsIHRoaXMgd2lsbCByZXF1aXJlIGZyb250ZW5kIHRvIGltcGxl bWVudCBjb21wbGV4IHJlY292ZXJ5CisgKiByZWNvbm5lY3QgbG9naWMuIEluc3RlYWQsIGJ5IGdv aW5nIGludG8gWGVuYnVzU3RhdGVSZWNvbmZpZ3VyaW5nIHN0YXRlLAorICogZnJvbnRlbmQgd2ls bCBtYWtlIHN1cmUgbm8gbmV3IGNsaWVudHMgb2YgdGhlIHZpcnR1YWxpemVkIGRldmljZSBhcmUK KyAqIGFjY2VwdGVkLCBhbGxvdyBleGlzdGluZyBjbGllbnQocykgdG8gZXhpdCBncmFjZWZ1bGx5 IGJ5IHNpZ25hbGluZyBlcnJvcgorICogc3RhdGUgZXRjLgorICogT25jZSBhbGwgdGhlIGNsaWVu dHMgYXJlIGdvbmUgZnJvbnRlbmQgY2FuIHJlaW5pdGlhbGl6ZSB0aGUgdmlydHVhbGl6ZWQKKyAq IGRldmljZSBhbmQgZ2V0IGludG8gWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcgc3RhdGUgYWdhaW4g c2lnbmFsaW5nIHRoZQorICogYmFja2VuZCB0aGF0IGEgbmV3IGNvbm5lY3Rpb24gY2FuIGJlIG1h ZGUuCisgKgorICogVGhlcmUgYXJlIG11bHRpcGxlIGNvbmRpdGlvbnMgcG9zc2libGUgdW5kZXIg d2hpY2ggZnJvbnRlbmQgd2lsbCBnbyBmcm9tCisgKiBYZW5idXNTdGF0ZVJlY29uZmlndXJpbmcg aW50byBYZW5idXNTdGF0ZUluaXRpYWxpc2luZywgc29tZSBvZiB0aGVtIGFyZSBPUworICogc3Bl Y2lmaWMuIEZvciBleGFtcGxlOgorICogMS4gVGhlIHVuZGVybHlpbmcgT1MgZnJhbWV3b3JrIG1h eSBwcm92aWRlIGNhbGxiYWNrcyB0byBzaWduYWwgdGhhdCB0aGUgbGFzdAorICogICAgY2xpZW50 IG9mIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgaGFzIGdvbmUgYW5kIHRoZSBkZXZpY2UgY2FuIGJl IHJlbW92ZWQKKyAqIDIuIEZyb250ZW5kIGNhbiBzY2hlZHVsZSBhIGRlZmVycmVkIHdvcmsgKHRp bWVyL3Rhc2tsZXQvd29ya3F1ZXVlKQorICogICAgdG8gcGVyaW9kaWNhbGx5IGNoZWNrIGlmIHRo aXMgaXMgdGhlIHJpZ2h0IHRpbWUgdG8gcmUtdHJ5IHJlbW92YWwgb2YKKyAqICAgIHRoZSB2aXJ0 dWFsaXplZCBkZXZpY2UuCisgKiAzLiBCeSBhbnkgb3RoZXIgbWVhbnMuCisgKgorICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1QgQ09E RVMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2RlZmluZSBYRU5DQU1FUkFfT1BfQ09O RklHX1NFVCAgICAgICAgMHgwMAorI2RlZmluZSBYRU5DQU1FUkFfT1BfQ09ORklHX0dFVCAgICAg ICAgMHgwMQorI2RlZmluZSBYRU5DQU1FUkFfT1BfQ09ORklHX1ZBTElEQVRFICAgMHgwMgorI2Rl ZmluZSBYRU5DQU1FUkFfT1BfRlJBTUVfUkFURV9TRVQgICAgMHgwMworI2RlZmluZSBYRU5DQU1F UkFfT1BfQlVGX0dFVF9MQVlPVVQgICAgMHgwNAorI2RlZmluZSBYRU5DQU1FUkFfT1BfQlVGX1JF UVVFU1QgICAgICAgMHgwNQorI2RlZmluZSBYRU5DQU1FUkFfT1BfQlVGX0NSRUFURSAgICAgICAg MHgwNgorI2RlZmluZSBYRU5DQU1FUkFfT1BfQlVGX0RFU1RST1kgICAgICAgMHgwNworI2RlZmlu ZSBYRU5DQU1FUkFfT1BfQlVGX1FVRVVFICAgICAgICAgMHgwOAorI2RlZmluZSBYRU5DQU1FUkFf T1BfQlVGX0RFUVVFVUUgICAgICAgMHgwOQorI2RlZmluZSBYRU5DQU1FUkFfT1BfQ1RSTF9FTlVN ICAgICAgICAgMHgwYQorI2RlZmluZSBYRU5DQU1FUkFfT1BfQ1RSTF9TRVQgICAgICAgICAgMHgw YgorI2RlZmluZSBYRU5DQU1FUkFfT1BfQ1RSTF9HRVQgICAgICAgICAgMHgwYworI2RlZmluZSBY RU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJUICAgICAgMHgwZAorI2RlZmluZSBYRU5DQU1FUkFfT1Bf U1RSRUFNX1NUT1AgICAgICAgMHgwZQorCisjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0JSSUdIVE5F U1MgICAgICAwCisjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0NPTlRSQVNUICAgICAgICAxCisjZGVm aW5lIFhFTkNBTUVSQV9DVFJMX1NBVFVSQVRJT04gICAgICAyCisjZGVmaW5lIFhFTkNBTUVSQV9D VFJMX0hVRSAgICAgICAgICAgICAzCisKKy8qIE51bWJlciBvZiBzdXBwb3J0ZWQgY29udHJvbHMu ICovCisjZGVmaW5lIFhFTkNBTUVSQV9NQVhfQ1RSTCAgICAgICAgICAgICA0CisKKy8qIENvbnRy b2wgaXMgcmVhZC1vbmx5LiAqLworI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9GTEdfUk8gICAgICAg ICAgKDEgPDwgMCkKKy8qIENvbnRyb2wgaXMgd3JpdGUtb25seS4gKi8KKyNkZWZpbmUgWEVOQ0FN RVJBX0NUUkxfRkxHX1dPICAgICAgICAgICgxIDw8IDEpCisvKiBDb250cm9sJ3MgdmFsdWUgaXMg dm9sYXRpbGUuICovCisjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0ZMR19WT0xBVElMRSAgICAoMSA8 PCAyKQorCisvKiBTdXBwb3J0ZWQgY29sb3Igc3BhY2VzLiAqLworI2RlZmluZSBYRU5DQU1FUkFf Q09MT1JTUEFDRV9ERUZBVUxUICAgMAorI2RlZmluZSBYRU5DQU1FUkFfQ09MT1JTUEFDRV9TTVBU RTE3ME0gMQorI2RlZmluZSBYRU5DQU1FUkFfQ09MT1JTUEFDRV9SRUM3MDkgICAgMgorI2RlZmlu ZSBYRU5DQU1FUkFfQ09MT1JTUEFDRV9TUkdCICAgICAgMworI2RlZmluZSBYRU5DQU1FUkFfQ09M T1JTUEFDRV9PUFJHQiAgICAgNAorI2RlZmluZSBYRU5DQU1FUkFfQ09MT1JTUEFDRV9CVDIwMjAg ICAgNQorI2RlZmluZSBYRU5DQU1FUkFfQ09MT1JTUEFDRV9EQ0lfUDMgICAgNgorCisvKiBDb2xv ciBzcGFjZSB0cmFuc2ZlciBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgWEVOQ0FNRVJBX1hGRVJfRlVO Q19ERUZBVUxUICAgIDAKKyNkZWZpbmUgWEVOQ0FNRVJBX1hGRVJfRlVOQ183MDkgICAgICAgIDEK KyNkZWZpbmUgWEVOQ0FNRVJBX1hGRVJfRlVOQ19TUkdCICAgICAgIDIKKyNkZWZpbmUgWEVOQ0FN RVJBX1hGRVJfRlVOQ19PUFJHQiAgICAgIDMKKyNkZWZpbmUgWEVOQ0FNRVJBX1hGRVJfRlVOQ19O T05FICAgICAgIDQKKyNkZWZpbmUgWEVOQ0FNRVJBX1hGRVJfRlVOQ19EQ0lfUDMgICAgIDUKKyNk ZWZpbmUgWEVOQ0FNRVJBX1hGRVJfRlVOQ19TTVBURTIwODQgIDYKKworLyogQ29sb3Igc3BhY2Ug WeKAmUNiQ3IgZW5jb2RpbmcuICovCisjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfSUdOT1JF ICAgICAgICAgICAwCisjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfNjAxICAgICAgICAgICAg ICAxCisjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfNzA5ICAgICAgICAgICAgICAyCisjZGVm aW5lIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfWFY2MDEgICAgICAgICAgICAzCisjZGVmaW5lIFhFTkNB TUVSQV9ZQ0JDUl9FTkNfWFY3MDkgICAgICAgICAgICA0CisjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JD Ul9FTkNfQlQyMDIwICAgICAgICAgICA1CisjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfQlQy MDIwX0NPTlNUX0xVTSA2CisKKy8qIFF1YW50aXphdGlvbiByYW5nZS4gKi8KKyNkZWZpbmUgWEVO Q0FNRVJBX1FVQU5USVpBVElPTl9ERUZBVUxUICAgICAgIDAKKyNkZWZpbmUgWEVOQ0FNRVJBX1FV QU5USVpBVElPTl9GVUxMX1JBTkdFICAgIDEKKyNkZWZpbmUgWEVOQ0FNRVJBX1FVQU5USVpBVElP Tl9MSU1fUkFOR0UgICAgIDIKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlQgQ09ERVMKKyAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioKKyAqLworI2RlZmluZSBYRU5DQU1FUkFfRVZUX0ZSQU1FX0FWQUlMICAgICAgMHgwMAor I2RlZmluZSBYRU5DQU1FUkFfRVZUX0NUUkxfQ0hBTkdFICAgICAgMHgwMQorCisvKgorICoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBYRU5TVE9SRSBGSUVMRCBBTkQgUEFU SCBOQU1FIFNUUklOR1MsIEhFTFBFUlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2Rl ZmluZSBYRU5DQU1FUkFfRFJJVkVSX05BTUUgICAgICAgICAgInZjYW1lcmEiCisKKyNkZWZpbmUg WEVOQ0FNRVJBX0xJU1RfU0VQQVJBVE9SICAgICAgICIsIgorI2RlZmluZSBYRU5DQU1FUkFfUkVT T0xVVElPTl9TRVBBUkFUT1IgIngiCisjZGVmaW5lIFhFTkNBTUVSQV9GUkFDVElPTl9TRVBBUkFU T1IgICAiLyIKKworI2RlZmluZSBYRU5DQU1FUkFfRklFTERfQkVfVkVSU0lPTlMgICAgInZlcnNp b25zIgorI2RlZmluZSBYRU5DQU1FUkFfRklFTERfRkVfVkVSU0lPTiAgICAgInZlcnNpb24iCisj ZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9SRVFfUklOR19SRUYgICAicmVxLXJpbmctcmVmIgorI2Rl ZmluZSBYRU5DQU1FUkFfRklFTERfUkVRX0NIQU5ORUwgICAgInJlcS1ldmVudC1jaGFubmVsIgor I2RlZmluZSBYRU5DQU1FUkFfRklFTERfRVZUX1JJTkdfUkVGICAgImV2dC1yaW5nLXJlZiIKKyNk ZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX0VWVF9DSEFOTkVMICAgICJldnQtZXZlbnQtY2hhbm5lbCIK KyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX01BWF9CVUZGRVJTICAgICJtYXgtYnVmZmVycyIKKyNk ZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX0NPTlRST0xTICAgICAgICJjb250cm9scyIKKyNkZWZpbmUg WEVOQ0FNRVJBX0ZJRUxEX0ZPUk1BVFMgICAgICAgICJmb3JtYXRzIgorI2RlZmluZSBYRU5DQU1F UkFfRklFTERfRlJBTUVfUkFURVMgICAgImZyYW1lLXJhdGVzIgorI2RlZmluZSBYRU5DQU1FUkFf RklFTERfQkVfQUxMT0MgICAgICAgImJlLWFsbG9jIgorI2RlZmluZSBYRU5DQU1FUkFfRklFTERf VU5JUVVFX0lEICAgICAgInVuaXF1ZS1pZCIKKworI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9CUklH SFRORVNTX1NUUiAgImJyaWdodG5lc3MiCisjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0NPTlRSQVNU X1NUUiAgICAiY29udHJhc3QiCisjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX1NBVFVSQVRJT05fU1RS ICAic2F0dXJhdGlvbiIKKyNkZWZpbmUgWEVOQ0FNRVJBX0NUUkxfSFVFX1NUUiAgICAgICAgICJo dWUiCisKKyNkZWZpbmUgWEVOQ0FNRVJBX0ZPVVJDQ19CSUdFTkRJQU5fU1RSICItQkUiCisKKy8q IE1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlciBwbGFuZXMgc3VwcG9ydGVkLiAqLworI2RlZmluZSBY RU5DQU1FUkFfTUFYX1BMQU5FICAgICAgICAgICAgNAorCisvKgorICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRVUyBSRVRVUk4gQ09ERVMKKyAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdGF0dXMgcmV0dXJuIGNvZGUgaXMgemVybyBv biBzdWNjZXNzIGFuZCAtWEVOX0VYWCBvbiBmYWlsdXJlLgorICoKKyAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbnMKKyAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKKyAqCisgKiAtIHVzYWdlIG9mIGdyYW50IHJlZmVyZW5jZSAwIGFz IGludmFsaWQgZ3JhbnQgcmVmZXJlbmNlOgorICogICBncmFudCByZWZlcmVuY2UgMCBpcyB2YWxp ZCwgYnV0IG5ldmVyIGV4cG9zZWQgdG8gYSBQViBkcml2ZXIsCisgKiAgIGJlY2F1c2Ugb2YgdGhl IGZhY3QgaXQgaXMgYWxyZWFkeSBpbiB1c2UvcmVzZXJ2ZWQgYnkgdGhlIFBWIGNvbnNvbGUuCisg KiAtIGFsbCByZWZlcmVuY2VzIGluIHRoaXMgZG9jdW1lbnQgdG8gcGFnZSBzaXplcyBtdXN0IGJl IHRyZWF0ZWQKKyAqICAgYXMgcGFnZXMgb2Ygc2l6ZSBYRU5fUEFHRV9TSVpFIHVubGVzcyBvdGhl cndpc2Ugbm90ZWQuCisgKiAtIGFsbCBGT1VSQ0MgbWFwcGluZ3MgdXNlZCBmb3IgY29uZmlndXJh dGlvbiBhbmQgbWVzc2FnaW5nIGFyZQorICogICBMaW51eCBWNEwyIG9uZXM6IGh0dHBzOi8vZ2l0 Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LmdpdC90 cmVlL2luY2x1ZGUvdWFwaS9saW51eC92aWRlb2RldjIuaAorICogICB3aXRoIHRoZSBmb2xsb3dp bmcgZXhjZXB0aW9uczoKKyAqICAgICAtIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQgaW4gWzB4MjA7 IDB4N2ZdIHJhbmdlCisgKiAgICAgLSB3aGVuIHVzZWQgZm9yIFhlblN0b3JlIGNvbmZpZ3VyYXRp b24gZW50cmllcyB0aGUgZm9sbG93aW5nCisgKiAgICAgICBhcmUgbm90IGFsbG93ZWQ6CisgKiAg ICAgICAtICcvJywgJ1wnLCAnICcgKHNwYWNlKSwgJzwnLCAnPicsICc6JywgJyInLCAnfCcsICc/ JywgJyonCisgKiAgICAgICAtIGlmIHRyYWlsaW5nIHNwYWNlcyBhcmUgcGFydCBvZiB0aGUgRk9V UkNDIGNvZGUgdGhlbiB0aG9zZSBtdXN0IGJlCisgKiAgICAgICAgIHRyaW1tZWQKKyAqCisgKgor ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgRGVzY3JpcHRpb24gb2YgdGhlIHByb3Rv Y29sIGJldHdlZW4gZnJvbnRlbmQgYW5kIGJhY2tlbmQgZHJpdmVyCisgKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCisgKgorICogVGhlIHR3byBoYWx2ZXMgb2YgYSBQYXJhLXZpcnR1YWwgY2FtZXJhIGRy aXZlciBjb21tdW5pY2F0ZSB3aXRoCisgKiBlYWNoIG90aGVyIHVzaW5nIHNoYXJlZCBwYWdlcyBh bmQgZXZlbnQgY2hhbm5lbHMuCisgKiBTaGFyZWQgcGFnZSBjb250YWlucyBhIHJpbmcgd2l0aCBy ZXF1ZXN0L3Jlc3BvbnNlIHBhY2tldHMuCisgKgorICogQWxsIHJlc2VydmVkIGZpZWxkcyBpbiB0 aGUgc3RydWN0dXJlcyBiZWxvdyBtdXN0IGJlIDAuCisgKgorICogRm9yIGFsbCByZXF1ZXN0L3Jl c3BvbnNlL2V2ZW50IHBhY2tldHM6CisgKiAgIC0gZnJhbWUgcmF0ZSBwYXJhbWV0ZXIgaXMgcmVw cmVzZW50ZWQgYXMgYSBwYWlyIG9mIDQgb2N0ZXQgbG9uZworICogICAgIG51bWVyYXRvciBhbmQg ZGVub21pbmF0b3I6CisgKiAgICAgICAtIGZyYW1lX3JhdGVfbnVtZXIgLSB1aW50MzJfdCwgbnVt ZXJhdG9yIG9mIHRoZSBmcmFtZSByYXRlCisgKiAgICAgICAtIGZyYW1lX3JhdGVfZGVub20gLSB1 aW50MzJfdCwgZGVub21pbmF0b3Igb2YgdGhlIGZyYW1lIHJhdGUKKyAqICAgICBUaGUgY29ycmVz cG9uZGluZyBmcmFtZSByYXRlIChIeikgaXMgY2FsY3VsYXRlZCBhczoKKyAqICAgICAgIGZyYW1l X3JhdGUgPSBmcmFtZV9yYXRlX251bWVyIC8gZnJhbWVfcmF0ZV9kZW5vbQorICogICAtIGJ1ZmZl ciBpbmRleCBpcyBhIHplcm8gYmFzZWQgaW5kZXggb2YgdGhlIGJ1ZmZlci4gTXVzdCBiZSBsZXNz IHRoYW4KKyAqICAgICB0aGUgdmFsdWUgb2YgWEVOQ0FNRVJBX09QX0NPTkZJR19TRVQubnVtX2J1 ZnMgcmVzcG9uc2U6CisgKiAgICAgICAtIGluZGV4IC0gdWludDhfdCwgaW5kZXggb2YgdGhlIGJ1 ZmZlci4KKyAqCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlcXVl c3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEFsbCByZXF1ZXN0 IHBhY2tldHMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKDY0IG9jdGV0cykuCisgKiBBbGwgcmVxdWVz dCBwYWNrZXRzIGhhdmUgY29tbW9uIGhlYWRlcjoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAg ICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgICAgb3Bl cmF0aW9uICAgfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogICBpZCAtIHVpbnQxNl90LCBwcml2YXRlIGd1 ZXN0IHZhbHVlLCBlY2hvZWQgaW4gcmVzcG9uc2UuCisgKiAgIG9wZXJhdGlvbiAtIHVpbnQ4X3Qs IG9wZXJhdGlvbiBjb2RlLCBYRU5DQU1FUkFfT1BfWFhYLgorICoKKyAqCisgKiBSZXF1ZXN0IHRv IHNldC92YWxpZGF0ZSB0aGUgY29uZmlndXJhdGlvbiAtIHJlcXVlc3QgdG8gc2V0IHRoZQorICog Y29uZmlndXJhdGlvbi9tb2RlIG9mIHRoZSBjYW1lcmEgKFhFTkNBTUVSQV9PUF9DT05GSUdfU0VU KSBvciB0bworICogY2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQgYW5kIGNhbiBi ZSB1c2VkCisgKiAoWEVOQ0FNRVJBX09QX0NPTkZJR19WQUxJREFURSk6CisgKiAgICAgICAgIDAg ICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAg IG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAg ICAgICB8IF9PUF9DT05GSUdfWFhYIHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGl4ZWwgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAx MgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdp ZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDIwCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBwaXhlbF9mb3JtYXQgLSB1aW50 MzJfdCwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQsIEZPVVJDQyBjb2RlLgorICogd2lkdGggLSB1 aW50MzJfdCwgd2lkdGggaW4gcGl4ZWxzLgorICogaGVpZ2h0IC0gdWludDMyX3QsIGhlaWdodCBp biBwaXhlbHMuCisgKgorICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0Lgor ICoKKyAqIE5vdGVzOgorICogIC0gdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIFhFTkNBTUVS QV9PUF9DT05GSUdfVkFMSURBVEUgYW5kCisgKiAgICBYRU5DQU1FUkFfT1BfQ09ORklHX1NFVCBp cyB0aGF0IHRoZSBmb3JtZXIgZG9lc24ndCBhY3R1YWxseSBjaGFuZ2UKKyAqICAgIGNhbWVyYSBj b25maWd1cmF0aW9uLCBidXQgcXVlcmllcyBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyB2YWxpZC4K KyAqICAgIFRoaXMgY2FuIGJlIHVzZWQgd2hpbGUgc3RyZWFtIGlzIGFjdGl2ZSBhbmQvb3IgYnVm ZmVycyBhbGxvY2F0ZWQuCisgKiAgLSBmcm9udGVuZCBtdXN0IGNoZWNrIHRoZSBjb3JyZXNwb25k aW5nIHJlc3BvbnNlIGluIG9yZGVyIHRvIHNlZQorICogICAgaWYgdGhlIHZhbHVlcyByZXBvcnRl ZCBiYWNrIGJ5IHRoZSBiYWNrZW5kIGRvIG1hdGNoIHRoZSBkZXNpcmVkIG9uZXMKKyAqICAgIGFu ZCBjYW4gYmUgYWNjZXB0ZWQuCisgKiAgLSBmcm9udGVuZCBtYXkgc2VuZCBtdWx0aXBsZSBYRU5D QU1FUkFfT1BfQ09ORklHX1NFVCByZXF1ZXN0cyBiZWZvcmUKKyAqICAgIHNlbmRpbmcgWEVOQ0FN RVJBX09QX1NUUkVBTV9TVEFSVCByZXF1ZXN0IHRvIHVwZGF0ZSBvciB0dW5lIHRoZQorICogICAg ZmluYWwgc3RyZWFtIGNvbmZpZ3VyYXRpb24uCisgKiAgLSBjb25maWd1cmF0aW9uIGNhbm5vdCBi ZSBjaGFuZ2VkIGR1cmluZyBhY3RpdmUgc3RyZWFtaW5nLCBlLmcuCisgKiAgICBhZnRlciBYRU5D QU1FUkFfT1BfU1RSRUFNX1NUQVJUIGFuZCBiZWZvcmUgWEVOQ0FNRVJBX09QX1NUUkVBTV9TVE9Q CisgKiAgICByZXF1ZXN0cy4KKyAqLworc3RydWN0IHhlbmNhbWVyYV9jb25maWdfcmVxIHsKKyAg ICB1aW50MzJfdCBwaXhlbF9mb3JtYXQ7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMy X3QgaGVpZ2h0OworfTsKKworLyoKKyAqIFJlcXVlc3QgY3VycmVudCBjb25maWd1cmF0aW9uIG9m IHRoZSBjYW1lcmE6CisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAg ICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwg ICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8IF9PUF9DT05GSUdfR0VUIHwgICByZXNl cnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4CisgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIFNlZSByZXNwb25zZSBmb3JtYXQgZm9yIHRo aXMgcmVxdWVzdC4KKyAqCisgKgorICogUmVxdWVzdCB0byBzZXQgdGhlIGZyYW1lIHJhdGUgb2Yg dGhlIHN0cmVhbToKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAg ICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAg ICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX0ZSQU1FX1JBVEVfU0VUfCAgIHJlc2Vy dmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfcmF0ZV9udW1lciAg ICAgICAgICAgICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAg ICAgICAgICAgICAgICAgICAgIGZyYW1lX3JhdGVfZGVub20gICAgICAgICAgICAgICAgICAgICAg ICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2 NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogZnJhbWVfcmF0ZV9udW1lciAtIHVpbnQzMl90LCBu dW1lcmF0b3Igb2YgdGhlIGZyYW1lIHJhdGUuCisgKiBmcmFtZV9yYXRlX2Rlbm9tIC0gdWludDMy X3QsIGRlbm9taW5hdG9yIG9mIHRoZSBmcmFtZSByYXRlLgorICoKKyAqIE5vdGVzOgorICogIC0g dG8gcXVlcnkgdGhlIGN1cnJlbnQgKGFjdHVhbCkgZnJhbWUgcmF0ZSB1c2UgWEVOQ0FNRVJBX09Q X0NPTkZJR19HRVQKKyAqICAgIHJlcXVlc3QuCisgKiAgLSB0aGlzIHJlcXVlc3QgY2FuIGJlIHVz ZWQgd2l0aCBjYW1lcmEgYnVmZmVycyBhbGxvY2F0ZWQsIGJ1dCBzdHJlYW0KKyAqICAgIHN0b3Bw ZWQsIGUuZy4gZnJvbnRlbmQgaXMgYWxsb3dlZCB0byBzdG9wIHRoZSBzdHJlYW0gd2l0aAorICog ICAgWEVOQ0FNRVJBX09QX1NUUkVBTV9TVE9QLCBob2xkIHRoZSBidWZmZXJzIGFsbG9jYXRlZCAo ZS5nLiBrZWVwIHRoZQorICogICAgY29uZmlndXJhdGlvbiBzZXQgd2l0aCBYRU5DQU1FUkFfT1Bf Q09ORklHX1NFVCksIGNoYW5nZSB0aGUKKyAqICAgIGZyYW1lIHJhdGUgb2YgdGhlIHN0cmVhbSBh bmQgKHJlKXN0YXJ0IHRoZSBzdHJlYW0gYWdhaW4gd2l0aAorICogICAgWEVOQ0FNRVJBX09QX1NU UkVBTV9TVEFSVC4KKyAqICAtIGZyYW1lIHJhdGUgY2Fubm90IGJlIGNoYW5nZWQgZHVyaW5nIGFj dGl2ZSBzdHJlYW1pbmcsIGUuZy4KKyAqICAgIGFmdGVyIFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RB UlQgYW5kIGJlZm9yZSBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUT1AKKyAqICAgIGNvbW1hbmRzLgor ICovCitzdHJ1Y3QgeGVuY2FtZXJhX2ZyYW1lX3JhdGVfcmVxIHsKKyAgICB1aW50MzJfdCBmcmFt ZV9yYXRlX251bWVyOworICAgIHVpbnQzMl90IGZyYW1lX3JhdGVfZGVub207Cit9OworCisvKgor ICogUmVxdWVzdCBjYW1lcmEgYnVmZmVyJ3MgbGF5b3V0OgorICogICAgICAgICAwICAgICAgICAg ICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBf QlVGX0dFVF9MQVlPVVR8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBTZWUg cmVzcG9uc2UgZm9ybWF0IGZvciB0aGlzIHJlcXVlc3QuCisgKgorICoKKyAqIFJlcXVlc3QgbnVt YmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNlZDoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAx ICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0JVRl9S RVFVRVNUfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICBudW1fYnVmcyAgICB8ICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2 ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAq CisgKiBudW1fYnVmcyAtIHVpbnQ4X3QsIGRlc2lyZWQgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUg dXNlZC4KKyAqCisgKiBJZiBudW1fYnVmcyBpcyBub3QgemVybyB0aGVuIHRoZSBiYWNrZW5kIHZh bGlkYXRlcyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgorICogYnVmZmVycyBhbmQgcmVzcG9uZHMg d2l0aCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb3dlZCBmb3IgdGhpcyBmcm9udGVuZC4KKyAq IEZyb250ZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyB0aGUgY29ycmVzcG9uZGluZyBy ZXNwb25zZSBpbiBvcmRlciB0bworICogc2VlIGlmIHRoZSB2YWx1ZXMgcmVwb3J0ZWQgYmFjayBi eSB0aGUgYmFja2VuZCBkbyBtYXRjaCB0aGUgZGVzaXJlZCBvbmVzCisgKiBhbmQgY2FuIGJlIGFj Y2VwdGVkLgorICogRnJvbnRlbmQgaXMgYWxsb3dlZCB0byBzZW5kIG11bHRpcGxlIFhFTkNBTUVS QV9PUF9CVUZfUkVRVUVTVCByZXF1ZXN0cworICogYmVmb3JlIHNlbmRpbmcgWEVOQ0FNRVJBX09Q X1NUUkVBTV9TVEFSVCByZXF1ZXN0IHRvIHVwZGF0ZSBvciB0dW5lIHRoZQorICogZmluYWwgY29u ZmlndXJhdGlvbi4KKyAqIEZyb250ZW5kIGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgbnVt YmVyIG9mIGJ1ZmZlcnMgYW5kL29yIGNhbWVyYQorICogY29uZmlndXJhdGlvbiBhZnRlciB0aGUg c3RyZWFtaW5nIGhhcyBzdGFydGVkLgorICoKKyAqIElmIG51bV9idWZzIGlzIDAgYW5kIHN0cmVh bWluZyBoYXMgbm90IHN0YXJ0ZWQgeWV0LCB0aGVuIHRoZSBiYWNrZW5kIHdpbGwKKyAqIGZyZWUg YWxsIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ1ZmZlcnMgKGlmIGFueSkuCisgKiBUcnlpbmcgdG8g Y2FsbCB0aGlzIGlmIHN0cmVhbWluZyBpcyBpbiBwcm9ncmVzcyB3aWxsIHJlc3VsdCBpbiBhbiBl cnJvci4KKyAqCisgKiBJZiBjYW1lcmEgcmVjb25maWd1cmF0aW9uIGlzIHJlcXVpcmVkIHRoZW4g dGhlIHN0cmVhbWluZyBtdXN0IGJlIHN0b3BwZWQKKyAqIGFuZCB0aGlzIHJlcXVlc3QgbXVzdCBi ZSBzZW50IHdpdGggbnVtX2J1ZnMgc2V0IHRvIHplcm8gYW5kIGZpbmFsbHkKKyAqIGJ1ZmZlcnMg ZGVzdHJveWVkLgorICoKKyAqIFBsZWFzZSBub3RlLCB0aGF0IHRoZSBudW1iZXIgb2YgYnVmZmVy cyBpbiB0aGlzIHJlcXVlc3QgbXVzdCBub3QgZXhjZWVkCisgKiB0aGUgdmFsdWUgY29uZmlndXJl ZCBpbiBYZW5TdG9yZS5tYXgtYnVmZmVycy4KKyAqCisgKiBTZWUgcmVzcG9uc2UgZm9ybWF0IGZv ciB0aGlzIHJlcXVlc3QuCisgKi8KK3N0cnVjdCB4ZW5jYW1lcmFfYnVmX3JlcXVlc3QgeworICAg IHVpbnQ4X3QgbnVtX2J1ZnM7Cit9OworCisvKgorICogUmVxdWVzdCBjYW1lcmEgYnVmZmVyIGNy ZWF0aW9uOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIg ICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQlVGX0NSRUFURSB8ICAgcmVzZXJ2ZWQg ICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgaW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAg ICAgICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgIHBsYW5lX29mZnNldFswXSAgICAgICAgICAgICAgICAgICAgICAgICB8 IDE2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFu ZV9vZmZzZXRbMV0gICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfb2Zmc2V0WzJdICAgICAgICAg ICAgICAgICAgICAgICAgIHwgMjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgIHBsYW5lX29mZnNldFszXSAgICAgICAgICAgICAgICAgICAgICAgICB8IDI4 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVmX2Rp cmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMgorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgMzYKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKgorICog QW4gYXR0ZW1wdCB0byBjcmVhdGUgbXVsdGlwbGUgYnVmZmVycyB3aXRoIHRoZSBzYW1lIGluZGV4 IGlzIGFuIGVycm9yLgorICogaW5kZXggY2FuIGJlIHJlLXVzZWQgYWZ0ZXIgZGVzdHJveWluZyB0 aGUgY29ycmVzcG9uZGluZyBjYW1lcmEgYnVmZmVyLgorICoKKyAqIGluZGV4IC0gdWludDhfdCwg aW5kZXggb2YgdGhlIGJ1ZmZlciB0byBiZSBjcmVhdGVkIGluIHRoZSByYW5nZQorICogICBmcm9t IDAgdG8gdGhlIG51bV9idWZzIGZpZWxkIHJldHVybmVkIGluIHJlc3BvbnNlIGZvcgorICogICBY RU5DQU1FUkFfT1BfQlVGX1JFUVVFU1QgcmVxdWVzdAorICogcGxhbmVfb2Zmc2V0IC0gYXJyYXkg b2YgdWludDMyX3QsIG9mZnNldCBvZiB0aGUgY29ycmVzcG9uZGluZyBwbGFuZQorICogICBpbiBv Y3RldHMgZnJvbSB0aGUgYnVmZmVyIHN0YXJ0LiBOdW1iZXIgb2Ygb2Zmc2V0cyByZXR1cm5lZCBp cworICogICBlcXVhbCB0byB0aGUgdmFsdWUgcmV0dXJuZWQgaW4gWEVOQ0FNRVJBX09QX0JVRl9H RVRfTEFZT1VULm51bV9wbGFuZXMuCisgKiBncmVmX2RpcmVjdG9yeSAtIGdyYW50X3JlZl90LCBh IHJlZmVyZW5jZSB0byB0aGUgZmlyc3Qgc2hhcmVkIHBhZ2UKKyAqICAgZGVzY3JpYmluZyBzaGFy ZWQgYnVmZmVyIHJlZmVyZW5jZXMuIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXMgZXF1YWwgdG8K KyAqICAgWEVOQ0FNRVJBX09QX0JVRl9HRVRfTEFZT1VULnNpemUgcmVzcG9uc2UuIEF0IGxlYXN0 IG9uZSBwYWdlIGV4aXN0cy4gSWYKKyAqICAgc2hhcmVkIGJ1ZmZlciBzaXplIGV4Y2VlZHMgd2hh dCBjYW4gYmUgYWRkcmVzc2VkIGJ5IHRoaXMgc2luZ2xlIHBhZ2UsCisgKiAgIHRoZW4gcmVmZXJl bmNlIHRvIHRoZSBuZXh0IHNoYXJlZCBwYWdlIG11c3QgYmUgc3VwcGxpZWQgKHNlZQorICogICBn cmVmX2Rpcl9uZXh0X3BhZ2UgYmVsb3cpLgorICoKKyAqIElmIFhFTkNBTUVSQV9GSUVMRF9CRV9B TExPQyBjb25maWd1cmF0aW9uIGVudHJ5IGlzIHNldCwgdGhlbiBiYWNrZW5kIHdpbGwKKyAqIGFs bG9jYXRlIHRoZSBidWZmZXIgd2l0aCB0aGUgcGFyYW1ldGVycyBwcm92aWRlZCBpbiB0aGlzIHJl cXVlc3QgYW5kIHBhZ2UKKyAqIGRpcmVjdG9yeSBpcyBoYW5kbGVkIGFzIGZvbGxvd3M6CisgKiAg IEZyb250ZW5kIG9uIHJlcXVlc3Q6CisgKiAgICAgLSBhbGxvY2F0ZXMgcGFnZXMgZm9yIHRoZSBk aXJlY3RvcnkgKGdyZWZfZGlyZWN0b3J5LAorICogICAgICAgZ3JlZl9kaXJfbmV4dF9wYWdlKHMp CisgKiAgICAgLSBncmFudHMgcGVybWlzc2lvbnMgZm9yIHRoZSBwYWdlcyBvZiB0aGUgZGlyZWN0 b3J5IHRvIHRoZSBiYWNrZW5kCisgKiAgICAgLSBzZXRzIGdyZWZfZGlyX25leHRfcGFnZSBmaWVs ZHMKKyAqICAgQmFja2VuZCBvbiByZXNwb25zZToKKyAqICAgICAtIGdyYW50cyBwZXJtaXNzaW9u cyBmb3IgdGhlIHBhZ2VzIG9mIHRoZSBidWZmZXIgYWxsb2NhdGVkIHRvCisgKiAgICAgICB0aGUg ZnJvbnRlbmQKKyAqICAgICAtIGZpbGxzIGluIHBhZ2UgZGlyZWN0b3J5IHdpdGggZ3JhbnQgcmVm ZXJlbmNlcworICogICAgICAgKGdyZWZbXSBpbiBzdHJ1Y3QgeGVuY2FtZXJhX3BhZ2VfZGlyZWN0 b3J5KQorICovCitzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9jcmVhdGVfcmVxIHsKKyAgICB1aW50OF90 IGluZGV4OworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbM107CisgICAgdWludDMyX3QgcGxhbmVfb2Zm c2V0W1hFTkNBTUVSQV9NQVhfUExBTkVdOworICAgIGdyYW50X3JlZl90IGdyZWZfZGlyZWN0b3J5 OworfTsKKworLyoKKyAqIFNoYXJlZCBwYWdlIGZvciBYRU5DQU1FUkFfT1BfQlVGX0NSRUFURSBi dWZmZXIgZGVzY3JpcHRvciAoZ3JlZl9kaXJlY3RvcnkgaW4KKyAqIHRoZSByZXF1ZXN0KSBlbXBs b3lzIGEgbGlzdCBvZiBwYWdlcywgZGVzY3JpYmluZyBhbGwgcGFnZXMgb2YgdGhlIHNoYXJlZAor ICogZGF0YSBidWZmZXI6CisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAg ICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAq IHwgICAgICAgICAgICAgICAgICAgICAgICBncmVmX2Rpcl9uZXh0X3BhZ2UgICAgICAgICAgICAg ICAgICAgICAgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBncmVmWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZltpXSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgaSo0KzgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWZbTiAtIDFdICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCBOKjQrOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogZ3Jl Zl9kaXJfbmV4dF9wYWdlIC0gZ3JhbnRfcmVmX3QsIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBwYWdl IGRlc2NyaWJpbmcKKyAqICAgcGFnZSBkaXJlY3RvcnkuIE11c3QgYmUgMCBpZiB0aGVyZSBhcmUg bm8gbW9yZSBwYWdlcyBpbiB0aGUgbGlzdC4KKyAqIGdyZWZbaV0gLSBncmFudF9yZWZfdCwgcmVm ZXJlbmNlIHRvIGEgc2hhcmVkIHBhZ2Ugb2YgdGhlIGJ1ZmZlcgorICogICBhbGxvY2F0ZWQgYXQg WEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUuCisgKgorICogTnVtYmVyIG9mIGdyYW50X3JlZl90IGVu dHJpZXMgaW4gdGhlIHdob2xlIHBhZ2UgZGlyZWN0b3J5IGlzIG5vdAorICogcGFzc2VkLCBidXQg aW5zdGVhZCBjYW4gYmUgY2FsY3VsYXRlZCBhczoKKyAqICAgbnVtX2dyZWZzX3RvdGFsID0gKFhF TkNBTUVSQV9PUF9CVUZfUkVRVUVTVC5zaXplICsgWEVOX1BBR0VfU0laRSAtIDEpIC8KKyAqICAg ICAgIFhFTl9QQUdFX1NJWkUKKyAqLworc3RydWN0IHhlbmNhbWVyYV9wYWdlX2RpcmVjdG9yeSB7 CisgICAgZ3JhbnRfcmVmX3QgZ3JlZl9kaXJfbmV4dF9wYWdlOworICAgIGdyYW50X3JlZl90IGdy ZWZbMV07IC8qIFZhcmlhYmxlIGxlbmd0aCAqLworfTsKKworLyoKKyAqIFJlcXVlc3QgYnVmZmVy IGRlc3RydWN0aW9uIC0gZGVzdHJveSBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGNhbWVyYSBidWZm ZXI6CisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAg ICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAg ICAgICBpZCAgICAgICAgICAgICAgICB8IF9PUF9CVUZfREVTVFJPWXwgICByZXNlcnZlZCAgICAg fCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl c2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK KyAqIHwgICAgICBpbmRleCAgICAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAg ICAgICAgICAgICAgICAgfCAxMgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogaW5kZXggLSB1aW50OF90LCBp bmRleCBvZiB0aGUgYnVmZmVyIHRvIGJlIGRlc3Ryb3llZC4KKyAqCisgKgorICogUmVxdWVzdCBx dWV1ZWluZyBvZiB0aGUgYnVmZmVyIGZvciBiYWNrZW5kIHVzZToKKyAqICAgICAgICAgMCAgICAg ICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0 ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAg IHwgX09QX0JVRl9RVUVVRSAgfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgIGluZGV4ICAgICB8 ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCisg KiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVk ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKKyAqCisgKiBOb3RlczoKKyAqICAtIGZyb250ZW5kcyBtdXN0IG5vdCBhY2Nlc3Mg dGhlIGJ1ZmZlciBjb250ZW50IGFmdGVyIHRoaXMgcmVxdWVzdCB1bnRpbAorICogICAgcmVzcG9u c2UgdG8gWEVOQ0FNRVJBX09QX0JVRl9ERVFVRVVFIGhhcyBiZWVuIHJlY2VpdmVkLgorICogIC0g YnVmZmVycyBtdXN0IGJlIHF1ZXVlZCB0byB0aGUgYmFja2VuZCBiZWZvcmUgZGVzdHJveWluZyB0 aGVtIHdpdGgKKyAqICAgIFhFTkNBTUVSQV9PUF9CVUZfREVTVFJPWS4KKyAqCisgKiBpbmRleCAt IHVpbnQ4X3QsIGluZGV4IG9mIHRoZSBidWZmZXIgdG8gYmUgcXVldWVkLgorICoKKyAqCisgKiBS ZXF1ZXN0IGRlcXVldWVpbmcgb2YgdGhlIGJ1ZmZlciBmb3IgZnJvbnRlbmQgdXNlOgorICogICAg ICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAz ICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAg ICAgICAgICAgICAgfF9PUF9CVUZfREVRVUVVRSB8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg aW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAg ICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2CisgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg NjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIE5vdGVzOgorICogIC0gZnJvbnRlbmQgaXMgYWxs b3dlZCB0byBhY2Nlc3MgdGhlIGJ1ZmZlciBjb250ZW50IGFmdGVyIHRoZSBjb3JyZXNwb25kaW5n CisgKiAgICByZXNwb25zZSB0byB0aGlzIHJlcXVlc3QuCisgKgorICogaW5kZXggLSB1aW50OF90 LCBpbmRleCBvZiB0aGUgYnVmZmVyIHRvIGJlIHF1ZXVlZC4KKyAqCisgKgorICogUmVxdWVzdCBj YW1lcmEgY29udHJvbCBkZXRhaWxzOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAg ICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQ1RSTF9FTlVN ICB8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgaW5kZXgg ICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwg OAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKgorICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0 LgorICoKKyAqIGluZGV4IC0gdWludDhfdCwgaW5kZXggb2YgdGhlIGNvbnRyb2wgdG8gYmUgcXVl cmllZC4KKyAqLworc3RydWN0IHhlbmNhbWVyYV9pbmRleCB7CisgICAgdWludDhfdCBpbmRleDsK K307CisKKy8qCisgKiBSZXF1ZXN0IGNhbWVyYSBjb250cm9sIGNoYW5nZToKKyAqICAgICAgICAg MCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAg ICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAg ICAgICAgIHwgIF9PUF9TRVRfQ1RSTCAgfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICB0eXBlICAgICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQg ICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl c2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsb3cgMzItYml0ICAgICAgICAg ICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgdmFsdWUgaGlnaCAzMi1iaXQgICAgICAgICAgICAgICAgICAgICAgICB8IDI0 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyOAorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqCisgKiB0eXBlIC0gdWludDhfdCwgdHlwZSBvZiB0aGUgY29udHJvbCwg b25lIG9mIHRoZSBYRU5DQU1FUkFfQ1RSTF9YWFguCisgKiB2YWx1ZSAtIGludDY0X3QsIG5ldyB2 YWx1ZSBvZiB0aGUgY29udHJvbC4KKyAqLworc3RydWN0IHhlbmNhbWVyYV9jdHJsX3ZhbHVlIHsK KyAgICB1aW50OF90IHR5cGU7CisgICAgdWludDhfdCByZXNlcnZlZFs3XTsKKyAgICBpbnQ2NF90 IHZhbHVlOworfTsKKworLyoKKyAqIFJlcXVlc3QgY2FtZXJhIGNvbnRyb2wgc3RhdGU6CisgKiAg ICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAg IDMgICAgICAgIG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAg ICAgICAgICAgICAgICB8ICBfT1BfR0VUX0NUUkwgIHwgICByZXNlcnZlZCAgICAgfCA0CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqIHwgICAgICAgdHlwZSAgICAgfCAgICAgICAgICAgICAgICAgICAgIHJl c2VydmVkICAgICAgICAgICAgICAgICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAxMgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBTZWUgcmVz cG9uc2UgZm9ybWF0IGZvciB0aGlzIHJlcXVlc3QuCisgKgorICogdHlwZSAtIHVpbnQ4X3QsIHR5 cGUgb2YgdGhlIGNvbnRyb2wsIG9uZSBvZiB0aGUgWEVOQ0FNRVJBX0NUUkxfWFhYLgorICovCitz dHJ1Y3QgeGVuY2FtZXJhX2dldF9jdHJsX3JlcSB7CisgICAgdWludDhfdCB0eXBlOworfTsKKwor LyoKKyAqIFJlcXVlc3QgY2FtZXJhIGNhcHR1cmUgc3RyZWFtIHN0YXJ0OgorICogICAgICAgICAw ICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAg ICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAg ICAgICAgfF9PUF9TVFJFQU1fU1RBUlR8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2 ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAq CisgKgorICogUmVxdWVzdCBjYW1lcmEgY2FwdHVyZSBzdHJlYW0gc3RvcDoKKyAqICAgICAgICAg MCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAg ICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAg ICAgICAgIHxfT1BfU1RSRUFNX1NUT1AgfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNwb25zZXMgLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBbGwgcmVzcG9uc2UgcGFja2V0 cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAoNjQgb2N0ZXRzKS4KKyAqCisgKiBBbGwgcmVzcG9uc2Ug cGFja2V0cyBoYXZlIGNvbW1vbiBoZWFkZXI6CisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAg MSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8ICAgIG9wZXJh dGlvbiAgIHwgICAgcmVzZXJ2ZWQgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBpZCAtIHVpbnQxNl90LCBjb3BpZWQgZnJv bSB0aGUgcmVxdWVzdC4KKyAqIG9wZXJhdGlvbiAtIHVpbnQ4X3QsIFhFTkNBTUVSQV9PUF8qIC0g Y29waWVkIGZyb20gcmVxdWVzdC4KKyAqIHN0YXR1cyAtIGludDMyX3QsIHJlc3BvbnNlIHN0YXR1 cywgemVybyBvbiBzdWNjZXNzIGFuZCAtWEVOX0VYWCBvbiBmYWlsdXJlLgorICoKKyAqCisgKiBD b25maWd1cmF0aW9uIHJlc3BvbnNlIC0gcmVzcG9uc2UgZm9yIFhFTkNBTUVSQV9PUF9DT05GSUdf U0VULAorICogWEVOQ0FNRVJBX09QX0NPTkZJR19HRVQgYW5kIFhFTkNBTUVSQV9PUF9DT05GSUdf VkFMSURBVEUgcmVxdWVzdHM6CisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAg ICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK KyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8IF9PUF9DT05GSUdfWFhYIHwg ICAgcmVzZXJ2ZWQgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cisg KiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgZm9y bWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMgorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgMTYKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBoZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIwCisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc3BhY2Ug ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB4ZmVyX2Z1bmMgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgMjgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgeWNiY3JfZW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMyCisgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAzNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICBkaXNwbF9hc3BfcmF0aW9fbnVtZXIgICAgICAgICAgICAgICAgICAg ICAgIHwgNDAKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgZGlz cGxfYXNwX3JhdGlvX2Rlbm9tICAgICAgICAgICAgICAgICAgICAgICB8IDQ0CisgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3JhdGVfbnVtZXIgICAg ICAgICAgICAgICAgICAgICAgICAgfCA0OAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAg ICAgICAgICAgICAgICAgICBmcmFtZV9yYXRlX2Rlbm9tICAgICAgICAgICAgICAgICAgICAgICAg IHwgNTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDU2CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICoKKyAqIE1lYW5pbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFs dWVzIGluIHRoaXMgcmVzcG9uc2UgaXMgdGhlIHNhbWUgYXMgZm9yCisgKiBYRU5DQU1FUkFfT1Bf Q09ORklHX1NFVCBhbmQgWEVOQ0FNRVJBX09QX0ZSQU1FX1JBVEVfU0VUIHJlcXVlc3RzLgorICoK KyAqIGNvbG9yc3BhY2UgLSB1aW50MzJfdCwgdGhpcyBzdXBwbGVtZW50cyBwaXhlbF9mb3JtYXQg cGFyYW1ldGVyLAorICogICBvbmUgb2YgdGhlIFhFTkNBTUVSQV9DT0xPUlNQQUNFX1hYWC4KKyAq IHhmZXJfZnVuYyAtIHVpbnQzMl90LCB0aGlzIHN1cHBsZW1lbnRzIGNvbG9yc3BhY2UgcGFyYW1l dGVyLAorICogICBvbmUgb2YgdGhlIFhFTkNBTUVSQV9YRkVSX0ZVTkNfWFhYLgorICogeWNiY3Jf ZW5jIC0gdWludDMyX3QsIHRoaXMgc3VwcGxlbWVudHMgY29sb3JzcGFjZSBwYXJhbWV0ZXIsCisg KiAgIG9uZSBvZiB0aGUgWEVOQ0FNRVJBX1lDQkNSX0VOQ19YWFguIFBsZWFzZSBub3RlLCB0aGF0 IHljYmNyX2VuYyBpcyBvbmx5CisgKiAgIHZhbGlkIGZvciBZQ2JDciBwaXhlbGZvcm1hdHMgYW5k IHNob3VsZCBiZSBpZ25vcmVkIG90aGVyd2lzZS4KKyAqIHF1YW50aXphdGlvbiAtIHVpbnQzMl90 LCB0aGlzIHN1cHBsZW1lbnRzIGNvbG9yc3BhY2UgcGFyYW1ldGVyLAorICogICBvbmUgb2YgdGhl IFhFTkNBTUVSQV9RVUFOVElaQVRJT05fWFhYLgorICogZGlzcGxfYXNwX3JhdGlvX251bWVyIC0g dWludDMyX3QsIG51bWVyYXRvciBvZiB0aGUgZGlzcGxheSBhc3BlY3QgcmF0aW8uCisgKiBkaXNw bF9hc3BfcmF0aW9fZGVub20gLSB1aW50MzJfdCwgZGVub21pbmF0b3Igb2YgdGhlIGRpc3BsYXkg YXNwZWN0IHJhdGlvLgorICovCitzdHJ1Y3QgeGVuY2FtZXJhX2NvbmZpZ19yZXNwIHsKKyAgICB1 aW50MzJfdCBwaXhlbF9mb3JtYXQ7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3Qg aGVpZ2h0OworICAgIHVpbnQzMl90IGNvbG9yc3BhY2U7CisgICAgdWludDMyX3QgeGZlcl9mdW5j OworICAgIHVpbnQzMl90IHljYmNyX2VuYzsKKyAgICB1aW50MzJfdCBxdWFudGl6YXRpb247Cisg ICAgdWludDMyX3QgZGlzcGxfYXNwX3JhdGlvX251bWVyOworICAgIHVpbnQzMl90IGRpc3BsX2Fz cF9yYXRpb19kZW5vbTsKKyAgICB1aW50MzJfdCBmcmFtZV9yYXRlX251bWVyOworICAgIHVpbnQz Ml90IGZyYW1lX3JhdGVfZGVub207Cit9OworCisvKgorICogUmVxdWVzdCBidWZmZXIgcmVzcG9u c2UgLSByZXNwb25zZSBmb3IgWEVOQ0FNRVJBX09QX0JVRl9HRVRfTEFZT1VUCisgKiByZXF1ZXN0 OgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAg ICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAg ICAgaWQgICAgICAgICAgICAgICAgfF9CVUZfR0VUX0xBWU9VVCB8ICAgIHJlc2VydmVkICAgIHwg NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8ICAgbnVtX3BsYW5lcyAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAg ICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2Cisg KiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zaXpl WzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc2l6ZVsxXSAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgMjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgIHBsYW5lX3NpemVbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI4CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zaXplWzNd ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zdHJpZGVbMF0gICAgICAgICAgICAgICAgICAg ICAgICAgIHwgMzYKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgcGxhbmVfc3RyaWRlWzFdICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQwCisgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3N0cmlkZVsyXSAg ICAgICAgICAgICAgICAgICAgICAgICAgfCA0NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICBwbGFuZV9zdHJpZGVbM10gICAgICAgICAgICAgICAgICAgICAg ICAgIHwgNDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogbnVtX3BsYW5l cyAtIHVpbnQ4X3QsIG51bWJlciBvZiBwbGFuZXMgb2YgdGhlIGJ1ZmZlci4KKyAqIHNpemUgLSB1 aW50MzJfdCwgb3ZlcmFsbCBzaXplIG9mIHRoZSBidWZmZXIgaW5jbHVkaW5nIHNpemVzIG9mIHRo ZQorICogICBpbmRpdmlkdWFsIHBsYW5lcyBhbmQgcGFkZGluZyBpZiBhcHBsaWNhYmxlLgorICog cGxhbmVfc2l6ZSAtIGFycmF5IG9mIHVpbnQzMl90LCBzaXplIGluIG9jdGV0cyBvZiB0aGUgY29y cmVzcG9uZGluZyBwbGFuZQorICogICBpbmNsdWRpbmcgcGFkZGluZy4KKyAqIHBsYW5lX3N0cmlk ZSAtIGFycmF5IG9mIHVpbnQzMl90LCBzaXplIGluIG9jdGV0cyBvY2N1cGllZCBieSB0aGUKKyAq ICAgY29ycmVzcG9uZGluZyBzaW5nbGUgaW1hZ2UgbGluZSBpbmNsdWRpbmcgcGFkZGluZyBpZiBh cHBsaWNhYmxlLgorICoKKyAqIE5vdGUhIFRoZSBzaXplcyBhbmQgc3RyaWRlcyBpbiB0aGlzIHJl c3BvbnNlIGFwcGx5IHRvIGFsbCBidWZmZXJzIGNyZWF0ZWQKKyAqIHdpdGggWEVOQ0FNRVJBX09Q X0JVRl9DUkVBVEUgY29tbWFuZCwgYnV0IGluZGl2aWR1YWwgYnVmZmVycyBtYXkgaGF2ZQorICog ZGlmZmVyZW50IHBsYW5lIG9mZnNldHMsIHNlZSBYRU5DQU1FUkFfT1BfQlVGX1JFUVVFU1QucGxh bmVfb2Zmc2V0LgorICovCitzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9nZXRfbGF5b3V0X3Jlc3Agewor ICAgIHVpbnQ4X3QgbnVtX3BsYW5lczsKKyAgICB1aW50OF90IHJlc2VydmVkWzNdOworICAgIHVp bnQzMl90IHNpemU7CisgICAgdWludDMyX3QgcGxhbmVfc2l6ZVtYRU5DQU1FUkFfTUFYX1BMQU5F XTsKKyAgICB1aW50MzJfdCBwbGFuZV9zdHJpZGVbWEVOQ0FNRVJBX01BWF9QTEFORV07Cit9Owor CisvKgorICogUmVxdWVzdCBidWZmZXIgcmVzcG9uc2UgLSByZXNwb25zZSBmb3IgWEVOQ0FNRVJB X09QX0JVRl9SRVFVRVNUCisgKiByZXF1ZXN0OgorICogICAgICAgICAwICAgICAgICAgICAgICAg IDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfF9PUF9CVUZf UkVRVUVTVCB8ICAgIHJlc2VydmVkICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgbnVtX2J1ZmZlcnMgIHwgICAgICAgICAg ICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDE2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv fAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICoKKyAqIG51bV9idWZmZXJzIC0gdWludDhfdCwgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNl ZC4KKyAqCisgKgorICogQ29udHJvbCBlbnVtZXJhdGUgcmVzcG9uc2UgLSByZXNwb25zZSBmb3Ig WEVOQ0FNRVJBX09QX0NUUkxfRU5VTToKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAg ICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0NUUkxfRU5V TSAgfCAgICByZXNlcnZlZCAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgaW5kZXggICAgICB8ICAgICAgdHlwZSAgICAg IHwgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK KyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgICBtaW4gbG93IDMyLWJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgbWluIGhpZ2gg MzItYml0cyAgICAgICAgICAgICAgICAgICAgICAgICB8IDI0CisgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAq IHwgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCBsb3cgMzItYml0cyAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAyOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAg ICAgICAgICBtYXggaGlnaCAzMi1iaXRzICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzIKKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwIGxvdyAzMi1i aXRzICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM2CisgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwg ICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCBoaWdoIDMyLWJpdHMgICAgICAgICAgICAgICAg ICAgICAgICAgfCA0MAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgZGVmX3ZhbCBsb3cgMzItYml0cyAgICAgICAgICAgICAgICAgICAgICAgIHwgNDQKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgIGRlZl92YWwgaGlnaCAzMi1i aXRzICAgICAgICAgICAgICAgICAgICAgICB8IDQ4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCA1MgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBpbmRleCAt IHVpbnQ4X3QsIGluZGV4IG9mIHRoZSBjYW1lcmEgY29udHJvbCBpbiByZXNwb25zZS4KKyAqIHR5 cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBjb250cm9sLCBvbmUgb2YgdGhlIFhFTkNBTUVSQV9D VFJMX1hYWC4KKyAqIGZsYWdzIC0gdWludDMyX3QsIGZsYWdzIG9mIHRoZSBjb250cm9sLCBvbmUg b2YgdGhlIFhFTkNBTUVSQV9DVFJMX0ZMR19YWFguCisgKiBtaW4gLSBpbnQ2NF90LCBtaW5pbXVt IHZhbHVlIG9mIHRoZSBjb250cm9sLgorICogbWF4IC0gaW50NjRfdCwgbWF4aW11bSB2YWx1ZSBv ZiB0aGUgY29udHJvbC4KKyAqIHN0ZXAgLSBpbnQ2NF90LCBtaW5pbXVtIHNpemUgaW4gd2hpY2gg Y29udHJvbCB2YWx1ZSBjYW4gYmUgY2hhbmdlZC4KKyAqIGRlZl92YWwgLSBpbnQ2NF90LCBkZWZh dWx0IHZhbHVlIG9mIHRoZSBjb250cm9sLgorICovCitzdHJ1Y3QgeGVuY2FtZXJhX2N0cmxfZW51 bV9yZXNwIHsKKyAgICB1aW50OF90IGluZGV4OworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50 OF90IHJlc2VydmVkWzJdOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGludDY0X3QgbWluOwor ICAgIGludDY0X3QgbWF4OworICAgIGludDY0X3Qgc3RlcDsKKyAgICBpbnQ2NF90IGRlZl92YWw7 Cit9OworCisvKgorICogR2V0IGNvbnRyb2wgcmVzcG9uc2UgLSByZXNwb25zZSBmb3IgWEVOQ0FN RVJBX09QX0NUUkxfR0VUOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAg ICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQ1RSTF9HRVQgICB8ICAg IHJlc2VydmVkICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8ICAgICAgIHR5cGUgICAgIHwgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDE2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsb3cgMzItYml0 ICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaGlnaCAzMi1iaXQgICAgICAgICAgICAgICAgICAg ICAgICB8IDI4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMgorICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiB0eXBlIC0gdWludDhfdCwgdHlwZSBvZiB0aGUg Y29udHJvbCwgb25lIG9mIHRoZSBYRU5DQU1FUkFfQ1RSTF9YWFguCisgKiB2YWx1ZSAtIGludDY0 X3QsIG5ldyB2YWx1ZSBvZiB0aGUgY29udHJvbC4KKyAqLworCisvKgorICotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFdmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICoKKyAqIEV2ZW50cyBhcmUgc2VudCB2aWEgYSBzaGFyZWQgcGFnZSBhbGxvY2F0 ZWQgYnkgdGhlIGZyb250IGFuZCBwcm9wYWdhdGVkIGJ5CisgKiAgIGV2dC1ldmVudC1jaGFubmVs L2V2dC1yaW5nLXJlZiBYZW5TdG9yZSBlbnRyaWVzLgorICoKKyAqIEFsbCBldmVudCBwYWNrZXRz IGhhdmUgdGhlIHNhbWUgbGVuZ3RoICg2NCBvY3RldHMpLgorICogQWxsIGV2ZW50IHBhY2tldHMg aGF2ZSBjb21tb24gaGVhZGVyOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAg ICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCAgICAgIHR5cGUgICAgICB8 ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKgorICogaWQgLSB1aW50MTZfdCwgZXZlbnQgaWQsIG1heSBiZSB1 c2VkIGJ5IGZyb250LgorICogdHlwZSAtIHVpbnQ4X3QsIHR5cGUgb2YgdGhlIGV2ZW50LgorICoK KyAqCisgKiBGcmFtZSBjYXB0dXJlZCBldmVudCAtIGV2ZW50IGZyb20gYmFjayB0byBmcm9udCB3 aGVuIGEgbmV3IGNhcHR1cmVkCisgKiBmcmFtZSBpcyBhdmFpbGFibGU6CisgKiAgICAgICAgIDAg ICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAg IG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAg ICAgICB8X0VWVF9GUkFNRV9BVkFJTHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICBpbmRleCAg ICAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgfCAx MgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNl ZF9zeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcV9udW0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDIwCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBpbmRleCAtIHVpbnQ4X3QsIGlu ZGV4IG9mIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyBuZXcgY2FwdHVyZWQgZnJhbWUsCisgKiAg IHNlZSBYRU5DQU1FUkFfT1BfQlVGX0NSRUFURSBkZXNjcmlwdGlvbiBvbiB0aGUgcmFuZ2UKKyAq IHVzZWRfc3ogLSB1aW50MzJfdCwgbnVtYmVyIG9mIG9jdGV0cyB0aGlzIGZyYW1lIGhhcy4gVGhp cyBjYW4gYmUgbGVzcworICogdGhhbiB0aGUgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNULnNpemUg KHJlc3BvbnNlKSBmb3IgY29tcHJlc3NlZCBmb3JtYXRzLgorICogc2VxX251bSAtIHVpbnQzMl90 LCBzZXF1ZW50aWFsIG51bWJlciBvZiB0aGUgZnJhbWUuIE11c3QgYmUKKyAqICAgbW9ub3Rvbmlj YWxseSBpbmNyZWFzaW5nLiBJZiBza2lwcyBhcmUgZGV0ZWN0ZWQgaW4gc2VxX251bSB0aGVuIHRo YXQKKyAqICAgbWVhbnMgdGhhdCB0aGUgZnJhbWVzIGluLWJldHdlZW4gd2VyZSBkcm9wcGVkLiBO b3RlIGhvd2V2ZXIgdGhhdCBub3QKKyAqICAgYWxsIHZpZGVvIGNhcHR1cmUgaGFyZHdhcmUgaXMg Y2FwYWJsZSBvZiBkZXRlY3RpbmcgZHJvcHBlZCBmcmFtZXMuCisgKiAgIEluIHRoYXQgY2FzZSB0 aGVyZSB3aWxsIGJlIG5vIHNraXBzIGluIHRoZSBzZXF1ZW5jZSBjb3VudGVyLgorICovCitzdHJ1 Y3QgeGVuY2FtZXJhX2ZyYW1lX2F2YWlsX2V2dCB7CisgICAgdWludDhfdCBpbmRleDsKKyAgICB1 aW50OF90IHJlc2VydmVkWzNdOworICAgIHVpbnQzMl90IHVzZWRfc3o7CisgICAgdWludDMyX3Qg c2VxX251bTsKK307CisKKy8qCisgKiBDb250cm9sIGNoYW5nZSBldmVudC0gZXZlbnQgZnJvbSBi YWNrIHRvIGZyb250IHdoZW4gY2FtZXJhIGNvbnRyb2wKKyAqIGhhcyBjaGFuZ2VkOgorICogICAg ICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAz ICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAg ICAgICAgICAgICAgfF9FVlRfQ1RSTF9DSEFOR0V8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgIHR5cGUgICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2CisgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxvdyAzMi1iaXQgICAg ICAgICAgICAgICAgICAgICAgICAgfCAyMAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAg ICAgICAgICAgICAgICAgICB2YWx1ZSBoaWdoIDMyLWJpdCAgICAgICAgICAgICAgICAgICAgICAg IHwgMjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI4CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICoKKyAqIHR5cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBjb250 cm9sLCBvbmUgb2YgdGhlIFhFTkNBTUVSQV9DVFJMX1hYWC4KKyAqIHZhbHVlIC0gaW50NjRfdCwg bmV3IHZhbHVlIG9mIHRoZSBjb250cm9sLgorICoKKyAqIE5vdGVzOgorICogIC0gdGhpcyBldmVu dCBpcyBub3Qgc2VudCBmb3Igd3JpdGUtb25seSBjb250cm9scworICogIC0gdGhpcyBldmVudCBp cyBub3Qgc2VudCB0byB0aGUgb3JpZ2luYXRvciBvZiB0aGUgY29udHJvbCBjaGFuZ2UKKyAqICAt IHRoaXMgZXZlbnQgaXMgbm90IHNlbnQgd2hlbiBmcm9udGVuZCBmaXJzdCBjb25uZWN0cywgZS5n LiBpbml0aWFsCisgKiAgICBjb250cm9sIHN0YXRlIG11c3QgYmUgZXhwbGljaXRseSBxdWVyaWVk CisgKi8KKworc3RydWN0IHhlbmNhbWVyYV9yZXEgeworICAgIHVpbnQxNl90IGlkOworICAgIHVp bnQ4X3Qgb3BlcmF0aW9uOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07CisgICAgdW5pb24gewor ICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2NvbmZpZ19yZXEgY29uZmlnOworICAgICAgICBzdHJ1 Y3QgeGVuY2FtZXJhX2ZyYW1lX3JhdGVfcmVxIGZyYW1lX3JhdGU7CisgICAgICAgIHN0cnVjdCB4 ZW5jYW1lcmFfYnVmX3JlcXVlc3QgYnVmX3JlcXVlc3Q7CisgICAgICAgIHN0cnVjdCB4ZW5jYW1l cmFfYnVmX2NyZWF0ZV9yZXEgYnVmX2NyZWF0ZTsKKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9p bmRleCBpbmRleDsKKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9jdHJsX3ZhbHVlIGN0cmxfdmFs dWU7CisgICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfZ2V0X2N0cmxfcmVxIGdldF9jdHJsOworICAg ICAgICB1aW50OF90IHJlc2VydmVkWzU2XTsKKyAgICB9IHJlcTsKK307CisKK3N0cnVjdCB4ZW5j YW1lcmFfcmVzcCB7CisgICAgdWludDE2X3QgaWQ7CisgICAgdWludDhfdCBvcGVyYXRpb247Cisg ICAgdWludDhfdCByZXNlcnZlZDsKKyAgICBpbnQzMl90IHN0YXR1czsKKyAgICB1bmlvbiB7Cisg ICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfY29uZmlnX3Jlc3AgY29uZmlnOworICAgICAgICBzdHJ1 Y3QgeGVuY2FtZXJhX2J1Zl9nZXRfbGF5b3V0X3Jlc3AgYnVmX2xheW91dDsKKyAgICAgICAgc3Ry dWN0IHhlbmNhbWVyYV9idWZfcmVxdWVzdCBidWZfcmVxdWVzdDsKKyAgICAgICAgc3RydWN0IHhl bmNhbWVyYV9jdHJsX2VudW1fcmVzcCBjdHJsX2VudW07CisgICAgICAgIHN0cnVjdCB4ZW5jYW1l cmFfY3RybF92YWx1ZSBjdHJsX3ZhbHVlOworICAgICAgICB1aW50OF90IHJlc2VydmVkMVs1Nl07 CisgICAgfSByZXNwOworfTsKKworc3RydWN0IHhlbmNhbWVyYV9ldnQgeworICAgIHVpbnQxNl90 IGlkOworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IHJlc2VydmVkWzVdOworICAgIHVu aW9uIHsKKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9mcmFtZV9hdmFpbF9ldnQgZnJhbWVfYXZh aWw7CisgICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfY3RybF92YWx1ZSBjdHJsX3ZhbHVlOworICAg ICAgICB1aW50OF90IHJlc2VydmVkWzU2XTsKKyAgICB9IGV2dDsKK307CisKK0RFRklORV9SSU5H X1RZUEVTKHhlbl9jYW1lcmFpZiwgc3RydWN0IHhlbmNhbWVyYV9yZXEsIHN0cnVjdCB4ZW5jYW1l cmFfcmVzcCk7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAg ICAgICAgICAgIEJhY2sgdG8gZnJvbnQgZXZlbnRzIGRlbGl2ZXJ5CisgKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCisgKiBJbiBvcmRlciB0byBkZWxpdmVyIGFzeW5jaHJvbm91cyBldmVudHMgZnJvbSBi YWNrIHRvIGZyb250IGEgc2hhcmVkIHBhZ2UgaXMKKyAqIGFsbG9jYXRlZCBieSBmcm9udCBhbmQg aXRzIGdyYW50ZWQgcmVmZXJlbmNlIHByb3BhZ2F0ZWQgdG8gYmFjayB2aWEKKyAqIFhlblN0b3Jl IGVudHJpZXMgKGV2dC1yaW5nLXJlZi9ldnQtZXZlbnQtY2hhbm5lbCkuCisgKiBUaGlzIHBhZ2Ug aGFzIGEgY29tbW9uIGhlYWRlciB1c2VkIGJ5IGJvdGggZnJvbnQgYW5kIGJhY2sgdG8gc3luY2hy b25pemUKKyAqIGFjY2VzcyBhbmQgY29udHJvbCBldmVudCdzIHJpbmcgYnVmZmVyLCB3aGlsZSBi YWNrIGJlaW5nIGEgcHJvZHVjZXIgb2YgdGhlCisgKiBldmVudHMgYW5kIGZyb250IGJlaW5nIGEg Y29uc3VtZXIuIFRoZSByZXN0IG9mIHRoZSBwYWdlIGFmdGVyIHRoZSBoZWFkZXIKKyAqIGlzIHVz ZWQgZm9yIGV2ZW50IHBhY2tldHMuCisgKgorICogVXBvbiByZWNlcHRpb24gb2YgYW4gZXZlbnQo cykgZnJvbnQgbWF5IGNvbmZpcm0gaXRzIHJlY2VwdGlvbgorICogZm9yIGVpdGhlciBlYWNoIGV2 ZW50LCBncm91cCBvZiBldmVudHMgb3Igbm9uZS4KKyAqLworCitzdHJ1Y3QgeGVuY2FtZXJhX2V2 ZW50X3BhZ2UgeworICAgIHVpbnQzMl90IGluX2NvbnM7CisgICAgdWludDMyX3QgaW5fcHJvZDsK KyAgICB1aW50OF90IHJlc2VydmVkWzU2XTsKK307CisKKyNkZWZpbmUgWEVOQ0FNRVJBX0VWRU5U X1BBR0VfU0laRSA0MDk2CisjZGVmaW5lIFhFTkNBTUVSQV9JTl9SSU5HX09GRlMgKHNpemVvZihz dHJ1Y3QgeGVuY2FtZXJhX2V2ZW50X3BhZ2UpKQorI2RlZmluZSBYRU5DQU1FUkFfSU5fUklOR19T SVpFIChYRU5DQU1FUkFfRVZFTlRfUEFHRV9TSVpFIC0gWEVOQ0FNRVJBX0lOX1JJTkdfT0ZGUykK KyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkdfTEVOIChYRU5DQU1FUkFfSU5fUklOR19TSVpFIC8g c2l6ZW9mKHN0cnVjdCB4ZW5jYW1lcmFfZXZ0KSkKKyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkco cGFnZSkgXAorICAgICgoc3RydWN0IHhlbmNhbWVyYV9ldnQgKikoKGNoYXIgKikocGFnZSkgKyBY RU5DQU1FUkFfSU5fUklOR19PRkZTKSkKKyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkdfUkVGKHBh Z2UsIGlkeCkgXAorICAgIChYRU5DQU1FUkFfSU5fUklORygocGFnZSkpWyhpZHgpICUgWEVOQ0FN RVJBX0lOX1JJTkdfTEVOXSkKKworI2VuZGlmIC8qIF9fWEVOX1BVQkxJQ19JT19DQU1FUkFJRl9I X18gKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIG1vZGU6IEMKKyAqIGMtZmlsZS1z dHlsZTogIkJTRCIKKyAqIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiB0YWItd2lkdGg6IDQKKyAqIGlu ZGVudC10YWJzLW1vZGU6IG5pbAorICogRW5kOgorICovCi0tIAoyLjIxLjAKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBs aXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2pl Y3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRldmVs