From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thorsten Jolitz Subject: ORG and ASCII documentation for ox.el Date: Tue, 18 Jun 2013 15:36:16 +0200 Message-ID: <87d2rjlewf.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:52245) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uow5a-0005vf-SI for emacs-orgmode@gnu.org; Tue, 18 Jun 2013 09:37:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Uow5N-0004mv-GJ for emacs-orgmode@gnu.org; Tue, 18 Jun 2013 09:36:50 -0400 Received: from plane.gmane.org ([80.91.229.3]:35314) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uow5J-0004ln-Nc for emacs-orgmode@gnu.org; Tue, 18 Jun 2013 09:36:37 -0400 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1Uow5H-00080j-0Q for emacs-orgmode@gnu.org; Tue, 18 Jun 2013 15:36:31 +0200 Received: from e178188064.adsl.alicedsl.de ([85.178.188.64]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 18 Jun 2013 15:36:30 +0200 Received: from tjolitz by e178188064.adsl.alicedsl.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 18 Jun 2013 15:36:30 +0200 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain see attached documents: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Disposition: inline; filename=ox-docstrings.txt Content-Transfer-Encoding: 8bit Content-Description: Docstrings from ox.el _________________________ DOCSTRINGS FROM 'OX.EL' Thorsten Jolitz _________________________ Table of Contents _________________ ox.el --- Generic Export Engine for Org Mode Commentary: Code: Internal Variables User-configurable Variables Defining Back-ends The Communication Channel .. Environment Options .. Tree Properties The Transcoder The Filter System .. Hooks .. Special Filters .. Elements Filters .. Objects Filters .. Filters Tools Core functions Tools For Back-Ends .. For Affiliated Keywords .. For Derived Back-ends .. For Export Snippets .. For Footnotes .. For Headlines .. For Keywords .. For Links .. For References .. For Src-Blocks .. For Tables .. For Tables Of Contents .. Smart Quotes .. Topology .. Translation Asynchronous Export The Dispatcher ox.el ends here [{Back to Worg's index}] [{Back to Worg's index}] file:index.org ox.el --- Generic Export Engine for Org Mode ============================================ Copyright (C) 2012, 2013 Free Software Foundation, Inc. Author: Nicolas Goaziou Keywords: outlines, hypermedia, calendar, wp GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see [http://www.gnu.org/licenses/]. Commentary: =========== This library implements a generic export engine for Org, built on its syntactical parser: Org Elements. Besides that parser, the generic exporter is made of three distinct parts: - The communication channel consists in a property list, which is created and updated during the process. Its use is to offer every piece of information, would it be about initial environment or contextual data, all in a single place. The exhaustive list of properties is given in "The Communication Channel" section of this file. - The transcoder walks the parse tree, ignores or treat as plain text elements and objects according to export options, and eventually calls back-end specific functions to do the real transcoding, concatenating their return value along the way. - The filter system is activated at the very beginning and the very end of the export process, and each time an element or an object has been converted. It is the entry point to fine-tune standard output from back-end transcoders. See "The Filter System" section for more information. The core function is `org-export-as'. It returns the transcoded buffer as a string. An export back-end is defined with `org-export-define-backend', which defines one mandatory information: his translation table. Its value is an alist whose keys are elements and objects types and values translator functions. See function's docstring for more information about translators. Optionally, `org-export-define-backend' can also support specific buffer keywords, OPTION keyword's items and filters. Also refer to function documentation for more information. If the new back-end shares most properties with another one, `org-export-define-derived-backend' can be used to simplify the process. Any back-end can define its own variables. Among them, those customizable should belong to the `org-export-BACKEND' group. Tools for common tasks across back-ends are implemented in the following part of the file. Then, a wrapper macro for asynchronous export, `org-export-async-start', along with tools to display results. are given in the penultimate part. Eventually, a dispatcher (`org-export-dispatch') for standard back-ends is provided in the last one. Code: ===== ,---- | (eval-when-compile (require 'cl)) | (require 'org-element) | (require 'org-macro) | (require 'ob-exp) | | (declare-function org-publish "ox-publish" (project &optional force async)) | (declare-function org-publish-all "ox-publish" (&optional force async)) | (declare-function | org-publish-current-file "ox-publish" (&optional force async)) | (declare-function org-publish-current-project "ox-publish" | (&optional force async)) | | (defvar org-publish-project-alist) | (defvar org-table-number-fraction) | (defvar org-table-number-regexp) `---- Internal Variables ================== Among internal variables, the most important is `org-export-options-alist'. This variable define the global export options, shared between every exporter, and how they are acquired. ,---- | (defconst org-export-max-depth 19 | "Maximum nesting depth for headlines, counting from 0.") | | (defconst org-export-options-alist | '((:author "AUTHOR" nil user-full-name t) | (:creator "CREATOR" nil org-export-creator-string) | (:date "DATE" nil nil t) | (:description "DESCRIPTION" nil nil newline) | (:email "EMAIL" nil user-mail-address t) | (:exclude-tags "EXCLUDE_TAGS" nil org-export-exclude-tags split) | (:headline-levels nil "H" org-export-headline-levels) | (:keywords "KEYWORDS" nil nil space) | (:language "LANGUAGE" nil org-export-default-language t) | (:preserve-breaks nil "\\n" org-export-preserve-breaks) | (:section-numbers nil "num" org-export-with-section-numbers) | (:select-tags "SELECT_TAGS" nil org-export-select-tags split) | (:time-stamp-file nil "timestamp" org-export-time-stamp-file) | (:title "TITLE" nil org-export--default-title space) | (:with-archived-trees nil "arch" org-export-with-archived-trees) | (:with-author nil "author" org-export-with-author) | (:with-clocks nil "c" org-export-with-clocks) | (:with-creator nil "creator" org-export-with-creator) | (:with-date nil "date" org-export-with-date) | (:with-drawers nil "d" org-export-with-drawers) | (:with-email nil "email" org-export-with-email) | (:with-emphasize nil "*" org-export-with-emphasize) | (:with-entities nil "e" org-export-with-entities) | (:with-fixed-width nil ":" org-export-with-fixed-width) | (:with-footnotes nil "f" org-export-with-footnotes) | (:with-inlinetasks nil "inline" org-export-with-inlinetasks) | (:with-latex nil "tex" org-export-with-latex) | (:with-planning nil "p" org-export-with-planning) | (:with-priority nil "pri" org-export-with-priority) | (:with-smart-quotes nil "'" org-export-with-smart-quotes) | (:with-special-strings nil "-" org-export-with-special-strings) | (:with-statistics-cookies nil "stat" org-export-with-statistics-cookies) | (:with-sub-superscript nil "^" org-export-with-sub-superscripts) | (:with-toc nil "toc" org-export-with-toc) | (:with-tables nil "|" org-export-with-tables) | (:with-tags nil "tags" org-export-with-tags) | (:with-tasks nil "tasks" org-export-with-tasks) | (:with-timestamps nil "<" org-export-with-timestamps) | (:with-todo-keywords nil "todo" org-export-with-todo-keywords)) | "Alist between export properties and ways to set them. | | The CAR of the alist is the property name, and the CDR is a list | like (KEYWORD OPTION DEFAULT BEHAVIOUR) where: | | KEYWORD is a string representing a buffer keyword, or nil. Each | property defined this way can also be set, during subtree | export, through a headline property named after the keyword | with the \"EXPORT_\" prefix (i.e. DATE keyword and EXPORT_DATE | property). | OPTION is a string that could be found in an #+OPTIONS: line. | DEFAULT is the default value for the property. | BEHAVIOUR determines how Org should handle multiple keywords for | the same property. It is a symbol among: | nil Keep old value and discard the new one. | t Replace old value with the new one. | `space' Concatenate the values, separating them with a space. | `newline' Concatenate the values, separating them with | a newline. | `split' Split values at white spaces, and cons them to the | previous list. | | Values set through KEYWORD and OPTION have precedence over | DEFAULT. | | All these properties should be back-end agnostic. Back-end | specific properties are set through `org-export-define-backend'. | Properties redefined there have precedence over these.") | | (defconst org-export-special-keywords '("FILETAGS" "SETUPFILE" "OPTIONS") | "List of in-buffer keywords that require special treatment. | These keywords are not directly associated to a property. The | way they are handled must be hard-coded into | `org-export--get-inbuffer-options' function.") | | (defconst org-export-filters-alist | '((:filter-bold . org-export-filter-bold-functions) | (:filter-babel-call . org-export-filter-babel-call-functions) | (:filter-center-block . org-export-filter-center-block-functions) | (:filter-clock . org-export-filter-clock-functions) | (:filter-code . org-export-filter-code-functions) | (:filter-comment . org-export-filter-comment-functions) | (:filter-comment-block . org-export-filter-comment-block-functions) | (:filter-diary-sexp . org-export-filter-diary-sexp-functions) | (:filter-drawer . org-export-filter-drawer-functions) | (:filter-dynamic-block . org-export-filter-dynamic-block-functions) | (:filter-entity . org-export-filter-entity-functions) | (:filter-example-block . org-export-filter-example-block-functions) | (:filter-export-block . org-export-filter-export-block-functions) | (:filter-export-snippet . org-export-filter-export-snippet-functions) | (:filter-final-output . org-export-filter-final-output-functions) | (:filter-fixed-width . org-export-filter-fixed-width-functions) | (:filter-footnote-definition . org-export-filter-footnote-definition-functions) | (:filter-footnote-reference . org-export-filter-footnote-reference-functions) | (:filter-headline . org-export-filter-headline-functions) | (:filter-horizontal-rule . org-export-filter-horizontal-rule-functions) | (:filter-inline-babel-call . org-export-filter-inline-babel-call-functions) | (:filter-inline-src-block . org-export-filter-inline-src-block-functions) | (:filter-inlinetask . org-export-filter-inlinetask-functions) | (:filter-italic . org-export-filter-italic-functions) | (:filter-item . org-export-filter-item-functions) | (:filter-keyword . org-export-filter-keyword-functions) | (:filter-latex-environment . org-export-filter-latex-environment-functions) | (:filter-latex-fragment . org-export-filter-latex-fragment-functions) | (:filter-line-break . org-export-filter-line-break-functions) | (:filter-link . org-export-filter-link-functions) | (:filter-node-property . org-export-filter-node-property-functions) | (:filter-options . org-export-filter-options-functions) | (:filter-paragraph . org-export-filter-paragraph-functions) | (:filter-parse-tree . org-export-filter-parse-tree-functions) | (:filter-plain-list . org-export-filter-plain-list-functions) | (:filter-plain-text . org-export-filter-plain-text-functions) | (:filter-planning . org-export-filter-planning-functions) | (:filter-property-drawer . org-export-filter-property-drawer-functions) | (:filter-quote-block . org-export-filter-quote-block-functions) | (:filter-quote-section . org-export-filter-quote-section-functions) | (:filter-radio-target . org-export-filter-radio-target-functions) | (:filter-section . org-export-filter-section-functions) | (:filter-special-block . org-export-filter-special-block-functions) | (:filter-src-block . org-export-filter-src-block-functions) | (:filter-statistics-cookie . org-export-filter-statistics-cookie-functions) | (:filter-strike-through . org-export-filter-strike-through-functions) | (:filter-subscript . org-export-filter-subscript-functions) | (:filter-superscript . org-export-filter-superscript-functions) | (:filter-table . org-export-filter-table-functions) | (:filter-table-cell . org-export-filter-table-cell-functions) | (:filter-table-row . org-export-filter-table-row-functions) | (:filter-target . org-export-filter-target-functions) | (:filter-timestamp . org-export-filter-timestamp-functions) | (:filter-underline . org-export-filter-underline-functions) | (:filter-verbatim . org-export-filter-verbatim-functions) | (:filter-verse-block . org-export-filter-verse-block-functions)) | "Alist between filters properties and initial values. | | The key of each association is a property name accessible through | the communication channel. Its value is a configurable global | variable defining initial filters. | | This list is meant to install user specified filters. Back-end | developers may install their own filters using | `org-export-define-backend'. Filters defined there will always | be prepended to the current list, so they always get applied | first.") | | (defconst org-export-default-inline-image-rule | `(("file" . | ,(format "\\.%s\\'" | (regexp-opt | '("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" | "xpm" "pbm" "pgm" "ppm") t)))) | "Default rule for link matching an inline image. | This rule applies to links with no description. By default, it | will be considered as an inline image if it targets a local file | whose extension is either \"png\", \"jpeg\", \"jpg\", \"gif\", | \"tiff\", \"tif\", \"xbm\", \"xpm\", \"pbm\", \"pgm\" or \"ppm\". | See `org-export-inline-image-p' for more information about | rules.") | | (defvar org-export-async-debug nil | "Non-nil means asynchronous export process should leave data behind. | | This data is found in the appropriate \"*Org Export Process*\" | buffer, and in files prefixed with \"org-export-process\" and | located in `temporary-file-directory'. | | When non-nil, it will also set `debug-on-error' to a non-nil | value in the external process.") | | (defvar org-export-stack-contents nil | "Record asynchronously generated export results and processes. | This is an alist: its CAR is the source of the | result (destination file or buffer for a finished process, | original buffer for a running one) and its CDR is a list | containing the back-end used, as a symbol, and either a process | or the time at which it finished. It is used to build the menu | from `org-export-stack'.") | | (defvar org-export-registered-backends nil | "List of backends currently available in the exporter. | | A backend is stored as a list where CAR is its name, as a symbol, | and CDR is a plist with the following properties: | `:filters-alist', `:menu-entry', `:options-alist' and | `:translate-alist'. | | This variable is set with `org-export-define-backend' and | `org-export-define-derived-backend' functions.") | | (defvar org-export-dispatch-last-action nil | "Last command called from the dispatcher. | The value should be a list. Its CAR is the action, as a symbol, | and its CDR is a list of export options.") | | (defvar org-export-dispatch-last-position (make-marker) | "The position where the last export command was created using the dispatcher. | This marker will be used with `C-u C-c C-e' to make sure export repetition | uses the same subtree if the previous command was restricted to a subtree.") `---- User-configurable Variables =========================== Configuration for the masses. They should never be accessed directly, as their value is to be stored in a property list (cf. `org-export-options-alist'). Back-ends will read their value from there instead. ,---- | (defgroup org-export nil | "Options for exporting Org mode files." | :tag "Org Export" | :group 'org) | | (defgroup org-export-general nil | "General options for export engine." | :tag "Org Export General" | :group 'org-export) | | (defcustom org-export-with-archived-trees 'headline | "Whether sub-trees with the ARCHIVE tag should be exported. | | This can have three different values: | nil Do not export, pretend this tree is not present. | t Do export the entire tree. | `headline' Only export the headline, but skip the tree below it. | | This option can also be set with the OPTIONS keyword, | e.g. \"arch:nil\"." | :group 'org-export-general | :type '(choice | (const :tag "Not at all" nil) | (const :tag "Headline only" headline) | (const :tag "Entirely" t))) | | (defcustom org-export-with-author t | "Non-nil means insert author name into the exported file. | This option can also be set with the OPTIONS keyword, | e.g. \"author:nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-clocks nil | "Non-nil means export CLOCK keywords. | This option can also be set with the OPTIONS keyword, | e.g. \"c:t\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-creator 'comment | "Non-nil means the postamble should contain a creator sentence. | | The sentence can be set in `org-export-creator-string' and | defaults to \"Generated by Org mode XX in Emacs XXX.\". | | If the value is `comment' insert it as a comment." | :group 'org-export-general | :type '(choice | (const :tag "No creator sentence" nil) | (const :tag "Sentence as a comment" 'comment) | (const :tag "Insert the sentence" t))) | | (defcustom org-export-with-date t | "Non-nil means insert date in the exported document. | This option can also be set with the OPTIONS keyword, | e.g. \"date:nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-date-timestamp-format nil | "Time-stamp format string to use for DATE keyword. | | The format string, when specified, only applies if date consists | in a single time-stamp. Otherwise its value will be ignored. | | See `format-time-string' for details on how to build this | string." | :group 'org-export-general | :type '(choice | (string :tag "Time-stamp format string") | (const :tag "No format string" nil))) | | (defcustom org-export-creator-string | (format "Emacs %s (Org mode %s)" | emacs-version | (if (fboundp 'org-version) (org-version) "unknown version")) | "Information about the creator of the document. | This option can also be set on with the CREATOR keyword." | :group 'org-export-general | :type '(string :tag "Creator string")) | | (defcustom org-export-with-drawers '(not "LOGBOOK") | "Non-nil means export contents of standard drawers. | | When t, all drawers are exported. This may also be a list of | drawer names to export. If that list starts with `not', only | drawers with such names will be ignored. | | This variable doesn't apply to properties drawers. | | This option can also be set with the OPTIONS keyword, | e.g. \"d:nil\"." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type '(choice | (const :tag "All drawers" t) | (const :tag "None" nil) | (repeat :tag "Selected drawers" | (string :tag "Drawer name")) | (list :tag "Ignored drawers" | (const :format "" not) | (repeat :tag "Specify names of drawers to ignore during export" | :inline t | (string :tag "Drawer name"))))) | | (defcustom org-export-with-email nil | "Non-nil means insert author email into the exported file. | This option can also be set with the OPTIONS keyword, | e.g. \"email:t\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-emphasize t | "Non-nil means interpret *word*, /word/, _word_ and +word+. | | If the export target supports emphasizing text, the word will be | typeset in bold, italic, with an underline or strike-through, | respectively. | | This option can also be set with the OPTIONS keyword, | e.g. \"*:nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-exclude-tags '("noexport") | "Tags that exclude a tree from export. | | All trees carrying any of these tags will be excluded from | export. This is without condition, so even subtrees inside that | carry one of the `org-export-select-tags' will be removed. | | This option can also be set with the EXCLUDE_TAGS keyword." | :group 'org-export-general | :type '(repeat (string :tag "Tag"))) | | (defcustom org-export-with-fixed-width t | "Non-nil means lines starting with \":\" will be in fixed width font. | | This can be used to have pre-formatted text, fragments of code | etc. For example: | : ;; Some Lisp examples | : (while (defc cnt) | : (ding)) | will be looking just like this in also HTML. See also the QUOTE | keyword. Not all export backends support this. | | This option can also be set with the OPTIONS keyword, | e.g. \"::nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-footnotes t | "Non-nil means Org footnotes should be exported. | This option can also be set with the OPTIONS keyword, | e.g. \"f:nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-latex t | "Non-nil means process LaTeX environments and fragments. | | This option can also be set with the OPTIONS line, | e.g. \"tex:verbatim\". Allowed values are: | | nil Ignore math snippets. | `verbatim' Keep everything in verbatim. | t Allow export of math snippets." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type '(choice | (const :tag "Do not process math in any way" nil) | (const :tag "Interpret math snippets" t) | (const :tag "Leave math verbatim" verbatim))) | | (defcustom org-export-headline-levels 3 | "The last level which is still exported as a headline. | | Inferior levels will usually produce itemize or enumerate lists | when exported, but back-end behaviour may differ. | | This option can also be set with the OPTIONS keyword, | e.g. \"H:2\"." | :group 'org-export-general | :type 'integer) | | (defcustom org-export-default-language "en" | "The default language for export and clocktable translations, as a string. | This may have an association in | `org-clock-clocktable-language-setup'. This option can also be | set with the LANGUAGE keyword." | :group 'org-export-general | :type '(string :tag "Language")) | | (defcustom org-export-preserve-breaks nil | "Non-nil means preserve all line breaks when exporting. | This option can also be set with the OPTIONS keyword, | e.g. \"\\n:t\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-entities t | "Non-nil means interpret entities when exporting. | | For example, HTML export converts \\alpha to α and \\AA to | Å. | | For a list of supported names, see the constant `org-entities' | and the user option `org-entities-user'. | | This option can also be set with the OPTIONS keyword, | e.g. \"e:nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-inlinetasks t | "Non-nil means inlinetasks should be exported. | This option can also be set with the OPTIONS keyword, | e.g. \"inline:nil\"." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type 'boolean) | | (defcustom org-export-with-planning nil | "Non-nil means include planning info in export. | | Planning info is the line containing either SCHEDULED:, | DEADLINE:, CLOSED: time-stamps, or a combination of them. | | This option can also be set with the OPTIONS keyword, | e.g. \"p:t\"." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type 'boolean) | | (defcustom org-export-with-priority nil | "Non-nil means include priority cookies in export. | This option can also be set with the OPTIONS keyword, | e.g. \"pri:t\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-section-numbers t | "Non-nil means add section numbers to headlines when exporting. | | When set to an integer n, numbering will only happen for | headlines whose relative level is higher or equal to n. | | This option can also be set with the OPTIONS keyword, | e.g. \"num:t\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-select-tags '("export") | "Tags that select a tree for export. | | If any such tag is found in a buffer, all trees that do not carry | one of these tags will be ignored during export. Inside trees | that are selected like this, you can still deselect a subtree by | tagging it with one of the `org-export-exclude-tags'. | | This option can also be set with the SELECT_TAGS keyword." | :group 'org-export-general | :type '(repeat (string :tag "Tag"))) | | (defcustom org-export-with-smart-quotes nil | "Non-nil means activate smart quotes during export. | This option can also be set with the OPTIONS keyword, | e.g., \"':t\". | | When setting this to non-nil, you need to take care of | using the correct Babel package when exporting to LaTeX. | E.g., you can load Babel for french like this: | | #+LATEX_HEADER: \\usepackage[french]{babel}" | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type 'boolean) | | (defcustom org-export-with-special-strings t | "Non-nil means interpret \"\\-\", \"--\" and \"---\" for export. | | When this option is turned on, these strings will be exported as: | | Org HTML LaTeX UTF-8 | -----+----------+--------+------- | \\- ­ \\- | -- – -- – | --- — --- — | ... … \\ldots … | | This option can also be set with the OPTIONS keyword, | e.g. \"-:nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-statistics-cookies t | "Non-nil means include statistics cookies in export. | This option can also be set with the OPTIONS keyword, | e.g. \"stat:nil\"" | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type 'boolean) | | (defcustom org-export-with-sub-superscripts t | "Non-nil means interpret \"_\" and \"^\" for export. | | When this option is turned on, you can use TeX-like syntax for | sub- and superscripts. Several characters after \"_\" or \"^\" | will be considered as a single item - so grouping with {} is | normally not needed. For example, the following things will be | parsed as single sub- or superscripts. | | 10^24 or 10^tau several digits will be considered 1 item. | 10^-12 or 10^-tau a leading sign with digits or a word | x^2-y^3 will be read as x^2 - y^3, because items are | terminated by almost any nonword/nondigit char. | x_{i^2} or x^(2-i) braces or parenthesis do grouping. | | Still, ambiguity is possible - so when in doubt use {} to enclose | the sub/superscript. If you set this variable to the symbol | `{}', the braces are *required* in order to trigger | interpretations as sub/superscript. This can be helpful in | documents that need \"_\" frequently in plain text. | | This option can also be set with the OPTIONS keyword, | e.g. \"^:nil\"." | :group 'org-export-general | :type '(choice | (const :tag "Interpret them" t) | (const :tag "Curly brackets only" {}) | (const :tag "Do not interpret them" nil))) | | (defcustom org-export-with-toc t | "Non-nil means create a table of contents in exported files. | | The TOC contains headlines with levels up | to`org-export-headline-levels'. When an integer, include levels | up to N in the toc, this may then be different from | `org-export-headline-levels', but it will not be allowed to be | larger than the number of headline levels. When nil, no table of | contents is made. | | This option can also be set with the OPTIONS keyword, | e.g. \"toc:nil\" or \"toc:3\"." | :group 'org-export-general | :type '(choice | (const :tag "No Table of Contents" nil) | (const :tag "Full Table of Contents" t) | (integer :tag "TOC to level"))) | | (defcustom org-export-with-tables t | "If non-nil, lines starting with \"|\" define a table. | For example: | | | Name | Address | Birthday | | |-------------+----------+-----------| | | Arthur Dent | England | 29.2.2100 | | | This option can also be set with the OPTIONS keyword, | e.g. \"|:nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-tags t | "If nil, do not export tags, just remove them from headlines. | | If this is the symbol `not-in-toc', tags will be removed from | table of contents entries, but still be shown in the headlines of | the document. | | This option can also be set with the OPTIONS keyword, | e.g. \"tags:nil\"." | :group 'org-export-general | :type '(choice | (const :tag "Off" nil) | (const :tag "Not in TOC" not-in-toc) | (const :tag "On" t))) | | (defcustom org-export-with-tasks t | "Non-nil means include TODO items for export. | | This may have the following values: | t include tasks independent of state. | `todo' include only tasks that are not yet done. | `done' include only tasks that are already done. | nil ignore all tasks. | list of keywords include tasks with these keywords. | | This option can also be set with the OPTIONS keyword, | e.g. \"tasks:nil\"." | :group 'org-export-general | :type '(choice | (const :tag "All tasks" t) | (const :tag "No tasks" nil) | (const :tag "Not-done tasks" todo) | (const :tag "Only done tasks" done) | (repeat :tag "Specific TODO keywords" | (string :tag "Keyword")))) | | (defcustom org-export-time-stamp-file t | "Non-nil means insert a time stamp into the exported file. | The time stamp shows when the file was created. This option can | also be set with the OPTIONS keyword, e.g. \"timestamp:nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-with-timestamps t | "Non nil means allow timestamps in export. | | It can be set to any of the following values: | t export all timestamps. | `active' export active timestamps only. | `inactive' export inactive timestamps only. | nil do not export timestamps | | This only applies to timestamps isolated in a paragraph | containing only timestamps. Other timestamps are always | exported. | | This option can also be set with the OPTIONS keyword, e.g. | \"<:nil\"." | :group 'org-export-general | :type '(choice | (const :tag "All timestamps" t) | (const :tag "Only active timestamps" active) | (const :tag "Only inactive timestamps" inactive) | (const :tag "No timestamp" nil))) | | (defcustom org-export-with-todo-keywords t | "Non-nil means include TODO keywords in export. | When nil, remove all these keywords from the export. This option | can also be set with the OPTIONS keyword, e.g. \"todo:nil\"." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-allow-bind-keywords nil | "Non-nil means BIND keywords can define local variable values. | This is a potential security risk, which is why the default value | is nil. You can also allow them through local buffer variables." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type 'boolean) | | (defcustom org-export-snippet-translation-alist nil | "Alist between export snippets back-ends and exporter back-ends. | | This variable allows to provide shortcuts for export snippets. | | For example, with a value of '\(\(\"h\" . \"html\"\)\), the | HTML back-end will recognize the contents of \"@@h:@@\" as | HTML code while every other back-end will ignore it." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type '(repeat | (cons (string :tag "Shortcut") | (string :tag "Back-end")))) | | (defcustom org-export-coding-system nil | "Coding system for the exported file." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type 'coding-system) | | (defcustom org-export-copy-to-kill-ring 'if-interactive | "Should we push exported content to the kill ring?" | :group 'org-export-general | :version "24.3" | :type '(choice | (const :tag "Always" t) | (const :tag "When export is done interactively" if-interactive) | (const :tag "Never" nil))) | | (defcustom org-export-initial-scope 'buffer | "The initial scope when exporting with `org-export-dispatch'. | This variable can be either set to `buffer' or `subtree'." | :group 'org-export-general | :type '(choice | (const :tag "Export current buffer" buffer) | (const :tag "Export current subtree" subtree))) | | (defcustom org-export-show-temporary-export-buffer t | "Non-nil means show buffer after exporting to temp buffer. | When Org exports to a file, the buffer visiting that file is ever | shown, but remains buried. However, when exporting to | a temporary buffer, that buffer is popped up in a second window. | When this variable is nil, the buffer remains buried also in | these cases." | :group 'org-export-general | :type 'boolean) | | (defcustom org-export-in-background nil | "Non-nil means export and publishing commands will run in background. | Results from an asynchronous export are never displayed | automatically. But you can retrieve them with \\[org-export-stack]." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type 'boolean) | | (defcustom org-export-async-init-file user-init-file | "File used to initialize external export process. | Value must be an absolute file name. It defaults to user's | initialization file. Though, a specific configuration makes the | process faster and the export more portable." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type '(file :must-match t)) | | (defcustom org-export-invisible-backends nil | "List of back-ends that shouldn't appear in the dispatcher. | | Any back-end belonging to this list or derived from a back-end | belonging to it will not appear in the dispatcher menu. | | Indeed, Org may require some export back-ends without notice. If | these modules are never to be used interactively, adding them | here will avoid cluttering the dispatcher menu." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type '(repeat (symbol :tag "Back-End"))) | | (defcustom org-export-dispatch-use-expert-ui nil | "Non-nil means using a non-intrusive `org-export-dispatch'. | In that case, no help buffer is displayed. Though, an indicator | for current export scope is added to the prompt (\"b\" when | output is restricted to body only, \"s\" when it is restricted to | the current subtree, \"v\" when only visible elements are | considered for export, \"f\" when publishing functions should be | passed the FORCE argument and \"a\" when the export should be | asynchronous). Also, \[?] allows to switch back to standard | mode." | :group 'org-export-general | :version "24.4" | :package-version '(Org . "8.0") | :type 'boolean) `---- Defining Back-ends ================== `org-export-define-backend' is the standard way to define an export back-end. It allows to specify translators, filters, buffer options and a menu entry. If the new back-end shares translators with another back-end, `org-export-define-derived-backend' may be used instead. Internally, a back-end is stored as a list, of which CAR is the name of the back-end, as a symbol, and CDR a plist. Accessors to properties of a given back-end are: `org-export-backend-filters', `org-export-backend-menu', `org-export-backend-options' and `org-export-backend-translate-table'. Eventually `org-export-barf-if-invalid-backend' returns an error when a given back-end hasn't been registered yet. ,---- | (defun org-export-define-backend (backend translators &rest body) | "Define a new back-end BACKEND. | | TRANSLATORS is an alist between object or element types and | functions handling them. | | These functions should return a string without any trailing | space, or nil. They must accept three arguments: the object or | element itself, its contents or nil when it isn't recursive and | the property list used as a communication channel. | | Contents, when not nil, are stripped from any global indentation | \(although the relative one is preserved). They also always end | with a single newline character. | | If, for a given type, no function is found, that element or | object type will simply be ignored, along with any blank line or | white space at its end. The same will happen if the function | returns the nil value. If that function returns the empty | string, the type will be ignored, but the blank lines or white | spaces will be kept. | | In addition to element and object types, one function can be | associated to the `template' (or `inner-template') symbol and | another one to the `plain-text' symbol. | | The former returns the final transcoded string, and can be used | to add a preamble and a postamble to document's body. It must | accept two arguments: the transcoded string and the property list | containing export options. A function associated to `template' | will not be applied if export has option \"body-only\". | A function associated to `inner-template' is always applied. | | The latter, when defined, is to be called on every text not | recognized as an element or an object. It must accept two | arguments: the text string and the information channel. It is an | appropriate place to protect special chars relative to the | back-end. | | BODY can start with pre-defined keyword arguments. The following | keywords are understood: | | :export-block | | String, or list of strings, representing block names that | will not be parsed. This is used to specify blocks that will | contain raw code specific to the back-end. These blocks | still have to be handled by the relative `export-block' type | translator. | | :filters-alist | | Alist between filters and function, or list of functions, | specific to the back-end. See `org-export-filters-alist' for | a list of all allowed filters. Filters defined here | shouldn't make a back-end test, as it may prevent back-ends | derived from this one to behave properly. | | :menu-entry | | Menu entry for the export dispatcher. It should be a list | like: | | '(KEY DESCRIPTION-OR-ORDINAL ACTION-OR-MENU) | | where : | | KEY is a free character selecting the back-end. | | DESCRIPTION-OR-ORDINAL is either a string or a number. | | If it is a string, is will be used to name the back-end in | its menu entry. If it is a number, the following menu will | be displayed as a sub-menu of the back-end with the same | KEY. Also, the number will be used to determine in which | order such sub-menus will appear (lowest first). | | ACTION-OR-MENU is either a function or an alist. | | If it is an action, it will be called with four | arguments (booleans): ASYNC, SUBTREEP, VISIBLE-ONLY and | BODY-ONLY. See `org-export-as' for further explanations on | some of them. | | If it is an alist, associations should follow the | pattern: | | '(KEY DESCRIPTION ACTION) | | where KEY, DESCRIPTION and ACTION are described above. | | Valid values include: | | '(?m \"My Special Back-end\" my-special-export-function) | | or | | '(?l \"Export to LaTeX\" | \(?p \"As PDF file\" org-latex-export-to-pdf) | \(?o \"As PDF file and open\" | \(lambda (a s v b) | \(if a (org-latex-export-to-pdf t s v b) | \(org-open-file | \(org-latex-export-to-pdf nil s v b))))))) | | or the following, which will be added to the previous | sub-menu, | | '(?l 1 | \((?B \"As TEX buffer (Beamer)\" org-beamer-export-as-latex) | \(?P \"As PDF file (Beamer)\" org-beamer-export-to-pdf))) | | :options-alist | | Alist between back-end specific properties introduced in | communication channel and how their value are acquired. See | `org-export-options-alist' for more information about | structure of the values.") | | (defun org-export-define-derived-backend (child parent &rest body) | "Create a new back-end as a variant of an existing one. | | CHILD is the name of the derived back-end. PARENT is the name of | the parent back-end. | | BODY can start with pre-defined keyword arguments. The following | keywords are understood: | | :export-block | | String, or list of strings, representing block names that | will not be parsed. This is used to specify blocks that will | contain raw code specific to the back-end. These blocks | still have to be handled by the relative `export-block' type | translator. | | :filters-alist | | Alist of filters that will overwrite or complete filters | defined in PARENT back-end. See `org-export-filters-alist' | for a list of allowed filters. | | :menu-entry | | Menu entry for the export dispatcher. See | `org-export-define-backend' for more information about the | expected value. | | :options-alist | | Alist of back-end specific properties that will overwrite or | complete those defined in PARENT back-end. Refer to | `org-export-options-alist' for more information about | structure of the values. | | :translate-alist | | Alist of element and object types and transcoders that will | overwrite or complete transcode table from PARENT back-end. | Refer to `org-export-define-backend' for detailed information | about transcoders. | | As an example, here is how one could define \"my-latex\" back-end | as a variant of `latex' back-end with a custom template function: | | \(org-export-define-derived-backend 'my-latex 'latex | :translate-alist '((template . my-latex-template-fun))) | | The back-end could then be called with, for example: | | \(org-export-to-buffer 'my-latex \"*Test my-latex*\")") | | (defun org-export-backend-parent (backend) | "Return back-end from which BACKEND is derived, or nil.") | | (defun org-export-backend-filters (backend) | "Return filters for BACKEND.") | | (defun org-export-backend-menu (backend) | "Return menu entry for BACKEND.") | | (defun org-export-backend-options (backend) | "Return export options for BACKEND.") | | (defun org-export-backend-translate-table (backend) | "Return translate table for BACKEND.") | | (defun org-export-barf-if-invalid-backend (backend) | "Signal an error if BACKEND isn't defined.") | | (defun org-export-derived-backend-p (backend &rest backends) | "Non-nil if BACKEND is derived from one of BACKENDS.") `---- The Communication Channel ========================= During export process, every function has access to a number of properties. They are of two types: 1. Environment options are collected once at the very beginning of the process, out of the original buffer and configuration. Collecting them is handled by `org-export-get-environment' function. Most environment options are defined through the `org-export-options-alist' variable. 2. Tree properties are extracted directly from the parsed tree, just before export, by `org-export-collect-tree-properties'. Here is the full list of properties available during transcode process, with their category and their value type. `:author': Author's name. category: option type: string `:back-end': Current back-end used for transcoding. category: tree type: symbol `:creator': String to write as creation information. category: option type: string `:date': String to use as date. category: option type: string `:description': Description text for the current data. category: option type: string `:email': Author's email. category: option type: string `:exclude-tags': Tags for exclusion of subtrees from export process. category: option type: list of strings `:export-options': List of export options available for current process. category: none type: list of symbols, among `subtree', `body-only' and `visible-only'. `:exported-data': Hash table used for memoizing `org-export-data'. category: tree type: hash table `:filetags': List of global tags for buffer. Used by `org-export-get-tags' to get tags with inheritance. category: option type: list of strings `:footnote-definition-alist': Alist between footnote labels and their definition, as parsed data. Only non-inlined footnotes are represented in this alist. Also, every definition isn't guaranteed to be referenced in the parse tree. The purpose of this property is to preserve definitions from oblivion (i.e. when the parse tree comes from a part of the original buffer), it isn't meant for direct use in a back-end. To retrieve a definition relative to a reference, use `org-export-get-footnote-definition' instead. category: option type: alist (STRING . LIST) `:headline-levels': Maximum level being exported as an headline. Comparison is done with the relative level of headlines in the parse tree, not necessarily with their actual level. category: option type: integer `:headline-offset': Difference between relative and real level of headlines in the parse tree. For example, a value of -1 means a level 2 headline should be considered as level 1 (cf. `org-export-get-relative-level'). category: tree type: integer `:headline-numbering': Alist between headlines and their numbering, as a list of numbers (cf. `org-export-get-headline-number'). category: tree type: alist (INTEGER . LIST) `:id-alist': Alist between ID strings and destination file's path, relative to current directory. It is used by `org-export-resolve-id-link' to resolve ID links targeting an external file. category: option type: alist (STRING . STRING) `:ignore-list': List of elements and objects that should be ignored during export. category: tree type: list of elements and objects `:input-file': Full path to input file, if any. category: option type: string or nil `:keywords': List of keywords attached to data. category: option type: string `:language': Default language used for translations. category: option type: string `:parse-tree': Whole parse tree, available at any time during transcoding. category: option type: list (as returned by `org-element-parse-buffer') `:preserve-breaks': Non-nil means transcoding should preserve all line breaks. category: option type: symbol (nil, t) `:section-numbers': Non-nil means transcoding should add section numbers to headlines. category: option type: symbol (nil, t) `:select-tags': List of tags enforcing inclusion of sub-trees in transcoding. When such a tag is present, subtrees without it are de facto excluded from the process. See `use-select-tags'. category: option type: list of strings `:time-stamp-file': Non-nil means transcoding should insert a time stamp in the output. category: option type: symbol (nil, t) `:translate-alist': Alist between element and object types and transcoding functions relative to the current back-end. Special keys `inner-template', `template' and `plain-text' are also possible. category: option type: alist (SYMBOL . FUNCTION) `:with-archived-trees': Non-nil when archived subtrees should also be transcoded. If it is set to the `headline' symbol, only the archived headline's name is retained. category: option type: symbol (nil, t, `headline') `:with-author': Non-nil means author's name should be included in the output. category: option type: symbol (nil, t) `:with-clocks': Non-nil means clock keywords should be exported. category: option type: symbol (nil, t) `:with-creator': Non-nil means a creation sentence should be inserted at the end of the transcoded string. If the value is `comment', it should be commented. category: option type: symbol (`comment', nil, t) `:with-date': Non-nil means output should contain a date. category: option : type :. symbol (nil, t) `:with-drawers': Non-nil means drawers should be exported. If its value is a list of names, only drawers with such names will be transcoded. If that list starts with `not', drawer with these names will be skipped. category: option type: symbol (nil, t) or list of strings `:with-email': Non-nil means output should contain author's email. category: option type: symbol (nil, t) `:with-emphasize': Non-nil means emphasized text should be interpreted. category: option type: symbol (nil, t) `:with-fixed-width': Non-nil if transcoder should interpret strings starting with a colon as a fixed-with (verbatim) area. category: option type: symbol (nil, t) `:with-footnotes': Non-nil if transcoder should interpret footnotes. category: option type: symbol (nil, t) `:with-latex': Non-nil means `latex-environment' elements and `latex-fragment' objects should appear in export output. When this property is set to `verbatim', they will be left as-is. category: option type: symbol (`verbatim', nil, t) `:with-planning': Non-nil means transcoding should include planning info. category: option type: symbol (nil, t) `:with-priority': Non-nil means transcoding should include priority cookies. category: option type: symbol (nil, t) `:with-smart-quotes': Non-nil means activate smart quotes in plain text. category: option type: symbol (nil, t) `:with-special-strings': Non-nil means transcoding should interpret special strings in plain text. category: option type: symbol (nil, t) `:with-sub-superscript': Non-nil means transcoding should interpret subscript and superscript. With a value of "{}", only interpret those using curly brackets. category: option type: symbol (nil, {}, t) `:with-tables': Non-nil means transcoding should interpret tables. category: option type: symbol (nil, t) `:with-tags': Non-nil means transcoding should keep tags in headlines. A `not-in-toc' value will remove them from the table of contents, if any, nonetheless. category: option type: symbol (nil, t, `not-in-toc') `:with-tasks': Non-nil means transcoding should include headlines with a TODO keyword. A `todo' value will only include headlines with a todo type keyword while a `done' value will do the contrary. If a list of strings is provided, only tasks with keywords belonging to that list will be kept. category: option type: symbol (t, todo, done, nil) or list of strings `:with-timestamps': Non-nil means transcoding should include time stamps. Special value `active' (resp. `inactive') ask to export only active (resp. inactive) timestamps. Otherwise, completely remove them. category: option type: symbol: (`active', `inactive', t, nil) `:with-toc': Non-nil means that a table of contents has to be added to the output. An integer value limits its depth. category: option type: symbol (nil, t or integer) `:with-todo-keywords': Non-nil means transcoding should include TODO keywords. category: option type: symbol (nil, t) Environment Options ~~~~~~~~~~~~~~~~~~~ Environment options encompass all parameters defined outside the scope of the parsed data. They come from five sources, in increasing precedence order: - Global variables, - Buffer's attributes, - Options keyword symbols, - Buffer keywords, - Subtree properties. The central internal function with regards to environment options is `org-export-get-environment'. It updates global variables with "#+BIND:" keywords, then retrieve and prioritize properties from the different sources. The internal functions doing the retrieval are: `org-export--get-global-options', `org-export--get-buffer-attributes', `org-export--parse-option-keyword', `org-export--get-subtree-options' and `org-export--get-inbuffer-options' Also, `org-export--install-letbind-maybe' takes care of the part relative to "#+BIND:" keywords. ,---- | (defun org-export-get-environment (&optional backend subtreep ext-plist) | "Collect export options from the current buffer. | | Optional argument BACKEND is a symbol specifying which back-end | specific options to read, if any. | | When optional argument SUBTREEP is non-nil, assume the export is | done against the current sub-tree. | | Third optional argument EXT-PLIST is a property list with | external parameters overriding Org default settings, but still | inferior to file-local settings.") | | (defun org-export--parse-option-keyword (options &optional backend) | "Parse an OPTIONS line and return values as a plist. | Optional argument BACKEND is a symbol specifying which back-end | specific items to read, if any.") | | (defun org-export--get-subtree-options (&optional backend) | "Get export options in subtree at point. | Optional argument BACKEND is a symbol specifying back-end used | for export. Return options as a plist." | ;; For each buffer keyword, create a headline property setting the | ;; same property in communication channel. The name for the property | ;; is the keyword with "EXPORT_") | | (defun org-export--get-inbuffer-options (&optional backend) | "Return current buffer export options, as a plist. | | Optional argument BACKEND, when non-nil, is a symbol specifying | which back-end specific options should also be read in the | process. | | Assume buffer is in Org mode. Narrowing, if any, is ignored.") | | (defun org-export--get-buffer-attributes () | "Return properties related to buffer attributes, as a plist.") | | (defvar org-export--default-title nil) ; Dynamically scoped. | (defun org-export-store-default-title () | "Return default title for current document, as a string. | Title is extracted from associated file name, if any, or buffer's | name.") | | (defun org-export--get-global-options (&optional backend) | "Return global export options as a plist. | Optional argument BACKEND, if non-nil, is a symbol specifying | which back-end specific export options should also be read in the | process.") | | (defun org-export--list-bound-variables () | "Return variables bound from BIND keywords in current buffer. | Also look for BIND keywords in setup files. The return value is | an alist where associations are (VARIABLE-NAME VALUE).") `---- Tree Properties ~~~~~~~~~~~~~~~ Tree properties are information extracted from parse tree. They are initialized at the beginning of the transcoding process by `org-export-collect-tree-properties'. Dedicated functions focus on computing the value of specific tree properties during initialization. Thus, `org-export--populate-ignore-list' lists elements and objects that should be skipped during export, `org-export--get-min-level' gets the minimal exportable level, used as a basis to compute relative level for headlines. Eventually `org-export--collect-headline-numbering' builds an alist between headlines and their numbering. ,---- | (defun org-export-collect-tree-properties (data info) | "Extract tree properties from parse tree. | | DATA is the parse tree from which information is retrieved. INFO | is a list holding export options. | | Following tree properties are set or updated: | | `:exported-data' Hash table used to memoize results from | `org-export-data'. | | `:footnote-definition-alist' List of footnotes definitions in | original buffer and current parse tree. | | `:headline-offset' Offset between true level of headlines and | local level. An offset of -1 means a headline | of level 2 should be considered as a level | 1 headline in the context. | | `:headline-numbering' Alist of all headlines as key an the | associated numbering as value. | | `:ignore-list' List of elements that should be ignored during | export. | | Return updated plist.") | | (defun org-export--get-min-level (data options) | "Return minimum exportable headline's level in DATA. | DATA is parsed tree as returned by `org-element-parse-buffer'. | OPTIONS is a plist holding export options.") | | (defun org-export--collect-headline-numbering (data options) | "Return numbering of all exportable headlines in a parse tree. | | DATA is the parse tree. OPTIONS is the plist holding export | options. | | Return an alist whose key is a headline and value is its | associated numbering \(in the shape of a list of numbers\) or nil | for a footnotes section.") | | (defun org-export--populate-ignore-list (data options) | "Return list of elements and objects to ignore during export. | DATA is the parse tree to traverse. OPTIONS is the plist holding | export options.") | | (defun org-export--selected-trees (data info) | "Return list of headlines and inlinetasks with a select tag in their tree. | DATA is parsed data as returned by `org-element-parse-buffer'. | INFO is a plist holding export options.") | | (defun org-export--skip-p (blob options selected) | "Non-nil when element or object BLOB should be skipped during export. | OPTIONS is the plist holding export options. SELECTED, when | non-nil, is a list of headlines or inlinetasks belonging to | a tree with a select tag.") `---- The Transcoder ============== `org-export-data' reads a parse tree (obtained with, i.e. `org-element-parse-buffer') and transcodes it into a specified back-end output. It takes care of filtering out elements or objects according to export options and organizing the output blank lines and white space are preserved. The function memoizes its results, so it is cheap to call it within translators. It is possible to modify locally the back-end used by `org-export-data' or even use a temporary back-end by using `org-export-data-with-translations' and `org-export-data-with-backend'. Internally, three functions handle the filtering of objects and elements during the export. In particular, `org-export-ignore-element' marks an element or object so future parse tree traversals skip it, `org-export--interpret-p' tells which elements or objects should be seen as real Org syntax and `org-export-expand' transforms the others back into their original shape `org-export-transcoder' is an accessor returning appropriate translator function for a given element or object. ,---- | (defun org-export-transcoder (blob info) | "Return appropriate transcoder for BLOB. | INFO is a plist containing export directives.") | | (defun org-export-data (data info) | "Convert DATA into current back-end format. | | DATA is a parse tree, an element or an object or a secondary | string. INFO is a plist holding export options. | | Return transcoded string.") | | (defun org-export-data-with-translations (data translations info) | "Convert DATA into another format using a given translation table. | DATA is an element, an object, a secondary string or a string. | TRANSLATIONS is an alist between element or object types and | a functions handling them. See `org-export-define-backend' for | more information. INFO is a plist used as a communication | channel.") | | (defun org-export-data-with-backend (data backend info) | "Convert DATA into BACKEND format. | | DATA is an element, an object, a secondary string or a string. | BACKEND is a symbol. INFO is a plist used as a communication | channel. | | Unlike to `org-export-with-backend', this function will | recursively convert DATA using BACKEND translation table.") | | (defun org-export--interpret-p (blob info) | "Non-nil if element or object BLOB should be interpreted during export. | If nil, BLOB will appear as raw Org syntax. Check is done | according to export options INFO, stored as a plist.") | | (defun org-export-expand (blob contents &optional with-affiliated) | "Expand a parsed element or object to its original state. | | BLOB is either an element or an object. CONTENTS is its | contents, as a string or nil. | | When optional argument WITH-AFFILIATED is non-nil, add affiliated | keywords before output.") | | (defun org-export-ignore-element (element info) | "Add ELEMENT to `:ignore-list' in INFO. | | Any element in `:ignore-list' will be skipped when using | `org-element-map'. INFO is modified by side effects.") `---- The Filter System ================= Filters allow end-users to tweak easily the transcoded output. They are the functional counterpart of hooks, as every filter in a set is applied to the return value of the previous one. Every set is back-end agnostic. Although, a filter is always called, in addition to the string it applies to, with the back-end used as argument, so it's easy for the end-user to add back-end specific filters in the set. The communication channel, as a plist, is required as the third argument. From the developer side, filters sets can be installed in the process with the help of `org-export-define-backend', which internally stores filters as an alist. Each association has a key among the following symbols and a function or a list of functions as value. - `:filter-options' applies to the property list containing export options. Unlike to other filters, functions in this list accept two arguments instead of three: the property list containing export options and the back-end. Users can set its value through `org-export-filter-options-functions' variable. - `:filter-parse-tree' applies directly to the complete parsed tree. Users can set it through `org-export-filter-parse-tree-functions' variable. - `:filter-final-output' applies to the final transcoded string. Users can set it with `org-export-filter-final-output-functions' variable - `:filter-plain-text' applies to any string not recognized as Org syntax. `org-export-filter-plain-text-functions' allows users to configure it. - `:filter-TYPE' applies on the string returned after an element or object of type TYPE has been transcoded. A user can modify `org-export-filter-TYPE-functions' All filters sets are applied with `org-export-filter-apply-functions' function. Filters in a set are applied in a LIFO fashion. It allows developers to be sure that their filters will be applied first. Filters properties are installed in communication channel with `org-export-install-filters' function. Eventually, two hooks (`org-export-before-processing-hook' and `org-export-before-parsing-hook') are run at the beginning of the export process and just before parsing to allow for heavy structure modifications. Hooks ~~~~~ ,---- | (defvar org-export-before-processing-hook nil | "Hook run at the beginning of the export process. | | This is run before include keywords and macros are expanded and | Babel code blocks executed, on a copy of the original buffer | being exported. Visibility and narrowing are preserved. Point | is at the beginning of the buffer. | | Every function in this hook will be called with one argument: the | back-end currently used, as a symbol.") | | (defvar org-export-before-parsing-hook nil | "Hook run before parsing an export buffer. | | This is run after include keywords and macros have been expanded | and Babel code blocks executed, on a copy of the original buffer | being exported. Visibility and narrowing are preserved. Point | is at the beginning of the buffer. | | Every function in this hook will be called with one argument: the | back-end currently used, as a symbol.") `---- Special Filters ~~~~~~~~~~~~~~~ ,---- | (defvar org-export-filter-options-functions nil | "List of functions applied to the export options. | Each filter is called with two arguments: the export options, as | a plist, and the back-end, as a symbol. It must return | a property list containing export options.") | | (defvar org-export-filter-parse-tree-functions nil | "List of functions applied to the parsed tree. | Each filter is called with three arguments: the parse tree, as | returned by `org-element-parse-buffer', the back-end, as | a symbol, and the communication channel, as a plist. It must | return the modified parse tree to transcode.") | | (defvar org-export-filter-plain-text-functions nil | "List of functions applied to plain text. | Each filter is called with three arguments: a string which | contains no Org syntax, the back-end, as a symbol, and the | communication channel, as a plist. It must return a string or | nil.") | | (defvar org-export-filter-final-output-functions nil | "List of functions applied to the transcoded string. | Each filter is called with three arguments: the full transcoded | string, the back-end, as a symbol, and the communication channel, | as a plist. It must return a string that will be used as the | final export output.") `---- Elements Filters ~~~~~~~~~~~~~~~~ ,---- | (defvar org-export-filter-babel-call-functions nil | "List of functions applied to a transcoded babel-call. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-center-block-functions nil | "List of functions applied to a transcoded center block. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-clock-functions nil | "List of functions applied to a transcoded clock. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-comment-functions nil | "List of functions applied to a transcoded comment. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-comment-block-functions nil | "List of functions applied to a transcoded comment-block. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-diary-sexp-functions nil | "List of functions applied to a transcoded diary-sexp. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-drawer-functions nil | "List of functions applied to a transcoded drawer. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-dynamic-block-functions nil | "List of functions applied to a transcoded dynamic-block. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-example-block-functions nil | "List of functions applied to a transcoded example-block. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-export-block-functions nil | "List of functions applied to a transcoded export-block. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-fixed-width-functions nil | "List of functions applied to a transcoded fixed-width. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-footnote-definition-functions nil | "List of functions applied to a transcoded footnote-definition. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-headline-functions nil | "List of functions applied to a transcoded headline. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-horizontal-rule-functions nil | "List of functions applied to a transcoded horizontal-rule. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-inlinetask-functions nil | "List of functions applied to a transcoded inlinetask. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-item-functions nil | "List of functions applied to a transcoded item. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-keyword-functions nil | "List of functions applied to a transcoded keyword. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-latex-environment-functions nil | "List of functions applied to a transcoded latex-environment. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-node-property-functions nil | "List of functions applied to a transcoded node-property. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-paragraph-functions nil | "List of functions applied to a transcoded paragraph. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-plain-list-functions nil | "List of functions applied to a transcoded plain-list. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-planning-functions nil | "List of functions applied to a transcoded planning. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-property-drawer-functions nil | "List of functions applied to a transcoded property-drawer. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-quote-block-functions nil | "List of functions applied to a transcoded quote block. | Each filter is called with three arguments: the transcoded quote | data, as a string, the back-end, as a symbol, and the | communication channel, as a plist. It must return a string or | nil.") | | (defvar org-export-filter-quote-section-functions nil | "List of functions applied to a transcoded quote-section. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-section-functions nil | "List of functions applied to a transcoded section. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-special-block-functions nil | "List of functions applied to a transcoded special block. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-src-block-functions nil | "List of functions applied to a transcoded src-block. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-table-functions nil | "List of functions applied to a transcoded table. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-table-cell-functions nil | "List of functions applied to a transcoded table-cell. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-table-row-functions nil | "List of functions applied to a transcoded table-row. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-verse-block-functions nil | "List of functions applied to a transcoded verse block. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") `---- Objects Filters ~~~~~~~~~~~~~~~ ,---- | (defvar org-export-filter-bold-functions nil | "List of functions applied to transcoded bold text. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-code-functions nil | "List of functions applied to transcoded code text. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-entity-functions nil | "List of functions applied to a transcoded entity. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-export-snippet-functions nil | "List of functions applied to a transcoded export-snippet. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-footnote-reference-functions nil | "List of functions applied to a transcoded footnote-reference. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-inline-babel-call-functions nil | "List of functions applied to a transcoded inline-babel-call. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-inline-src-block-functions nil | "List of functions applied to a transcoded inline-src-block. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-italic-functions nil | "List of functions applied to transcoded italic text. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-latex-fragment-functions nil | "List of functions applied to a transcoded latex-fragment. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-line-break-functions nil | "List of functions applied to a transcoded line-break. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-link-functions nil | "List of functions applied to a transcoded link. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-radio-target-functions nil | "List of functions applied to a transcoded radio-target. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-statistics-cookie-functions nil | "List of functions applied to a transcoded statistics-cookie. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-strike-through-functions nil | "List of functions applied to transcoded strike-through text. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-subscript-functions nil | "List of functions applied to a transcoded subscript. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-superscript-functions nil | "List of functions applied to a transcoded superscript. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-target-functions nil | "List of functions applied to a transcoded target. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-timestamp-functions nil | "List of functions applied to a transcoded timestamp. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-underline-functions nil | "List of functions applied to transcoded underline text. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") | | (defvar org-export-filter-verbatim-functions nil | "List of functions applied to transcoded verbatim text. | Each filter is called with three arguments: the transcoded data, | as a string, the back-end, as a symbol, and the communication | channel, as a plist. It must return a string or nil.") `---- Filters Tools ~~~~~~~~~~~~~ Internal function `org-export-install-filters' installs filters hard-coded in back-ends (developer filters) and filters from global variables (user filters) in the communication channel. Internal function `org-export-filter-apply-functions' takes care about applying each filter in order to a given data. It ignores filters returning a nil value but stops whenever a filter returns an empty string. ,---- | (defun org-export-filter-apply-functions (filters value info) | "Call every function in FILTERS. | | Functions are called with arguments VALUE, current export | back-end and INFO. A function returning a nil value will be | skipped. If it returns the empty string, the process ends and | VALUE is ignored. | | Call is done in a LIFO fashion, to be sure that developer | specified filters, if any, are called first.") | | (defun org-export-install-filters (info) | "Install filters properties in communication channel. | INFO is a plist containing the current communication channel. | Return the updated communication channel.") `---- Core functions ============== This is the room for the main function, `org-export-as', along with its derivatives, `org-export-to-buffer', `org-export-to-file' and `org-export-string-as'. They differ either by the way they output the resulting code (for the first two) or by the input type (for the latter). `org-export--copy-to-kill-ring-p' determines if output of these function should be added to kill ring. `org-export-output-file-name' is an auxiliary function meant to be used with `org-export-to-file'. With a given extension, it tries to provide a canonical file name to write export output to. Note that `org-export-as' doesn't really parse the current buffer, but a copy of it (with the same buffer-local variables and visibility), where macros and include keywords are expanded and Babel blocks are executed, if appropriate. `org-export-with-buffer-copy' macro prepares that copy. File inclusion is taken care of by `org-export-expand-include-keyword' and `org-export--prepare-file-contents'. Structure wise, including a whole Org file in a buffer often makes little sense. For example, if the file contains a headline and the include keyword was within an item, the item should contain the headline. That's why file inclusion should be done before any structure can be associated to the file, that is before parsing. `org-export-insert-default-template' is a command to insert a default template (or a back-end specific template) at point or in current subtree. ,---- | (defun org-export-copy-buffer () | "Return a copy of the current buffer. | The copy preserves Org buffer-local variables, visibility and | narrowing.") | | (defmacro org-export-with-buffer-copy (&rest body) | "Apply BODY in a copy of the current buffer. | The copy preserves local variables, visibility and contents of | the original buffer. Point is at the beginning of the buffer | when BODY is applied.") | | (defun org-export--generate-copy-script (buffer) | "Generate a function duplicating BUFFER. | | The copy will preserve local variables, visibility, contents and | narrowing of the original buffer. If a region was active in | BUFFER, contents will be narrowed to that region instead. | | The resulting function can be evaled at a later time, from | another buffer, effectively cloning the original buffer there. | | The function assumes BUFFER's major mode is `org-mode'.") `---- ###autoload ,---- | (defun org-export-as | (backend &optional subtreep visible-only body-only ext-plist) | "Transcode current Org buffer into BACKEND code. | | If narrowing is active in the current buffer, only transcode its | narrowed part. | | If a region is active, transcode that region. | | When optional argument SUBTREEP is non-nil, transcode the | sub-tree at point, extracting information from the headline | properties first. | | When optional argument VISIBLE-ONLY is non-nil, don't export | contents of hidden elements. | | When optional argument BODY-ONLY is non-nil, only return body | code, without surrounding template. | | Optional argument EXT-PLIST, when provided, is a property list | with external parameters overriding Org default settings, but | still inferior to file-local settings. | | Return code as a string.") `---- ###autoload ,---- | (defun org-export-to-buffer | (backend buffer &optional subtreep visible-only body-only ext-plist) | "Call `org-export-as' with output to a specified buffer. | | BACKEND is the back-end used for transcoding, as a symbol. | | BUFFER is the output buffer. If it already exists, it will be | erased first, otherwise, it will be created. | | Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY and | EXT-PLIST are similar to those used in `org-export-as', which | see. | | Depending on `org-export-copy-to-kill-ring', add buffer contents | to kill ring. Return buffer.") `---- ###autoload ,---- | (defun org-export-to-file | (backend file &optional subtreep visible-only body-only ext-plist) | "Call `org-export-as' with output to a specified file. | | BACKEND is the back-end used for transcoding, as a symbol. FILE | is the name of the output file, as a string. | | Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY and | EXT-PLIST are similar to those used in `org-export-as', which | see. | | Depending on `org-export-copy-to-kill-ring', add file contents | to kill ring. Return output file's name." `---- ###autoload ,---- | (defun org-export-string-as (string backend &optional body-only ext-plist) | "Transcode STRING into BACKEND code. | | When optional argument BODY-ONLY is non-nil, only return body | code, without preamble nor postamble. | | Optional argument EXT-PLIST, when provided, is a property list | with external parameters overriding Org default settings, but | still inferior to file-local settings. | | Return code as a string.") `---- ###autoload ,---- | (defun org-export-replace-region-by (backend) | "Replace the active region by its export to BACKEND.") `---- ###autoload ,---- | (defun org-export-insert-default-template (&optional backend subtreep) | "Insert all export keywords with default values at beginning of line. | | BACKEND is a symbol representing the export back-end for which | specific export options should be added to the template, or | `default' for default template. When it is nil, the user will be | prompted for a category. | | If SUBTREEP is non-nil, export configuration will be set up | locally for the subtree through node properties.") | | (defun org-export-output-file-name (extension &optional subtreep pub-dir) | "Return output file's name according to buffer specifications. | | EXTENSION is a string representing the output file extension, | with the leading dot. | | With a non-nil optional argument SUBTREEP, try to determine | output file's name by looking for \"EXPORT_FILE_NAME\" property | of subtree at point. | | When optional argument PUB-DIR is set, use it as the publishing | directory. | | When optional argument VISIBLE-ONLY is non-nil, don't export | contents of hidden elements. | | Return file name as a string.") | | (defun org-export-expand-include-keyword (&optional included dir) | "Expand every include keyword in buffer. | Optional argument INCLUDED is a list of included file names along | with their line restriction, when appropriate. It is used to | avoid infinite recursion. Optional argument DIR is the current | working directory. It is used to properly resolve relative | paths.") | | (defun org-export--prepare-file-contents (file &optional lines ind minlevel) | "Prepare the contents of FILE for inclusion and return them as a string. | | When optional argument LINES is a string specifying a range of | lines, include only those lines. | | Optional argument IND, when non-nil, is an integer specifying the | global indentation of returned contents. Since its purpose is to | allow an included file to stay in the same environment it was | created \(i.e. a list item), it doesn't apply past the first | headline encountered. | | Optional argument MINLEVEL, when non-nil, is an integer | specifying the level that any top-level headline in the included | file should have.") | | (defun org-export-execute-babel-code () | "Execute every Babel code in the visible part of current buffer.") | | (defun org-export--copy-to-kill-ring-p () | "Return a non-nil value when output should be added to the kill ring. | See also `org-export-copy-to-kill-ring'.") `---- Tools For Back-Ends =================== A whole set of tools is available to help build new exporters. Any function general enough to have its use across many back-ends should be added here. For Affiliated Keywords ~~~~~~~~~~~~~~~~~~~~~~~ `org-export-read-attribute' reads a property from a given element as a plist. It can be used to normalize affiliated keywords' syntax. Since captions can span over multiple lines and accept dual values, their internal representation is a bit tricky. Therefore, `org-export-get-caption' transparently returns a given element's caption as a secondary string. ,---- | (defun org-export-read-attribute (attribute element &optional property) | "Turn ATTRIBUTE property from ELEMENT into a plist. | | When optional argument PROPERTY is non-nil, return the value of | that property within attributes. | | This function assumes attributes are defined as \":keyword | value\" pairs. It is appropriate for `:attr_html' like | properties. | | All values will become strings except the empty string and | \"nil\", which will become nil. Also, values containing only | double quotes will be read as-is, which means that \"\" value | will become the empty string.") | | (defun org-export-get-caption (element &optional shortp) | "Return caption from ELEMENT as a secondary string. | | When optional argument SHORTP is non-nil, return short caption, | as a secondary string, instead. | | Caption lines are separated by a white space.") `---- For Derived Back-ends ~~~~~~~~~~~~~~~~~~~~~ `org-export-with-backend' is a function allowing to locally use another back-end to transcode some object or element. In a derived back-end, it may be used as a fall-back function once all specific cases have been treated. ,---- | (defun org-export-with-backend (back-end data &optional contents info) | "Call a transcoder from BACK-END on DATA. | CONTENTS, when non-nil, is the transcoded contents of DATA | element, as a string. INFO, when non-nil, is the communication | channel used for export, as a plist..") `---- For Export Snippets ~~~~~~~~~~~~~~~~~~~ Every export snippet is transmitted to the back-end. Though, the latter will only retain one type of export-snippet, ignoring others, based on the former's target back-end. The function `org-export-snippet-backend' returns that back-end for a given export-snippet. ,---- | (defun org-export-snippet-backend (export-snippet) | "Return EXPORT-SNIPPET targeted back-end as a symbol. | Translation, with `org-export-snippet-translation-alist', is | applied.") `---- For Footnotes ~~~~~~~~~~~~~ `org-export-collect-footnote-definitions' is a tool to list actually used footnotes definitions in the whole parse tree, or in a headline, in order to add footnote listings throughout the transcoded data. `org-export-footnote-first-reference-p' is a predicate used by some back-ends, when they need to attach the footnote definition only to the first occurrence of the corresponding label. `org-export-get-footnote-definition' and `org-export-get-footnote-number' provide easier access to additional information relative to a footnote reference. ,---- | (defun org-export-collect-footnote-definitions (data info) | "Return an alist between footnote numbers, labels and definitions. | | DATA is the parse tree from which definitions are collected. | INFO is the plist used as a communication channel. | | Definitions are sorted by order of references. They either | appear as Org data or as a secondary string for inlined | footnotes. Unreferenced definitions are ignored.") | | (defun org-export-footnote-first-reference-p (footnote-reference info) | "Non-nil when a footnote reference is the first one for its label. | | FOOTNOTE-REFERENCE is the footnote reference being considered. | INFO is the plist used as a communication channel.") | | (defun org-export-get-footnote-definition (footnote-reference info) | "Return definition of FOOTNOTE-REFERENCE as parsed data. | INFO is the plist used as a communication channel. If no such | definition can be found, return the \"DEFINITION NOT FOUND\" | string.") | | (defun org-export-get-footnote-number (footnote info) | "Return number associated to a footnote. | | FOOTNOTE is either a footnote reference or a footnote definition. | INFO is the plist used as a communication channel.") `---- For Headlines ~~~~~~~~~~~~~ `org-export-get-relative-level' is a shortcut to get headline level, relatively to the lower headline level in the parsed tree. `org-export-get-headline-number' returns the section number of an headline, while `org-export-number-to-roman' allows to convert it to roman numbers. `org-export-low-level-p', `org-export-first-sibling-p' and `org-export-last-sibling-p' are three useful predicates when it comes to fulfill the `:headline-levels' property. `org-export-get-tags', `org-export-get-category' and `org-export-get-node-property' extract useful information from an headline or a parent headline. They all handle inheritance. `org-export-get-alt-title' tries to retrieve an alternative title, as a secondary string, suitable for table of contents. It falls back onto default title. ,---- | (defun org-export-get-relative-level (headline info) | "Return HEADLINE relative level within current parsed tree. | INFO is a plist holding contextual information.") | | (defun org-export-low-level-p (headline info) | "Non-nil when HEADLINE is considered as low level. | | INFO is a plist used as a communication channel. | | A low level headlines has a relative level greater than | `:headline-levels' property value. | | Return value is the difference between HEADLINE relative level | and the last level being considered as high enough, or nil.") | | (defun org-export-get-headline-number (headline info) | "Return HEADLINE numbering as a list of numbers. | INFO is a plist holding contextual information.") | | (defun org-export-numbered-headline-p (headline info) | "Return a non-nil value if HEADLINE element should be numbered. | INFO is a plist used as a communication channel.") | | (defun org-export-number-to-roman (n) | "Convert integer N into a roman numeral.") | | (defun org-export-get-tags (element info &optional tags inherited) | "Return list of tags associated to ELEMENT. | | ELEMENT has either an `headline' or an `inlinetask' type. INFO | is a plist used as a communication channel. | | Select tags (see `org-export-select-tags') and exclude tags (see | `org-export-exclude-tags') are removed from the list. | | When non-nil, optional argument TAGS should be a list of strings. | Any tag belonging to this list will also be removed. | | When optional argument INHERITED is non-nil, tags can also be | inherited from parent headlines and FILETAGS keywords.") | | (defun org-export-get-node-property (property blob &optional inherited) | "Return node PROPERTY value for BLOB. | | PROPERTY is an upcase symbol (i.e. `:COOKIE_DATA'). BLOB is an | element or object. | | If optional argument INHERITED is non-nil, the value can be | inherited from a parent headline. | | Return value is a string or nil.") | | (defun org-export-get-category (blob info) | "Return category for element or object BLOB. | | INFO is a plist used as a communication channel. | | CATEGORY is automatically inherited from a parent headline, from | #+CATEGORY: keyword or created out of original file name. If all | fail, the fall-back value is \"???\".") | | (defun org-export-get-alt-title (headline info) | "Return alternative title for HEADLINE, as a secondary string. | INFO is a plist used as a communication channel. If no optional | title is defined, fall-back to the regular title.") | | (defun org-export-first-sibling-p (headline info) | "Non-nil when HEADLINE is the first sibling in its sub-tree. | INFO is a plist used as a communication channel.") | | (defun org-export-last-sibling-p (headline info) | "Non-nil when HEADLINE is the last sibling in its sub-tree. | INFO is a plist used as a communication channel.") `---- For Keywords ~~~~~~~~~~~~ `org-export-get-date' returns a date appropriate for the document to about to be exported. In particular, it takes care of `org-export-date-timestamp-format'. ,---- | (defun org-export-get-date (info &optional fmt) | "Return date value for the current document. | | INFO is a plist used as a communication channel. FMT, when | non-nil, is a time format string that will be applied on the date | if it consists in a single timestamp object. It defaults to | `org-export-date-timestamp-format' when nil. | | A proper date can be a secondary string, a string or nil. It is | meant to be translated with `org-export-data' or alike.") `---- For Links ~~~~~~~~~ `org-export-solidify-link-text' turns a string into a safer version for links, replacing most non-standard characters with hyphens. `org-export-get-coderef-format' returns an appropriate format string for coderefs. `org-export-inline-image-p' returns a non-nil value when the link provided should be considered as an inline image. `org-export-resolve-fuzzy-link' searches destination of fuzzy links (i.e. links with "fuzzy" as type) within the parsed tree, and returns an appropriate unique identifier when found, or nil. `org-export-resolve-id-link' returns the first headline with specified id or custom-id in parse tree, the path to the external file with the id or nil when neither was found. `org-export-resolve-coderef' associates a reference to a line number in the element it belongs, or returns the reference itself when the element isn't numbered. ,---- | (defun org-export-solidify-link-text (s) | "Take link text S and make a safe target out of it.") | | (defun org-export-get-coderef-format (path desc) | "Return format string for code reference link. | PATH is the link path. DESC is its description.") | | (defun org-export-inline-image-p (link &optional rules) | "Non-nil if LINK object points to an inline image. | | Optional argument is a set of RULES defining inline images. It | is an alist where associations have the following shape: | | \(TYPE . REGEXP) | | Applying a rule means apply REGEXP against LINK's path when its | type is TYPE. The function will return a non-nil value if any of | the provided rules is non-nil. The default rule is | `org-export-default-inline-image-rule'. | | This only applies to links without a description.") | | (defun org-export-resolve-coderef (ref info) | "Resolve a code reference REF. | | INFO is a plist used as a communication channel. | | Return associated line number in source code, or REF itself, | depending on src-block or example element's switches.") | | (defun org-export-resolve-fuzzy-link (link info) | "Return LINK destination. | | INFO is a plist holding contextual information. | | Return value can be an object, an element, or nil: | | - If LINK path matches a target object (i.e. <>) return it. | | - If LINK path exactly matches the name affiliated keyword | \(i.e. #+NAME: path) of an element, return that element. | | - If LINK path exactly matches any headline name, return that | element. If more than one headline share that name, priority | will be given to the one with the closest common ancestor, if | any, or the first one in the parse tree otherwise. | | - Otherwise, return nil. | | Assume LINK type is \"fuzzy\". White spaces are not | significant.") | | (defun org-export-resolve-id-link (link info) | "Return headline referenced as LINK destination. | | INFO is a plist used as a communication channel. | | Return value can be the headline element matched in current parse | tree, a file name or nil. Assume LINK type is either \"id\" or | \"custom-id\".") | | (defun org-export-resolve-radio-link (link info) | "Return radio-target object referenced as LINK destination. | | INFO is a plist used as a communication channel. | | Return value can be a radio-target object or nil. Assume LINK | has type \"radio\".") `---- For References ~~~~~~~~~~~~~~ `org-export-get-ordinal' associates a sequence number to any object or element. ,---- | (defun org-export-get-ordinal (element info &optional types predicate) | "Return ordinal number of an element or object. | | ELEMENT is the element or object considered. INFO is the plist | used as a communication channel. | | Optional argument TYPES, when non-nil, is a list of element or | object types, as symbols, that should also be counted in. | Otherwise, only provided element's type is considered. | | Optional argument PREDICATE is a function returning a non-nil | value if the current element or object should be counted in. It | accepts two arguments: the element or object being considered and | the plist used as a communication channel. This allows to count | only a certain type of objects (i.e. inline images). | | Return value is a list of numbers if ELEMENT is a headline or an | item. It is nil for keywords. It represents the footnote number | for footnote definitions and footnote references. If ELEMENT is | a target, return the same value as if ELEMENT was the closest | table, item or headline containing the target. In any other | case, return the sequence number of ELEMENT among elements or | objects of the same type.") `---- For Src-Blocks ~~~~~~~~~~~~~~ `org-export-get-loc' counts number of code lines accumulated in src-block or example-block elements with a "+n" switch until a given element, excluded. Note: "-n" switches reset that count. `org-export-unravel-code' extracts source code (along with a code references alist) from an `element-block' or `src-block' type element. `org-export-format-code' applies a formatting function to each line of code, providing relative line number and code reference when appropriate. Since it doesn't access the original element from which the source code is coming, it expects from the code calling it to know if lines should be numbered and if code references should appear. Eventually, `org-export-format-code-default' is a higher-level function (it makes use of the two previous functions) which handles line numbering and code references inclusion, and returns source code in a format suitable for plain text or verbatim output. ,---- | (defun org-export-get-loc (element info) | "Return accumulated lines of code up to ELEMENT. | | INFO is the plist used as a communication channel. | | ELEMENT is excluded from count.") | | (defun org-export-unravel-code (element) | "Clean source code and extract references out of it. | | ELEMENT has either a `src-block' an `example-block' type. | | Return a cons cell whose CAR is the source code, cleaned from any | reference and protective comma and CDR is an alist between | relative line number (integer) and name of code reference on that | line (string).") | | (defun org-export-format-code (code fun &optional num-lines ref-alist) | "Format CODE by applying FUN line-wise and return it. | | CODE is a string representing the code to format. FUN is | a function. It must accept three arguments: a line of | code (string), the current line number (integer) or nil and the | reference associated to the current line (string) or nil. | | Optional argument NUM-LINES can be an integer representing the | number of code lines accumulated until the current code. Line | numbers passed to FUN will take it into account. If it is nil, | FUN's second argument will always be nil. This number can be | obtained with `org-export-get-loc' function. | | Optional argument REF-ALIST can be an alist between relative line | number (i.e. ignoring NUM-LINES) and the name of the code | reference on it. If it is nil, FUN's third argument will always | be nil. It can be obtained through the use of | `org-export-unravel-code' function.") | | (defun org-export-format-code-default (element info) | "Return source code from ELEMENT, formatted in a standard way. | | ELEMENT is either a `src-block' or `example-block' element. INFO | is a plist used as a communication channel. | | This function takes care of line numbering and code references | inclusion. Line numbers, when applicable, appear at the | beginning of the line, separated from the code by two white | spaces. Code references, on the other hand, appear flushed to | the right, separated by six white spaces from the widest line of | code.") `---- For Tables ~~~~~~~~~~ `org-export-table-has-special-column-p' and and `org-export-table-row-is-special-p' are predicates used to look for meta-information about the table structure. `org-table-has-header-p' tells when the rows before the first rule should be considered as table's header. `org-export-table-cell-width', `org-export-table-cell-alignment' and `org-export-table-cell-borders' extract information from a table-cell element. `org-export-table-dimensions' gives the number on rows and columns in the table, ignoring horizontal rules and special columns. `org-export-table-cell-address', given a table-cell object, returns the absolute address of a cell. On the other hand, `org-export-get-table-cell-at' does the contrary. `org-export-table-cell-starts-colgroup-p', `org-export-table-cell-ends-colgroup-p', `org-export-table-row-starts-rowgroup-p', `org-export-table-row-ends-rowgroup-p', `org-export-table-row-starts-header-p' and `org-export-table-row-ends-header-p' indicate position of current row or cell within the table. ,---- | (defun org-export-table-has-special-column-p (table) | "Non-nil when TABLE has a special column. | All special columns will be ignored during export." | ;; The table has a special column when every first cell of every row | ;; has an empty value or contains a symbol among "/", "#", "!", "$", | ;; "*" "_" and "^") | | (defun org-export-table-has-header-p (table info) | "Non-nil when TABLE has a header. | | INFO is a plist used as a communication channel. | | A table has a header when it contains at least two row groups.") | | (defun org-export-table-row-is-special-p (table-row info) | "Non-nil if TABLE-ROW is considered special. | | INFO is a plist used as the communication channel. | | All special rows will be ignored during export.") | | (defun org-export-table-row-group (table-row info) | "Return TABLE-ROW's group number, as an integer. | | INFO is a plist used as the communication channel. | | Return value is the group number, as an integer, or nil for | special rows and rows separators. First group is also table's | header.") | | (defun org-export-table-cell-width (table-cell info) | "Return TABLE-CELL contents width. | | INFO is a plist used as the communication channel. | | Return value is the width given by the last width cookie in the | same column as TABLE-CELL, or nil.") | | (defun org-export-table-cell-alignment (table-cell info) | "Return TABLE-CELL contents alignment. | | INFO is a plist used as the communication channel. | | Return alignment as specified by the last alignment cookie in the | same column as TABLE-CELL. If no such cookie is found, a default | alignment value will be deduced from fraction of numbers in the | column (see `org-table-number-fraction' for more information). | Possible values are `left', `right' and `center'.") | | (defun org-export-table-cell-borders (table-cell info) | "Return TABLE-CELL borders. | | INFO is a plist used as a communication channel. | | Return value is a list of symbols, or nil. Possible values are: | `top', `bottom', `above', `below', `left' and `right'. Note: | `top' (resp. `bottom') only happen for a cell in the first | row (resp. last row) of the table, ignoring table rules, if any. | | Returned borders ignore special rows.") | | (defun org-export-table-cell-starts-colgroup-p (table-cell info) | "Non-nil when TABLE-CELL is at the beginning of a row group. | INFO is a plist used as a communication channel.") | | (defun org-export-table-cell-ends-colgroup-p (table-cell info) | "Non-nil when TABLE-CELL is at the end of a row group. | INFO is a plist used as a communication channel.") | | (defun org-export-table-row-starts-rowgroup-p (table-row info) | "Non-nil when TABLE-ROW is at the beginning of a column group. | INFO is a plist used as a communication channel.") | | (defun org-export-table-row-ends-rowgroup-p (table-row info) | "Non-nil when TABLE-ROW is at the end of a column group. | INFO is a plist used as a communication channel.") | | (defun org-export-table-row-starts-header-p (table-row info) | "Non-nil when TABLE-ROW is the first table header's row. | INFO is a plist used as a communication channel.") | | (defun org-export-table-row-ends-header-p (table-row info) | "Non-nil when TABLE-ROW is the last table header's row. | INFO is a plist used as a communication channel.") | | (defun org-export-table-row-number (table-row info) | "Return TABLE-ROW number. | INFO is a plist used as a communication channel. Return value is | zero-based and ignores separators. The function returns nil for | special colums and separators.") | | (defun org-export-table-dimensions (table info) | "Return TABLE dimensions. | | INFO is a plist used as a communication channel. | | Return value is a CONS like (ROWS . COLUMNS) where | ROWS (resp. COLUMNS) is the number of exportable | rows (resp. columns).") | | (defun org-export-table-cell-address (table-cell info) | "Return address of a regular TABLE-CELL object. | | TABLE-CELL is the cell considered. INFO is a plist used as | a communication channel. | | Address is a CONS cell (ROW . COLUMN), where ROW and COLUMN are | zero-based index. Only exportable cells are considered. The | function returns nil for other cells.") | | (defun org-export-get-table-cell-at (address table info) | "Return regular table-cell object at ADDRESS in TABLE. | | Address is a CONS cell (ROW . COLUMN), where ROW and COLUMN are | zero-based index. TABLE is a table type element. INFO is | a plist used as a communication channel. | | If no table-cell, among exportable cells, is found at ADDRESS, | return nil.") `---- For Tables Of Contents ~~~~~~~~~~~~~~~~~~~~~~ `org-export-collect-headlines' builds a list of all exportable headline elements, maybe limited to a certain depth. One can then easily parse it and transcode it. Building lists of tables, figures or listings is quite similar. Once the generic function `org-export-collect-elements' is defined, `org-export-collect-tables', `org-export-collect-figures' and `org-export-collect-listings' can be derived from it. ,---- | (defun org-export-collect-headlines (info &optional n) | "Collect headlines in order to build a table of contents. | | INFO is a plist used as a communication channel. | | When optional argument N is an integer, it specifies the depth of | the table of contents. Otherwise, it is set to the value of the | last headline level. See `org-export-headline-levels' for more | information. | | Return a list of all exportable headlines as parsed elements. | Footnote sections, if any, will be ignored.") | | (defun org-export-collect-elements (type info &optional predicate) | "Collect referenceable elements of a determined type. | | TYPE can be a symbol or a list of symbols specifying element | types to search. Only elements with a caption are collected. | | INFO is a plist used as a communication channel. | | When non-nil, optional argument PREDICATE is a function accepting | one argument, an element of type TYPE. It returns a non-nil | value when that element should be collected. | | Return a list of all elements found, in order of appearance.") | | (defun org-export-collect-tables (info) | "Build a list of tables. | INFO is a plist used as a communication channel. | | Return a list of table elements with a caption.") | | (defun org-export-collect-figures (info predicate) | "Build a list of figures. | | INFO is a plist used as a communication channel. PREDICATE is | a function which accepts one argument: a paragraph element and | whose return value is non-nil when that element should be | collected. | | A figure is a paragraph type element, with a caption, verifying | PREDICATE. The latter has to be provided since a \"figure\" is | a vague concept that may depend on back-end. | | Return a list of elements recognized as figures.") | | (defun org-export-collect-listings (info) | "Build a list of src blocks. | | INFO is a plist used as a communication channel. | | Return a list of src-block elements with a caption.") `---- Smart Quotes ~~~~~~~~~~~~ The main function for the smart quotes sub-system is `org-export-activate-smart-quotes', which replaces every quote in a given string from the parse tree with its "smart" counterpart. Dictionary for smart quotes is stored in `org-export-smart-quotes-alist'. Internally, regexps matching potential smart quotes (checks at string boundaries are also necessary) are defined in `org-export-smart-quotes-regexps'. ,---- | (defconst org-export-smart-quotes-alist | '(("de" | (opening-double-quote :utf-8 "„" :html "„" :latex "\"`" | :texinfo "@quotedblbase{}") | (closing-double-quote :utf-8 "“" :html "“" :latex "\"'" | :texinfo "@quotedblleft{}") | (opening-single-quote :utf-8 "‚" :html "‚" :latex "\\glq{}" | :texinfo "@quotesinglbase{}") | (closing-single-quote :utf-8 "‘" :html "‘" :latex "\\grq{}" | :texinfo "@quoteleft{}") | (apostrophe :utf-8 "’" :html "’")) | ("en" | (opening-double-quote :utf-8 "“" :html "“" :latex "``" :texinfo "``") | (closing-double-quote :utf-8 "”" :html "”" :latex "''" :texinfo "''") | (opening-single-quote :utf-8 "‘" :html "‘" :latex "`" :texinfo "`") | (closing-single-quote :utf-8 "’" :html "’" :latex "'" :texinfo "'") | (apostrophe :utf-8 "’" :html "’")) | ("es" | (opening-double-quote :utf-8 "«" :html "«" :latex "\\guillemotleft{}" | :texinfo "@guillemetleft{}") | (closing-double-quote :utf-8 "»" :html "»" :latex "\\guillemotright{}" | :texinfo "@guillemetright{}") | (opening-single-quote :utf-8 "“" :html "“" :latex "``" :texinfo "``") | (closing-single-quote :utf-8 "”" :html "”" :latex "''" :texinfo "''") | (apostrophe :utf-8 "’" :html "’")) | ("fr" | (opening-double-quote :utf-8 "« " :html "« " :latex "\\og " | :texinfo "@guillemetleft{}@tie{}") | (closing-double-quote :utf-8 " »" :html " »" :latex "\\fg{}" | :texinfo "@tie{}@guillemetright{}") | (opening-single-quote :utf-8 "« " :html "« " :latex "\\og " | :texinfo "@guillemetleft{}@tie{}") | (closing-single-quote :utf-8 " »" :html " »" :latex "\\fg{}" | :texinfo "@tie{}@guillemetright{}") | (apostrophe :utf-8 "’" :html "’"))) | "Smart quotes translations. | | Alist whose CAR is a language string and CDR is an alist with | quote type as key and a plist associating various encodings to | their translation as value. | | A quote type can be any symbol among `opening-double-quote', | `closing-double-quote', `opening-single-quote', | `closing-single-quote' and `apostrophe'. | | Valid encodings include `:utf-8', `:html', `:latex' and | `:texinfo'. | | If no translation is found, the quote character is left as-is.") | | (defconst org-export-smart-quotes-regexps | (list | ;; Possible opening quote at beginning of string. | "\\`\\([\"']\\)\\(\\w\\|\\s.\\|\\s_\\)" | ;; Possible closing quote at beginning of string. | "\\`\\([\"']\\)\\(\\s-\\|\\s)\\|\\s.\\)" | ;; Possible apostrophe at beginning of string. | "\\`\\('\\)\\S-" | ;; Opening single and double quotes. | "\\(?:\\s-\\|\\s(\\)\\([\"']\\)\\(?:\\w\\|\\s.\\|\\s_\\)" | ;; Closing single and double quotes. | "\\(?:\\w\\|\\s.\\|\\s_\\)\\([\"']\\)\\(?:\\s-\\|\\s)\\|\\s.\\)" | ;; Apostrophe. | "\\S-\\('\\)\\S-" | ;; Possible opening quote at end of string. | "\\(?:\\s-\\|\\s(\\)\\([\"']\\)\\'" | ;; Possible closing quote at end of string. | "\\(?:\\w\\|\\s.\\|\\s_\\)\\([\"']\\)\\'" | ;; Possible apostrophe at end of string. | "\\S-\\('\\)\\'") | "List of regexps matching a quote or an apostrophe. | In every regexp, quote or apostrophe matched is put in group 1.") | | (defun org-export-activate-smart-quotes (s encoding info &optional original) | "Replace regular quotes with \"smart\" quotes in string S. | | ENCODING is a symbol among `:html', `:latex', `:texinfo' and | `:utf-8'. INFO is a plist used as a communication channel. | | The function has to retrieve information about string | surroundings in parse tree. It can only happen with an | unmodified string. Thus, if S has already been through another | process, a non-nil ORIGINAL optional argument will provide that | original string. | | Return the new string.") `---- Topology ~~~~~~~~ Here are various functions to retrieve information about the neighbourhood of a given element or object. Neighbours of interest are direct parent (`org-export-get-parent'), parent headline (`org-export-get-parent-headline'), first element containing an object, (`org-export-get-parent-element'), parent table (`org-export-get-parent-table'), previous element or object (`org-export-get-previous-element') and next element or object (`org-export-get-next-element'). `org-export-get-genealogy' returns the full genealogy of a given element or object, from closest parent to full parse tree. ,---- | (defsubst org-export-get-parent (blob) | "Return BLOB parent or nil. | BLOB is the element or object considered.") | | (defun org-export-get-genealogy (blob) | "Return full genealogy relative to a given element or object. | | BLOB is the element or object being considered. | | Ancestors are returned from closest to farthest, the last one | being the full parse tree.") | | (defun org-export-get-parent-headline (blob) | "Return BLOB parent headline or nil. | BLOB is the element or object being considered.") | | (defun org-export-get-parent-element (object) | "Return first element containing OBJECT or nil. | OBJECT is the object to consider.") | | (defun org-export-get-parent-table (object) | "Return OBJECT parent table or nil. | OBJECT is either a `table-cell' or `table-element' type object.") | | (defun org-export-get-previous-element (blob info &optional n) | "Return previous element or object. | | BLOB is an element or object. INFO is a plist used as | a communication channel. Return previous exportable element or | object, a string, or nil. | | When optional argument N is a positive integer, return a list | containing up to N siblings before BLOB, from farthest to | closest. With any other non-nil value, return a list containing | all of them.") | | (defun org-export-get-next-element (blob info &optional n) | "Return next element or object. | | BLOB is an element or object. INFO is a plist used as | a communication channel. Return next exportable element or | object, a string, or nil. | | When optional argument N is a positive integer, return a list | containing up to N siblings after BLOB, from closest to farthest. | With any other non-nil value, return a list containing all of | them.") `---- Translation ~~~~~~~~~~~ `org-export-translate' translates a string according to language specified by LANGUAGE keyword or `org-export-language-setup' variable and a specified charset. `org-export-dictionary' contains the dictionary used for the translation. ,---- | (defconst org-export-dictionary | '(("Author" | ("ca" :default "Autor") | ("cs" :default "Autor") | ("da" :default "Ophavsmand") | ("de" :default "Autor") | ("eo" :html "Aŭtoro") | ("es" :default "Autor") | ("fi" :html "Tekijä") | ("fr" :default "Auteur") | ("hu" :default "Szerzõ") | ("is" :html "Höfundur") | ("it" :default "Autore") | ("ja" :html "著者" :utf-8 "著者") | ("nl" :default "Auteur") | ("no" :default "Forfatter") | ("nb" :default "Forfatter") | ("nn" :default "Forfattar") | ("pl" :default "Autor") | ("ru" :html "Автор" :utf-8 "Автор") | ("sv" :html "Författare") | ("uk" :html "Автор" :utf-8 "Автор") | ("zh-CN" :html "作者" :utf-8 "作者") | ("zh-TW" :html "作者" :utf-8 "作者")) | ("Date" | ("ca" :default "Data") | ("cs" :default "Datum") | ("da" :default "Dato") | ("de" :default "Datum") | ("eo" :default "Dato") | ("es" :default "Fecha") | ("fi" :html "Päivämäärä") | ("hu" :html "Dátum") | ("is" :default "Dagsetning") | ("it" :default "Data") | ("ja" :html "日付" :utf-8 "日付") | ("nl" :default "Datum") | ("no" :default "Dato") | ("nb" :default "Dato") | ("nn" :default "Dato") | ("pl" :default "Data") | ("ru" :html "Дата" :utf-8 "Дата") | ("sv" :default "Datum") | ("uk" :html "Дата" :utf-8 "Дата") | ("zh-CN" :html "日期" :utf-8 "日期") | ("zh-TW" :html "日期" :utf-8 "日期")) | ("Equation" | ("fr" :ascii "Equation" :default "Équation")) | ("Figure") | ("Footnotes" | ("ca" :html "Peus de pàgina") | ("cs" :default "Pozn\xe1mky pod carou") | ("da" :default "Fodnoter") | ("de" :html "Fußnoten") | ("eo" :default "Piednotoj") | ("es" :html "Pies de página") | ("fi" :default "Alaviitteet") | ("fr" :default "Notes de bas de page") | ("hu" :html "Lábjegyzet") | ("is" :html "Aftanmálsgreinar") | ("it" :html "Note a piè di pagina") | ("ja" :html "脚注" :utf-8 "脚注") | ("nl" :default "Voetnoten") | ("no" :default "Fotnoter") | ("nb" :default "Fotnoter") | ("nn" :default "Fotnotar") | ("pl" :default "Przypis") | ("ru" :html "Сноски" :utf-8 "Сноски") | ("sv" :default "Fotnoter") | ("uk" :html "Примітки" | :utf-8 "Примітки") | ("zh-CN" :html "脚注" :utf-8 "脚注") | ("zh-TW" :html "腳註" :utf-8 "腳註")) | ("List of Listings" | ("fr" :default "Liste des programmes")) | ("List of Tables" | ("fr" :default "Liste des tableaux")) | ("Listing %d:" | ("fr" | :ascii "Programme %d :" :default "Programme nº %d :" | :latin1 "Programme %d :")) | ("Listing %d: %s" | ("fr" | :ascii "Programme %d : %s" :default "Programme nº %d : %s" | :latin1 "Programme %d : %s")) | ("See section %s" | ("fr" :default "cf. section %s")) | ("Table %d:" | ("fr" | :ascii "Tableau %d :" :default "Tableau nº %d :" :latin1 "Tableau %d :")) | ("Table %d: %s" | ("fr" | :ascii "Tableau %d : %s" :default "Tableau nº %d : %s" | :latin1 "Tableau %d : %s")) | ("Table of Contents" | ("ca" :html "Índex") | ("cs" :default "Obsah") | ("da" :default "Indhold") | ("de" :default "Inhaltsverzeichnis") | ("eo" :default "Enhavo") | ("es" :html "Índice") | ("fi" :html "Sisällysluettelo") | ("fr" :ascii "Sommaire" :default "Table des matières") | ("hu" :html "Tartalomjegyzék") | ("is" :default "Efnisyfirlit") | ("it" :default "Indice") | ("ja" :html "目次" :utf-8 "目次") | ("nl" :default "Inhoudsopgave") | ("no" :default "Innhold") | ("nb" :default "Innhold") | ("nn" :default "Innhald") | ("pl" :html "Spis treści") | ("ru" :html "Содержание" | :utf-8 "Содержание") | ("sv" :html "Innehåll") | ("uk" :html "Зміст" :utf-8 "Зміст") | ("zh-CN" :html "目录" :utf-8 "目录") | ("zh-TW" :html "目錄" :utf-8 "目錄")) | ("Unknown reference" | ("fr" :ascii "Destination inconnue" :default "Référence inconnue"))) | "Dictionary for export engine. | | Alist whose CAR is the string to translate and CDR is an alist | whose CAR is the language string and CDR is a plist whose | properties are possible charsets and values translated terms. | | It is used as a database for `org-export-translate'. Since this | function returns the string as-is if no translation was found, | the variable only needs to record values different from the | entry.") | | (defun org-export-translate (s encoding info) | "Translate string S according to language specification. | | ENCODING is a symbol among `:ascii', `:html', `:latex', `:latin1' | and `:utf-8'. INFO is a plist used as a communication channel. | | Translation depends on `:language' property. Return the | translated string. If no translation is found, try to fall back | to `:default' encoding. If it fails, return S.") `---- Asynchronous Export =================== `org-export-async-start' is the entry point for asynchronous export. It recreates current buffer (including visibility, narrowing and visited file) in an external Emacs process, and evaluates a command there. It then applies a function on the returned results in the current process. Asynchronously generated results are never displayed directly. Instead, they are stored in `org-export-stack-contents'. They can then be retrieved by calling `org-export-stack'. Export Stack is viewed through a dedicated major mode `org-export-stack-mode' and tools: `org-export-stack-refresh', `org-export-stack-delete', `org-export-stack-view' and `org-export-stack-clear'. For back-ends, `org-export-add-to-stack' add a new source to stack. It should used whenever `org-export-async-start' is called. ,---- | (defmacro org-export-async-start (fun &rest body) | "Call function FUN on the results returned by BODY evaluation. | | BODY evaluation happens in an asynchronous process, from a buffer | which is an exact copy of the current one. | | Use `org-export-add-to-stack' in FUN in order to register results | in the stack. Examples for, respectively a temporary buffer and | a file are: | | \(org-export-async-start | \(lambda (output) | \(with-current-buffer (get-buffer-create \"*Org BACKEND Export*\") | \(erase-buffer) | \(insert output) | \(goto-char (point-min)) | \(org-export-add-to-stack (current-buffer) 'backend))) | `(org-export-as 'backend ,subtreep ,visible-only ,body-only ',ext-plist)) | | and | | \(org-export-async-start | \(lambda (f) (org-export-add-to-stack f 'backend)) | `(expand-file-name | \(org-export-to-file | 'backend ,outfile ,subtreep ,visible-only ,body-only ',ext-plist)))") | | (defun org-export-add-to-stack (source backend &optional process) | "Add a new result to export stack if not present already. | | SOURCE is a buffer or a file name containing export results. | BACKEND is a symbol representing export back-end used to generate | it. | | Entries already pointing to SOURCE and unavailable entries are | removed beforehand. Return the new stack.") | | (defun org-export-stack () | "Menu for asynchronous export results and running processes.") | | (defun org-export--stack-source-at-point () | "Return source from export results at point in stack.") | | (defun org-export-stack-clear () | "Remove all entries from export stack.") | | (defun org-export-stack-refresh (&rest dummy) | "Refresh the asynchronous export stack. | DUMMY is ignored. Unavailable sources are removed from the list. | Return the new stack.") | | (defun org-export-stack-remove (&optional source) | "Remove export results at point from stack. | If optional argument SOURCE is non-nil, remove it instead.") | | (defun org-export-stack-view (&optional in-emacs) | "View export results at point in stack. | With an optional prefix argument IN-EMACS, force viewing files | within Emacs.") | | (defconst org-export-stack-mode-map | (let ((km (make-sparse-keymap))) | (define-key km " " 'next-line) | (define-key km "n" 'next-line) | (define-key km "\C-n" 'next-line) | (define-key km [down] 'next-line) | (define-key km "p" 'previous-line) | (define-key km "\C-p" 'previous-line) | (define-key km "\C-?" 'previous-line) | (define-key km [up] 'previous-line) | (define-key km "C" 'org-export-stack-clear) | (define-key km "v" 'org-export-stack-view) | (define-key km (kbd "RET") 'org-export-stack-view) | (define-key km "d" 'org-export-stack-remove) | km) | "Keymap for Org Export Stack.") | | (define-derived-mode org-export-stack-mode special-mode "Org-Stack" | "Mode for displaying asynchronous export stack. | | Type \\[org-export-stack] to visualize the asynchronous export | stack. | | In an Org Export Stack buffer, use \\\\[org-export-stack-view] to view export output | on current line, \\[org-export-stack-remove] to remove it from the stack and \\[org-export-stack-clear] to clear | stack completely. | | Removing entries in an Org Export Stack buffer doesn't affect | files or buffers, only the display. | | \\{org-export-stack-mode-map}" | (abbrev-mode 0) | (auto-fill-mode 0) | (setq buffer-read-only t | buffer-undo-list t | truncate-lines t | header-line-format | '(:eval | (format " %-12s | %6s | %s" "Back-End" "Age" "Source"))) | (org-add-hook 'post-command-hook 'org-export-stack-refresh nil t) | (set (make-local-variable 'revert-buffer-function) | 'org-export-stack-refresh)) `---- The Dispatcher ============== `org-export-dispatch' is the standard interactive way to start an export process. It uses `org-export--dispatch-ui' as a subroutine for its interface, which, in turn, delegates response to key pressed to `org-export--dispatch-action'. ###autoload ,---- | (defun org-export-dispatch (&optional arg) | "Export dispatcher for Org mode. | | It provides an access to common export related tasks in a buffer. | Its interface comes in two flavours: standard and expert. | | While both share the same set of bindings, only the former | displays the valid keys associations in a dedicated buffer. | Scrolling (resp. line-wise motion) in this buffer is done with | SPC and DEL (resp. C-n and C-p) keys. | | Set variable `org-export-dispatch-use-expert-ui' to switch to one | flavour or the other. | | When ARG is \\[universal-argument], repeat the last export action, with the same set | of options used back then, on the current buffer. | | When ARG is \\[universal-argument] \\[universal-argument], | display the asynchronous export stack.") | | (defun org-export--dispatch-ui (options first-key expertp) | "Handle interface for `org-export-dispatch'. | | OPTIONS is a list containing current interactive options set for | export. It can contain any of the following symbols: | `body' toggles a body-only export | `subtree' restricts export to current subtree | `visible' restricts export to visible part of buffer. | `force' force publishing files. | `async' use asynchronous export process | | FIRST-KEY is the key pressed to select the first level menu. It | is nil when this menu hasn't been selected yet. | | EXPERTP, when non-nil, triggers expert UI. In that case, no help | buffer is provided, but indications about currently active | options are given in the prompt. Moreover, \[?] allows to switch | back to standard interface.") | | (defun org-export--dispatch-action | (prompt allowed-keys backends options first-key expertp) | "Read a character from command input and act accordingly. | | PROMPT is the displayed prompt, as a string. ALLOWED-KEYS is | a list of characters available at a given step in the process. | BACKENDS is a list of menu entries. OPTIONS, FIRST-KEY and | EXPERTP are the same as defined in `org-export--dispatch-ui', | which see. | | Toggle export options when required. Otherwise, return value is | a list with action as CAR and a list of interactive export | options as CDR.") | | (provide 'ox) `---- Local variables: generated-autoload-file: "org-loaddefs.el" End: ox.el ends here =============== --=-=-= Content-Type: application/vnd.lotus-organizer Content-Disposition: attachment; filename=ox-docstrings.org Content-Transfer-Encoding: base64 Content-Description: Docstrings from ox.el (as org file) IytPUFRJT05TOiAgICBIOjMgbnVtOm5pbCB0b2M6dCBcbjpuaWwgOjp0IHw6dCBeOnQgLTp0IGY6 dCAqOnQgdGV4OnQgZDooSElERSkgdGFnczpub3QtaW4tdG9jCiMrU1RBUlRVUDogICAgYWxpZ24g Zm9sZCBub2RsY2hlY2sgaGlkZXN0YXJzIG9kZGV2ZW4gbG9nbm90ZXN0YXRlIGhpZGVibG9ja3MK IytTRVFfVE9ETzogICBUT0RPKHQpIElOUFJPR1JFU1MoaSkgV0FJVElORyh3QCkgfCBET05FKGQp IENBTkNFTEVEKGNAKQojK1RBR1M6ICAgICAgIFdyaXRlKHcpIFVwZGF0ZSh1KSBGaXgoZikgQ2hl Y2soYykgbm9leHBvcnQobikKIytUSVRMRTogICAgICBEb2NzdHJpbmdzIGZyb20gJ294LmVsJyAK IytBVVRIT1I6ICAgICBUaG9yc3RlbiBKb2xpdHoKIytFTUFJTDogICAgICB0am9saXR6W2F0XWdt YWlsW2RvdF1jb20KIytMQU5HVUFHRTogICBlbgojK1NUWUxFOiAgICAgIDxzdHlsZSB0eXBlPSJ0 ZXh0L2NzcyI+I291dGxpbmUtY29udGFpbmVyLWludHJvZHVjdGlvbnsgY2xlYXI6Ym90aDsgfTwv c3R5bGU+CiMrTElOS19VUDogICAgLi4vb3gtb3ZlcnZpZXcuaHRtbAojK0xJTktfSE9NRTogIGh0 dHA6Ly9vcmdtb2RlLm9yZy93b3JnLwojK0VYQ0xVREVfVEFHUzogbm9leHBvcnQKCltbZmlsZTpp bmRleC5vcmddW3tCYWNrIHRvIFdvcmcncyBpbmRleH1dXQoKKiBveC5lbCAtLS0gR2VuZXJpYyBF eHBvcnQgRW5naW5lIGZvciBPcmcgTW9kZQoKQ29weXJpZ2h0IChDKSAyMDEyLCAyMDEzICBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCkF1dGhvcjogTmljb2xhcyBHb2F6aW91IDxuLmdv YXppb3UgYXQgZ21haWwgZG90IGNvbT4KS2V5d29yZHM6IG91dGxpbmVzLCBoeXBlcm1lZGlhLCBj YWxlbmRhciwgd3AKCkdOVSBFbWFjcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCgpHTlUgRW1hY3MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCBHTlUgRW1hY3Mu ICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgoqIENvbW1lbnRh cnk6CgpUaGlzIGxpYnJhcnkgaW1wbGVtZW50cyBhIGdlbmVyaWMgZXhwb3J0IGVuZ2luZSBmb3Ig T3JnLCBidWlsdCBvbgppdHMgc3ludGFjdGljYWwgcGFyc2VyOiBPcmcgRWxlbWVudHMuCgpCZXNp ZGVzIHRoYXQgcGFyc2VyLCB0aGUgZ2VuZXJpYyBleHBvcnRlciBpcyBtYWRlIG9mIHRocmVlIGRp c3RpbmN0CnBhcnRzOgoKLSBUaGUgY29tbXVuaWNhdGlvbiBjaGFubmVsIGNvbnNpc3RzIGluIGEg cHJvcGVydHkgbGlzdCwgd2hpY2ggaXMKICBjcmVhdGVkIGFuZCB1cGRhdGVkIGR1cmluZyB0aGUg cHJvY2Vzcy4gIEl0cyB1c2UgaXMgdG8gb2ZmZXIKICBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlv biwgd291bGQgaXQgYmUgYWJvdXQgaW5pdGlhbCBlbnZpcm9ubWVudAogIG9yIGNvbnRleHR1YWwg ZGF0YSwgYWxsIGluIGEgc2luZ2xlIHBsYWNlLiAgVGhlIGV4aGF1c3RpdmUgbGlzdAogIG9mIHBy b3BlcnRpZXMgaXMgZ2l2ZW4gaW4gIlRoZSBDb21tdW5pY2F0aW9uIENoYW5uZWwiIHNlY3Rpb24g b2YKICB0aGlzIGZpbGUuCgotIFRoZSB0cmFuc2NvZGVyIHdhbGtzIHRoZSBwYXJzZSB0cmVlLCBp Z25vcmVzIG9yIHRyZWF0IGFzIHBsYWluCiAgdGV4dCBlbGVtZW50cyBhbmQgb2JqZWN0cyBhY2Nv cmRpbmcgdG8gZXhwb3J0IG9wdGlvbnMsIGFuZAogIGV2ZW50dWFsbHkgY2FsbHMgYmFjay1lbmQg c3BlY2lmaWMgZnVuY3Rpb25zIHRvIGRvIHRoZSByZWFsCiAgdHJhbnNjb2RpbmcsIGNvbmNhdGVu YXRpbmcgdGhlaXIgcmV0dXJuIHZhbHVlIGFsb25nIHRoZSB3YXkuCgotIFRoZSBmaWx0ZXIgc3lz dGVtIGlzIGFjdGl2YXRlZCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgYW5kIHRoZSB2ZXJ5CiAgZW5k IG9mIHRoZSBleHBvcnQgcHJvY2VzcywgYW5kIGVhY2ggdGltZSBhbiBlbGVtZW50IG9yIGFuIG9i amVjdAogIGhhcyBiZWVuIGNvbnZlcnRlZC4gIEl0IGlzIHRoZSBlbnRyeSBwb2ludCB0byBmaW5l LXR1bmUgc3RhbmRhcmQKICBvdXRwdXQgZnJvbSBiYWNrLWVuZCB0cmFuc2NvZGVycy4gIFNlZSAi VGhlIEZpbHRlciBTeXN0ZW0iCiAgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KClRoZSBj b3JlIGZ1bmN0aW9uIGlzIGBvcmctZXhwb3J0LWFzJy4gIEl0IHJldHVybnMgdGhlIHRyYW5zY29k ZWQKYnVmZmVyIGFzIGEgc3RyaW5nLgoKQW4gZXhwb3J0IGJhY2stZW5kIGlzIGRlZmluZWQgd2l0 aCBgb3JnLWV4cG9ydC1kZWZpbmUtYmFja2VuZCcsCndoaWNoIGRlZmluZXMgb25lIG1hbmRhdG9y eSBpbmZvcm1hdGlvbjogaGlzIHRyYW5zbGF0aW9uIHRhYmxlLgpJdHMgdmFsdWUgaXMgYW4gYWxp c3Qgd2hvc2Uga2V5cyBhcmUgZWxlbWVudHMgYW5kIG9iamVjdHMgdHlwZXMgYW5kCnZhbHVlcyB0 cmFuc2xhdG9yIGZ1bmN0aW9ucy4gIFNlZSBmdW5jdGlvbidzIGRvY3N0cmluZyBmb3IgbW9yZQpp bmZvcm1hdGlvbiBhYm91dCB0cmFuc2xhdG9ycy4KCk9wdGlvbmFsbHksIGBvcmctZXhwb3J0LWRl ZmluZS1iYWNrZW5kJyBjYW4gYWxzbyBzdXBwb3J0IHNwZWNpZmljCmJ1ZmZlciBrZXl3b3Jkcywg T1BUSU9OIGtleXdvcmQncyBpdGVtcyBhbmQgZmlsdGVycy4gIEFsc28gcmVmZXIgdG8KZnVuY3Rp b24gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCklmIHRoZSBuZXcgYmFjay1l bmQgc2hhcmVzIG1vc3QgcHJvcGVydGllcyB3aXRoIGFub3RoZXIgb25lLApgb3JnLWV4cG9ydC1k ZWZpbmUtZGVyaXZlZC1iYWNrZW5kJyBjYW4gYmUgdXNlZCB0byBzaW1wbGlmeSB0aGUKcHJvY2Vz cy4KCkFueSBiYWNrLWVuZCBjYW4gZGVmaW5lIGl0cyBvd24gdmFyaWFibGVzLiAgQW1vbmcgdGhl bSwgdGhvc2UKY3VzdG9taXphYmxlIHNob3VsZCBiZWxvbmcgdG8gdGhlIGBvcmctZXhwb3J0LUJB Q0tFTkQnIGdyb3VwLgoKVG9vbHMgZm9yIGNvbW1vbiB0YXNrcyBhY3Jvc3MgYmFjay1lbmRzIGFy ZSBpbXBsZW1lbnRlZCBpbiB0aGUKZm9sbG93aW5nIHBhcnQgb2YgdGhlIGZpbGUuCgpUaGVuLCBh IHdyYXBwZXIgbWFjcm8gZm9yIGFzeW5jaHJvbm91cyBleHBvcnQsCmBvcmctZXhwb3J0LWFzeW5j LXN0YXJ0JywgYWxvbmcgd2l0aCB0b29scyB0byBkaXNwbGF5IHJlc3VsdHMuIGFyZQpnaXZlbiBp biB0aGUgcGVudWx0aW1hdGUgcGFydC4KCkV2ZW50dWFsbHksIGEgZGlzcGF0Y2hlciAoYG9yZy1l eHBvcnQtZGlzcGF0Y2gnKSBmb3Igc3RhbmRhcmQKYmFjay1lbmRzIGlzIHByb3ZpZGVkIGluIHRo ZSBsYXN0IG9uZS4KCiogQ29kZToKCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGV2YWwtd2hlbi1j b21waWxlIChyZXF1aXJlICdjbCkpCihyZXF1aXJlICdvcmctZWxlbWVudCkKKHJlcXVpcmUgJ29y Zy1tYWNybykKKHJlcXVpcmUgJ29iLWV4cCkKCihkZWNsYXJlLWZ1bmN0aW9uIG9yZy1wdWJsaXNo ICJveC1wdWJsaXNoIiAocHJvamVjdCAmb3B0aW9uYWwgZm9yY2UgYXN5bmMpKQooZGVjbGFyZS1m dW5jdGlvbiBvcmctcHVibGlzaC1hbGwgIm94LXB1Ymxpc2giICgmb3B0aW9uYWwgZm9yY2UgYXN5 bmMpKQooZGVjbGFyZS1mdW5jdGlvbgogb3JnLXB1Ymxpc2gtY3VycmVudC1maWxlICJveC1wdWJs aXNoIiAoJm9wdGlvbmFsIGZvcmNlIGFzeW5jKSkKKGRlY2xhcmUtZnVuY3Rpb24gb3JnLXB1Ymxp c2gtY3VycmVudC1wcm9qZWN0ICJveC1wdWJsaXNoIgoJCSAgKCZvcHRpb25hbCBmb3JjZSBhc3lu YykpCgooZGVmdmFyIG9yZy1wdWJsaXNoLXByb2plY3QtYWxpc3QpCihkZWZ2YXIgb3JnLXRhYmxl LW51bWJlci1mcmFjdGlvbikKKGRlZnZhciBvcmctdGFibGUtbnVtYmVyLXJlZ2V4cCkKCgojK2Vu ZF9zcmMKCiogSW50ZXJuYWwgVmFyaWFibGVzCgpBbW9uZyBpbnRlcm5hbCB2YXJpYWJsZXMsIHRo ZSBtb3N0IGltcG9ydGFudCBpcwpgb3JnLWV4cG9ydC1vcHRpb25zLWFsaXN0Jy4gIFRoaXMgdmFy aWFibGUgZGVmaW5lIHRoZSBnbG9iYWwgZXhwb3J0Cm9wdGlvbnMsIHNoYXJlZCBiZXR3ZWVuIGV2 ZXJ5IGV4cG9ydGVyLCBhbmQgaG93IHRoZXkgYXJlIGFjcXVpcmVkLgoKIytiZWdpbl9zcmMgZW1h Y3MtbGlzcAooZGVmY29uc3Qgb3JnLWV4cG9ydC1tYXgtZGVwdGggMTkKICAiTWF4aW11bSBuZXN0 aW5nIGRlcHRoIGZvciBoZWFkbGluZXMsIGNvdW50aW5nIGZyb20gMC4iKQoKKGRlZmNvbnN0IG9y Zy1leHBvcnQtb3B0aW9ucy1hbGlzdAogICcoKDphdXRob3IgIkFVVEhPUiIgbmlsIHVzZXItZnVs bC1uYW1lIHQpCiAgICAoOmNyZWF0b3IgIkNSRUFUT1IiIG5pbCBvcmctZXhwb3J0LWNyZWF0b3It c3RyaW5nKQogICAgKDpkYXRlICJEQVRFIiBuaWwgbmlsIHQpCiAgICAoOmRlc2NyaXB0aW9uICJE RVNDUklQVElPTiIgbmlsIG5pbCBuZXdsaW5lKQogICAgKDplbWFpbCAiRU1BSUwiIG5pbCB1c2Vy LW1haWwtYWRkcmVzcyB0KQogICAgKDpleGNsdWRlLXRhZ3MgIkVYQ0xVREVfVEFHUyIgbmlsIG9y Zy1leHBvcnQtZXhjbHVkZS10YWdzIHNwbGl0KQogICAgKDpoZWFkbGluZS1sZXZlbHMgbmlsICJI IiBvcmctZXhwb3J0LWhlYWRsaW5lLWxldmVscykKICAgICg6a2V5d29yZHMgIktFWVdPUkRTIiBu aWwgbmlsIHNwYWNlKQogICAgKDpsYW5ndWFnZSAiTEFOR1VBR0UiIG5pbCBvcmctZXhwb3J0LWRl ZmF1bHQtbGFuZ3VhZ2UgdCkKICAgICg6cHJlc2VydmUtYnJlYWtzIG5pbCAiXFxuIiBvcmctZXhw b3J0LXByZXNlcnZlLWJyZWFrcykKICAgICg6c2VjdGlvbi1udW1iZXJzIG5pbCAibnVtIiBvcmct ZXhwb3J0LXdpdGgtc2VjdGlvbi1udW1iZXJzKQogICAgKDpzZWxlY3QtdGFncyAiU0VMRUNUX1RB R1MiIG5pbCBvcmctZXhwb3J0LXNlbGVjdC10YWdzIHNwbGl0KQogICAgKDp0aW1lLXN0YW1wLWZp bGUgbmlsICJ0aW1lc3RhbXAiIG9yZy1leHBvcnQtdGltZS1zdGFtcC1maWxlKQogICAgKDp0aXRs ZSAiVElUTEUiIG5pbCBvcmctZXhwb3J0LS1kZWZhdWx0LXRpdGxlIHNwYWNlKQogICAgKDp3aXRo LWFyY2hpdmVkLXRyZWVzIG5pbCAiYXJjaCIgb3JnLWV4cG9ydC13aXRoLWFyY2hpdmVkLXRyZWVz KQogICAgKDp3aXRoLWF1dGhvciBuaWwgImF1dGhvciIgb3JnLWV4cG9ydC13aXRoLWF1dGhvcikK ICAgICg6d2l0aC1jbG9ja3MgbmlsICJjIiBvcmctZXhwb3J0LXdpdGgtY2xvY2tzKQogICAgKDp3 aXRoLWNyZWF0b3IgbmlsICJjcmVhdG9yIiBvcmctZXhwb3J0LXdpdGgtY3JlYXRvcikKICAgICg6 d2l0aC1kYXRlIG5pbCAiZGF0ZSIgb3JnLWV4cG9ydC13aXRoLWRhdGUpCiAgICAoOndpdGgtZHJh d2VycyBuaWwgImQiIG9yZy1leHBvcnQtd2l0aC1kcmF3ZXJzKQogICAgKDp3aXRoLWVtYWlsIG5p bCAiZW1haWwiIG9yZy1leHBvcnQtd2l0aC1lbWFpbCkKICAgICg6d2l0aC1lbXBoYXNpemUgbmls ICIqIiBvcmctZXhwb3J0LXdpdGgtZW1waGFzaXplKQogICAgKDp3aXRoLWVudGl0aWVzIG5pbCAi ZSIgb3JnLWV4cG9ydC13aXRoLWVudGl0aWVzKQogICAgKDp3aXRoLWZpeGVkLXdpZHRoIG5pbCAi OiIgb3JnLWV4cG9ydC13aXRoLWZpeGVkLXdpZHRoKQogICAgKDp3aXRoLWZvb3Rub3RlcyBuaWwg ImYiIG9yZy1leHBvcnQtd2l0aC1mb290bm90ZXMpCiAgICAoOndpdGgtaW5saW5ldGFza3Mgbmls ICJpbmxpbmUiIG9yZy1leHBvcnQtd2l0aC1pbmxpbmV0YXNrcykKICAgICg6d2l0aC1sYXRleCBu aWwgInRleCIgb3JnLWV4cG9ydC13aXRoLWxhdGV4KQogICAgKDp3aXRoLXBsYW5uaW5nIG5pbCAi cCIgb3JnLWV4cG9ydC13aXRoLXBsYW5uaW5nKQogICAgKDp3aXRoLXByaW9yaXR5IG5pbCAicHJp IiBvcmctZXhwb3J0LXdpdGgtcHJpb3JpdHkpCiAgICAoOndpdGgtc21hcnQtcXVvdGVzIG5pbCAi JyIgb3JnLWV4cG9ydC13aXRoLXNtYXJ0LXF1b3RlcykKICAgICg6d2l0aC1zcGVjaWFsLXN0cmlu Z3MgbmlsICItIiBvcmctZXhwb3J0LXdpdGgtc3BlY2lhbC1zdHJpbmdzKQogICAgKDp3aXRoLXN0 YXRpc3RpY3MtY29va2llcyBuaWwgInN0YXQiIG9yZy1leHBvcnQtd2l0aC1zdGF0aXN0aWNzLWNv b2tpZXMpCiAgICAoOndpdGgtc3ViLXN1cGVyc2NyaXB0IG5pbCAiXiIgb3JnLWV4cG9ydC13aXRo LXN1Yi1zdXBlcnNjcmlwdHMpCiAgICAoOndpdGgtdG9jIG5pbCAidG9jIiBvcmctZXhwb3J0LXdp dGgtdG9jKQogICAgKDp3aXRoLXRhYmxlcyBuaWwgInwiIG9yZy1leHBvcnQtd2l0aC10YWJsZXMp CiAgICAoOndpdGgtdGFncyBuaWwgInRhZ3MiIG9yZy1leHBvcnQtd2l0aC10YWdzKQogICAgKDp3 aXRoLXRhc2tzIG5pbCAidGFza3MiIG9yZy1leHBvcnQtd2l0aC10YXNrcykKICAgICg6d2l0aC10 aW1lc3RhbXBzIG5pbCAiPCIgb3JnLWV4cG9ydC13aXRoLXRpbWVzdGFtcHMpCiAgICAoOndpdGgt dG9kby1rZXl3b3JkcyBuaWwgInRvZG8iIG9yZy1leHBvcnQtd2l0aC10b2RvLWtleXdvcmRzKSkK ICAiQWxpc3QgYmV0d2VlbiBleHBvcnQgcHJvcGVydGllcyBhbmQgd2F5cyB0byBzZXQgdGhlbS4K ClRoZSBDQVIgb2YgdGhlIGFsaXN0IGlzIHRoZSBwcm9wZXJ0eSBuYW1lLCBhbmQgdGhlIENEUiBp cyBhIGxpc3QKbGlrZSAoS0VZV09SRCBPUFRJT04gREVGQVVMVCBCRUhBVklPVVIpIHdoZXJlOgoK S0VZV09SRCBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBidWZmZXIga2V5d29yZCwgb3Igbmls LiAgRWFjaAogIHByb3BlcnR5IGRlZmluZWQgdGhpcyB3YXkgY2FuIGFsc28gYmUgc2V0LCBkdXJp bmcgc3VidHJlZQogIGV4cG9ydCwgdGhyb3VnaCBhIGhlYWRsaW5lIHByb3BlcnR5IG5hbWVkIGFm dGVyIHRoZSBrZXl3b3JkCiAgd2l0aCB0aGUgXCJFWFBPUlRfXCIgcHJlZml4IChpLmUuIERBVEUg a2V5d29yZCBhbmQgRVhQT1JUX0RBVEUKICBwcm9wZXJ0eSkuCk9QVElPTiBpcyBhIHN0cmluZyB0 aGF0IGNvdWxkIGJlIGZvdW5kIGluIGFuICMrT1BUSU9OUzogbGluZS4KREVGQVVMVCBpcyB0aGUg ZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LgpCRUhBVklPVVIgZGV0ZXJtaW5lcyBob3cg T3JnIHNob3VsZCBoYW5kbGUgbXVsdGlwbGUga2V5d29yZHMgZm9yCiAgdGhlIHNhbWUgcHJvcGVy dHkuICBJdCBpcyBhIHN5bWJvbCBhbW9uZzoKICBuaWwgICAgICAgS2VlcCBvbGQgdmFsdWUgYW5k IGRpc2NhcmQgdGhlIG5ldyBvbmUuCiAgdCAgICAgICAgIFJlcGxhY2Ugb2xkIHZhbHVlIHdpdGgg dGhlIG5ldyBvbmUuCiAgYHNwYWNlJyAgIENvbmNhdGVuYXRlIHRoZSB2YWx1ZXMsIHNlcGFyYXRp bmcgdGhlbSB3aXRoIGEgc3BhY2UuCiAgYG5ld2xpbmUnIENvbmNhdGVuYXRlIHRoZSB2YWx1ZXMs IHNlcGFyYXRpbmcgdGhlbSB3aXRoCgkgICAgYSBuZXdsaW5lLgogIGBzcGxpdCcgICBTcGxpdCB2 YWx1ZXMgYXQgd2hpdGUgc3BhY2VzLCBhbmQgY29ucyB0aGVtIHRvIHRoZQoJICAgIHByZXZpb3Vz IGxpc3QuCgpWYWx1ZXMgc2V0IHRocm91Z2ggS0VZV09SRCBhbmQgT1BUSU9OIGhhdmUgcHJlY2Vk ZW5jZSBvdmVyCkRFRkFVTFQuCgpBbGwgdGhlc2UgcHJvcGVydGllcyBzaG91bGQgYmUgYmFjay1l bmQgYWdub3N0aWMuICBCYWNrLWVuZApzcGVjaWZpYyBwcm9wZXJ0aWVzIGFyZSBzZXQgdGhyb3Vn aCBgb3JnLWV4cG9ydC1kZWZpbmUtYmFja2VuZCcuClByb3BlcnRpZXMgcmVkZWZpbmVkIHRoZXJl IGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoZXNlLiIpCgooZGVmY29uc3Qgb3JnLWV4cG9ydC1zcGVj aWFsLWtleXdvcmRzICcoIkZJTEVUQUdTIiAiU0VUVVBGSUxFIiAiT1BUSU9OUyIpCiAgIkxpc3Qg b2YgaW4tYnVmZmVyIGtleXdvcmRzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudC4KVGhl c2Uga2V5d29yZHMgYXJlIG5vdCBkaXJlY3RseSBhc3NvY2lhdGVkIHRvIGEgcHJvcGVydHkuICBU aGUKd2F5IHRoZXkgYXJlIGhhbmRsZWQgbXVzdCBiZSBoYXJkLWNvZGVkIGludG8KYG9yZy1leHBv cnQtLWdldC1pbmJ1ZmZlci1vcHRpb25zJyBmdW5jdGlvbi4iKQoKKGRlZmNvbnN0IG9yZy1leHBv cnQtZmlsdGVycy1hbGlzdAogICcoKDpmaWx0ZXItYm9sZCAuIG9yZy1leHBvcnQtZmlsdGVyLWJv bGQtZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItYmFiZWwtY2FsbCAuIG9yZy1leHBvcnQtZmlsdGVy LWJhYmVsLWNhbGwtZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItY2VudGVyLWJsb2NrIC4gb3JnLWV4 cG9ydC1maWx0ZXItY2VudGVyLWJsb2NrLWZ1bmN0aW9ucykKICAgICg6ZmlsdGVyLWNsb2NrIC4g b3JnLWV4cG9ydC1maWx0ZXItY2xvY2stZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItY29kZSAuIG9y Zy1leHBvcnQtZmlsdGVyLWNvZGUtZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItY29tbWVudCAuIG9y Zy1leHBvcnQtZmlsdGVyLWNvbW1lbnQtZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItY29tbWVudC1i bG9jayAuIG9yZy1leHBvcnQtZmlsdGVyLWNvbW1lbnQtYmxvY2stZnVuY3Rpb25zKQogICAgKDpm aWx0ZXItZGlhcnktc2V4cCAuIG9yZy1leHBvcnQtZmlsdGVyLWRpYXJ5LXNleHAtZnVuY3Rpb25z KQogICAgKDpmaWx0ZXItZHJhd2VyIC4gb3JnLWV4cG9ydC1maWx0ZXItZHJhd2VyLWZ1bmN0aW9u cykKICAgICg6ZmlsdGVyLWR5bmFtaWMtYmxvY2sgLiBvcmctZXhwb3J0LWZpbHRlci1keW5hbWlj LWJsb2NrLWZ1bmN0aW9ucykKICAgICg6ZmlsdGVyLWVudGl0eSAuIG9yZy1leHBvcnQtZmlsdGVy LWVudGl0eS1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1leGFtcGxlLWJsb2NrIC4gb3JnLWV4cG9y dC1maWx0ZXItZXhhbXBsZS1ibG9jay1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1leHBvcnQtYmxv Y2sgLiBvcmctZXhwb3J0LWZpbHRlci1leHBvcnQtYmxvY2stZnVuY3Rpb25zKQogICAgKDpmaWx0 ZXItZXhwb3J0LXNuaXBwZXQgLiBvcmctZXhwb3J0LWZpbHRlci1leHBvcnQtc25pcHBldC1mdW5j dGlvbnMpCiAgICAoOmZpbHRlci1maW5hbC1vdXRwdXQgLiBvcmctZXhwb3J0LWZpbHRlci1maW5h bC1vdXRwdXQtZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItZml4ZWQtd2lkdGggLiBvcmctZXhwb3J0 LWZpbHRlci1maXhlZC13aWR0aC1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1mb290bm90ZS1kZWZp bml0aW9uIC4gb3JnLWV4cG9ydC1maWx0ZXItZm9vdG5vdGUtZGVmaW5pdGlvbi1mdW5jdGlvbnMp CiAgICAoOmZpbHRlci1mb290bm90ZS1yZWZlcmVuY2UgLiBvcmctZXhwb3J0LWZpbHRlci1mb290 bm90ZS1yZWZlcmVuY2UtZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItaGVhZGxpbmUgLiBvcmctZXhw b3J0LWZpbHRlci1oZWFkbGluZS1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1ob3Jpem9udGFsLXJ1 bGUgLiBvcmctZXhwb3J0LWZpbHRlci1ob3Jpem9udGFsLXJ1bGUtZnVuY3Rpb25zKQogICAgKDpm aWx0ZXItaW5saW5lLWJhYmVsLWNhbGwgLiBvcmctZXhwb3J0LWZpbHRlci1pbmxpbmUtYmFiZWwt Y2FsbC1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1pbmxpbmUtc3JjLWJsb2NrIC4gb3JnLWV4cG9y dC1maWx0ZXItaW5saW5lLXNyYy1ibG9jay1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1pbmxpbmV0 YXNrIC4gb3JnLWV4cG9ydC1maWx0ZXItaW5saW5ldGFzay1mdW5jdGlvbnMpCiAgICAoOmZpbHRl ci1pdGFsaWMgLiBvcmctZXhwb3J0LWZpbHRlci1pdGFsaWMtZnVuY3Rpb25zKQogICAgKDpmaWx0 ZXItaXRlbSAuIG9yZy1leHBvcnQtZmlsdGVyLWl0ZW0tZnVuY3Rpb25zKQogICAgKDpmaWx0ZXIt a2V5d29yZCAuIG9yZy1leHBvcnQtZmlsdGVyLWtleXdvcmQtZnVuY3Rpb25zKQogICAgKDpmaWx0 ZXItbGF0ZXgtZW52aXJvbm1lbnQgLiBvcmctZXhwb3J0LWZpbHRlci1sYXRleC1lbnZpcm9ubWVu dC1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1sYXRleC1mcmFnbWVudCAuIG9yZy1leHBvcnQtZmls dGVyLWxhdGV4LWZyYWdtZW50LWZ1bmN0aW9ucykKICAgICg6ZmlsdGVyLWxpbmUtYnJlYWsgLiBv cmctZXhwb3J0LWZpbHRlci1saW5lLWJyZWFrLWZ1bmN0aW9ucykKICAgICg6ZmlsdGVyLWxpbmsg LiBvcmctZXhwb3J0LWZpbHRlci1saW5rLWZ1bmN0aW9ucykKICAgICg6ZmlsdGVyLW5vZGUtcHJv cGVydHkgLiBvcmctZXhwb3J0LWZpbHRlci1ub2RlLXByb3BlcnR5LWZ1bmN0aW9ucykKICAgICg6 ZmlsdGVyLW9wdGlvbnMgLiBvcmctZXhwb3J0LWZpbHRlci1vcHRpb25zLWZ1bmN0aW9ucykKICAg ICg6ZmlsdGVyLXBhcmFncmFwaCAuIG9yZy1leHBvcnQtZmlsdGVyLXBhcmFncmFwaC1mdW5jdGlv bnMpCiAgICAoOmZpbHRlci1wYXJzZS10cmVlIC4gb3JnLWV4cG9ydC1maWx0ZXItcGFyc2UtdHJl ZS1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1wbGFpbi1saXN0IC4gb3JnLWV4cG9ydC1maWx0ZXIt cGxhaW4tbGlzdC1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1wbGFpbi10ZXh0IC4gb3JnLWV4cG9y dC1maWx0ZXItcGxhaW4tdGV4dC1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1wbGFubmluZyAuIG9y Zy1leHBvcnQtZmlsdGVyLXBsYW5uaW5nLWZ1bmN0aW9ucykKICAgICg6ZmlsdGVyLXByb3BlcnR5 LWRyYXdlciAuIG9yZy1leHBvcnQtZmlsdGVyLXByb3BlcnR5LWRyYXdlci1mdW5jdGlvbnMpCiAg ICAoOmZpbHRlci1xdW90ZS1ibG9jayAuIG9yZy1leHBvcnQtZmlsdGVyLXF1b3RlLWJsb2NrLWZ1 bmN0aW9ucykKICAgICg6ZmlsdGVyLXF1b3RlLXNlY3Rpb24gLiBvcmctZXhwb3J0LWZpbHRlci1x dW90ZS1zZWN0aW9uLWZ1bmN0aW9ucykKICAgICg6ZmlsdGVyLXJhZGlvLXRhcmdldCAuIG9yZy1l eHBvcnQtZmlsdGVyLXJhZGlvLXRhcmdldC1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1zZWN0aW9u IC4gb3JnLWV4cG9ydC1maWx0ZXItc2VjdGlvbi1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1zcGVj aWFsLWJsb2NrIC4gb3JnLWV4cG9ydC1maWx0ZXItc3BlY2lhbC1ibG9jay1mdW5jdGlvbnMpCiAg ICAoOmZpbHRlci1zcmMtYmxvY2sgLiBvcmctZXhwb3J0LWZpbHRlci1zcmMtYmxvY2stZnVuY3Rp b25zKQogICAgKDpmaWx0ZXItc3RhdGlzdGljcy1jb29raWUgLiBvcmctZXhwb3J0LWZpbHRlci1z dGF0aXN0aWNzLWNvb2tpZS1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci1zdHJpa2UtdGhyb3VnaCAu IG9yZy1leHBvcnQtZmlsdGVyLXN0cmlrZS10aHJvdWdoLWZ1bmN0aW9ucykKICAgICg6ZmlsdGVy LXN1YnNjcmlwdCAuIG9yZy1leHBvcnQtZmlsdGVyLXN1YnNjcmlwdC1mdW5jdGlvbnMpCiAgICAo OmZpbHRlci1zdXBlcnNjcmlwdCAuIG9yZy1leHBvcnQtZmlsdGVyLXN1cGVyc2NyaXB0LWZ1bmN0 aW9ucykKICAgICg6ZmlsdGVyLXRhYmxlIC4gb3JnLWV4cG9ydC1maWx0ZXItdGFibGUtZnVuY3Rp b25zKQogICAgKDpmaWx0ZXItdGFibGUtY2VsbCAuIG9yZy1leHBvcnQtZmlsdGVyLXRhYmxlLWNl bGwtZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItdGFibGUtcm93IC4gb3JnLWV4cG9ydC1maWx0ZXIt dGFibGUtcm93LWZ1bmN0aW9ucykKICAgICg6ZmlsdGVyLXRhcmdldCAuIG9yZy1leHBvcnQtZmls dGVyLXRhcmdldC1mdW5jdGlvbnMpCiAgICAoOmZpbHRlci10aW1lc3RhbXAgLiBvcmctZXhwb3J0 LWZpbHRlci10aW1lc3RhbXAtZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItdW5kZXJsaW5lIC4gb3Jn LWV4cG9ydC1maWx0ZXItdW5kZXJsaW5lLWZ1bmN0aW9ucykKICAgICg6ZmlsdGVyLXZlcmJhdGlt IC4gb3JnLWV4cG9ydC1maWx0ZXItdmVyYmF0aW0tZnVuY3Rpb25zKQogICAgKDpmaWx0ZXItdmVy c2UtYmxvY2sgLiBvcmctZXhwb3J0LWZpbHRlci12ZXJzZS1ibG9jay1mdW5jdGlvbnMpKQogICJB bGlzdCBiZXR3ZWVuIGZpbHRlcnMgcHJvcGVydGllcyBhbmQgaW5pdGlhbCB2YWx1ZXMuCgpUaGUg a2V5IG9mIGVhY2ggYXNzb2NpYXRpb24gaXMgYSBwcm9wZXJ0eSBuYW1lIGFjY2Vzc2libGUgdGhy b3VnaAp0aGUgY29tbXVuaWNhdGlvbiBjaGFubmVsLiAgSXRzIHZhbHVlIGlzIGEgY29uZmlndXJh YmxlIGdsb2JhbAp2YXJpYWJsZSBkZWZpbmluZyBpbml0aWFsIGZpbHRlcnMuCgpUaGlzIGxpc3Qg aXMgbWVhbnQgdG8gaW5zdGFsbCB1c2VyIHNwZWNpZmllZCBmaWx0ZXJzLiAgQmFjay1lbmQKZGV2 ZWxvcGVycyBtYXkgaW5zdGFsbCB0aGVpciBvd24gZmlsdGVycyB1c2luZwpgb3JnLWV4cG9ydC1k ZWZpbmUtYmFja2VuZCcuICBGaWx0ZXJzIGRlZmluZWQgdGhlcmUgd2lsbCBhbHdheXMKYmUgcHJl cGVuZGVkIHRvIHRoZSBjdXJyZW50IGxpc3QsIHNvIHRoZXkgYWx3YXlzIGdldCBhcHBsaWVkCmZp cnN0LiIpCgooZGVmY29uc3Qgb3JnLWV4cG9ydC1kZWZhdWx0LWlubGluZS1pbWFnZS1ydWxlCiAg YCgoImZpbGUiIC4KICAgICAsKGZvcm1hdCAiXFwuJXNcXCciCgkgICAgICAocmVnZXhwLW9wdAoJ ICAgICAgICcoInBuZyIgImpwZWciICJqcGciICJnaWYiICJ0aWZmIiAidGlmIiAieGJtIgoJCSAi eHBtIiAicGJtIiAicGdtIiAicHBtIikgdCkpKSkKICAiRGVmYXVsdCBydWxlIGZvciBsaW5rIG1h dGNoaW5nIGFuIGlubGluZSBpbWFnZS4KVGhpcyBydWxlIGFwcGxpZXMgdG8gbGlua3Mgd2l0aCBu byBkZXNjcmlwdGlvbi4gIEJ5IGRlZmF1bHQsIGl0CndpbGwgYmUgY29uc2lkZXJlZCBhcyBhbiBp bmxpbmUgaW1hZ2UgaWYgaXQgdGFyZ2V0cyBhIGxvY2FsIGZpbGUKd2hvc2UgZXh0ZW5zaW9uIGlz IGVpdGhlciBcInBuZ1wiLCBcImpwZWdcIiwgXCJqcGdcIiwgXCJnaWZcIiwKXCJ0aWZmXCIsIFwi dGlmXCIsIFwieGJtXCIsIFwieHBtXCIsIFwicGJtXCIsIFwicGdtXCIgb3IgXCJwcG1cIi4KU2Vl IGBvcmctZXhwb3J0LWlubGluZS1pbWFnZS1wJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dApy dWxlcy4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWFzeW5jLWRlYnVnIG5pbAogICJOb24tbmlsIG1l YW5zIGFzeW5jaHJvbm91cyBleHBvcnQgcHJvY2VzcyBzaG91bGQgbGVhdmUgZGF0YSBiZWhpbmQu CgpUaGlzIGRhdGEgaXMgZm91bmQgaW4gdGhlIGFwcHJvcHJpYXRlIFwiKk9yZyBFeHBvcnQgUHJv Y2VzcypcIgpidWZmZXIsIGFuZCBpbiBmaWxlcyBwcmVmaXhlZCB3aXRoIFwib3JnLWV4cG9ydC1w cm9jZXNzXCIgYW5kCmxvY2F0ZWQgaW4gYHRlbXBvcmFyeS1maWxlLWRpcmVjdG9yeScuCgpXaGVu IG5vbi1uaWwsIGl0IHdpbGwgYWxzbyBzZXQgYGRlYnVnLW9uLWVycm9yJyB0byBhIG5vbi1uaWwK dmFsdWUgaW4gdGhlIGV4dGVybmFsIHByb2Nlc3MuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1zdGFj ay1jb250ZW50cyBuaWwKICAiUmVjb3JkIGFzeW5jaHJvbm91c2x5IGdlbmVyYXRlZCBleHBvcnQg cmVzdWx0cyBhbmQgcHJvY2Vzc2VzLgpUaGlzIGlzIGFuIGFsaXN0OiBpdHMgQ0FSIGlzIHRoZSBz b3VyY2Ugb2YgdGhlCnJlc3VsdCAoZGVzdGluYXRpb24gZmlsZSBvciBidWZmZXIgZm9yIGEgZmlu aXNoZWQgcHJvY2VzcywKb3JpZ2luYWwgYnVmZmVyIGZvciBhIHJ1bm5pbmcgb25lKSBhbmQgaXRz IENEUiBpcyBhIGxpc3QKY29udGFpbmluZyB0aGUgYmFjay1lbmQgdXNlZCwgYXMgYSBzeW1ib2ws IGFuZCBlaXRoZXIgYSBwcm9jZXNzCm9yIHRoZSB0aW1lIGF0IHdoaWNoIGl0IGZpbmlzaGVkLiAg SXQgaXMgdXNlZCB0byBidWlsZCB0aGUgbWVudQpmcm9tIGBvcmctZXhwb3J0LXN0YWNrJy4iKQoK KGRlZnZhciBvcmctZXhwb3J0LXJlZ2lzdGVyZWQtYmFja2VuZHMgbmlsCiAgIkxpc3Qgb2YgYmFj a2VuZHMgY3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgZXhwb3J0ZXIuCgpBIGJhY2tlbmQgaXMg c3RvcmVkIGFzIGEgbGlzdCB3aGVyZSBDQVIgaXMgaXRzIG5hbWUsIGFzIGEgc3ltYm9sLAphbmQg Q0RSIGlzIGEgcGxpc3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CmA6ZmlsdGVycy1h bGlzdCcsIGA6bWVudS1lbnRyeScsIGA6b3B0aW9ucy1hbGlzdCcgYW5kCmA6dHJhbnNsYXRlLWFs aXN0Jy4KClRoaXMgdmFyaWFibGUgaXMgc2V0IHdpdGggYG9yZy1leHBvcnQtZGVmaW5lLWJhY2tl bmQnIGFuZApgb3JnLWV4cG9ydC1kZWZpbmUtZGVyaXZlZC1iYWNrZW5kJyBmdW5jdGlvbnMuIikK CihkZWZ2YXIgb3JnLWV4cG9ydC1kaXNwYXRjaC1sYXN0LWFjdGlvbiBuaWwKICAiTGFzdCBjb21t YW5kIGNhbGxlZCBmcm9tIHRoZSBkaXNwYXRjaGVyLgpUaGUgdmFsdWUgc2hvdWxkIGJlIGEgbGlz dC4gIEl0cyBDQVIgaXMgdGhlIGFjdGlvbiwgYXMgYSBzeW1ib2wsCmFuZCBpdHMgQ0RSIGlzIGEg bGlzdCBvZiBleHBvcnQgb3B0aW9ucy4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWRpc3BhdGNoLWxh c3QtcG9zaXRpb24gKG1ha2UtbWFya2VyKQogICJUaGUgcG9zaXRpb24gd2hlcmUgdGhlIGxhc3Qg ZXhwb3J0IGNvbW1hbmQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGRpc3BhdGNoZXIuClRoaXMgbWFy a2VyIHdpbGwgYmUgdXNlZCB3aXRoIGBDLXUgQy1jIEMtZScgdG8gbWFrZSBzdXJlIGV4cG9ydCBy ZXBldGl0aW9uCnVzZXMgdGhlIHNhbWUgc3VidHJlZSBpZiB0aGUgcHJldmlvdXMgY29tbWFuZCB3 YXMgcmVzdHJpY3RlZCB0byBhIHN1YnRyZWUuIikKCiMrZW5kX3NyYwoKKiBVc2VyLWNvbmZpZ3Vy YWJsZSBWYXJpYWJsZXMKCkNvbmZpZ3VyYXRpb24gZm9yIHRoZSBtYXNzZXMuCgpUaGV5IHNob3Vs ZCBuZXZlciBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYXMgdGhlaXIgdmFsdWUgaXMgdG8gYmUKc3Rv cmVkIGluIGEgcHJvcGVydHkgbGlzdCAoY2YuIGBvcmctZXhwb3J0LW9wdGlvbnMtYWxpc3QnKS4K QmFjay1lbmRzIHdpbGwgcmVhZCB0aGVpciB2YWx1ZSBmcm9tIHRoZXJlIGluc3RlYWQuCgojK2Jl Z2luX3NyYyBlbWFjcy1saXNwCihkZWZncm91cCBvcmctZXhwb3J0IG5pbAogICJPcHRpb25zIGZv ciBleHBvcnRpbmcgT3JnIG1vZGUgZmlsZXMuIgogIDp0YWcgIk9yZyBFeHBvcnQiCiAgOmdyb3Vw ICdvcmcpCgooZGVmZ3JvdXAgb3JnLWV4cG9ydC1nZW5lcmFsIG5pbAogICJHZW5lcmFsIG9wdGlv bnMgZm9yIGV4cG9ydCBlbmdpbmUuIgogIDp0YWcgIk9yZyBFeHBvcnQgR2VuZXJhbCIKICA6Z3Jv dXAgJ29yZy1leHBvcnQpCgooZGVmY3VzdG9tIG9yZy1leHBvcnQtd2l0aC1hcmNoaXZlZC10cmVl cyAnaGVhZGxpbmUKICAiV2hldGhlciBzdWItdHJlZXMgd2l0aCB0aGUgQVJDSElWRSB0YWcgc2hv dWxkIGJlIGV4cG9ydGVkLgoKVGhpcyBjYW4gaGF2ZSB0aHJlZSBkaWZmZXJlbnQgdmFsdWVzOgpu aWwgICAgICAgICBEbyBub3QgZXhwb3J0LCBwcmV0ZW5kIHRoaXMgdHJlZSBpcyBub3QgcHJlc2Vu dC4KdCAgICAgICAgICAgRG8gZXhwb3J0IHRoZSBlbnRpcmUgdHJlZS4KYGhlYWRsaW5lJyAgT25s eSBleHBvcnQgdGhlIGhlYWRsaW5lLCBidXQgc2tpcCB0aGUgdHJlZSBiZWxvdyBpdC4KClRoaXMg b3B0aW9uIGNhbiBhbHNvIGJlIHNldCB3aXRoIHRoZSBPUFRJT05TIGtleXdvcmQsCmUuZy4gXCJh cmNoOm5pbFwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICcoY2hvaWNl CgkgIChjb25zdCA6dGFnICJOb3QgYXQgYWxsIiBuaWwpCgkgIChjb25zdCA6dGFnICJIZWFkbGlu ZSBvbmx5IiBoZWFkbGluZSkKCSAgKGNvbnN0IDp0YWcgIkVudGlyZWx5IiB0KSkpCgooZGVmY3Vz dG9tIG9yZy1leHBvcnQtd2l0aC1hdXRob3IgdAogICJOb24tbmlsIG1lYW5zIGluc2VydCBhdXRo b3IgbmFtZSBpbnRvIHRoZSBleHBvcnRlZCBmaWxlLgpUaGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBz ZXQgd2l0aCB0aGUgT1BUSU9OUyBrZXl3b3JkLAplLmcuIFwiYXV0aG9yOm5pbFwiLiIKICA6Z3Jv dXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICdib29sZWFuKQoKKGRlZmN1c3RvbSBvcmct ZXhwb3J0LXdpdGgtY2xvY2tzIG5pbAogICJOb24tbmlsIG1lYW5zIGV4cG9ydCBDTE9DSyBrZXl3 b3Jkcy4KVGhpcyBvcHRpb24gY2FuIGFsc28gYmUgc2V0IHdpdGggdGhlIE9QVElPTlMga2V5d29y ZCwKZS5nLiBcImM6dFwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICdi b29sZWFuKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LXdpdGgtY3JlYXRvciAnY29tbWVudAogICJO b24tbmlsIG1lYW5zIHRoZSBwb3N0YW1ibGUgc2hvdWxkIGNvbnRhaW4gYSBjcmVhdG9yIHNlbnRl bmNlLgoKVGhlIHNlbnRlbmNlIGNhbiBiZSBzZXQgaW4gYG9yZy1leHBvcnQtY3JlYXRvci1zdHJp bmcnIGFuZApkZWZhdWx0cyB0byBcIkdlbmVyYXRlZCBieSBPcmcgbW9kZSBYWCBpbiBFbWFjcyBY WFguXCIuCgpJZiB0aGUgdmFsdWUgaXMgYGNvbW1lbnQnIGluc2VydCBpdCBhcyBhIGNvbW1lbnQu IgogIDpncm91cCAnb3JnLWV4cG9ydC1nZW5lcmFsCiAgOnR5cGUgJyhjaG9pY2UKCSAgKGNvbnN0 IDp0YWcgIk5vIGNyZWF0b3Igc2VudGVuY2UiIG5pbCkKCSAgKGNvbnN0IDp0YWcgIlNlbnRlbmNl IGFzIGEgY29tbWVudCIgJ2NvbW1lbnQpCgkgIChjb25zdCA6dGFnICJJbnNlcnQgdGhlIHNlbnRl bmNlIiB0KSkpCgooZGVmY3VzdG9tIG9yZy1leHBvcnQtd2l0aC1kYXRlIHQKICAiTm9uLW5pbCBt ZWFucyBpbnNlcnQgZGF0ZSBpbiB0aGUgZXhwb3J0ZWQgZG9jdW1lbnQuClRoaXMgb3B0aW9uIGNh biBhbHNvIGJlIHNldCB3aXRoIHRoZSBPUFRJT05TIGtleXdvcmQsCmUuZy4gXCJkYXRlOm5pbFwi LiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICdib29sZWFuKQoKKGRlZmN1 c3RvbSBvcmctZXhwb3J0LWRhdGUtdGltZXN0YW1wLWZvcm1hdCBuaWwKICAiVGltZS1zdGFtcCBm b3JtYXQgc3RyaW5nIHRvIHVzZSBmb3IgREFURSBrZXl3b3JkLgoKVGhlIGZvcm1hdCBzdHJpbmcs IHdoZW4gc3BlY2lmaWVkLCBvbmx5IGFwcGxpZXMgaWYgZGF0ZSBjb25zaXN0cwppbiBhIHNpbmds ZSB0aW1lLXN0YW1wLiAgT3RoZXJ3aXNlIGl0cyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuCgpTZWUg YGZvcm1hdC10aW1lLXN0cmluZycgZm9yIGRldGFpbHMgb24gaG93IHRvIGJ1aWxkIHRoaXMKc3Ry aW5nLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICcoY2hvaWNlCgkgIChz dHJpbmcgOnRhZyAiVGltZS1zdGFtcCBmb3JtYXQgc3RyaW5nIikKCSAgKGNvbnN0IDp0YWcgIk5v IGZvcm1hdCBzdHJpbmciIG5pbCkpKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LWNyZWF0b3Itc3Ry aW5nCiAgKGZvcm1hdCAiRW1hY3MgJXMgKE9yZyBtb2RlICVzKSIKCSAgZW1hY3MtdmVyc2lvbgoJ ICAoaWYgKGZib3VuZHAgJ29yZy12ZXJzaW9uKSAob3JnLXZlcnNpb24pICJ1bmtub3duIHZlcnNp b24iKSkKICAiSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNyZWF0b3Igb2YgdGhlIGRvY3VtZW50LgpU aGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBzZXQgb24gd2l0aCB0aGUgQ1JFQVRPUiBrZXl3b3JkLiIK ICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICcoc3RyaW5nIDp0YWcgIkNyZWF0 b3Igc3RyaW5nIikpCgooZGVmY3VzdG9tIG9yZy1leHBvcnQtd2l0aC1kcmF3ZXJzICcobm90ICJM T0dCT09LIikKICAiTm9uLW5pbCBtZWFucyBleHBvcnQgY29udGVudHMgb2Ygc3RhbmRhcmQgZHJh d2Vycy4KCldoZW4gdCwgYWxsIGRyYXdlcnMgYXJlIGV4cG9ydGVkLiAgVGhpcyBtYXkgYWxzbyBi ZSBhIGxpc3Qgb2YKZHJhd2VyIG5hbWVzIHRvIGV4cG9ydC4gIElmIHRoYXQgbGlzdCBzdGFydHMg d2l0aCBgbm90Jywgb25seQpkcmF3ZXJzIHdpdGggc3VjaCBuYW1lcyB3aWxsIGJlIGlnbm9yZWQu CgpUaGlzIHZhcmlhYmxlIGRvZXNuJ3QgYXBwbHkgdG8gcHJvcGVydGllcyBkcmF3ZXJzLgoKVGhp cyBvcHRpb24gY2FuIGFsc28gYmUgc2V0IHdpdGggdGhlIE9QVElPTlMga2V5d29yZCwKZS5nLiBc ImQ6bmlsXCIuIgogIDpncm91cCAnb3JnLWV4cG9ydC1nZW5lcmFsCiAgOnZlcnNpb24gIjI0LjQi CiAgOnBhY2thZ2UtdmVyc2lvbiAnKE9yZyAuICI4LjAiKQogIDp0eXBlICcoY2hvaWNlCgkgIChj b25zdCA6dGFnICJBbGwgZHJhd2VycyIgdCkKCSAgKGNvbnN0IDp0YWcgIk5vbmUiIG5pbCkKCSAg KHJlcGVhdCA6dGFnICJTZWxlY3RlZCBkcmF3ZXJzIgoJCSAgKHN0cmluZyA6dGFnICJEcmF3ZXIg bmFtZSIpKQoJICAobGlzdCA6dGFnICJJZ25vcmVkIGRyYXdlcnMiCgkJKGNvbnN0IDpmb3JtYXQg IiIgbm90KQoJCShyZXBlYXQgOnRhZyAiU3BlY2lmeSBuYW1lcyBvZiBkcmF3ZXJzIHRvIGlnbm9y ZSBkdXJpbmcgZXhwb3J0IgoJCQk6aW5saW5lIHQKCQkJKHN0cmluZyA6dGFnICJEcmF3ZXIgbmFt ZSIpKSkpKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LXdpdGgtZW1haWwgbmlsCiAgIk5vbi1uaWwg bWVhbnMgaW5zZXJ0IGF1dGhvciBlbWFpbCBpbnRvIHRoZSBleHBvcnRlZCBmaWxlLgpUaGlzIG9w dGlvbiBjYW4gYWxzbyBiZSBzZXQgd2l0aCB0aGUgT1BUSU9OUyBrZXl3b3JkLAplLmcuIFwiZW1h aWw6dFwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICdib29sZWFuKQoK KGRlZmN1c3RvbSBvcmctZXhwb3J0LXdpdGgtZW1waGFzaXplIHQKICAiTm9uLW5pbCBtZWFucyBp bnRlcnByZXQgKndvcmQqLCAvd29yZC8sIF93b3JkXyBhbmQgK3dvcmQrLgoKSWYgdGhlIGV4cG9y dCB0YXJnZXQgc3VwcG9ydHMgZW1waGFzaXppbmcgdGV4dCwgdGhlIHdvcmQgd2lsbCBiZQp0eXBl c2V0IGluIGJvbGQsIGl0YWxpYywgd2l0aCBhbiB1bmRlcmxpbmUgb3Igc3RyaWtlLXRocm91Z2gs CnJlc3BlY3RpdmVseS4KClRoaXMgb3B0aW9uIGNhbiBhbHNvIGJlIHNldCB3aXRoIHRoZSBPUFRJ T05TIGtleXdvcmQsCmUuZy4gXCIqOm5pbFwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJh bAogIDp0eXBlICdib29sZWFuKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LWV4Y2x1ZGUtdGFncyAn KCJub2V4cG9ydCIpCiAgIlRhZ3MgdGhhdCBleGNsdWRlIGEgdHJlZSBmcm9tIGV4cG9ydC4KCkFs bCB0cmVlcyBjYXJyeWluZyBhbnkgb2YgdGhlc2UgdGFncyB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20K ZXhwb3J0LiAgVGhpcyBpcyB3aXRob3V0IGNvbmRpdGlvbiwgc28gZXZlbiBzdWJ0cmVlcyBpbnNp ZGUgdGhhdApjYXJyeSBvbmUgb2YgdGhlIGBvcmctZXhwb3J0LXNlbGVjdC10YWdzJyB3aWxsIGJl IHJlbW92ZWQuCgpUaGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBzZXQgd2l0aCB0aGUgRVhDTFVERV9U QUdTIGtleXdvcmQuIgogIDpncm91cCAnb3JnLWV4cG9ydC1nZW5lcmFsCiAgOnR5cGUgJyhyZXBl YXQgKHN0cmluZyA6dGFnICJUYWciKSkpCgooZGVmY3VzdG9tIG9yZy1leHBvcnQtd2l0aC1maXhl ZC13aWR0aCB0CiAgIk5vbi1uaWwgbWVhbnMgbGluZXMgc3RhcnRpbmcgd2l0aCBcIjpcIiB3aWxs IGJlIGluIGZpeGVkIHdpZHRoIGZvbnQuCgpUaGlzIGNhbiBiZSB1c2VkIHRvIGhhdmUgcHJlLWZv cm1hdHRlZCB0ZXh0LCBmcmFnbWVudHMgb2YgY29kZQpldGMuICBGb3IgZXhhbXBsZToKICA6IDs7 IFNvbWUgTGlzcCBleGFtcGxlcwogIDogKHdoaWxlIChkZWZjIGNudCkKICA6ICAgKGRpbmcpKQp3 aWxsIGJlIGxvb2tpbmcganVzdCBsaWtlIHRoaXMgaW4gYWxzbyBIVE1MLiAgU2VlIGFsc28gdGhl IFFVT1RFCmtleXdvcmQuICBOb3QgYWxsIGV4cG9ydCBiYWNrZW5kcyBzdXBwb3J0IHRoaXMuCgpU aGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBzZXQgd2l0aCB0aGUgT1BUSU9OUyBrZXl3b3JkLAplLmcu IFwiOjpuaWxcIi4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWdlbmVyYWwKICA6dHlwZSAnYm9vbGVh bikKCihkZWZjdXN0b20gb3JnLWV4cG9ydC13aXRoLWZvb3Rub3RlcyB0CiAgIk5vbi1uaWwgbWVh bnMgT3JnIGZvb3Rub3RlcyBzaG91bGQgYmUgZXhwb3J0ZWQuClRoaXMgb3B0aW9uIGNhbiBhbHNv IGJlIHNldCB3aXRoIHRoZSBPUFRJT05TIGtleXdvcmQsCmUuZy4gXCJmOm5pbFwiLiIKICA6Z3Jv dXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICdib29sZWFuKQoKKGRlZmN1c3RvbSBvcmct ZXhwb3J0LXdpdGgtbGF0ZXggdAogICJOb24tbmlsIG1lYW5zIHByb2Nlc3MgTGFUZVggZW52aXJv bm1lbnRzIGFuZCBmcmFnbWVudHMuCgpUaGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBzZXQgd2l0aCB0 aGUgT1BUSU9OUyBsaW5lLAplLmcuIFwidGV4OnZlcmJhdGltXCIuICBBbGxvd2VkIHZhbHVlcyBh cmU6CgpuaWwgICAgICAgICBJZ25vcmUgbWF0aCBzbmlwcGV0cy4KYHZlcmJhdGltJyAgS2VlcCBl dmVyeXRoaW5nIGluIHZlcmJhdGltLgp0ICAgICAgICAgICBBbGxvdyBleHBvcnQgb2YgbWF0aCBz bmlwcGV0cy4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWdlbmVyYWwKICA6dmVyc2lvbiAiMjQuNCIK ICA6cGFja2FnZS12ZXJzaW9uICcoT3JnIC4gIjguMCIpCiAgOnR5cGUgJyhjaG9pY2UKCSAgKGNv bnN0IDp0YWcgIkRvIG5vdCBwcm9jZXNzIG1hdGggaW4gYW55IHdheSIgbmlsKQoJICAoY29uc3Qg OnRhZyAiSW50ZXJwcmV0IG1hdGggc25pcHBldHMiIHQpCgkgIChjb25zdCA6dGFnICJMZWF2ZSBt YXRoIHZlcmJhdGltIiB2ZXJiYXRpbSkpKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LWhlYWRsaW5l LWxldmVscyAzCiAgIlRoZSBsYXN0IGxldmVsIHdoaWNoIGlzIHN0aWxsIGV4cG9ydGVkIGFzIGEg aGVhZGxpbmUuCgpJbmZlcmlvciBsZXZlbHMgd2lsbCB1c3VhbGx5IHByb2R1Y2UgaXRlbWl6ZSBv ciBlbnVtZXJhdGUgbGlzdHMKd2hlbiBleHBvcnRlZCwgYnV0IGJhY2stZW5kIGJlaGF2aW91ciBt YXkgZGlmZmVyLgoKVGhpcyBvcHRpb24gY2FuIGFsc28gYmUgc2V0IHdpdGggdGhlIE9QVElPTlMg a2V5d29yZCwKZS5nLiBcIkg6MlwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0 eXBlICdpbnRlZ2VyKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LWRlZmF1bHQtbGFuZ3VhZ2UgImVu IgogICJUaGUgZGVmYXVsdCBsYW5ndWFnZSBmb3IgZXhwb3J0IGFuZCBjbG9ja3RhYmxlIHRyYW5z bGF0aW9ucywgYXMgYSBzdHJpbmcuClRoaXMgbWF5IGhhdmUgYW4gYXNzb2NpYXRpb24gaW4KYG9y Zy1jbG9jay1jbG9ja3RhYmxlLWxhbmd1YWdlLXNldHVwJy4gIFRoaXMgb3B0aW9uIGNhbiBhbHNv IGJlCnNldCB3aXRoIHRoZSBMQU5HVUFHRSBrZXl3b3JkLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQt Z2VuZXJhbAogIDp0eXBlICcoc3RyaW5nIDp0YWcgIkxhbmd1YWdlIikpCgooZGVmY3VzdG9tIG9y Zy1leHBvcnQtcHJlc2VydmUtYnJlYWtzIG5pbAogICJOb24tbmlsIG1lYW5zIHByZXNlcnZlIGFs bCBsaW5lIGJyZWFrcyB3aGVuIGV4cG9ydGluZy4KVGhpcyBvcHRpb24gY2FuIGFsc28gYmUgc2V0 IHdpdGggdGhlIE9QVElPTlMga2V5d29yZCwKZS5nLiBcIlxcbjp0XCIuIgogIDpncm91cCAnb3Jn LWV4cG9ydC1nZW5lcmFsCiAgOnR5cGUgJ2Jvb2xlYW4pCgooZGVmY3VzdG9tIG9yZy1leHBvcnQt d2l0aC1lbnRpdGllcyB0CiAgIk5vbi1uaWwgbWVhbnMgaW50ZXJwcmV0IGVudGl0aWVzIHdoZW4g ZXhwb3J0aW5nLgoKRm9yIGV4YW1wbGUsIEhUTUwgZXhwb3J0IGNvbnZlcnRzIFxcYWxwaGEgdG8g JmFscGhhOyBhbmQgXFxBQSB0bwomQXJpbmc7LgoKRm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgbmFt ZXMsIHNlZSB0aGUgY29uc3RhbnQgYG9yZy1lbnRpdGllcycKYW5kIHRoZSB1c2VyIG9wdGlvbiBg b3JnLWVudGl0aWVzLXVzZXInLgoKVGhpcyBvcHRpb24gY2FuIGFsc28gYmUgc2V0IHdpdGggdGhl IE9QVElPTlMga2V5d29yZCwKZS5nLiBcImU6bmlsXCIuIgogIDpncm91cCAnb3JnLWV4cG9ydC1n ZW5lcmFsCiAgOnR5cGUgJ2Jvb2xlYW4pCgooZGVmY3VzdG9tIG9yZy1leHBvcnQtd2l0aC1pbmxp bmV0YXNrcyB0CiAgIk5vbi1uaWwgbWVhbnMgaW5saW5ldGFza3Mgc2hvdWxkIGJlIGV4cG9ydGVk LgpUaGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBzZXQgd2l0aCB0aGUgT1BUSU9OUyBrZXl3b3JkLApl LmcuIFwiaW5saW5lOm5pbFwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp2ZXJz aW9uICIyNC40IgogIDpwYWNrYWdlLXZlcnNpb24gJyhPcmcgLiAiOC4wIikKICA6dHlwZSAnYm9v bGVhbikKCihkZWZjdXN0b20gb3JnLWV4cG9ydC13aXRoLXBsYW5uaW5nIG5pbAogICJOb24tbmls IG1lYW5zIGluY2x1ZGUgcGxhbm5pbmcgaW5mbyBpbiBleHBvcnQuCgpQbGFubmluZyBpbmZvIGlz IHRoZSBsaW5lIGNvbnRhaW5pbmcgZWl0aGVyIFNDSEVEVUxFRDosCkRFQURMSU5FOiwgQ0xPU0VE OiB0aW1lLXN0YW1wcywgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGVtLgoKVGhpcyBvcHRpb24gY2Fu IGFsc28gYmUgc2V0IHdpdGggdGhlIE9QVElPTlMga2V5d29yZCwKZS5nLiBcInA6dFwiLiIKICA6 Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp2ZXJzaW9uICIyNC40IgogIDpwYWNrYWdlLXZl cnNpb24gJyhPcmcgLiAiOC4wIikKICA6dHlwZSAnYm9vbGVhbikKCihkZWZjdXN0b20gb3JnLWV4 cG9ydC13aXRoLXByaW9yaXR5IG5pbAogICJOb24tbmlsIG1lYW5zIGluY2x1ZGUgcHJpb3JpdHkg Y29va2llcyBpbiBleHBvcnQuClRoaXMgb3B0aW9uIGNhbiBhbHNvIGJlIHNldCB3aXRoIHRoZSBP UFRJT05TIGtleXdvcmQsCmUuZy4gXCJwcmk6dFwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2Vu ZXJhbAogIDp0eXBlICdib29sZWFuKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LXdpdGgtc2VjdGlv bi1udW1iZXJzIHQKICAiTm9uLW5pbCBtZWFucyBhZGQgc2VjdGlvbiBudW1iZXJzIHRvIGhlYWRs aW5lcyB3aGVuIGV4cG9ydGluZy4KCldoZW4gc2V0IHRvIGFuIGludGVnZXIgbiwgbnVtYmVyaW5n IHdpbGwgb25seSBoYXBwZW4gZm9yCmhlYWRsaW5lcyB3aG9zZSByZWxhdGl2ZSBsZXZlbCBpcyBo aWdoZXIgb3IgZXF1YWwgdG8gbi4KClRoaXMgb3B0aW9uIGNhbiBhbHNvIGJlIHNldCB3aXRoIHRo ZSBPUFRJT05TIGtleXdvcmQsCmUuZy4gXCJudW06dFwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQt Z2VuZXJhbAogIDp0eXBlICdib29sZWFuKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LXNlbGVjdC10 YWdzICcoImV4cG9ydCIpCiAgIlRhZ3MgdGhhdCBzZWxlY3QgYSB0cmVlIGZvciBleHBvcnQuCgpJ ZiBhbnkgc3VjaCB0YWcgaXMgZm91bmQgaW4gYSBidWZmZXIsIGFsbCB0cmVlcyB0aGF0IGRvIG5v dCBjYXJyeQpvbmUgb2YgdGhlc2UgdGFncyB3aWxsIGJlIGlnbm9yZWQgZHVyaW5nIGV4cG9ydC4g IEluc2lkZSB0cmVlcwp0aGF0IGFyZSBzZWxlY3RlZCBsaWtlIHRoaXMsIHlvdSBjYW4gc3RpbGwg ZGVzZWxlY3QgYSBzdWJ0cmVlIGJ5CnRhZ2dpbmcgaXQgd2l0aCBvbmUgb2YgdGhlIGBvcmctZXhw b3J0LWV4Y2x1ZGUtdGFncycuCgpUaGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBzZXQgd2l0aCB0aGUg U0VMRUNUX1RBR1Mga2V5d29yZC4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWdlbmVyYWwKICA6dHlw ZSAnKHJlcGVhdCAoc3RyaW5nIDp0YWcgIlRhZyIpKSkKCihkZWZjdXN0b20gb3JnLWV4cG9ydC13 aXRoLXNtYXJ0LXF1b3RlcyBuaWwKICAiTm9uLW5pbCBtZWFucyBhY3RpdmF0ZSBzbWFydCBxdW90 ZXMgZHVyaW5nIGV4cG9ydC4KVGhpcyBvcHRpb24gY2FuIGFsc28gYmUgc2V0IHdpdGggdGhlIE9Q VElPTlMga2V5d29yZCwKZS5nLiwgXCInOnRcIi4KCldoZW4gc2V0dGluZyB0aGlzIHRvIG5vbi1u aWwsIHlvdSBuZWVkIHRvIHRha2UgY2FyZSBvZgp1c2luZyB0aGUgY29ycmVjdCBCYWJlbCBwYWNr YWdlIHdoZW4gZXhwb3J0aW5nIHRvIExhVGVYLgpFLmcuLCB5b3UgY2FuIGxvYWQgQmFiZWwgZm9y IGZyZW5jaCBsaWtlIHRoaXM6CgojK0xBVEVYX0hFQURFUjogXFx1c2VwYWNrYWdlW2ZyZW5jaF17 YmFiZWx9IgogIDpncm91cCAnb3JnLWV4cG9ydC1nZW5lcmFsCiAgOnZlcnNpb24gIjI0LjQiCiAg OnBhY2thZ2UtdmVyc2lvbiAnKE9yZyAuICI4LjAiKQogIDp0eXBlICdib29sZWFuKQoKKGRlZmN1 c3RvbSBvcmctZXhwb3J0LXdpdGgtc3BlY2lhbC1zdHJpbmdzIHQKICAiTm9uLW5pbCBtZWFucyBp bnRlcnByZXQgXCJcXC1cIiwgXCItLVwiIGFuZCBcIi0tLVwiIGZvciBleHBvcnQuCgpXaGVuIHRo aXMgb3B0aW9uIGlzIHR1cm5lZCBvbiwgdGhlc2Ugc3RyaW5ncyB3aWxsIGJlIGV4cG9ydGVkIGFz OgoKICAgT3JnICAgICBIVE1MICAgICBMYVRlWCAgICBVVEYtOAogIC0tLS0tKy0tLS0tLS0tLS0r LS0tLS0tLS0rLS0tLS0tLQogICBcXC0gICAgJnNoeTsgICAgICBcXC0KICAgLS0gICAgJm5kYXNo OyAgICAtLSAgICAgICAgIOKAkwogICAtLS0gICAmbWRhc2g7ICAgIC0tLSAgICAgICAg4oCUCiAg IC4uLiAgICZoZWxsaXA7ICAgXFxsZG90cyAgICAg4oCmCgpUaGlzIG9wdGlvbiBjYW4gYWxzbyBi ZSBzZXQgd2l0aCB0aGUgT1BUSU9OUyBrZXl3b3JkLAplLmcuIFwiLTpuaWxcIi4iCiAgOmdyb3Vw ICdvcmctZXhwb3J0LWdlbmVyYWwKICA6dHlwZSAnYm9vbGVhbikKCihkZWZjdXN0b20gb3JnLWV4 cG9ydC13aXRoLXN0YXRpc3RpY3MtY29va2llcyB0CiAgIk5vbi1uaWwgbWVhbnMgaW5jbHVkZSBz dGF0aXN0aWNzIGNvb2tpZXMgaW4gZXhwb3J0LgpUaGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBzZXQg d2l0aCB0aGUgT1BUSU9OUyBrZXl3b3JkLAplLmcuIFwic3RhdDpuaWxcIiIKICA6Z3JvdXAgJ29y Zy1leHBvcnQtZ2VuZXJhbAogIDp2ZXJzaW9uICIyNC40IgogIDpwYWNrYWdlLXZlcnNpb24gJyhP cmcgLiAiOC4wIikKICA6dHlwZSAnYm9vbGVhbikKCihkZWZjdXN0b20gb3JnLWV4cG9ydC13aXRo LXN1Yi1zdXBlcnNjcmlwdHMgdAogICJOb24tbmlsIG1lYW5zIGludGVycHJldCBcIl9cIiBhbmQg XCJeXCIgZm9yIGV4cG9ydC4KCldoZW4gdGhpcyBvcHRpb24gaXMgdHVybmVkIG9uLCB5b3UgY2Fu IHVzZSBUZVgtbGlrZSBzeW50YXggZm9yCnN1Yi0gYW5kIHN1cGVyc2NyaXB0cy4gIFNldmVyYWwg Y2hhcmFjdGVycyBhZnRlciBcIl9cIiBvciBcIl5cIgp3aWxsIGJlIGNvbnNpZGVyZWQgYXMgYSBz aW5nbGUgaXRlbSAtIHNvIGdyb3VwaW5nIHdpdGgge30gaXMKbm9ybWFsbHkgbm90IG5lZWRlZC4g IEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRoaW5ncyB3aWxsIGJlCnBhcnNlZCBhcyBzaW5n bGUgc3ViLSBvciBzdXBlcnNjcmlwdHMuCgogMTBeMjQgICBvciAgIDEwXnRhdSAgICAgc2V2ZXJh bCBkaWdpdHMgd2lsbCBiZSBjb25zaWRlcmVkIDEgaXRlbS4KIDEwXi0xMiAgb3IgICAxMF4tdGF1 ICAgIGEgbGVhZGluZyBzaWduIHdpdGggZGlnaXRzIG9yIGEgd29yZAogeF4yLXleMyAgICAgICAg ICAgICAgICAgd2lsbCBiZSByZWFkIGFzIHheMiAtIHleMywgYmVjYXVzZSBpdGVtcyBhcmUKCQkJ IHRlcm1pbmF0ZWQgYnkgYWxtb3N0IGFueSBub253b3JkL25vbmRpZ2l0IGNoYXIuCiB4X3tpXjJ9 IG9yICAgeF4oMi1pKSAgICBicmFjZXMgb3IgcGFyZW50aGVzaXMgZG8gZ3JvdXBpbmcuCgpTdGls bCwgYW1iaWd1aXR5IGlzIHBvc3NpYmxlIC0gc28gd2hlbiBpbiBkb3VidCB1c2Uge30gdG8gZW5j bG9zZQp0aGUgc3ViL3N1cGVyc2NyaXB0LiAgSWYgeW91IHNldCB0aGlzIHZhcmlhYmxlIHRvIHRo ZSBzeW1ib2wKYHt9JywgdGhlIGJyYWNlcyBhcmUgKnJlcXVpcmVkKiBpbiBvcmRlciB0byB0cmln Z2VyCmludGVycHJldGF0aW9ucyBhcyBzdWIvc3VwZXJzY3JpcHQuICBUaGlzIGNhbiBiZSBoZWxw ZnVsIGluCmRvY3VtZW50cyB0aGF0IG5lZWQgXCJfXCIgZnJlcXVlbnRseSBpbiBwbGFpbiB0ZXh0 LgoKVGhpcyBvcHRpb24gY2FuIGFsc28gYmUgc2V0IHdpdGggdGhlIE9QVElPTlMga2V5d29yZCwK ZS5nLiBcIl46bmlsXCIuIgogIDpncm91cCAnb3JnLWV4cG9ydC1nZW5lcmFsCiAgOnR5cGUgJyhj aG9pY2UKCSAgKGNvbnN0IDp0YWcgIkludGVycHJldCB0aGVtIiB0KQoJICAoY29uc3QgOnRhZyAi Q3VybHkgYnJhY2tldHMgb25seSIge30pCgkgIChjb25zdCA6dGFnICJEbyBub3QgaW50ZXJwcmV0 IHRoZW0iIG5pbCkpKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LXdpdGgtdG9jIHQKICAiTm9uLW5p bCBtZWFucyBjcmVhdGUgYSB0YWJsZSBvZiBjb250ZW50cyBpbiBleHBvcnRlZCBmaWxlcy4KClRo ZSBUT0MgY29udGFpbnMgaGVhZGxpbmVzIHdpdGggbGV2ZWxzIHVwCnRvYG9yZy1leHBvcnQtaGVh ZGxpbmUtbGV2ZWxzJy4gIFdoZW4gYW4gaW50ZWdlciwgaW5jbHVkZSBsZXZlbHMKdXAgdG8gTiBp biB0aGUgdG9jLCB0aGlzIG1heSB0aGVuIGJlIGRpZmZlcmVudCBmcm9tCmBvcmctZXhwb3J0LWhl YWRsaW5lLWxldmVscycsIGJ1dCBpdCB3aWxsIG5vdCBiZSBhbGxvd2VkIHRvIGJlCmxhcmdlciB0 aGFuIHRoZSBudW1iZXIgb2YgaGVhZGxpbmUgbGV2ZWxzLiAgV2hlbiBuaWwsIG5vIHRhYmxlIG9m CmNvbnRlbnRzIGlzIG1hZGUuCgpUaGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBzZXQgd2l0aCB0aGUg T1BUSU9OUyBrZXl3b3JkLAplLmcuIFwidG9jOm5pbFwiIG9yIFwidG9jOjNcIi4iCiAgOmdyb3Vw ICdvcmctZXhwb3J0LWdlbmVyYWwKICA6dHlwZSAnKGNob2ljZQoJICAoY29uc3QgOnRhZyAiTm8g VGFibGUgb2YgQ29udGVudHMiIG5pbCkKCSAgKGNvbnN0IDp0YWcgIkZ1bGwgVGFibGUgb2YgQ29u dGVudHMiIHQpCgkgIChpbnRlZ2VyIDp0YWcgIlRPQyB0byBsZXZlbCIpKSkKCihkZWZjdXN0b20g b3JnLWV4cG9ydC13aXRoLXRhYmxlcyB0CiAgIklmIG5vbi1uaWwsIGxpbmVzIHN0YXJ0aW5nIHdp dGggXCJ8XCIgZGVmaW5lIGEgdGFibGUuCkZvciBleGFtcGxlOgoKICB8IE5hbWUgICAgICAgIHwg QWRkcmVzcyAgfCBCaXJ0aGRheSAgfAogIHwtLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0t LS0tLS18CiAgfCBBcnRodXIgRGVudCB8IEVuZ2xhbmQgIHwgMjkuMi4yMTAwIHwKClRoaXMgb3B0 aW9uIGNhbiBhbHNvIGJlIHNldCB3aXRoIHRoZSBPUFRJT05TIGtleXdvcmQsCmUuZy4gXCJ8Om5p bFwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICdib29sZWFuKQoKKGRl ZmN1c3RvbSBvcmctZXhwb3J0LXdpdGgtdGFncyB0CiAgIklmIG5pbCwgZG8gbm90IGV4cG9ydCB0 YWdzLCBqdXN0IHJlbW92ZSB0aGVtIGZyb20gaGVhZGxpbmVzLgoKSWYgdGhpcyBpcyB0aGUgc3lt Ym9sIGBub3QtaW4tdG9jJywgdGFncyB3aWxsIGJlIHJlbW92ZWQgZnJvbQp0YWJsZSBvZiBjb250 ZW50cyBlbnRyaWVzLCBidXQgc3RpbGwgYmUgc2hvd24gaW4gdGhlIGhlYWRsaW5lcyBvZgp0aGUg ZG9jdW1lbnQuCgpUaGlzIG9wdGlvbiBjYW4gYWxzbyBiZSBzZXQgd2l0aCB0aGUgT1BUSU9OUyBr ZXl3b3JkLAplLmcuIFwidGFnczpuaWxcIi4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWdlbmVyYWwK ICA6dHlwZSAnKGNob2ljZQoJICAoY29uc3QgOnRhZyAiT2ZmIiBuaWwpCgkgIChjb25zdCA6dGFn ICJOb3QgaW4gVE9DIiBub3QtaW4tdG9jKQoJICAoY29uc3QgOnRhZyAiT24iIHQpKSkKCihkZWZj dXN0b20gb3JnLWV4cG9ydC13aXRoLXRhc2tzIHQKICAiTm9uLW5pbCBtZWFucyBpbmNsdWRlIFRP RE8gaXRlbXMgZm9yIGV4cG9ydC4KClRoaXMgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6 CnQgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgdGFza3MgaW5kZXBlbmRlbnQgb2Ygc3RhdGUu CmB0b2RvJyAgICAgICAgICAgICAgIGluY2x1ZGUgb25seSB0YXNrcyB0aGF0IGFyZSBub3QgeWV0 IGRvbmUuCmBkb25lJyAgICAgICAgICAgICAgIGluY2x1ZGUgb25seSB0YXNrcyB0aGF0IGFyZSBh bHJlYWR5IGRvbmUuCm5pbCAgICAgICAgICAgICAgICAgIGlnbm9yZSBhbGwgdGFza3MuCmxpc3Qg b2Yga2V5d29yZHMgICAgIGluY2x1ZGUgdGFza3Mgd2l0aCB0aGVzZSBrZXl3b3Jkcy4KClRoaXMg b3B0aW9uIGNhbiBhbHNvIGJlIHNldCB3aXRoIHRoZSBPUFRJT05TIGtleXdvcmQsCmUuZy4gXCJ0 YXNrczpuaWxcIi4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWdlbmVyYWwKICA6dHlwZSAnKGNob2lj ZQoJICAoY29uc3QgOnRhZyAiQWxsIHRhc2tzIiB0KQoJICAoY29uc3QgOnRhZyAiTm8gdGFza3Mi IG5pbCkKCSAgKGNvbnN0IDp0YWcgIk5vdC1kb25lIHRhc2tzIiB0b2RvKQoJICAoY29uc3QgOnRh ZyAiT25seSBkb25lIHRhc2tzIiBkb25lKQoJICAocmVwZWF0IDp0YWcgIlNwZWNpZmljIFRPRE8g a2V5d29yZHMiCgkJICAoc3RyaW5nIDp0YWcgIktleXdvcmQiKSkpKQoKKGRlZmN1c3RvbSBvcmct ZXhwb3J0LXRpbWUtc3RhbXAtZmlsZSB0CiAgIk5vbi1uaWwgbWVhbnMgaW5zZXJ0IGEgdGltZSBz dGFtcCBpbnRvIHRoZSBleHBvcnRlZCBmaWxlLgpUaGUgdGltZSBzdGFtcCBzaG93cyB3aGVuIHRo ZSBmaWxlIHdhcyBjcmVhdGVkLiBUaGlzIG9wdGlvbiBjYW4KYWxzbyBiZSBzZXQgd2l0aCB0aGUg T1BUSU9OUyBrZXl3b3JkLCBlLmcuIFwidGltZXN0YW1wOm5pbFwiLiIKICA6Z3JvdXAgJ29yZy1l eHBvcnQtZ2VuZXJhbAogIDp0eXBlICdib29sZWFuKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LXdp dGgtdGltZXN0YW1wcyB0CiAgIk5vbiBuaWwgbWVhbnMgYWxsb3cgdGltZXN0YW1wcyBpbiBleHBv cnQuCgpJdCBjYW4gYmUgc2V0IHRvIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICB0ICAg ICAgICAgIGV4cG9ydCBhbGwgdGltZXN0YW1wcy4KICBgYWN0aXZlJyAgIGV4cG9ydCBhY3RpdmUg dGltZXN0YW1wcyBvbmx5LgogIGBpbmFjdGl2ZScgZXhwb3J0IGluYWN0aXZlIHRpbWVzdGFtcHMg b25seS4KICBuaWwgICAgICAgIGRvIG5vdCBleHBvcnQgdGltZXN0YW1wcwoKVGhpcyBvbmx5IGFw cGxpZXMgdG8gdGltZXN0YW1wcyBpc29sYXRlZCBpbiBhIHBhcmFncmFwaApjb250YWluaW5nIG9u bHkgdGltZXN0YW1wcy4gIE90aGVyIHRpbWVzdGFtcHMgYXJlIGFsd2F5cwpleHBvcnRlZC4KClRo aXMgb3B0aW9uIGNhbiBhbHNvIGJlIHNldCB3aXRoIHRoZSBPUFRJT05TIGtleXdvcmQsIGUuZy4K XCI8Om5pbFwiLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICcoY2hvaWNl CgkgIChjb25zdCA6dGFnICJBbGwgdGltZXN0YW1wcyIgdCkKCSAgKGNvbnN0IDp0YWcgIk9ubHkg YWN0aXZlIHRpbWVzdGFtcHMiIGFjdGl2ZSkKCSAgKGNvbnN0IDp0YWcgIk9ubHkgaW5hY3RpdmUg dGltZXN0YW1wcyIgaW5hY3RpdmUpCgkgIChjb25zdCA6dGFnICJObyB0aW1lc3RhbXAiIG5pbCkp KQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LXdpdGgtdG9kby1rZXl3b3JkcyB0CiAgIk5vbi1uaWwg bWVhbnMgaW5jbHVkZSBUT0RPIGtleXdvcmRzIGluIGV4cG9ydC4KV2hlbiBuaWwsIHJlbW92ZSBh bGwgdGhlc2Uga2V5d29yZHMgZnJvbSB0aGUgZXhwb3J0LiAgVGhpcyBvcHRpb24KY2FuIGFsc28g YmUgc2V0IHdpdGggdGhlIE9QVElPTlMga2V5d29yZCwgZS5nLiAgXCJ0b2RvOm5pbFwiLiIKICA6 Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp0eXBlICdib29sZWFuKQoKKGRlZmN1c3RvbSBv cmctZXhwb3J0LWFsbG93LWJpbmQta2V5d29yZHMgbmlsCiAgIk5vbi1uaWwgbWVhbnMgQklORCBr ZXl3b3JkcyBjYW4gZGVmaW5lIGxvY2FsIHZhcmlhYmxlIHZhbHVlcy4KVGhpcyBpcyBhIHBvdGVu dGlhbCBzZWN1cml0eSByaXNrLCB3aGljaCBpcyB3aHkgdGhlIGRlZmF1bHQgdmFsdWUKaXMgbmls LiAgWW91IGNhbiBhbHNvIGFsbG93IHRoZW0gdGhyb3VnaCBsb2NhbCBidWZmZXIgdmFyaWFibGVz LiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp2ZXJzaW9uICIyNC40IgogIDpwYWNr YWdlLXZlcnNpb24gJyhPcmcgLiAiOC4wIikKICA6dHlwZSAnYm9vbGVhbikKCihkZWZjdXN0b20g b3JnLWV4cG9ydC1zbmlwcGV0LXRyYW5zbGF0aW9uLWFsaXN0IG5pbAogICJBbGlzdCBiZXR3ZWVu IGV4cG9ydCBzbmlwcGV0cyBiYWNrLWVuZHMgYW5kIGV4cG9ydGVyIGJhY2stZW5kcy4KClRoaXMg dmFyaWFibGUgYWxsb3dzIHRvIHByb3ZpZGUgc2hvcnRjdXRzIGZvciBleHBvcnQgc25pcHBldHMu CgpGb3IgZXhhbXBsZSwgd2l0aCBhIHZhbHVlIG9mICdcKFwoXCJoXCIgLiBcImh0bWxcIlwpXCks IHRoZQpIVE1MIGJhY2stZW5kIHdpbGwgcmVjb2duaXplIHRoZSBjb250ZW50cyBvZiBcIkBAaDo8 Yj5AQFwiIGFzCkhUTUwgY29kZSB3aGlsZSBldmVyeSBvdGhlciBiYWNrLWVuZCB3aWxsIGlnbm9y ZSBpdC4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWdlbmVyYWwKICA6dmVyc2lvbiAiMjQuNCIKICA6 cGFja2FnZS12ZXJzaW9uICcoT3JnIC4gIjguMCIpCiAgOnR5cGUgJyhyZXBlYXQKCSAgKGNvbnMg KHN0cmluZyA6dGFnICJTaG9ydGN1dCIpCgkJKHN0cmluZyA6dGFnICJCYWNrLWVuZCIpKSkpCgoo ZGVmY3VzdG9tIG9yZy1leHBvcnQtY29kaW5nLXN5c3RlbSBuaWwKICAiQ29kaW5nIHN5c3RlbSBm b3IgdGhlIGV4cG9ydGVkIGZpbGUuIgogIDpncm91cCAnb3JnLWV4cG9ydC1nZW5lcmFsCiAgOnZl cnNpb24gIjI0LjQiCiAgOnBhY2thZ2UtdmVyc2lvbiAnKE9yZyAuICI4LjAiKQogIDp0eXBlICdj b2Rpbmctc3lzdGVtKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LWNvcHktdG8ta2lsbC1yaW5nICdp Zi1pbnRlcmFjdGl2ZQogICJTaG91bGQgd2UgcHVzaCBleHBvcnRlZCBjb250ZW50IHRvIHRoZSBr aWxsIHJpbmc/IgogIDpncm91cCAnb3JnLWV4cG9ydC1nZW5lcmFsCiAgOnZlcnNpb24gIjI0LjMi CiAgOnR5cGUgJyhjaG9pY2UKCSAgKGNvbnN0IDp0YWcgIkFsd2F5cyIgdCkKCSAgKGNvbnN0IDp0 YWcgIldoZW4gZXhwb3J0IGlzIGRvbmUgaW50ZXJhY3RpdmVseSIgaWYtaW50ZXJhY3RpdmUpCgkg IChjb25zdCA6dGFnICJOZXZlciIgbmlsKSkpCgooZGVmY3VzdG9tIG9yZy1leHBvcnQtaW5pdGlh bC1zY29wZSAnYnVmZmVyCiAgIlRoZSBpbml0aWFsIHNjb3BlIHdoZW4gZXhwb3J0aW5nIHdpdGgg YG9yZy1leHBvcnQtZGlzcGF0Y2gnLgpUaGlzIHZhcmlhYmxlIGNhbiBiZSBlaXRoZXIgc2V0IHRv IGBidWZmZXInIG9yIGBzdWJ0cmVlJy4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWdlbmVyYWwKICA6 dHlwZSAnKGNob2ljZQoJICAoY29uc3QgOnRhZyAiRXhwb3J0IGN1cnJlbnQgYnVmZmVyIiBidWZm ZXIpCgkgIChjb25zdCA6dGFnICJFeHBvcnQgY3VycmVudCBzdWJ0cmVlIiBzdWJ0cmVlKSkpCgoo ZGVmY3VzdG9tIG9yZy1leHBvcnQtc2hvdy10ZW1wb3JhcnktZXhwb3J0LWJ1ZmZlciB0CiAgIk5v bi1uaWwgbWVhbnMgc2hvdyBidWZmZXIgYWZ0ZXIgZXhwb3J0aW5nIHRvIHRlbXAgYnVmZmVyLgpX aGVuIE9yZyBleHBvcnRzIHRvIGEgZmlsZSwgdGhlIGJ1ZmZlciB2aXNpdGluZyB0aGF0IGZpbGUg aXMgZXZlcgpzaG93biwgYnV0IHJlbWFpbnMgYnVyaWVkLiAgSG93ZXZlciwgd2hlbiBleHBvcnRp bmcgdG8KYSB0ZW1wb3JhcnkgYnVmZmVyLCB0aGF0IGJ1ZmZlciBpcyBwb3BwZWQgdXAgaW4gYSBz ZWNvbmQgd2luZG93LgpXaGVuIHRoaXMgdmFyaWFibGUgaXMgbmlsLCB0aGUgYnVmZmVyIHJlbWFp bnMgYnVyaWVkIGFsc28gaW4KdGhlc2UgY2FzZXMuIgogIDpncm91cCAnb3JnLWV4cG9ydC1nZW5l cmFsCiAgOnR5cGUgJ2Jvb2xlYW4pCgooZGVmY3VzdG9tIG9yZy1leHBvcnQtaW4tYmFja2dyb3Vu ZCBuaWwKICAiTm9uLW5pbCBtZWFucyBleHBvcnQgYW5kIHB1Ymxpc2hpbmcgY29tbWFuZHMgd2ls bCBydW4gaW4gYmFja2dyb3VuZC4KUmVzdWx0cyBmcm9tIGFuIGFzeW5jaHJvbm91cyBleHBvcnQg YXJlIG5ldmVyIGRpc3BsYXllZAphdXRvbWF0aWNhbGx5LiAgQnV0IHlvdSBjYW4gcmV0cmlldmUg dGhlbSB3aXRoIFxcW29yZy1leHBvcnQtc3RhY2tdLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2Vu ZXJhbAogIDp2ZXJzaW9uICIyNC40IgogIDpwYWNrYWdlLXZlcnNpb24gJyhPcmcgLiAiOC4wIikK ICA6dHlwZSAnYm9vbGVhbikKCihkZWZjdXN0b20gb3JnLWV4cG9ydC1hc3luYy1pbml0LWZpbGUg dXNlci1pbml0LWZpbGUKICAiRmlsZSB1c2VkIHRvIGluaXRpYWxpemUgZXh0ZXJuYWwgZXhwb3J0 IHByb2Nlc3MuClZhbHVlIG11c3QgYmUgYW4gYWJzb2x1dGUgZmlsZSBuYW1lLiAgSXQgZGVmYXVs dHMgdG8gdXNlcidzCmluaXRpYWxpemF0aW9uIGZpbGUuICBUaG91Z2gsIGEgc3BlY2lmaWMgY29u ZmlndXJhdGlvbiBtYWtlcyB0aGUKcHJvY2VzcyBmYXN0ZXIgYW5kIHRoZSBleHBvcnQgbW9yZSBw b3J0YWJsZS4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWdlbmVyYWwKICA6dmVyc2lvbiAiMjQuNCIK ICA6cGFja2FnZS12ZXJzaW9uICcoT3JnIC4gIjguMCIpCiAgOnR5cGUgJyhmaWxlIDptdXN0LW1h dGNoIHQpKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LWludmlzaWJsZS1iYWNrZW5kcyBuaWwKICAi TGlzdCBvZiBiYWNrLWVuZHMgdGhhdCBzaG91bGRuJ3QgYXBwZWFyIGluIHRoZSBkaXNwYXRjaGVy LgoKQW55IGJhY2stZW5kIGJlbG9uZ2luZyB0byB0aGlzIGxpc3Qgb3IgZGVyaXZlZCBmcm9tIGEg YmFjay1lbmQKYmVsb25naW5nIHRvIGl0IHdpbGwgbm90IGFwcGVhciBpbiB0aGUgZGlzcGF0Y2hl ciBtZW51LgoKSW5kZWVkLCBPcmcgbWF5IHJlcXVpcmUgc29tZSBleHBvcnQgYmFjay1lbmRzIHdp dGhvdXQgbm90aWNlLiAgSWYKdGhlc2UgbW9kdWxlcyBhcmUgbmV2ZXIgdG8gYmUgdXNlZCBpbnRl cmFjdGl2ZWx5LCBhZGRpbmcgdGhlbQpoZXJlIHdpbGwgYXZvaWQgY2x1dHRlcmluZyB0aGUgZGlz cGF0Y2hlciBtZW51LiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp2ZXJzaW9uICIy NC40IgogIDpwYWNrYWdlLXZlcnNpb24gJyhPcmcgLiAiOC4wIikKICA6dHlwZSAnKHJlcGVhdCAo c3ltYm9sIDp0YWcgIkJhY2stRW5kIikpKQoKKGRlZmN1c3RvbSBvcmctZXhwb3J0LWRpc3BhdGNo LXVzZS1leHBlcnQtdWkgbmlsCiAgIk5vbi1uaWwgbWVhbnMgdXNpbmcgYSBub24taW50cnVzaXZl IGBvcmctZXhwb3J0LWRpc3BhdGNoJy4KSW4gdGhhdCBjYXNlLCBubyBoZWxwIGJ1ZmZlciBpcyBk aXNwbGF5ZWQuICBUaG91Z2gsIGFuIGluZGljYXRvcgpmb3IgY3VycmVudCBleHBvcnQgc2NvcGUg aXMgYWRkZWQgdG8gdGhlIHByb21wdCAoXCJiXCIgd2hlbgpvdXRwdXQgaXMgcmVzdHJpY3RlZCB0 byBib2R5IG9ubHksIFwic1wiIHdoZW4gaXQgaXMgcmVzdHJpY3RlZCB0bwp0aGUgY3VycmVudCBz dWJ0cmVlLCBcInZcIiB3aGVuIG9ubHkgdmlzaWJsZSBlbGVtZW50cyBhcmUKY29uc2lkZXJlZCBm b3IgZXhwb3J0LCBcImZcIiB3aGVuIHB1Ymxpc2hpbmcgZnVuY3Rpb25zIHNob3VsZCBiZQpwYXNz ZWQgdGhlIEZPUkNFIGFyZ3VtZW50IGFuZCBcImFcIiB3aGVuIHRoZSBleHBvcnQgc2hvdWxkIGJl CmFzeW5jaHJvbm91cykuICBBbHNvLCBcWz9dIGFsbG93cyB0byBzd2l0Y2ggYmFjayB0byBzdGFu ZGFyZAptb2RlLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZ2VuZXJhbAogIDp2ZXJzaW9uICIyNC40 IgogIDpwYWNrYWdlLXZlcnNpb24gJyhPcmcgLiAiOC4wIikKICA6dHlwZSAnYm9vbGVhbikKCgoj K2VuZF9zcmMKCiogRGVmaW5pbmcgQmFjay1lbmRzCgpgb3JnLWV4cG9ydC1kZWZpbmUtYmFja2Vu ZCcgaXMgdGhlIHN0YW5kYXJkIHdheSB0byBkZWZpbmUgYW4gZXhwb3J0CmJhY2stZW5kLiAgSXQg YWxsb3dzIHRvIHNwZWNpZnkgdHJhbnNsYXRvcnMsIGZpbHRlcnMsIGJ1ZmZlcgpvcHRpb25zIGFu ZCBhIG1lbnUgZW50cnkuICBJZiB0aGUgbmV3IGJhY2stZW5kIHNoYXJlcyB0cmFuc2xhdG9ycwp3 aXRoIGFub3RoZXIgYmFjay1lbmQsIGBvcmctZXhwb3J0LWRlZmluZS1kZXJpdmVkLWJhY2tlbmQn IG1heSBiZQp1c2VkIGluc3RlYWQuCgpJbnRlcm5hbGx5LCBhIGJhY2stZW5kIGlzIHN0b3JlZCBh cyBhIGxpc3QsIG9mIHdoaWNoIENBUiBpcyB0aGUKbmFtZSBvZiB0aGUgYmFjay1lbmQsIGFzIGEg c3ltYm9sLCBhbmQgQ0RSIGEgcGxpc3QuICBBY2Nlc3NvcnMgdG8KcHJvcGVydGllcyBvZiBhIGdp dmVuIGJhY2stZW5kIGFyZTogYG9yZy1leHBvcnQtYmFja2VuZC1maWx0ZXJzJywKYG9yZy1leHBv cnQtYmFja2VuZC1tZW51JywgYG9yZy1leHBvcnQtYmFja2VuZC1vcHRpb25zJyBhbmQKYG9yZy1l eHBvcnQtYmFja2VuZC10cmFuc2xhdGUtdGFibGUnLgoKRXZlbnR1YWxseSBgb3JnLWV4cG9ydC1i YXJmLWlmLWludmFsaWQtYmFja2VuZCcgcmV0dXJucyBhbiBlcnJvcgp3aGVuIGEgZ2l2ZW4gYmFj ay1lbmQgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCB5ZXQuCgojK2JlZ2luX3NyYyBlbWFjcy1saXNw CihkZWZ1biBvcmctZXhwb3J0LWRlZmluZS1iYWNrZW5kIChiYWNrZW5kIHRyYW5zbGF0b3JzICZy ZXN0IGJvZHkpCiAgIkRlZmluZSBhIG5ldyBiYWNrLWVuZCBCQUNLRU5ELgoKVFJBTlNMQVRPUlMg aXMgYW4gYWxpc3QgYmV0d2VlbiBvYmplY3Qgb3IgZWxlbWVudCB0eXBlcyBhbmQKZnVuY3Rpb25z IGhhbmRsaW5nIHRoZW0uCgpUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhIHN0cmluZyB3 aXRob3V0IGFueSB0cmFpbGluZwpzcGFjZSwgb3IgbmlsLiAgVGhleSBtdXN0IGFjY2VwdCB0aHJl ZSBhcmd1bWVudHM6IHRoZSBvYmplY3Qgb3IKZWxlbWVudCBpdHNlbGYsIGl0cyBjb250ZW50cyBv ciBuaWwgd2hlbiBpdCBpc24ndCByZWN1cnNpdmUgYW5kCnRoZSBwcm9wZXJ0eSBsaXN0IHVzZWQg YXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCgpDb250ZW50cywgd2hlbiBub3QgbmlsLCBhcmUg c3RyaXBwZWQgZnJvbSBhbnkgZ2xvYmFsIGluZGVudGF0aW9uClwoYWx0aG91Z2ggdGhlIHJlbGF0 aXZlIG9uZSBpcyBwcmVzZXJ2ZWQpLiAgVGhleSBhbHNvIGFsd2F5cyBlbmQKd2l0aCBhIHNpbmds ZSBuZXdsaW5lIGNoYXJhY3Rlci4KCklmLCBmb3IgYSBnaXZlbiB0eXBlLCBubyBmdW5jdGlvbiBp cyBmb3VuZCwgdGhhdCBlbGVtZW50IG9yCm9iamVjdCB0eXBlIHdpbGwgc2ltcGx5IGJlIGlnbm9y ZWQsIGFsb25nIHdpdGggYW55IGJsYW5rIGxpbmUgb3IKd2hpdGUgc3BhY2UgYXQgaXRzIGVuZC4g IFRoZSBzYW1lIHdpbGwgaGFwcGVuIGlmIHRoZSBmdW5jdGlvbgpyZXR1cm5zIHRoZSBuaWwgdmFs dWUuICBJZiB0aGF0IGZ1bmN0aW9uIHJldHVybnMgdGhlIGVtcHR5CnN0cmluZywgdGhlIHR5cGUg d2lsbCBiZSBpZ25vcmVkLCBidXQgdGhlIGJsYW5rIGxpbmVzIG9yIHdoaXRlCnNwYWNlcyB3aWxs IGJlIGtlcHQuCgpJbiBhZGRpdGlvbiB0byBlbGVtZW50IGFuZCBvYmplY3QgdHlwZXMsIG9uZSBm dW5jdGlvbiBjYW4gYmUKYXNzb2NpYXRlZCB0byB0aGUgYHRlbXBsYXRlJyAob3IgYGlubmVyLXRl bXBsYXRlJykgc3ltYm9sIGFuZAphbm90aGVyIG9uZSB0byB0aGUgYHBsYWluLXRleHQnIHN5bWJv bC4KClRoZSBmb3JtZXIgcmV0dXJucyB0aGUgZmluYWwgdHJhbnNjb2RlZCBzdHJpbmcsIGFuZCBj YW4gYmUgdXNlZAp0byBhZGQgYSBwcmVhbWJsZSBhbmQgYSBwb3N0YW1ibGUgdG8gZG9jdW1lbnQn cyBib2R5LiAgSXQgbXVzdAphY2NlcHQgdHdvIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgc3Ry aW5nIGFuZCB0aGUgcHJvcGVydHkgbGlzdApjb250YWluaW5nIGV4cG9ydCBvcHRpb25zLiAgQSBm dW5jdGlvbiBhc3NvY2lhdGVkIHRvIGB0ZW1wbGF0ZScKd2lsbCBub3QgYmUgYXBwbGllZCBpZiBl eHBvcnQgaGFzIG9wdGlvbiBcImJvZHktb25seVwiLgpBIGZ1bmN0aW9uIGFzc29jaWF0ZWQgdG8g YGlubmVyLXRlbXBsYXRlJyBpcyBhbHdheXMgYXBwbGllZC4KClRoZSBsYXR0ZXIsIHdoZW4gZGVm aW5lZCwgaXMgdG8gYmUgY2FsbGVkIG9uIGV2ZXJ5IHRleHQgbm90CnJlY29nbml6ZWQgYXMgYW4g ZWxlbWVudCBvciBhbiBvYmplY3QuICBJdCBtdXN0IGFjY2VwdCB0d28KYXJndW1lbnRzOiB0aGUg dGV4dCBzdHJpbmcgYW5kIHRoZSBpbmZvcm1hdGlvbiBjaGFubmVsLiAgSXQgaXMgYW4KYXBwcm9w cmlhdGUgcGxhY2UgdG8gcHJvdGVjdCBzcGVjaWFsIGNoYXJzIHJlbGF0aXZlIHRvIHRoZQpiYWNr LWVuZC4KCkJPRFkgY2FuIHN0YXJ0IHdpdGggcHJlLWRlZmluZWQga2V5d29yZCBhcmd1bWVudHMu ICBUaGUgZm9sbG93aW5nCmtleXdvcmRzIGFyZSB1bmRlcnN0b29kOgoKICA6ZXhwb3J0LWJsb2Nr CgogICAgU3RyaW5nLCBvciBsaXN0IG9mIHN0cmluZ3MsIHJlcHJlc2VudGluZyBibG9jayBuYW1l cyB0aGF0CiAgICB3aWxsIG5vdCBiZSBwYXJzZWQuICBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSBi bG9ja3MgdGhhdCB3aWxsCiAgICBjb250YWluIHJhdyBjb2RlIHNwZWNpZmljIHRvIHRoZSBiYWNr LWVuZC4gIFRoZXNlIGJsb2NrcwogICAgc3RpbGwgaGF2ZSB0byBiZSBoYW5kbGVkIGJ5IHRoZSBy ZWxhdGl2ZSBgZXhwb3J0LWJsb2NrJyB0eXBlCiAgICB0cmFuc2xhdG9yLgoKICA6ZmlsdGVycy1h bGlzdAoKICAgIEFsaXN0IGJldHdlZW4gZmlsdGVycyBhbmQgZnVuY3Rpb24sIG9yIGxpc3Qgb2Yg ZnVuY3Rpb25zLAogICAgc3BlY2lmaWMgdG8gdGhlIGJhY2stZW5kLiAgU2VlIGBvcmctZXhwb3J0 LWZpbHRlcnMtYWxpc3QnIGZvcgogICAgYSBsaXN0IG9mIGFsbCBhbGxvd2VkIGZpbHRlcnMuICBG aWx0ZXJzIGRlZmluZWQgaGVyZQogICAgc2hvdWxkbid0IG1ha2UgYSBiYWNrLWVuZCB0ZXN0LCBh cyBpdCBtYXkgcHJldmVudCBiYWNrLWVuZHMKICAgIGRlcml2ZWQgZnJvbSB0aGlzIG9uZSB0byBi ZWhhdmUgcHJvcGVybHkuCgogIDptZW51LWVudHJ5CgogICAgTWVudSBlbnRyeSBmb3IgdGhlIGV4 cG9ydCBkaXNwYXRjaGVyLiAgSXQgc2hvdWxkIGJlIGEgbGlzdAogICAgbGlrZToKCiAgICAgICco S0VZIERFU0NSSVBUSU9OLU9SLU9SRElOQUwgQUNUSU9OLU9SLU1FTlUpCgogICAgd2hlcmUgOgoK ICAgICAgS0VZIGlzIGEgZnJlZSBjaGFyYWN0ZXIgc2VsZWN0aW5nIHRoZSBiYWNrLWVuZC4KCiAg ICAgIERFU0NSSVBUSU9OLU9SLU9SRElOQUwgaXMgZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVy LgoKICAgICAgSWYgaXQgaXMgYSBzdHJpbmcsIGlzIHdpbGwgYmUgdXNlZCB0byBuYW1lIHRoZSBi YWNrLWVuZCBpbgogICAgICBpdHMgbWVudSBlbnRyeS4gIElmIGl0IGlzIGEgbnVtYmVyLCB0aGUg Zm9sbG93aW5nIG1lbnUgd2lsbAogICAgICBiZSBkaXNwbGF5ZWQgYXMgYSBzdWItbWVudSBvZiB0 aGUgYmFjay1lbmQgd2l0aCB0aGUgc2FtZQogICAgICBLRVkuICBBbHNvLCB0aGUgbnVtYmVyIHdp bGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgaW4gd2hpY2gKICAgICAgb3JkZXIgc3VjaCBzdWItbWVu dXMgd2lsbCBhcHBlYXIgKGxvd2VzdCBmaXJzdCkuCgogICAgICBBQ1RJT04tT1ItTUVOVSBpcyBl aXRoZXIgYSBmdW5jdGlvbiBvciBhbiBhbGlzdC4KCiAgICAgIElmIGl0IGlzIGFuIGFjdGlvbiwg aXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBmb3VyCiAgICAgIGFyZ3VtZW50cyAoYm9vbGVhbnMpOiBB U1lOQywgU1VCVFJFRVAsIFZJU0lCTEUtT05MWSBhbmQKICAgICAgQk9EWS1PTkxZLiAgU2VlIGBv cmctZXhwb3J0LWFzJyBmb3IgZnVydGhlciBleHBsYW5hdGlvbnMgb24KICAgICAgc29tZSBvZiB0 aGVtLgoKICAgICAgSWYgaXQgaXMgYW4gYWxpc3QsIGFzc29jaWF0aW9ucyBzaG91bGQgZm9sbG93 IHRoZQogICAgICBwYXR0ZXJuOgoKICAgICAgICAnKEtFWSBERVNDUklQVElPTiBBQ1RJT04pCgog ICAgICB3aGVyZSBLRVksIERFU0NSSVBUSU9OIGFuZCBBQ1RJT04gYXJlIGRlc2NyaWJlZCBhYm92 ZS4KCiAgICBWYWxpZCB2YWx1ZXMgaW5jbHVkZToKCiAgICAgICcoP20gXCJNeSBTcGVjaWFsIEJh Y2stZW5kXCIgbXktc3BlY2lhbC1leHBvcnQtZnVuY3Rpb24pCgogICAgICBvcgoKICAgICAgJyg/ bCBcIkV4cG9ydCB0byBMYVRlWFwiCiAgICAgICAgICAgXCg/cCBcIkFzIFBERiBmaWxlXCIgb3Jn LWxhdGV4LWV4cG9ydC10by1wZGYpCiAgICAgICAgICAgXCg/byBcIkFzIFBERiBmaWxlIGFuZCBv cGVuXCIKICAgICAgICAgICAgICAgXChsYW1iZGEgKGEgcyB2IGIpCiAgICAgICAgICAgICAgICAg XChpZiBhIChvcmctbGF0ZXgtZXhwb3J0LXRvLXBkZiB0IHMgdiBiKQogICAgICAgICAgICAgICAg ICAgXChvcmctb3Blbi1maWxlCiAgICAgICAgICAgICAgICAgICAgXChvcmctbGF0ZXgtZXhwb3J0 LXRvLXBkZiBuaWwgcyB2IGIpKSkpKSkpCgogICAgICBvciB0aGUgZm9sbG93aW5nLCB3aGljaCB3 aWxsIGJlIGFkZGVkIHRvIHRoZSBwcmV2aW91cwogICAgICBzdWItbWVudSwKCiAgICAgICcoP2wg MQogICAgICAgICAgXCgoP0IgXCJBcyBURVggYnVmZmVyIChCZWFtZXIpXCIgb3JnLWJlYW1lci1l eHBvcnQtYXMtbGF0ZXgpCiAgICAgICAgICAgXCg/UCBcIkFzIFBERiBmaWxlIChCZWFtZXIpXCIg b3JnLWJlYW1lci1leHBvcnQtdG8tcGRmKSkpCgogIDpvcHRpb25zLWFsaXN0CgogICAgQWxpc3Qg YmV0d2VlbiBiYWNrLWVuZCBzcGVjaWZpYyBwcm9wZXJ0aWVzIGludHJvZHVjZWQgaW4KICAgIGNv bW11bmljYXRpb24gY2hhbm5lbCBhbmQgaG93IHRoZWlyIHZhbHVlIGFyZSBhY3F1aXJlZC4gIFNl ZQogICAgYG9yZy1leHBvcnQtb3B0aW9ucy1hbGlzdCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJv dXQKICAgIHN0cnVjdHVyZSBvZiB0aGUgdmFsdWVzLiIpCgooZGVmdW4gb3JnLWV4cG9ydC1kZWZp bmUtZGVyaXZlZC1iYWNrZW5kIChjaGlsZCBwYXJlbnQgJnJlc3QgYm9keSkKICAiQ3JlYXRlIGEg bmV3IGJhY2stZW5kIGFzIGEgdmFyaWFudCBvZiBhbiBleGlzdGluZyBvbmUuCgpDSElMRCBpcyB0 aGUgbmFtZSBvZiB0aGUgZGVyaXZlZCBiYWNrLWVuZC4gIFBBUkVOVCBpcyB0aGUgbmFtZSBvZgp0 aGUgcGFyZW50IGJhY2stZW5kLgoKQk9EWSBjYW4gc3RhcnQgd2l0aCBwcmUtZGVmaW5lZCBrZXl3 b3JkIGFyZ3VtZW50cy4gIFRoZSBmb2xsb3dpbmcKa2V5d29yZHMgYXJlIHVuZGVyc3Rvb2Q6Cgog IDpleHBvcnQtYmxvY2sKCiAgICBTdHJpbmcsIG9yIGxpc3Qgb2Ygc3RyaW5ncywgcmVwcmVzZW50 aW5nIGJsb2NrIG5hbWVzIHRoYXQKICAgIHdpbGwgbm90IGJlIHBhcnNlZC4gIFRoaXMgaXMgdXNl ZCB0byBzcGVjaWZ5IGJsb2NrcyB0aGF0IHdpbGwKICAgIGNvbnRhaW4gcmF3IGNvZGUgc3BlY2lm aWMgdG8gdGhlIGJhY2stZW5kLiAgVGhlc2UgYmxvY2tzCiAgICBzdGlsbCBoYXZlIHRvIGJlIGhh bmRsZWQgYnkgdGhlIHJlbGF0aXZlIGBleHBvcnQtYmxvY2snIHR5cGUKICAgIHRyYW5zbGF0b3Iu CgogIDpmaWx0ZXJzLWFsaXN0CgogICAgQWxpc3Qgb2YgZmlsdGVycyB0aGF0IHdpbGwgb3Zlcndy aXRlIG9yIGNvbXBsZXRlIGZpbHRlcnMKICAgIGRlZmluZWQgaW4gUEFSRU5UIGJhY2stZW5kLiAg U2VlIGBvcmctZXhwb3J0LWZpbHRlcnMtYWxpc3QnCiAgICBmb3IgYSBsaXN0IG9mIGFsbG93ZWQg ZmlsdGVycy4KCiAgOm1lbnUtZW50cnkKCiAgICBNZW51IGVudHJ5IGZvciB0aGUgZXhwb3J0IGRp c3BhdGNoZXIuICBTZWUKICAgIGBvcmctZXhwb3J0LWRlZmluZS1iYWNrZW5kJyBmb3IgbW9yZSBp bmZvcm1hdGlvbiBhYm91dCB0aGUKICAgIGV4cGVjdGVkIHZhbHVlLgoKICA6b3B0aW9ucy1hbGlz dAoKICAgIEFsaXN0IG9mIGJhY2stZW5kIHNwZWNpZmljIHByb3BlcnRpZXMgdGhhdCB3aWxsIG92 ZXJ3cml0ZSBvcgogICAgY29tcGxldGUgdGhvc2UgZGVmaW5lZCBpbiBQQVJFTlQgYmFjay1lbmQu ICBSZWZlciB0bwogICAgYG9yZy1leHBvcnQtb3B0aW9ucy1hbGlzdCcgZm9yIG1vcmUgaW5mb3Jt YXRpb24gYWJvdXQKICAgIHN0cnVjdHVyZSBvZiB0aGUgdmFsdWVzLgoKICA6dHJhbnNsYXRlLWFs aXN0CgogICAgQWxpc3Qgb2YgZWxlbWVudCBhbmQgb2JqZWN0IHR5cGVzIGFuZCB0cmFuc2NvZGVy cyB0aGF0IHdpbGwKICAgIG92ZXJ3cml0ZSBvciBjb21wbGV0ZSB0cmFuc2NvZGUgdGFibGUgZnJv bSBQQVJFTlQgYmFjay1lbmQuCiAgICBSZWZlciB0byBgb3JnLWV4cG9ydC1kZWZpbmUtYmFja2Vu ZCcgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uCiAgICBhYm91dCB0cmFuc2NvZGVycy4KCkFzIGFu IGV4YW1wbGUsIGhlcmUgaXMgaG93IG9uZSBjb3VsZCBkZWZpbmUgXCJteS1sYXRleFwiIGJhY2st ZW5kCmFzIGEgdmFyaWFudCBvZiBgbGF0ZXgnIGJhY2stZW5kIHdpdGggYSBjdXN0b20gdGVtcGxh dGUgZnVuY3Rpb246CgogIFwob3JnLWV4cG9ydC1kZWZpbmUtZGVyaXZlZC1iYWNrZW5kICdteS1s YXRleCAnbGF0ZXgKICAgICA6dHJhbnNsYXRlLWFsaXN0ICcoKHRlbXBsYXRlIC4gbXktbGF0ZXgt dGVtcGxhdGUtZnVuKSkpCgpUaGUgYmFjay1lbmQgY291bGQgdGhlbiBiZSBjYWxsZWQgd2l0aCwg Zm9yIGV4YW1wbGU6CgogIFwob3JnLWV4cG9ydC10by1idWZmZXIgJ215LWxhdGV4IFwiKlRlc3Qg bXktbGF0ZXgqXCIpIikKCihkZWZ1biBvcmctZXhwb3J0LWJhY2tlbmQtcGFyZW50IChiYWNrZW5k KQogICJSZXR1cm4gYmFjay1lbmQgZnJvbSB3aGljaCBCQUNLRU5EIGlzIGRlcml2ZWQsIG9yIG5p bC4iKQoKKGRlZnVuIG9yZy1leHBvcnQtYmFja2VuZC1maWx0ZXJzIChiYWNrZW5kKQogICJSZXR1 cm4gZmlsdGVycyBmb3IgQkFDS0VORC4iKQoKKGRlZnVuIG9yZy1leHBvcnQtYmFja2VuZC1tZW51 IChiYWNrZW5kKQogICJSZXR1cm4gbWVudSBlbnRyeSBmb3IgQkFDS0VORC4iKQoKKGRlZnVuIG9y Zy1leHBvcnQtYmFja2VuZC1vcHRpb25zIChiYWNrZW5kKQogICJSZXR1cm4gZXhwb3J0IG9wdGlv bnMgZm9yIEJBQ0tFTkQuIikKCihkZWZ1biBvcmctZXhwb3J0LWJhY2tlbmQtdHJhbnNsYXRlLXRh YmxlIChiYWNrZW5kKQogICJSZXR1cm4gdHJhbnNsYXRlIHRhYmxlIGZvciBCQUNLRU5ELiIpCgoo ZGVmdW4gb3JnLWV4cG9ydC1iYXJmLWlmLWludmFsaWQtYmFja2VuZCAoYmFja2VuZCkKICAiU2ln bmFsIGFuIGVycm9yIGlmIEJBQ0tFTkQgaXNuJ3QgZGVmaW5lZC4iKQoKKGRlZnVuIG9yZy1leHBv cnQtZGVyaXZlZC1iYWNrZW5kLXAgKGJhY2tlbmQgJnJlc3QgYmFja2VuZHMpCiAgIk5vbi1uaWwg aWYgQkFDS0VORCBpcyBkZXJpdmVkIGZyb20gb25lIG9mIEJBQ0tFTkRTLiIpCgoKIytlbmRfc3Jj CgoqIFRoZSBDb21tdW5pY2F0aW9uIENoYW5uZWwKCkR1cmluZyBleHBvcnQgcHJvY2VzcywgZXZl cnkgZnVuY3Rpb24gaGFzIGFjY2VzcyB0byBhIG51bWJlciBvZgpwcm9wZXJ0aWVzLiAgVGhleSBh cmUgb2YgdHdvIHR5cGVzOgoKMS4gRW52aXJvbm1lbnQgb3B0aW9ucyBhcmUgY29sbGVjdGVkIG9u Y2UgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mCiAgIHRoZSBwcm9jZXNzLCBvdXQgb2YgdGhlIG9y aWdpbmFsIGJ1ZmZlciBhbmQgY29uZmlndXJhdGlvbi4KICAgQ29sbGVjdGluZyB0aGVtIGlzIGhh bmRsZWQgYnkgYG9yZy1leHBvcnQtZ2V0LWVudmlyb25tZW50JwogICBmdW5jdGlvbi4KCiAgIE1v c3QgZW52aXJvbm1lbnQgb3B0aW9ucyBhcmUgZGVmaW5lZCB0aHJvdWdoIHRoZQogICBgb3JnLWV4 cG9ydC1vcHRpb25zLWFsaXN0JyB2YXJpYWJsZS4KCjIuIFRyZWUgcHJvcGVydGllcyBhcmUgZXh0 cmFjdGVkIGRpcmVjdGx5IGZyb20gdGhlIHBhcnNlZCB0cmVlLAogICBqdXN0IGJlZm9yZSBleHBv cnQsIGJ5IGBvcmctZXhwb3J0LWNvbGxlY3QtdHJlZS1wcm9wZXJ0aWVzJy4KCkhlcmUgaXMgdGhl IGZ1bGwgbGlzdCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBkdXJpbmcgdHJhbnNjb2RlCnByb2Nl c3MsIHdpdGggdGhlaXIgY2F0ZWdvcnkgYW5kIHRoZWlyIHZhbHVlIHR5cGUuCgorIGA6YXV0aG9y JyA6OiBBdXRob3IncyBuYW1lLgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN0 cmluZwoKKyBgOmJhY2stZW5kJyA6OiBDdXJyZW50IGJhY2stZW5kIHVzZWQgZm9yIHRyYW5zY29k aW5nLgogIC0gY2F0ZWdvcnkgOjogdHJlZQogIC0gdHlwZSA6OiBzeW1ib2wKCisgYDpjcmVhdG9y JyA6OiBTdHJpbmcgdG8gd3JpdGUgYXMgY3JlYXRpb24gaW5mb3JtYXRpb24uCiAgLSBjYXRlZ29y eSA6OiBvcHRpb24KICAtIHR5cGUgOjogc3RyaW5nCgorIGA6ZGF0ZScgOjogU3RyaW5nIHRvIHVz ZSBhcyBkYXRlLgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN0cmluZwoKKyBg OmRlc2NyaXB0aW9uJyA6OiBEZXNjcmlwdGlvbiB0ZXh0IGZvciB0aGUgY3VycmVudCBkYXRhLgog IC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN0cmluZwoKKyBgOmVtYWlsJyA6OiBB dXRob3IncyBlbWFpbC4KICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBzdHJpbmcK CisgYDpleGNsdWRlLXRhZ3MnIDo6IFRhZ3MgZm9yIGV4Y2x1c2lvbiBvZiBzdWJ0cmVlcyBmcm9t IGV4cG9ydAogICAgIHByb2Nlc3MuCiAgLSBjYXRlZ29yeSA6OiBvcHRpb24KICAtIHR5cGUgOjog bGlzdCBvZiBzdHJpbmdzCgorIGA6ZXhwb3J0LW9wdGlvbnMnIDo6IExpc3Qgb2YgZXhwb3J0IG9w dGlvbnMgYXZhaWxhYmxlIGZvciBjdXJyZW50CiAgICAgcHJvY2Vzcy4KICAtIGNhdGVnb3J5IDo6 IG5vbmUKICAtIHR5cGUgOjogbGlzdCBvZiBzeW1ib2xzLCBhbW9uZyBgc3VidHJlZScsIGBib2R5 LW9ubHknIGFuZAogICAgIGB2aXNpYmxlLW9ubHknLgoKKyBgOmV4cG9ydGVkLWRhdGEnIDo6IEhh c2ggdGFibGUgdXNlZCBmb3IgbWVtb2l6aW5nCiAgICBgb3JnLWV4cG9ydC1kYXRhJy4KICAtIGNh dGVnb3J5IDo6IHRyZWUKICAtIHR5cGUgOjogaGFzaCB0YWJsZQoKKyBgOmZpbGV0YWdzJyA6OiBM aXN0IG9mIGdsb2JhbCB0YWdzIGZvciBidWZmZXIuICBVc2VkIGJ5CiAgYG9yZy1leHBvcnQtZ2V0 LXRhZ3MnIHRvIGdldCB0YWdzIHdpdGggaW5oZXJpdGFuY2UuCiAgLSBjYXRlZ29yeSA6OiBvcHRp b24KICAtIHR5cGUgOjogbGlzdCBvZiBzdHJpbmdzCgorIGA6Zm9vdG5vdGUtZGVmaW5pdGlvbi1h bGlzdCcgOjogQWxpc3QgYmV0d2VlbiBmb290bm90ZSBsYWJlbHMgYW5kCiAgICAgdGhlaXIgZGVm aW5pdGlvbiwgYXMgcGFyc2VkIGRhdGEuICBPbmx5IG5vbi1pbmxpbmVkIGZvb3Rub3RlcwogICAg IGFyZSByZXByZXNlbnRlZCBpbiB0aGlzIGFsaXN0LiAgQWxzbywgZXZlcnkgZGVmaW5pdGlvbiBp c24ndAogICAgIGd1YXJhbnRlZWQgdG8gYmUgcmVmZXJlbmNlZCBpbiB0aGUgcGFyc2UgdHJlZS4g IFRoZSBwdXJwb3NlIG9mCiAgICAgdGhpcyBwcm9wZXJ0eSBpcyB0byBwcmVzZXJ2ZSBkZWZpbml0 aW9ucyBmcm9tIG9ibGl2aW9uCiAgICAgKGkuZS4gd2hlbiB0aGUgcGFyc2UgdHJlZSBjb21lcyBm cm9tIGEgcGFydCBvZiB0aGUgb3JpZ2luYWwKICAgICBidWZmZXIpLCBpdCBpc24ndCBtZWFudCBm b3IgZGlyZWN0IHVzZSBpbiBhIGJhY2stZW5kLiAgVG8KICAgICByZXRyaWV2ZSBhIGRlZmluaXRp b24gcmVsYXRpdmUgdG8gYSByZWZlcmVuY2UsIHVzZQogICAgIGBvcmctZXhwb3J0LWdldC1mb290 bm90ZS1kZWZpbml0aW9uJyBpbnN0ZWFkLgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBl IDo6IGFsaXN0IChTVFJJTkcgLiBMSVNUKQoKKyBgOmhlYWRsaW5lLWxldmVscycgOjogTWF4aW11 bSBsZXZlbCBiZWluZyBleHBvcnRlZCBhcyBhbgogICAgIGhlYWRsaW5lLiAgQ29tcGFyaXNvbiBp cyBkb25lIHdpdGggdGhlIHJlbGF0aXZlIGxldmVsIG9mCiAgICAgaGVhZGxpbmVzIGluIHRoZSBw YXJzZSB0cmVlLCBub3QgbmVjZXNzYXJpbHkgd2l0aCB0aGVpcgogICAgIGFjdHVhbCBsZXZlbC4K ICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBpbnRlZ2VyCgorIGA6aGVhZGxpbmUt b2Zmc2V0JyA6OiBEaWZmZXJlbmNlIGJldHdlZW4gcmVsYXRpdmUgYW5kIHJlYWwgbGV2ZWwKICAg ICBvZiBoZWFkbGluZXMgaW4gdGhlIHBhcnNlIHRyZWUuICBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBv ZiAtMQogICAgIG1lYW5zIGEgbGV2ZWwgMiBoZWFkbGluZSBzaG91bGQgYmUgY29uc2lkZXJlZCBh cyBsZXZlbAogICAgIDEgKGNmLiBgb3JnLWV4cG9ydC1nZXQtcmVsYXRpdmUtbGV2ZWwnKS4KICAt IGNhdGVnb3J5IDo6IHRyZWUKICAtIHR5cGUgOjogaW50ZWdlcgoKKyBgOmhlYWRsaW5lLW51bWJl cmluZycgOjogQWxpc3QgYmV0d2VlbiBoZWFkbGluZXMgYW5kIHRoZWlyCiAgICAgbnVtYmVyaW5n LCBhcyBhIGxpc3Qgb2YgbnVtYmVycwogICAgIChjZi4gYG9yZy1leHBvcnQtZ2V0LWhlYWRsaW5l LW51bWJlcicpLgogIC0gY2F0ZWdvcnkgOjogdHJlZQogIC0gdHlwZSA6OiBhbGlzdCAoSU5URUdF UiAuIExJU1QpCgorIGA6aWQtYWxpc3QnIDo6IEFsaXN0IGJldHdlZW4gSUQgc3RyaW5ncyBhbmQg ZGVzdGluYXRpb24gZmlsZSdzCiAgICAgcGF0aCwgcmVsYXRpdmUgdG8gY3VycmVudCBkaXJlY3Rv cnkuICBJdCBpcyB1c2VkIGJ5CiAgICAgYG9yZy1leHBvcnQtcmVzb2x2ZS1pZC1saW5rJyB0byBy ZXNvbHZlIElEIGxpbmtzIHRhcmdldGluZyBhbgogICAgIGV4dGVybmFsIGZpbGUuCiAgLSBjYXRl Z29yeSA6OiBvcHRpb24KICAtIHR5cGUgOjogYWxpc3QgKFNUUklORyAuIFNUUklORykKCisgYDpp Z25vcmUtbGlzdCcgOjogTGlzdCBvZiBlbGVtZW50cyBhbmQgb2JqZWN0cyB0aGF0IHNob3VsZCBi ZQogICAgIGlnbm9yZWQgZHVyaW5nIGV4cG9ydC4KICAtIGNhdGVnb3J5IDo6IHRyZWUKICAtIHR5 cGUgOjogbGlzdCBvZiBlbGVtZW50cyBhbmQgb2JqZWN0cwoKKyBgOmlucHV0LWZpbGUnIDo6IEZ1 bGwgcGF0aCB0byBpbnB1dCBmaWxlLCBpZiBhbnkuCiAgLSBjYXRlZ29yeSA6OiBvcHRpb24KICAt IHR5cGUgOjogc3RyaW5nIG9yIG5pbAoKKyBgOmtleXdvcmRzJyA6OiBMaXN0IG9mIGtleXdvcmRz IGF0dGFjaGVkIHRvIGRhdGEuCiAgLSBjYXRlZ29yeSA6OiBvcHRpb24KICAtIHR5cGUgOjogc3Ry aW5nCgorIGA6bGFuZ3VhZ2UnIDo6IERlZmF1bHQgbGFuZ3VhZ2UgdXNlZCBmb3IgdHJhbnNsYXRp b25zLgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN0cmluZwoKKyBgOnBhcnNl LXRyZWUnIDo6IFdob2xlIHBhcnNlIHRyZWUsIGF2YWlsYWJsZSBhdCBhbnkgdGltZSBkdXJpbmcK ICAgICB0cmFuc2NvZGluZy4KICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBsaXN0 IChhcyByZXR1cm5lZCBieSBgb3JnLWVsZW1lbnQtcGFyc2UtYnVmZmVyJykKCisgYDpwcmVzZXJ2 ZS1icmVha3MnIDo6IE5vbi1uaWwgbWVhbnMgdHJhbnNjb2Rpbmcgc2hvdWxkIHByZXNlcnZlCiAg ICAgYWxsIGxpbmUgYnJlYWtzLgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN5 bWJvbCAobmlsLCB0KQoKKyBgOnNlY3Rpb24tbnVtYmVycycgOjogTm9uLW5pbCBtZWFucyB0cmFu c2NvZGluZyBzaG91bGQgYWRkCiAgICAgc2VjdGlvbiBudW1iZXJzIHRvIGhlYWRsaW5lcy4KICAt IGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBzeW1ib2wgKG5pbCwgdCkKCisgYDpzZWxl Y3QtdGFncycgOjogTGlzdCBvZiB0YWdzIGVuZm9yY2luZyBpbmNsdXNpb24gb2Ygc3ViLXRyZWVz CiAgICAgaW4gdHJhbnNjb2RpbmcuICBXaGVuIHN1Y2ggYSB0YWcgaXMgcHJlc2VudCwgc3VidHJl ZXMgd2l0aG91dAogICAgIGl0IGFyZSBkZSBmYWN0byBleGNsdWRlZCBmcm9tIHRoZSBwcm9jZXNz LiAgU2VlCiAgICAgYHVzZS1zZWxlY3QtdGFncycuCiAgLSBjYXRlZ29yeSA6OiBvcHRpb24KICAt IHR5cGUgOjogbGlzdCBvZiBzdHJpbmdzCgorIGA6dGltZS1zdGFtcC1maWxlJyA6OiBOb24tbmls IG1lYW5zIHRyYW5zY29kaW5nIHNob3VsZCBpbnNlcnQKICAgICBhIHRpbWUgc3RhbXAgaW4gdGhl IG91dHB1dC4KICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBzeW1ib2wgKG5pbCwg dCkKCisgYDp0cmFuc2xhdGUtYWxpc3QnIDo6IEFsaXN0IGJldHdlZW4gZWxlbWVudCBhbmQgb2Jq ZWN0IHR5cGVzIGFuZAogICAgIHRyYW5zY29kaW5nIGZ1bmN0aW9ucyByZWxhdGl2ZSB0byB0aGUg Y3VycmVudCBiYWNrLWVuZC4KICAgICBTcGVjaWFsIGtleXMgYGlubmVyLXRlbXBsYXRlJywgYHRl bXBsYXRlJyBhbmQgYHBsYWluLXRleHQnIGFyZQogICAgIGFsc28gcG9zc2libGUuCiAgLSBjYXRl Z29yeSA6OiBvcHRpb24KICAtIHR5cGUgOjogYWxpc3QgKFNZTUJPTCAuIEZVTkNUSU9OKQoKKyBg OndpdGgtYXJjaGl2ZWQtdHJlZXMnIDo6IE5vbi1uaWwgd2hlbiBhcmNoaXZlZCBzdWJ0cmVlcyBz aG91bGQKICAgICBhbHNvIGJlIHRyYW5zY29kZWQuICBJZiBpdCBpcyBzZXQgdG8gdGhlIGBoZWFk bGluZScgc3ltYm9sLAogICAgIG9ubHkgdGhlIGFyY2hpdmVkIGhlYWRsaW5lJ3MgbmFtZSBpcyBy ZXRhaW5lZC4KICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBzeW1ib2wgKG5pbCwg dCwgYGhlYWRsaW5lJykKCisgYDp3aXRoLWF1dGhvcicgOjogTm9uLW5pbCBtZWFucyBhdXRob3In cyBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZAogICAgIGluIHRoZSBvdXRwdXQuCiAgLSBjYXRlZ29y eSA6OiBvcHRpb24KICAtIHR5cGUgOjogc3ltYm9sIChuaWwsIHQpCgorIGA6d2l0aC1jbG9ja3Mn IDo6IE5vbi1uaWwgbWVhbnMgY2xvY2sga2V5d29yZHMgc2hvdWxkIGJlIGV4cG9ydGVkLgogIC0g Y2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN5bWJvbCAobmlsLCB0KQoKKyBgOndpdGgt Y3JlYXRvcicgOjogTm9uLW5pbCBtZWFucyBhIGNyZWF0aW9uIHNlbnRlbmNlIHNob3VsZCBiZQog ICAgIGluc2VydGVkIGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zY29kZWQgc3RyaW5nLiAgSWYgdGhl IHZhbHVlCiAgICAgaXMgYGNvbW1lbnQnLCBpdCBzaG91bGQgYmUgY29tbWVudGVkLgogIC0gY2F0 ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN5bWJvbCAoYGNvbW1lbnQnLCBuaWwsIHQpCgor IGA6d2l0aC1kYXRlJyA6OiBOb24tbmlsIG1lYW5zIG91dHB1dCBzaG91bGQgY29udGFpbiBhIGRh dGUuCiAgLSBjYXRlZ29yeSA6OiBvcHRpb24KICAtIHR5cGUgOi4gc3ltYm9sIChuaWwsIHQpCgor IGA6d2l0aC1kcmF3ZXJzJyA6OiBOb24tbmlsIG1lYW5zIGRyYXdlcnMgc2hvdWxkIGJlIGV4cG9y dGVkLiAgSWYKICAgICBpdHMgdmFsdWUgaXMgYSBsaXN0IG9mIG5hbWVzLCBvbmx5IGRyYXdlcnMg d2l0aCBzdWNoIG5hbWVzCiAgICAgd2lsbCBiZSB0cmFuc2NvZGVkLiAgSWYgdGhhdCBsaXN0IHN0 YXJ0cyB3aXRoIGBub3QnLCBkcmF3ZXIKICAgICB3aXRoIHRoZXNlIG5hbWVzIHdpbGwgYmUgc2tp cHBlZC4KICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBzeW1ib2wgKG5pbCwgdCkg b3IgbGlzdCBvZiBzdHJpbmdzCgorIGA6d2l0aC1lbWFpbCcgOjogTm9uLW5pbCBtZWFucyBvdXRw dXQgc2hvdWxkIGNvbnRhaW4gYXV0aG9yJ3MKICAgICAgICAgICAgICAgICAgZW1haWwuCiAgLSBj YXRlZ29yeSA6OiBvcHRpb24KICAtIHR5cGUgOjogc3ltYm9sIChuaWwsIHQpCgorIGA6d2l0aC1l bXBoYXNpemUnIDo6IE5vbi1uaWwgbWVhbnMgZW1waGFzaXplZCB0ZXh0IHNob3VsZCBiZQogICAg IGludGVycHJldGVkLgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN5bWJvbCAo bmlsLCB0KQoKKyBgOndpdGgtZml4ZWQtd2lkdGgnIDo6IE5vbi1uaWwgaWYgdHJhbnNjb2RlciBz aG91bGQgaW50ZXJwcmV0CiAgICAgc3RyaW5ncyBzdGFydGluZyB3aXRoIGEgY29sb24gYXMgYSBm aXhlZC13aXRoICh2ZXJiYXRpbSkgYXJlYS4KICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlw ZSA6OiBzeW1ib2wgKG5pbCwgdCkKCisgYDp3aXRoLWZvb3Rub3RlcycgOjogTm9uLW5pbCBpZiB0 cmFuc2NvZGVyIHNob3VsZCBpbnRlcnByZXQKICAgICBmb290bm90ZXMuCiAgLSBjYXRlZ29yeSA6 OiBvcHRpb24KICAtIHR5cGUgOjogc3ltYm9sIChuaWwsIHQpCgorIGA6d2l0aC1sYXRleCcgOjog Tm9uLW5pbCBtZWFucyBgbGF0ZXgtZW52aXJvbm1lbnQnIGVsZW1lbnRzIGFuZAogICBgbGF0ZXgt ZnJhZ21lbnQnIG9iamVjdHMgc2hvdWxkIGFwcGVhciBpbiBleHBvcnQgb3V0cHV0LiAgV2hlbgog ICB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgdmVyYmF0aW0nLCB0aGV5IHdpbGwgYmUgbGVmdCBh cy1pcy4KICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBzeW1ib2wgKGB2ZXJiYXRp bScsIG5pbCwgdCkKCisgYDp3aXRoLXBsYW5uaW5nJyA6OiBOb24tbmlsIG1lYW5zIHRyYW5zY29k aW5nIHNob3VsZCBpbmNsdWRlCiAgICAgcGxhbm5pbmcgaW5mby4KICAtIGNhdGVnb3J5IDo6IG9w dGlvbgogIC0gdHlwZSA6OiBzeW1ib2wgKG5pbCwgdCkKCisgYDp3aXRoLXByaW9yaXR5JyA6OiBO b24tbmlsIG1lYW5zIHRyYW5zY29kaW5nIHNob3VsZCBpbmNsdWRlCiAgICAgcHJpb3JpdHkgY29v a2llcy4KICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBzeW1ib2wgKG5pbCwgdCkK CisgYDp3aXRoLXNtYXJ0LXF1b3RlcycgOjogTm9uLW5pbCBtZWFucyBhY3RpdmF0ZSBzbWFydCBx dW90ZXMgaW4KICAgICBwbGFpbiB0ZXh0LgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBl IDo6IHN5bWJvbCAobmlsLCB0KQoKKyBgOndpdGgtc3BlY2lhbC1zdHJpbmdzJyA6OiBOb24tbmls IG1lYW5zIHRyYW5zY29kaW5nIHNob3VsZAogICAgIGludGVycHJldCBzcGVjaWFsIHN0cmluZ3Mg aW4gcGxhaW4gdGV4dC4KICAtIGNhdGVnb3J5IDo6IG9wdGlvbgogIC0gdHlwZSA6OiBzeW1ib2wg KG5pbCwgdCkKCisgYDp3aXRoLXN1Yi1zdXBlcnNjcmlwdCcgOjogTm9uLW5pbCBtZWFucyB0cmFu c2NvZGluZyBzaG91bGQKICAgICBpbnRlcnByZXQgc3Vic2NyaXB0IGFuZCBzdXBlcnNjcmlwdC4g IFdpdGggYSB2YWx1ZSBvZiAie30iLAogICAgIG9ubHkgaW50ZXJwcmV0IHRob3NlIHVzaW5nIGN1 cmx5IGJyYWNrZXRzLgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN5bWJvbCAo bmlsLCB7fSwgdCkKCisgYDp3aXRoLXRhYmxlcycgOjogTm9uLW5pbCBtZWFucyB0cmFuc2NvZGlu ZyBzaG91bGQgaW50ZXJwcmV0CiAgICAgdGFibGVzLgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAg LSB0eXBlIDo6IHN5bWJvbCAobmlsLCB0KQoKKyBgOndpdGgtdGFncycgOjogTm9uLW5pbCBtZWFu cyB0cmFuc2NvZGluZyBzaG91bGQga2VlcCB0YWdzIGluCiAgICAgaGVhZGxpbmVzLiAgQSBgbm90 LWluLXRvYycgdmFsdWUgd2lsbCByZW1vdmUgdGhlbSBmcm9tIHRoZQogICAgIHRhYmxlIG9mIGNv bnRlbnRzLCBpZiBhbnksIG5vbmV0aGVsZXNzLgogIC0gY2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0 eXBlIDo6IHN5bWJvbCAobmlsLCB0LCBgbm90LWluLXRvYycpCgorIGA6d2l0aC10YXNrcycgOjog Tm9uLW5pbCBtZWFucyB0cmFuc2NvZGluZyBzaG91bGQgaW5jbHVkZQogICAgIGhlYWRsaW5lcyB3 aXRoIGEgVE9ETyBrZXl3b3JkLiAgQSBgdG9kbycgdmFsdWUgd2lsbCBvbmx5CiAgICAgaW5jbHVk ZSBoZWFkbGluZXMgd2l0aCBhIHRvZG8gdHlwZSBrZXl3b3JkIHdoaWxlIGEgYGRvbmUnCiAgICAg dmFsdWUgd2lsbCBkbyB0aGUgY29udHJhcnkuICBJZiBhIGxpc3Qgb2Ygc3RyaW5ncyBpcyBwcm92 aWRlZCwKICAgICBvbmx5IHRhc2tzIHdpdGgga2V5d29yZHMgYmVsb25naW5nIHRvIHRoYXQgbGlz dCB3aWxsIGJlIGtlcHQuCiAgLSBjYXRlZ29yeSA6OiBvcHRpb24KICAtIHR5cGUgOjogc3ltYm9s ICh0LCB0b2RvLCBkb25lLCBuaWwpIG9yIGxpc3Qgb2Ygc3RyaW5ncwoKKyBgOndpdGgtdGltZXN0 YW1wcycgOjogTm9uLW5pbCBtZWFucyB0cmFuc2NvZGluZyBzaG91bGQgaW5jbHVkZQogICAgIHRp bWUgc3RhbXBzLiAgU3BlY2lhbCB2YWx1ZSBgYWN0aXZlJyAocmVzcC4gYGluYWN0aXZlJykgYXNr IHRvCiAgICAgZXhwb3J0IG9ubHkgYWN0aXZlIChyZXNwLiBpbmFjdGl2ZSkgdGltZXN0YW1wcy4g IE90aGVyd2lzZSwKICAgICBjb21wbGV0ZWx5IHJlbW92ZSB0aGVtLgogIC0gY2F0ZWdvcnkgOjog b3B0aW9uCiAgLSB0eXBlIDo6IHN5bWJvbDogKGBhY3RpdmUnLCBgaW5hY3RpdmUnLCB0LCBuaWwp CgorIGA6d2l0aC10b2MnIDo6IE5vbi1uaWwgbWVhbnMgdGhhdCBhIHRhYmxlIG9mIGNvbnRlbnRz IGhhcyB0byBiZQogICAgIGFkZGVkIHRvIHRoZSBvdXRwdXQuICBBbiBpbnRlZ2VyIHZhbHVlIGxp bWl0cyBpdHMgZGVwdGguCiAgLSBjYXRlZ29yeSA6OiBvcHRpb24KICAtIHR5cGUgOjogc3ltYm9s IChuaWwsIHQgb3IgaW50ZWdlcikKCisgYDp3aXRoLXRvZG8ta2V5d29yZHMnIDo6IE5vbi1uaWwg bWVhbnMgdHJhbnNjb2Rpbmcgc2hvdWxkCiAgICAgaW5jbHVkZSBUT0RPIGtleXdvcmRzLgogIC0g Y2F0ZWdvcnkgOjogb3B0aW9uCiAgLSB0eXBlIDo6IHN5bWJvbCAobmlsLCB0KQoKCioqIEVudmly b25tZW50IE9wdGlvbnMKCkVudmlyb25tZW50IG9wdGlvbnMgZW5jb21wYXNzIGFsbCBwYXJhbWV0 ZXJzIGRlZmluZWQgb3V0c2lkZSB0aGUKc2NvcGUgb2YgdGhlIHBhcnNlZCBkYXRhLiAgVGhleSBj b21lIGZyb20gZml2ZSBzb3VyY2VzLCBpbgppbmNyZWFzaW5nIHByZWNlZGVuY2Ugb3JkZXI6Cgot IEdsb2JhbCB2YXJpYWJsZXMsCi0gQnVmZmVyJ3MgYXR0cmlidXRlcywKLSBPcHRpb25zIGtleXdv cmQgc3ltYm9scywKLSBCdWZmZXIga2V5d29yZHMsCi0gU3VidHJlZSBwcm9wZXJ0aWVzLgoKVGhl IGNlbnRyYWwgaW50ZXJuYWwgZnVuY3Rpb24gd2l0aCByZWdhcmRzIHRvIGVudmlyb25tZW50IG9w dGlvbnMKaXMgYG9yZy1leHBvcnQtZ2V0LWVudmlyb25tZW50Jy4gIEl0IHVwZGF0ZXMgZ2xvYmFs IHZhcmlhYmxlcyB3aXRoCiIjK0JJTkQ6IiBrZXl3b3JkcywgdGhlbiByZXRyaWV2ZSBhbmQgcHJp b3JpdGl6ZSBwcm9wZXJ0aWVzIGZyb20KdGhlIGRpZmZlcmVudCBzb3VyY2VzLgoKIFRoZSBpbnRl cm5hbCBmdW5jdGlvbnMgZG9pbmcgdGhlIHJldHJpZXZhbCBhcmU6CiBgb3JnLWV4cG9ydC0tZ2V0 LWdsb2JhbC1vcHRpb25zJywKIGBvcmctZXhwb3J0LS1nZXQtYnVmZmVyLWF0dHJpYnV0ZXMnLAog YG9yZy1leHBvcnQtLXBhcnNlLW9wdGlvbi1rZXl3b3JkJywKIGBvcmctZXhwb3J0LS1nZXQtc3Vi dHJlZS1vcHRpb25zJyBhbmQKIGBvcmctZXhwb3J0LS1nZXQtaW5idWZmZXItb3B0aW9ucycKCkFs c28sIGBvcmctZXhwb3J0LS1pbnN0YWxsLWxldGJpbmQtbWF5YmUnIHRha2VzIGNhcmUgb2YgdGhl IHBhcnQKcmVsYXRpdmUgdG8gIiMrQklORDoiIGtleXdvcmRzLgoKIytiZWdpbl9zcmMgZW1hY3Mt bGlzcAooZGVmdW4gb3JnLWV4cG9ydC1nZXQtZW52aXJvbm1lbnQgKCZvcHRpb25hbCBiYWNrZW5k IHN1YnRyZWVwIGV4dC1wbGlzdCkKICAiQ29sbGVjdCBleHBvcnQgb3B0aW9ucyBmcm9tIHRoZSBj dXJyZW50IGJ1ZmZlci4KCk9wdGlvbmFsIGFyZ3VtZW50IEJBQ0tFTkQgaXMgYSBzeW1ib2wgc3Bl Y2lmeWluZyB3aGljaCBiYWNrLWVuZApzcGVjaWZpYyBvcHRpb25zIHRvIHJlYWQsIGlmIGFueS4K CldoZW4gb3B0aW9uYWwgYXJndW1lbnQgU1VCVFJFRVAgaXMgbm9uLW5pbCwgYXNzdW1lIHRoZSBl eHBvcnQgaXMKZG9uZSBhZ2FpbnN0IHRoZSBjdXJyZW50IHN1Yi10cmVlLgoKVGhpcmQgb3B0aW9u YWwgYXJndW1lbnQgRVhULVBMSVNUIGlzIGEgcHJvcGVydHkgbGlzdCB3aXRoCmV4dGVybmFsIHBh cmFtZXRlcnMgb3ZlcnJpZGluZyBPcmcgZGVmYXVsdCBzZXR0aW5ncywgYnV0IHN0aWxsCmluZmVy aW9yIHRvIGZpbGUtbG9jYWwgc2V0dGluZ3MuIikKCihkZWZ1biBvcmctZXhwb3J0LS1wYXJzZS1v cHRpb24ta2V5d29yZCAob3B0aW9ucyAmb3B0aW9uYWwgYmFja2VuZCkKICAiUGFyc2UgYW4gT1BU SU9OUyBsaW5lIGFuZCByZXR1cm4gdmFsdWVzIGFzIGEgcGxpc3QuCk9wdGlvbmFsIGFyZ3VtZW50 IEJBQ0tFTkQgaXMgYSBzeW1ib2wgc3BlY2lmeWluZyB3aGljaCBiYWNrLWVuZApzcGVjaWZpYyBp dGVtcyB0byByZWFkLCBpZiBhbnkuIikKCihkZWZ1biBvcmctZXhwb3J0LS1nZXQtc3VidHJlZS1v cHRpb25zICgmb3B0aW9uYWwgYmFja2VuZCkKICAiR2V0IGV4cG9ydCBvcHRpb25zIGluIHN1YnRy ZWUgYXQgcG9pbnQuCk9wdGlvbmFsIGFyZ3VtZW50IEJBQ0tFTkQgaXMgYSBzeW1ib2wgc3BlY2lm eWluZyBiYWNrLWVuZCB1c2VkCmZvciBleHBvcnQuICBSZXR1cm4gb3B0aW9ucyBhcyBhIHBsaXN0 LiIKICA7OyBGb3IgZWFjaCBidWZmZXIga2V5d29yZCwgY3JlYXRlIGEgaGVhZGxpbmUgcHJvcGVy dHkgc2V0dGluZyB0aGUKICA7OyBzYW1lIHByb3BlcnR5IGluIGNvbW11bmljYXRpb24gY2hhbm5l bC4gVGhlIG5hbWUgZm9yIHRoZSBwcm9wZXJ0eQogIDs7IGlzIHRoZSBrZXl3b3JkIHdpdGggIkVY UE9SVF8iKQoKKGRlZnVuIG9yZy1leHBvcnQtLWdldC1pbmJ1ZmZlci1vcHRpb25zICgmb3B0aW9u YWwgYmFja2VuZCkKICAiUmV0dXJuIGN1cnJlbnQgYnVmZmVyIGV4cG9ydCBvcHRpb25zLCBhcyBh IHBsaXN0LgoKT3B0aW9uYWwgYXJndW1lbnQgQkFDS0VORCwgd2hlbiBub24tbmlsLCBpcyBhIHN5 bWJvbCBzcGVjaWZ5aW5nCndoaWNoIGJhY2stZW5kIHNwZWNpZmljIG9wdGlvbnMgc2hvdWxkIGFs c28gYmUgcmVhZCBpbiB0aGUKcHJvY2Vzcy4KCkFzc3VtZSBidWZmZXIgaXMgaW4gT3JnIG1vZGUu ICBOYXJyb3dpbmcsIGlmIGFueSwgaXMgaWdub3JlZC4iKQoKKGRlZnVuIG9yZy1leHBvcnQtLWdl dC1idWZmZXItYXR0cmlidXRlcyAoKQogICJSZXR1cm4gcHJvcGVydGllcyByZWxhdGVkIHRvIGJ1 ZmZlciBhdHRyaWJ1dGVzLCBhcyBhIHBsaXN0LiIpCgooZGVmdmFyIG9yZy1leHBvcnQtLWRlZmF1 bHQtdGl0bGUgbmlsKQk7IER5bmFtaWNhbGx5IHNjb3BlZC4KKGRlZnVuIG9yZy1leHBvcnQtc3Rv cmUtZGVmYXVsdC10aXRsZSAoKQogICJSZXR1cm4gZGVmYXVsdCB0aXRsZSBmb3IgY3VycmVudCBk b2N1bWVudCwgYXMgYSBzdHJpbmcuClRpdGxlIGlzIGV4dHJhY3RlZCBmcm9tIGFzc29jaWF0ZWQg ZmlsZSBuYW1lLCBpZiBhbnksIG9yIGJ1ZmZlcidzCm5hbWUuIikKCihkZWZ1biBvcmctZXhwb3J0 LS1nZXQtZ2xvYmFsLW9wdGlvbnMgKCZvcHRpb25hbCBiYWNrZW5kKQogICJSZXR1cm4gZ2xvYmFs IGV4cG9ydCBvcHRpb25zIGFzIGEgcGxpc3QuCk9wdGlvbmFsIGFyZ3VtZW50IEJBQ0tFTkQsIGlm IG5vbi1uaWwsIGlzIGEgc3ltYm9sIHNwZWNpZnlpbmcKd2hpY2ggYmFjay1lbmQgc3BlY2lmaWMg ZXhwb3J0IG9wdGlvbnMgc2hvdWxkIGFsc28gYmUgcmVhZCBpbiB0aGUKcHJvY2Vzcy4iKQoKKGRl ZnVuIG9yZy1leHBvcnQtLWxpc3QtYm91bmQtdmFyaWFibGVzICgpCiAgIlJldHVybiB2YXJpYWJs ZXMgYm91bmQgZnJvbSBCSU5EIGtleXdvcmRzIGluIGN1cnJlbnQgYnVmZmVyLgpBbHNvIGxvb2sg Zm9yIEJJTkQga2V5d29yZHMgaW4gc2V0dXAgZmlsZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzCmFu IGFsaXN0IHdoZXJlIGFzc29jaWF0aW9ucyBhcmUgKFZBUklBQkxFLU5BTUUgVkFMVUUpLiIpCgoj K2VuZF9zcmMKCioqIFRyZWUgUHJvcGVydGllcwoKVHJlZSBwcm9wZXJ0aWVzIGFyZSBpbmZvcm1h dGlvbiBleHRyYWN0ZWQgZnJvbSBwYXJzZSB0cmVlLiAgVGhleQphcmUgaW5pdGlhbGl6ZWQgYXQg dGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhbnNjb2RpbmcgcHJvY2VzcyBieQpgb3JnLWV4cG9ydC1j b2xsZWN0LXRyZWUtcHJvcGVydGllcycuCgpEZWRpY2F0ZWQgZnVuY3Rpb25zIGZvY3VzIG9uIGNv bXB1dGluZyB0aGUgdmFsdWUgb2Ygc3BlY2lmaWMgdHJlZQpwcm9wZXJ0aWVzIGR1cmluZyBpbml0 aWFsaXphdGlvbi4gIFRodXMsCmBvcmctZXhwb3J0LS1wb3B1bGF0ZS1pZ25vcmUtbGlzdCcgbGlz dHMgZWxlbWVudHMgYW5kIG9iamVjdHMgdGhhdApzaG91bGQgYmUgc2tpcHBlZCBkdXJpbmcgZXhw b3J0LCBgb3JnLWV4cG9ydC0tZ2V0LW1pbi1sZXZlbCcgZ2V0cwp0aGUgbWluaW1hbCBleHBvcnRh YmxlIGxldmVsLCB1c2VkIGFzIGEgYmFzaXMgdG8gY29tcHV0ZSByZWxhdGl2ZQpsZXZlbCBmb3Ig aGVhZGxpbmVzLiAgRXZlbnR1YWxseQpgb3JnLWV4cG9ydC0tY29sbGVjdC1oZWFkbGluZS1udW1i ZXJpbmcnIGJ1aWxkcyBhbiBhbGlzdCBiZXR3ZWVuCmhlYWRsaW5lcyBhbmQgdGhlaXIgbnVtYmVy aW5nLgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAooZGVmdW4gb3JnLWV4cG9ydC1jb2xsZWN0LXRy ZWUtcHJvcGVydGllcyAoZGF0YSBpbmZvKQogICJFeHRyYWN0IHRyZWUgcHJvcGVydGllcyBmcm9t IHBhcnNlIHRyZWUuCgpEQVRBIGlzIHRoZSBwYXJzZSB0cmVlIGZyb20gd2hpY2ggaW5mb3JtYXRp b24gaXMgcmV0cmlldmVkLiAgSU5GTwppcyBhIGxpc3QgaG9sZGluZyBleHBvcnQgb3B0aW9ucy4K CkZvbGxvd2luZyB0cmVlIHByb3BlcnRpZXMgYXJlIHNldCBvciB1cGRhdGVkOgoKYDpleHBvcnRl ZC1kYXRhJyBIYXNoIHRhYmxlIHVzZWQgdG8gbWVtb2l6ZSByZXN1bHRzIGZyb20KICAgICAgICAg ICAgICAgICBgb3JnLWV4cG9ydC1kYXRhJy4KCmA6Zm9vdG5vdGUtZGVmaW5pdGlvbi1hbGlzdCcg TGlzdCBvZiBmb290bm90ZXMgZGVmaW5pdGlvbnMgaW4KICAgICAgICAgICAgICAgICAgIG9yaWdp bmFsIGJ1ZmZlciBhbmQgY3VycmVudCBwYXJzZSB0cmVlLgoKYDpoZWFkbGluZS1vZmZzZXQnIE9m ZnNldCBiZXR3ZWVuIHRydWUgbGV2ZWwgb2YgaGVhZGxpbmVzIGFuZAoJCSAgIGxvY2FsIGxldmVs LiAgQW4gb2Zmc2V0IG9mIC0xIG1lYW5zIGEgaGVhZGxpbmUKCQkgICBvZiBsZXZlbCAyIHNob3Vs ZCBiZSBjb25zaWRlcmVkIGFzIGEgbGV2ZWwKCQkgICAxIGhlYWRsaW5lIGluIHRoZSBjb250ZXh0 LgoKYDpoZWFkbGluZS1udW1iZXJpbmcnIEFsaXN0IG9mIGFsbCBoZWFkbGluZXMgYXMga2V5IGFu IHRoZQoJCSAgICAgIGFzc29jaWF0ZWQgbnVtYmVyaW5nIGFzIHZhbHVlLgoKYDppZ25vcmUtbGlz dCcgICAgIExpc3Qgb2YgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgaWdub3JlZCBkdXJpbmcKICAg ICAgICAgICAgICAgICAgIGV4cG9ydC4KClJldHVybiB1cGRhdGVkIHBsaXN0LiIpCgooZGVmdW4g b3JnLWV4cG9ydC0tZ2V0LW1pbi1sZXZlbCAoZGF0YSBvcHRpb25zKQogICJSZXR1cm4gbWluaW11 bSBleHBvcnRhYmxlIGhlYWRsaW5lJ3MgbGV2ZWwgaW4gREFUQS4KREFUQSBpcyBwYXJzZWQgdHJl ZSBhcyByZXR1cm5lZCBieSBgb3JnLWVsZW1lbnQtcGFyc2UtYnVmZmVyJy4KT1BUSU9OUyBpcyBh IHBsaXN0IGhvbGRpbmcgZXhwb3J0IG9wdGlvbnMuIikKCihkZWZ1biBvcmctZXhwb3J0LS1jb2xs ZWN0LWhlYWRsaW5lLW51bWJlcmluZyAoZGF0YSBvcHRpb25zKQogICJSZXR1cm4gbnVtYmVyaW5n IG9mIGFsbCBleHBvcnRhYmxlIGhlYWRsaW5lcyBpbiBhIHBhcnNlIHRyZWUuCgpEQVRBIGlzIHRo ZSBwYXJzZSB0cmVlLiAgT1BUSU9OUyBpcyB0aGUgcGxpc3QgaG9sZGluZyBleHBvcnQKb3B0aW9u cy4KClJldHVybiBhbiBhbGlzdCB3aG9zZSBrZXkgaXMgYSBoZWFkbGluZSBhbmQgdmFsdWUgaXMg aXRzCmFzc29jaWF0ZWQgbnVtYmVyaW5nIFwoaW4gdGhlIHNoYXBlIG9mIGEgbGlzdCBvZiBudW1i ZXJzXCkgb3IgbmlsCmZvciBhIGZvb3Rub3RlcyBzZWN0aW9uLiIpCgooZGVmdW4gb3JnLWV4cG9y dC0tcG9wdWxhdGUtaWdub3JlLWxpc3QgKGRhdGEgb3B0aW9ucykKICAiUmV0dXJuIGxpc3Qgb2Yg ZWxlbWVudHMgYW5kIG9iamVjdHMgdG8gaWdub3JlIGR1cmluZyBleHBvcnQuCkRBVEEgaXMgdGhl IHBhcnNlIHRyZWUgdG8gdHJhdmVyc2UuICBPUFRJT05TIGlzIHRoZSBwbGlzdCBob2xkaW5nCmV4 cG9ydCBvcHRpb25zLiIpCgooZGVmdW4gb3JnLWV4cG9ydC0tc2VsZWN0ZWQtdHJlZXMgKGRhdGEg aW5mbykKICAiUmV0dXJuIGxpc3Qgb2YgaGVhZGxpbmVzIGFuZCBpbmxpbmV0YXNrcyB3aXRoIGEg c2VsZWN0IHRhZyBpbiB0aGVpciB0cmVlLgpEQVRBIGlzIHBhcnNlZCBkYXRhIGFzIHJldHVybmVk IGJ5IGBvcmctZWxlbWVudC1wYXJzZS1idWZmZXInLgpJTkZPIGlzIGEgcGxpc3QgaG9sZGluZyBl eHBvcnQgb3B0aW9ucy4iKQoKKGRlZnVuIG9yZy1leHBvcnQtLXNraXAtcCAoYmxvYiBvcHRpb25z IHNlbGVjdGVkKQogICJOb24tbmlsIHdoZW4gZWxlbWVudCBvciBvYmplY3QgQkxPQiBzaG91bGQg YmUgc2tpcHBlZCBkdXJpbmcgZXhwb3J0LgpPUFRJT05TIGlzIHRoZSBwbGlzdCBob2xkaW5nIGV4 cG9ydCBvcHRpb25zLiAgU0VMRUNURUQsIHdoZW4Kbm9uLW5pbCwgaXMgYSBsaXN0IG9mIGhlYWRs aW5lcyBvciBpbmxpbmV0YXNrcyBiZWxvbmdpbmcgdG8KYSB0cmVlIHdpdGggYSBzZWxlY3QgdGFn LiIpCgojK2VuZF9zcmMKCiogVGhlIFRyYW5zY29kZXIKCmBvcmctZXhwb3J0LWRhdGEnIHJlYWRz IGEgcGFyc2UgdHJlZSAob2J0YWluZWQgd2l0aCwgaS5lLgpgb3JnLWVsZW1lbnQtcGFyc2UtYnVm ZmVyJykgYW5kIHRyYW5zY29kZXMgaXQgaW50byBhIHNwZWNpZmllZApiYWNrLWVuZCBvdXRwdXQu ICBJdCB0YWtlcyBjYXJlIG9mIGZpbHRlcmluZyBvdXQgZWxlbWVudHMgb3IKb2JqZWN0cyBhY2Nv cmRpbmcgdG8gZXhwb3J0IG9wdGlvbnMgYW5kIG9yZ2FuaXppbmcgdGhlIG91dHB1dCBibGFuawps aW5lcyBhbmQgd2hpdGUgc3BhY2UgYXJlIHByZXNlcnZlZC4gIFRoZSBmdW5jdGlvbiBtZW1vaXpl cyBpdHMKcmVzdWx0cywgc28gaXQgaXMgY2hlYXAgdG8gY2FsbCBpdCB3aXRoaW4gdHJhbnNsYXRv cnMuCgpJdCBpcyBwb3NzaWJsZSB0byBtb2RpZnkgbG9jYWxseSB0aGUgYmFjay1lbmQgdXNlZCBi eQpgb3JnLWV4cG9ydC1kYXRhJyBvciBldmVuIHVzZSBhIHRlbXBvcmFyeSBiYWNrLWVuZCBieSB1 c2luZwpgb3JnLWV4cG9ydC1kYXRhLXdpdGgtdHJhbnNsYXRpb25zJyBhbmQKYG9yZy1leHBvcnQt ZGF0YS13aXRoLWJhY2tlbmQnLgoKSW50ZXJuYWxseSwgdGhyZWUgZnVuY3Rpb25zIGhhbmRsZSB0 aGUgZmlsdGVyaW5nIG9mIG9iamVjdHMgYW5kCmVsZW1lbnRzIGR1cmluZyB0aGUgZXhwb3J0LiAg SW4gcGFydGljdWxhciwKYG9yZy1leHBvcnQtaWdub3JlLWVsZW1lbnQnIG1hcmtzIGFuIGVsZW1l bnQgb3Igb2JqZWN0IHNvIGZ1dHVyZQpwYXJzZSB0cmVlIHRyYXZlcnNhbHMgc2tpcCBpdCwgYG9y Zy1leHBvcnQtLWludGVycHJldC1wJyB0ZWxscyB3aGljaAplbGVtZW50cyBvciBvYmplY3RzIHNo b3VsZCBiZSBzZWVuIGFzIHJlYWwgT3JnIHN5bnRheCBhbmQKYG9yZy1leHBvcnQtZXhwYW5kJyB0 cmFuc2Zvcm1zIHRoZSBvdGhlcnMgYmFjayBpbnRvIHRoZWlyIG9yaWdpbmFsCnNoYXBlCgpgb3Jn LWV4cG9ydC10cmFuc2NvZGVyJyBpcyBhbiBhY2Nlc3NvciByZXR1cm5pbmcgYXBwcm9wcmlhdGUK dHJhbnNsYXRvciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBlbGVtZW50IG9yIG9iamVjdC4KCiMrYmVn aW5fc3JjIGVtYWNzLWxpc3AKKGRlZnVuIG9yZy1leHBvcnQtdHJhbnNjb2RlciAoYmxvYiBpbmZv KQogICJSZXR1cm4gYXBwcm9wcmlhdGUgdHJhbnNjb2RlciBmb3IgQkxPQi4KSU5GTyBpcyBhIHBs aXN0IGNvbnRhaW5pbmcgZXhwb3J0IGRpcmVjdGl2ZXMuIikKCihkZWZ1biBvcmctZXhwb3J0LWRh dGEgKGRhdGEgaW5mbykKICAiQ29udmVydCBEQVRBIGludG8gY3VycmVudCBiYWNrLWVuZCBmb3Jt YXQuCgpEQVRBIGlzIGEgcGFyc2UgdHJlZSwgYW4gZWxlbWVudCBvciBhbiBvYmplY3Qgb3IgYSBz ZWNvbmRhcnkKc3RyaW5nLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcgZXhwb3J0IG9wdGlvbnMu CgpSZXR1cm4gdHJhbnNjb2RlZCBzdHJpbmcuIikKCihkZWZ1biBvcmctZXhwb3J0LWRhdGEtd2l0 aC10cmFuc2xhdGlvbnMgKGRhdGEgdHJhbnNsYXRpb25zIGluZm8pCiAgIkNvbnZlcnQgREFUQSBp bnRvIGFub3RoZXIgZm9ybWF0IHVzaW5nIGEgZ2l2ZW4gdHJhbnNsYXRpb24gdGFibGUuCkRBVEEg aXMgYW4gZWxlbWVudCwgYW4gb2JqZWN0LCBhIHNlY29uZGFyeSBzdHJpbmcgb3IgYSBzdHJpbmcu ClRSQU5TTEFUSU9OUyBpcyBhbiBhbGlzdCBiZXR3ZWVuIGVsZW1lbnQgb3Igb2JqZWN0IHR5cGVz IGFuZAphIGZ1bmN0aW9ucyBoYW5kbGluZyB0aGVtLiAgU2VlIGBvcmctZXhwb3J0LWRlZmluZS1i YWNrZW5kJyBmb3IKbW9yZSBpbmZvcm1hdGlvbi4gIElORk8gaXMgYSBwbGlzdCB1c2VkIGFzIGEg Y29tbXVuaWNhdGlvbgpjaGFubmVsLiIpCgooZGVmdW4gb3JnLWV4cG9ydC1kYXRhLXdpdGgtYmFj a2VuZCAoZGF0YSBiYWNrZW5kIGluZm8pCiAgIkNvbnZlcnQgREFUQSBpbnRvIEJBQ0tFTkQgZm9y bWF0LgoKREFUQSBpcyBhbiBlbGVtZW50LCBhbiBvYmplY3QsIGEgc2Vjb25kYXJ5IHN0cmluZyBv ciBhIHN0cmluZy4KQkFDS0VORCBpcyBhIHN5bWJvbC4gIElORk8gaXMgYSBwbGlzdCB1c2VkIGFz IGEgY29tbXVuaWNhdGlvbgpjaGFubmVsLgoKVW5saWtlIHRvIGBvcmctZXhwb3J0LXdpdGgtYmFj a2VuZCcsIHRoaXMgZnVuY3Rpb24gd2lsbApyZWN1cnNpdmVseSBjb252ZXJ0IERBVEEgdXNpbmcg QkFDS0VORCB0cmFuc2xhdGlvbiB0YWJsZS4iKQoKKGRlZnVuIG9yZy1leHBvcnQtLWludGVycHJl dC1wIChibG9iIGluZm8pCiAgIk5vbi1uaWwgaWYgZWxlbWVudCBvciBvYmplY3QgQkxPQiBzaG91 bGQgYmUgaW50ZXJwcmV0ZWQgZHVyaW5nIGV4cG9ydC4KSWYgbmlsLCBCTE9CIHdpbGwgYXBwZWFy IGFzIHJhdyBPcmcgc3ludGF4LiAgQ2hlY2sgaXMgZG9uZQphY2NvcmRpbmcgdG8gZXhwb3J0IG9w dGlvbnMgSU5GTywgc3RvcmVkIGFzIGEgcGxpc3QuIikKCihkZWZ1biBvcmctZXhwb3J0LWV4cGFu ZCAoYmxvYiBjb250ZW50cyAmb3B0aW9uYWwgd2l0aC1hZmZpbGlhdGVkKQogICJFeHBhbmQgYSBw YXJzZWQgZWxlbWVudCBvciBvYmplY3QgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLgoKQkxPQiBpcyBl aXRoZXIgYW4gZWxlbWVudCBvciBhbiBvYmplY3QuICBDT05URU5UUyBpcyBpdHMKY29udGVudHMs IGFzIGEgc3RyaW5nIG9yIG5pbC4KCldoZW4gb3B0aW9uYWwgYXJndW1lbnQgV0lUSC1BRkZJTElB VEVEIGlzIG5vbi1uaWwsIGFkZCBhZmZpbGlhdGVkCmtleXdvcmRzIGJlZm9yZSBvdXRwdXQuIikK CihkZWZ1biBvcmctZXhwb3J0LWlnbm9yZS1lbGVtZW50IChlbGVtZW50IGluZm8pCiAgIkFkZCBF TEVNRU5UIHRvIGA6aWdub3JlLWxpc3QnIGluIElORk8uCgpBbnkgZWxlbWVudCBpbiBgOmlnbm9y ZS1saXN0JyB3aWxsIGJlIHNraXBwZWQgd2hlbiB1c2luZwpgb3JnLWVsZW1lbnQtbWFwJy4gIElO Rk8gaXMgbW9kaWZpZWQgYnkgc2lkZSBlZmZlY3RzLiIpCgoKIytlbmRfc3JjCgoqIFRoZSBGaWx0 ZXIgU3lzdGVtCgpGaWx0ZXJzIGFsbG93IGVuZC11c2VycyB0byB0d2VhayBlYXNpbHkgdGhlIHRy YW5zY29kZWQgb3V0cHV0LgpUaGV5IGFyZSB0aGUgZnVuY3Rpb25hbCBjb3VudGVycGFydCBvZiBo b29rcywgYXMgZXZlcnkgZmlsdGVyIGluCmEgc2V0IGlzIGFwcGxpZWQgdG8gdGhlIHJldHVybiB2 YWx1ZSBvZiB0aGUgcHJldmlvdXMgb25lLgoKRXZlcnkgc2V0IGlzIGJhY2stZW5kIGFnbm9zdGlj LiAgQWx0aG91Z2gsIGEgZmlsdGVyIGlzIGFsd2F5cwpjYWxsZWQsIGluIGFkZGl0aW9uIHRvIHRo ZSBzdHJpbmcgaXQgYXBwbGllcyB0bywgd2l0aCB0aGUgYmFjay1lbmQKdXNlZCBhcyBhcmd1bWVu dCwgc28gaXQncyBlYXN5IGZvciB0aGUgZW5kLXVzZXIgdG8gYWRkIGJhY2stZW5kCnNwZWNpZmlj IGZpbHRlcnMgaW4gdGhlIHNldC4gIFRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwsIGFzCmEgcGxp c3QsIGlzIHJlcXVpcmVkIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4KCkZyb20gdGhlIGRldmVsb3Bl ciBzaWRlLCBmaWx0ZXJzIHNldHMgY2FuIGJlIGluc3RhbGxlZCBpbiB0aGUKcHJvY2VzcyB3aXRo IHRoZSBoZWxwIG9mIGBvcmctZXhwb3J0LWRlZmluZS1iYWNrZW5kJywgd2hpY2gKaW50ZXJuYWxs eSBzdG9yZXMgZmlsdGVycyBhcyBhbiBhbGlzdC4gIEVhY2ggYXNzb2NpYXRpb24gaGFzIGEga2V5 CmFtb25nIHRoZSBmb2xsb3dpbmcgc3ltYm9scyBhbmQgYSBmdW5jdGlvbiBvciBhIGxpc3Qgb2Yg ZnVuY3Rpb25zCmFzIHZhbHVlLgoKLSBgOmZpbHRlci1vcHRpb25zJyBhcHBsaWVzIHRvIHRoZSBw cm9wZXJ0eSBsaXN0IGNvbnRhaW5pbmcgZXhwb3J0CiAgb3B0aW9ucy4gIFVubGlrZSB0byBvdGhl ciBmaWx0ZXJzLCBmdW5jdGlvbnMgaW4gdGhpcyBsaXN0IGFjY2VwdAogIHR3byBhcmd1bWVudHMg aW5zdGVhZCBvZiB0aHJlZTogdGhlIHByb3BlcnR5IGxpc3QgY29udGFpbmluZwogIGV4cG9ydCBv cHRpb25zIGFuZCB0aGUgYmFjay1lbmQuICBVc2VycyBjYW4gc2V0IGl0cyB2YWx1ZSB0aHJvdWdo CiAgYG9yZy1leHBvcnQtZmlsdGVyLW9wdGlvbnMtZnVuY3Rpb25zJyB2YXJpYWJsZS4KCi0gYDpm aWx0ZXItcGFyc2UtdHJlZScgYXBwbGllcyBkaXJlY3RseSB0byB0aGUgY29tcGxldGUgcGFyc2Vk CiAgdHJlZS4gIFVzZXJzIGNhbiBzZXQgaXQgdGhyb3VnaAogIGBvcmctZXhwb3J0LWZpbHRlci1w YXJzZS10cmVlLWZ1bmN0aW9ucycgdmFyaWFibGUuCgotIGA6ZmlsdGVyLWZpbmFsLW91dHB1dCcg YXBwbGllcyB0byB0aGUgZmluYWwgdHJhbnNjb2RlZCBzdHJpbmcuCiAgVXNlcnMgY2FuIHNldCBp dCB3aXRoIGBvcmctZXhwb3J0LWZpbHRlci1maW5hbC1vdXRwdXQtZnVuY3Rpb25zJwogIHZhcmlh YmxlCgotIGA6ZmlsdGVyLXBsYWluLXRleHQnIGFwcGxpZXMgdG8gYW55IHN0cmluZyBub3QgcmVj b2duaXplZCBhcyBPcmcKICBzeW50YXguICBgb3JnLWV4cG9ydC1maWx0ZXItcGxhaW4tdGV4dC1m dW5jdGlvbnMnIGFsbG93cyB1c2VycyB0bwogIGNvbmZpZ3VyZSBpdC4KCi0gYDpmaWx0ZXItVFlQ RScgYXBwbGllcyBvbiB0aGUgc3RyaW5nIHJldHVybmVkIGFmdGVyIGFuIGVsZW1lbnQgb3IKICBv YmplY3Qgb2YgdHlwZSBUWVBFIGhhcyBiZWVuIHRyYW5zY29kZWQuICBBIHVzZXIgY2FuIG1vZGlm eQogIGBvcmctZXhwb3J0LWZpbHRlci1UWVBFLWZ1bmN0aW9ucycKCkFsbCBmaWx0ZXJzIHNldHMg YXJlIGFwcGxpZWQgd2l0aApgb3JnLWV4cG9ydC1maWx0ZXItYXBwbHktZnVuY3Rpb25zJyBmdW5j dGlvbi4gIEZpbHRlcnMgaW4gYSBzZXQgYXJlCmFwcGxpZWQgaW4gYSBMSUZPIGZhc2hpb24uICBJ dCBhbGxvd3MgZGV2ZWxvcGVycyB0byBiZSBzdXJlIHRoYXQKdGhlaXIgZmlsdGVycyB3aWxsIGJl IGFwcGxpZWQgZmlyc3QuCgpGaWx0ZXJzIHByb3BlcnRpZXMgYXJlIGluc3RhbGxlZCBpbiBjb21t dW5pY2F0aW9uIGNoYW5uZWwgd2l0aApgb3JnLWV4cG9ydC1pbnN0YWxsLWZpbHRlcnMnIGZ1bmN0 aW9uLgoKRXZlbnR1YWxseSwgdHdvIGhvb2tzIChgb3JnLWV4cG9ydC1iZWZvcmUtcHJvY2Vzc2lu Zy1ob29rJyBhbmQKYG9yZy1leHBvcnQtYmVmb3JlLXBhcnNpbmctaG9vaycpIGFyZSBydW4gYXQg dGhlIGJlZ2lubmluZyBvZiB0aGUKZXhwb3J0IHByb2Nlc3MgYW5kIGp1c3QgYmVmb3JlIHBhcnNp bmcgdG8gYWxsb3cgZm9yIGhlYXZ5IHN0cnVjdHVyZQptb2RpZmljYXRpb25zLgoKCioqIEhvb2tz CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCihkZWZ2YXIgb3JnLWV4cG9ydC1iZWZvcmUtcHJvY2Vz c2luZy1ob29rIG5pbAogICJIb29rIHJ1biBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBleHBvcnQg cHJvY2Vzcy4KClRoaXMgaXMgcnVuIGJlZm9yZSBpbmNsdWRlIGtleXdvcmRzIGFuZCBtYWNyb3Mg YXJlIGV4cGFuZGVkIGFuZApCYWJlbCBjb2RlIGJsb2NrcyBleGVjdXRlZCwgb24gYSBjb3B5IG9m IHRoZSBvcmlnaW5hbCBidWZmZXIKYmVpbmcgZXhwb3J0ZWQuICBWaXNpYmlsaXR5IGFuZCBuYXJy b3dpbmcgYXJlIHByZXNlcnZlZC4gIFBvaW50CmlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1 ZmZlci4KCkV2ZXJ5IGZ1bmN0aW9uIGluIHRoaXMgaG9vayB3aWxsIGJlIGNhbGxlZCB3aXRoIG9u ZSBhcmd1bWVudDogdGhlCmJhY2stZW5kIGN1cnJlbnRseSB1c2VkLCBhcyBhIHN5bWJvbC4iKQoK KGRlZnZhciBvcmctZXhwb3J0LWJlZm9yZS1wYXJzaW5nLWhvb2sgbmlsCiAgIkhvb2sgcnVuIGJl Zm9yZSBwYXJzaW5nIGFuIGV4cG9ydCBidWZmZXIuCgpUaGlzIGlzIHJ1biBhZnRlciBpbmNsdWRl IGtleXdvcmRzIGFuZCBtYWNyb3MgaGF2ZSBiZWVuIGV4cGFuZGVkCmFuZCBCYWJlbCBjb2RlIGJs b2NrcyBleGVjdXRlZCwgb24gYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBidWZmZXIKYmVpbmcgZXhw b3J0ZWQuICBWaXNpYmlsaXR5IGFuZCBuYXJyb3dpbmcgYXJlIHByZXNlcnZlZC4gIFBvaW50Cmlz IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4KCkV2ZXJ5IGZ1bmN0aW9uIGluIHRoaXMg aG9vayB3aWxsIGJlIGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudDogdGhlCmJhY2stZW5kIGN1cnJl bnRseSB1c2VkLCBhcyBhIHN5bWJvbC4iKQoKIytlbmRfc3JjCgoqKiBTcGVjaWFsIEZpbHRlcnMK CiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1vcHRpb25z LWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byB0aGUgZXhwb3J0 IG9wdGlvbnMuCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRoIHR3byBhcmd1bWVudHM6IHRoZSBl eHBvcnQgb3B0aW9ucywgYXMKYSBwbGlzdCwgYW5kIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wu ICBJdCBtdXN0IHJldHVybgphIHByb3BlcnR5IGxpc3QgY29udGFpbmluZyBleHBvcnQgb3B0aW9u cy4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1wYXJzZS10cmVlLWZ1bmN0aW9ucyBuaWwK ICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byB0aGUgcGFyc2VkIHRyZWUuCkVhY2ggZmls dGVyIGlzIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogdGhlIHBhcnNlIHRyZWUsIGFzCnJl dHVybmVkIGJ5IGBvcmctZWxlbWVudC1wYXJzZS1idWZmZXInLCB0aGUgYmFjay1lbmQsIGFzCmEg c3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24gY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11 c3QKcmV0dXJuIHRoZSBtb2RpZmllZCBwYXJzZSB0cmVlIHRvIHRyYW5zY29kZS4iKQoKKGRlZnZh ciBvcmctZXhwb3J0LWZpbHRlci1wbGFpbi10ZXh0LWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBm dW5jdGlvbnMgYXBwbGllZCB0byBwbGFpbiB0ZXh0LgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0 aCB0aHJlZSBhcmd1bWVudHM6IGEgc3RyaW5nIHdoaWNoCmNvbnRhaW5zIG5vIE9yZyBzeW50YXgs IHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUKY29tbXVuaWNhdGlvbiBjaGFubmVs LCBhcyBhIHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IKbmlsLiIpCgooZGVmdmFy IG9yZy1leHBvcnQtZmlsdGVyLWZpbmFsLW91dHB1dC1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qgb2Yg ZnVuY3Rpb25zIGFwcGxpZWQgdG8gdGhlIHRyYW5zY29kZWQgc3RyaW5nLgpFYWNoIGZpbHRlciBp cyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSBmdWxsIHRyYW5zY29kZWQKc3RyaW5n LCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24gY2hhbm5l bCwKYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIHRoYXQgd2lsbCBiZSB1c2Vk IGFzIHRoZQpmaW5hbCBleHBvcnQgb3V0cHV0LiIpCgojK2VuZF9zcmMKCioqIEVsZW1lbnRzIEZp bHRlcnMKCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1i YWJlbC1jYWxsLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byBh IHRyYW5zY29kZWQgYmFiZWwtY2FsbC4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGggdGhyZWUg YXJndW1lbnRzOiB0aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJhY2stZW5k LCBhcyBhIHN5bWJvbCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEgcGxpc3Qu ICBJdCBtdXN0IHJldHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1m aWx0ZXItY2VudGVyLWJsb2NrLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBw bGllZCB0byBhIHRyYW5zY29kZWQgY2VudGVyIGJsb2NrLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQg d2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0 aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwg YXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBv cmctZXhwb3J0LWZpbHRlci1jbG9jay1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qgb2YgZnVuY3Rpb25z IGFwcGxpZWQgdG8gYSB0cmFuc2NvZGVkIGNsb2NrLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0 aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUg YmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMg YSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmct ZXhwb3J0LWZpbHRlci1jb21tZW50LWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMg YXBwbGllZCB0byBhIHRyYW5zY29kZWQgY29tbWVudC4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdp dGggdGhyZWUgYXJndW1lbnRzOiB0aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhl IGJhY2stZW5kLCBhcyBhIHN5bWJvbCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFz IGEgcGxpc3QuICBJdCBtdXN0IHJldHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3Jn LWV4cG9ydC1maWx0ZXItY29tbWVudC1ibG9jay1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qgb2YgZnVu Y3Rpb25zIGFwcGxpZWQgdG8gYSB0cmFuc2NvZGVkIGNvbW1lbnQtYmxvY2suCkVhY2ggZmlsdGVy IGlzIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMg YSBzdHJpbmcsIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlv bgpjaGFubmVsLCBhcyBhIHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIp CgooZGVmdmFyIG9yZy1leHBvcnQtZmlsdGVyLWRpYXJ5LXNleHAtZnVuY3Rpb25zIG5pbAogICJM aXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRvIGEgdHJhbnNjb2RlZCBkaWFyeS1zZXhwLgpFYWNo IGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRh dGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11 bmljYXRpb24KY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9y IG5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1kcmF3ZXItZnVuY3Rpb25zIG5pbAog ICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRvIGEgdHJhbnNjb2RlZCBkcmF3ZXIuCkVhY2gg ZmlsdGVyIGlzIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0 YSwKYXMgYSBzdHJpbmcsIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVu aWNhdGlvbgpjaGFubmVsLCBhcyBhIHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3Ig bmlsLiIpCgooZGVmdmFyIG9yZy1leHBvcnQtZmlsdGVyLWR5bmFtaWMtYmxvY2stZnVuY3Rpb25z IG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRvIGEgdHJhbnNjb2RlZCBkeW5hbWlj LWJsb2NrLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0 cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBh bmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJu IGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1leGFtcGxlLWJs b2NrLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byBhIHRyYW5z Y29kZWQgZXhhbXBsZS1ibG9jay4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGggdGhyZWUgYXJn dW1lbnRzOiB0aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJhY2stZW5kLCBh cyBhIHN5bWJvbCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEgcGxpc3QuICBJ dCBtdXN0IHJldHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1maWx0 ZXItZXhwb3J0LWJsb2NrLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGll ZCB0byBhIHRyYW5zY29kZWQgZXhwb3J0LWJsb2NrLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0 aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUg YmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMg YSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmct ZXhwb3J0LWZpbHRlci1maXhlZC13aWR0aC1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qgb2YgZnVuY3Rp b25zIGFwcGxpZWQgdG8gYSB0cmFuc2NvZGVkIGZpeGVkLXdpZHRoLgpFYWNoIGZpbHRlciBpcyBj YWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3Ry aW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hh bm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRl ZnZhciBvcmctZXhwb3J0LWZpbHRlci1mb290bm90ZS1kZWZpbml0aW9uLWZ1bmN0aW9ucyBuaWwK ICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byBhIHRyYW5zY29kZWQgZm9vdG5vdGUtZGVm aW5pdGlvbi4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGggdGhyZWUgYXJndW1lbnRzOiB0aGUg dHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJhY2stZW5kLCBhcyBhIHN5bWJvbCwg YW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEgcGxpc3QuICBJdCBtdXN0IHJldHVy biBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1maWx0ZXItaGVhZGxpbmUt ZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRvIGEgdHJhbnNjb2Rl ZCBoZWFkbGluZS4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGggdGhyZWUgYXJndW1lbnRzOiB0 aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJhY2stZW5kLCBhcyBhIHN5bWJv bCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEgcGxpc3QuICBJdCBtdXN0IHJl dHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1maWx0ZXItaG9yaXpv bnRhbC1ydWxlLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byBh IHRyYW5zY29kZWQgaG9yaXpvbnRhbC1ydWxlLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0 aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFj ay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMgYSBw bGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmctZXhw b3J0LWZpbHRlci1pbmxpbmV0YXNrLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMg YXBwbGllZCB0byBhIHRyYW5zY29kZWQgaW5saW5ldGFzay4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVk IHdpdGggdGhyZWUgYXJndW1lbnRzOiB0aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywg dGhlIGJhY2stZW5kLCBhcyBhIHN5bWJvbCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWws IGFzIGEgcGxpc3QuICBJdCBtdXN0IHJldHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIg b3JnLWV4cG9ydC1maWx0ZXItaXRlbS1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qgb2YgZnVuY3Rpb25z IGFwcGxpZWQgdG8gYSB0cmFuc2NvZGVkIGl0ZW0uCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRo IHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBzdHJpbmcsIHRoZSBi YWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFubmVsLCBhcyBh IHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgooZGVmdmFyIG9yZy1l eHBvcnQtZmlsdGVyLWtleXdvcmQtZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBh cHBsaWVkIHRvIGEgdHJhbnNjb2RlZCBrZXl3b3JkLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0 aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUg YmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMg YSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmct ZXhwb3J0LWZpbHRlci1sYXRleC1lbnZpcm9ubWVudC1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qgb2Yg ZnVuY3Rpb25zIGFwcGxpZWQgdG8gYSB0cmFuc2NvZGVkIGxhdGV4LWVudmlyb25tZW50LgpFYWNo IGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRh dGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11 bmljYXRpb24KY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9y IG5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1ub2RlLXByb3BlcnR5LWZ1bmN0aW9u cyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byBhIHRyYW5zY29kZWQgbm9kZS1w cm9wZXJ0eS4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGggdGhyZWUgYXJndW1lbnRzOiB0aGUg dHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJhY2stZW5kLCBhcyBhIHN5bWJvbCwg YW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEgcGxpc3QuICBJdCBtdXN0IHJldHVy biBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1maWx0ZXItcGFyYWdyYXBo LWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byBhIHRyYW5zY29k ZWQgcGFyYWdyYXBoLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6 IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3lt Ym9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3Qg cmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1wbGFp bi1saXN0LWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byBhIHRy YW5zY29kZWQgcGxhaW4tbGlzdC4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGggdGhyZWUgYXJn dW1lbnRzOiB0aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJhY2stZW5kLCBh cyBhIHN5bWJvbCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEgcGxpc3QuICBJ dCBtdXN0IHJldHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1maWx0 ZXItcGxhbm5pbmctZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRv IGEgdHJhbnNjb2RlZCBwbGFubmluZy4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGggdGhyZWUg YXJndW1lbnRzOiB0aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJhY2stZW5k LCBhcyBhIHN5bWJvbCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEgcGxpc3Qu ICBJdCBtdXN0IHJldHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1m aWx0ZXItcHJvcGVydHktZHJhd2VyLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMg YXBwbGllZCB0byBhIHRyYW5zY29kZWQgcHJvcGVydHktZHJhd2VyLgpFYWNoIGZpbHRlciBpcyBj YWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3Ry aW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hh bm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRl ZnZhciBvcmctZXhwb3J0LWZpbHRlci1xdW90ZS1ibG9jay1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qg b2YgZnVuY3Rpb25zIGFwcGxpZWQgdG8gYSB0cmFuc2NvZGVkIHF1b3RlIGJsb2NrLgpFYWNoIGZp bHRlciBpcyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIHF1b3Rl CmRhdGEsIGFzIGEgc3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlCmNv bW11bmljYXRpb24gY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5n IG9yCm5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1xdW90ZS1zZWN0aW9uLWZ1bmN0 aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byBhIHRyYW5zY29kZWQgcXVv dGUtc2VjdGlvbi4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGggdGhyZWUgYXJndW1lbnRzOiB0 aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJhY2stZW5kLCBhcyBhIHN5bWJv bCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEgcGxpc3QuICBJdCBtdXN0IHJl dHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1maWx0ZXItc2VjdGlv bi1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qgb2YgZnVuY3Rpb25zIGFwcGxpZWQgdG8gYSB0cmFuc2Nv ZGVkIHNlY3Rpb24uCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czog dGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBzdHJpbmcsIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1i b2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFubmVsLCBhcyBhIHBsaXN0LiAgSXQgbXVzdCBy ZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgooZGVmdmFyIG9yZy1leHBvcnQtZmlsdGVyLXNwZWNp YWwtYmxvY2stZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRvIGEg dHJhbnNjb2RlZCBzcGVjaWFsIGJsb2NrLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0aHJl ZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFjay1l bmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMgYSBwbGlz dC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0 LWZpbHRlci1zcmMtYmxvY2stZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBs aWVkIHRvIGEgdHJhbnNjb2RlZCBzcmMtYmxvY2suCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRo IHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBzdHJpbmcsIHRoZSBi YWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFubmVsLCBhcyBh IHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgooZGVmdmFyIG9yZy1l eHBvcnQtZmlsdGVyLXRhYmxlLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBw bGllZCB0byBhIHRyYW5zY29kZWQgdGFibGUuCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRoIHRo cmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBzdHJpbmcsIHRoZSBiYWNr LWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFubmVsLCBhcyBhIHBs aXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgooZGVmdmFyIG9yZy1leHBv cnQtZmlsdGVyLXRhYmxlLWNlbGwtZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBh cHBsaWVkIHRvIGEgdHJhbnNjb2RlZCB0YWJsZS1jZWxsLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQg d2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0 aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwg YXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBv cmctZXhwb3J0LWZpbHRlci10YWJsZS1yb3ctZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0 aW9ucyBhcHBsaWVkIHRvIGEgdHJhbnNjb2RlZCB0YWJsZS1yb3cuCkVhY2ggZmlsdGVyIGlzIGNh bGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBzdHJp bmcsIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFu bmVsLCBhcyBhIHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgooZGVm dmFyIG9yZy1leHBvcnQtZmlsdGVyLXZlcnNlLWJsb2NrLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBv ZiBmdW5jdGlvbnMgYXBwbGllZCB0byBhIHRyYW5zY29kZWQgdmVyc2UgYmxvY2suCkVhY2ggZmls dGVyIGlzIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwK YXMgYSBzdHJpbmcsIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNh dGlvbgpjaGFubmVsLCBhcyBhIHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3Igbmls LiIpCgojK2VuZF9zcmMKCioqIE9iamVjdHMgRmlsdGVycwoKIytiZWdpbl9zcmMgZW1hY3MtbGlz cAooZGVmdmFyIG9yZy1leHBvcnQtZmlsdGVyLWJvbGQtZnVuY3Rpb25zIG5pbAogICJMaXN0IG9m IGZ1bmN0aW9ucyBhcHBsaWVkIHRvIHRyYW5zY29kZWQgYm9sZCB0ZXh0LgpFYWNoIGZpbHRlciBp cyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEg c3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24K Y2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoK KGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1jb2RlLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBm dW5jdGlvbnMgYXBwbGllZCB0byB0cmFuc2NvZGVkIGNvZGUgdGV4dC4KRWFjaCBmaWx0ZXIgaXMg Y2FsbGVkIHdpdGggdGhyZWUgYXJndW1lbnRzOiB0aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0 cmluZywgdGhlIGJhY2stZW5kLCBhcyBhIHN5bWJvbCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNo YW5uZWwsIGFzIGEgcGxpc3QuICBJdCBtdXN0IHJldHVybiBhIHN0cmluZyBvciBuaWwuIikKCihk ZWZ2YXIgb3JnLWV4cG9ydC1maWx0ZXItZW50aXR5LWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBm dW5jdGlvbnMgYXBwbGllZCB0byBhIHRyYW5zY29kZWQgZW50aXR5LgpFYWNoIGZpbHRlciBpcyBj YWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3Ry aW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hh bm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRl ZnZhciBvcmctZXhwb3J0LWZpbHRlci1leHBvcnQtc25pcHBldC1mdW5jdGlvbnMgbmlsCiAgIkxp c3Qgb2YgZnVuY3Rpb25zIGFwcGxpZWQgdG8gYSB0cmFuc2NvZGVkIGV4cG9ydC1zbmlwcGV0LgpF YWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVk IGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNv bW11bmljYXRpb24KY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5n IG9yIG5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1mb290bm90ZS1yZWZlcmVuY2Ut ZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRvIGEgdHJhbnNjb2Rl ZCBmb290bm90ZS1yZWZlcmVuY2UuCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRoIHRocmVlIGFy Z3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBzdHJpbmcsIHRoZSBiYWNrLWVuZCwg YXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFubmVsLCBhcyBhIHBsaXN0LiAg SXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgooZGVmdmFyIG9yZy1leHBvcnQtZmls dGVyLWlubGluZS1iYWJlbC1jYWxsLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMg YXBwbGllZCB0byBhIHRyYW5zY29kZWQgaW5saW5lLWJhYmVsLWNhbGwuCkVhY2ggZmlsdGVyIGlz IGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBz dHJpbmcsIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpj aGFubmVsLCBhcyBhIHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgoo ZGVmdmFyIG9yZy1leHBvcnQtZmlsdGVyLWlubGluZS1zcmMtYmxvY2stZnVuY3Rpb25zIG5pbAog ICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRvIGEgdHJhbnNjb2RlZCBpbmxpbmUtc3JjLWJs b2NrLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFu c2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQg dGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEg c3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1pdGFsaWMtZnVuY3Rp b25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRvIHRyYW5zY29kZWQgaXRhbGlj IHRleHQuCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogdGhlIHRy YW5zY29kZWQgZGF0YSwKYXMgYSBzdHJpbmcsIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFu ZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFubmVsLCBhcyBhIHBsaXN0LiAgSXQgbXVzdCByZXR1cm4g YSBzdHJpbmcgb3IgbmlsLiIpCgooZGVmdmFyIG9yZy1leHBvcnQtZmlsdGVyLWxhdGV4LWZyYWdt ZW50LWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGllZCB0byBhIHRyYW5z Y29kZWQgbGF0ZXgtZnJhZ21lbnQuCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRoIHRocmVlIGFy Z3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBzdHJpbmcsIHRoZSBiYWNrLWVuZCwg YXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFubmVsLCBhcyBhIHBsaXN0LiAg SXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgooZGVmdmFyIG9yZy1leHBvcnQtZmls dGVyLWxpbmUtYnJlYWstZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVk IHRvIGEgdHJhbnNjb2RlZCBsaW5lLWJyZWFrLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0 aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFj ay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMgYSBw bGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmctZXhw b3J0LWZpbHRlci1saW5rLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGll ZCB0byBhIHRyYW5zY29kZWQgbGluay4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGggdGhyZWUg YXJndW1lbnRzOiB0aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJhY2stZW5k LCBhcyBhIHN5bWJvbCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEgcGxpc3Qu ICBJdCBtdXN0IHJldHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4cG9ydC1m aWx0ZXItcmFkaW8tdGFyZ2V0LWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBw bGllZCB0byBhIHRyYW5zY29kZWQgcmFkaW8tdGFyZ2V0LgpFYWNoIGZpbHRlciBpcyBjYWxsZWQg d2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0 aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwg YXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBv cmctZXhwb3J0LWZpbHRlci1zdGF0aXN0aWNzLWNvb2tpZS1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qg b2YgZnVuY3Rpb25zIGFwcGxpZWQgdG8gYSB0cmFuc2NvZGVkIHN0YXRpc3RpY3MtY29va2llLgpF YWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVk IGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNv bW11bmljYXRpb24KY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5n IG9yIG5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1zdHJpa2UtdGhyb3VnaC1mdW5j dGlvbnMgbmlsCiAgIkxpc3Qgb2YgZnVuY3Rpb25zIGFwcGxpZWQgdG8gdHJhbnNjb2RlZCBzdHJp a2UtdGhyb3VnaCB0ZXh0LgpFYWNoIGZpbHRlciBpcyBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVu dHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0aGUgYmFjay1lbmQsIGFzIGEg c3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwgYXMgYSBwbGlzdC4gIEl0IG11 c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBvcmctZXhwb3J0LWZpbHRlci1z dWJzY3JpcHQtZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0aW9ucyBhcHBsaWVkIHRvIGEg dHJhbnNjb2RlZCBzdWJzY3JpcHQuCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRoIHRocmVlIGFy Z3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBzdHJpbmcsIHRoZSBiYWNrLWVuZCwg YXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFubmVsLCBhcyBhIHBsaXN0LiAg SXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgooZGVmdmFyIG9yZy1leHBvcnQtZmls dGVyLXN1cGVyc2NyaXB0LWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMgYXBwbGll ZCB0byBhIHRyYW5zY29kZWQgc3VwZXJzY3JpcHQuCkVhY2ggZmlsdGVyIGlzIGNhbGxlZCB3aXRo IHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBzdHJpbmcsIHRoZSBi YWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpjaGFubmVsLCBhcyBh IHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgooZGVmdmFyIG9yZy1l eHBvcnQtZmlsdGVyLXRhcmdldC1mdW5jdGlvbnMgbmlsCiAgIkxpc3Qgb2YgZnVuY3Rpb25zIGFw cGxpZWQgdG8gYSB0cmFuc2NvZGVkIHRhcmdldC4KRWFjaCBmaWx0ZXIgaXMgY2FsbGVkIHdpdGgg dGhyZWUgYXJndW1lbnRzOiB0aGUgdHJhbnNjb2RlZCBkYXRhLAphcyBhIHN0cmluZywgdGhlIGJh Y2stZW5kLCBhcyBhIHN5bWJvbCwgYW5kIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwsIGFzIGEg cGxpc3QuICBJdCBtdXN0IHJldHVybiBhIHN0cmluZyBvciBuaWwuIikKCihkZWZ2YXIgb3JnLWV4 cG9ydC1maWx0ZXItdGltZXN0YW1wLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBvZiBmdW5jdGlvbnMg YXBwbGllZCB0byBhIHRyYW5zY29kZWQgdGltZXN0YW1wLgpFYWNoIGZpbHRlciBpcyBjYWxsZWQg d2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSB0cmFuc2NvZGVkIGRhdGEsCmFzIGEgc3RyaW5nLCB0 aGUgYmFjay1lbmQsIGFzIGEgc3ltYm9sLCBhbmQgdGhlIGNvbW11bmljYXRpb24KY2hhbm5lbCwg YXMgYSBwbGlzdC4gIEl0IG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIG5pbC4iKQoKKGRlZnZhciBv cmctZXhwb3J0LWZpbHRlci11bmRlcmxpbmUtZnVuY3Rpb25zIG5pbAogICJMaXN0IG9mIGZ1bmN0 aW9ucyBhcHBsaWVkIHRvIHRyYW5zY29kZWQgdW5kZXJsaW5lIHRleHQuCkVhY2ggZmlsdGVyIGlz IGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwKYXMgYSBz dHJpbmcsIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNhdGlvbgpj aGFubmVsLCBhcyBhIHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgbmlsLiIpCgoo ZGVmdmFyIG9yZy1leHBvcnQtZmlsdGVyLXZlcmJhdGltLWZ1bmN0aW9ucyBuaWwKICAiTGlzdCBv ZiBmdW5jdGlvbnMgYXBwbGllZCB0byB0cmFuc2NvZGVkIHZlcmJhdGltIHRleHQuCkVhY2ggZmls dGVyIGlzIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogdGhlIHRyYW5zY29kZWQgZGF0YSwK YXMgYSBzdHJpbmcsIHRoZSBiYWNrLWVuZCwgYXMgYSBzeW1ib2wsIGFuZCB0aGUgY29tbXVuaWNh dGlvbgpjaGFubmVsLCBhcyBhIHBsaXN0LiAgSXQgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3Igbmls LiIpCgojK2VuZF9zcmMKCioqIEZpbHRlcnMgVG9vbHMKCkludGVybmFsIGZ1bmN0aW9uIGBvcmct ZXhwb3J0LWluc3RhbGwtZmlsdGVycycgaW5zdGFsbHMgZmlsdGVycwpoYXJkLWNvZGVkIGluIGJh Y2stZW5kcyAoZGV2ZWxvcGVyIGZpbHRlcnMpIGFuZCBmaWx0ZXJzIGZyb20gZ2xvYmFsCnZhcmlh YmxlcyAodXNlciBmaWx0ZXJzKSBpbiB0aGUgY29tbXVuaWNhdGlvbiBjaGFubmVsLgoKSW50ZXJu YWwgZnVuY3Rpb24gYG9yZy1leHBvcnQtZmlsdGVyLWFwcGx5LWZ1bmN0aW9ucycgdGFrZXMgY2Fy ZQphYm91dCBhcHBseWluZyBlYWNoIGZpbHRlciBpbiBvcmRlciB0byBhIGdpdmVuIGRhdGEuICBJ dCBpZ25vcmVzCmZpbHRlcnMgcmV0dXJuaW5nIGEgbmlsIHZhbHVlIGJ1dCBzdG9wcyB3aGVuZXZl ciBhIGZpbHRlciByZXR1cm5zCmFuIGVtcHR5IHN0cmluZy4KCiMrYmVnaW5fc3JjIGVtYWNzLWxp c3AKKGRlZnVuIG9yZy1leHBvcnQtZmlsdGVyLWFwcGx5LWZ1bmN0aW9ucyAoZmlsdGVycyB2YWx1 ZSBpbmZvKQogICJDYWxsIGV2ZXJ5IGZ1bmN0aW9uIGluIEZJTFRFUlMuCgpGdW5jdGlvbnMgYXJl IGNhbGxlZCB3aXRoIGFyZ3VtZW50cyBWQUxVRSwgY3VycmVudCBleHBvcnQKYmFjay1lbmQgYW5k IElORk8uICBBIGZ1bmN0aW9uIHJldHVybmluZyBhIG5pbCB2YWx1ZSB3aWxsIGJlCnNraXBwZWQu ICBJZiBpdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcsIHRoZSBwcm9jZXNzIGVuZHMgYW5kClZB TFVFIGlzIGlnbm9yZWQuCgpDYWxsIGlzIGRvbmUgaW4gYSBMSUZPIGZhc2hpb24sIHRvIGJlIHN1 cmUgdGhhdCBkZXZlbG9wZXIKc3BlY2lmaWVkIGZpbHRlcnMsIGlmIGFueSwgYXJlIGNhbGxlZCBm aXJzdC4iKQoKKGRlZnVuIG9yZy1leHBvcnQtaW5zdGFsbC1maWx0ZXJzIChpbmZvKQogICJJbnN0 YWxsIGZpbHRlcnMgcHJvcGVydGllcyBpbiBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCklORk8gaXMg YSBwbGlzdCBjb250YWluaW5nIHRoZSBjdXJyZW50IGNvbW11bmljYXRpb24gY2hhbm5lbC4KUmV0 dXJuIHRoZSB1cGRhdGVkIGNvbW11bmljYXRpb24gY2hhbm5lbC4iKQoKCiMrZW5kX3NyYwoKKiBD b3JlIGZ1bmN0aW9ucwoKVGhpcyBpcyB0aGUgcm9vbSBmb3IgdGhlIG1haW4gZnVuY3Rpb24sIGBv cmctZXhwb3J0LWFzJywgYWxvbmcgd2l0aAppdHMgZGVyaXZhdGl2ZXMsIGBvcmctZXhwb3J0LXRv LWJ1ZmZlcicsIGBvcmctZXhwb3J0LXRvLWZpbGUnIGFuZApgb3JnLWV4cG9ydC1zdHJpbmctYXMn LiAgVGhleSBkaWZmZXIgZWl0aGVyIGJ5IHRoZSB3YXkgdGhleSBvdXRwdXQKdGhlIHJlc3VsdGlu ZyBjb2RlIChmb3IgdGhlIGZpcnN0IHR3bykgb3IgYnkgdGhlIGlucHV0IHR5cGUgKGZvcgp0aGUg bGF0dGVyKS4gIGBvcmctZXhwb3J0LS1jb3B5LXRvLWtpbGwtcmluZy1wJyBkZXRlcm1pbmVzIGlm Cm91dHB1dCBvZiB0aGVzZSBmdW5jdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8ga2lsbCByaW5nLgoK YG9yZy1leHBvcnQtb3V0cHV0LWZpbGUtbmFtZScgaXMgYW4gYXV4aWxpYXJ5IGZ1bmN0aW9uIG1l YW50IHRvIGJlCnVzZWQgd2l0aCBgb3JnLWV4cG9ydC10by1maWxlJy4gIFdpdGggYSBnaXZlbiBl eHRlbnNpb24sIGl0IHRyaWVzCnRvIHByb3ZpZGUgYSBjYW5vbmljYWwgZmlsZSBuYW1lIHRvIHdy aXRlIGV4cG9ydCBvdXRwdXQgdG8uCgpOb3RlIHRoYXQgYG9yZy1leHBvcnQtYXMnIGRvZXNuJ3Qg cmVhbGx5IHBhcnNlIHRoZSBjdXJyZW50IGJ1ZmZlciwKYnV0IGEgY29weSBvZiBpdCAod2l0aCB0 aGUgc2FtZSBidWZmZXItbG9jYWwgdmFyaWFibGVzIGFuZAp2aXNpYmlsaXR5KSwgd2hlcmUgbWFj cm9zIGFuZCBpbmNsdWRlIGtleXdvcmRzIGFyZSBleHBhbmRlZCBhbmQKQmFiZWwgYmxvY2tzIGFy ZSBleGVjdXRlZCwgaWYgYXBwcm9wcmlhdGUuCmBvcmctZXhwb3J0LXdpdGgtYnVmZmVyLWNvcHkn IG1hY3JvIHByZXBhcmVzIHRoYXQgY29weS4KCkZpbGUgaW5jbHVzaW9uIGlzIHRha2VuIGNhcmUg b2YgYnkKYG9yZy1leHBvcnQtZXhwYW5kLWluY2x1ZGUta2V5d29yZCcgYW5kCmBvcmctZXhwb3J0 LS1wcmVwYXJlLWZpbGUtY29udGVudHMnLiAgU3RydWN0dXJlIHdpc2UsIGluY2x1ZGluZwphIHdo b2xlIE9yZyBmaWxlIGluIGEgYnVmZmVyIG9mdGVuIG1ha2VzIGxpdHRsZSBzZW5zZS4gIEZvcgpl eGFtcGxlLCBpZiB0aGUgZmlsZSBjb250YWlucyBhIGhlYWRsaW5lIGFuZCB0aGUgaW5jbHVkZSBr ZXl3b3JkCndhcyB3aXRoaW4gYW4gaXRlbSwgdGhlIGl0ZW0gc2hvdWxkIGNvbnRhaW4gdGhlIGhl YWRsaW5lLiAgVGhhdCdzCndoeSBmaWxlIGluY2x1c2lvbiBzaG91bGQgYmUgZG9uZSBiZWZvcmUg YW55IHN0cnVjdHVyZSBjYW4gYmUKYXNzb2NpYXRlZCB0byB0aGUgZmlsZSwgdGhhdCBpcyBiZWZv cmUgcGFyc2luZy4KCmBvcmctZXhwb3J0LWluc2VydC1kZWZhdWx0LXRlbXBsYXRlJyBpcyBhIGNv bW1hbmQgdG8gaW5zZXJ0CmEgZGVmYXVsdCB0ZW1wbGF0ZSAob3IgYSBiYWNrLWVuZCBzcGVjaWZp YyB0ZW1wbGF0ZSkgYXQgcG9pbnQgb3IgaW4KY3VycmVudCBzdWJ0cmVlLgoKIytiZWdpbl9zcmMg ZW1hY3MtbGlzcAooZGVmdW4gb3JnLWV4cG9ydC1jb3B5LWJ1ZmZlciAoKQogICJSZXR1cm4gYSBj b3B5IG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4KVGhlIGNvcHkgcHJlc2VydmVzIE9yZyBidWZmZXIt bG9jYWwgdmFyaWFibGVzLCB2aXNpYmlsaXR5IGFuZApuYXJyb3dpbmcuIikKCihkZWZtYWNybyBv cmctZXhwb3J0LXdpdGgtYnVmZmVyLWNvcHkgKCZyZXN0IGJvZHkpCiAgIkFwcGx5IEJPRFkgaW4g YSBjb3B5IG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4KVGhlIGNvcHkgcHJlc2VydmVzIGxvY2FsIHZh cmlhYmxlcywgdmlzaWJpbGl0eSBhbmQgY29udGVudHMgb2YKdGhlIG9yaWdpbmFsIGJ1ZmZlci4g IFBvaW50IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgp3aGVuIEJPRFkgaXMgYXBw bGllZC4iKQoKKGRlZnVuIG9yZy1leHBvcnQtLWdlbmVyYXRlLWNvcHktc2NyaXB0IChidWZmZXIp CiAgIkdlbmVyYXRlIGEgZnVuY3Rpb24gZHVwbGljYXRpbmcgQlVGRkVSLgoKVGhlIGNvcHkgd2ls bCBwcmVzZXJ2ZSBsb2NhbCB2YXJpYWJsZXMsIHZpc2liaWxpdHksIGNvbnRlbnRzIGFuZApuYXJy b3dpbmcgb2YgdGhlIG9yaWdpbmFsIGJ1ZmZlci4gIElmIGEgcmVnaW9uIHdhcyBhY3RpdmUgaW4K QlVGRkVSLCBjb250ZW50cyB3aWxsIGJlIG5hcnJvd2VkIHRvIHRoYXQgcmVnaW9uIGluc3RlYWQu CgpUaGUgcmVzdWx0aW5nIGZ1bmN0aW9uIGNhbiBiZSBldmFsZWQgYXQgYSBsYXRlciB0aW1lLCBm cm9tCmFub3RoZXIgYnVmZmVyLCBlZmZlY3RpdmVseSBjbG9uaW5nIHRoZSBvcmlnaW5hbCBidWZm ZXIgdGhlcmUuCgpUaGUgZnVuY3Rpb24gYXNzdW1lcyBCVUZGRVIncyBtYWpvciBtb2RlIGlzIGBv cmctbW9kZScuIikKIytlbmRfc3JjCgojIyNhdXRvbG9hZAojK2JlZ2luX3NyYyBlbWFjcy1saXNw CihkZWZ1biBvcmctZXhwb3J0LWFzCiAgKGJhY2tlbmQgJm9wdGlvbmFsIHN1YnRyZWVwIHZpc2li bGUtb25seSBib2R5LW9ubHkgZXh0LXBsaXN0KQogICJUcmFuc2NvZGUgY3VycmVudCBPcmcgYnVm ZmVyIGludG8gQkFDS0VORCBjb2RlLgoKSWYgbmFycm93aW5nIGlzIGFjdGl2ZSBpbiB0aGUgY3Vy cmVudCBidWZmZXIsIG9ubHkgdHJhbnNjb2RlIGl0cwpuYXJyb3dlZCBwYXJ0LgoKSWYgYSByZWdp b24gaXMgYWN0aXZlLCB0cmFuc2NvZGUgdGhhdCByZWdpb24uCgpXaGVuIG9wdGlvbmFsIGFyZ3Vt ZW50IFNVQlRSRUVQIGlzIG5vbi1uaWwsIHRyYW5zY29kZSB0aGUKc3ViLXRyZWUgYXQgcG9pbnQs IGV4dHJhY3RpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgaGVhZGxpbmUKcHJvcGVydGllcyBmaXJz dC4KCldoZW4gb3B0aW9uYWwgYXJndW1lbnQgVklTSUJMRS1PTkxZIGlzIG5vbi1uaWwsIGRvbid0 IGV4cG9ydApjb250ZW50cyBvZiBoaWRkZW4gZWxlbWVudHMuCgpXaGVuIG9wdGlvbmFsIGFyZ3Vt ZW50IEJPRFktT05MWSBpcyBub24tbmlsLCBvbmx5IHJldHVybiBib2R5CmNvZGUsIHdpdGhvdXQg c3Vycm91bmRpbmcgdGVtcGxhdGUuCgpPcHRpb25hbCBhcmd1bWVudCBFWFQtUExJU1QsIHdoZW4g cHJvdmlkZWQsIGlzIGEgcHJvcGVydHkgbGlzdAp3aXRoIGV4dGVybmFsIHBhcmFtZXRlcnMgb3Zl cnJpZGluZyBPcmcgZGVmYXVsdCBzZXR0aW5ncywgYnV0CnN0aWxsIGluZmVyaW9yIHRvIGZpbGUt bG9jYWwgc2V0dGluZ3MuCgpSZXR1cm4gY29kZSBhcyBhIHN0cmluZy4iKQojK2VuZF9zcmMKCiMj I2F1dG9sb2FkCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGRlZnVuIG9yZy1leHBvcnQtdG8tYnVm ZmVyCiAgKGJhY2tlbmQgYnVmZmVyICZvcHRpb25hbCBzdWJ0cmVlcCB2aXNpYmxlLW9ubHkgYm9k eS1vbmx5IGV4dC1wbGlzdCkKICAiQ2FsbCBgb3JnLWV4cG9ydC1hcycgd2l0aCBvdXRwdXQgdG8g YSBzcGVjaWZpZWQgYnVmZmVyLgoKQkFDS0VORCBpcyB0aGUgYmFjay1lbmQgdXNlZCBmb3IgdHJh bnNjb2RpbmcsIGFzIGEgc3ltYm9sLgoKQlVGRkVSIGlzIHRoZSBvdXRwdXQgYnVmZmVyLiAgSWYg aXQgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUKZXJhc2VkIGZpcnN0LCBvdGhlcndpc2UsIGl0 IHdpbGwgYmUgY3JlYXRlZC4KCk9wdGlvbmFsIGFyZ3VtZW50cyBTVUJUUkVFUCwgVklTSUJMRS1P TkxZLCBCT0RZLU9OTFkgYW5kCkVYVC1QTElTVCBhcmUgc2ltaWxhciB0byB0aG9zZSB1c2VkIGlu IGBvcmctZXhwb3J0LWFzJywgd2hpY2gKc2VlLgoKRGVwZW5kaW5nIG9uIGBvcmctZXhwb3J0LWNv cHktdG8ta2lsbC1yaW5nJywgYWRkIGJ1ZmZlciBjb250ZW50cwp0byBraWxsIHJpbmcuICBSZXR1 cm4gYnVmZmVyLiIpCiMrZW5kX3NyYwoKIyMjYXV0b2xvYWQKIytiZWdpbl9zcmMgZW1hY3MtbGlz cAooZGVmdW4gb3JnLWV4cG9ydC10by1maWxlCiAgKGJhY2tlbmQgZmlsZSAmb3B0aW9uYWwgc3Vi dHJlZXAgdmlzaWJsZS1vbmx5IGJvZHktb25seSBleHQtcGxpc3QpCiAgIkNhbGwgYG9yZy1leHBv cnQtYXMnIHdpdGggb3V0cHV0IHRvIGEgc3BlY2lmaWVkIGZpbGUuCgpCQUNLRU5EIGlzIHRoZSBi YWNrLWVuZCB1c2VkIGZvciB0cmFuc2NvZGluZywgYXMgYSBzeW1ib2wuICBGSUxFCmlzIHRoZSBu YW1lIG9mIHRoZSBvdXRwdXQgZmlsZSwgYXMgYSBzdHJpbmcuCgpPcHRpb25hbCBhcmd1bWVudHMg U1VCVFJFRVAsIFZJU0lCTEUtT05MWSwgQk9EWS1PTkxZIGFuZApFWFQtUExJU1QgYXJlIHNpbWls YXIgdG8gdGhvc2UgdXNlZCBpbiBgb3JnLWV4cG9ydC1hcycsIHdoaWNoCnNlZS4KCkRlcGVuZGlu ZyBvbiBgb3JnLWV4cG9ydC1jb3B5LXRvLWtpbGwtcmluZycsIGFkZCBmaWxlIGNvbnRlbnRzCnRv IGtpbGwgcmluZy4gIFJldHVybiBvdXRwdXQgZmlsZSdzIG5hbWUuIgojK2VuZF9zcmMKCiMjI2F1 dG9sb2FkCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGRlZnVuIG9yZy1leHBvcnQtc3RyaW5nLWFz IChzdHJpbmcgYmFja2VuZCAmb3B0aW9uYWwgYm9keS1vbmx5IGV4dC1wbGlzdCkKICAiVHJhbnNj b2RlIFNUUklORyBpbnRvIEJBQ0tFTkQgY29kZS4KCldoZW4gb3B0aW9uYWwgYXJndW1lbnQgQk9E WS1PTkxZIGlzIG5vbi1uaWwsIG9ubHkgcmV0dXJuIGJvZHkKY29kZSwgd2l0aG91dCBwcmVhbWJs ZSBub3IgcG9zdGFtYmxlLgoKT3B0aW9uYWwgYXJndW1lbnQgRVhULVBMSVNULCB3aGVuIHByb3Zp ZGVkLCBpcyBhIHByb3BlcnR5IGxpc3QKd2l0aCBleHRlcm5hbCBwYXJhbWV0ZXJzIG92ZXJyaWRp bmcgT3JnIGRlZmF1bHQgc2V0dGluZ3MsIGJ1dApzdGlsbCBpbmZlcmlvciB0byBmaWxlLWxvY2Fs IHNldHRpbmdzLgoKUmV0dXJuIGNvZGUgYXMgYSBzdHJpbmcuIikKIytlbmRfc3JjCgojIyNhdXRv bG9hZAojK2JlZ2luX3NyYyBlbWFjcy1saXNwCihkZWZ1biBvcmctZXhwb3J0LXJlcGxhY2UtcmVn aW9uLWJ5IChiYWNrZW5kKQogICJSZXBsYWNlIHRoZSBhY3RpdmUgcmVnaW9uIGJ5IGl0cyBleHBv cnQgdG8gQkFDS0VORC4iKQojK2VuZF9zcmMKCiMjI2F1dG9sb2FkCiMrYmVnaW5fc3JjIGVtYWNz LWxpc3AKKGRlZnVuIG9yZy1leHBvcnQtaW5zZXJ0LWRlZmF1bHQtdGVtcGxhdGUgKCZvcHRpb25h bCBiYWNrZW5kIHN1YnRyZWVwKQogICJJbnNlcnQgYWxsIGV4cG9ydCBrZXl3b3JkcyB3aXRoIGRl ZmF1bHQgdmFsdWVzIGF0IGJlZ2lubmluZyBvZiBsaW5lLgoKQkFDS0VORCBpcyBhIHN5bWJvbCBy ZXByZXNlbnRpbmcgdGhlIGV4cG9ydCBiYWNrLWVuZCBmb3Igd2hpY2gKc3BlY2lmaWMgZXhwb3J0 IG9wdGlvbnMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSB0ZW1wbGF0ZSwgb3IKYGRlZmF1bHQnIGZv ciBkZWZhdWx0IHRlbXBsYXRlLiAgV2hlbiBpdCBpcyBuaWwsIHRoZSB1c2VyIHdpbGwgYmUKcHJv bXB0ZWQgZm9yIGEgY2F0ZWdvcnkuCgpJZiBTVUJUUkVFUCBpcyBub24tbmlsLCBleHBvcnQgY29u ZmlndXJhdGlvbiB3aWxsIGJlIHNldCB1cApsb2NhbGx5IGZvciB0aGUgc3VidHJlZSB0aHJvdWdo IG5vZGUgcHJvcGVydGllcy4iKQoKKGRlZnVuIG9yZy1leHBvcnQtb3V0cHV0LWZpbGUtbmFtZSAo ZXh0ZW5zaW9uICZvcHRpb25hbCBzdWJ0cmVlcCBwdWItZGlyKQogICJSZXR1cm4gb3V0cHV0IGZp bGUncyBuYW1lIGFjY29yZGluZyB0byBidWZmZXIgc3BlY2lmaWNhdGlvbnMuCgpFWFRFTlNJT04g aXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvdXRwdXQgZmlsZSBleHRlbnNpb24sCndpdGgg dGhlIGxlYWRpbmcgZG90LgoKV2l0aCBhIG5vbi1uaWwgb3B0aW9uYWwgYXJndW1lbnQgU1VCVFJF RVAsIHRyeSB0byBkZXRlcm1pbmUKb3V0cHV0IGZpbGUncyBuYW1lIGJ5IGxvb2tpbmcgZm9yIFwi RVhQT1JUX0ZJTEVfTkFNRVwiIHByb3BlcnR5Cm9mIHN1YnRyZWUgYXQgcG9pbnQuCgpXaGVuIG9w dGlvbmFsIGFyZ3VtZW50IFBVQi1ESVIgaXMgc2V0LCB1c2UgaXQgYXMgdGhlIHB1Ymxpc2hpbmcK ZGlyZWN0b3J5LgoKV2hlbiBvcHRpb25hbCBhcmd1bWVudCBWSVNJQkxFLU9OTFkgaXMgbm9uLW5p bCwgZG9uJ3QgZXhwb3J0CmNvbnRlbnRzIG9mIGhpZGRlbiBlbGVtZW50cy4KClJldHVybiBmaWxl IG5hbWUgYXMgYSBzdHJpbmcuIikKCihkZWZ1biBvcmctZXhwb3J0LWV4cGFuZC1pbmNsdWRlLWtl eXdvcmQgKCZvcHRpb25hbCBpbmNsdWRlZCBkaXIpCiAgIkV4cGFuZCBldmVyeSBpbmNsdWRlIGtl eXdvcmQgaW4gYnVmZmVyLgpPcHRpb25hbCBhcmd1bWVudCBJTkNMVURFRCBpcyBhIGxpc3Qgb2Yg aW5jbHVkZWQgZmlsZSBuYW1lcyBhbG9uZwp3aXRoIHRoZWlyIGxpbmUgcmVzdHJpY3Rpb24sIHdo ZW4gYXBwcm9wcmlhdGUuICBJdCBpcyB1c2VkIHRvCmF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbi4g IE9wdGlvbmFsIGFyZ3VtZW50IERJUiBpcyB0aGUgY3VycmVudAp3b3JraW5nIGRpcmVjdG9yeS4g IEl0IGlzIHVzZWQgdG8gcHJvcGVybHkgcmVzb2x2ZSByZWxhdGl2ZQpwYXRocy4iKQoKKGRlZnVu IG9yZy1leHBvcnQtLXByZXBhcmUtZmlsZS1jb250ZW50cyAoZmlsZSAmb3B0aW9uYWwgbGluZXMg aW5kIG1pbmxldmVsKQogICJQcmVwYXJlIHRoZSBjb250ZW50cyBvZiBGSUxFIGZvciBpbmNsdXNp b24gYW5kIHJldHVybiB0aGVtIGFzIGEgc3RyaW5nLgoKV2hlbiBvcHRpb25hbCBhcmd1bWVudCBM SU5FUyBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIGEgcmFuZ2Ugb2YKbGluZXMsIGluY2x1ZGUgb25s eSB0aG9zZSBsaW5lcy4KCk9wdGlvbmFsIGFyZ3VtZW50IElORCwgd2hlbiBub24tbmlsLCBpcyBh biBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlCmdsb2JhbCBpbmRlbnRhdGlvbiBvZiByZXR1cm5lZCBj b250ZW50cy4gIFNpbmNlIGl0cyBwdXJwb3NlIGlzIHRvCmFsbG93IGFuIGluY2x1ZGVkIGZpbGUg dG8gc3RheSBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudCBpdCB3YXMKY3JlYXRlZCBcKGkuZS4gYSBs aXN0IGl0ZW0pLCBpdCBkb2Vzbid0IGFwcGx5IHBhc3QgdGhlIGZpcnN0CmhlYWRsaW5lIGVuY291 bnRlcmVkLgoKT3B0aW9uYWwgYXJndW1lbnQgTUlOTEVWRUwsIHdoZW4gbm9uLW5pbCwgaXMgYW4g aW50ZWdlcgpzcGVjaWZ5aW5nIHRoZSBsZXZlbCB0aGF0IGFueSB0b3AtbGV2ZWwgaGVhZGxpbmUg aW4gdGhlIGluY2x1ZGVkCmZpbGUgc2hvdWxkIGhhdmUuIikKCihkZWZ1biBvcmctZXhwb3J0LWV4 ZWN1dGUtYmFiZWwtY29kZSAoKQogICJFeGVjdXRlIGV2ZXJ5IEJhYmVsIGNvZGUgaW4gdGhlIHZp c2libGUgcGFydCBvZiBjdXJyZW50IGJ1ZmZlci4iKQoKKGRlZnVuIG9yZy1leHBvcnQtLWNvcHkt dG8ta2lsbC1yaW5nLXAgKCkKICAiUmV0dXJuIGEgbm9uLW5pbCB2YWx1ZSB3aGVuIG91dHB1dCBz aG91bGQgYmUgYWRkZWQgdG8gdGhlIGtpbGwgcmluZy4KU2VlIGFsc28gYG9yZy1leHBvcnQtY29w eS10by1raWxsLXJpbmcnLiIpCgoKIytlbmRfc3JjCgoqIFRvb2xzIEZvciBCYWNrLUVuZHMKCkEg d2hvbGUgc2V0IG9mIHRvb2xzIGlzIGF2YWlsYWJsZSB0byBoZWxwIGJ1aWxkIG5ldyBleHBvcnRl cnMuICBBbnkKZnVuY3Rpb24gZ2VuZXJhbCBlbm91Z2ggdG8gaGF2ZSBpdHMgdXNlIGFjcm9zcyBt YW55IGJhY2stZW5kcwpzaG91bGQgYmUgYWRkZWQgaGVyZS4KCioqIEZvciBBZmZpbGlhdGVkIEtl eXdvcmRzCgpgb3JnLWV4cG9ydC1yZWFkLWF0dHJpYnV0ZScgcmVhZHMgYSBwcm9wZXJ0eSBmcm9t IGEgZ2l2ZW4gZWxlbWVudAogYXMgYSBwbGlzdC4gIEl0IGNhbiBiZSB1c2VkIHRvIG5vcm1hbGl6 ZSBhZmZpbGlhdGVkIGtleXdvcmRzJwogc3ludGF4LgoKU2luY2UgY2FwdGlvbnMgY2FuIHNwYW4g b3ZlciBtdWx0aXBsZSBsaW5lcyBhbmQgYWNjZXB0IGR1YWwgdmFsdWVzLAp0aGVpciBpbnRlcm5h bCByZXByZXNlbnRhdGlvbiBpcyBhIGJpdCB0cmlja3kuICBUaGVyZWZvcmUsCmBvcmctZXhwb3J0 LWdldC1jYXB0aW9uJyB0cmFuc3BhcmVudGx5IHJldHVybnMgYSBnaXZlbiBlbGVtZW50J3MKY2Fw dGlvbiBhcyBhIHNlY29uZGFyeSBzdHJpbmcuCgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCihkZWZ1 biBvcmctZXhwb3J0LXJlYWQtYXR0cmlidXRlIChhdHRyaWJ1dGUgZWxlbWVudCAmb3B0aW9uYWwg cHJvcGVydHkpCiAgIlR1cm4gQVRUUklCVVRFIHByb3BlcnR5IGZyb20gRUxFTUVOVCBpbnRvIGEg cGxpc3QuCgpXaGVuIG9wdGlvbmFsIGFyZ3VtZW50IFBST1BFUlRZIGlzIG5vbi1uaWwsIHJldHVy biB0aGUgdmFsdWUgb2YKdGhhdCBwcm9wZXJ0eSB3aXRoaW4gYXR0cmlidXRlcy4KClRoaXMgZnVu Y3Rpb24gYXNzdW1lcyBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGFzIFwiOmtleXdvcmQKdmFsdWVc IiBwYWlycy4gIEl0IGlzIGFwcHJvcHJpYXRlIGZvciBgOmF0dHJfaHRtbCcgbGlrZQpwcm9wZXJ0 aWVzLgoKQWxsIHZhbHVlcyB3aWxsIGJlY29tZSBzdHJpbmdzIGV4Y2VwdCB0aGUgZW1wdHkgc3Ry aW5nIGFuZApcIm5pbFwiLCB3aGljaCB3aWxsIGJlY29tZSBuaWwuICBBbHNvLCB2YWx1ZXMgY29u dGFpbmluZyBvbmx5CmRvdWJsZSBxdW90ZXMgd2lsbCBiZSByZWFkIGFzLWlzLCB3aGljaCBtZWFu cyB0aGF0IFwiXCIgdmFsdWUKd2lsbCBiZWNvbWUgdGhlIGVtcHR5IHN0cmluZy4iKQoKKGRlZnVu IG9yZy1leHBvcnQtZ2V0LWNhcHRpb24gKGVsZW1lbnQgJm9wdGlvbmFsIHNob3J0cCkKICAiUmV0 dXJuIGNhcHRpb24gZnJvbSBFTEVNRU5UIGFzIGEgc2Vjb25kYXJ5IHN0cmluZy4KCldoZW4gb3B0 aW9uYWwgYXJndW1lbnQgU0hPUlRQIGlzIG5vbi1uaWwsIHJldHVybiBzaG9ydCBjYXB0aW9uLAph cyBhIHNlY29uZGFyeSBzdHJpbmcsIGluc3RlYWQuCgpDYXB0aW9uIGxpbmVzIGFyZSBzZXBhcmF0 ZWQgYnkgYSB3aGl0ZSBzcGFjZS4iKQoKIytlbmRfc3JjCgoqKiBGb3IgRGVyaXZlZCBCYWNrLWVu ZHMKCmBvcmctZXhwb3J0LXdpdGgtYmFja2VuZCcgaXMgYSBmdW5jdGlvbiBhbGxvd2luZyB0byBs b2NhbGx5IHVzZQphbm90aGVyIGJhY2stZW5kIHRvIHRyYW5zY29kZSBzb21lIG9iamVjdCBvciBl bGVtZW50LiAgSW4gYSBkZXJpdmVkCmJhY2stZW5kLCBpdCBtYXkgYmUgdXNlZCBhcyBhIGZhbGwt YmFjayBmdW5jdGlvbiBvbmNlIGFsbCBzcGVjaWZpYwpjYXNlcyBoYXZlIGJlZW4gdHJlYXRlZC4K CiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGRlZnVuIG9yZy1leHBvcnQtd2l0aC1iYWNrZW5kIChi YWNrLWVuZCBkYXRhICZvcHRpb25hbCBjb250ZW50cyBpbmZvKQogICJDYWxsIGEgdHJhbnNjb2Rl ciBmcm9tIEJBQ0stRU5EIG9uIERBVEEuCkNPTlRFTlRTLCB3aGVuIG5vbi1uaWwsIGlzIHRoZSB0 cmFuc2NvZGVkIGNvbnRlbnRzIG9mIERBVEEKZWxlbWVudCwgYXMgYSBzdHJpbmcuICBJTkZPLCB3 aGVuIG5vbi1uaWwsIGlzIHRoZSBjb21tdW5pY2F0aW9uCmNoYW5uZWwgdXNlZCBmb3IgZXhwb3J0 LCBhcyBhIHBsaXN0Li4iKQoKIytlbmRfc3JjCgoqKiBGb3IgRXhwb3J0IFNuaXBwZXRzCgpFdmVy eSBleHBvcnQgc25pcHBldCBpcyB0cmFuc21pdHRlZCB0byB0aGUgYmFjay1lbmQuICBUaG91Z2gs IHRoZQpsYXR0ZXIgd2lsbCBvbmx5IHJldGFpbiBvbmUgdHlwZSBvZiBleHBvcnQtc25pcHBldCwg aWdub3JpbmcKb3RoZXJzLCBiYXNlZCBvbiB0aGUgZm9ybWVyJ3MgdGFyZ2V0IGJhY2stZW5kLiAg VGhlIGZ1bmN0aW9uCmBvcmctZXhwb3J0LXNuaXBwZXQtYmFja2VuZCcgcmV0dXJucyB0aGF0IGJh Y2stZW5kIGZvciBhIGdpdmVuCmV4cG9ydC1zbmlwcGV0LgoKIytiZWdpbl9zcmMgZW1hY3MtbGlz cAooZGVmdW4gb3JnLWV4cG9ydC1zbmlwcGV0LWJhY2tlbmQgKGV4cG9ydC1zbmlwcGV0KQogICJS ZXR1cm4gRVhQT1JULVNOSVBQRVQgdGFyZ2V0ZWQgYmFjay1lbmQgYXMgYSBzeW1ib2wuClRyYW5z bGF0aW9uLCB3aXRoIGBvcmctZXhwb3J0LXNuaXBwZXQtdHJhbnNsYXRpb24tYWxpc3QnLCBpcwph cHBsaWVkLiIpCgojK2VuZF9zcmMKCioqIEZvciBGb290bm90ZXMKCmBvcmctZXhwb3J0LWNvbGxl Y3QtZm9vdG5vdGUtZGVmaW5pdGlvbnMnIGlzIGEgdG9vbCB0byBsaXN0CmFjdHVhbGx5IHVzZWQg Zm9vdG5vdGVzIGRlZmluaXRpb25zIGluIHRoZSB3aG9sZSBwYXJzZSB0cmVlLCBvciBpbgphIGhl YWRsaW5lLCBpbiBvcmRlciB0byBhZGQgZm9vdG5vdGUgbGlzdGluZ3MgdGhyb3VnaG91dCB0aGUK dHJhbnNjb2RlZCBkYXRhLgoKYG9yZy1leHBvcnQtZm9vdG5vdGUtZmlyc3QtcmVmZXJlbmNlLXAn IGlzIGEgcHJlZGljYXRlIHVzZWQgYnkgc29tZQpiYWNrLWVuZHMsIHdoZW4gdGhleSBuZWVkIHRv IGF0dGFjaCB0aGUgZm9vdG5vdGUgZGVmaW5pdGlvbiBvbmx5IHRvCnRoZSBmaXJzdCBvY2N1cnJl bmNlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxhYmVsLgoKYG9yZy1leHBvcnQtZ2V0LWZvb3Rub3Rl LWRlZmluaXRpb24nIGFuZApgb3JnLWV4cG9ydC1nZXQtZm9vdG5vdGUtbnVtYmVyJyBwcm92aWRl IGVhc2llciBhY2Nlc3MgdG8KYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byBhIGZv b3Rub3RlIHJlZmVyZW5jZS4KCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGRlZnVuIG9yZy1leHBv cnQtY29sbGVjdC1mb290bm90ZS1kZWZpbml0aW9ucyAoZGF0YSBpbmZvKQogICJSZXR1cm4gYW4g YWxpc3QgYmV0d2VlbiBmb290bm90ZSBudW1iZXJzLCBsYWJlbHMgYW5kIGRlZmluaXRpb25zLgoK REFUQSBpcyB0aGUgcGFyc2UgdHJlZSBmcm9tIHdoaWNoIGRlZmluaXRpb25zIGFyZSBjb2xsZWN0 ZWQuCklORk8gaXMgdGhlIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCgpE ZWZpbml0aW9ucyBhcmUgc29ydGVkIGJ5IG9yZGVyIG9mIHJlZmVyZW5jZXMuICBUaGV5IGVpdGhl cgphcHBlYXIgYXMgT3JnIGRhdGEgb3IgYXMgYSBzZWNvbmRhcnkgc3RyaW5nIGZvciBpbmxpbmVk CmZvb3Rub3Rlcy4gIFVucmVmZXJlbmNlZCBkZWZpbml0aW9ucyBhcmUgaWdub3JlZC4iKQoKKGRl ZnVuIG9yZy1leHBvcnQtZm9vdG5vdGUtZmlyc3QtcmVmZXJlbmNlLXAgKGZvb3Rub3RlLXJlZmVy ZW5jZSBpbmZvKQogICJOb24tbmlsIHdoZW4gYSBmb290bm90ZSByZWZlcmVuY2UgaXMgdGhlIGZp cnN0IG9uZSBmb3IgaXRzIGxhYmVsLgoKRk9PVE5PVEUtUkVGRVJFTkNFIGlzIHRoZSBmb290bm90 ZSByZWZlcmVuY2UgYmVpbmcgY29uc2lkZXJlZC4KSU5GTyBpcyB0aGUgcGxpc3QgdXNlZCBhcyBh IGNvbW11bmljYXRpb24gY2hhbm5lbC4iKQoKKGRlZnVuIG9yZy1leHBvcnQtZ2V0LWZvb3Rub3Rl LWRlZmluaXRpb24gKGZvb3Rub3RlLXJlZmVyZW5jZSBpbmZvKQogICJSZXR1cm4gZGVmaW5pdGlv biBvZiBGT09UTk9URS1SRUZFUkVOQ0UgYXMgcGFyc2VkIGRhdGEuCklORk8gaXMgdGhlIHBsaXN0 IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuICBJZiBubyBzdWNoCmRlZmluaXRpb24g Y2FuIGJlIGZvdW5kLCByZXR1cm4gdGhlIFwiREVGSU5JVElPTiBOT1QgRk9VTkRcIgpzdHJpbmcu IikKCihkZWZ1biBvcmctZXhwb3J0LWdldC1mb290bm90ZS1udW1iZXIgKGZvb3Rub3RlIGluZm8p CiAgIlJldHVybiBudW1iZXIgYXNzb2NpYXRlZCB0byBhIGZvb3Rub3RlLgoKRk9PVE5PVEUgaXMg ZWl0aGVyIGEgZm9vdG5vdGUgcmVmZXJlbmNlIG9yIGEgZm9vdG5vdGUgZGVmaW5pdGlvbi4KSU5G TyBpcyB0aGUgcGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbC4iKQoKIytlbmRf c3JjCgoqKiBGb3IgSGVhZGxpbmVzCgpgb3JnLWV4cG9ydC1nZXQtcmVsYXRpdmUtbGV2ZWwnIGlz IGEgc2hvcnRjdXQgdG8gZ2V0IGhlYWRsaW5lCmxldmVsLCByZWxhdGl2ZWx5IHRvIHRoZSBsb3dl ciBoZWFkbGluZSBsZXZlbCBpbiB0aGUgcGFyc2VkIHRyZWUuCgpgb3JnLWV4cG9ydC1nZXQtaGVh ZGxpbmUtbnVtYmVyJyByZXR1cm5zIHRoZSBzZWN0aW9uIG51bWJlciBvZiBhbgpoZWFkbGluZSwg d2hpbGUgYG9yZy1leHBvcnQtbnVtYmVyLXRvLXJvbWFuJyBhbGxvd3MgdG8gY29udmVydCBpdAp0 byByb21hbiBudW1iZXJzLgoKYG9yZy1leHBvcnQtbG93LWxldmVsLXAnLCBgb3JnLWV4cG9ydC1m aXJzdC1zaWJsaW5nLXAnIGFuZApgb3JnLWV4cG9ydC1sYXN0LXNpYmxpbmctcCcgYXJlIHRocmVl IHVzZWZ1bCBwcmVkaWNhdGVzIHdoZW4gaXQKY29tZXMgdG8gZnVsZmlsbCB0aGUgYDpoZWFkbGlu ZS1sZXZlbHMnIHByb3BlcnR5LgoKYG9yZy1leHBvcnQtZ2V0LXRhZ3MnLCBgb3JnLWV4cG9ydC1n ZXQtY2F0ZWdvcnknIGFuZApgb3JnLWV4cG9ydC1nZXQtbm9kZS1wcm9wZXJ0eScgZXh0cmFjdCB1 c2VmdWwgaW5mb3JtYXRpb24gZnJvbSBhbgpoZWFkbGluZSBvciBhIHBhcmVudCBoZWFkbGluZS4g IFRoZXkgYWxsIGhhbmRsZSBpbmhlcml0YW5jZS4KCmBvcmctZXhwb3J0LWdldC1hbHQtdGl0bGUn IHRyaWVzIHRvIHJldHJpZXZlIGFuIGFsdGVybmF0aXZlIHRpdGxlLAphcyBhIHNlY29uZGFyeSBz dHJpbmcsIHN1aXRhYmxlIGZvciB0YWJsZSBvZiBjb250ZW50cy4gIEl0IGZhbGxzCmJhY2sgb250 byBkZWZhdWx0IHRpdGxlLgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAooZGVmdW4gb3JnLWV4cG9y dC1nZXQtcmVsYXRpdmUtbGV2ZWwgKGhlYWRsaW5lIGluZm8pCiAgIlJldHVybiBIRUFETElORSBy ZWxhdGl2ZSBsZXZlbCB3aXRoaW4gY3VycmVudCBwYXJzZWQgdHJlZS4KSU5GTyBpcyBhIHBsaXN0 IGhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iKQoKKGRlZnVuIG9yZy1leHBvcnQtbG93 LWxldmVsLXAgKGhlYWRsaW5lIGluZm8pCiAgIk5vbi1uaWwgd2hlbiBIRUFETElORSBpcyBjb25z aWRlcmVkIGFzIGxvdyBsZXZlbC4KCklORk8gaXMgYSBwbGlzdCB1c2VkIGFzIGEgY29tbXVuaWNh dGlvbiBjaGFubmVsLgoKQSBsb3cgbGV2ZWwgaGVhZGxpbmVzIGhhcyBhIHJlbGF0aXZlIGxldmVs IGdyZWF0ZXIgdGhhbgpgOmhlYWRsaW5lLWxldmVscycgcHJvcGVydHkgdmFsdWUuCgpSZXR1cm4g dmFsdWUgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBIRUFETElORSByZWxhdGl2ZSBsZXZlbAph bmQgdGhlIGxhc3QgbGV2ZWwgYmVpbmcgY29uc2lkZXJlZCBhcyBoaWdoIGVub3VnaCwgb3Igbmls LiIpCgooZGVmdW4gb3JnLWV4cG9ydC1nZXQtaGVhZGxpbmUtbnVtYmVyIChoZWFkbGluZSBpbmZv KQogICJSZXR1cm4gSEVBRExJTkUgbnVtYmVyaW5nIGFzIGEgbGlzdCBvZiBudW1iZXJzLgpJTkZP IGlzIGEgcGxpc3QgaG9sZGluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIpCgooZGVmdW4gb3Jn LWV4cG9ydC1udW1iZXJlZC1oZWFkbGluZS1wIChoZWFkbGluZSBpbmZvKQogICJSZXR1cm4gYSBu b24tbmlsIHZhbHVlIGlmIEhFQURMSU5FIGVsZW1lbnQgc2hvdWxkIGJlIG51bWJlcmVkLgpJTkZP IGlzIGEgcGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbC4iKQoKKGRlZnVuIG9y Zy1leHBvcnQtbnVtYmVyLXRvLXJvbWFuIChuKQogICJDb252ZXJ0IGludGVnZXIgTiBpbnRvIGEg cm9tYW4gbnVtZXJhbC4iKQoKKGRlZnVuIG9yZy1leHBvcnQtZ2V0LXRhZ3MgKGVsZW1lbnQgaW5m byAmb3B0aW9uYWwgdGFncyBpbmhlcml0ZWQpCiAgIlJldHVybiBsaXN0IG9mIHRhZ3MgYXNzb2Np YXRlZCB0byBFTEVNRU5ULgoKRUxFTUVOVCBoYXMgZWl0aGVyIGFuIGBoZWFkbGluZScgb3IgYW4g YGlubGluZXRhc2snIHR5cGUuICBJTkZPCmlzIGEgcGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRp b24gY2hhbm5lbC4KClNlbGVjdCB0YWdzIChzZWUgYG9yZy1leHBvcnQtc2VsZWN0LXRhZ3MnKSBh bmQgZXhjbHVkZSB0YWdzIChzZWUKYG9yZy1leHBvcnQtZXhjbHVkZS10YWdzJykgYXJlIHJlbW92 ZWQgZnJvbSB0aGUgbGlzdC4KCldoZW4gbm9uLW5pbCwgb3B0aW9uYWwgYXJndW1lbnQgVEFHUyBz aG91bGQgYmUgYSBsaXN0IG9mIHN0cmluZ3MuCkFueSB0YWcgYmVsb25naW5nIHRvIHRoaXMgbGlz dCB3aWxsIGFsc28gYmUgcmVtb3ZlZC4KCldoZW4gb3B0aW9uYWwgYXJndW1lbnQgSU5IRVJJVEVE IGlzIG5vbi1uaWwsIHRhZ3MgY2FuIGFsc28gYmUKaW5oZXJpdGVkIGZyb20gcGFyZW50IGhlYWRs aW5lcyBhbmQgRklMRVRBR1Mga2V5d29yZHMuIikKCihkZWZ1biBvcmctZXhwb3J0LWdldC1ub2Rl LXByb3BlcnR5IChwcm9wZXJ0eSBibG9iICZvcHRpb25hbCBpbmhlcml0ZWQpCiAgIlJldHVybiBu b2RlIFBST1BFUlRZIHZhbHVlIGZvciBCTE9CLgoKUFJPUEVSVFkgaXMgYW4gdXBjYXNlIHN5bWJv bCAoaS5lLiBgOkNPT0tJRV9EQVRBJykuICBCTE9CIGlzIGFuCmVsZW1lbnQgb3Igb2JqZWN0LgoK SWYgb3B0aW9uYWwgYXJndW1lbnQgSU5IRVJJVEVEIGlzIG5vbi1uaWwsIHRoZSB2YWx1ZSBjYW4g YmUKaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgaGVhZGxpbmUuCgpSZXR1cm4gdmFsdWUgaXMgYSBz dHJpbmcgb3IgbmlsLiIpCgooZGVmdW4gb3JnLWV4cG9ydC1nZXQtY2F0ZWdvcnkgKGJsb2IgaW5m bykKICAiUmV0dXJuIGNhdGVnb3J5IGZvciBlbGVtZW50IG9yIG9iamVjdCBCTE9CLgoKSU5GTyBp cyBhIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCgpDQVRFR09SWSBpcyBh dXRvbWF0aWNhbGx5IGluaGVyaXRlZCBmcm9tIGEgcGFyZW50IGhlYWRsaW5lLCBmcm9tCiMrQ0FU RUdPUlk6IGtleXdvcmQgb3IgY3JlYXRlZCBvdXQgb2Ygb3JpZ2luYWwgZmlsZSBuYW1lLiAgSWYg YWxsCmZhaWwsIHRoZSBmYWxsLWJhY2sgdmFsdWUgaXMgXCI/Pz9cIi4iKQoKKGRlZnVuIG9yZy1l eHBvcnQtZ2V0LWFsdC10aXRsZSAoaGVhZGxpbmUgaW5mbykKICAiUmV0dXJuIGFsdGVybmF0aXZl IHRpdGxlIGZvciBIRUFETElORSwgYXMgYSBzZWNvbmRhcnkgc3RyaW5nLgpJTkZPIGlzIGEgcGxp c3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbC4gIElmIG5vIG9wdGlvbmFsCnRpdGxl IGlzIGRlZmluZWQsIGZhbGwtYmFjayB0byB0aGUgcmVndWxhciB0aXRsZS4iKQoKKGRlZnVuIG9y Zy1leHBvcnQtZmlyc3Qtc2libGluZy1wIChoZWFkbGluZSBpbmZvKQogICJOb24tbmlsIHdoZW4g SEVBRExJTkUgaXMgdGhlIGZpcnN0IHNpYmxpbmcgaW4gaXRzIHN1Yi10cmVlLgpJTkZPIGlzIGEg cGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbC4iKQoKKGRlZnVuIG9yZy1leHBv cnQtbGFzdC1zaWJsaW5nLXAgKGhlYWRsaW5lIGluZm8pCiAgIk5vbi1uaWwgd2hlbiBIRUFETElO RSBpcyB0aGUgbGFzdCBzaWJsaW5nIGluIGl0cyBzdWItdHJlZS4KSU5GTyBpcyBhIHBsaXN0IHVz ZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuIikKCiMrZW5kX3NyYwoKKiogRm9yIEtleXdv cmRzCgpgb3JnLWV4cG9ydC1nZXQtZGF0ZScgcmV0dXJucyBhIGRhdGUgYXBwcm9wcmlhdGUgZm9y IHRoZSBkb2N1bWVudAogdG8gYWJvdXQgdG8gYmUgZXhwb3J0ZWQuICBJbiBwYXJ0aWN1bGFyLCBp dCB0YWtlcyBjYXJlIG9mCiBgb3JnLWV4cG9ydC1kYXRlLXRpbWVzdGFtcC1mb3JtYXQnLgoKIyti ZWdpbl9zcmMgZW1hY3MtbGlzcAooZGVmdW4gb3JnLWV4cG9ydC1nZXQtZGF0ZSAoaW5mbyAmb3B0 aW9uYWwgZm10KQogICJSZXR1cm4gZGF0ZSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQu CgpJTkZPIGlzIGEgcGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbC4gIEZNVCwg d2hlbgpub24tbmlsLCBpcyBhIHRpbWUgZm9ybWF0IHN0cmluZyB0aGF0IHdpbGwgYmUgYXBwbGll ZCBvbiB0aGUgZGF0ZQppZiBpdCBjb25zaXN0cyBpbiBhIHNpbmdsZSB0aW1lc3RhbXAgb2JqZWN0 LiAgSXQgZGVmYXVsdHMgdG8KYG9yZy1leHBvcnQtZGF0ZS10aW1lc3RhbXAtZm9ybWF0JyB3aGVu IG5pbC4KCkEgcHJvcGVyIGRhdGUgY2FuIGJlIGEgc2Vjb25kYXJ5IHN0cmluZywgYSBzdHJpbmcg b3IgbmlsLiAgSXQgaXMKbWVhbnQgdG8gYmUgdHJhbnNsYXRlZCB3aXRoIGBvcmctZXhwb3J0LWRh dGEnIG9yIGFsaWtlLiIpCgojK2VuZF9zcmMKCioqIEZvciBMaW5rcwoKYG9yZy1leHBvcnQtc29s aWRpZnktbGluay10ZXh0JyB0dXJucyBhIHN0cmluZyBpbnRvIGEgc2FmZXIgdmVyc2lvbgpmb3Ig bGlua3MsIHJlcGxhY2luZyBtb3N0IG5vbi1zdGFuZGFyZCBjaGFyYWN0ZXJzIHdpdGggaHlwaGVu cy4KCmBvcmctZXhwb3J0LWdldC1jb2RlcmVmLWZvcm1hdCcgcmV0dXJucyBhbiBhcHByb3ByaWF0 ZSBmb3JtYXQKc3RyaW5nIGZvciBjb2RlcmVmcy4KCmBvcmctZXhwb3J0LWlubGluZS1pbWFnZS1w JyByZXR1cm5zIGEgbm9uLW5pbCB2YWx1ZSB3aGVuIHRoZSBsaW5rCnByb3ZpZGVkIHNob3VsZCBi ZSBjb25zaWRlcmVkIGFzIGFuIGlubGluZSBpbWFnZS4KCmBvcmctZXhwb3J0LXJlc29sdmUtZnV6 enktbGluaycgc2VhcmNoZXMgZGVzdGluYXRpb24gb2YgZnV6enkgbGlua3MKKGkuZS4gbGlua3Mg d2l0aCAiZnV6enkiIGFzIHR5cGUpIHdpdGhpbiB0aGUgcGFyc2VkIHRyZWUsIGFuZApyZXR1cm5z IGFuIGFwcHJvcHJpYXRlIHVuaXF1ZSBpZGVudGlmaWVyIHdoZW4gZm91bmQsIG9yIG5pbC4KCmBv cmctZXhwb3J0LXJlc29sdmUtaWQtbGluaycgcmV0dXJucyB0aGUgZmlyc3QgaGVhZGxpbmUgd2l0 aApzcGVjaWZpZWQgaWQgb3IgY3VzdG9tLWlkIGluIHBhcnNlIHRyZWUsIHRoZSBwYXRoIHRvIHRo ZSBleHRlcm5hbApmaWxlIHdpdGggdGhlIGlkIG9yIG5pbCB3aGVuIG5laXRoZXIgd2FzIGZvdW5k LgoKYG9yZy1leHBvcnQtcmVzb2x2ZS1jb2RlcmVmJyBhc3NvY2lhdGVzIGEgcmVmZXJlbmNlIHRv IGEgbGluZQpudW1iZXIgaW4gdGhlIGVsZW1lbnQgaXQgYmVsb25ncywgb3IgcmV0dXJucyB0aGUg cmVmZXJlbmNlIGl0c2VsZgp3aGVuIHRoZSBlbGVtZW50IGlzbid0IG51bWJlcmVkLgoKIytiZWdp bl9zcmMgZW1hY3MtbGlzcAooZGVmdW4gb3JnLWV4cG9ydC1zb2xpZGlmeS1saW5rLXRleHQgKHMp CiAgIlRha2UgbGluayB0ZXh0IFMgYW5kIG1ha2UgYSBzYWZlIHRhcmdldCBvdXQgb2YgaXQuIikK CihkZWZ1biBvcmctZXhwb3J0LWdldC1jb2RlcmVmLWZvcm1hdCAocGF0aCBkZXNjKQogICJSZXR1 cm4gZm9ybWF0IHN0cmluZyBmb3IgY29kZSByZWZlcmVuY2UgbGluay4KUEFUSCBpcyB0aGUgbGlu ayBwYXRoLiAgREVTQyBpcyBpdHMgZGVzY3JpcHRpb24uIikKCihkZWZ1biBvcmctZXhwb3J0LWlu bGluZS1pbWFnZS1wIChsaW5rICZvcHRpb25hbCBydWxlcykKICAiTm9uLW5pbCBpZiBMSU5LIG9i amVjdCBwb2ludHMgdG8gYW4gaW5saW5lIGltYWdlLgoKT3B0aW9uYWwgYXJndW1lbnQgaXMgYSBz ZXQgb2YgUlVMRVMgZGVmaW5pbmcgaW5saW5lIGltYWdlcy4gIEl0CmlzIGFuIGFsaXN0IHdoZXJl IGFzc29jaWF0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc2hhcGU6CgogIFwoVFlQRSAuIFJFR0VY UCkKCkFwcGx5aW5nIGEgcnVsZSBtZWFucyBhcHBseSBSRUdFWFAgYWdhaW5zdCBMSU5LJ3MgcGF0 aCB3aGVuIGl0cwp0eXBlIGlzIFRZUEUuICBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBub24t bmlsIHZhbHVlIGlmIGFueSBvZgp0aGUgcHJvdmlkZWQgcnVsZXMgaXMgbm9uLW5pbC4gIFRoZSBk ZWZhdWx0IHJ1bGUgaXMKYG9yZy1leHBvcnQtZGVmYXVsdC1pbmxpbmUtaW1hZ2UtcnVsZScuCgpU aGlzIG9ubHkgYXBwbGllcyB0byBsaW5rcyB3aXRob3V0IGEgZGVzY3JpcHRpb24uIikKCihkZWZ1 biBvcmctZXhwb3J0LXJlc29sdmUtY29kZXJlZiAocmVmIGluZm8pCiAgIlJlc29sdmUgYSBjb2Rl IHJlZmVyZW5jZSBSRUYuCgpJTkZPIGlzIGEgcGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24g Y2hhbm5lbC4KClJldHVybiBhc3NvY2lhdGVkIGxpbmUgbnVtYmVyIGluIHNvdXJjZSBjb2RlLCBv ciBSRUYgaXRzZWxmLApkZXBlbmRpbmcgb24gc3JjLWJsb2NrIG9yIGV4YW1wbGUgZWxlbWVudCdz IHN3aXRjaGVzLiIpCgooZGVmdW4gb3JnLWV4cG9ydC1yZXNvbHZlLWZ1enp5LWxpbmsgKGxpbmsg aW5mbykKICAiUmV0dXJuIExJTksgZGVzdGluYXRpb24uCgpJTkZPIGlzIGEgcGxpc3QgaG9sZGlu ZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLgoKUmV0dXJuIHZhbHVlIGNhbiBiZSBhbiBvYmplY3Qs IGFuIGVsZW1lbnQsIG9yIG5pbDoKCi0gSWYgTElOSyBwYXRoIG1hdGNoZXMgYSB0YXJnZXQgb2Jq ZWN0IChpLmUuIDw8cGF0aD4+KSByZXR1cm4gaXQuCgotIElmIExJTksgcGF0aCBleGFjdGx5IG1h dGNoZXMgdGhlIG5hbWUgYWZmaWxpYXRlZCBrZXl3b3JkCiAgXChpLmUuICMrTkFNRTogcGF0aCkg b2YgYW4gZWxlbWVudCwgcmV0dXJuIHRoYXQgZWxlbWVudC4KCi0gSWYgTElOSyBwYXRoIGV4YWN0 bHkgbWF0Y2hlcyBhbnkgaGVhZGxpbmUgbmFtZSwgcmV0dXJuIHRoYXQKICBlbGVtZW50LiAgSWYg bW9yZSB0aGFuIG9uZSBoZWFkbGluZSBzaGFyZSB0aGF0IG5hbWUsIHByaW9yaXR5CiAgd2lsbCBi ZSBnaXZlbiB0byB0aGUgb25lIHdpdGggdGhlIGNsb3Nlc3QgY29tbW9uIGFuY2VzdG9yLCBpZgog IGFueSwgb3IgdGhlIGZpcnN0IG9uZSBpbiB0aGUgcGFyc2UgdHJlZSBvdGhlcndpc2UuCgotIE90 aGVyd2lzZSwgcmV0dXJuIG5pbC4KCkFzc3VtZSBMSU5LIHR5cGUgaXMgXCJmdXp6eVwiLiAgV2hp dGUgc3BhY2VzIGFyZSBub3QKc2lnbmlmaWNhbnQuIikKCihkZWZ1biBvcmctZXhwb3J0LXJlc29s dmUtaWQtbGluayAobGluayBpbmZvKQogICJSZXR1cm4gaGVhZGxpbmUgcmVmZXJlbmNlZCBhcyBM SU5LIGRlc3RpbmF0aW9uLgoKSU5GTyBpcyBhIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9u IGNoYW5uZWwuCgpSZXR1cm4gdmFsdWUgY2FuIGJlIHRoZSBoZWFkbGluZSBlbGVtZW50IG1hdGNo ZWQgaW4gY3VycmVudCBwYXJzZQp0cmVlLCBhIGZpbGUgbmFtZSBvciBuaWwuICBBc3N1bWUgTElO SyB0eXBlIGlzIGVpdGhlciBcImlkXCIgb3IKXCJjdXN0b20taWRcIi4iKQoKKGRlZnVuIG9yZy1l eHBvcnQtcmVzb2x2ZS1yYWRpby1saW5rIChsaW5rIGluZm8pCiAgIlJldHVybiByYWRpby10YXJn ZXQgb2JqZWN0IHJlZmVyZW5jZWQgYXMgTElOSyBkZXN0aW5hdGlvbi4KCklORk8gaXMgYSBwbGlz dCB1c2VkIGFzIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsLgoKUmV0dXJuIHZhbHVlIGNhbiBiZSBh IHJhZGlvLXRhcmdldCBvYmplY3Qgb3IgbmlsLiAgQXNzdW1lIExJTksKaGFzIHR5cGUgXCJyYWRp b1wiLiIpCgojK2VuZF9zcmMKCioqIEZvciBSZWZlcmVuY2VzCgpgb3JnLWV4cG9ydC1nZXQtb3Jk aW5hbCcgYXNzb2NpYXRlcyBhIHNlcXVlbmNlIG51bWJlciB0byBhbnkgb2JqZWN0Cm9yIGVsZW1l bnQuCgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCihkZWZ1biBvcmctZXhwb3J0LWdldC1vcmRpbmFs IChlbGVtZW50IGluZm8gJm9wdGlvbmFsIHR5cGVzIHByZWRpY2F0ZSkKICAiUmV0dXJuIG9yZGlu YWwgbnVtYmVyIG9mIGFuIGVsZW1lbnQgb3Igb2JqZWN0LgoKRUxFTUVOVCBpcyB0aGUgZWxlbWVu dCBvciBvYmplY3QgY29uc2lkZXJlZC4gIElORk8gaXMgdGhlIHBsaXN0CnVzZWQgYXMgYSBjb21t dW5pY2F0aW9uIGNoYW5uZWwuCgpPcHRpb25hbCBhcmd1bWVudCBUWVBFUywgd2hlbiBub24tbmls LCBpcyBhIGxpc3Qgb2YgZWxlbWVudCBvcgpvYmplY3QgdHlwZXMsIGFzIHN5bWJvbHMsIHRoYXQg c2hvdWxkIGFsc28gYmUgY291bnRlZCBpbi4KT3RoZXJ3aXNlLCBvbmx5IHByb3ZpZGVkIGVsZW1l bnQncyB0eXBlIGlzIGNvbnNpZGVyZWQuCgpPcHRpb25hbCBhcmd1bWVudCBQUkVESUNBVEUgaXMg YSBmdW5jdGlvbiByZXR1cm5pbmcgYSBub24tbmlsCnZhbHVlIGlmIHRoZSBjdXJyZW50IGVsZW1l bnQgb3Igb2JqZWN0IHNob3VsZCBiZSBjb3VudGVkIGluLiAgSXQKYWNjZXB0cyB0d28gYXJndW1l bnRzOiB0aGUgZWxlbWVudCBvciBvYmplY3QgYmVpbmcgY29uc2lkZXJlZCBhbmQKdGhlIHBsaXN0 IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuICBUaGlzIGFsbG93cyB0byBjb3VudApv bmx5IGEgY2VydGFpbiB0eXBlIG9mIG9iamVjdHMgKGkuZS4gaW5saW5lIGltYWdlcykuCgpSZXR1 cm4gdmFsdWUgaXMgYSBsaXN0IG9mIG51bWJlcnMgaWYgRUxFTUVOVCBpcyBhIGhlYWRsaW5lIG9y IGFuCml0ZW0uICBJdCBpcyBuaWwgZm9yIGtleXdvcmRzLiAgSXQgcmVwcmVzZW50cyB0aGUgZm9v dG5vdGUgbnVtYmVyCmZvciBmb290bm90ZSBkZWZpbml0aW9ucyBhbmQgZm9vdG5vdGUgcmVmZXJl bmNlcy4gIElmIEVMRU1FTlQgaXMKYSB0YXJnZXQsIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyBp ZiBFTEVNRU5UIHdhcyB0aGUgY2xvc2VzdAp0YWJsZSwgaXRlbSBvciBoZWFkbGluZSBjb250YWlu aW5nIHRoZSB0YXJnZXQuICBJbiBhbnkgb3RoZXIKY2FzZSwgcmV0dXJuIHRoZSBzZXF1ZW5jZSBu dW1iZXIgb2YgRUxFTUVOVCBhbW9uZyBlbGVtZW50cyBvcgpvYmplY3RzIG9mIHRoZSBzYW1lIHR5 cGUuIikKCiMrZW5kX3NyYwoKKiogRm9yIFNyYy1CbG9ja3MKCmBvcmctZXhwb3J0LWdldC1sb2Mn IGNvdW50cyBudW1iZXIgb2YgY29kZSBsaW5lcyBhY2N1bXVsYXRlZCBpbgpzcmMtYmxvY2sgb3Ig ZXhhbXBsZS1ibG9jayBlbGVtZW50cyB3aXRoIGEgIituIiBzd2l0Y2ggdW50aWwKYSBnaXZlbiBl bGVtZW50LCBleGNsdWRlZC4gIE5vdGU6ICItbiIgc3dpdGNoZXMgcmVzZXQgdGhhdCBjb3VudC4K CmBvcmctZXhwb3J0LXVucmF2ZWwtY29kZScgZXh0cmFjdHMgc291cmNlIGNvZGUgKGFsb25nIHdp dGggYSBjb2RlCnJlZmVyZW5jZXMgYWxpc3QpIGZyb20gYW4gYGVsZW1lbnQtYmxvY2snIG9yIGBz cmMtYmxvY2snIHR5cGUKZWxlbWVudC4KCmBvcmctZXhwb3J0LWZvcm1hdC1jb2RlJyBhcHBsaWVz IGEgZm9ybWF0dGluZyBmdW5jdGlvbiB0byBlYWNoIGxpbmUKb2YgY29kZSwgcHJvdmlkaW5nIHJl bGF0aXZlIGxpbmUgbnVtYmVyIGFuZCBjb2RlIHJlZmVyZW5jZSB3aGVuCmFwcHJvcHJpYXRlLiAg U2luY2UgaXQgZG9lc24ndCBhY2Nlc3MgdGhlIG9yaWdpbmFsIGVsZW1lbnQgZnJvbQp3aGljaCB0 aGUgc291cmNlIGNvZGUgaXMgY29taW5nLCBpdCBleHBlY3RzIGZyb20gdGhlIGNvZGUgY2FsbGlu ZwppdCB0byBrbm93IGlmIGxpbmVzIHNob3VsZCBiZSBudW1iZXJlZCBhbmQgaWYgY29kZSByZWZl cmVuY2VzCnNob3VsZCBhcHBlYXIuCgpFdmVudHVhbGx5LCBgb3JnLWV4cG9ydC1mb3JtYXQtY29k ZS1kZWZhdWx0JyBpcyBhIGhpZ2hlci1sZXZlbApmdW5jdGlvbiAoaXQgbWFrZXMgdXNlIG9mIHRo ZSB0d28gcHJldmlvdXMgZnVuY3Rpb25zKSB3aGljaCBoYW5kbGVzCmxpbmUgbnVtYmVyaW5nIGFu ZCBjb2RlIHJlZmVyZW5jZXMgaW5jbHVzaW9uLCBhbmQgcmV0dXJucyBzb3VyY2UKY29kZSBpbiBh IGZvcm1hdCBzdWl0YWJsZSBmb3IgcGxhaW4gdGV4dCBvciB2ZXJiYXRpbSBvdXRwdXQuCgojK2Jl Z2luX3NyYyBlbWFjcy1saXNwCihkZWZ1biBvcmctZXhwb3J0LWdldC1sb2MgKGVsZW1lbnQgaW5m bykKICAiUmV0dXJuIGFjY3VtdWxhdGVkIGxpbmVzIG9mIGNvZGUgdXAgdG8gRUxFTUVOVC4KCklO Rk8gaXMgdGhlIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCgpFTEVNRU5U IGlzIGV4Y2x1ZGVkIGZyb20gY291bnQuIikKCihkZWZ1biBvcmctZXhwb3J0LXVucmF2ZWwtY29k ZSAoZWxlbWVudCkKICAiQ2xlYW4gc291cmNlIGNvZGUgYW5kIGV4dHJhY3QgcmVmZXJlbmNlcyBv dXQgb2YgaXQuCgpFTEVNRU5UIGhhcyBlaXRoZXIgYSBgc3JjLWJsb2NrJyBhbiBgZXhhbXBsZS1i bG9jaycgdHlwZS4KClJldHVybiBhIGNvbnMgY2VsbCB3aG9zZSBDQVIgaXMgdGhlIHNvdXJjZSBj b2RlLCBjbGVhbmVkIGZyb20gYW55CnJlZmVyZW5jZSBhbmQgcHJvdGVjdGl2ZSBjb21tYSBhbmQg Q0RSIGlzIGFuIGFsaXN0IGJldHdlZW4KcmVsYXRpdmUgbGluZSBudW1iZXIgKGludGVnZXIpIGFu ZCBuYW1lIG9mIGNvZGUgcmVmZXJlbmNlIG9uIHRoYXQKbGluZSAoc3RyaW5nKS4iKQoKKGRlZnVu IG9yZy1leHBvcnQtZm9ybWF0LWNvZGUgKGNvZGUgZnVuICZvcHRpb25hbCBudW0tbGluZXMgcmVm LWFsaXN0KQogICJGb3JtYXQgQ09ERSBieSBhcHBseWluZyBGVU4gbGluZS13aXNlIGFuZCByZXR1 cm4gaXQuCgpDT0RFIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29kZSB0byBmb3JtYXQu ICBGVU4gaXMKYSBmdW5jdGlvbi4gIEl0IG11c3QgYWNjZXB0IHRocmVlIGFyZ3VtZW50czogYSBs aW5lIG9mCmNvZGUgKHN0cmluZyksIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIChpbnRlZ2VyKSBv ciBuaWwgYW5kIHRoZQpyZWZlcmVuY2UgYXNzb2NpYXRlZCB0byB0aGUgY3VycmVudCBsaW5lIChz dHJpbmcpIG9yIG5pbC4KCk9wdGlvbmFsIGFyZ3VtZW50IE5VTS1MSU5FUyBjYW4gYmUgYW4gaW50 ZWdlciByZXByZXNlbnRpbmcgdGhlCm51bWJlciBvZiBjb2RlIGxpbmVzIGFjY3VtdWxhdGVkIHVu dGlsIHRoZSBjdXJyZW50IGNvZGUuICBMaW5lCm51bWJlcnMgcGFzc2VkIHRvIEZVTiB3aWxsIHRh a2UgaXQgaW50byBhY2NvdW50LiAgSWYgaXQgaXMgbmlsLApGVU4ncyBzZWNvbmQgYXJndW1lbnQg d2lsbCBhbHdheXMgYmUgbmlsLiAgVGhpcyBudW1iZXIgY2FuIGJlCm9idGFpbmVkIHdpdGggYG9y Zy1leHBvcnQtZ2V0LWxvYycgZnVuY3Rpb24uCgpPcHRpb25hbCBhcmd1bWVudCBSRUYtQUxJU1Qg Y2FuIGJlIGFuIGFsaXN0IGJldHdlZW4gcmVsYXRpdmUgbGluZQpudW1iZXIgKGkuZS4gaWdub3Jp bmcgTlVNLUxJTkVTKSBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvZGUKcmVmZXJlbmNlIG9uIGl0LiAg SWYgaXQgaXMgbmlsLCBGVU4ncyB0aGlyZCBhcmd1bWVudCB3aWxsIGFsd2F5cwpiZSBuaWwuICBJ dCBjYW4gYmUgb2J0YWluZWQgdGhyb3VnaCB0aGUgdXNlIG9mCmBvcmctZXhwb3J0LXVucmF2ZWwt Y29kZScgZnVuY3Rpb24uIikKCihkZWZ1biBvcmctZXhwb3J0LWZvcm1hdC1jb2RlLWRlZmF1bHQg KGVsZW1lbnQgaW5mbykKICAiUmV0dXJuIHNvdXJjZSBjb2RlIGZyb20gRUxFTUVOVCwgZm9ybWF0 dGVkIGluIGEgc3RhbmRhcmQgd2F5LgoKRUxFTUVOVCBpcyBlaXRoZXIgYSBgc3JjLWJsb2NrJyBv ciBgZXhhbXBsZS1ibG9jaycgZWxlbWVudC4gIElORk8KaXMgYSBwbGlzdCB1c2VkIGFzIGEgY29t bXVuaWNhdGlvbiBjaGFubmVsLgoKVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGxpbmUgbnVt YmVyaW5nIGFuZCBjb2RlIHJlZmVyZW5jZXMKaW5jbHVzaW9uLiAgTGluZSBudW1iZXJzLCB3aGVu IGFwcGxpY2FibGUsIGFwcGVhciBhdCB0aGUKYmVnaW5uaW5nIG9mIHRoZSBsaW5lLCBzZXBhcmF0 ZWQgZnJvbSB0aGUgY29kZSBieSB0d28gd2hpdGUKc3BhY2VzLiAgQ29kZSByZWZlcmVuY2VzLCBv biB0aGUgb3RoZXIgaGFuZCwgYXBwZWFyIGZsdXNoZWQgdG8KdGhlIHJpZ2h0LCBzZXBhcmF0ZWQg Ynkgc2l4IHdoaXRlIHNwYWNlcyBmcm9tIHRoZSB3aWRlc3QgbGluZSBvZgpjb2RlLiIpCgojK2Vu ZF9zcmMKCioqIEZvciBUYWJsZXMKCmBvcmctZXhwb3J0LXRhYmxlLWhhcy1zcGVjaWFsLWNvbHVt bi1wJyBhbmQgYW5kCmBvcmctZXhwb3J0LXRhYmxlLXJvdy1pcy1zcGVjaWFsLXAnIGFyZSBwcmVk aWNhdGVzIHVzZWQgdG8gbG9vayBmb3IKbWV0YS1pbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFibGUg c3RydWN0dXJlLgoKYG9yZy10YWJsZS1oYXMtaGVhZGVyLXAnIHRlbGxzIHdoZW4gdGhlIHJvd3Mg YmVmb3JlIHRoZSBmaXJzdCBydWxlCiBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyB0YWJsZSdzIGhl YWRlci4KCmBvcmctZXhwb3J0LXRhYmxlLWNlbGwtd2lkdGgnLCBgb3JnLWV4cG9ydC10YWJsZS1j ZWxsLWFsaWdubWVudCcKYW5kIGBvcmctZXhwb3J0LXRhYmxlLWNlbGwtYm9yZGVycycgZXh0cmFj dCBpbmZvcm1hdGlvbiBmcm9tCmEgdGFibGUtY2VsbCBlbGVtZW50LgoKYG9yZy1leHBvcnQtdGFi bGUtZGltZW5zaW9ucycgZ2l2ZXMgdGhlIG51bWJlciBvbiByb3dzIGFuZCBjb2x1bW5zCmluIHRo ZSB0YWJsZSwgaWdub3JpbmcgaG9yaXpvbnRhbCBydWxlcyBhbmQgc3BlY2lhbCBjb2x1bW5zLgpg b3JnLWV4cG9ydC10YWJsZS1jZWxsLWFkZHJlc3MnLCBnaXZlbiBhIHRhYmxlLWNlbGwgb2JqZWN0 LCByZXR1cm5zCnRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIGEgY2VsbC4gT24gdGhlIG90aGVyIGhh bmQsCmBvcmctZXhwb3J0LWdldC10YWJsZS1jZWxsLWF0JyBkb2VzIHRoZSBjb250cmFyeS4KCmBv cmctZXhwb3J0LXRhYmxlLWNlbGwtc3RhcnRzLWNvbGdyb3VwLXAnLApgb3JnLWV4cG9ydC10YWJs ZS1jZWxsLWVuZHMtY29sZ3JvdXAtcCcsCmBvcmctZXhwb3J0LXRhYmxlLXJvdy1zdGFydHMtcm93 Z3JvdXAtcCcsCmBvcmctZXhwb3J0LXRhYmxlLXJvdy1lbmRzLXJvd2dyb3VwLXAnLApgb3JnLWV4 cG9ydC10YWJsZS1yb3ctc3RhcnRzLWhlYWRlci1wJyBhbmQKYG9yZy1leHBvcnQtdGFibGUtcm93 LWVuZHMtaGVhZGVyLXAnIGluZGljYXRlIHBvc2l0aW9uIG9mIGN1cnJlbnQKcm93IG9yIGNlbGwg d2l0aGluIHRoZSB0YWJsZS4KCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGRlZnVuIG9yZy1leHBv cnQtdGFibGUtaGFzLXNwZWNpYWwtY29sdW1uLXAgKHRhYmxlKQogICJOb24tbmlsIHdoZW4gVEFC TEUgaGFzIGEgc3BlY2lhbCBjb2x1bW4uCkFsbCBzcGVjaWFsIGNvbHVtbnMgd2lsbCBiZSBpZ25v cmVkIGR1cmluZyBleHBvcnQuIgogIDs7IFRoZSB0YWJsZSBoYXMgYSBzcGVjaWFsIGNvbHVtbiB3 aGVuIGV2ZXJ5IGZpcnN0IGNlbGwgb2YgZXZlcnkgcm93CiAgOzsgaGFzIGFuIGVtcHR5IHZhbHVl IG9yIGNvbnRhaW5zIGEgc3ltYm9sIGFtb25nICIvIiwgIiMiLCAiISIsICIkIiwKICA7OyAiKiIg Il8iIGFuZCAiXiIpCgooZGVmdW4gb3JnLWV4cG9ydC10YWJsZS1oYXMtaGVhZGVyLXAgKHRhYmxl IGluZm8pCiAgIk5vbi1uaWwgd2hlbiBUQUJMRSBoYXMgYSBoZWFkZXIuCgpJTkZPIGlzIGEgcGxp c3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbC4KCkEgdGFibGUgaGFzIGEgaGVhZGVy IHdoZW4gaXQgY29udGFpbnMgYXQgbGVhc3QgdHdvIHJvdyBncm91cHMuIikKCihkZWZ1biBvcmct ZXhwb3J0LXRhYmxlLXJvdy1pcy1zcGVjaWFsLXAgKHRhYmxlLXJvdyBpbmZvKQogICJOb24tbmls IGlmIFRBQkxFLVJPVyBpcyBjb25zaWRlcmVkIHNwZWNpYWwuCgpJTkZPIGlzIGEgcGxpc3QgdXNl ZCBhcyB0aGUgY29tbXVuaWNhdGlvbiBjaGFubmVsLgoKQWxsIHNwZWNpYWwgcm93cyB3aWxsIGJl IGlnbm9yZWQgZHVyaW5nIGV4cG9ydC4iKQoKKGRlZnVuIG9yZy1leHBvcnQtdGFibGUtcm93LWdy b3VwICh0YWJsZS1yb3cgaW5mbykKICAiUmV0dXJuIFRBQkxFLVJPVydzIGdyb3VwIG51bWJlciwg YXMgYW4gaW50ZWdlci4KCklORk8gaXMgYSBwbGlzdCB1c2VkIGFzIHRoZSBjb21tdW5pY2F0aW9u IGNoYW5uZWwuCgpSZXR1cm4gdmFsdWUgaXMgdGhlIGdyb3VwIG51bWJlciwgYXMgYW4gaW50ZWdl ciwgb3IgbmlsIGZvcgpzcGVjaWFsIHJvd3MgYW5kIHJvd3Mgc2VwYXJhdG9ycy4gIEZpcnN0IGdy b3VwIGlzIGFsc28gdGFibGUncwpoZWFkZXIuIikKCihkZWZ1biBvcmctZXhwb3J0LXRhYmxlLWNl bGwtd2lkdGggKHRhYmxlLWNlbGwgaW5mbykKICAiUmV0dXJuIFRBQkxFLUNFTEwgY29udGVudHMg d2lkdGguCgpJTkZPIGlzIGEgcGxpc3QgdXNlZCBhcyB0aGUgY29tbXVuaWNhdGlvbiBjaGFubmVs LgoKUmV0dXJuIHZhbHVlIGlzIHRoZSB3aWR0aCBnaXZlbiBieSB0aGUgbGFzdCB3aWR0aCBjb29r aWUgaW4gdGhlCnNhbWUgY29sdW1uIGFzIFRBQkxFLUNFTEwsIG9yIG5pbC4iKQoKKGRlZnVuIG9y Zy1leHBvcnQtdGFibGUtY2VsbC1hbGlnbm1lbnQgKHRhYmxlLWNlbGwgaW5mbykKICAiUmV0dXJu IFRBQkxFLUNFTEwgY29udGVudHMgYWxpZ25tZW50LgoKSU5GTyBpcyBhIHBsaXN0IHVzZWQgYXMg dGhlIGNvbW11bmljYXRpb24gY2hhbm5lbC4KClJldHVybiBhbGlnbm1lbnQgYXMgc3BlY2lmaWVk IGJ5IHRoZSBsYXN0IGFsaWdubWVudCBjb29raWUgaW4gdGhlCnNhbWUgY29sdW1uIGFzIFRBQkxF LUNFTEwuICBJZiBubyBzdWNoIGNvb2tpZSBpcyBmb3VuZCwgYSBkZWZhdWx0CmFsaWdubWVudCB2 YWx1ZSB3aWxsIGJlIGRlZHVjZWQgZnJvbSBmcmFjdGlvbiBvZiBudW1iZXJzIGluIHRoZQpjb2x1 bW4gKHNlZSBgb3JnLXRhYmxlLW51bWJlci1mcmFjdGlvbicgZm9yIG1vcmUgaW5mb3JtYXRpb24p LgpQb3NzaWJsZSB2YWx1ZXMgYXJlIGBsZWZ0JywgYHJpZ2h0JyBhbmQgYGNlbnRlcicuIikKCihk ZWZ1biBvcmctZXhwb3J0LXRhYmxlLWNlbGwtYm9yZGVycyAodGFibGUtY2VsbCBpbmZvKQogICJS ZXR1cm4gVEFCTEUtQ0VMTCBib3JkZXJzLgoKSU5GTyBpcyBhIHBsaXN0IHVzZWQgYXMgYSBjb21t dW5pY2F0aW9uIGNoYW5uZWwuCgpSZXR1cm4gdmFsdWUgaXMgYSBsaXN0IG9mIHN5bWJvbHMsIG9y IG5pbC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6CmB0b3AnLCBgYm90dG9tJywgYGFib3ZlJywgYGJl bG93JywgYGxlZnQnIGFuZCBgcmlnaHQnLiAgTm90ZToKYHRvcCcgKHJlc3AuIGBib3R0b20nKSBv bmx5IGhhcHBlbiBmb3IgYSBjZWxsIGluIHRoZSBmaXJzdApyb3cgKHJlc3AuIGxhc3Qgcm93KSBv ZiB0aGUgdGFibGUsIGlnbm9yaW5nIHRhYmxlIHJ1bGVzLCBpZiBhbnkuCgpSZXR1cm5lZCBib3Jk ZXJzIGlnbm9yZSBzcGVjaWFsIHJvd3MuIikKCihkZWZ1biBvcmctZXhwb3J0LXRhYmxlLWNlbGwt c3RhcnRzLWNvbGdyb3VwLXAgKHRhYmxlLWNlbGwgaW5mbykKICAiTm9uLW5pbCB3aGVuIFRBQkxF LUNFTEwgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHJvdyBncm91cC4KSU5GTyBpcyBhIHBsaXN0 IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuIikKCihkZWZ1biBvcmctZXhwb3J0LXRh YmxlLWNlbGwtZW5kcy1jb2xncm91cC1wICh0YWJsZS1jZWxsIGluZm8pCiAgIk5vbi1uaWwgd2hl biBUQUJMRS1DRUxMIGlzIGF0IHRoZSBlbmQgb2YgYSByb3cgZ3JvdXAuCklORk8gaXMgYSBwbGlz dCB1c2VkIGFzIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsLiIpCgooZGVmdW4gb3JnLWV4cG9ydC10 YWJsZS1yb3ctc3RhcnRzLXJvd2dyb3VwLXAgKHRhYmxlLXJvdyBpbmZvKQogICJOb24tbmlsIHdo ZW4gVEFCTEUtUk9XIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb2x1bW4gZ3JvdXAuCklORk8g aXMgYSBwbGlzdCB1c2VkIGFzIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsLiIpCgooZGVmdW4gb3Jn LWV4cG9ydC10YWJsZS1yb3ctZW5kcy1yb3dncm91cC1wICh0YWJsZS1yb3cgaW5mbykKICAiTm9u LW5pbCB3aGVuIFRBQkxFLVJPVyBpcyBhdCB0aGUgZW5kIG9mIGEgY29sdW1uIGdyb3VwLgpJTkZP IGlzIGEgcGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbC4iKQoKKGRlZnVuIG9y Zy1leHBvcnQtdGFibGUtcm93LXN0YXJ0cy1oZWFkZXItcCAodGFibGUtcm93IGluZm8pCiAgIk5v bi1uaWwgd2hlbiBUQUJMRS1ST1cgaXMgdGhlIGZpcnN0IHRhYmxlIGhlYWRlcidzIHJvdy4KSU5G TyBpcyBhIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuIikKCihkZWZ1biBv cmctZXhwb3J0LXRhYmxlLXJvdy1lbmRzLWhlYWRlci1wICh0YWJsZS1yb3cgaW5mbykKICAiTm9u LW5pbCB3aGVuIFRBQkxFLVJPVyBpcyB0aGUgbGFzdCB0YWJsZSBoZWFkZXIncyByb3cuCklORk8g aXMgYSBwbGlzdCB1c2VkIGFzIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsLiIpCgooZGVmdW4gb3Jn LWV4cG9ydC10YWJsZS1yb3ctbnVtYmVyICh0YWJsZS1yb3cgaW5mbykKICAiUmV0dXJuIFRBQkxF LVJPVyBudW1iZXIuCklORk8gaXMgYSBwbGlzdCB1c2VkIGFzIGEgY29tbXVuaWNhdGlvbiBjaGFu bmVsLiAgUmV0dXJuIHZhbHVlIGlzCnplcm8tYmFzZWQgYW5kIGlnbm9yZXMgc2VwYXJhdG9ycy4g IFRoZSBmdW5jdGlvbiByZXR1cm5zIG5pbCBmb3IKc3BlY2lhbCBjb2x1bXMgYW5kIHNlcGFyYXRv cnMuIikKCihkZWZ1biBvcmctZXhwb3J0LXRhYmxlLWRpbWVuc2lvbnMgKHRhYmxlIGluZm8pCiAg IlJldHVybiBUQUJMRSBkaW1lbnNpb25zLgoKSU5GTyBpcyBhIHBsaXN0IHVzZWQgYXMgYSBjb21t dW5pY2F0aW9uIGNoYW5uZWwuCgpSZXR1cm4gdmFsdWUgaXMgYSBDT05TIGxpa2UgKFJPV1MgLiBD T0xVTU5TKSB3aGVyZQpST1dTIChyZXNwLiBDT0xVTU5TKSBpcyB0aGUgbnVtYmVyIG9mIGV4cG9y dGFibGUKcm93cyAocmVzcC4gY29sdW1ucykuIikKCihkZWZ1biBvcmctZXhwb3J0LXRhYmxlLWNl bGwtYWRkcmVzcyAodGFibGUtY2VsbCBpbmZvKQogICJSZXR1cm4gYWRkcmVzcyBvZiBhIHJlZ3Vs YXIgVEFCTEUtQ0VMTCBvYmplY3QuCgpUQUJMRS1DRUxMIGlzIHRoZSBjZWxsIGNvbnNpZGVyZWQu ICBJTkZPIGlzIGEgcGxpc3QgdXNlZCBhcwphIGNvbW11bmljYXRpb24gY2hhbm5lbC4KCkFkZHJl c3MgaXMgYSBDT05TIGNlbGwgKFJPVyAuIENPTFVNTiksIHdoZXJlIFJPVyBhbmQgQ09MVU1OIGFy ZQp6ZXJvLWJhc2VkIGluZGV4LiAgT25seSBleHBvcnRhYmxlIGNlbGxzIGFyZSBjb25zaWRlcmVk LiAgVGhlCmZ1bmN0aW9uIHJldHVybnMgbmlsIGZvciBvdGhlciBjZWxscy4iKQoKKGRlZnVuIG9y Zy1leHBvcnQtZ2V0LXRhYmxlLWNlbGwtYXQgKGFkZHJlc3MgdGFibGUgaW5mbykKICAiUmV0dXJu IHJlZ3VsYXIgdGFibGUtY2VsbCBvYmplY3QgYXQgQUREUkVTUyBpbiBUQUJMRS4KCkFkZHJlc3Mg aXMgYSBDT05TIGNlbGwgKFJPVyAuIENPTFVNTiksIHdoZXJlIFJPVyBhbmQgQ09MVU1OIGFyZQp6 ZXJvLWJhc2VkIGluZGV4LiAgVEFCTEUgaXMgYSB0YWJsZSB0eXBlIGVsZW1lbnQuICBJTkZPIGlz CmEgcGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbC4KCklmIG5vIHRhYmxlLWNl bGwsIGFtb25nIGV4cG9ydGFibGUgY2VsbHMsIGlzIGZvdW5kIGF0IEFERFJFU1MsCnJldHVybiBu aWwuIikKCiMrZW5kX3NyYwoKKiogRm9yIFRhYmxlcyBPZiBDb250ZW50cwoKYG9yZy1leHBvcnQt Y29sbGVjdC1oZWFkbGluZXMnIGJ1aWxkcyBhIGxpc3Qgb2YgYWxsIGV4cG9ydGFibGUKaGVhZGxp bmUgZWxlbWVudHMsIG1heWJlIGxpbWl0ZWQgdG8gYSBjZXJ0YWluIGRlcHRoLiAgT25lIGNhbiB0 aGVuCmVhc2lseSBwYXJzZSBpdCBhbmQgdHJhbnNjb2RlIGl0LgoKQnVpbGRpbmcgbGlzdHMgb2Yg dGFibGVzLCBmaWd1cmVzIG9yIGxpc3RpbmdzIGlzIHF1aXRlIHNpbWlsYXIuCk9uY2UgdGhlIGdl bmVyaWMgZnVuY3Rpb24gYG9yZy1leHBvcnQtY29sbGVjdC1lbGVtZW50cycgaXMgZGVmaW5lZCwK YG9yZy1leHBvcnQtY29sbGVjdC10YWJsZXMnLCBgb3JnLWV4cG9ydC1jb2xsZWN0LWZpZ3VyZXMn IGFuZApgb3JnLWV4cG9ydC1jb2xsZWN0LWxpc3RpbmdzJyBjYW4gYmUgZGVyaXZlZCBmcm9tIGl0 LgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAooZGVmdW4gb3JnLWV4cG9ydC1jb2xsZWN0LWhlYWRs aW5lcyAoaW5mbyAmb3B0aW9uYWwgbikKICAiQ29sbGVjdCBoZWFkbGluZXMgaW4gb3JkZXIgdG8g YnVpbGQgYSB0YWJsZSBvZiBjb250ZW50cy4KCklORk8gaXMgYSBwbGlzdCB1c2VkIGFzIGEgY29t bXVuaWNhdGlvbiBjaGFubmVsLgoKV2hlbiBvcHRpb25hbCBhcmd1bWVudCBOIGlzIGFuIGludGVn ZXIsIGl0IHNwZWNpZmllcyB0aGUgZGVwdGggb2YKdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgT3Ro ZXJ3aXNlLCBpdCBpcyBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZQpsYXN0IGhlYWRsaW5lIGxldmVs LiAgU2VlIGBvcmctZXhwb3J0LWhlYWRsaW5lLWxldmVscycgZm9yIG1vcmUKaW5mb3JtYXRpb24u CgpSZXR1cm4gYSBsaXN0IG9mIGFsbCBleHBvcnRhYmxlIGhlYWRsaW5lcyBhcyBwYXJzZWQgZWxl bWVudHMuCkZvb3Rub3RlIHNlY3Rpb25zLCBpZiBhbnksIHdpbGwgYmUgaWdub3JlZC4iKQoKKGRl ZnVuIG9yZy1leHBvcnQtY29sbGVjdC1lbGVtZW50cyAodHlwZSBpbmZvICZvcHRpb25hbCBwcmVk aWNhdGUpCiAgIkNvbGxlY3QgcmVmZXJlbmNlYWJsZSBlbGVtZW50cyBvZiBhIGRldGVybWluZWQg dHlwZS4KClRZUEUgY2FuIGJlIGEgc3ltYm9sIG9yIGEgbGlzdCBvZiBzeW1ib2xzIHNwZWNpZnlp bmcgZWxlbWVudAp0eXBlcyB0byBzZWFyY2guICBPbmx5IGVsZW1lbnRzIHdpdGggYSBjYXB0aW9u IGFyZSBjb2xsZWN0ZWQuCgpJTkZPIGlzIGEgcGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24g Y2hhbm5lbC4KCldoZW4gbm9uLW5pbCwgb3B0aW9uYWwgYXJndW1lbnQgUFJFRElDQVRFIGlzIGEg ZnVuY3Rpb24gYWNjZXB0aW5nCm9uZSBhcmd1bWVudCwgYW4gZWxlbWVudCBvZiB0eXBlIFRZUEUu ICBJdCByZXR1cm5zIGEgbm9uLW5pbAp2YWx1ZSB3aGVuIHRoYXQgZWxlbWVudCBzaG91bGQgYmUg Y29sbGVjdGVkLgoKUmV0dXJuIGEgbGlzdCBvZiBhbGwgZWxlbWVudHMgZm91bmQsIGluIG9yZGVy IG9mIGFwcGVhcmFuY2UuIikKCihkZWZ1biBvcmctZXhwb3J0LWNvbGxlY3QtdGFibGVzIChpbmZv KQogICJCdWlsZCBhIGxpc3Qgb2YgdGFibGVzLgpJTkZPIGlzIGEgcGxpc3QgdXNlZCBhcyBhIGNv bW11bmljYXRpb24gY2hhbm5lbC4KClJldHVybiBhIGxpc3Qgb2YgdGFibGUgZWxlbWVudHMgd2l0 aCBhIGNhcHRpb24uIikKCihkZWZ1biBvcmctZXhwb3J0LWNvbGxlY3QtZmlndXJlcyAoaW5mbyBw cmVkaWNhdGUpCiAgIkJ1aWxkIGEgbGlzdCBvZiBmaWd1cmVzLgoKSU5GTyBpcyBhIHBsaXN0IHVz ZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuICBQUkVESUNBVEUgaXMKYSBmdW5jdGlvbiB3 aGljaCBhY2NlcHRzIG9uZSBhcmd1bWVudDogYSBwYXJhZ3JhcGggZWxlbWVudCBhbmQKd2hvc2Ug cmV0dXJuIHZhbHVlIGlzIG5vbi1uaWwgd2hlbiB0aGF0IGVsZW1lbnQgc2hvdWxkIGJlCmNvbGxl Y3RlZC4KCkEgZmlndXJlIGlzIGEgcGFyYWdyYXBoIHR5cGUgZWxlbWVudCwgd2l0aCBhIGNhcHRp b24sIHZlcmlmeWluZwpQUkVESUNBVEUuICBUaGUgbGF0dGVyIGhhcyB0byBiZSBwcm92aWRlZCBz aW5jZSBhIFwiZmlndXJlXCIgaXMKYSB2YWd1ZSBjb25jZXB0IHRoYXQgbWF5IGRlcGVuZCBvbiBi YWNrLWVuZC4KClJldHVybiBhIGxpc3Qgb2YgZWxlbWVudHMgcmVjb2duaXplZCBhcyBmaWd1cmVz LiIpCgooZGVmdW4gb3JnLWV4cG9ydC1jb2xsZWN0LWxpc3RpbmdzIChpbmZvKQogICJCdWlsZCBh IGxpc3Qgb2Ygc3JjIGJsb2Nrcy4KCklORk8gaXMgYSBwbGlzdCB1c2VkIGFzIGEgY29tbXVuaWNh dGlvbiBjaGFubmVsLgoKUmV0dXJuIGEgbGlzdCBvZiBzcmMtYmxvY2sgZWxlbWVudHMgd2l0aCBh IGNhcHRpb24uIikKCiMrZW5kX3NyYwoKKiogU21hcnQgUXVvdGVzCgpUaGUgbWFpbiBmdW5jdGlv biBmb3IgdGhlIHNtYXJ0IHF1b3RlcyBzdWItc3lzdGVtIGlzCmBvcmctZXhwb3J0LWFjdGl2YXRl LXNtYXJ0LXF1b3RlcycsIHdoaWNoIHJlcGxhY2VzIGV2ZXJ5IHF1b3RlIGluCmEgZ2l2ZW4gc3Ry aW5nIGZyb20gdGhlIHBhcnNlIHRyZWUgd2l0aCBpdHMgInNtYXJ0IiBjb3VudGVycGFydC4KCkRp Y3Rpb25hcnkgZm9yIHNtYXJ0IHF1b3RlcyBpcyBzdG9yZWQgaW4KYG9yZy1leHBvcnQtc21hcnQt cXVvdGVzLWFsaXN0Jy4KCkludGVybmFsbHksIHJlZ2V4cHMgbWF0Y2hpbmcgcG90ZW50aWFsIHNt YXJ0IHF1b3RlcyAoY2hlY2tzIGF0CnN0cmluZyBib3VuZGFyaWVzIGFyZSBhbHNvIG5lY2Vzc2Fy eSkgYXJlIGRlZmluZWQgaW4KYG9yZy1leHBvcnQtc21hcnQtcXVvdGVzLXJlZ2V4cHMnLgoKIyti ZWdpbl9zcmMgZW1hY3MtbGlzcAooZGVmY29uc3Qgb3JnLWV4cG9ydC1zbWFydC1xdW90ZXMtYWxp c3QKICAnKCgiZGUiCiAgICAgKG9wZW5pbmctZG91YmxlLXF1b3RlIDp1dGYtOCAi4oCeIiA6aHRt bCAiJmJkcXVvOyIgOmxhdGV4ICJcImAiCgkJCSAgIDp0ZXhpbmZvICJAcXVvdGVkYmxiYXNle30i KQogICAgIChjbG9zaW5nLWRvdWJsZS1xdW90ZSA6dXRmLTggIuKAnCIgOmh0bWwgIiZsZHF1bzsi IDpsYXRleCAiXCInIgoJCQkgICA6dGV4aW5mbyAiQHF1b3RlZGJsbGVmdHt9IikKICAgICAob3Bl bmluZy1zaW5nbGUtcXVvdGUgOnV0Zi04ICLigJoiIDpodG1sICImc2JxdW87IiA6bGF0ZXggIlxc Z2xxe30iCgkJCSAgIDp0ZXhpbmZvICJAcXVvdGVzaW5nbGJhc2V7fSIpCiAgICAgKGNsb3Npbmct c2luZ2xlLXF1b3RlIDp1dGYtOCAi4oCYIiA6aHRtbCAiJmxzcXVvOyIgOmxhdGV4ICJcXGdycXt9 IgoJCQkgICA6dGV4aW5mbyAiQHF1b3RlbGVmdHt9IikKICAgICAoYXBvc3Ryb3BoZSA6dXRmLTgg IuKAmSIgOmh0bWwgIiZyc3F1bzsiKSkKICAgICgiZW4iCiAgICAgKG9wZW5pbmctZG91YmxlLXF1 b3RlIDp1dGYtOCAi4oCcIiA6aHRtbCAiJmxkcXVvOyIgOmxhdGV4ICJgYCIgOnRleGluZm8gImBg IikKICAgICAoY2xvc2luZy1kb3VibGUtcXVvdGUgOnV0Zi04ICLigJ0iIDpodG1sICImcmRxdW87 IiA6bGF0ZXggIicnIiA6dGV4aW5mbyAiJyciKQogICAgIChvcGVuaW5nLXNpbmdsZS1xdW90ZSA6 dXRmLTggIuKAmCIgOmh0bWwgIiZsc3F1bzsiIDpsYXRleCAiYCIgOnRleGluZm8gImAiKQogICAg IChjbG9zaW5nLXNpbmdsZS1xdW90ZSA6dXRmLTggIuKAmSIgOmh0bWwgIiZyc3F1bzsiIDpsYXRl eCAiJyIgOnRleGluZm8gIiciKQogICAgIChhcG9zdHJvcGhlIDp1dGYtOCAi4oCZIiA6aHRtbCAi JnJzcXVvOyIpKQogICAgKCJlcyIKICAgICAob3BlbmluZy1kb3VibGUtcXVvdGUgOnV0Zi04ICLC qyIgOmh0bWwgIiZsYXF1bzsiIDpsYXRleCAiXFxndWlsbGVtb3RsZWZ0e30iCgkJCSAgIDp0ZXhp bmZvICJAZ3VpbGxlbWV0bGVmdHt9IikKICAgICAoY2xvc2luZy1kb3VibGUtcXVvdGUgOnV0Zi04 ICLCuyIgOmh0bWwgIiZyYXF1bzsiIDpsYXRleCAiXFxndWlsbGVtb3RyaWdodHt9IgoJCQkgICA6 dGV4aW5mbyAiQGd1aWxsZW1ldHJpZ2h0e30iKQogICAgIChvcGVuaW5nLXNpbmdsZS1xdW90ZSA6 dXRmLTggIuKAnCIgOmh0bWwgIiZsZHF1bzsiIDpsYXRleCAiYGAiIDp0ZXhpbmZvICJgYCIpCiAg ICAgKGNsb3Npbmctc2luZ2xlLXF1b3RlIDp1dGYtOCAi4oCdIiA6aHRtbCAiJnJkcXVvOyIgOmxh dGV4ICInJyIgOnRleGluZm8gIicnIikKICAgICAoYXBvc3Ryb3BoZSA6dXRmLTggIuKAmSIgOmh0 bWwgIiZyc3F1bzsiKSkKICAgICgiZnIiCiAgICAgKG9wZW5pbmctZG91YmxlLXF1b3RlIDp1dGYt OCAiwqvCoCIgOmh0bWwgIiZsYXF1bzsmbmJzcDsiIDpsYXRleCAiXFxvZyAiCgkJCSAgIDp0ZXhp bmZvICJAZ3VpbGxlbWV0bGVmdHt9QHRpZXt9IikKICAgICAoY2xvc2luZy1kb3VibGUtcXVvdGUg OnV0Zi04ICLCoMK7IiA6aHRtbCAiJm5ic3A7JnJhcXVvOyIgOmxhdGV4ICJcXGZne30iCgkJCSAg IDp0ZXhpbmZvICJAdGlle31AZ3VpbGxlbWV0cmlnaHR7fSIpCiAgICAgKG9wZW5pbmctc2luZ2xl LXF1b3RlIDp1dGYtOCAiwqvCoCIgOmh0bWwgIiZsYXF1bzsmbmJzcDsiIDpsYXRleCAiXFxvZyAi CgkJCSAgIDp0ZXhpbmZvICJAZ3VpbGxlbWV0bGVmdHt9QHRpZXt9IikKICAgICAoY2xvc2luZy1z aW5nbGUtcXVvdGUgOnV0Zi04ICLCoMK7IiA6aHRtbCAiJm5ic3A7JnJhcXVvOyIgOmxhdGV4ICJc XGZne30iCgkJCSAgIDp0ZXhpbmZvICJAdGlle31AZ3VpbGxlbWV0cmlnaHR7fSIpCiAgICAgKGFw b3N0cm9waGUgOnV0Zi04ICLigJkiIDpodG1sICImcnNxdW87IikpKQogICJTbWFydCBxdW90ZXMg dHJhbnNsYXRpb25zLgoKQWxpc3Qgd2hvc2UgQ0FSIGlzIGEgbGFuZ3VhZ2Ugc3RyaW5nIGFuZCBD RFIgaXMgYW4gYWxpc3Qgd2l0aApxdW90ZSB0eXBlIGFzIGtleSBhbmQgYSBwbGlzdCBhc3NvY2lh dGluZyB2YXJpb3VzIGVuY29kaW5ncyB0bwp0aGVpciB0cmFuc2xhdGlvbiBhcyB2YWx1ZS4KCkEg cXVvdGUgdHlwZSBjYW4gYmUgYW55IHN5bWJvbCBhbW9uZyBgb3BlbmluZy1kb3VibGUtcXVvdGUn LApgY2xvc2luZy1kb3VibGUtcXVvdGUnLCBgb3BlbmluZy1zaW5nbGUtcXVvdGUnLApgY2xvc2lu Zy1zaW5nbGUtcXVvdGUnIGFuZCBgYXBvc3Ryb3BoZScuCgpWYWxpZCBlbmNvZGluZ3MgaW5jbHVk ZSBgOnV0Zi04JywgYDpodG1sJywgYDpsYXRleCcgYW5kCmA6dGV4aW5mbycuCgpJZiBubyB0cmFu c2xhdGlvbiBpcyBmb3VuZCwgdGhlIHF1b3RlIGNoYXJhY3RlciBpcyBsZWZ0IGFzLWlzLiIpCgoo ZGVmY29uc3Qgb3JnLWV4cG9ydC1zbWFydC1xdW90ZXMtcmVnZXhwcwogIChsaXN0CiAgIDs7IFBv c3NpYmxlIG9wZW5pbmcgcXVvdGUgYXQgYmVnaW5uaW5nIG9mIHN0cmluZy4KICAgIlxcYFxcKFtc IiddXFwpXFwoXFx3XFx8XFxzLlxcfFxcc19cXCkiCiAgIDs7IFBvc3NpYmxlIGNsb3NpbmcgcXVv dGUgYXQgYmVnaW5uaW5nIG9mIHN0cmluZy4KICAgIlxcYFxcKFtcIiddXFwpXFwoXFxzLVxcfFxc cylcXHxcXHMuXFwpIgogICA7OyBQb3NzaWJsZSBhcG9zdHJvcGhlIGF0IGJlZ2lubmluZyBvZiBz dHJpbmcuCiAgICJcXGBcXCgnXFwpXFxTLSIKICAgOzsgT3BlbmluZyBzaW5nbGUgYW5kIGRvdWJs ZSBxdW90ZXMuCiAgICJcXCg/Olxccy1cXHxcXHMoXFwpXFwoW1wiJ11cXClcXCg/Olxcd1xcfFxc cy5cXHxcXHNfXFwpIgogICA7OyBDbG9zaW5nIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlcy4KICAg IlxcKD86XFx3XFx8XFxzLlxcfFxcc19cXClcXChbXCInXVxcKVxcKD86XFxzLVxcfFxccylcXHxc XHMuXFwpIgogICA7OyBBcG9zdHJvcGhlLgogICAiXFxTLVxcKCdcXClcXFMtIgogICA7OyBQb3Nz aWJsZSBvcGVuaW5nIHF1b3RlIGF0IGVuZCBvZiBzdHJpbmcuCiAgICJcXCg/Olxccy1cXHxcXHMo XFwpXFwoW1wiJ11cXClcXCciCiAgIDs7IFBvc3NpYmxlIGNsb3NpbmcgcXVvdGUgYXQgZW5kIG9m IHN0cmluZy4KICAgIlxcKD86XFx3XFx8XFxzLlxcfFxcc19cXClcXChbXCInXVxcKVxcJyIKICAg OzsgUG9zc2libGUgYXBvc3Ryb3BoZSBhdCBlbmQgb2Ygc3RyaW5nLgogICAiXFxTLVxcKCdcXClc XCciKQogICJMaXN0IG9mIHJlZ2V4cHMgbWF0Y2hpbmcgYSBxdW90ZSBvciBhbiBhcG9zdHJvcGhl LgpJbiBldmVyeSByZWdleHAsIHF1b3RlIG9yIGFwb3N0cm9waGUgbWF0Y2hlZCBpcyBwdXQgaW4g Z3JvdXAgMS4iKQoKKGRlZnVuIG9yZy1leHBvcnQtYWN0aXZhdGUtc21hcnQtcXVvdGVzIChzIGVu Y29kaW5nIGluZm8gJm9wdGlvbmFsIG9yaWdpbmFsKQogICJSZXBsYWNlIHJlZ3VsYXIgcXVvdGVz IHdpdGggXCJzbWFydFwiIHF1b3RlcyBpbiBzdHJpbmcgUy4KCkVOQ09ESU5HIGlzIGEgc3ltYm9s IGFtb25nIGA6aHRtbCcsIGA6bGF0ZXgnLCBgOnRleGluZm8nIGFuZApgOnV0Zi04Jy4gIElORk8g aXMgYSBwbGlzdCB1c2VkIGFzIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsLgoKVGhlIGZ1bmN0aW9u IGhhcyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBzdHJpbmcKc3Vycm91bmRpbmdzIGlu IHBhcnNlIHRyZWUuICBJdCBjYW4gb25seSBoYXBwZW4gd2l0aCBhbgp1bm1vZGlmaWVkIHN0cmlu Zy4gIFRodXMsIGlmIFMgaGFzIGFscmVhZHkgYmVlbiB0aHJvdWdoIGFub3RoZXIKcHJvY2Vzcywg YSBub24tbmlsIE9SSUdJTkFMIG9wdGlvbmFsIGFyZ3VtZW50IHdpbGwgcHJvdmlkZSB0aGF0Cm9y aWdpbmFsIHN0cmluZy4KClJldHVybiB0aGUgbmV3IHN0cmluZy4iKQojK2VuZF9zcmMKCioqIFRv cG9sb2d5CgpIZXJlIGFyZSB2YXJpb3VzIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlv biBhYm91dCB0aGUKbmVpZ2hib3VyaG9vZCBvZiBhIGdpdmVuIGVsZW1lbnQgb3Igb2JqZWN0LiAg TmVpZ2hib3VycyBvZiBpbnRlcmVzdAphcmUgZGlyZWN0IHBhcmVudCAoYG9yZy1leHBvcnQtZ2V0 LXBhcmVudCcpLCBwYXJlbnQgaGVhZGxpbmUKKGBvcmctZXhwb3J0LWdldC1wYXJlbnQtaGVhZGxp bmUnKSwgZmlyc3QgZWxlbWVudCBjb250YWluaW5nIGFuCm9iamVjdCwgKGBvcmctZXhwb3J0LWdl dC1wYXJlbnQtZWxlbWVudCcpLCBwYXJlbnQgdGFibGUKKGBvcmctZXhwb3J0LWdldC1wYXJlbnQt dGFibGUnKSwgcHJldmlvdXMgZWxlbWVudCBvciBvYmplY3QKKGBvcmctZXhwb3J0LWdldC1wcmV2 aW91cy1lbGVtZW50JykgYW5kIG5leHQgZWxlbWVudCBvciBvYmplY3QKKGBvcmctZXhwb3J0LWdl dC1uZXh0LWVsZW1lbnQnKS4KCmBvcmctZXhwb3J0LWdldC1nZW5lYWxvZ3knIHJldHVybnMgdGhl IGZ1bGwgZ2VuZWFsb2d5IG9mIGEgZ2l2ZW4KZWxlbWVudCBvciBvYmplY3QsIGZyb20gY2xvc2Vz dCBwYXJlbnQgdG8gZnVsbCBwYXJzZSB0cmVlLgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAooZGVm c3Vic3Qgb3JnLWV4cG9ydC1nZXQtcGFyZW50IChibG9iKQogICJSZXR1cm4gQkxPQiBwYXJlbnQg b3IgbmlsLgpCTE9CIGlzIHRoZSBlbGVtZW50IG9yIG9iamVjdCBjb25zaWRlcmVkLiIpCgooZGVm dW4gb3JnLWV4cG9ydC1nZXQtZ2VuZWFsb2d5IChibG9iKQogICJSZXR1cm4gZnVsbCBnZW5lYWxv Z3kgcmVsYXRpdmUgdG8gYSBnaXZlbiBlbGVtZW50IG9yIG9iamVjdC4KCkJMT0IgaXMgdGhlIGVs ZW1lbnQgb3Igb2JqZWN0IGJlaW5nIGNvbnNpZGVyZWQuCgpBbmNlc3RvcnMgYXJlIHJldHVybmVk IGZyb20gY2xvc2VzdCB0byBmYXJ0aGVzdCwgdGhlIGxhc3Qgb25lCmJlaW5nIHRoZSBmdWxsIHBh cnNlIHRyZWUuIikKCihkZWZ1biBvcmctZXhwb3J0LWdldC1wYXJlbnQtaGVhZGxpbmUgKGJsb2Ip CiAgIlJldHVybiBCTE9CIHBhcmVudCBoZWFkbGluZSBvciBuaWwuCkJMT0IgaXMgdGhlIGVsZW1l bnQgb3Igb2JqZWN0IGJlaW5nIGNvbnNpZGVyZWQuIikKCihkZWZ1biBvcmctZXhwb3J0LWdldC1w YXJlbnQtZWxlbWVudCAob2JqZWN0KQogICJSZXR1cm4gZmlyc3QgZWxlbWVudCBjb250YWluaW5n IE9CSkVDVCBvciBuaWwuCk9CSkVDVCBpcyB0aGUgb2JqZWN0IHRvIGNvbnNpZGVyLiIpCgooZGVm dW4gb3JnLWV4cG9ydC1nZXQtcGFyZW50LXRhYmxlIChvYmplY3QpCiAgIlJldHVybiBPQkpFQ1Qg cGFyZW50IHRhYmxlIG9yIG5pbC4KT0JKRUNUIGlzIGVpdGhlciBhIGB0YWJsZS1jZWxsJyBvciBg dGFibGUtZWxlbWVudCcgdHlwZSBvYmplY3QuIikKCihkZWZ1biBvcmctZXhwb3J0LWdldC1wcmV2 aW91cy1lbGVtZW50IChibG9iIGluZm8gJm9wdGlvbmFsIG4pCiAgIlJldHVybiBwcmV2aW91cyBl bGVtZW50IG9yIG9iamVjdC4KCkJMT0IgaXMgYW4gZWxlbWVudCBvciBvYmplY3QuICBJTkZPIGlz IGEgcGxpc3QgdXNlZCBhcwphIGNvbW11bmljYXRpb24gY2hhbm5lbC4gIFJldHVybiBwcmV2aW91 cyBleHBvcnRhYmxlIGVsZW1lbnQgb3IKb2JqZWN0LCBhIHN0cmluZywgb3IgbmlsLgoKV2hlbiBv cHRpb25hbCBhcmd1bWVudCBOIGlzIGEgcG9zaXRpdmUgaW50ZWdlciwgcmV0dXJuIGEgbGlzdApj b250YWluaW5nIHVwIHRvIE4gc2libGluZ3MgYmVmb3JlIEJMT0IsIGZyb20gZmFydGhlc3QgdG8K Y2xvc2VzdC4gIFdpdGggYW55IG90aGVyIG5vbi1uaWwgdmFsdWUsIHJldHVybiBhIGxpc3QgY29u dGFpbmluZwphbGwgb2YgdGhlbS4iKQoKKGRlZnVuIG9yZy1leHBvcnQtZ2V0LW5leHQtZWxlbWVu dCAoYmxvYiBpbmZvICZvcHRpb25hbCBuKQogICJSZXR1cm4gbmV4dCBlbGVtZW50IG9yIG9iamVj dC4KCkJMT0IgaXMgYW4gZWxlbWVudCBvciBvYmplY3QuICBJTkZPIGlzIGEgcGxpc3QgdXNlZCBh cwphIGNvbW11bmljYXRpb24gY2hhbm5lbC4gIFJldHVybiBuZXh0IGV4cG9ydGFibGUgZWxlbWVu dCBvcgpvYmplY3QsIGEgc3RyaW5nLCBvciBuaWwuCgpXaGVuIG9wdGlvbmFsIGFyZ3VtZW50IE4g aXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLCByZXR1cm4gYSBsaXN0CmNvbnRhaW5pbmcgdXAgdG8gTiBz aWJsaW5ncyBhZnRlciBCTE9CLCBmcm9tIGNsb3Nlc3QgdG8gZmFydGhlc3QuCldpdGggYW55IG90 aGVyIG5vbi1uaWwgdmFsdWUsIHJldHVybiBhIGxpc3QgY29udGFpbmluZyBhbGwgb2YKdGhlbS4i KQoKIytlbmRfc3JjCgoqKiBUcmFuc2xhdGlvbgoKYG9yZy1leHBvcnQtdHJhbnNsYXRlJyB0cmFu c2xhdGVzIGEgc3RyaW5nIGFjY29yZGluZyB0byBsYW5ndWFnZQpzcGVjaWZpZWQgYnkgTEFOR1VB R0Uga2V5d29yZCBvciBgb3JnLWV4cG9ydC1sYW5ndWFnZS1zZXR1cCcKdmFyaWFibGUgYW5kIGEg c3BlY2lmaWVkIGNoYXJzZXQuICBgb3JnLWV4cG9ydC1kaWN0aW9uYXJ5JyBjb250YWlucwp0aGUg ZGljdGlvbmFyeSB1c2VkIGZvciB0aGUgdHJhbnNsYXRpb24uCgojK2JlZ2luX3NyYyBlbWFjcy1s aXNwCihkZWZjb25zdCBvcmctZXhwb3J0LWRpY3Rpb25hcnkKICAnKCgiQXV0aG9yIgogICAgICgi Y2EiIDpkZWZhdWx0ICJBdXRvciIpCiAgICAgKCJjcyIgOmRlZmF1bHQgIkF1dG9yIikKICAgICAo ImRhIiA6ZGVmYXVsdCAiT3BoYXZzbWFuZCIpCiAgICAgKCJkZSIgOmRlZmF1bHQgIkF1dG9yIikK ICAgICAoImVvIiA6aHRtbCAiQSYjMzY1O3Rvcm8iKQogICAgICgiZXMiIDpkZWZhdWx0ICJBdXRv ciIpCiAgICAgKCJmaSIgOmh0bWwgIlRla2lqJmF1bWw7IikKICAgICAoImZyIiA6ZGVmYXVsdCAi QXV0ZXVyIikKICAgICAoImh1IiA6ZGVmYXVsdCAiU3plcnomb3RpbGRlOyIpCiAgICAgKCJpcyIg Omh0bWwgIkgmb3VtbDtmdW5kdXIiKQogICAgICgiaXQiIDpkZWZhdWx0ICJBdXRvcmUiKQogICAg ICgiamEiIDpodG1sICImIzMzODc5OyYjMzI3NzM7IiA6dXRmLTggIuiRl+iAhSIpCiAgICAgKCJu bCIgOmRlZmF1bHQgIkF1dGV1ciIpCiAgICAgKCJubyIgOmRlZmF1bHQgIkZvcmZhdHRlciIpCiAg ICAgKCJuYiIgOmRlZmF1bHQgIkZvcmZhdHRlciIpCiAgICAgKCJubiIgOmRlZmF1bHQgIkZvcmZh dHRhciIpCiAgICAgKCJwbCIgOmRlZmF1bHQgIkF1dG9yIikKICAgICAoInJ1IiA6aHRtbCAiJiMx MDQwOyYjMTA3NDsmIzEwOTA7JiMxMDg2OyYjMTA4ODsiIDp1dGYtOCAi0JDQstGC0L7RgCIpCiAg ICAgKCJzdiIgOmh0bWwgIkYmb3VtbDtyZmF0dGFyZSIpCiAgICAgKCJ1ayIgOmh0bWwgIiYjMTA0 MDsmIzEwNzQ7JiMxMDkwOyYjMTA4NjsmIzEwODg7IiA6dXRmLTggItCQ0LLRgtC+0YAiKQogICAg ICgiemgtQ04iIDpodG1sICImIzIwMzE2OyYjMzI3NzM7IiA6dXRmLTggIuS9nOiAhSIpCiAgICAg KCJ6aC1UVyIgOmh0bWwgIiYjMjAzMTY7JiMzMjc3MzsiIDp1dGYtOCAi5L2c6ICFIikpCiAgICAo IkRhdGUiCiAgICAgKCJjYSIgOmRlZmF1bHQgIkRhdGEiKQogICAgICgiY3MiIDpkZWZhdWx0ICJE YXR1bSIpCiAgICAgKCJkYSIgOmRlZmF1bHQgIkRhdG8iKQogICAgICgiZGUiIDpkZWZhdWx0ICJE YXR1bSIpCiAgICAgKCJlbyIgOmRlZmF1bHQgIkRhdG8iKQogICAgICgiZXMiIDpkZWZhdWx0ICJG ZWNoYSIpCiAgICAgKCJmaSIgOmh0bWwgIlAmYXVtbDtpdiZhdW1sO20mYXVtbDsmYXVtbDtyJmF1 bWw7IikKICAgICAoImh1IiA6aHRtbCAiRCZhYWN1dGU7dHVtIikKICAgICAoImlzIiA6ZGVmYXVs dCAiRGFnc2V0bmluZyIpCiAgICAgKCJpdCIgOmRlZmF1bHQgIkRhdGEiKQogICAgICgiamEiIDpo dG1sICImIzI2MDg1OyYjMjAxODQ7IiA6dXRmLTggIuaXpeS7mCIpCiAgICAgKCJubCIgOmRlZmF1 bHQgIkRhdHVtIikKICAgICAoIm5vIiA6ZGVmYXVsdCAiRGF0byIpCiAgICAgKCJuYiIgOmRlZmF1 bHQgIkRhdG8iKQogICAgICgibm4iIDpkZWZhdWx0ICJEYXRvIikKICAgICAoInBsIiA6ZGVmYXVs dCAiRGF0YSIpCiAgICAgKCJydSIgOmh0bWwgIiYjMTA0NDsmIzEwNzI7JiMxMDkwOyYjMTA3Mjsi IDp1dGYtOCAi0JTQsNGC0LAiKQogICAgICgic3YiIDpkZWZhdWx0ICJEYXR1bSIpCiAgICAgKCJ1 ayIgOmh0bWwgIiYjMTA0NDsmIzEwNzI7JiMxMDkwOyYjMTA3MjsiIDp1dGYtOCAi0JTQsNGC0LAi KQogICAgICgiemgtQ04iIDpodG1sICImIzI2MDg1OyYjMjYzOTk7IiA6dXRmLTggIuaXpeacnyIp CiAgICAgKCJ6aC1UVyIgOmh0bWwgIiYjMjYwODU7JiMyNjM5OTsiIDp1dGYtOCAi5pel5pyfIikp CiAgICAoIkVxdWF0aW9uIgogICAgICgiZnIiIDphc2NpaSAiRXF1YXRpb24iIDpkZWZhdWx0ICLD iXF1YXRpb24iKSkKICAgICgiRmlndXJlIikKICAgICgiRm9vdG5vdGVzIgogICAgICgiY2EiIDpo dG1sICJQZXVzIGRlIHAmYWdyYXZlO2dpbmEiKQogICAgICgiY3MiIDpkZWZhdWx0ICJQb3puXHhl MW1reSBwb2QgY2Fyb3UiKQogICAgICgiZGEiIDpkZWZhdWx0ICJGb2Rub3RlciIpCiAgICAgKCJk ZSIgOmh0bWwgIkZ1JnN6bGlnO25vdGVuIikKICAgICAoImVvIiA6ZGVmYXVsdCAiUGllZG5vdG9q IikKICAgICAoImVzIiA6aHRtbCAiUGllcyBkZSBwJmFhY3V0ZTtnaW5hIikKICAgICAoImZpIiA6 ZGVmYXVsdCAiQWxhdmlpdHRlZXQiKQogICAgICgiZnIiIDpkZWZhdWx0ICJOb3RlcyBkZSBiYXMg ZGUgcGFnZSIpCiAgICAgKCJodSIgOmh0bWwgIkwmYWFjdXRlO2JqZWd5emV0IikKICAgICAoImlz IiA6aHRtbCAiQWZ0YW5tJmFhY3V0ZTtsc2dyZWluYXIiKQogICAgICgiaXQiIDpodG1sICJOb3Rl IGEgcGkmZWdyYXZlOyBkaSBwYWdpbmEiKQogICAgICgiamEiIDpodG1sICImIzMzMDUwOyYjMjc4 ODA7IiA6dXRmLTggIuiEmuazqCIpCiAgICAgKCJubCIgOmRlZmF1bHQgIlZvZXRub3RlbiIpCiAg ICAgKCJubyIgOmRlZmF1bHQgIkZvdG5vdGVyIikKICAgICAoIm5iIiA6ZGVmYXVsdCAiRm90bm90 ZXIiKQogICAgICgibm4iIDpkZWZhdWx0ICJGb3Rub3RhciIpCiAgICAgKCJwbCIgOmRlZmF1bHQg IlByenlwaXMiKQogICAgICgicnUiIDpodG1sICImIzEwNTc7JiMxMDg1OyYjMTA4NjsmIzEwODk7 JiMxMDgyOyYjMTA4MDsiIDp1dGYtOCAi0KHQvdC+0YHQutC4IikKICAgICAoInN2IiA6ZGVmYXVs dCAiRm90bm90ZXIiKQogICAgICgidWsiIDpodG1sICImIzEwNTU7JiMxMDg4OyYjMTA4MDsmIzEw ODQ7JiMxMTEwOyYjMTA5MDsmIzEwODI7JiMxMDgwOyIKICAgICAgOnV0Zi04ICLQn9GA0LjQvNGW 0YLQutC4IikKICAgICAoInpoLUNOIiA6aHRtbCAiJiMzMzA1MDsmIzI3ODgwOyIgOnV0Zi04ICLo hJrms6giKQogICAgICgiemgtVFciIDpodG1sICImIzMzMTM5OyYjMzUzODc7IiA6dXRmLTggIuiF s+iouyIpKQogICAgKCJMaXN0IG9mIExpc3RpbmdzIgogICAgICgiZnIiIDpkZWZhdWx0ICJMaXN0 ZSBkZXMgcHJvZ3JhbW1lcyIpKQogICAgKCJMaXN0IG9mIFRhYmxlcyIKICAgICAoImZyIiA6ZGVm YXVsdCAiTGlzdGUgZGVzIHRhYmxlYXV4IikpCiAgICAoIkxpc3RpbmcgJWQ6IgogICAgICgiZnIi CiAgICAgIDphc2NpaSAiUHJvZ3JhbW1lICVkIDoiIDpkZWZhdWx0ICJQcm9ncmFtbWUgbsK6ICVk IDoiCiAgICAgIDpsYXRpbjEgIlByb2dyYW1tZSAlZCA6IikpCiAgICAoIkxpc3RpbmcgJWQ6ICVz IgogICAgICgiZnIiCiAgICAgIDphc2NpaSAiUHJvZ3JhbW1lICVkIDogJXMiIDpkZWZhdWx0ICJQ cm9ncmFtbWUgbsK6ICVkIDogJXMiCiAgICAgIDpsYXRpbjEgIlByb2dyYW1tZSAlZCA6ICVzIikp CiAgICAoIlNlZSBzZWN0aW9uICVzIgogICAgICgiZnIiIDpkZWZhdWx0ICJjZi4gc2VjdGlvbiAl cyIpKQogICAgKCJUYWJsZSAlZDoiCiAgICAgKCJmciIKICAgICAgOmFzY2lpICJUYWJsZWF1ICVk IDoiIDpkZWZhdWx0ICJUYWJsZWF1IG7CuiAlZCA6IiA6bGF0aW4xICJUYWJsZWF1ICVkIDoiKSkK ICAgICgiVGFibGUgJWQ6ICVzIgogICAgICgiZnIiCiAgICAgIDphc2NpaSAiVGFibGVhdSAlZCA6 ICVzIiA6ZGVmYXVsdCAiVGFibGVhdSBuwrogJWQgOiAlcyIKICAgICAgOmxhdGluMSAiVGFibGVh dSAlZCA6ICVzIikpCiAgICAoIlRhYmxlIG9mIENvbnRlbnRzIgogICAgICgiY2EiIDpodG1sICIm SWFjdXRlO25kZXgiKQogICAgICgiY3MiIDpkZWZhdWx0ICJPYnNhaCIpCiAgICAgKCJkYSIgOmRl ZmF1bHQgIkluZGhvbGQiKQogICAgICgiZGUiIDpkZWZhdWx0ICJJbmhhbHRzdmVyemVpY2huaXMi KQogICAgICgiZW8iIDpkZWZhdWx0ICJFbmhhdm8iKQogICAgICgiZXMiIDpodG1sICImSWFjdXRl O25kaWNlIikKICAgICAoImZpIiA6aHRtbCAiU2lzJmF1bWw7bGx5c2x1ZXR0ZWxvIikKICAgICAo ImZyIiA6YXNjaWkgIlNvbW1haXJlIiA6ZGVmYXVsdCAiVGFibGUgZGVzIG1hdGnDqHJlcyIpCiAg ICAgKCJodSIgOmh0bWwgIlRhcnRhbG9tamVneXomZWFjdXRlO2siKQogICAgICgiaXMiIDpkZWZh dWx0ICJFZm5pc3lmaXJsaXQiKQogICAgICgiaXQiIDpkZWZhdWx0ICJJbmRpY2UiKQogICAgICgi amEiIDpodG1sICImIzMwNDQ2OyYjMjc0MjU7IiA6dXRmLTggIuebruasoSIpCiAgICAgKCJubCIg OmRlZmF1bHQgIkluaG91ZHNvcGdhdmUiKQogICAgICgibm8iIDpkZWZhdWx0ICJJbm5ob2xkIikK ICAgICAoIm5iIiA6ZGVmYXVsdCAiSW5uaG9sZCIpCiAgICAgKCJubiIgOmRlZmF1bHQgIklubmhh bGQiKQogICAgICgicGwiIDpodG1sICJTcGlzIHRyZSYjeDAxNWI7Y2kiKQogICAgICgicnUiIDpo dG1sICImIzEwNTc7JiMxMDg2OyYjMTA3NjsmIzEwNzc7JiMxMDg4OyYjMTA3ODsmIzEwNzI7JiMx MDg1OyYjMTA4MDsmIzEwNzc7IgogICAgICA6dXRmLTggItCh0L7QtNC10YDQttCw0L3QuNC1IikK ICAgICAoInN2IiA6aHRtbCAiSW5uZWgmYXJpbmc7bGwiKQogICAgICgidWsiIDpodG1sICImIzEw NDc7JiMxMDg0OyYjMTExMDsmIzEwODk7JiMxMDkwOyIgOnV0Zi04ICLQl9C80ZbRgdGCIikKICAg ICAoInpoLUNOIiA6aHRtbCAiJiMzMDQ0NjsmIzI0NDA1OyIgOnV0Zi04ICLnm67lvZUiKQogICAg ICgiemgtVFciIDpodG1sICImIzMwNDQ2OyYjMzc2MzY7IiA6dXRmLTggIuebrumMhCIpKQogICAg KCJVbmtub3duIHJlZmVyZW5jZSIKICAgICAoImZyIiA6YXNjaWkgIkRlc3RpbmF0aW9uIGluY29u bnVlIiA6ZGVmYXVsdCAiUsOpZsOpcmVuY2UgaW5jb25udWUiKSkpCiAgIkRpY3Rpb25hcnkgZm9y IGV4cG9ydCBlbmdpbmUuCgpBbGlzdCB3aG9zZSBDQVIgaXMgdGhlIHN0cmluZyB0byB0cmFuc2xh dGUgYW5kIENEUiBpcyBhbiBhbGlzdAp3aG9zZSBDQVIgaXMgdGhlIGxhbmd1YWdlIHN0cmluZyBh bmQgQ0RSIGlzIGEgcGxpc3Qgd2hvc2UKcHJvcGVydGllcyBhcmUgcG9zc2libGUgY2hhcnNldHMg YW5kIHZhbHVlcyB0cmFuc2xhdGVkIHRlcm1zLgoKSXQgaXMgdXNlZCBhcyBhIGRhdGFiYXNlIGZv ciBgb3JnLWV4cG9ydC10cmFuc2xhdGUnLiBTaW5jZSB0aGlzCmZ1bmN0aW9uIHJldHVybnMgdGhl IHN0cmluZyBhcy1pcyBpZiBubyB0cmFuc2xhdGlvbiB3YXMgZm91bmQsCnRoZSB2YXJpYWJsZSBv bmx5IG5lZWRzIHRvIHJlY29yZCB2YWx1ZXMgZGlmZmVyZW50IGZyb20gdGhlCmVudHJ5LiIpCgoo ZGVmdW4gb3JnLWV4cG9ydC10cmFuc2xhdGUgKHMgZW5jb2RpbmcgaW5mbykKICAiVHJhbnNsYXRl IHN0cmluZyBTIGFjY29yZGluZyB0byBsYW5ndWFnZSBzcGVjaWZpY2F0aW9uLgoKRU5DT0RJTkcg aXMgYSBzeW1ib2wgYW1vbmcgYDphc2NpaScsIGA6aHRtbCcsIGA6bGF0ZXgnLCBgOmxhdGluMScK YW5kIGA6dXRmLTgnLiAgSU5GTyBpcyBhIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNo YW5uZWwuCgpUcmFuc2xhdGlvbiBkZXBlbmRzIG9uIGA6bGFuZ3VhZ2UnIHByb3BlcnR5LiBSZXR1 cm4gdGhlCnRyYW5zbGF0ZWQgc3RyaW5nLiBJZiBubyB0cmFuc2xhdGlvbiBpcyBmb3VuZCwgdHJ5 IHRvIGZhbGwgYmFjawp0byBgOmRlZmF1bHQnIGVuY29kaW5nLiBJZiBpdCBmYWlscywgcmV0dXJu IFMuIikKCgojK2VuZF9zcmMKCiogQXN5bmNocm9ub3VzIEV4cG9ydAoKYG9yZy1leHBvcnQtYXN5 bmMtc3RhcnQnIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgYXN5bmNocm9ub3VzCmV4cG9ydC4gIEl0 IHJlY3JlYXRlcyBjdXJyZW50IGJ1ZmZlciAoaW5jbHVkaW5nIHZpc2liaWxpdHksCm5hcnJvd2lu ZyBhbmQgdmlzaXRlZCBmaWxlKSBpbiBhbiBleHRlcm5hbCBFbWFjcyBwcm9jZXNzLCBhbmQKZXZh bHVhdGVzIGEgY29tbWFuZCB0aGVyZS4gIEl0IHRoZW4gYXBwbGllcyBhIGZ1bmN0aW9uIG9uIHRo ZQpyZXR1cm5lZCByZXN1bHRzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuCgpBc3luY2hyb25vdXNs eSBnZW5lcmF0ZWQgcmVzdWx0cyBhcmUgbmV2ZXIgZGlzcGxheWVkIGRpcmVjdGx5LgpJbnN0ZWFk LCB0aGV5IGFyZSBzdG9yZWQgaW4gYG9yZy1leHBvcnQtc3RhY2stY29udGVudHMnLiAgVGhleSBj YW4KdGhlbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgb3JnLWV4cG9ydC1zdGFjaycuCgpFeHBv cnQgU3RhY2sgaXMgdmlld2VkIHRocm91Z2ggYSBkZWRpY2F0ZWQgbWFqb3IgbW9kZQpgb3JnLWV4 cG9ydC1zdGFjay1tb2RlJyBhbmQgdG9vbHM6IGBvcmctZXhwb3J0LXN0YWNrLXJlZnJlc2gnLApg b3JnLWV4cG9ydC1zdGFjay1kZWxldGUnLCBgb3JnLWV4cG9ydC1zdGFjay12aWV3JyBhbmQKYG9y Zy1leHBvcnQtc3RhY2stY2xlYXInLgoKRm9yIGJhY2stZW5kcywgYG9yZy1leHBvcnQtYWRkLXRv LXN0YWNrJyBhZGQgYSBuZXcgc291cmNlIHRvIHN0YWNrLgpJdCBzaG91bGQgdXNlZCB3aGVuZXZl ciBgb3JnLWV4cG9ydC1hc3luYy1zdGFydCcgaXMgY2FsbGVkLgoKIytiZWdpbl9zcmMgZW1hY3Mt bGlzcAooZGVmbWFjcm8gb3JnLWV4cG9ydC1hc3luYy1zdGFydCAgKGZ1biAmcmVzdCBib2R5KQog ICJDYWxsIGZ1bmN0aW9uIEZVTiBvbiB0aGUgcmVzdWx0cyByZXR1cm5lZCBieSBCT0RZIGV2YWx1 YXRpb24uCgpCT0RZIGV2YWx1YXRpb24gaGFwcGVucyBpbiBhbiBhc3luY2hyb25vdXMgcHJvY2Vz cywgZnJvbSBhIGJ1ZmZlcgp3aGljaCBpcyBhbiBleGFjdCBjb3B5IG9mIHRoZSBjdXJyZW50IG9u ZS4KClVzZSBgb3JnLWV4cG9ydC1hZGQtdG8tc3RhY2snIGluIEZVTiBpbiBvcmRlciB0byByZWdp c3RlciByZXN1bHRzCmluIHRoZSBzdGFjay4gIEV4YW1wbGVzIGZvciwgcmVzcGVjdGl2ZWx5IGEg dGVtcG9yYXJ5IGJ1ZmZlciBhbmQKYSBmaWxlIGFyZToKCiAgXChvcmctZXhwb3J0LWFzeW5jLXN0 YXJ0CiAgICAgIFwobGFtYmRhIChvdXRwdXQpCiAgICAgICAgXCh3aXRoLWN1cnJlbnQtYnVmZmVy IChnZXQtYnVmZmVyLWNyZWF0ZSBcIipPcmcgQkFDS0VORCBFeHBvcnQqXCIpCiAgICAgICAgXChl cmFzZS1idWZmZXIpCiAgICAgICAgXChpbnNlcnQgb3V0cHV0KQogICAgICAgIFwoZ290by1jaGFy IChwb2ludC1taW4pKQogICAgICAgIFwob3JnLWV4cG9ydC1hZGQtdG8tc3RhY2sgKGN1cnJlbnQt YnVmZmVyKSAnYmFja2VuZCkpKQogICAgYChvcmctZXhwb3J0LWFzICdiYWNrZW5kICxzdWJ0cmVl cCAsdmlzaWJsZS1vbmx5ICxib2R5LW9ubHkgJyxleHQtcGxpc3QpKQoKYW5kCgogIFwob3JnLWV4 cG9ydC1hc3luYy1zdGFydAogICAgICBcKGxhbWJkYSAoZikgKG9yZy1leHBvcnQtYWRkLXRvLXN0 YWNrIGYgJ2JhY2tlbmQpKQogICAgYChleHBhbmQtZmlsZS1uYW1lCiAgICAgIFwob3JnLWV4cG9y dC10by1maWxlCiAgICAgICAnYmFja2VuZCAsb3V0ZmlsZSAsc3VidHJlZXAgLHZpc2libGUtb25s eSAsYm9keS1vbmx5ICcsZXh0LXBsaXN0KSkpIikKCihkZWZ1biBvcmctZXhwb3J0LWFkZC10by1z dGFjayAoc291cmNlIGJhY2tlbmQgJm9wdGlvbmFsIHByb2Nlc3MpCiAgIkFkZCBhIG5ldyByZXN1 bHQgdG8gZXhwb3J0IHN0YWNrIGlmIG5vdCBwcmVzZW50IGFscmVhZHkuCgpTT1VSQ0UgaXMgYSBi dWZmZXIgb3IgYSBmaWxlIG5hbWUgY29udGFpbmluZyBleHBvcnQgcmVzdWx0cy4KQkFDS0VORCBp cyBhIHN5bWJvbCByZXByZXNlbnRpbmcgZXhwb3J0IGJhY2stZW5kIHVzZWQgdG8gZ2VuZXJhdGUK aXQuCgpFbnRyaWVzIGFscmVhZHkgcG9pbnRpbmcgdG8gU09VUkNFIGFuZCB1bmF2YWlsYWJsZSBl bnRyaWVzIGFyZQpyZW1vdmVkIGJlZm9yZWhhbmQuICBSZXR1cm4gdGhlIG5ldyBzdGFjay4iKQoK KGRlZnVuIG9yZy1leHBvcnQtc3RhY2sgKCkKICAiTWVudSBmb3IgYXN5bmNocm9ub3VzIGV4cG9y dCByZXN1bHRzIGFuZCBydW5uaW5nIHByb2Nlc3Nlcy4iKQoKKGRlZnVuIG9yZy1leHBvcnQtLXN0 YWNrLXNvdXJjZS1hdC1wb2ludCAoKQogICJSZXR1cm4gc291cmNlIGZyb20gZXhwb3J0IHJlc3Vs dHMgYXQgcG9pbnQgaW4gc3RhY2suIikKCihkZWZ1biBvcmctZXhwb3J0LXN0YWNrLWNsZWFyICgp CiAgIlJlbW92ZSBhbGwgZW50cmllcyBmcm9tIGV4cG9ydCBzdGFjay4iKQoKKGRlZnVuIG9yZy1l eHBvcnQtc3RhY2stcmVmcmVzaCAoJnJlc3QgZHVtbXkpCiAgIlJlZnJlc2ggdGhlIGFzeW5jaHJv bm91cyBleHBvcnQgc3RhY2suCkRVTU1ZIGlzIGlnbm9yZWQuICBVbmF2YWlsYWJsZSBzb3VyY2Vz IGFyZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuClJldHVybiB0aGUgbmV3IHN0YWNrLiIpCgooZGVm dW4gb3JnLWV4cG9ydC1zdGFjay1yZW1vdmUgKCZvcHRpb25hbCBzb3VyY2UpCiAgIlJlbW92ZSBl eHBvcnQgcmVzdWx0cyBhdCBwb2ludCBmcm9tIHN0YWNrLgpJZiBvcHRpb25hbCBhcmd1bWVudCBT T1VSQ0UgaXMgbm9uLW5pbCwgcmVtb3ZlIGl0IGluc3RlYWQuIikKCihkZWZ1biBvcmctZXhwb3J0 LXN0YWNrLXZpZXcgKCZvcHRpb25hbCBpbi1lbWFjcykKICAiVmlldyBleHBvcnQgcmVzdWx0cyBh dCBwb2ludCBpbiBzdGFjay4KV2l0aCBhbiBvcHRpb25hbCBwcmVmaXggYXJndW1lbnQgSU4tRU1B Q1MsIGZvcmNlIHZpZXdpbmcgZmlsZXMKd2l0aGluIEVtYWNzLiIpCgooZGVmY29uc3Qgb3JnLWV4 cG9ydC1zdGFjay1tb2RlLW1hcAogIChsZXQgKChrbSAobWFrZS1zcGFyc2Uta2V5bWFwKSkpCiAg ICAoZGVmaW5lLWtleSBrbSAiICIgJ25leHQtbGluZSkKICAgIChkZWZpbmUta2V5IGttICJuIiAn bmV4dC1saW5lKQogICAgKGRlZmluZS1rZXkga20gIlxDLW4iICduZXh0LWxpbmUpCiAgICAoZGVm aW5lLWtleSBrbSBbZG93bl0gJ25leHQtbGluZSkKICAgIChkZWZpbmUta2V5IGttICJwIiAncHJl dmlvdXMtbGluZSkKICAgIChkZWZpbmUta2V5IGttICJcQy1wIiAncHJldmlvdXMtbGluZSkKICAg IChkZWZpbmUta2V5IGttICJcQy0/IiAncHJldmlvdXMtbGluZSkKICAgIChkZWZpbmUta2V5IGtt IFt1cF0gJ3ByZXZpb3VzLWxpbmUpCiAgICAoZGVmaW5lLWtleSBrbSAiQyIgJ29yZy1leHBvcnQt c3RhY2stY2xlYXIpCiAgICAoZGVmaW5lLWtleSBrbSAidiIgJ29yZy1leHBvcnQtc3RhY2stdmll dykKICAgIChkZWZpbmUta2V5IGttIChrYmQgIlJFVCIpICdvcmctZXhwb3J0LXN0YWNrLXZpZXcp CiAgICAoZGVmaW5lLWtleSBrbSAiZCIgJ29yZy1leHBvcnQtc3RhY2stcmVtb3ZlKQogICAga20p CiAgIktleW1hcCBmb3IgT3JnIEV4cG9ydCBTdGFjay4iKQoKKGRlZmluZS1kZXJpdmVkLW1vZGUg b3JnLWV4cG9ydC1zdGFjay1tb2RlIHNwZWNpYWwtbW9kZSAiT3JnLVN0YWNrIgogICJNb2RlIGZv ciBkaXNwbGF5aW5nIGFzeW5jaHJvbm91cyBleHBvcnQgc3RhY2suCgpUeXBlIFxcW29yZy1leHBv cnQtc3RhY2tdIHRvIHZpc3VhbGl6ZSB0aGUgYXN5bmNocm9ub3VzIGV4cG9ydApzdGFjay4KCklu IGFuIE9yZyBFeHBvcnQgU3RhY2sgYnVmZmVyLCB1c2UgXFw8b3JnLWV4cG9ydC1zdGFjay1tb2Rl LW1hcD5cXFtvcmctZXhwb3J0LXN0YWNrLXZpZXddIHRvIHZpZXcgZXhwb3J0IG91dHB1dApvbiBj dXJyZW50IGxpbmUsIFxcW29yZy1leHBvcnQtc3RhY2stcmVtb3ZlXSB0byByZW1vdmUgaXQgZnJv bSB0aGUgc3RhY2sgYW5kIFxcW29yZy1leHBvcnQtc3RhY2stY2xlYXJdIHRvIGNsZWFyCnN0YWNr IGNvbXBsZXRlbHkuCgpSZW1vdmluZyBlbnRyaWVzIGluIGFuIE9yZyBFeHBvcnQgU3RhY2sgYnVm ZmVyIGRvZXNuJ3QgYWZmZWN0CmZpbGVzIG9yIGJ1ZmZlcnMsIG9ubHkgdGhlIGRpc3BsYXkuCgpc XHtvcmctZXhwb3J0LXN0YWNrLW1vZGUtbWFwfSIKICAoYWJicmV2LW1vZGUgMCkKICAoYXV0by1m aWxsLW1vZGUgMCkKICAoc2V0cSBidWZmZXItcmVhZC1vbmx5IHQKCWJ1ZmZlci11bmRvLWxpc3Qg dAoJdHJ1bmNhdGUtbGluZXMgdAoJaGVhZGVyLWxpbmUtZm9ybWF0CgknKDpldmFsCgkgIChmb3Jt YXQgIiAgJS0xMnMgfCAlNnMgfCAlcyIgIkJhY2stRW5kIiAiQWdlIiAiU291cmNlIikpKQogIChv cmctYWRkLWhvb2sgJ3Bvc3QtY29tbWFuZC1ob29rICdvcmctZXhwb3J0LXN0YWNrLXJlZnJlc2gg bmlsIHQpCiAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAncmV2ZXJ0LWJ1ZmZlci1mdW5jdGlv bikKICAgICAgICdvcmctZXhwb3J0LXN0YWNrLXJlZnJlc2gpKQoKCiMrZW5kX3NyYwoKKiBUaGUg RGlzcGF0Y2hlcgoKYG9yZy1leHBvcnQtZGlzcGF0Y2gnIGlzIHRoZSBzdGFuZGFyZCBpbnRlcmFj dGl2ZSB3YXkgdG8gc3RhcnQgYW4KZXhwb3J0IHByb2Nlc3MuICBJdCB1c2VzIGBvcmctZXhwb3J0 LS1kaXNwYXRjaC11aScgYXMgYSBzdWJyb3V0aW5lCmZvciBpdHMgaW50ZXJmYWNlLCB3aGljaCwg aW4gdHVybiwgZGVsZWdhdGVzIHJlc3BvbnNlIHRvIGtleQpwcmVzc2VkIHRvIGBvcmctZXhwb3J0 LS1kaXNwYXRjaC1hY3Rpb24nLgoKIyMjYXV0b2xvYWQKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAog IChkZWZ1biBvcmctZXhwb3J0LWRpc3BhdGNoICgmb3B0aW9uYWwgYXJnKQogICAgIkV4cG9ydCBk aXNwYXRjaGVyIGZvciBPcmcgbW9kZS4KCiAgSXQgcHJvdmlkZXMgYW4gYWNjZXNzIHRvIGNvbW1v biBleHBvcnQgcmVsYXRlZCB0YXNrcyBpbiBhIGJ1ZmZlci4KICBJdHMgaW50ZXJmYWNlIGNvbWVz IGluIHR3byBmbGF2b3Vyczogc3RhbmRhcmQgYW5kIGV4cGVydC4KCiAgV2hpbGUgYm90aCBzaGFy ZSB0aGUgc2FtZSBzZXQgb2YgYmluZGluZ3MsIG9ubHkgdGhlIGZvcm1lcgogIGRpc3BsYXlzIHRo ZSB2YWxpZCBrZXlzIGFzc29jaWF0aW9ucyBpbiBhIGRlZGljYXRlZCBidWZmZXIuCiAgU2Nyb2xs aW5nIChyZXNwLiBsaW5lLXdpc2UgbW90aW9uKSBpbiB0aGlzIGJ1ZmZlciBpcyBkb25lIHdpdGgK ICBTUEMgYW5kIERFTCAocmVzcC4gQy1uIGFuZCBDLXApIGtleXMuCgogIFNldCB2YXJpYWJsZSBg b3JnLWV4cG9ydC1kaXNwYXRjaC11c2UtZXhwZXJ0LXVpJyB0byBzd2l0Y2ggdG8gb25lCiAgZmxh dm91ciBvciB0aGUgb3RoZXIuCgogIFdoZW4gQVJHIGlzIFxcW3VuaXZlcnNhbC1hcmd1bWVudF0s IHJlcGVhdCB0aGUgbGFzdCBleHBvcnQgYWN0aW9uLCB3aXRoIHRoZSBzYW1lIHNldAogIG9mIG9w dGlvbnMgdXNlZCBiYWNrIHRoZW4sIG9uIHRoZSBjdXJyZW50IGJ1ZmZlci4KCiAgV2hlbiBBUkcg aXMgXFxbdW5pdmVyc2FsLWFyZ3VtZW50XSBcXFt1bml2ZXJzYWwtYXJndW1lbnRdLAogIGRpc3Bs YXkgdGhlIGFzeW5jaHJvbm91cyBleHBvcnQgc3RhY2suIikKCiAgKGRlZnVuIG9yZy1leHBvcnQt LWRpc3BhdGNoLXVpIChvcHRpb25zIGZpcnN0LWtleSBleHBlcnRwKQogICAgIkhhbmRsZSBpbnRl cmZhY2UgZm9yIGBvcmctZXhwb3J0LWRpc3BhdGNoJy4KCiAgT1BUSU9OUyBpcyBhIGxpc3QgY29u dGFpbmluZyBjdXJyZW50IGludGVyYWN0aXZlIG9wdGlvbnMgc2V0IGZvcgogIGV4cG9ydC4gIEl0 IGNhbiBjb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nIHN5bWJvbHM6CiAgYGJvZHknICAgIHRv Z2dsZXMgYSBib2R5LW9ubHkgZXhwb3J0CiAgYHN1YnRyZWUnIHJlc3RyaWN0cyBleHBvcnQgdG8g Y3VycmVudCBzdWJ0cmVlCiAgYHZpc2libGUnIHJlc3RyaWN0cyBleHBvcnQgdG8gdmlzaWJsZSBw YXJ0IG9mIGJ1ZmZlci4KICBgZm9yY2UnICAgZm9yY2UgcHVibGlzaGluZyBmaWxlcy4KICBgYXN5 bmMnICAgdXNlIGFzeW5jaHJvbm91cyBleHBvcnQgcHJvY2VzcwoKICBGSVJTVC1LRVkgaXMgdGhl IGtleSBwcmVzc2VkIHRvIHNlbGVjdCB0aGUgZmlyc3QgbGV2ZWwgbWVudS4gIEl0CiAgaXMgbmls IHdoZW4gdGhpcyBtZW51IGhhc24ndCBiZWVuIHNlbGVjdGVkIHlldC4KCiAgRVhQRVJUUCwgd2hl biBub24tbmlsLCB0cmlnZ2VycyBleHBlcnQgVUkuICBJbiB0aGF0IGNhc2UsIG5vIGhlbHAKICBi dWZmZXIgaXMgcHJvdmlkZWQsIGJ1dCBpbmRpY2F0aW9ucyBhYm91dCBjdXJyZW50bHkgYWN0aXZl CiAgb3B0aW9ucyBhcmUgZ2l2ZW4gaW4gdGhlIHByb21wdC4gIE1vcmVvdmVyLCBcWz9dIGFsbG93 cyB0byBzd2l0Y2gKICBiYWNrIHRvIHN0YW5kYXJkIGludGVyZmFjZS4iKQoKICAoZGVmdW4gb3Jn LWV4cG9ydC0tZGlzcGF0Y2gtYWN0aW9uCiAgICAocHJvbXB0IGFsbG93ZWQta2V5cyBiYWNrZW5k cyBvcHRpb25zIGZpcnN0LWtleSBleHBlcnRwKQogICAgIlJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBj b21tYW5kIGlucHV0IGFuZCBhY3QgYWNjb3JkaW5nbHkuCgogIFBST01QVCBpcyB0aGUgZGlzcGxh eWVkIHByb21wdCwgYXMgYSBzdHJpbmcuICBBTExPV0VELUtFWVMgaXMKICBhIGxpc3Qgb2YgY2hh cmFjdGVycyBhdmFpbGFibGUgYXQgYSBnaXZlbiBzdGVwIGluIHRoZSBwcm9jZXNzLgogIEJBQ0tF TkRTIGlzIGEgbGlzdCBvZiBtZW51IGVudHJpZXMuICBPUFRJT05TLCBGSVJTVC1LRVkgYW5kCiAg RVhQRVJUUCBhcmUgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiBgb3JnLWV4cG9ydC0tZGlzcGF0Y2gt dWknLAogIHdoaWNoIHNlZS4KCiAgVG9nZ2xlIGV4cG9ydCBvcHRpb25zIHdoZW4gcmVxdWlyZWQu ICBPdGhlcndpc2UsIHJldHVybiB2YWx1ZSBpcwogIGEgbGlzdCB3aXRoIGFjdGlvbiBhcyBDQVIg YW5kIGEgbGlzdCBvZiBpbnRlcmFjdGl2ZSBleHBvcnQKICBvcHRpb25zIGFzIENEUi4iKQoKICAo cHJvdmlkZSAnb3gpCiMrZW5kX3NyYwoKTG9jYWwgdmFyaWFibGVzOgpnZW5lcmF0ZWQtYXV0b2xv YWQtZmlsZTogIm9yZy1sb2FkZGVmcy5lbCIKRW5kOgoKKiBveC5lbCBlbmRzIGhlcmUK --=-=-= Content-Type: text/plain -- cheers, Thorsten --=-=-=--