{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a72d1a4b",
   "metadata": {},
   "source": [
    "# Basic Search"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "143f2e20",
   "metadata": {},
   "source": [
    "The CDA provides a custom python tool for searching CDA data. [`Q`](usage/#q) (short for Query) offers several ways to search and filter data, and several input modes:\n",
    "\n",
    "---\n",
    "- **<a href=\"../../QuickStart/usage/#q\">Q.()</a>** builds a query that can be used by `run()` or `count()`\n",
    "- **<a href=\"../../QuickStart/usage/#qrun\">Q.run()</a>** returns data for the specified search \n",
    "- **<a href=\"../../QuickStart/usage/#qcount\">Q.count()</a>** returns summary information (counts) data that fit the specified search\n",
    "- **<a href=\"../../QuickStart/usage/#columns\">columns()</a>** returns entity field names\n",
    "- **<a href=\"../../QuickStart/usage/#unique_terms\">unique_terms()</a>** returns entity field contents\n",
    "\n",
    "---\n",
    "                                                                    \n",
    "Before we do any work, we need to import these functions from cdapython. We're also importing functions from several other packages to make viewing and manipulating tables easier. The `opt.` settings are pre-configuring how itables should display our tables, with scrolling and paging enabled.\n",
    "Finally, we're telling cdapython to report it's version so we can be sure we're using the one we mean to:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5245b7b0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n",
       "!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(C,e){\"use strict\";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement(\"script\");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[o.call(e)]||\"object\":typeof e}var f=\"3.6.0\",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&\"length\"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],\"__proto__\"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:\"jQuery\"+(f+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==o.call(e))&&(!(t=r(e))||\"function\"==typeof(n=v.call(t,\"constructor\")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,\"string\"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),\"function\"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){n[\"[object \"+t+\"]\"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S=\"sizzle\"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",M=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",I=\"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\"+M+\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",W=\"\\\\[\"+M+\"*(\"+I+\")(?:\"+M+\"*([*^$|!~]?=)\"+M+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+I+\"))|)\"+M+\"*\\\\]\",F=\":(\"+I+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+W+\")*)|.*)\\\\)|)\",B=new RegExp(M+\"+\",\"g\"),$=new RegExp(\"^\"+M+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+M+\"+$\",\"g\"),_=new RegExp(\"^\"+M+\"*,\"+M+\"*\"),z=new RegExp(\"^\"+M+\"*([>+~]|\"+M+\")\"+M+\"*\"),U=new RegExp(M+\"|>\"),X=new RegExp(F),V=new RegExp(\"^\"+I+\"$\"),G={ID:new RegExp(\"^#(\"+I+\")\"),CLASS:new RegExp(\"^\\\\.(\"+I+\")\"),TAG:new RegExp(\"^(\"+I+\"|[*])\"),ATTR:new RegExp(\"^\"+W),PSEUDO:new RegExp(\"^\"+F),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+M+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+M+\"*(?:([+-]|)\"+M+\"*(\\\\d+)|))\"+M+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+R+\")$\",\"i\"),needsContext:new RegExp(\"^\"+M+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+M+\"*((?:-\\\\d)?\\\\d*)\"+M+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\\d$/i,K=/^[^{]+\\{\\s*\\[native \\w/,Z=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ee=/[+~]/,te=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+M+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),ne=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,ie=function(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&\"fieldset\"===e.nodeName.toLowerCase()},{dir:\"parentNode\",next:\"legend\"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+\" \"]&&(!v||!v.test(t))&&(1!==p||\"object\"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute(\"id\"))?s=s.replace(re,ie):e.setAttribute(\"id\",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+xe(l[o]);c=l.join(\",\")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return g(t.replace($,\"$1\"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split(\"|\"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return\"input\"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return(\"input\"===t||\"button\"===t)&&e.type===n}}function ge(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||\"HTML\")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",oe,!1):n.attachEvent&&n.attachEvent(\"onunload\",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement(\"div\")),\"undefined\"!=typeof e.querySelectorAll&&!e.querySelectorAll(\":scope fieldset div\").length}),d.attributes=ce(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=\"<a id='\"+S+\"'></a><select id='\"+S+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&v.push(\"[*^$]=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||v.push(\"\\\\[\"+M+\"*(?:value|\"+R+\")\"),e.querySelectorAll(\"[id~=\"+S+\"-]\").length||v.push(\"~=\"),(t=C.createElement(\"input\")).setAttribute(\"name\",\"\"),e.appendChild(t),e.querySelectorAll(\"[name='']\").length||v.push(\"\\\\[\"+M+\"*name\"+M+\"*=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\":checked\").length||v.push(\":checked\"),e.querySelectorAll(\"a#\"+S+\"+*\").length||v.push(\".#.+[+~]\"),e.querySelectorAll(\"\\\\\\f\"),v.push(\"[\\\\r\\\\n\\\\f]\")}),ce(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=C.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&v.push(\"name\"+M+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&v.push(\":enabled\",\":disabled\"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&v.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),v.push(\",.*:\")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,\"*\"),c.call(e,\"[s!='']:x\"),s.push(\"!=\",F)}),v=v.length&&new RegExp(v.join(\"|\")),s=s.length&&new RegExp(s.join(\"|\")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+\" \"]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+\"\").replace(re,ie)},se.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n=\"\",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||\"\").replace(te,ne),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+\" \"];return t||(t=new RegExp(\"(^|\"+M+\")\"+e+\"(\"+M+\"|$)\"))&&m(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?\"!=\"===r:!r||(t+=\"\",\"=\"===r?t===i:\"!=\"===r?t!==i:\"^=\"===r?i&&0===t.indexOf(i):\"*=\"===r?i&&-1<t.indexOf(i):\"$=\"===r?i&&t.slice(-i.length)===i:\"~=\"===r?-1<(\" \"+t.replace(B,\" \")+\" \").indexOf(i):\"|=\"===r&&(t===i||t.slice(0,i.length+1)===i+\"-\"))}},CHILD:function(h,e,t,g,v){var y=\"nth\"!==h.slice(0,3),m=\"last\"!==h.slice(-4),x=\"of-type\"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?\"nextSibling\":\"previousSibling\",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l=\"only\"===h&&!u&&\"nextSibling\"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error(\"unsupported pseudo: \"+e);return a[S]?a(o):1<a.length?(t=[e,e,\"\",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,\"$1\"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||\"\")||se.error(\"unsupported lang: \"+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute(\"xml:lang\")||e.getAttribute(\"lang\"))return(t=t.toLowerCase())===n||0===t.indexOf(n+\"-\")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&\"parentNode\"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||\"*\",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[\" \"],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:\" \"===e[s-2].type?\"*\":\"\"})).replace($,\"$1\"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+\" \"];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($,\" \")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+\" \"];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l=\"0\",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG(\"*\",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l=\"function\"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&\"ID\"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split(\"\").sort(j).join(\"\")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement(\"fieldset\"))}),ce(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||fe(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||fe(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute(\"disabled\")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[\":\"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):\"string\"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if(\"string\"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,\"string\"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,\"string\"==typeof e){if(!(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a=\"string\"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?\"string\"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,\"parentNode\")},parentsUntil:function(e,t,n){return h(e,\"parentNode\",n)},next:function(e){return O(e,\"nextSibling\")},prev:function(e){return O(e,\"previousSibling\")},nextAll:function(e){return h(e,\"nextSibling\")},prevAll:function(e){return h(e,\"previousSibling\")},nextUntil:function(e,t,n){return h(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return h(e,\"previousSibling\",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,\"template\")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return\"Until\"!==r.slice(-5)&&(t=e),t&&\"string\"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\\x20\\t\\r\\n\\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r=\"string\"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:\"\")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&\"string\"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t=\"\",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=\"\"),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[[\"notify\",\"progress\",S.Callbacks(\"memory\"),S.Callbacks(\"memory\"),2],[\"resolve\",\"done\",S.Callbacks(\"once memory\"),S.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",S.Callbacks(\"once memory\"),S.Callbacks(\"once memory\"),1,\"rejected\"]],i=\"pending\",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},\"catch\":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+\"With\"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError(\"Thenable self-resolution\");t=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+\"With\"](this===s?void 0:this,arguments),this},s[t[0]+\"With\"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),\"pending\"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn(\"jQuery.Deferred exception: \"+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener(\"DOMContentLoaded\",B),C.removeEventListener(\"load\",B),S.ready()}S.fn.ready=function(e){return F.then(e)[\"catch\"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,\"complete\"===E.readyState||\"loading\"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener(\"DOMContentLoaded\",B),C.addEventListener(\"load\",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if(\"object\"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,\"ms-\").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if(\"string\"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(K,\"-$&\").toLowerCase(),\"string\"==typeof(n=e.getAttribute(r))){try{n=\"true\"===(i=n)||\"false\"!==i&&(\"null\"===i?null:i===+i+\"\"?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,\"hasDataAttrs\"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf(\"data-\")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,\"hasDataAttrs\",!0)}return i}return\"object\"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks(\"once memory\").add(function(){Y.remove(e,[t+\"queue\",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return\"string\"!=typeof t&&(n=t,t=\"fx\",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),\"fx\"===t&&\"inprogress\"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";while(a--)(n=Y.get(o[a],e+\"queueHooks\"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,te=new RegExp(\"^(?:([+-])=|)(\"+ee+\")([a-z%]*)$\",\"i\"),ne=[\"Top\",\"Right\",\"Bottom\",\"Left\"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return\"none\"===(e=t||e).style.display||\"\"===e.style.display&&ie(e)&&\"none\"===S.css(e,\"display\")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,\"\")},u=s(),l=n&&n[3]||(S.cssNumber[t]?\"\":\"px\"),c=e.nodeType&&(S.cssNumber[t]||\"px\"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?(\"none\"===n&&(l[c]=Y.get(r,\"display\")||null,l[c]||(r.style.display=\"\")),\"\"===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,\"display\"),o.parentNode.removeChild(o),\"none\"===u&&(u=\"block\"),ue[s]=u)))):\"none\"!==n&&(l[c]=\"none\",Y.set(r,\"display\",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i,he=/^$|^module$|\\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement(\"div\")),(fe=E.createElement(\"input\")).setAttribute(\"type\",\"radio\"),fe.setAttribute(\"checked\",\"checked\"),fe.setAttribute(\"name\",\"t\"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML=\"<textarea>x</textarea>\",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=\"<option></option>\",y.option=!!ce.lastChild;var ge={thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};function ve(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],\"globalEval\",!t||Y.get(t[n],\"globalEval\"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,\"<select multiple='multiple'>\",\"</select>\"]);var me=/<|&#?\\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if(\"object\"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement(\"div\")),s=(de.exec(o)||[\"\",\"\"])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=\"\"}else p.push(t.createTextNode(o));f.textContent=\"\",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),\"script\"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||\"\")&&n.push(o)}return f}var be=/^([^.]*)(?:\\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==(\"focus\"===t)}function Ee(e,t,n,r,i,o){var a,s;if(\"object\"==typeof t){for(s in\"string\"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&(\"string\"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return\"undefined\"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||\"\").match(P)||[\"\"]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||\"\").match(P)||[\"\"]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,\"events\")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+\" \"]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Se(t,\"click\",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Se(t,\"click\"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Y.get(t,\"click\")||A(t,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,\"char\":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&\"function\"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\\s*(?:[^=]|=\\s*.checked.)/i,Ne=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;function je(e,t){return A(e,\"table\")&&A(11!==t.nodeType?t:t.firstChild,\"tr\")&&S(e).children(\"tbody\")[0]||e}function De(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function qe(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,\"handle events\"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&\"string\"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,\"script\"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,\"script\"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||\"\")&&!Y.access(u,\"globalEval\")&&S.contains(l,u)&&(u.src&&\"module\"!==(u.type||\"\").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute(\"nonce\")},l):b(u.textContent.replace(Ne,\"\"),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,\"script\")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,\"input\"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:\"input\"!==l&&\"textarea\"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,\"script\")).length&&ye(a,!f&&ve(e,\"script\")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp(\"^(\"+ee+\")(?!px)[a-z%]+$\",\"i\"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join(\"|\"),\"i\");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(\"\"!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+\"\":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText=\"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\",l.style.cssText=\"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n=\"1%\"!==e.top,s=12===t(e.marginLeft),l.style.right=\"60%\",o=36===t(e.right),r=36===t(e.width),l.style.position=\"absolute\",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement(\"div\"),l=E.createElement(\"div\");l.style&&(l.style.backgroundClip=\"content-box\",l.cloneNode(!0).style.backgroundClip=\"\",y.clearCloneStyle=\"content-box\"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement(\"table\"),t=E.createElement(\"tr\"),n=E.createElement(\"div\"),e.style.cssText=\"position:absolute;left:-11111px;border-collapse:separate\",t.style.cssText=\"border:1px solid\",t.style.height=\"1px\",n.style.height=\"9px\",n.style.display=\"block\",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=[\"Webkit\",\"Moz\",\"ms\"],$e=E.createElement(\"div\").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Ge={letterSpacing:\"0\",fontWeight:\"400\"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function Qe(e,t,n,r,i,o){var a=\"width\"===t?1:0,s=0,u=0;if(n===(r?\"border\":\"content\"))return 0;for(;a<4;a+=2)\"margin\"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?(\"content\"===n&&(u-=S.css(e,\"padding\"+ne[a],!0,i)),\"margin\"!==n&&(u-=S.css(e,\"border\"+ne[a]+\"Width\",!0,i))):(u+=S.css(e,\"padding\"+ne[a],!0,i),\"padding\"!==n?u+=S.css(e,\"border\"+ne[a]+\"Width\",!0,i):s+=S.css(e,\"border\"+ne[a]+\"Width\",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&\"border-box\"===S.css(e,\"boxSizing\",!1,r),o=i,a=We(e,t,r),s=\"offset\"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a=\"auto\"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,\"tr\")||\"auto\"===a||!parseFloat(a)&&\"inline\"===S.css(e,\"display\",!1,r))&&e.getClientRects().length&&(i=\"border-box\"===S.css(e,\"boxSizing\",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?\"border\":\"content\"),o,r,a)+\"px\"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&\"get\"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];\"string\"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o=\"number\"),null!=n&&n==n&&(\"number\"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?\"\":\"px\")),y.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(l[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&\"get\"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),\"normal\"===i&&t in Ge&&(i=Ge[t]),\"\"===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each([\"height\",\"width\"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&\"absolute\"===i.position,a=(o||n)&&\"border-box\"===S.css(e,\"boxSizing\",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e[\"offset\"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,\"border\",!1,i)-.5)),s&&(r=te.exec(t))&&\"px\"!==(r[3]||\"px\")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,\"marginLeft\"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),S.each({margin:\"\",padding:\"\",border:\"Width\"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r=\"string\"==typeof e?e.split(\" \"):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},\"margin\"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?\"\":\"px\")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,\"\"))&&\"auto\"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i[\"margin\"+(n=ne[r])]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners[\"*\"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&\"expand\"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=[\"*\"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,\"fxshow\");for(r in n.queue||(null==(a=S._queueHooks(e,\"fx\")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,\"fx\").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||\"toggle\"===i,i===(g?\"hide\":\"show\")){if(\"show\"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,\"display\")),\"none\"===(c=S.css(e,\"display\"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,\"display\"),le([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===S.css(e,\"float\")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l=\"none\"===c?\"\":c)),h.display=\"inline-block\")),n.overflow&&(h.overflow=\"hidden\",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?\"hidden\"in v&&(g=v.hidden):v=Y.access(e,\"fxshow\",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,\"fxshow\"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&\"object\"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,\"finish\"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return\"string\"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||\"fx\",[]),this.each(function(){var e=!0,t=null!=i&&i+\"queueHooks\",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||\"fx\"),this.each(function(){var e,t=Y.get(this),n=t[a+\"queue\"],r=t[a+\"queueHooks\"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each([\"toggle\",\"show\",\"hide\"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||\"boolean\"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st(\"show\"),slideUp:st(\"hide\"),slideToggle:st(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||\"fx\",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement(\"input\"),nt=E.createElement(\"select\").appendChild(E.createElement(\"option\")),tt.type=\"checkbox\",y.checkOn=\"\"!==tt.value,y.optSelected=nt.selected,(tt=E.createElement(\"input\")).value=\"t\",tt.type=\"radio\",y.radioValue=\"t\"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return\"undefined\"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):i&&\"get\"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&\"radio\"===t&&A(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(\" \")}function gt(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function vt(e){return Array.isArray(e)?e:\"string\"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,\"tabindex\");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&\" \"+ht(i)+\" \"){a=0;while(o=e[a++])r.indexOf(\" \"+o+\" \")<0&&(r+=o+\" \");i!==(s=ht(r))&&n.setAttribute(\"class\",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&\" \"+ht(i)+\" \"){a=0;while(o=e[a++])while(-1<r.indexOf(\" \"+o+\" \"))r=r.replace(\" \"+o+\" \",\" \");i!==(s=ht(r))&&n.setAttribute(\"class\",s)}return this},toggleClass:function(i,t){var o=typeof i,a=\"string\"===o||Array.isArray(i);return\"boolean\"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&\"boolean\"!==o||((e=gt(this))&&Y.set(this,\"__className__\",e),this.setAttribute&&this.setAttribute(\"class\",e||!1===i?\"\":Y.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;t=\" \"+e+\" \";while(n=this[r++])if(1===n.nodeType&&-1<(\" \"+ht(gt(n))+\" \").indexOf(t))return!0;return!1}});var yt=/\\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t=\"\":\"number\"==typeof t?t+=\"\":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?\"\":e+\"\"})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&\"set\"in r&&void 0!==r.set(this,t,\"value\")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&\"get\"in r&&void 0!==(e=r.get(t,\"value\"))?e:\"string\"==typeof(e=t.value)?e.replace(yt,\"\"):null==e?\"\":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,\"value\");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,\"optgroup\"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each([\"radio\",\"checkbox\"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})}),y.focusin=\"onfocusin\"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,\"type\")?e.type:e,h=v.call(e,\"namespace\")?e.namespace.split(\".\"):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(\".\")&&(d=(h=d.split(\".\")).shift(),h.sort()),u=d.indexOf(\":\")<0&&\"on\"+d,(e=e[S.expando]?e:new S.Event(d,\"object\"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join(\".\"),e.rnamespace=e.namespace?new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,\"events\")||Object.create(null))[e.type]&&Y.get(o,\"handle\"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:\"focusin\",blur:\"focusout\"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\\?/;S.parseXML=function(e){var t,n;if(!e||\"string\"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,\"text/xml\")}catch(e){}return n=t&&t.getElementsByTagName(\"parsererror\")[0],t&&!n||S.error(\"Invalid XML: \"+(n?S.map(n.childNodes,function(e){return e.textContent}).join(\"\\n\"):e)),t};var Ct=/\\[\\]$/,Et=/\\r?\\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+\"[\"+(\"object\"==typeof t&&null!=t?e:\"\")+\"]\",t,r,i)});else if(r||\"object\"!==w(e))i(n,e);else for(t in e)At(n+\"[\"+t+\"]\",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(null==e)return\"\";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join(\"&\")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,\"elements\");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(\":disabled\")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,\"\\r\\n\")}}):{name:t.name,value:n.replace(Et,\"\\r\\n\")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\\/\\//,Ot={},Pt={},Rt=\"*/\".concat(\"*\"),Mt=E.createElement(\"a\");function It(o){return function(e,t){\"string\"!=typeof e&&(t=e,e=\"*\");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])\"+\"===n[0]?(n=n.slice(1)||\"*\",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return\"string\"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s[\"*\"]&&l(\"*\")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:\"GET\",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Rt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){\"object\"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks(\"once memory\"),w=v.statusCode||{},a={},s={},u=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+\" \"]=(n[t[1].toLowerCase()+\" \"]||[]).concat(t[2])}t=n[e.toLowerCase()+\" \"]}return null==t?null:t.join(\", \")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+\"\").replace(Ht,bt.protocol+\"//\"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||\"*\").toLowerCase().match(P)||[\"\"],null==v.crossDomain){r=E.createElement(\"a\");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+\"//\"+Mt.host!=r.protocol+\"//\"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&\"string\"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger(\"ajaxStart\"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,\"\"),v.hasContent?v.data&&v.processData&&0===(v.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(v.data=v.data.replace(Nt,\"+\")):(o=v.url.slice(f.length),v.data&&(v.processData||\"string\"==typeof v.data)&&(f+=(Tt.test(f)?\"&\":\"?\")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,\"$1\"),o=(Tt.test(f)?\"&\":\"?\")+\"_=\"+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader(\"If-Modified-Since\",S.lastModified[f]),S.etag[f]&&T.setRequestHeader(\"If-None-Match\",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader(\"Content-Type\",v.contentType),T.setRequestHeader(\"Accept\",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+(\"*\"!==v.dataTypes[0]?\", \"+Rt+\"; q=0.01\":\"\"):v.accepts[\"*\"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u=\"abort\",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger(\"ajaxSend\",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort(\"timeout\")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,\"No Transport\");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||\"\",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray(\"script\",v.dataTypes)&&S.inArray(\"json\",v.dataTypes)<0&&(v.converters[\"text script\"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(!(a=l[u+\" \"+o]||l[\"* \"+o]))for(i in l)if((s=i.split(\" \"))[1]===o&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader(\"Last-Modified\"))&&(S.lastModified[f]=u),(u=T.getResponseHeader(\"etag\"))&&(S.etag[f]=u)),204===e||\"HEAD\"===v.type?l=\"nocontent\":304===e?l=\"notmodified\":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l=\"error\",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+\"\",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?\"ajaxSuccess\":\"ajaxError\",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger(\"ajaxComplete\",[T,v]),--S.active||S.event.trigger(\"ajaxStop\")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,\"json\")},getScript:function(e,t){return S.get(e,void 0,t,\"script\")}}),S.each([\"get\",\"post\"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)\"content-type\"===t.toLowerCase()&&(e.contentType=e.headers[t]||\"\")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,converters:{\"text script\":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&\"withCredentials\"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e[\"X-Requested-With\"]||(e[\"X-Requested-With\"]=\"XMLHttpRequest\"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,\"abort\"===e?r.abort():\"error\"===e?\"number\"!=typeof r.status?t(0,\"error\"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,\"text\"!==(r.responseType||\"text\")||\"string\"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o(\"error\"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o(\"abort\");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),S.ajaxTransport(\"script\",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S(\"<script>\").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on(\"load error\",i=function(e){r.remove(),i=null,e&&t(\"error\"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\\?(?=&|$)|\\?\\?/;S.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=zt.pop()||S.expando+\"_\"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter(\"json jsonp\",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?\"url\":\"string\"==typeof e.data&&0===(e.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ut.test(e.data)&&\"data\");if(a||\"jsonp\"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,\"$1\"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?\"&\":\"?\")+e.jsonp+\"=\"+r),e.converters[\"script json\"]=function(){return o||S.error(r+\" was not called\"),o[0]},e.dataTypes[0]=\"json\",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),\"script\"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument(\"\").body).innerHTML=\"<form></form><form></form>\",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return\"string\"!=typeof e?[]:(\"boolean\"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(i=\"POST\"),0<a.length&&S.ajax({url:e,type:i||\"GET\",dataType:\"html\",data:t}).done(function(e){o=arguments,a.html(r?S(\"<div>\").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,\"position\"),c=S(e),f={};\"static\"===l&&(e.style.position=\"relative\"),s=c.offset(),o=S.css(e,\"top\"),u=S.css(e,\"left\"),(\"absolute\"===l||\"fixed\"===l)&&-1<(o+u).indexOf(\"auto\")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),\"using\"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===S.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===S.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,\"borderTopWidth\",!0),i.left+=S.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-S.css(r,\"marginTop\",!0),left:t.left-i.left-S.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===S.css(e,\"position\"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,i){var o=\"pageYOffset\"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each([\"top\",\"left\"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+\"px\":t})}),S.each({Height:\"height\",Width:\"width\"},function(a,s){S.each({padding:\"inner\"+a,content:s,\"\":\"outer\"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||\"boolean\"!=typeof e),i=r||(!0===e||!0===t?\"margin\":\"border\");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf(\"outer\")?e[\"inner\"+a]:e.document.documentElement[\"client\"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body[\"scroll\"+a],r[\"scroll\"+a],e.body[\"offset\"+a],r[\"offset\"+a],r[\"client\"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?\"\":(e+\"\").replace(Xt,\"\")},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},\"undefined\"==typeof e&&(C.jQuery=C.$=S),S});\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<script type=\"module\">\n",
       "  window.__itables_render = async (table_id, dt_args) => {\n",
       "    await initializeDataTables();\n",
       "    $(table_id).DataTable(dt_args);\n",
       "  };\n",
       "\n",
       "  async function initializeDataTables() {\n",
       "    if ($.prototype.DataTable) {\n",
       "      return;\n",
       "    }\n",
       "    const dt = (await import(\"data:text/javascript;base64,LyohIERhdGFUYWJsZXMgMS4xMi4xCiAqIMKpMjAwOC0yMDIyIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAqLwoKLy8gRVNNIGV4cG9ydCBvZiBEYXRhVGFibGVzCmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgkLCByb290KSB7CglpZiAoISByb290KSB7CgkJcm9vdCA9IHdpbmRvdzsKCX0KCglpZiAoISAkKSB7CgkJJCA9IHdpbmRvdy5qUXVlcnk7Cgl9CgoJCgl2YXIgRGF0YVRhYmxlID0gZnVuY3Rpb24gKCBzZWxlY3Rvciwgb3B0aW9ucyApCgl7CgkJLy8gV2hlbiBjcmVhdGluZyB3aXRoIGBuZXdgLCBjcmVhdGUgYSBuZXcgRGF0YVRhYmxlLCByZXR1cm5pbmcgdGhlIEFQSSBpbnN0YW5jZQoJCWlmICh0aGlzIGluc3RhbmNlb2YgRGF0YVRhYmxlKSB7CgkJCXJldHVybiAkKHNlbGVjdG9yKS5EYXRhVGFibGUob3B0aW9ucyk7CgkJfQoJCWVsc2UgewoJCQkvLyBBcmd1bWVudCBzd2l0Y2hpbmcKCQkJb3B0aW9ucyA9IHNlbGVjdG9yOwoJCX0KCQoJCS8qKgoJCSAqIFBlcmZvcm0gYSBqUXVlcnkgc2VsZWN0b3IgYWN0aW9uIG9uIHRoZSB0YWJsZSdzIFRSIGVsZW1lbnRzIChmcm9tIHRoZSB0Ym9keSkgYW5kCgkJICogcmV0dXJuIHRoZSByZXN1bHRpbmcgalF1ZXJ5IG9iamVjdC4KCQkgKiAgQHBhcmFtIHtzdHJpbmd8bm9kZXxqUXVlcnl9IHNTZWxlY3RvciBqUXVlcnkgc2VsZWN0b3Igb3Igbm9kZSBjb2xsZWN0aW9uIHRvIGFjdCBvbgoJCSAqICBAcGFyYW0ge29iamVjdH0gW29PcHRzXSBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBtb2RpZnlpbmcgdGhlIHJvd3MgdG8gYmUgaW5jbHVkZWQKCQkgKiAgQHBhcmFtIHtzdHJpbmd9IFtvT3B0cy5maWx0ZXI9bm9uZV0gU2VsZWN0IFRSIGVsZW1lbnRzIHRoYXQgbWVldCB0aGUgY3VycmVudCBmaWx0ZXIKCQkgKiAgICBjcml0ZXJpb24gKCJhcHBsaWVkIikgb3IgYWxsIFRSIGVsZW1lbnRzIChpLmUuIG5vIGZpbHRlcikuCgkJICogIEBwYXJhbSB7c3RyaW5nfSBbb09wdHMub3JkZXI9Y3VycmVudF0gT3JkZXIgb2YgdGhlIFRSIGVsZW1lbnRzIGluIHRoZSBwcm9jZXNzZWQgYXJyYXkuCgkJICogICAgQ2FuIGJlIGVpdGhlciAnY3VycmVudCcsIHdoZXJlYnkgdGhlIGN1cnJlbnQgc29ydGluZyBvZiB0aGUgdGFibGUgaXMgdXNlZCwgb3IKCQkgKiAgICAnb3JpZ2luYWwnIHdoZXJlYnkgdGhlIG9yaWdpbmFsIG9yZGVyIHRoZSBkYXRhIHdhcyByZWFkIGludG8gdGhlIHRhYmxlIGlzIHVzZWQuCgkJICogIEBwYXJhbSB7c3RyaW5nfSBbb09wdHMucGFnZT1hbGxdIExpbWl0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZQoJCSAqICAgICgiY3VycmVudCIpIG9yIG5vdCAoImFsbCIpLiBJZiAnY3VycmVudCcgaXMgZ2l2ZW4sIHRoZW4gb3JkZXIgaXMgYXNzdW1lZCB0byBiZQoJCSAqICAgICdjdXJyZW50JyBhbmQgZmlsdGVyIGlzICdhcHBsaWVkJywgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZXkgbWlnaHQgYmUgZ2l2ZW4gYXMuCgkJICogIEByZXR1cm5zIHtvYmplY3R9IGpRdWVyeSBvYmplY3QsIGZpbHRlcmVkIGJ5IHRoZSBnaXZlbiBzZWxlY3Rvci4KCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKgoJCSAqICAgICAgLy8gSGlnaGxpZ2h0IGV2ZXJ5IHNlY29uZCByb3cKCQkgKiAgICAgIG9UYWJsZS4kKCd0cjpvZGQnKS5jc3MoJ2JhY2tncm91bmRDb2xvcicsICdibHVlJyk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKgoJCSAqICAgICAgLy8gRmlsdGVyIHRvIHJvd3Mgd2l0aCAnV2Via2l0JyBpbiB0aGVtLCBhZGQgYSBiYWNrZ3JvdW5kIGNvbG91ciBhbmQgdGhlbgoJCSAqICAgICAgLy8gcmVtb3ZlIHRoZSBmaWx0ZXIsIHRodXMgaGlnaGxpZ2h0aW5nIHRoZSAnV2Via2l0JyByb3dzIG9ubHkuCgkJICogICAgICBvVGFibGUuZm5GaWx0ZXIoJ1dlYmtpdCcpOwoJCSAqICAgICAgb1RhYmxlLiQoJ3RyJywgeyJzZWFyY2giOiAiYXBwbGllZCJ9KS5jc3MoJ2JhY2tncm91bmRDb2xvcicsICdibHVlJyk7CgkJICogICAgICBvVGFibGUuZm5GaWx0ZXIoJycpOwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLiQgPSBmdW5jdGlvbiAoIHNTZWxlY3Rvciwgb09wdHMgKQoJCXsKCQkJcmV0dXJuIHRoaXMuYXBpKHRydWUpLiQoIHNTZWxlY3Rvciwgb09wdHMgKTsKCQl9OwoJCQoJCQoJCS8qKgoJCSAqIEFsbW9zdCBpZGVudGljYWwgdG8gJCBpbiBvcGVyYXRpb24sIGJ1dCBpbiB0aGlzIGNhc2UgcmV0dXJucyB0aGUgZGF0YSBmb3IgdGhlIG1hdGNoZWQKCQkgKiByb3dzIC0gYXMgc3VjaCwgdGhlIGpRdWVyeSBzZWxlY3RvciB1c2VkIHNob3VsZCBtYXRjaCBUUiByb3cgbm9kZXMgb3IgVEQvVEggY2VsbCBub2RlcwoJCSAqIHJhdGhlciB0aGFuIGFueSBkZXNjZW5kYW50cywgc28gdGhlIGRhdGEgY2FuIGJlIG9idGFpbmVkIGZvciB0aGUgcm93L2NlbGwuIElmIG1hdGNoaW5nCgkJICogcm93cyBhcmUgZm91bmQsIHRoZSBkYXRhIHJldHVybmVkIGlzIHRoZSBvcmlnaW5hbCBkYXRhIGFycmF5L29iamVjdCB0aGF0IHdhcyB1c2VkIHRvCgkJICogY3JlYXRlIHRoZSByb3cgKG9yIGEgZ2VuZXJhdGVkIGFycmF5IGlmIGZyb20gYSBET00gc291cmNlKS4KCQkgKgoJCSAqIFRoaXMgbWV0aG9kIGlzIG9mdGVuIHVzZWZ1bCBpbi1jb21iaW5hdGlvbiB3aXRoICQgd2hlcmUgYm90aCBmdW5jdGlvbnMgYXJlIGdpdmVuIHRoZQoJCSAqIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIGFycmF5IGluZGV4ZXMgd2lsbCBtYXRjaCBpZGVudGljYWxseS4KCQkgKiAgQHBhcmFtIHtzdHJpbmd8bm9kZXxqUXVlcnl9IHNTZWxlY3RvciBqUXVlcnkgc2VsZWN0b3Igb3Igbm9kZSBjb2xsZWN0aW9uIHRvIGFjdCBvbgoJCSAqICBAcGFyYW0ge29iamVjdH0gW29PcHRzXSBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBtb2RpZnlpbmcgdGhlIHJvd3MgdG8gYmUgaW5jbHVkZWQKCQkgKiAgQHBhcmFtIHtzdHJpbmd9IFtvT3B0cy5maWx0ZXI9bm9uZV0gU2VsZWN0IGVsZW1lbnRzIHRoYXQgbWVldCB0aGUgY3VycmVudCBmaWx0ZXIKCQkgKiAgICBjcml0ZXJpb24gKCJhcHBsaWVkIikgb3IgYWxsIGVsZW1lbnRzIChpLmUuIG5vIGZpbHRlcikuCgkJICogIEBwYXJhbSB7c3RyaW5nfSBbb09wdHMub3JkZXI9Y3VycmVudF0gT3JkZXIgb2YgdGhlIGRhdGEgaW4gdGhlIHByb2Nlc3NlZCBhcnJheS4KCQkgKiAgICBDYW4gYmUgZWl0aGVyICdjdXJyZW50Jywgd2hlcmVieSB0aGUgY3VycmVudCBzb3J0aW5nIG9mIHRoZSB0YWJsZSBpcyB1c2VkLCBvcgoJCSAqICAgICdvcmlnaW5hbCcgd2hlcmVieSB0aGUgb3JpZ2luYWwgb3JkZXIgdGhlIGRhdGEgd2FzIHJlYWQgaW50byB0aGUgdGFibGUgaXMgdXNlZC4KCQkgKiAgQHBhcmFtIHtzdHJpbmd9IFtvT3B0cy5wYWdlPWFsbF0gTGltaXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlCgkJICogICAgKCJjdXJyZW50Iikgb3Igbm90ICgiYWxsIikuIElmICdjdXJyZW50JyBpcyBnaXZlbiwgdGhlbiBvcmRlciBpcyBhc3N1bWVkIHRvIGJlCgkJICogICAgJ2N1cnJlbnQnIGFuZCBmaWx0ZXIgaXMgJ2FwcGxpZWQnLCByZWdhcmRsZXNzIG9mIHdoYXQgdGhleSBtaWdodCBiZSBnaXZlbiBhcy4KCQkgKiAgQHJldHVybnMge2FycmF5fSBEYXRhIGZvciB0aGUgbWF0Y2hlZCBlbGVtZW50cy4gSWYgYW55IGVsZW1lbnRzLCBhcyBhIHJlc3VsdCBvZiB0aGUKCQkgKiAgICBzZWxlY3Rvciwgd2VyZSBub3QgVFIsIFREIG9yIFRIIGVsZW1lbnRzIGluIHRoZSBEYXRhVGFibGUsIHRoZXkgd2lsbCBoYXZlIGEgbnVsbAoJCSAqICAgIGVudHJ5IGluIHRoZSBhcnJheS4KCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKgoJCSAqICAgICAgLy8gR2V0IHRoZSBkYXRhIGZyb20gdGhlIGZpcnN0IHJvdyBpbiB0aGUgdGFibGUKCQkgKiAgICAgIHZhciBkYXRhID0gb1RhYmxlLl8oJ3RyOmZpcnN0Jyk7CgkJICoKCQkgKiAgICAgIC8vIERvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUgZGF0YQoJCSAqICAgICAgYWxlcnQoICJGaXJzdCBjZWxsIGlzOiAiK2RhdGFbMF0gKTsKCQkgKiAgICB9ICk7CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkgKiAgICAgIHZhciBvVGFibGUgPSAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJCSAqCgkJICogICAgICAvLyBGaWx0ZXIgdG8gJ1dlYmtpdCcgYW5kIGdldCBhbGwgZGF0YSBmb3IKCQkgKiAgICAgIG9UYWJsZS5mbkZpbHRlcignV2Via2l0Jyk7CgkJICogICAgICB2YXIgZGF0YSA9IG9UYWJsZS5fKCd0cicsIHsic2VhcmNoIjogImFwcGxpZWQifSk7CgkJICoKCQkgKiAgICAgIC8vIERvIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhCgkJICogICAgICBhbGVydCggZGF0YS5sZW5ndGgrIiByb3dzIG1hdGNoZWQgdGhlIHNlYXJjaCIgKTsKCQkgKiAgICB9ICk7CgkJICovCgkJdGhpcy5fID0gZnVuY3Rpb24gKCBzU2VsZWN0b3IsIG9PcHRzICkKCQl7CgkJCXJldHVybiB0aGlzLmFwaSh0cnVlKS5yb3dzKCBzU2VsZWN0b3IsIG9PcHRzICkuZGF0YSgpOwoJCX07CgkJCgkJCgkJLyoqCgkJICogQ3JlYXRlIGEgRGF0YVRhYmxlcyBBcGkgaW5zdGFuY2UsIHdpdGggdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YWJsZXMgZm9yCgkJICogdGhlIEFwaSdzIGNvbnRleHQuCgkJICogQHBhcmFtIHtib29sZWFufSBbdHJhZGl0aW9uYWw9ZmFsc2VdIFNldCB0aGUgQVBJIGluc3RhbmNlJ3MgY29udGV4dCB0byBiZQoJCSAqICAgb25seSB0aGUgdGFibGUgcmVmZXJyZWQgdG8gYnkgdGhlIGBEYXRhVGFibGUuZXh0LmlBcGlJbmRleGAgb3B0aW9uLCBhcyB3YXMKCQkgKiAgIHVzZWQgaW4gdGhlIEFQSSBwcmVzZW50ZWQgYnkgRGF0YVRhYmxlcyAxLjktIChpLmUuIHRoZSB0cmFkaXRpb25hbCBtb2RlKSwKCQkgKiAgIG9yIGlmIGFsbCB0YWJsZXMgY2FwdHVyZWQgaW4gdGhlIGpRdWVyeSBvYmplY3Qgc2hvdWxkIGJlIHVzZWQuCgkJICogQHJldHVybiB7RGF0YVRhYmxlcy5BcGl9CgkJICovCgkJdGhpcy5hcGkgPSBmdW5jdGlvbiAoIHRyYWRpdGlvbmFsICkKCQl7CgkJCXJldHVybiB0cmFkaXRpb25hbCA/CgkJCQluZXcgX0FwaSgKCQkJCQlfZm5TZXR0aW5nc0Zyb21Ob2RlKCB0aGlzWyBfZXh0LmlBcGlJbmRleCBdICkKCQkJCSkgOgoJCQkJbmV3IF9BcGkoIHRoaXMgKTsKCQl9OwoJCQoJCQoJCS8qKgoJCSAqIEFkZCBhIHNpbmdsZSBuZXcgcm93IG9yIG11bHRpcGxlIHJvd3Mgb2YgZGF0YSB0byB0aGUgdGFibGUuIFBsZWFzZSBub3RlCgkJICogdGhhdCB0aGlzIGlzIHN1aXRhYmxlIGZvciBjbGllbnQtc2lkZSBwcm9jZXNzaW5nIG9ubHkgLSBpZiB5b3UgYXJlIHVzaW5nCgkJICogc2VydmVyLXNpZGUgcHJvY2Vzc2luZyAoaS5lLiAiYlNlcnZlclNpZGUiOiB0cnVlKSwgdGhlbiB0byBhZGQgZGF0YSwgeW91CgkJICogbXVzdCBhZGQgaXQgdG8gdGhlIGRhdGEgc291cmNlLCBpLmUuIHRoZSBzZXJ2ZXItc2lkZSwgdGhyb3VnaCBhbiBBamF4IGNhbGwuCgkJICogIEBwYXJhbSB7YXJyYXl8b2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSB0YWJsZS4gVGhpcyBjYW4gYmU6CgkJICogICAgPHVsPgoJCSAqICAgICAgPGxpPjFEIGFycmF5IG9mIGRhdGEgLSBhZGQgYSBzaW5nbGUgcm93IHdpdGggdGhlIGRhdGEgcHJvdmlkZWQ8L2xpPgoJCSAqICAgICAgPGxpPjJEIGFycmF5IG9mIGFycmF5cyAtIGFkZCBtdWx0aXBsZSByb3dzIGluIGEgc2luZ2xlIGNhbGw8L2xpPgoJCSAqICAgICAgPGxpPm9iamVjdCAtIGRhdGEgb2JqZWN0IHdoZW4gdXNpbmcgPGk+bURhdGE8L2k+PC9saT4KCQkgKiAgICAgIDxsaT5hcnJheSBvZiBvYmplY3RzIC0gbXVsdGlwbGUgZGF0YSBvYmplY3RzIHdoZW4gdXNpbmcgPGk+bURhdGE8L2k+PC9saT4KCQkgKiAgICA8L3VsPgoJCSAqICBAcGFyYW0ge2Jvb2x9IFtyZWRyYXc9dHJ1ZV0gcmVkcmF3IHRoZSB0YWJsZSBvciBub3QKCQkgKiAgQHJldHVybnMge2FycmF5fSBBbiBhcnJheSBvZiBpbnRlZ2VycywgcmVwcmVzZW50aW5nIHRoZSBsaXN0IG9mIGluZGV4ZXMgaW4KCQkgKiAgICA8aT5hb0RhdGE8L2k+ICh7QGxpbmsgRGF0YVRhYmxlLm1vZGVscy5vU2V0dGluZ3N9KSB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0bwoJCSAqICAgIHRoZSB0YWJsZS4KCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gR2xvYmFsIHZhciBmb3IgY291bnRlcgoJCSAqICAgIHZhciBnaUNvdW50ID0gMjsKCQkgKgoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKiAgICB9ICk7CgkJICoKCQkgKiAgICBmdW5jdGlvbiBmbkNsaWNrQWRkUm93KCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKS5mbkFkZERhdGEoIFsKCQkgKiAgICAgICAgZ2lDb3VudCsiLjEiLAoJCSAqICAgICAgICBnaUNvdW50KyIuMiIsCgkJICogICAgICAgIGdpQ291bnQrIi4zIiwKCQkgKiAgICAgICAgZ2lDb3VudCsiLjQiIF0KCQkgKiAgICAgICk7CgkJICoKCQkgKiAgICAgIGdpQ291bnQrKzsKCQkgKiAgICB9CgkJICovCgkJdGhpcy5mbkFkZERhdGEgPSBmdW5jdGlvbiggZGF0YSwgcmVkcmF3ICkKCQl7CgkJCXZhciBhcGkgPSB0aGlzLmFwaSggdHJ1ZSApOwoJCQoJCQkvKiBDaGVjayBpZiB3ZSB3YW50IHRvIGFkZCBtdWx0aXBsZSByb3dzIG9yIG5vdCAqLwoJCQl2YXIgcm93cyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgKCBBcnJheS5pc0FycmF5KGRhdGFbMF0pIHx8ICQuaXNQbGFpbk9iamVjdChkYXRhWzBdKSApID8KCQkJCWFwaS5yb3dzLmFkZCggZGF0YSApIDoKCQkJCWFwaS5yb3cuYWRkKCBkYXRhICk7CgkJCgkJCWlmICggcmVkcmF3ID09PSB1bmRlZmluZWQgfHwgcmVkcmF3ICkgewoJCQkJYXBpLmRyYXcoKTsKCQkJfQoJCQoJCQlyZXR1cm4gcm93cy5mbGF0dGVuKCkudG9BcnJheSgpOwoJCX07CgkJCgkJCgkJLyoqCgkJICogVGhpcyBmdW5jdGlvbiB3aWxsIG1ha2UgRGF0YVRhYmxlcyByZWNhbGN1bGF0ZSB0aGUgY29sdW1uIHNpemVzLCBiYXNlZCBvbiB0aGUgZGF0YQoJCSAqIGNvbnRhaW5lZCBpbiB0aGUgdGFibGUgYW5kIHRoZSBzaXplcyBhcHBsaWVkIHRvIHRoZSBjb2x1bW5zIChpbiB0aGUgRE9NLCBDU1Mgb3IKCQkgKiB0aHJvdWdoIHRoZSBzV2lkdGggcGFyYW1ldGVyKS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlIHdpZHRoIG9mIHRoZSB0YWJsZSdzCgkJICogcGFyZW50IGVsZW1lbnQgY2hhbmdlcyAoZm9yIGV4YW1wbGUgYSB3aW5kb3cgcmVzaXplKS4KCQkgKiAgQHBhcmFtIHtib29sZWFufSBbYlJlZHJhdz10cnVlXSBSZWRyYXcgdGhlIHRhYmxlIG9yIG5vdCwgeW91IHdpbGwgdHlwaWNhbGx5IHdhbnQgdG8KCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgInNTY3JvbGxZIjogIjIwMHB4IiwKCQkgKiAgICAgICAgImJQYWdpbmF0ZSI6IGZhbHNlCgkJICogICAgICB9ICk7CgkJICoKCQkgKiAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkgewoJCSAqICAgICAgICBvVGFibGUuZm5BZGp1c3RDb2x1bW5TaXppbmcoKTsKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJdGhpcy5mbkFkanVzdENvbHVtblNpemluZyA9IGZ1bmN0aW9uICggYlJlZHJhdyApCgkJewoJCQl2YXIgYXBpID0gdGhpcy5hcGkoIHRydWUgKS5jb2x1bW5zLmFkanVzdCgpOwoJCQl2YXIgc2V0dGluZ3MgPSBhcGkuc2V0dGluZ3MoKVswXTsKCQkJdmFyIHNjcm9sbCA9IHNldHRpbmdzLm9TY3JvbGw7CgkJCgkJCWlmICggYlJlZHJhdyA9PT0gdW5kZWZpbmVkIHx8IGJSZWRyYXcgKSB7CgkJCQlhcGkuZHJhdyggZmFsc2UgKTsKCQkJfQoJCQllbHNlIGlmICggc2Nyb2xsLnNYICE9PSAiIiB8fCBzY3JvbGwuc1kgIT09ICIiICkgewoJCQkJLyogSWYgbm90IHJlZHJhd2luZywgYnV0IHNjcm9sbGluZywgd2Ugd2FudCB0byBhcHBseSB0aGUgbmV3IGNvbHVtbiBzaXplcyBhbnl3YXkgKi8KCQkJCV9mblNjcm9sbERyYXcoIHNldHRpbmdzICk7CgkJCX0KCQl9OwoJCQoJCQoJCS8qKgoJCSAqIFF1aWNrbHkgYW5kIHNpbXBseSBjbGVhciBhIHRhYmxlCgkJICogIEBwYXJhbSB7Ym9vbH0gW2JSZWRyYXc9dHJ1ZV0gcmVkcmF3IHRoZSB0YWJsZSBvciBub3QKCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKgoJCSAqICAgICAgLy8gSW1tZWRpYXRlbHkgJ251a2UnIHRoZSBjdXJyZW50IHJvd3MgKHBlcmhhcHMgd2FpdGluZyBmb3IgYW4gQWpheCBjYWxsYmFjay4uLikKCQkgKiAgICAgIG9UYWJsZS5mbkNsZWFyVGFibGUoKTsKCQkgKiAgICB9ICk7CgkJICovCgkJdGhpcy5mbkNsZWFyVGFibGUgPSBmdW5jdGlvbiggYlJlZHJhdyApCgkJewoJCQl2YXIgYXBpID0gdGhpcy5hcGkoIHRydWUgKS5jbGVhcigpOwoJCQoJCQlpZiAoIGJSZWRyYXcgPT09IHVuZGVmaW5lZCB8fCBiUmVkcmF3ICkgewoJCQkJYXBpLmRyYXcoKTsKCQkJfQoJCX07CgkJCgkJCgkJLyoqCgkJICogVGhlIGV4YWN0IG9wcG9zaXRlIG9mICdvcGVuaW5nJyBhIHJvdywgdGhpcyBmdW5jdGlvbiB3aWxsIGNsb3NlIGFueSByb3dzIHdoaWNoCgkJICogYXJlIGN1cnJlbnRseSAnb3BlbicuCgkJICogIEBwYXJhbSB7bm9kZX0gblRyIHRoZSB0YWJsZSByb3cgdG8gJ2Nsb3NlJwoJCSAqICBAcmV0dXJucyB7aW50fSAwIG9uIHN1Y2Nlc3MsIG9yIDEgaWYgZmFpbGVkIChjYW4ndCBmaW5kIHRoZSByb3cpCgkJICogIEBkdG9wdCBBUEkKCQkgKiAgQGRlcHJlY2F0ZWQgU2luY2UgdjEuMTAKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCSAqICAgICAgdmFyIG9UYWJsZTsKCQkgKgoJCSAqICAgICAgLy8gJ29wZW4nIGFuIGluZm9ybWF0aW9uIHJvdyB3aGVuIGEgcm93IGlzIGNsaWNrZWQgb24KCQkgKiAgICAgICQoJyNleGFtcGxlIHRib2R5IHRyJykuY2xpY2soIGZ1bmN0aW9uICgpIHsKCQkgKiAgICAgICAgaWYgKCBvVGFibGUuZm5Jc09wZW4odGhpcykgKSB7CgkJICogICAgICAgICAgb1RhYmxlLmZuQ2xvc2UoIHRoaXMgKTsKCQkgKiAgICAgICAgfSBlbHNlIHsKCQkgKiAgICAgICAgICBvVGFibGUuZm5PcGVuKCB0aGlzLCAiVGVtcG9yYXJ5IHJvdyBvcGVuZWQiLCAiaW5mb19yb3ciICk7CgkJICogICAgICAgIH0KCQkgKiAgICAgIH0gKTsKCQkgKgoJCSAqICAgICAgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKiAgICB9ICk7CgkJICovCgkJdGhpcy5mbkNsb3NlID0gZnVuY3Rpb24oIG5UciApCgkJewoJCQl0aGlzLmFwaSggdHJ1ZSApLnJvdyggblRyICkuY2hpbGQuaGlkZSgpOwoJCX07CgkJCgkJCgkJLyoqCgkJICogUmVtb3ZlIGEgcm93IGZvciB0aGUgdGFibGUKCQkgKiAgQHBhcmFtIHttaXhlZH0gdGFyZ2V0IFRoZSBpbmRleCBvZiB0aGUgcm93IGZyb20gYW9EYXRhIHRvIGJlIGRlbGV0ZWQsIG9yCgkJICogICAgdGhlIFRSIGVsZW1lbnQgeW91IHdhbnQgdG8gZGVsZXRlCgkJICogIEBwYXJhbSB7ZnVuY3Rpb258bnVsbH0gW2NhbGxCYWNrXSBDYWxsYmFjayBmdW5jdGlvbgoJCSAqICBAcGFyYW0ge2Jvb2x9IFtyZWRyYXc9dHJ1ZV0gUmVkcmF3IHRoZSB0YWJsZSBvciBub3QKCQkgKiAgQHJldHVybnMge2FycmF5fSBUaGUgcm93IHRoYXQgd2FzIGRlbGV0ZWQKCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKgoJCSAqICAgICAgLy8gSW1tZWRpYXRlbHkgcmVtb3ZlIHRoZSBmaXJzdCByb3cKCQkgKiAgICAgIG9UYWJsZS5mbkRlbGV0ZVJvdyggMCApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLmZuRGVsZXRlUm93ID0gZnVuY3Rpb24oIHRhcmdldCwgY2FsbGJhY2ssIHJlZHJhdyApCgkJewoJCQl2YXIgYXBpID0gdGhpcy5hcGkoIHRydWUgKTsKCQkJdmFyIHJvd3MgPSBhcGkucm93cyggdGFyZ2V0ICk7CgkJCXZhciBzZXR0aW5ncyA9IHJvd3Muc2V0dGluZ3MoKVswXTsKCQkJdmFyIGRhdGEgPSBzZXR0aW5ncy5hb0RhdGFbIHJvd3NbMF1bMF0gXTsKCQkKCQkJcm93cy5yZW1vdmUoKTsKCQkKCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCWNhbGxiYWNrLmNhbGwoIHRoaXMsIHNldHRpbmdzLCBkYXRhICk7CgkJCX0KCQkKCQkJaWYgKCByZWRyYXcgPT09IHVuZGVmaW5lZCB8fCByZWRyYXcgKSB7CgkJCQlhcGkuZHJhdygpOwoJCQl9CgkJCgkJCXJldHVybiBkYXRhOwoJCX07CgkJCgkJCgkJLyoqCgkJICogUmVzdG9yZSB0aGUgdGFibGUgdG8gaXQncyBvcmlnaW5hbCBzdGF0ZSBpbiB0aGUgRE9NIGJ5IHJlbW92aW5nIGFsbCBvZiBEYXRhVGFibGVzCgkJICogZW5oYW5jZW1lbnRzLCBhbHRlcmF0aW9ucyB0byB0aGUgRE9NIHN0cnVjdHVyZSBvZiB0aGUgdGFibGUgYW5kIGV2ZW50IGxpc3RlbmVycy4KCQkgKiAgQHBhcmFtIHtib29sZWFufSBbcmVtb3ZlPWZhbHNlXSBDb21wbGV0ZWx5IHJlbW92ZSB0aGUgdGFibGUgZnJvbSB0aGUgRE9NCgkJICogIEBkdG9wdCBBUEkKCQkgKiAgQGRlcHJlY2F0ZWQgU2luY2UgdjEuMTAKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCSAqICAgICAgLy8gVGhpcyBleGFtcGxlIGlzIGZhaXJseSBwb2ludGxlc3MgaW4gcmVhbGl0eSwgYnV0IHNob3dzIGhvdyBmbkRlc3Ryb3kgY2FuIGJlIHVzZWQKCQkgKiAgICAgIHZhciBvVGFibGUgPSAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJCSAqICAgICAgb1RhYmxlLmZuRGVzdHJveSgpOwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLmZuRGVzdHJveSA9IGZ1bmN0aW9uICggcmVtb3ZlICkKCQl7CgkJCXRoaXMuYXBpKCB0cnVlICkuZGVzdHJveSggcmVtb3ZlICk7CgkJfTsKCQkKCQkKCQkvKioKCQkgKiBSZWRyYXcgdGhlIHRhYmxlCgkJICogIEBwYXJhbSB7Ym9vbH0gW2NvbXBsZXRlPXRydWVdIFJlLWZpbHRlciBhbmQgcmVzb3J0IChpZiBlbmFibGVkKSB0aGUgdGFibGUgYmVmb3JlIHRoZSBkcmF3LgoJCSAqICBAZHRvcHQgQVBJCgkJICogIEBkZXByZWNhdGVkIFNpbmNlIHYxLjEwCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkgKiAgICAgIHZhciBvVGFibGUgPSAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJCSAqCgkJICogICAgICAvLyBSZS1kcmF3IHRoZSB0YWJsZSAtIHlvdSB3b3VsZG4ndCB3YW50IHRvIGRvIGl0IGhlcmUsIGJ1dCBpdCdzIGFuIGV4YW1wbGUgOi0pCgkJICogICAgICBvVGFibGUuZm5EcmF3KCk7CgkJICogICAgfSApOwoJCSAqLwoJCXRoaXMuZm5EcmF3ID0gZnVuY3Rpb24oIGNvbXBsZXRlICkKCQl7CgkJCS8vIE5vdGUgdGhhdCB0aGlzIGlzbid0IGFuIGV4YWN0IG1hdGNoIHRvIHRoZSBvbGQgY2FsbCB0byBfZm5EcmF3IC0gaXQgdGFrZXMKCQkJLy8gaW50byBhY2NvdW50IHRoZSBuZXcgZGF0YSwgYnV0IGNhbiBob2xkIHBvc2l0aW9uLgoJCQl0aGlzLmFwaSggdHJ1ZSApLmRyYXcoIGNvbXBsZXRlICk7CgkJfTsKCQkKCQkKCQkvKioKCQkgKiBGaWx0ZXIgdGhlIGlucHV0IGJhc2VkIG9uIGRhdGEKCQkgKiAgQHBhcmFtIHtzdHJpbmd9IHNJbnB1dCBTdHJpbmcgdG8gZmlsdGVyIHRoZSB0YWJsZSBvbgoJCSAqICBAcGFyYW0ge2ludHxudWxsfSBbaUNvbHVtbl0gQ29sdW1uIHRvIGxpbWl0IGZpbHRlcmluZyB0bwoJCSAqICBAcGFyYW0ge2Jvb2x9IFtiUmVnZXg9ZmFsc2VdIFRyZWF0IGFzIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBub3QKCQkgKiAgQHBhcmFtIHtib29sfSBbYlNtYXJ0PXRydWVdIFBlcmZvcm0gc21hcnQgZmlsdGVyaW5nIG9yIG5vdAoJCSAqICBAcGFyYW0ge2Jvb2x9IFtiU2hvd0dsb2JhbD10cnVlXSBTaG93IHRoZSBpbnB1dCBnbG9iYWwgZmlsdGVyIGluIGl0J3MgaW5wdXQgYm94KGVzKQoJCSAqICBAcGFyYW0ge2Jvb2x9IFtiQ2FzZUluc2Vuc2l0aXZlPXRydWVdIERvIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcgKHRydWUpIG9yIG5vdCAoZmFsc2UpCgkJICogIEBkdG9wdCBBUEkKCQkgKiAgQGRlcHJlY2F0ZWQgU2luY2UgdjEuMTAKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCSAqICAgICAgdmFyIG9UYWJsZSA9ICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCk7CgkJICoKCQkgKiAgICAgIC8vIFNvbWV0aW1lIGxhdGVyIC0gZmlsdGVyLi4uCgkJICogICAgICBvVGFibGUuZm5GaWx0ZXIoICd0ZXN0IHN0cmluZycgKTsKCQkgKiAgICB9ICk7CgkJICovCgkJdGhpcy5mbkZpbHRlciA9IGZ1bmN0aW9uKCBzSW5wdXQsIGlDb2x1bW4sIGJSZWdleCwgYlNtYXJ0LCBiU2hvd0dsb2JhbCwgYkNhc2VJbnNlbnNpdGl2ZSApCgkJewoJCQl2YXIgYXBpID0gdGhpcy5hcGkoIHRydWUgKTsKCQkKCQkJaWYgKCBpQ29sdW1uID09PSBudWxsIHx8IGlDb2x1bW4gPT09IHVuZGVmaW5lZCApIHsKCQkJCWFwaS5zZWFyY2goIHNJbnB1dCwgYlJlZ2V4LCBiU21hcnQsIGJDYXNlSW5zZW5zaXRpdmUgKTsKCQkJfQoJCQllbHNlIHsKCQkJCWFwaS5jb2x1bW4oIGlDb2x1bW4gKS5zZWFyY2goIHNJbnB1dCwgYlJlZ2V4LCBiU21hcnQsIGJDYXNlSW5zZW5zaXRpdmUgKTsKCQkJfQoJCQoJCQlhcGkuZHJhdygpOwoJCX07CgkJCgkJCgkJLyoqCgkJICogR2V0IHRoZSBkYXRhIGZvciB0aGUgd2hvbGUgdGFibGUsIGFuIGluZGl2aWR1YWwgcm93IG9yIGFuIGluZGl2aWR1YWwgY2VsbCBiYXNlZCBvbiB0aGUKCQkgKiBwcm92aWRlZCBwYXJhbWV0ZXJzLgoJCSAqICBAcGFyYW0ge2ludHxub2RlfSBbc3JjXSBBIFRSIHJvdyBub2RlLCBURC9USCBjZWxsIG5vZGUgb3IgYW4gaW50ZWdlci4gSWYgZ2l2ZW4gYXMKCQkgKiAgICBhIFRSIG5vZGUgdGhlbiB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSB3aG9sZSByb3cgd2lsbCBiZSByZXR1cm5lZC4gSWYgZ2l2ZW4gYXMgYQoJCSAqICAgIFREL1RIIGNlbGwgbm9kZSB0aGVuIGlDb2wgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgYW5kIHRoZSBkYXRhIGZvciB0aGUKCQkgKiAgICBjZWxsIHJldHVybmVkLiBJZiBnaXZlbiBhcyBhbiBpbnRlZ2VyLCB0aGVuIHRoaXMgaXMgdHJlYXRlZCBhcyB0aGUgYW9EYXRhIGludGVybmFsCgkJICogICAgZGF0YSBpbmRleCBmb3IgdGhlIHJvdyAoc2VlIGZuR2V0UG9zaXRpb24pIGFuZCB0aGUgZGF0YSBmb3IgdGhhdCByb3cgdXNlZC4KCQkgKiAgQHBhcmFtIHtpbnR9IFtjb2xdIE9wdGlvbmFsIGNvbHVtbiBpbmRleCB0aGF0IHlvdSB3YW50IHRoZSBkYXRhIG9mLgoJCSAqICBAcmV0dXJucyB7YXJyYXl8b2JqZWN0fHN0cmluZ30gSWYgbVJvdyBpcyB1bmRlZmluZWQsIHRoZW4gdGhlIGRhdGEgZm9yIGFsbCByb3dzIGlzCgkJICogICAgcmV0dXJuZWQuIElmIG1Sb3cgaXMgZGVmaW5lZCwganVzdCBkYXRhIGZvciB0aGF0IHJvdywgYW5kIGlzIGlDb2wgaXMKCQkgKiAgICBkZWZpbmVkLCBvbmx5IGRhdGEgZm9yIHRoZSBkZXNpZ25hdGVkIGNlbGwgaXMgcmV0dXJuZWQuCgkJICogIEBkdG9wdCBBUEkKCQkgKiAgQGRlcHJlY2F0ZWQgU2luY2UgdjEuMTAKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFJvdyBkYXRhCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICBvVGFibGUgPSAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJCSAqCgkJICogICAgICBvVGFibGUuJCgndHInKS5jbGljayggZnVuY3Rpb24gKCkgewoJCSAqICAgICAgICB2YXIgZGF0YSA9IG9UYWJsZS5mbkdldERhdGEoIHRoaXMgKTsKCQkgKiAgICAgICAgLy8gLi4uIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBhcnJheSAvIG9iamVjdCBvZiBkYXRhIGZvciB0aGUgcm93CgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gSW5kaXZpZHVhbCBjZWxsIGRhdGEKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkgKiAgICAgIG9UYWJsZSA9ICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCk7CgkJICoKCQkgKiAgICAgIG9UYWJsZS4kKCd0ZCcpLmNsaWNrKCBmdW5jdGlvbiAoKSB7CgkJICogICAgICAgIHZhciBzRGF0YSA9IG9UYWJsZS5mbkdldERhdGEoIHRoaXMgKTsKCQkgKiAgICAgICAgYWxlcnQoICdUaGUgY2VsbCBjbGlja2VkIG9uIGhhZCB0aGUgdmFsdWUgb2YgJytzRGF0YSApOwoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLmZuR2V0RGF0YSA9IGZ1bmN0aW9uKCBzcmMsIGNvbCApCgkJewoJCQl2YXIgYXBpID0gdGhpcy5hcGkoIHRydWUgKTsKCQkKCQkJaWYgKCBzcmMgIT09IHVuZGVmaW5lZCApIHsKCQkJCXZhciB0eXBlID0gc3JjLm5vZGVOYW1lID8gc3JjLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgOiAnJzsKCQkKCQkJCXJldHVybiBjb2wgIT09IHVuZGVmaW5lZCB8fCB0eXBlID09ICd0ZCcgfHwgdHlwZSA9PSAndGgnID8KCQkJCQlhcGkuY2VsbCggc3JjLCBjb2wgKS5kYXRhKCkgOgoJCQkJCWFwaS5yb3coIHNyYyApLmRhdGEoKSB8fCBudWxsOwoJCQl9CgkJCgkJCXJldHVybiBhcGkuZGF0YSgpLnRvQXJyYXkoKTsKCQl9OwoJCQoJCQoJCS8qKgoJCSAqIEdldCBhbiBhcnJheSBvZiB0aGUgVFIgbm9kZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgdGFibGUncyBib2R5LiBOb3RlIHRoYXQgeW91IHdpbGwKCQkgKiB0eXBpY2FsbHkgd2FudCB0byB1c2UgdGhlICckJyBBUEkgbWV0aG9kIGluIHByZWZlcmVuY2UgdG8gdGhpcyBhcyBpdCBpcyBtb3JlCgkJICogZmxleGlibGUuCgkJICogIEBwYXJhbSB7aW50fSBbaVJvd10gT3B0aW9uYWwgcm93IGluZGV4IGZvciB0aGUgVFIgZWxlbWVudCB5b3Ugd2FudAoJCSAqICBAcmV0dXJucyB7YXJyYXl8bm9kZX0gSWYgaVJvdyBpcyB1bmRlZmluZWQsIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIFRSIGVsZW1lbnRzCgkJICogICAgaW4gdGhlIHRhYmxlJ3MgYm9keSwgb3IgaVJvdyBpcyBkZWZpbmVkLCBqdXN0IHRoZSBUUiBlbGVtZW50IHJlcXVlc3RlZC4KCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKgoJCSAqICAgICAgLy8gR2V0IHRoZSBub2RlcyBmcm9tIHRoZSB0YWJsZQoJCSAqICAgICAgdmFyIG5Ob2RlcyA9IG9UYWJsZS5mbkdldE5vZGVzKCApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLmZuR2V0Tm9kZXMgPSBmdW5jdGlvbiggaVJvdyApCgkJewoJCQl2YXIgYXBpID0gdGhpcy5hcGkoIHRydWUgKTsKCQkKCQkJcmV0dXJuIGlSb3cgIT09IHVuZGVmaW5lZCA/CgkJCQlhcGkucm93KCBpUm93ICkubm9kZSgpIDoKCQkJCWFwaS5yb3dzKCkubm9kZXMoKS5mbGF0dGVuKCkudG9BcnJheSgpOwoJCX07CgkJCgkJCgkJLyoqCgkJICogR2V0IHRoZSBhcnJheSBpbmRleGVzIG9mIGEgcGFydGljdWxhciBjZWxsIGZyb20gaXQncyBET00gZWxlbWVudAoJCSAqIGFuZCBjb2x1bW4gaW5kZXggaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zCgkJICogIEBwYXJhbSB7bm9kZX0gbm9kZSB0aGlzIGNhbiBlaXRoZXIgYmUgYSBUUiwgVEQgb3IgVEggaW4gdGhlIHRhYmxlJ3MgYm9keQoJCSAqICBAcmV0dXJucyB7aW50fSBJZiBuTm9kZSBpcyBnaXZlbiBhcyBhIFRSLCB0aGVuIGEgc2luZ2xlIGluZGV4IGlzIHJldHVybmVkLCBvcgoJCSAqICAgIGlmIGdpdmVuIGFzIGEgY2VsbCwgYW4gYXJyYXkgb2YgW3JvdyBpbmRleCwgY29sdW1uIGluZGV4ICh2aXNpYmxlKSwKCQkgKiAgICBjb2x1bW4gaW5kZXggKGFsbCldIGlzIGdpdmVuLgoJCSAqICBAZHRvcHQgQVBJCgkJICogIEBkZXByZWNhdGVkIFNpbmNlIHYxLjEwCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlIHRib2R5IHRkJykuY2xpY2soIGZ1bmN0aW9uICgpIHsKCQkgKiAgICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBkYXRhIGZyb20gdGhlIG5vZGUKCQkgKiAgICAgICAgdmFyIGFQb3MgPSBvVGFibGUuZm5HZXRQb3NpdGlvbiggdGhpcyApOwoJCSAqCgkJICogICAgICAgIC8vIEdldCB0aGUgZGF0YSBhcnJheSBmb3IgdGhpcyByb3cKCQkgKiAgICAgICAgdmFyIGFEYXRhID0gb1RhYmxlLmZuR2V0RGF0YSggYVBvc1swXSApOwoJCSAqCgkJICogICAgICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBhcnJheSBhbmQgcmV0dXJuIHRoZSB2YWx1ZQoJCSAqICAgICAgICBhRGF0YVsgYVBvc1sxXSBdID0gJ2NsaWNrZWQnOwoJCSAqICAgICAgICB0aGlzLmlubmVySFRNTCA9ICdjbGlja2VkJzsKCQkgKiAgICAgIH0gKTsKCQkgKgoJCSAqICAgICAgLy8gSW5pdCBEYXRhVGFibGVzCgkJICogICAgICBvVGFibGUgPSAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLmZuR2V0UG9zaXRpb24gPSBmdW5jdGlvbiggbm9kZSApCgkJewoJCQl2YXIgYXBpID0gdGhpcy5hcGkoIHRydWUgKTsKCQkJdmFyIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpOwoJCQoJCQlpZiAoIG5vZGVOYW1lID09ICdUUicgKSB7CgkJCQlyZXR1cm4gYXBpLnJvdyggbm9kZSApLmluZGV4KCk7CgkJCX0KCQkJZWxzZSBpZiAoIG5vZGVOYW1lID09ICdURCcgfHwgbm9kZU5hbWUgPT0gJ1RIJyApIHsKCQkJCXZhciBjZWxsID0gYXBpLmNlbGwoIG5vZGUgKS5pbmRleCgpOwoJCQoJCQkJcmV0dXJuIFsKCQkJCQljZWxsLnJvdywKCQkJCQljZWxsLmNvbHVtblZpc2libGUsCgkJCQkJY2VsbC5jb2x1bW4KCQkJCV07CgkJCX0KCQkJcmV0dXJuIG51bGw7CgkJfTsKCQkKCQkKCQkvKioKCQkgKiBDaGVjayB0byBzZWUgaWYgYSByb3cgaXMgJ29wZW4nIG9yIG5vdC4KCQkgKiAgQHBhcmFtIHtub2RlfSBuVHIgdGhlIHRhYmxlIHJvdyB0byBjaGVjawoJCSAqICBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcm93IGlzIGN1cnJlbnRseSBvcGVuLCBmYWxzZSBvdGhlcndpc2UKCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlOwoJCSAqCgkJICogICAgICAvLyAnb3BlbicgYW4gaW5mb3JtYXRpb24gcm93IHdoZW4gYSByb3cgaXMgY2xpY2tlZCBvbgoJCSAqICAgICAgJCgnI2V4YW1wbGUgdGJvZHkgdHInKS5jbGljayggZnVuY3Rpb24gKCkgewoJCSAqICAgICAgICBpZiAoIG9UYWJsZS5mbklzT3Blbih0aGlzKSApIHsKCQkgKiAgICAgICAgICBvVGFibGUuZm5DbG9zZSggdGhpcyApOwoJCSAqICAgICAgICB9IGVsc2UgewoJCSAqICAgICAgICAgIG9UYWJsZS5mbk9wZW4oIHRoaXMsICJUZW1wb3Jhcnkgcm93IG9wZW5lZCIsICJpbmZvX3JvdyIgKTsKCQkgKiAgICAgICAgfQoJCSAqICAgICAgfSApOwoJCSAqCgkJICogICAgICBvVGFibGUgPSAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLmZuSXNPcGVuID0gZnVuY3Rpb24oIG5UciApCgkJewoJCQlyZXR1cm4gdGhpcy5hcGkoIHRydWUgKS5yb3coIG5UciApLmNoaWxkLmlzU2hvd24oKTsKCQl9OwoJCQoJCQoJCS8qKgoJCSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBwbGFjZSBhIG5ldyByb3cgZGlyZWN0bHkgYWZ0ZXIgYSByb3cgd2hpY2ggaXMgY3VycmVudGx5CgkJICogb24gZGlzcGxheSBvbiB0aGUgcGFnZSwgd2l0aCB0aGUgSFRNTCBjb250ZW50cyB0aGF0IGlzIHBhc3NlZCBpbnRvIHRoZQoJCSAqIGZ1bmN0aW9uLiBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gYXNrIGZvciBjb25maXJtYXRpb24gdGhhdCBhCgkJICogcGFydGljdWxhciByZWNvcmQgc2hvdWxkIGJlIGRlbGV0ZWQuCgkJICogIEBwYXJhbSB7bm9kZX0gblRyIFRoZSB0YWJsZSByb3cgdG8gJ29wZW4nCgkJICogIEBwYXJhbSB7c3RyaW5nfG5vZGV8alF1ZXJ5fSBtSHRtbCBUaGUgSFRNTCB0byBwdXQgaW50byB0aGUgcm93CgkJICogIEBwYXJhbSB7c3RyaW5nfSBzQ2xhc3MgQ2xhc3MgdG8gZ2l2ZSB0aGUgbmV3IFREIGNlbGwKCQkgKiAgQHJldHVybnMge25vZGV9IFRoZSByb3cgb3BlbmVkLiBOb3RlIHRoYXQgaWYgdGhlIHRhYmxlIHJvdyBwYXNzZWQgaW4gYXMgdGhlCgkJICogICAgZmlyc3QgcGFyYW1ldGVyLCBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlLCB0aGlzIG1ldGhvZCB3aWxsIHNpbGVudGx5CgkJICogICAgcmV0dXJuLgoJCSAqICBAZHRvcHQgQVBJCgkJICogIEBkZXByZWNhdGVkIFNpbmNlIHYxLjEwCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkgKiAgICAgIHZhciBvVGFibGU7CgkJICoKCQkgKiAgICAgIC8vICdvcGVuJyBhbiBpbmZvcm1hdGlvbiByb3cgd2hlbiBhIHJvdyBpcyBjbGlja2VkIG9uCgkJICogICAgICAkKCcjZXhhbXBsZSB0Ym9keSB0cicpLmNsaWNrKCBmdW5jdGlvbiAoKSB7CgkJICogICAgICAgIGlmICggb1RhYmxlLmZuSXNPcGVuKHRoaXMpICkgewoJCSAqICAgICAgICAgIG9UYWJsZS5mbkNsb3NlKCB0aGlzICk7CgkJICogICAgICAgIH0gZWxzZSB7CgkJICogICAgICAgICAgb1RhYmxlLmZuT3BlbiggdGhpcywgIlRlbXBvcmFyeSByb3cgb3BlbmVkIiwgImluZm9fcm93IiApOwoJCSAqICAgICAgICB9CgkJICogICAgICB9ICk7CgkJICoKCQkgKiAgICAgIG9UYWJsZSA9ICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCk7CgkJICogICAgfSApOwoJCSAqLwoJCXRoaXMuZm5PcGVuID0gZnVuY3Rpb24oIG5UciwgbUh0bWwsIHNDbGFzcyApCgkJewoJCQlyZXR1cm4gdGhpcy5hcGkoIHRydWUgKQoJCQkJLnJvdyggblRyICkKCQkJCS5jaGlsZCggbUh0bWwsIHNDbGFzcyApCgkJCQkuc2hvdygpCgkJCQkuY2hpbGQoKVswXTsKCQl9OwoJCQoJCQoJCS8qKgoJCSAqIENoYW5nZSB0aGUgcGFnaW5hdGlvbiAtIHByb3ZpZGVzIHRoZSBpbnRlcm5hbCBsb2dpYyBmb3IgcGFnaW5hdGlvbiBpbiBhIHNpbXBsZSBBUEkKCQkgKiBmdW5jdGlvbi4gV2l0aCB0aGlzIGZ1bmN0aW9uIHlvdSBjYW4gaGF2ZSBhIERhdGFUYWJsZXMgdGFibGUgZ28gdG8gdGhlIG5leHQsCgkJICogcHJldmlvdXMsIGZpcnN0IG9yIGxhc3QgcGFnZXMuCgkJICogIEBwYXJhbSB7c3RyaW5nfGludH0gbUFjdGlvbiBQYWdpbmcgYWN0aW9uIHRvIHRha2U6ICJmaXJzdCIsICJwcmV2aW91cyIsICJuZXh0IiBvciAibGFzdCIKCQkgKiAgICBvciBwYWdlIG51bWJlciB0byBqdW1wIHRvIChpbnRlZ2VyKSwgbm90ZSB0aGF0IHBhZ2UgMCBpcyB0aGUgZmlyc3QgcGFnZS4KCQkgKiAgQHBhcmFtIHtib29sfSBbYlJlZHJhdz10cnVlXSBSZWRyYXcgdGhlIHRhYmxlIG9yIG5vdAoJCSAqICBAZHRvcHQgQVBJCgkJICogIEBkZXByZWNhdGVkIFNpbmNlIHYxLjEwCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkgKiAgICAgIHZhciBvVGFibGUgPSAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJCSAqICAgICAgb1RhYmxlLmZuUGFnZUNoYW5nZSggJ25leHQnICk7CgkJICogICAgfSApOwoJCSAqLwoJCXRoaXMuZm5QYWdlQ2hhbmdlID0gZnVuY3Rpb24gKCBtQWN0aW9uLCBiUmVkcmF3ICkKCQl7CgkJCXZhciBhcGkgPSB0aGlzLmFwaSggdHJ1ZSApLnBhZ2UoIG1BY3Rpb24gKTsKCQkKCQkJaWYgKCBiUmVkcmF3ID09PSB1bmRlZmluZWQgfHwgYlJlZHJhdyApIHsKCQkJCWFwaS5kcmF3KGZhbHNlKTsKCQkJfQoJCX07CgkJCgkJCgkJLyoqCgkJICogU2hvdyBhIHBhcnRpY3VsYXIgY29sdW1uCgkJICogIEBwYXJhbSB7aW50fSBpQ29sIFRoZSBjb2x1bW4gd2hvc2UgZGlzcGxheSBzaG91bGQgYmUgY2hhbmdlZAoJCSAqICBAcGFyYW0ge2Jvb2x9IGJTaG93IFNob3cgKHRydWUpIG9yIGhpZGUgKGZhbHNlKSB0aGUgY29sdW1uCgkJICogIEBwYXJhbSB7Ym9vbH0gW2JSZWRyYXc9dHJ1ZV0gUmVkcmF3IHRoZSB0YWJsZSBvciBub3QKCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKgoJCSAqICAgICAgLy8gSGlkZSB0aGUgc2Vjb25kIGNvbHVtbiBhZnRlciBpbml0aWFsaXNhdGlvbgoJCSAqICAgICAgb1RhYmxlLmZuU2V0Q29sdW1uVmlzKCAxLCBmYWxzZSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLmZuU2V0Q29sdW1uVmlzID0gZnVuY3Rpb24gKCBpQ29sLCBiU2hvdywgYlJlZHJhdyApCgkJewoJCQl2YXIgYXBpID0gdGhpcy5hcGkoIHRydWUgKS5jb2x1bW4oIGlDb2wgKS52aXNpYmxlKCBiU2hvdyApOwoJCQoJCQlpZiAoIGJSZWRyYXcgPT09IHVuZGVmaW5lZCB8fCBiUmVkcmF3ICkgewoJCQkJYXBpLmNvbHVtbnMuYWRqdXN0KCkuZHJhdygpOwoJCQl9CgkJfTsKCQkKCQkKCQkvKioKCQkgKiBHZXQgdGhlIHNldHRpbmdzIGZvciBhIHBhcnRpY3VsYXIgdGFibGUgZm9yIGV4dGVybmFsIG1hbmlwdWxhdGlvbgoJCSAqICBAcmV0dXJucyB7b2JqZWN0fSBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdC4gU2VlCgkJICogICAge0BsaW5rIERhdGFUYWJsZS5tb2RlbHMub1NldHRpbmdzfQoJCSAqICBAZHRvcHQgQVBJCgkJICogIEBkZXByZWNhdGVkIFNpbmNlIHYxLjEwCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkgKiAgICAgIHZhciBvVGFibGUgPSAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJCSAqICAgICAgdmFyIG9TZXR0aW5ncyA9IG9UYWJsZS5mblNldHRpbmdzKCk7CgkJICoKCQkgKiAgICAgIC8vIFNob3cgYW4gZXhhbXBsZSBwYXJhbWV0ZXIgZnJvbSB0aGUgc2V0dGluZ3MKCQkgKiAgICAgIGFsZXJ0KCBvU2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQgKTsKCQkgKiAgICB9ICk7CgkJICovCgkJdGhpcy5mblNldHRpbmdzID0gZnVuY3Rpb24oKQoJCXsKCQkJcmV0dXJuIF9mblNldHRpbmdzRnJvbU5vZGUoIHRoaXNbX2V4dC5pQXBpSW5kZXhdICk7CgkJfTsKCQkKCQkKCQkvKioKCQkgKiBTb3J0IHRoZSB0YWJsZSBieSBhIHBhcnRpY3VsYXIgY29sdW1uCgkJICogIEBwYXJhbSB7aW50fSBpQ29sIHRoZSBkYXRhIGluZGV4IHRvIHNvcnQgb24uIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IG1hdGNoIHRoZQoJCSAqICAgICdkaXNwbGF5IGluZGV4JyBpZiB5b3UgaGF2ZSBoaWRkZW4gZGF0YSBlbnRyaWVzCgkJICogIEBkdG9wdCBBUEkKCQkgKiAgQGRlcHJlY2F0ZWQgU2luY2UgdjEuMTAKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCSAqICAgICAgdmFyIG9UYWJsZSA9ICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCk7CgkJICoKCQkgKiAgICAgIC8vIFNvcnQgaW1tZWRpYXRlbHkgd2l0aCBjb2x1bW5zIDAgYW5kIDEKCQkgKiAgICAgIG9UYWJsZS5mblNvcnQoIFsgWzAsJ2FzYyddLCBbMSwnYXNjJ10gXSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLmZuU29ydCA9IGZ1bmN0aW9uKCBhYVNvcnQgKQoJCXsKCQkJdGhpcy5hcGkoIHRydWUgKS5vcmRlciggYWFTb3J0ICkuZHJhdygpOwoJCX07CgkJCgkJCgkJLyoqCgkJICogQXR0YWNoIGEgc29ydCBsaXN0ZW5lciB0byBhbiBlbGVtZW50IGZvciBhIGdpdmVuIGNvbHVtbgoJCSAqICBAcGFyYW0ge25vZGV9IG5Ob2RlIHRoZSBlbGVtZW50IHRvIGF0dGFjaCB0aGUgc29ydCBsaXN0ZW5lciB0bwoJCSAqICBAcGFyYW0ge2ludH0gaUNvbHVtbiB0aGUgY29sdW1uIHRoYXQgYSBjbGljayBvbiB0aGlzIG5vZGUgd2lsbCBzb3J0IG9uCgkJICogIEBwYXJhbSB7ZnVuY3Rpb259IFtmbkNhbGxiYWNrXSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHNvcnQgaXMgcnVuCgkJICogIEBkdG9wdCBBUEkKCQkgKiAgQGRlcHJlY2F0ZWQgU2luY2UgdjEuMTAKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCSAqICAgICAgdmFyIG9UYWJsZSA9ICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCk7CgkJICoKCQkgKiAgICAgIC8vIFNvcnQgb24gY29sdW1uIDEsIHdoZW4gJ3NvcnRlcicgaXMgY2xpY2tlZCBvbgoJCSAqICAgICAgb1RhYmxlLmZuU29ydExpc3RlbmVyKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc29ydGVyJyksIDEgKTsKCQkgKiAgICB9ICk7CgkJICovCgkJdGhpcy5mblNvcnRMaXN0ZW5lciA9IGZ1bmN0aW9uKCBuTm9kZSwgaUNvbHVtbiwgZm5DYWxsYmFjayApCgkJewoJCQl0aGlzLmFwaSggdHJ1ZSApLm9yZGVyLmxpc3RlbmVyKCBuTm9kZSwgaUNvbHVtbiwgZm5DYWxsYmFjayApOwoJCX07CgkJCgkJCgkJLyoqCgkJICogVXBkYXRlIGEgdGFibGUgY2VsbCBvciByb3cgLSB0aGlzIG1ldGhvZCB3aWxsIGFjY2VwdCBlaXRoZXIgYSBzaW5nbGUgdmFsdWUgdG8KCQkgKiB1cGRhdGUgdGhlIGNlbGwgd2l0aCwgYW4gYXJyYXkgb2YgdmFsdWVzIHdpdGggb25lIGVsZW1lbnQgZm9yIGVhY2ggY29sdW1uIG9yCgkJICogYW4gb2JqZWN0IGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb3JpZ2luYWwgZGF0YSBzb3VyY2UuIFRoZSBmdW5jdGlvbiBpcwoJCSAqIHNlbGYtcmVmZXJlbmNpbmcgaW4gb3JkZXIgdG8gbWFrZSB0aGUgbXVsdGkgY29sdW1uIHVwZGF0ZXMgZWFzaWVyLgoJCSAqICBAcGFyYW0ge29iamVjdHxhcnJheXxzdHJpbmd9IG1EYXRhIERhdGEgdG8gdXBkYXRlIHRoZSBjZWxsL3JvdyB3aXRoCgkJICogIEBwYXJhbSB7bm9kZXxpbnR9IG1Sb3cgVFIgZWxlbWVudCB5b3Ugd2FudCB0byB1cGRhdGUgb3IgdGhlIGFvRGF0YSBpbmRleAoJCSAqICBAcGFyYW0ge2ludH0gW2lDb2x1bW5dIFRoZSBjb2x1bW4gdG8gdXBkYXRlLCBnaXZlIGFzIG51bGwgb3IgdW5kZWZpbmVkIHRvCgkJICogICAgdXBkYXRlIGEgd2hvbGUgcm93LgoJCSAqICBAcGFyYW0ge2Jvb2x9IFtiUmVkcmF3PXRydWVdIFJlZHJhdyB0aGUgdGFibGUgb3Igbm90CgkJICogIEBwYXJhbSB7Ym9vbH0gW2JBY3Rpb249dHJ1ZV0gUGVyZm9ybSBwcmUtZHJhdyBhY3Rpb25zIG9yIG5vdAoJCSAqICBAcmV0dXJucyB7aW50fSAwIG9uIHN1Y2Nlc3MsIDEgb24gZXJyb3IKCQkgKiAgQGR0b3B0IEFQSQoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJICogICAgICB2YXIgb1RhYmxlID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKTsKCQkgKiAgICAgIG9UYWJsZS5mblVwZGF0ZSggJ0V4YW1wbGUgdXBkYXRlJywgMCwgMCApOyAvLyBTaW5nbGUgY2VsbAoJCSAqICAgICAgb1RhYmxlLmZuVXBkYXRlKCBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddLCAkKCd0Ym9keSB0cicpWzBdICk7IC8vIFJvdwoJCSAqICAgIH0gKTsKCQkgKi8KCQl0aGlzLmZuVXBkYXRlID0gZnVuY3Rpb24oIG1EYXRhLCBtUm93LCBpQ29sdW1uLCBiUmVkcmF3LCBiQWN0aW9uICkKCQl7CgkJCXZhciBhcGkgPSB0aGlzLmFwaSggdHJ1ZSApOwoJCQoJCQlpZiAoIGlDb2x1bW4gPT09IHVuZGVmaW5lZCB8fCBpQ29sdW1uID09PSBudWxsICkgewoJCQkJYXBpLnJvdyggbVJvdyApLmRhdGEoIG1EYXRhICk7CgkJCX0KCQkJZWxzZSB7CgkJCQlhcGkuY2VsbCggbVJvdywgaUNvbHVtbiApLmRhdGEoIG1EYXRhICk7CgkJCX0KCQkKCQkJaWYgKCBiQWN0aW9uID09PSB1bmRlZmluZWQgfHwgYkFjdGlvbiApIHsKCQkJCWFwaS5jb2x1bW5zLmFkanVzdCgpOwoJCQl9CgkJCgkJCWlmICggYlJlZHJhdyA9PT0gdW5kZWZpbmVkIHx8IGJSZWRyYXcgKSB7CgkJCQlhcGkuZHJhdygpOwoJCQl9CgkJCXJldHVybiAwOwoJCX07CgkJCgkJCgkJLyoqCgkJICogUHJvdmlkZSBhIGNvbW1vbiBtZXRob2QgZm9yIHBsdWctaW5zIHRvIGNoZWNrIHRoZSB2ZXJzaW9uIG9mIERhdGFUYWJsZXMgYmVpbmcgdXNlZCwgaW4gb3JkZXIKCQkgKiB0byBlbnN1cmUgY29tcGF0aWJpbGl0eS4KCQkgKiAgQHBhcmFtIHtzdHJpbmd9IHNWZXJzaW9uIFZlcnNpb24gc3RyaW5nIHRvIGNoZWNrIGZvciwgaW4gdGhlIGZvcm1hdCAiWC5ZLloiLiBOb3RlIHRoYXQgdGhlCgkJICogICAgZm9ybWF0cyAiWCIgYW5kICJYLlkiIGFyZSBhbHNvIGFjY2VwdGFibGUuCgkJICogIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoaXMgdmVyc2lvbiBvZiBEYXRhVGFibGVzIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHJlcXVpcmVkCgkJICogICAgdmVyc2lvbiwgb3IgZmFsc2UgaWYgdGhpcyB2ZXJzaW9uIG9mIERhdGFUYWxlcyBpcyBub3Qgc3VpdGFibGUKCQkgKiAgQG1ldGhvZAoJCSAqICBAZHRvcHQgQVBJCgkJICogIEBkZXByZWNhdGVkIFNpbmNlIHYxLjEwCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkgKiAgICAgIHZhciBvVGFibGUgPSAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJCSAqICAgICAgYWxlcnQoIG9UYWJsZS5mblZlcnNpb25DaGVjayggJzEuOS4wJyApICk7CgkJICogICAgfSApOwoJCSAqLwoJCXRoaXMuZm5WZXJzaW9uQ2hlY2sgPSBfZXh0LmZuVmVyc2lvbkNoZWNrOwoJCQoJCgkJdmFyIF90aGF0ID0gdGhpczsKCQl2YXIgZW1wdHlJbml0ID0gb3B0aW9ucyA9PT0gdW5kZWZpbmVkOwoJCXZhciBsZW4gPSB0aGlzLmxlbmd0aDsKCQoJCWlmICggZW1wdHlJbml0ICkgewoJCQlvcHRpb25zID0ge307CgkJfQoJCgkJdGhpcy5vQXBpID0gdGhpcy5pbnRlcm5hbCA9IF9leHQuaW50ZXJuYWw7CgkKCQkvLyBFeHRlbmQgd2l0aCBvbGQgc3R5bGUgcGx1Zy1pbiBBUEkgbWV0aG9kcwoJCWZvciAoIHZhciBmbiBpbiBEYXRhVGFibGUuZXh0LmludGVybmFsICkgewoJCQlpZiAoIGZuICkgewoJCQkJdGhpc1tmbl0gPSBfZm5FeHRlcm5BcGlGdW5jKGZuKTsKCQkJfQoJCX0KCQoJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gRm9yIGVhY2ggaW5pdGlhbGlzYXRpb24gd2Ugd2FudCB0byBnaXZlIGl0IGEgY2xlYW4gaW5pdGlhbGlzYXRpb24KCQkJLy8gb2JqZWN0IHRoYXQgY2FuIGJlIGJhc2hlZCBhcm91bmQKCQkJdmFyIG8gPSB7fTsKCQkJdmFyIG9Jbml0ID0gbGVuID4gMSA/IC8vIG9wdGltaXNhdGlvbiBmb3Igc2luZ2xlIHRhYmxlIGNhc2UKCQkJCV9mbkV4dGVuZCggbywgb3B0aW9ucywgdHJ1ZSApIDoKCQkJCW9wdGlvbnM7CgkKCQkJLypnbG9iYWwgb0luaXQsX3RoYXQsZW1wdHlJbml0Ki8KCQkJdmFyIGk9MCwgaUxlbiwgaiwgakxlbiwgaywga0xlbjsKCQkJdmFyIHNJZCA9IHRoaXMuZ2V0QXR0cmlidXRlKCAnaWQnICk7CgkJCXZhciBiSW5pdEhhbmRlZE9mZiA9IGZhbHNlOwoJCQl2YXIgZGVmYXVsdHMgPSBEYXRhVGFibGUuZGVmYXVsdHM7CgkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQoJCQkKCQkJLyogU2FuaXR5IGNoZWNrICovCgkJCWlmICggdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9ICd0YWJsZScgKQoJCQl7CgkJCQlfZm5Mb2coIG51bGwsIDAsICdOb24tdGFibGUgbm9kZSBpbml0aWFsaXNhdGlvbiAoJyt0aGlzLm5vZGVOYW1lKycpJywgMiApOwoJCQkJcmV0dXJuOwoJCQl9CgkJCQoJCQkvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdGhlIGRlZmF1bHRzICovCgkJCV9mbkNvbXBhdE9wdHMoIGRlZmF1bHRzICk7CgkJCV9mbkNvbXBhdENvbHMoIGRlZmF1bHRzLmNvbHVtbiApOwoJCQkKCQkJLyogQ29udmVydCB0aGUgY2FtZWwtY2FzZSBkZWZhdWx0cyB0byBIdW5nYXJpYW4gKi8KCQkJX2ZuQ2FtZWxUb0h1bmdhcmlhbiggZGVmYXVsdHMsIGRlZmF1bHRzLCB0cnVlICk7CgkJCV9mbkNhbWVsVG9IdW5nYXJpYW4oIGRlZmF1bHRzLmNvbHVtbiwgZGVmYXVsdHMuY29sdW1uLCB0cnVlICk7CgkJCQoJCQkvKiBTZXR0aW5nIHVwIHRoZSBpbml0aWFsaXNhdGlvbiBvYmplY3QgKi8KCQkJX2ZuQ2FtZWxUb0h1bmdhcmlhbiggZGVmYXVsdHMsICQuZXh0ZW5kKCBvSW5pdCwgJHRoaXMuZGF0YSgpICksIHRydWUgKTsKCQkJCgkJCQoJCQkKCQkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSByZS1pbml0aWFsaXNpbmcgYSB0YWJsZSAqLwoJCQl2YXIgYWxsU2V0dGluZ3MgPSBEYXRhVGFibGUuc2V0dGluZ3M7CgkJCWZvciAoIGk9MCwgaUxlbj1hbGxTZXR0aW5ncy5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCQl7CgkJCQl2YXIgcyA9IGFsbFNldHRpbmdzW2ldOwoJCQkKCQkJCS8qIEJhc2UgY2hlY2sgb24gdGFibGUgbm9kZSAqLwoJCQkJaWYgKAoJCQkJCXMublRhYmxlID09IHRoaXMgfHwKCQkJCQkocy5uVEhlYWQgJiYgcy5uVEhlYWQucGFyZW50Tm9kZSA9PSB0aGlzKSB8fAoJCQkJCShzLm5URm9vdCAmJiBzLm5URm9vdC5wYXJlbnROb2RlID09IHRoaXMpCgkJCQkpIHsKCQkJCQl2YXIgYlJldHJpZXZlID0gb0luaXQuYlJldHJpZXZlICE9PSB1bmRlZmluZWQgPyBvSW5pdC5iUmV0cmlldmUgOiBkZWZhdWx0cy5iUmV0cmlldmU7CgkJCQkJdmFyIGJEZXN0cm95ID0gb0luaXQuYkRlc3Ryb3kgIT09IHVuZGVmaW5lZCA/IG9Jbml0LmJEZXN0cm95IDogZGVmYXVsdHMuYkRlc3Ryb3k7CgkJCQoJCQkJCWlmICggZW1wdHlJbml0IHx8IGJSZXRyaWV2ZSApCgkJCQkJewoJCQkJCQlyZXR1cm4gcy5vSW5zdGFuY2U7CgkJCQkJfQoJCQkJCWVsc2UgaWYgKCBiRGVzdHJveSApCgkJCQkJewoJCQkJCQlzLm9JbnN0YW5jZS5mbkRlc3Ryb3koKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCV9mbkxvZyggcywgMCwgJ0Nhbm5vdCByZWluaXRpYWxpc2UgRGF0YVRhYmxlJywgMyApOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJfQoJCQkKCQkJCS8qIElmIHRoZSBlbGVtZW50IHdlIGFyZSBpbml0aWFsaXNpbmcgaGFzIHRoZSBzYW1lIElEIGFzIGEgdGFibGUgd2hpY2ggd2FzIHByZXZpb3VzbHkKCQkJCSAqIGluaXRpYWxpc2VkLCBidXQgdGhlIHRhYmxlIG5vZGVzIGRvbid0IG1hdGNoIChmcm9tIGJlZm9yZSkgdGhlbiB3ZSBkZXN0cm95IHRoZSBvbGQKCQkJCSAqIGluc3RhbmNlIGJ5IHNpbXBseSBkZWxldGluZyBpdC4gVGhpcyBpcyB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSB0YWJsZSBoYXMgYmVlbgoJCQkJICogZGVzdHJveWVkIGJ5IG90aGVyIG1ldGhvZHMuIEFueW9uZSB1c2luZyBub24taWQgc2VsZWN0b3JzIHdpbGwgbmVlZCB0byBkbyB0aGlzIG1hbnVhbGx5CgkJCQkgKi8KCQkJCWlmICggcy5zVGFibGVJZCA9PSB0aGlzLmlkICkKCQkJCXsKCQkJCQlhbGxTZXR0aW5ncy5zcGxpY2UoIGksIDEgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQkKCQkJLyogRW5zdXJlIHRoZSB0YWJsZSBoYXMgYW4gSUQgLSByZXF1aXJlZCBmb3IgYWNjZXNzaWJpbGl0eSAqLwoJCQlpZiAoIHNJZCA9PT0gbnVsbCB8fCBzSWQgPT09ICIiICkKCQkJewoJCQkJc0lkID0gIkRhdGFUYWJsZXNfVGFibGVfIisoRGF0YVRhYmxlLmV4dC5fdW5pcXVlKyspOwoJCQkJdGhpcy5pZCA9IHNJZDsKCQkJfQoJCQkKCQkJLyogQ3JlYXRlIHRoZSBzZXR0aW5ncyBvYmplY3QgZm9yIHRoaXMgdGFibGUgYW5kIHNldCBzb21lIG9mIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KCQkJdmFyIG9TZXR0aW5ncyA9ICQuZXh0ZW5kKCB0cnVlLCB7fSwgRGF0YVRhYmxlLm1vZGVscy5vU2V0dGluZ3MsIHsKCQkJCSJzRGVzdHJveVdpZHRoIjogJHRoaXNbMF0uc3R5bGUud2lkdGgsCgkJCQkic0luc3RhbmNlIjogICAgIHNJZCwKCQkJCSJzVGFibGVJZCI6ICAgICAgc0lkCgkJCX0gKTsKCQkJb1NldHRpbmdzLm5UYWJsZSA9IHRoaXM7CgkJCW9TZXR0aW5ncy5vQXBpICAgPSBfdGhhdC5pbnRlcm5hbDsKCQkJb1NldHRpbmdzLm9Jbml0ICA9IG9Jbml0OwoJCQkKCQkJYWxsU2V0dGluZ3MucHVzaCggb1NldHRpbmdzICk7CgkJCQoJCQkvLyBOZWVkIHRvIGFkZCB0aGUgaW5zdGFuY2UgYWZ0ZXIgdGhlIGluc3RhbmNlIGFmdGVyIHRoZSBzZXR0aW5ncyBvYmplY3QgaGFzIGJlZW4gYWRkZWQKCQkJLy8gdG8gdGhlIHNldHRpbmdzIGFycmF5LCBzbyB3ZSBjYW4gc2VsZiByZWZlcmVuY2UgdGhlIHRhYmxlIGluc3RhbmNlIGlmIG1vcmUgdGhhbiBvbmUKCQkJb1NldHRpbmdzLm9JbnN0YW5jZSA9IChfdGhhdC5sZW5ndGg9PT0xKSA/IF90aGF0IDogJHRoaXMuZGF0YVRhYmxlKCk7CgkJCQoJCQkvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYmVmb3JlIHdlIGFwcGx5IGFsbCB0aGUgZGVmYXVsdHMKCQkJX2ZuQ29tcGF0T3B0cyggb0luaXQgKTsKCQkJX2ZuTGFuZ3VhZ2VDb21wYXQoIG9Jbml0Lm9MYW5ndWFnZSApOwoJCQkKCQkJLy8gSWYgdGhlIGxlbmd0aCBtZW51IGlzIGdpdmVuLCBidXQgdGhlIGluaXQgZGlzcGxheSBsZW5ndGggaXMgbm90LCB1c2UgdGhlIGxlbmd0aCBtZW51CgkJCWlmICggb0luaXQuYUxlbmd0aE1lbnUgJiYgISBvSW5pdC5pRGlzcGxheUxlbmd0aCApCgkJCXsKCQkJCW9Jbml0LmlEaXNwbGF5TGVuZ3RoID0gQXJyYXkuaXNBcnJheSggb0luaXQuYUxlbmd0aE1lbnVbMF0gKSA/CgkJCQkJb0luaXQuYUxlbmd0aE1lbnVbMF1bMF0gOiBvSW5pdC5hTGVuZ3RoTWVudVswXTsKCQkJfQoJCQkKCQkJLy8gQXBwbHkgdGhlIGRlZmF1bHRzIGFuZCBpbml0IG9wdGlvbnMgdG8gbWFrZSBhIHNpbmdsZSBpbml0IG9iamVjdCB3aWxsIGFsbAoJCQkvLyBvcHRpb25zIGRlZmluZWQgZnJvbSBkZWZhdWx0cyBhbmQgaW5zdGFuY2Ugb3B0aW9ucy4KCQkJb0luaXQgPSBfZm5FeHRlbmQoICQuZXh0ZW5kKCB0cnVlLCB7fSwgZGVmYXVsdHMgKSwgb0luaXQgKTsKCQkJCgkJCQoJCQkvLyBNYXAgdGhlIGluaXRpYWxpc2F0aW9uIG9wdGlvbnMgb250byB0aGUgc2V0dGluZ3Mgb2JqZWN0CgkJCV9mbk1hcCggb1NldHRpbmdzLm9GZWF0dXJlcywgb0luaXQsIFsKCQkJCSJiUGFnaW5hdGUiLAoJCQkJImJMZW5ndGhDaGFuZ2UiLAoJCQkJImJGaWx0ZXIiLAoJCQkJImJTb3J0IiwKCQkJCSJiU29ydE11bHRpIiwKCQkJCSJiSW5mbyIsCgkJCQkiYlByb2Nlc3NpbmciLAoJCQkJImJBdXRvV2lkdGgiLAoJCQkJImJTb3J0Q2xhc3NlcyIsCgkJCQkiYlNlcnZlclNpZGUiLAoJCQkJImJEZWZlclJlbmRlciIKCQkJXSApOwoJCQlfZm5NYXAoIG9TZXR0aW5ncywgb0luaXQsIFsKCQkJCSJhc1N0cmlwZUNsYXNzZXMiLAoJCQkJImFqYXgiLAoJCQkJImZuU2VydmVyRGF0YSIsCgkJCQkiZm5Gb3JtYXROdW1iZXIiLAoJCQkJInNTZXJ2ZXJNZXRob2QiLAoJCQkJImFhU29ydGluZyIsCgkJCQkiYWFTb3J0aW5nRml4ZWQiLAoJCQkJImFMZW5ndGhNZW51IiwKCQkJCSJzUGFnaW5hdGlvblR5cGUiLAoJCQkJInNBamF4U291cmNlIiwKCQkJCSJzQWpheERhdGFQcm9wIiwKCQkJCSJpU3RhdGVEdXJhdGlvbiIsCgkJCQkic0RvbSIsCgkJCQkiYlNvcnRDZWxsc1RvcCIsCgkJCQkiaVRhYkluZGV4IiwKCQkJCSJmblN0YXRlTG9hZENhbGxiYWNrIiwKCQkJCSJmblN0YXRlU2F2ZUNhbGxiYWNrIiwKCQkJCSJyZW5kZXJlciIsCgkJCQkic2VhcmNoRGVsYXkiLAoJCQkJInJvd0lkIiwKCQkJCVsgImlDb29raWVEdXJhdGlvbiIsICJpU3RhdGVEdXJhdGlvbiIgXSwgLy8gYmFja3dhcmRzIGNvbXBhdAoJCQkJWyAib1NlYXJjaCIsICJvUHJldmlvdXNTZWFyY2giIF0sCgkJCQlbICJhb1NlYXJjaENvbHMiLCAiYW9QcmVTZWFyY2hDb2xzIiBdLAoJCQkJWyAiaURpc3BsYXlMZW5ndGgiLCAiX2lEaXNwbGF5TGVuZ3RoIiBdCgkJCV0gKTsKCQkJX2ZuTWFwKCBvU2V0dGluZ3Mub1Njcm9sbCwgb0luaXQsIFsKCQkJCVsgInNTY3JvbGxYIiwgInNYIiBdLAoJCQkJWyAic1Njcm9sbFhJbm5lciIsICJzWElubmVyIiBdLAoJCQkJWyAic1Njcm9sbFkiLCAic1kiIF0sCgkJCQlbICJiU2Nyb2xsQ29sbGFwc2UiLCAiYkNvbGxhcHNlIiBdCgkJCV0gKTsKCQkJX2ZuTWFwKCBvU2V0dGluZ3Mub0xhbmd1YWdlLCBvSW5pdCwgImZuSW5mb0NhbGxiYWNrIiApOwoJCQkKCQkJLyogQ2FsbGJhY2sgZnVuY3Rpb25zIHdoaWNoIGFyZSBhcnJheSBkcml2ZW4gKi8KCQkJX2ZuQ2FsbGJhY2tSZWcoIG9TZXR0aW5ncywgJ2FvRHJhd0NhbGxiYWNrJywgICAgICAgb0luaXQuZm5EcmF3Q2FsbGJhY2ssICAgICAgJ3VzZXInICk7CgkJCV9mbkNhbGxiYWNrUmVnKCBvU2V0dGluZ3MsICdhb1NlcnZlclBhcmFtcycsICAgICAgIG9Jbml0LmZuU2VydmVyUGFyYW1zLCAgICAgICd1c2VyJyApOwoJCQlfZm5DYWxsYmFja1JlZyggb1NldHRpbmdzLCAnYW9TdGF0ZVNhdmVQYXJhbXMnLCAgICBvSW5pdC5mblN0YXRlU2F2ZVBhcmFtcywgICAndXNlcicgKTsKCQkJX2ZuQ2FsbGJhY2tSZWcoIG9TZXR0aW5ncywgJ2FvU3RhdGVMb2FkUGFyYW1zJywgICAgb0luaXQuZm5TdGF0ZUxvYWRQYXJhbXMsICAgJ3VzZXInICk7CgkJCV9mbkNhbGxiYWNrUmVnKCBvU2V0dGluZ3MsICdhb1N0YXRlTG9hZGVkJywgICAgICAgIG9Jbml0LmZuU3RhdGVMb2FkZWQsICAgICAgICd1c2VyJyApOwoJCQlfZm5DYWxsYmFja1JlZyggb1NldHRpbmdzLCAnYW9Sb3dDYWxsYmFjaycsICAgICAgICBvSW5pdC5mblJvd0NhbGxiYWNrLCAgICAgICAndXNlcicgKTsKCQkJX2ZuQ2FsbGJhY2tSZWcoIG9TZXR0aW5ncywgJ2FvUm93Q3JlYXRlZENhbGxiYWNrJywgb0luaXQuZm5DcmVhdGVkUm93LCAgICAgICAgJ3VzZXInICk7CgkJCV9mbkNhbGxiYWNrUmVnKCBvU2V0dGluZ3MsICdhb0hlYWRlckNhbGxiYWNrJywgICAgIG9Jbml0LmZuSGVhZGVyQ2FsbGJhY2ssICAgICd1c2VyJyApOwoJCQlfZm5DYWxsYmFja1JlZyggb1NldHRpbmdzLCAnYW9Gb290ZXJDYWxsYmFjaycsICAgICBvSW5pdC5mbkZvb3RlckNhbGxiYWNrLCAgICAndXNlcicgKTsKCQkJX2ZuQ2FsbGJhY2tSZWcoIG9TZXR0aW5ncywgJ2FvSW5pdENvbXBsZXRlJywgICAgICAgb0luaXQuZm5Jbml0Q29tcGxldGUsICAgICAgJ3VzZXInICk7CgkJCV9mbkNhbGxiYWNrUmVnKCBvU2V0dGluZ3MsICdhb1ByZURyYXdDYWxsYmFjaycsICAgIG9Jbml0LmZuUHJlRHJhd0NhbGxiYWNrLCAgICd1c2VyJyApOwoJCQkKCQkJb1NldHRpbmdzLnJvd0lkRm4gPSBfZm5HZXRPYmplY3REYXRhRm4oIG9Jbml0LnJvd0lkICk7CgkJCQoJCQkvKiBCcm93c2VyIHN1cHBvcnQgZGV0ZWN0aW9uICovCgkJCV9mbkJyb3dzZXJEZXRlY3QoIG9TZXR0aW5ncyApOwoJCQkKCQkJdmFyIG9DbGFzc2VzID0gb1NldHRpbmdzLm9DbGFzc2VzOwoJCQkKCQkJJC5leHRlbmQoIG9DbGFzc2VzLCBEYXRhVGFibGUuZXh0LmNsYXNzZXMsIG9Jbml0Lm9DbGFzc2VzICk7CgkJCSR0aGlzLmFkZENsYXNzKCBvQ2xhc3Nlcy5zVGFibGUgKTsKCQkJCgkJCQoJCQlpZiAoIG9TZXR0aW5ncy5pSW5pdERpc3BsYXlTdGFydCA9PT0gdW5kZWZpbmVkICkKCQkJewoJCQkJLyogRGlzcGxheSBzdGFydCBwb2ludCwgdGFraW5nIGludG8gYWNjb3VudCB0aGUgc2F2ZSBzYXZpbmcgKi8KCQkJCW9TZXR0aW5ncy5pSW5pdERpc3BsYXlTdGFydCA9IG9Jbml0LmlEaXNwbGF5U3RhcnQ7CgkJCQlvU2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQgPSBvSW5pdC5pRGlzcGxheVN0YXJ0OwoJCQl9CgkJCQoJCQlpZiAoIG9Jbml0LmlEZWZlckxvYWRpbmcgIT09IG51bGwgKQoJCQl7CgkJCQlvU2V0dGluZ3MuYkRlZmVyTG9hZGluZyA9IHRydWU7CgkJCQl2YXIgdG1wID0gQXJyYXkuaXNBcnJheSggb0luaXQuaURlZmVyTG9hZGluZyApOwoJCQkJb1NldHRpbmdzLl9pUmVjb3Jkc0Rpc3BsYXkgPSB0bXAgPyBvSW5pdC5pRGVmZXJMb2FkaW5nWzBdIDogb0luaXQuaURlZmVyTG9hZGluZzsKCQkJCW9TZXR0aW5ncy5faVJlY29yZHNUb3RhbCA9IHRtcCA/IG9Jbml0LmlEZWZlckxvYWRpbmdbMV0gOiBvSW5pdC5pRGVmZXJMb2FkaW5nOwoJCQl9CgkJCQoJCQkvKiBMYW5ndWFnZSBkZWZpbml0aW9ucyAqLwoJCQl2YXIgb0xhbmd1YWdlID0gb1NldHRpbmdzLm9MYW5ndWFnZTsKCQkJJC5leHRlbmQoIHRydWUsIG9MYW5ndWFnZSwgb0luaXQub0xhbmd1YWdlICk7CgkJCQoJCQlpZiAoIG9MYW5ndWFnZS5zVXJsICkKCQkJewoJCQkJLyogR2V0IHRoZSBsYW5ndWFnZSBkZWZpbml0aW9ucyBmcm9tIGEgZmlsZSAtIGJlY2F1c2UgdGhpcyBBamF4IGNhbGwgbWFrZXMgdGhlIGxhbmd1YWdlCgkJCQkgKiBnZXQgYXN5bmMgdG8gdGhlIHJlbWFpbmRlciBvZiB0aGlzIGZ1bmN0aW9uIHdlIHVzZSBiSW5pdEhhbmRlZE9mZiB0byBpbmRpY2F0ZSB0aGF0CgkJCQkgKiBfZm5Jbml0aWFsaXNlIHdpbGwgYmUgZmlyZWQgYnkgdGhlIHJldHVybmVkIEFqYXggaGFuZGxlciwgcmF0aGVyIHRoYW4gdGhlIGNvbnN0cnVjdG9yCgkJCQkgKi8KCQkJCSQuYWpheCggewoJCQkJCWRhdGFUeXBlOiAnanNvbicsCgkJCQkJdXJsOiBvTGFuZ3VhZ2Uuc1VybCwKCQkJCQlzdWNjZXNzOiBmdW5jdGlvbiAoIGpzb24gKSB7CgkJCQkJCV9mbkNhbWVsVG9IdW5nYXJpYW4oIGRlZmF1bHRzLm9MYW5ndWFnZSwganNvbiApOwoJCQkJCQlfZm5MYW5ndWFnZUNvbXBhdCgganNvbiApOwoJCQkJCQkkLmV4dGVuZCggdHJ1ZSwgb0xhbmd1YWdlLCBqc29uLCBvU2V0dGluZ3Mub0luaXQub0xhbmd1YWdlICk7CgkJCQoJCQkJCQlfZm5DYWxsYmFja0ZpcmUoIG9TZXR0aW5ncywgbnVsbCwgJ2kxOG4nLCBbb1NldHRpbmdzXSk7CgkJCQkJCV9mbkluaXRpYWxpc2UoIG9TZXR0aW5ncyApOwoJCQkJCX0sCgkJCQkJZXJyb3I6IGZ1bmN0aW9uICgpIHsKCQkJCQkJLy8gRXJyb3Igb2NjdXJyZWQgbG9hZGluZyBsYW5ndWFnZSBmaWxlLCBjb250aW51ZSBvbiBhcyBiZXN0IHdlIGNhbgoJCQkJCQlfZm5Jbml0aWFsaXNlKCBvU2V0dGluZ3MgKTsKCQkJCQl9CgkJCQl9ICk7CgkJCQliSW5pdEhhbmRlZE9mZiA9IHRydWU7CgkJCX0KCQkJZWxzZSB7CgkJCQlfZm5DYWxsYmFja0ZpcmUoIG9TZXR0aW5ncywgbnVsbCwgJ2kxOG4nLCBbb1NldHRpbmdzXSk7CgkJCX0KCQkJCgkJCS8qCgkJCSAqIFN0cmlwZXMKCQkJICovCgkJCWlmICggb0luaXQuYXNTdHJpcGVDbGFzc2VzID09PSBudWxsICkKCQkJewoJCQkJb1NldHRpbmdzLmFzU3RyaXBlQ2xhc3NlcyA9WwoJCQkJCW9DbGFzc2VzLnNTdHJpcGVPZGQsCgkJCQkJb0NsYXNzZXMuc1N0cmlwZUV2ZW4KCQkJCV07CgkJCX0KCQkJCgkJCS8qIFJlbW92ZSByb3cgc3RyaXBlIGNsYXNzZXMgaWYgdGhleSBhcmUgYWxyZWFkeSBvbiB0aGUgdGFibGUgcm93ICovCgkJCXZhciBzdHJpcGVDbGFzc2VzID0gb1NldHRpbmdzLmFzU3RyaXBlQ2xhc3NlczsKCQkJdmFyIHJvd09uZSA9ICR0aGlzLmNoaWxkcmVuKCd0Ym9keScpLmZpbmQoJ3RyJykuZXEoMCk7CgkJCWlmICggJC5pbkFycmF5KCB0cnVlLCAkLm1hcCggc3RyaXBlQ2xhc3NlcywgZnVuY3Rpb24oZWwsIGkpIHsKCQkJCXJldHVybiByb3dPbmUuaGFzQ2xhc3MoZWwpOwoJCQl9ICkgKSAhPT0gLTEgKSB7CgkJCQkkKCd0Ym9keSB0cicsIHRoaXMpLnJlbW92ZUNsYXNzKCBzdHJpcGVDbGFzc2VzLmpvaW4oJyAnKSApOwoJCQkJb1NldHRpbmdzLmFzRGVzdHJveVN0cmlwZXMgPSBzdHJpcGVDbGFzc2VzLnNsaWNlKCk7CgkJCX0KCQkJCgkJCS8qCgkJCSAqIENvbHVtbnMKCQkJICogU2VlIGlmIHdlIHNob3VsZCBsb2FkIGNvbHVtbnMgYXV0b21hdGljYWxseSBvciB1c2UgZGVmaW5lZCBvbmVzCgkJCSAqLwoJCQl2YXIgYW5UaHMgPSBbXTsKCQkJdmFyIGFvQ29sdW1uc0luaXQ7CgkJCXZhciBuVGhlYWQgPSB0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0aGVhZCcpOwoJCQlpZiAoIG5UaGVhZC5sZW5ndGggIT09IDAgKQoJCQl7CgkJCQlfZm5EZXRlY3RIZWFkZXIoIG9TZXR0aW5ncy5hb0hlYWRlciwgblRoZWFkWzBdICk7CgkJCQlhblRocyA9IF9mbkdldFVuaXF1ZVRocyggb1NldHRpbmdzICk7CgkJCX0KCQkJCgkJCS8qIElmIG5vdCBnaXZlbiBhIGNvbHVtbiBhcnJheSwgZ2VuZXJhdGUgb25lIHdpdGggbnVsbHMgKi8KCQkJaWYgKCBvSW5pdC5hb0NvbHVtbnMgPT09IG51bGwgKQoJCQl7CgkJCQlhb0NvbHVtbnNJbml0ID0gW107CgkJCQlmb3IgKCBpPTAsIGlMZW49YW5UaHMubGVuZ3RoIDsgaTxpTGVuIDsgaSsrICkKCQkJCXsKCQkJCQlhb0NvbHVtbnNJbml0LnB1c2goIG51bGwgKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCWFvQ29sdW1uc0luaXQgPSBvSW5pdC5hb0NvbHVtbnM7CgkJCX0KCQkJCgkJCS8qIEFkZCB0aGUgY29sdW1ucyAqLwoJCQlmb3IgKCBpPTAsIGlMZW49YW9Db2x1bW5zSW5pdC5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCQl7CgkJCQlfZm5BZGRDb2x1bW4oIG9TZXR0aW5ncywgYW5UaHMgPyBhblRoc1tpXSA6IG51bGwgKTsKCQkJfQoJCQkKCQkJLyogQXBwbHkgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyAqLwoJCQlfZm5BcHBseUNvbHVtbkRlZnMoIG9TZXR0aW5ncywgb0luaXQuYW9Db2x1bW5EZWZzLCBhb0NvbHVtbnNJbml0LCBmdW5jdGlvbiAoaUNvbCwgb0RlZikgewoJCQkJX2ZuQ29sdW1uT3B0aW9ucyggb1NldHRpbmdzLCBpQ29sLCBvRGVmICk7CgkJCX0gKTsKCQkJCgkJCS8qIEhUTUw1IGF0dHJpYnV0ZSBkZXRlY3Rpb24gLSBidWlsZCBhbiBtRGF0YSBvYmplY3QgYXV0b21hdGljYWxseSBpZiB0aGUKCQkJICogYXR0cmlidXRlcyBhcmUgZm91bmQKCQkJICovCgkJCWlmICggcm93T25lLmxlbmd0aCApIHsKCQkJCXZhciBhID0gZnVuY3Rpb24gKCBjZWxsLCBuYW1lICkgewoJCQkJCXJldHVybiBjZWxsLmdldEF0dHJpYnV0ZSggJ2RhdGEtJytuYW1lICkgIT09IG51bGwgPyBuYW1lIDogbnVsbDsKCQkJCX07CgkJCQoJCQkJJCggcm93T25lWzBdICkuY2hpbGRyZW4oJ3RoLCB0ZCcpLmVhY2goIGZ1bmN0aW9uIChpLCBjZWxsKSB7CgkJCQkJdmFyIGNvbCA9IG9TZXR0aW5ncy5hb0NvbHVtbnNbaV07CgkJCQoJCQkJCWlmICggY29sLm1EYXRhID09PSBpICkgewoJCQkJCQl2YXIgc29ydCA9IGEoIGNlbGwsICdzb3J0JyApIHx8IGEoIGNlbGwsICdvcmRlcicgKTsKCQkJCQkJdmFyIGZpbHRlciA9IGEoIGNlbGwsICdmaWx0ZXInICkgfHwgYSggY2VsbCwgJ3NlYXJjaCcgKTsKCQkJCgkJCQkJCWlmICggc29ydCAhPT0gbnVsbCB8fCBmaWx0ZXIgIT09IG51bGwgKSB7CgkJCQkJCQljb2wubURhdGEgPSB7CgkJCQkJCQkJXzogICAgICBpKycuZGlzcGxheScsCgkJCQkJCQkJc29ydDogICBzb3J0ICE9PSBudWxsICAgPyBpKycuQGRhdGEtJytzb3J0ICAgOiB1bmRlZmluZWQsCgkJCQkJCQkJdHlwZTogICBzb3J0ICE9PSBudWxsICAgPyBpKycuQGRhdGEtJytzb3J0ICAgOiB1bmRlZmluZWQsCgkJCQkJCQkJZmlsdGVyOiBmaWx0ZXIgIT09IG51bGwgPyBpKycuQGRhdGEtJytmaWx0ZXIgOiB1bmRlZmluZWQKCQkJCQkJCX07CgkJCQoJCQkJCQkJX2ZuQ29sdW1uT3B0aW9ucyggb1NldHRpbmdzLCBpICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9ICk7CgkJCX0KCQkJCgkJCXZhciBmZWF0dXJlcyA9IG9TZXR0aW5ncy5vRmVhdHVyZXM7CgkJCXZhciBsb2FkZWRJbml0ID0gZnVuY3Rpb24gKCkgewoJCQkJLyoKCQkJCSAqIFNvcnRpbmcKCQkJCSAqIEB0b2RvIEZvciBtb2R1bGFyaXNhdGlvbiAoMS4xMSkgdGhpcyBuZWVkcyB0byBkbyBpbnRvIGEgc29ydCBzdGFydCB1cCBoYW5kbGVyCgkJCQkgKi8KCQkJCgkJCQkvLyBJZiBhYVNvcnRpbmcgaXMgbm90IGRlZmluZWQsIHRoZW4gd2UgdXNlIHRoZSBmaXJzdCBpbmRpY2F0b3IgaW4gYXNTb3J0aW5nCgkJCQkvLyBpbiBjYXNlIHRoYXQgaGFzIGJlZW4gYWx0ZXJlZCwgc28gdGhlIGRlZmF1bHQgc29ydCByZWZsZWN0cyB0aGF0IG9wdGlvbgoJCQkJaWYgKCBvSW5pdC5hYVNvcnRpbmcgPT09IHVuZGVmaW5lZCApIHsKCQkJCQl2YXIgc29ydGluZyA9IG9TZXR0aW5ncy5hYVNvcnRpbmc7CgkJCQkJZm9yICggaT0wLCBpTGVuPXNvcnRpbmcubGVuZ3RoIDsgaTxpTGVuIDsgaSsrICkgewoJCQkJCQlzb3J0aW5nW2ldWzFdID0gb1NldHRpbmdzLmFvQ29sdW1uc1sgaSBdLmFzU29ydGluZ1swXTsKCQkJCQl9CgkJCQl9CgkJCQoJCQkJLyogRG8gYSBmaXJzdCBwYXNzIG9uIHRoZSBzb3J0aW5nIGNsYXNzZXMgKGFsbG93cyBhbnkgc2l6ZSBjaGFuZ2VzIHRvIGJlIHRha2VuIGludG8KCQkJCSAqIGFjY291bnQsIGFuZCBhbHNvIHdpbGwgYXBwbHkgc29ydGluZyBkaXNhYmxlZCBjbGFzc2VzIGlmIGRpc2FibGVkCgkJCQkgKi8KCQkJCV9mblNvcnRpbmdDbGFzc2VzKCBvU2V0dGluZ3MgKTsKCQkJCgkJCQlpZiAoIGZlYXR1cmVzLmJTb3J0ICkgewoJCQkJCV9mbkNhbGxiYWNrUmVnKCBvU2V0dGluZ3MsICdhb0RyYXdDYWxsYmFjaycsIGZ1bmN0aW9uICgpIHsKCQkJCQkJaWYgKCBvU2V0dGluZ3MuYlNvcnRlZCApIHsKCQkJCQkJCXZhciBhU29ydCA9IF9mblNvcnRGbGF0dGVuKCBvU2V0dGluZ3MgKTsKCQkJCQkJCXZhciBzb3J0ZWRDb2x1bW5zID0ge307CgkJCQoJCQkJCQkJJC5lYWNoKCBhU29ydCwgZnVuY3Rpb24gKGksIHZhbCkgewoJCQkJCQkJCXNvcnRlZENvbHVtbnNbIHZhbC5zcmMgXSA9IHZhbC5kaXI7CgkJCQkJCQl9ICk7CgkJCQoJCQkJCQkJX2ZuQ2FsbGJhY2tGaXJlKCBvU2V0dGluZ3MsIG51bGwsICdvcmRlcicsIFtvU2V0dGluZ3MsIGFTb3J0LCBzb3J0ZWRDb2x1bW5zXSApOwoJCQkJCQkJX2ZuU29ydEFyaWEoIG9TZXR0aW5ncyApOwoJCQkJCQl9CgkJCQkJfSApOwoJCQkJfQoJCQkKCQkJCV9mbkNhbGxiYWNrUmVnKCBvU2V0dGluZ3MsICdhb0RyYXdDYWxsYmFjaycsIGZ1bmN0aW9uICgpIHsKCQkJCQlpZiAoIG9TZXR0aW5ncy5iU29ydGVkIHx8IF9mbkRhdGFTb3VyY2UoIG9TZXR0aW5ncyApID09PSAnc3NwJyB8fCBmZWF0dXJlcy5iRGVmZXJSZW5kZXIgKSB7CgkJCQkJCV9mblNvcnRpbmdDbGFzc2VzKCBvU2V0dGluZ3MgKTsKCQkJCQl9CgkJCQl9LCAnc2MnICk7CgkJCQoJCQkKCQkJCS8qCgkJCQkgKiBGaW5hbCBpbml0CgkJCQkgKiBDYWNoZSB0aGUgaGVhZGVyLCBib2R5IGFuZCBmb290ZXIgYXMgcmVxdWlyZWQsIGNyZWF0aW5nIHRoZW0gaWYgbmVlZGVkCgkJCQkgKi8KCQkJCgkJCQkvLyBXb3JrIGFyb3VuZCBmb3IgV2Via2l0IGJ1ZyA4Mzg2NyAtIHN0b3JlIHRoZSBjYXB0aW9uLXNpZGUgYmVmb3JlIHJlbW92aW5nIGZyb20gZG9jCgkJCQl2YXIgY2FwdGlvbnMgPSAkdGhpcy5jaGlsZHJlbignY2FwdGlvbicpLmVhY2goIGZ1bmN0aW9uICgpIHsKCQkJCQl0aGlzLl9jYXB0aW9uU2lkZSA9ICQodGhpcykuY3NzKCdjYXB0aW9uLXNpZGUnKTsKCQkJCX0gKTsKCQkJCgkJCQl2YXIgdGhlYWQgPSAkdGhpcy5jaGlsZHJlbigndGhlYWQnKTsKCQkJCWlmICggdGhlYWQubGVuZ3RoID09PSAwICkgewoJCQkJCXRoZWFkID0gJCgnPHRoZWFkLz4nKS5hcHBlbmRUbygkdGhpcyk7CgkJCQl9CgkJCQlvU2V0dGluZ3MublRIZWFkID0gdGhlYWRbMF07CgkJCQoJCQkJdmFyIHRib2R5ID0gJHRoaXMuY2hpbGRyZW4oJ3Rib2R5Jyk7CgkJCQlpZiAoIHRib2R5Lmxlbmd0aCA9PT0gMCApIHsKCQkJCQl0Ym9keSA9ICQoJzx0Ym9keS8+JykuaW5zZXJ0QWZ0ZXIodGhlYWQpOwoJCQkJfQoJCQkJb1NldHRpbmdzLm5UQm9keSA9IHRib2R5WzBdOwoJCQkKCQkJCXZhciB0Zm9vdCA9ICR0aGlzLmNoaWxkcmVuKCd0Zm9vdCcpOwoJCQkJaWYgKCB0Zm9vdC5sZW5ndGggPT09IDAgJiYgY2FwdGlvbnMubGVuZ3RoID4gMCAmJiAob1NldHRpbmdzLm9TY3JvbGwuc1ggIT09ICIiIHx8IG9TZXR0aW5ncy5vU2Nyb2xsLnNZICE9PSAiIikgKSB7CgkJCQkJLy8gSWYgd2UgYXJlIGEgc2Nyb2xsaW5nIHRhYmxlLCBhbmQgbm8gZm9vdGVyIGhhcyBiZWVuIGdpdmVuLCB0aGVuIHdlIG5lZWQgdG8gY3JlYXRlCgkJCQkJLy8gYSB0Zm9vdCBlbGVtZW50IGZvciB0aGUgY2FwdGlvbiBlbGVtZW50IHRvIGJlIGFwcGVuZGVkIHRvCgkJCQkJdGZvb3QgPSAkKCc8dGZvb3QvPicpLmFwcGVuZFRvKCR0aGlzKTsKCQkJCX0KCQkJCgkJCQlpZiAoIHRmb290Lmxlbmd0aCA9PT0gMCB8fCB0Zm9vdC5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCApIHsKCQkJCQkkdGhpcy5hZGRDbGFzcyggb0NsYXNzZXMuc05vRm9vdGVyICk7CgkJCQl9CgkJCQllbHNlIGlmICggdGZvb3QubGVuZ3RoID4gMCApIHsKCQkJCQlvU2V0dGluZ3MublRGb290ID0gdGZvb3RbMF07CgkJCQkJX2ZuRGV0ZWN0SGVhZGVyKCBvU2V0dGluZ3MuYW9Gb290ZXIsIG9TZXR0aW5ncy5uVEZvb3QgKTsKCQkJCX0KCQkJCgkJCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBkYXRhIHBhc3NpbmcgaW50byB0aGUgY29uc3RydWN0b3IgKi8KCQkJCWlmICggb0luaXQuYWFEYXRhICkgewoJCQkJCWZvciAoIGk9MCA7IGk8b0luaXQuYWFEYXRhLmxlbmd0aCA7IGkrKyApIHsKCQkJCQkJX2ZuQWRkRGF0YSggb1NldHRpbmdzLCBvSW5pdC5hYURhdGFbIGkgXSApOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UgaWYgKCBvU2V0dGluZ3MuYkRlZmVyTG9hZGluZyB8fCBfZm5EYXRhU291cmNlKCBvU2V0dGluZ3MgKSA9PSAnZG9tJyApIHsKCQkJCQkvKiBHcmFiIHRoZSBkYXRhIGZyb20gdGhlIHBhZ2UgLSBvbmx5IGRvIHRoaXMgd2hlbiBkZWZlcnJlZCBsb2FkaW5nIG9yIG5vIEFqYXgKCQkJCQkgKiBzb3VyY2Ugc2luY2UgdGhlcmUgaXMgbm8gcG9pbnQgaW4gcmVhZGluZyB0aGUgRE9NIGRhdGEgaWYgd2UgYXJlIHRoZW4gZ29pbmcKCQkJCQkgKiB0byByZXBsYWNlIGl0IHdpdGggQWpheCBkYXRhCgkJCQkJICovCgkJCQkJX2ZuQWRkVHIoIG9TZXR0aW5ncywgJChvU2V0dGluZ3MublRCb2R5KS5jaGlsZHJlbigndHInKSApOwoJCQkJfQoJCQkKCQkJCS8qIENvcHkgdGhlIGRhdGEgaW5kZXggYXJyYXkgKi8KCQkJCW9TZXR0aW5ncy5haURpc3BsYXkgPSBvU2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCk7CgkJCQoJCQkJLyogSW5pdGlhbGlzYXRpb24gY29tcGxldGUgLSB0YWJsZSBjYW4gYmUgZHJhd24gKi8KCQkJCW9TZXR0aW5ncy5iSW5pdGlhbGlzZWQgPSB0cnVlOwoJCQkKCQkJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gaW5pdGlhbGlzZSB0aGUgdGFibGUgKGl0IG1pZ2h0IG5vdCBoYXZlIGJlZW4gaGFuZGVkIG9mZiB0byB0aGUKCQkJCSAqIGxhbmd1YWdlIHByb2Nlc3NvcikKCQkJCSAqLwoJCQkJaWYgKCBiSW5pdEhhbmRlZE9mZiA9PT0gZmFsc2UgKSB7CgkJCQkJX2ZuSW5pdGlhbGlzZSggb1NldHRpbmdzICk7CgkJCQl9CgkJCX07CgkJCQoJCQkvKiBNdXN0IGJlIGRvbmUgYWZ0ZXIgZXZlcnl0aGluZyB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgc3RhdGUgc2F2aW5nISAqLwoJCQlfZm5DYWxsYmFja1JlZyggb1NldHRpbmdzLCAnYW9EcmF3Q2FsbGJhY2snLCBfZm5TYXZlU3RhdGUsICdzdGF0ZV9zYXZlJyApOwoJCQkKCQkJaWYgKCBvSW5pdC5iU3RhdGVTYXZlICkKCQkJewoJCQkJZmVhdHVyZXMuYlN0YXRlU2F2ZSA9IHRydWU7CgkJCQlfZm5Mb2FkU3RhdGUoIG9TZXR0aW5ncywgb0luaXQsIGxvYWRlZEluaXQgKTsKCQkJfQoJCQllbHNlIHsKCQkJCWxvYWRlZEluaXQoKTsKCQkJfQoJCQkKCQl9ICk7CgkJX3RoYXQgPSBudWxsOwoJCXJldHVybiB0aGlzOwoJfTsKCQoJCgkvKgoJICogSXQgaXMgdXNlZnVsIHRvIGhhdmUgdmFyaWFibGVzIHdoaWNoIGFyZSBzY29wZWQgbG9jYWxseSBzbyBvbmx5IHRoZQoJICogRGF0YVRhYmxlcyBmdW5jdGlvbnMgY2FuIGFjY2VzcyB0aGVtIGFuZCB0aGV5IGRvbid0IGxlYWsgaW50byBnbG9iYWwgc3BhY2UuCgkgKiBBdCB0aGUgc2FtZSB0aW1lIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb2Z0ZW4gdXNlZnVsIG92ZXIgbXVsdGlwbGUgZmlsZXMgaW4gdGhlCgkgKiBjb3JlIGFuZCBBUEksIHNvIHdlIGxpc3QsIG9yIGF0IGxlYXN0IGRvY3VtZW50LCBhbGwgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkCgkgKiBieSBEYXRhVGFibGVzIGFzIHByaXZhdGUgdmFyaWFibGVzIGhlcmUuIFRoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlcmUgaXMgbm8KCSAqIGNsYXNoaW5nIG9mIHZhcmlhYmxlIG5hbWVzIGFuZCB0aGF0IHRoZXkgY2FuIGVhc2lseSByZWZlcmVuY2VkIGZvciByZXVzZS4KCSAqLwoJCgkKCS8vIERlZmluZWQgZWxzZSB3aGVyZQoJLy8gIF9zZWxlY3Rvcl9ydW4KCS8vICBfc2VsZWN0b3Jfb3B0cwoJLy8gIF9zZWxlY3Rvcl9maXJzdAoJLy8gIF9zZWxlY3Rvcl9yb3dfaW5kZXhlcwoJCgl2YXIgX2V4dDsgLy8gRGF0YVRhYmxlLmV4dAoJdmFyIF9BcGk7IC8vIERhdGFUYWJsZS5BcGkKCXZhciBfYXBpX3JlZ2lzdGVyOyAvLyBEYXRhVGFibGUuQXBpLnJlZ2lzdGVyCgl2YXIgX2FwaV9yZWdpc3RlclBsdXJhbDsgLy8gRGF0YVRhYmxlLkFwaS5yZWdpc3RlclBsdXJhbAoJCgl2YXIgX3JlX2RpYyA9IHt9OwoJdmFyIF9yZV9uZXdfbGluZXMgPSAvW1xyXG5cdTIwMjhdL2c7Cgl2YXIgX3JlX2h0bWwgPSAvPC4qPz4vZzsKCQoJLy8gVGhpcyBpcyBub3Qgc3RyaWN0IElTTzg2MDEgLSBEYXRlLnBhcnNlKCkgaXMgcXVpdGUgbGF4LCBhbHRob3VnaAoJLy8gaW1wbGVtZW50YXRpb25zIGRpZmZlciBiZXR3ZWVuIGJyb3dzZXJzLgoJdmFyIF9yZV9kYXRlID0gL15cZHsyLDR9W1wuXC9cLV1cZHsxLDJ9W1wuXC9cLV1cZHsxLDJ9KFtUIF17MX1cZHsxLDJ9WzpcLl1cZHsyfShbXC46XVxkezJ9KT8pPyQvOwoJCgkvLyBFc2NhcGUgcmVndWxhciBleHByZXNzaW9uIHNwZWNpYWwgY2hhcmFjdGVycwoJdmFyIF9yZV9lc2NhcGVfcmVnZXggPSBuZXcgUmVnRXhwKCAnKFxcJyArIFsgJy8nLCAnLicsICcqJywgJysnLCAnPycsICd8JywgJygnLCAnKScsICdbJywgJ10nLCAneycsICd9JywgJ1xcJywgJyQnLCAnXicsICctJyBdLmpvaW4oJ3xcXCcpICsgJyknLCAnZycgKTsKCQoJLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Gb3JlaWduX2V4Y2hhbmdlX21hcmtldAoJLy8gLSBcdTIwQkQgLSBSdXNzaWFuIHJ1YmxlLgoJLy8gLSBcdTIwYTkgLSBTb3V0aCBLb3JlYW4gV29uCgkvLyAtIFx1MjBCQSAtIFR1cmtpc2ggTGlyYQoJLy8gLSBcdTIwQjkgLSBJbmRpYW4gUnVwZWUKCS8vIC0gUiAtIEJyYXppbCAoUiQpIGFuZCBTb3V0aCBBZnJpY2EKCS8vIC0gZnIgLSBTd2lzcyBGcmFuYwoJLy8gLSBrciAtIFN3ZWRpc2gga3JvbmEsIE5vcndlZ2lhbiBrcm9uZSBhbmQgRGFuaXNoIGtyb25lCgkvLyAtIFx1MjAwOSBpcyB0aGluIHNwYWNlIGFuZCBcdTIwMkYgaXMgbmFycm93IG5vLWJyZWFrIHNwYWNlLCBib3RoIHVzZWQgaW4gbWFueQoJLy8gLSDJgyAtIEJpdGNvaW4KCS8vIC0gzp4gLSBFdGhlcmV1bQoJLy8gICBzdGFuZGFyZHMgYXMgdGhvdXNhbmRzIHNlcGFyYXRvcnMuCgl2YXIgX3JlX2Zvcm1hdHRlZF9udW1lcmljID0gL1snXHUwMEEwLCTCo+KCrMKlJVx1MjAwOVx1MjAyRlx1MjBCRFx1MjBhOVx1MjBCQXJma8mDzp5dL2dpOwoJCgkKCXZhciBfZW1wdHkgPSBmdW5jdGlvbiAoIGQgKSB7CgkJcmV0dXJuICFkIHx8IGQgPT09IHRydWUgfHwgZCA9PT0gJy0nID8gdHJ1ZSA6IGZhbHNlOwoJfTsKCQoJCgl2YXIgX2ludFZhbCA9IGZ1bmN0aW9uICggcyApIHsKCQl2YXIgaW50ZWdlciA9IHBhcnNlSW50KCBzLCAxMCApOwoJCXJldHVybiAhaXNOYU4oaW50ZWdlcikgJiYgaXNGaW5pdGUocykgPyBpbnRlZ2VyIDogbnVsbDsKCX07CgkKCS8vIENvbnZlcnQgZnJvbSBhIGZvcm1hdHRlZCBudW1iZXIgd2l0aCBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gYC5gIGFzIHRoZQoJLy8gZGVjaW1hbCBwbGFjZSwgdG8gYSBKYXZhc2NyaXB0IG51bWJlcgoJdmFyIF9udW1Ub0RlY2ltYWwgPSBmdW5jdGlvbiAoIG51bSwgZGVjaW1hbFBvaW50ICkgewoJCS8vIENhY2hlIGNyZWF0ZWQgcmVndWxhciBleHByZXNzaW9ucyBmb3Igc3BlZWQgYXMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb2Z0ZW4KCQlpZiAoICEgX3JlX2RpY1sgZGVjaW1hbFBvaW50IF0gKSB7CgkJCV9yZV9kaWNbIGRlY2ltYWxQb2ludCBdID0gbmV3IFJlZ0V4cCggX2ZuRXNjYXBlUmVnZXgoIGRlY2ltYWxQb2ludCApLCAnZycgKTsKCQl9CgkJcmV0dXJuIHR5cGVvZiBudW0gPT09ICdzdHJpbmcnICYmIGRlY2ltYWxQb2ludCAhPT0gJy4nID8KCQkJbnVtLnJlcGxhY2UoIC9cLi9nLCAnJyApLnJlcGxhY2UoIF9yZV9kaWNbIGRlY2ltYWxQb2ludCBdLCAnLicgKSA6CgkJCW51bTsKCX07CgkKCQoJdmFyIF9pc051bWJlciA9IGZ1bmN0aW9uICggZCwgZGVjaW1hbFBvaW50LCBmb3JtYXR0ZWQgKSB7CgkJdmFyIHN0clR5cGUgPSB0eXBlb2YgZCA9PT0gJ3N0cmluZyc7CgkKCQkvLyBJZiBlbXB0eSByZXR1cm4gaW1tZWRpYXRlbHkgc28gdGhlcmUgbXVzdCBiZSBhIG51bWJlciBpZiBpdCBpcyBhCgkJLy8gZm9ybWF0dGVkIHN0cmluZyAodGhpcyBzdG9wcyB0aGUgc3RyaW5nICJrIiwgb3IgImtyIiwgZXRjIGJlaW5nIGRldGVjdGVkCgkJLy8gYXMgYSBmb3JtYXR0ZWQgbnVtYmVyIGZvciBjdXJyZW5jeQoJCWlmICggX2VtcHR5KCBkICkgKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQoJCWlmICggZGVjaW1hbFBvaW50ICYmIHN0clR5cGUgKSB7CgkJCWQgPSBfbnVtVG9EZWNpbWFsKCBkLCBkZWNpbWFsUG9pbnQgKTsKCQl9CgkKCQlpZiAoIGZvcm1hdHRlZCAmJiBzdHJUeXBlICkgewoJCQlkID0gZC5yZXBsYWNlKCBfcmVfZm9ybWF0dGVkX251bWVyaWMsICcnICk7CgkJfQoJCgkJcmV0dXJuICFpc05hTiggcGFyc2VGbG9hdChkKSApICYmIGlzRmluaXRlKCBkICk7Cgl9OwoJCgkKCS8vIEEgc3RyaW5nIHdpdGhvdXQgSFRNTCBpbiBpdCBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBIVE1MIHN0aWxsCgl2YXIgX2lzSHRtbCA9IGZ1bmN0aW9uICggZCApIHsKCQlyZXR1cm4gX2VtcHR5KCBkICkgfHwgdHlwZW9mIGQgPT09ICdzdHJpbmcnOwoJfTsKCQoJCgl2YXIgX2h0bWxOdW1lcmljID0gZnVuY3Rpb24gKCBkLCBkZWNpbWFsUG9pbnQsIGZvcm1hdHRlZCApIHsKCQlpZiAoIF9lbXB0eSggZCApICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkKCQl2YXIgaHRtbCA9IF9pc0h0bWwoIGQgKTsKCQlyZXR1cm4gISBodG1sID8KCQkJbnVsbCA6CgkJCV9pc051bWJlciggX3N0cmlwSHRtbCggZCApLCBkZWNpbWFsUG9pbnQsIGZvcm1hdHRlZCApID8KCQkJCXRydWUgOgoJCQkJbnVsbDsKCX07CgkKCQoJdmFyIF9wbHVjayA9IGZ1bmN0aW9uICggYSwgcHJvcCwgcHJvcDIgKSB7CgkJdmFyIG91dCA9IFtdOwoJCXZhciBpPTAsIGllbj1hLmxlbmd0aDsKCQoJCS8vIENvdWxkIGhhdmUgdGhlIHRlc3QgaW4gdGhlIGxvb3AgZm9yIHNsaWdodGx5IHNtYWxsZXIgY29kZSwgYnV0IHNwZWVkCgkJLy8gaXMgZXNzZW50aWFsIGhlcmUKCQlpZiAoIHByb3AyICE9PSB1bmRlZmluZWQgKSB7CgkJCWZvciAoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlpZiAoIGFbaV0gJiYgYVtpXVsgcHJvcCBdICkgewoJCQkJCW91dC5wdXNoKCBhW2ldWyBwcm9wIF1bIHByb3AyIF0gKTsKCQkJCX0KCQkJfQoJCX0KCQllbHNlIHsKCQkJZm9yICggOyBpPGllbiA7IGkrKyApIHsKCQkJCWlmICggYVtpXSApIHsKCQkJCQlvdXQucHVzaCggYVtpXVsgcHJvcCBdICk7CgkJCQl9CgkJCX0KCQl9CgkKCQlyZXR1cm4gb3V0OwoJfTsKCQoJCgkvLyBCYXNpY2FsbHkgdGhlIHNhbWUgYXMgX3BsdWNrLCBidXQgcmF0aGVyIHRoYW4gbG9vcGluZyBvdmVyIGBhYCB3ZSB1c2UgYG9yZGVyYAoJLy8gYXMgdGhlIGluZGV4ZXMgdG8gcGljayBmcm9tIGBhYAoJdmFyIF9wbHVja19vcmRlciA9IGZ1bmN0aW9uICggYSwgb3JkZXIsIHByb3AsIHByb3AyICkKCXsKCQl2YXIgb3V0ID0gW107CgkJdmFyIGk9MCwgaWVuPW9yZGVyLmxlbmd0aDsKCQoJCS8vIENvdWxkIGhhdmUgdGhlIHRlc3QgaW4gdGhlIGxvb3AgZm9yIHNsaWdodGx5IHNtYWxsZXIgY29kZSwgYnV0IHNwZWVkCgkJLy8gaXMgZXNzZW50aWFsIGhlcmUKCQlpZiAoIHByb3AyICE9PSB1bmRlZmluZWQgKSB7CgkJCWZvciAoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlpZiAoIGFbIG9yZGVyW2ldIF1bIHByb3AgXSApIHsKCQkJCQlvdXQucHVzaCggYVsgb3JkZXJbaV0gXVsgcHJvcCBdWyBwcm9wMiBdICk7CgkJCQl9CgkJCX0KCQl9CgkJZWxzZSB7CgkJCWZvciAoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlvdXQucHVzaCggYVsgb3JkZXJbaV0gXVsgcHJvcCBdICk7CgkJCX0KCQl9CgkKCQlyZXR1cm4gb3V0OwoJfTsKCQoJCgl2YXIgX3JhbmdlID0gZnVuY3Rpb24gKCBsZW4sIHN0YXJ0ICkKCXsKCQl2YXIgb3V0ID0gW107CgkJdmFyIGVuZDsKCQoJCWlmICggc3RhcnQgPT09IHVuZGVmaW5lZCApIHsKCQkJc3RhcnQgPSAwOwoJCQllbmQgPSBsZW47CgkJfQoJCWVsc2UgewoJCQllbmQgPSBzdGFydDsKCQkJc3RhcnQgPSBsZW47CgkJfQoJCgkJZm9yICggdmFyIGk9c3RhcnQgOyBpPGVuZCA7IGkrKyApIHsKCQkJb3V0LnB1c2goIGkgKTsKCQl9CgkKCQlyZXR1cm4gb3V0OwoJfTsKCQoJCgl2YXIgX3JlbW92ZUVtcHR5ID0gZnVuY3Rpb24gKCBhICkKCXsKCQl2YXIgb3V0ID0gW107CgkKCQlmb3IgKCB2YXIgaT0wLCBpZW49YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJaWYgKCBhW2ldICkgeyAvLyBjYXJlZnVsIC0gd2lsbCByZW1vdmUgYWxsIGZhbHN5IHZhbHVlcyEKCQkJCW91dC5wdXNoKCBhW2ldICk7CgkJCX0KCQl9CgkKCQlyZXR1cm4gb3V0OwoJfTsKCQoJCgl2YXIgX3N0cmlwSHRtbCA9IGZ1bmN0aW9uICggZCApIHsKCQlyZXR1cm4gZC5yZXBsYWNlKCBfcmVfaHRtbCwgJycgKTsKCX07CgkKCQoJLyoqCgkgKiBEZXRlcm1pbmUgaWYgYWxsIHZhbHVlcyBpbiB0aGUgYXJyYXkgYXJlIHVuaXF1ZS4gVGhpcyBtZWFucyB3ZSBjYW4gc2hvcnQKCSAqIGN1dCB0aGUgX3VuaXF1ZSBtZXRob2QgYXQgdGhlIGNvc3Qgb2YgYSBzaW5nbGUgbG9vcC4gQSBzb3J0ZWQgYXJyYXkgaXMgdXNlZAoJICogdG8gZWFzaWx5IGNoZWNrIHRoZSB2YWx1ZXMuCgkgKgoJICogQHBhcmFtICB7YXJyYXl9IHNyYyBTb3VyY2UgYXJyYXkKCSAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYWxsIHVuaXF1ZSwgZmFsc2Ugb3RoZXJ3aXNlCgkgKiBAaWdub3JlCgkgKi8KCXZhciBfYXJlQWxsVW5pcXVlID0gZnVuY3Rpb24gKCBzcmMgKSB7CgkJaWYgKCBzcmMubGVuZ3RoIDwgMiApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCgkJdmFyIHNvcnRlZCA9IHNyYy5zbGljZSgpLnNvcnQoKTsKCQl2YXIgbGFzdCA9IHNvcnRlZFswXTsKCQoJCWZvciAoIHZhciBpPTEsIGllbj1zb3J0ZWQubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCWlmICggc29ydGVkW2ldID09PSBsYXN0ICkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkKCQkJbGFzdCA9IHNvcnRlZFtpXTsKCQl9CgkKCQlyZXR1cm4gdHJ1ZTsKCX07CgkKCQoJLyoqCgkgKiBGaW5kIHRoZSB1bmlxdWUgZWxlbWVudHMgaW4gYSBzb3VyY2UgYXJyYXkuCgkgKgoJICogQHBhcmFtICB7YXJyYXl9IHNyYyBTb3VyY2UgYXJyYXkKCSAqIEByZXR1cm4ge2FycmF5fSBBcnJheSBvZiB1bmlxdWUgaXRlbXMKCSAqIEBpZ25vcmUKCSAqLwoJdmFyIF91bmlxdWUgPSBmdW5jdGlvbiAoIHNyYyApCgl7CgkJaWYgKCBfYXJlQWxsVW5pcXVlKCBzcmMgKSApIHsKCQkJcmV0dXJuIHNyYy5zbGljZSgpOwoJCX0KCQoJCS8vIEEgZmFzdGVyIHVuaXF1ZSBtZXRob2QgaXMgdG8gdXNlIG9iamVjdCBrZXlzIHRvIGlkZW50aWZ5IHVzZWQgdmFsdWVzLAoJCS8vIGJ1dCB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIGFycmF5cyBvciBvYmplY3RzLCB3aGljaCB3ZSBtdXN0IGFsc28KCQkvLyBjb25zaWRlci4gU2VlIGpzcGVyZi5jb20vY29tcGFyZS1hcnJheS11bmlxdWUtdmVyc2lvbnMvNCBmb3IgbW9yZQoJCS8vIGluZm9ybWF0aW9uLgoJCXZhcgoJCQlvdXQgPSBbXSwKCQkJdmFsLAoJCQlpLCBpZW49c3JjLmxlbmd0aCwKCQkJaiwgaz0wOwoJCgkJYWdhaW46IGZvciAoIGk9MCA7IGk8aWVuIDsgaSsrICkgewoJCQl2YWwgPSBzcmNbaV07CgkKCQkJZm9yICggaj0wIDsgajxrIDsgaisrICkgewoJCQkJaWYgKCBvdXRbal0gPT09IHZhbCApIHsKCQkJCQljb250aW51ZSBhZ2FpbjsKCQkJCX0KCQkJfQoJCgkJCW91dC5wdXNoKCB2YWwgKTsKCQkJaysrOwoJCX0KCQoJCXJldHVybiBvdXQ7Cgl9OwoJCgkvLyBTdXJwcmlzaW5nbHkgdGhpcyBpcyBmYXN0ZXIgdGhhbiBbXS5jb25jYXQuYXBwbHkKCS8vIGh0dHBzOi8vanNwZXJmLmNvbS9mbGF0dGVuLWFuLWFycmF5LWxvb3AtdnMtcmVkdWNlLzIKCXZhciBfZmxhdHRlbiA9IGZ1bmN0aW9uIChvdXQsIHZhbCkgewoJCWlmIChBcnJheS5pc0FycmF5KHZhbCkpIHsKCQkJZm9yICh2YXIgaT0wIDsgaTx2YWwubGVuZ3RoIDsgaSsrKSB7CgkJCQlfZmxhdHRlbihvdXQsIHZhbFtpXSk7CgkJCX0KCQl9CgkJZWxzZSB7CgkJCW91dC5wdXNoKHZhbCk7CgkJfQoJICAKCQlyZXR1cm4gb3V0OwoJfQoJCgl2YXIgX2luY2x1ZGVzID0gZnVuY3Rpb24gKHNlYXJjaCwgc3RhcnQpIHsKCQlpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkgewoJCQlzdGFydCA9IDA7CgkJfQoJCgkJcmV0dXJuIHRoaXMuaW5kZXhPZihzZWFyY2gsIHN0YXJ0KSAhPT0gLTE7CQoJfTsKCQoJLy8gQXJyYXkuaXNBcnJheSBwb2x5ZmlsbC4KCS8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2lzQXJyYXkKCWlmICghIEFycmF5LmlzQXJyYXkpIHsKCSAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24oYXJnKSB7CgkgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJzsKCSAgICB9OwoJfQoJCglpZiAoISBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpIHsKCQlBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMgPSBfaW5jbHVkZXM7Cgl9CgkKCS8vIC50cmltKCkgcG9seWZpbGwKCS8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy90cmltCglpZiAoIVN0cmluZy5wcm90b3R5cGUudHJpbSkgewoJICBTdHJpbmcucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbiAoKSB7CgkgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csICcnKTsKCSAgfTsKCX0KCQoJaWYgKCEgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcykgewoJCVN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgPSBfaW5jbHVkZXM7Cgl9CgkKCS8qKgoJICogRGF0YVRhYmxlcyB1dGlsaXR5IG1ldGhvZHMKCSAqIAoJICogVGhpcyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdGhhdCBEYXRhVGFibGVzIHVzZXMgaW50ZXJuYWxseSB0bwoJICogY3JlYXRlIGEgRGF0YVRhYmxlLCBidXQgd2hpY2ggYXJlIG5vdCBleGNsdXNpdmVseSB1c2VkIG9ubHkgZm9yIERhdGFUYWJsZXMuCgkgKiBUaGVzZSBtZXRob2RzIGNhbiBiZSB1c2VkIGJ5IGV4dGVuc2lvbiBhdXRob3JzIHRvIHNhdmUgdGhlIGR1cGxpY2F0aW9uIG9mCgkgKiBjb2RlLgoJICoKCSAqICBAbmFtZXNwYWNlCgkgKi8KCURhdGFUYWJsZS51dGlsID0gewoJCS8qKgoJCSAqIFRocm90dGxlIHRoZSBjYWxscyB0byBhIGZ1bmN0aW9uLiBBcmd1bWVudHMgYW5kIGNvbnRleHQgYXJlIG1haW50YWluZWQKCQkgKiBmb3IgdGhlIHRocm90dGxlZCBmdW5jdGlvbi4KCQkgKgoJCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZAoJCSAqIEBwYXJhbSB7aW50ZWdlcn0gZnJlcSBDYWxsIGZyZXF1ZW5jeSBpbiBtUwoJCSAqIEByZXR1cm4ge2Z1bmN0aW9ufSBXcmFwcGVkIGZ1bmN0aW9uCgkJICovCgkJdGhyb3R0bGU6IGZ1bmN0aW9uICggZm4sIGZyZXEgKSB7CgkJCXZhcgoJCQkJZnJlcXVlbmN5ID0gZnJlcSAhPT0gdW5kZWZpbmVkID8gZnJlcSA6IDIwMCwKCQkJCWxhc3QsCgkJCQl0aW1lcjsKCQoJCQlyZXR1cm4gZnVuY3Rpb24gKCkgewoJCQkJdmFyCgkJCQkJdGhhdCA9IHRoaXMsCgkJCQkJbm93ICA9ICtuZXcgRGF0ZSgpLAoJCQkJCWFyZ3MgPSBhcmd1bWVudHM7CgkKCQkJCWlmICggbGFzdCAmJiBub3cgPCBsYXN0ICsgZnJlcXVlbmN5ICkgewoJCQkJCWNsZWFyVGltZW91dCggdGltZXIgKTsKCQoJCQkJCXRpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24gKCkgewoJCQkJCQlsYXN0ID0gdW5kZWZpbmVkOwoJCQkJCQlmbi5hcHBseSggdGhhdCwgYXJncyApOwoJCQkJCX0sIGZyZXF1ZW5jeSApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJbGFzdCA9IG5vdzsKCQkJCQlmbi5hcHBseSggdGhhdCwgYXJncyApOwoJCQkJfQoJCQl9OwoJCX0sCgkKCQoJCS8qKgoJCSAqIEVzY2FwZSBhIHN0cmluZyBzdWNoIHRoYXQgaXQgY2FuIGJlIHVzZWQgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24KCQkgKgoJCSAqICBAcGFyYW0ge3N0cmluZ30gdmFsIHN0cmluZyB0byBlc2NhcGUKCQkgKiAgQHJldHVybnMge3N0cmluZ30gZXNjYXBlZCBzdHJpbmcKCQkgKi8KCQllc2NhcGVSZWdleDogZnVuY3Rpb24gKCB2YWwgKSB7CgkJCXJldHVybiB2YWwucmVwbGFjZSggX3JlX2VzY2FwZV9yZWdleCwgJ1xcJDEnICk7CgkJfSwKCQoJCS8qKgoJCSAqIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCB3cml0ZSB0byBhIG5lc3RlZCBvYmplY3Qgb3IgYXJyYXkKCQkgKiBAcGFyYW0geyp9IHNvdXJjZSBKU09OIG5vdGF0aW9uIHN0cmluZwoJCSAqIEByZXR1cm5zIFdyaXRlIGZ1bmN0aW9uCgkJICovCgkJc2V0OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCQkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHNvdXJjZSApICkgewoJCQkJLyogVW5saWtlIGdldCwgb25seSB0aGUgdW5kZXJzY29yZSAoZ2xvYmFsKSBvcHRpb24gaXMgdXNlZCBmb3IgZm9yCgkJCQkgKiBzZXR0aW5nIGRhdGEgc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgdHlwZSBoZXJlLiBUaGlzIGlzIHdoeSBhbiBvYmplY3QKCQkJCSAqIG9wdGlvbiBpcyBub3QgZG9jdW1lbnRlZCBmb3IgYG1EYXRhYCAod2hpY2ggaXMgcmVhZC93cml0ZSksIGJ1dCBpdCBpcwoJCQkJICogZm9yIGBtUmVuZGVyYCB3aGljaCBpcyByZWFkIG9ubHkuCgkJCQkgKi8KCQkJCXJldHVybiBEYXRhVGFibGUudXRpbC5zZXQoIHNvdXJjZS5fICk7CgkJCX0KCQkJZWxzZSBpZiAoIHNvdXJjZSA9PT0gbnVsbCApIHsKCQkJCS8vIE5vdGhpbmcgdG8gZG8gd2hlbiB0aGUgZGF0YSBzb3VyY2UgaXMgbnVsbAoJCQkJcmV0dXJuIGZ1bmN0aW9uICgpIHt9OwoJCQl9CgkJCWVsc2UgaWYgKCB0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB2YWwsIG1ldGEpIHsKCQkJCQlzb3VyY2UoIGRhdGEsICdzZXQnLCB2YWwsIG1ldGEgKTsKCQkJCX07CgkJCX0KCQkJZWxzZSBpZiAoIHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnICYmIChzb3VyY2UuaW5kZXhPZignLicpICE9PSAtMSB8fAoJCQkJCSAgc291cmNlLmluZGV4T2YoJ1snKSAhPT0gLTEgfHwgc291cmNlLmluZGV4T2YoJygnKSAhPT0gLTEpICkKCQkJewoJCQkJLy8gTGlrZSB0aGUgZ2V0LCB3ZSBuZWVkIHRvIGdldCBkYXRhIGZyb20gYSBuZXN0ZWQgb2JqZWN0CgkJCQl2YXIgc2V0RGF0YSA9IGZ1bmN0aW9uIChkYXRhLCB2YWwsIHNyYykgewoJCQkJCXZhciBhID0gX2ZuU3BsaXRPYmpOb3RhdGlvbiggc3JjICksIGI7CgkJCQkJdmFyIGFMYXN0ID0gYVthLmxlbmd0aC0xXTsKCQkJCQl2YXIgYXJyYXlOb3RhdGlvbiwgZnVuY05vdGF0aW9uLCBvLCBpbm5lclNyYzsKCQkKCQkJCQlmb3IgKCB2YXIgaT0wLCBpTGVuPWEubGVuZ3RoLTEgOyBpPGlMZW4gOyBpKysgKSB7CgkJCQkJCS8vIFByb3RlY3QgYWdhaW5zdCBwcm90b3R5cGUgcG9sbHV0aW9uCgkJCQkJCWlmIChhW2ldID09PSAnX19wcm90b19fJyB8fCBhW2ldID09PSAnY29uc3RydWN0b3InKSB7CgkJCQkJCQl0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzZXQgcHJvdG90eXBlIHZhbHVlcycpOwoJCQkJCQl9CgkJCgkJCQkJCS8vIENoZWNrIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gYXJyYXkgbm90YXRpb24gcmVxdWVzdAoJCQkJCQlhcnJheU5vdGF0aW9uID0gYVtpXS5tYXRjaChfX3JlQXJyYXkpOwoJCQkJCQlmdW5jTm90YXRpb24gPSBhW2ldLm1hdGNoKF9fcmVGbik7CgkJCgkJCQkJCWlmICggYXJyYXlOb3RhdGlvbiApIHsKCQkJCQkJCWFbaV0gPSBhW2ldLnJlcGxhY2UoX19yZUFycmF5LCAnJyk7CgkJCQkJCQlkYXRhWyBhW2ldIF0gPSBbXTsKCQkKCQkJCQkJCS8vIEdldCB0aGUgcmVtYWluZGVyIG9mIHRoZSBuZXN0ZWQgb2JqZWN0IHRvIHNldCBzbyB3ZSBjYW4gcmVjdXJzZQoJCQkJCQkJYiA9IGEuc2xpY2UoKTsKCQkJCQkJCWIuc3BsaWNlKCAwLCBpKzEgKTsKCQkJCQkJCWlubmVyU3JjID0gYi5qb2luKCcuJyk7CgkJCgkJCQkJCQkvLyBUcmF2ZXJzZSBlYWNoIGVudHJ5IGluIHRoZSBhcnJheSBzZXR0aW5nIHRoZSBwcm9wZXJ0aWVzIHJlcXVlc3RlZAoJCQkJCQkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHsKCQkJCQkJCQlmb3IgKCB2YXIgaj0wLCBqTGVuPXZhbC5sZW5ndGggOyBqPGpMZW4gOyBqKysgKSB7CgkJCQkJCQkJCW8gPSB7fTsKCQkJCQkJCQkJc2V0RGF0YSggbywgdmFsW2pdLCBpbm5lclNyYyApOwoJCQkJCQkJCQlkYXRhWyBhW2ldIF0ucHVzaCggbyApOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWVsc2UgewoJCQkJCQkJCS8vIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gc2F2ZSBkYXRhIHRvIGFuIGFycmF5LCBidXQgaXQKCQkJCQkJCQkvLyBpc24ndCBhcnJheSBkYXRhIHRvIGJlIHNhdmVkLiBCZXN0IHRoYXQgY2FuIGJlIGRvbmUKCQkJCQkJCQkvLyBpcyB0byBqdXN0IHNhdmUgdGhlIHZhbHVlLgoJCQkJCQkJCWRhdGFbIGFbaV0gXSA9IHZhbDsKCQkJCQkJCX0KCQkKCQkJCQkJCS8vIFRoZSBpbm5lciBjYWxsIHRvIHNldERhdGEgaGFzIGFscmVhZHkgdHJhdmVyc2VkIHRocm91Z2ggdGhlIHJlbWFpbmRlcgoJCQkJCQkJLy8gb2YgdGhlIHNvdXJjZSBhbmQgaGFzIHNldCB0aGUgZGF0YSwgdGh1cyB3ZSBjYW4gZXhpdCBoZXJlCgkJCQkJCQlyZXR1cm47CgkJCQkJCX0KCQkJCQkJZWxzZSBpZiAoIGZ1bmNOb3RhdGlvbiApIHsKCQkJCQkJCS8vIEZ1bmN0aW9uIGNhbGwKCQkJCQkJCWFbaV0gPSBhW2ldLnJlcGxhY2UoX19yZUZuLCAnJyk7CgkJCQkJCQlkYXRhID0gZGF0YVsgYVtpXSBdKCB2YWwgKTsKCQkJCQkJfQoJCQoJCQkJCQkvLyBJZiB0aGUgbmVzdGVkIG9iamVjdCBkb2Vzbid0IGN1cnJlbnRseSBleGlzdCAtIHNpbmNlIHdlIGFyZQoJCQkJCQkvLyB0cnlpbmcgdG8gc2V0IHRoZSB2YWx1ZSAtIGNyZWF0ZSBpdAoJCQkJCQlpZiAoIGRhdGFbIGFbaV0gXSA9PT0gbnVsbCB8fCBkYXRhWyBhW2ldIF0gPT09IHVuZGVmaW5lZCApIHsKCQkJCQkJCWRhdGFbIGFbaV0gXSA9IHt9OwoJCQkJCQl9CgkJCQkJCWRhdGEgPSBkYXRhWyBhW2ldIF07CgkJCQkJfQoJCQoJCQkJCS8vIExhc3QgaXRlbSBpbiB0aGUgaW5wdXQgLSBpLmUsIHRoZSBhY3R1YWwgc2V0CgkJCQkJaWYgKCBhTGFzdC5tYXRjaChfX3JlRm4gKSApIHsKCQkJCQkJLy8gRnVuY3Rpb24gY2FsbAoJCQkJCQlkYXRhID0gZGF0YVsgYUxhc3QucmVwbGFjZShfX3JlRm4sICcnKSBdKCB2YWwgKTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCS8vIElmIGFycmF5IG5vdGF0aW9uIGlzIHVzZWQsIHdlIGp1c3Qgd2FudCB0byBzdHJpcCBpdCBhbmQgdXNlIHRoZSBwcm9wZXJ0eSBuYW1lCgkJCQkJCS8vIGFuZCBhc3NpZ24gdGhlIHZhbHVlLiBJZiBpdCBpc24ndCB1c2VkLCB0aGVuIHdlIGdldCB0aGUgcmVzdWx0IHdlIHdhbnQgYW55d2F5CgkJCQkJCWRhdGFbIGFMYXN0LnJlcGxhY2UoX19yZUFycmF5LCAnJykgXSA9IHZhbDsKCQkJCQl9CgkJCQl9OwoJCQoJCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB2YWwpIHsgLy8gbWV0YSBpcyBhbHNvIHBhc3NlZCBpbiwgYnV0IG5vdCB1c2VkCgkJCQkJcmV0dXJuIHNldERhdGEoIGRhdGEsIHZhbCwgc291cmNlICk7CgkJCQl9OwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gQXJyYXkgb3IgZmxhdCBvYmplY3QgbWFwcGluZwoJCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB2YWwpIHsgLy8gbWV0YSBpcyBhbHNvIHBhc3NlZCBpbiwgYnV0IG5vdCB1c2VkCgkJCQkJZGF0YVtzb3VyY2VdID0gdmFsOwoJCQkJfTsKCQkJfQoJCX0sCgkKCQkvKioKCQkgKiBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHdpbGwgcmVhZCBuZXN0ZWQgb2JqZWN0cyBmcm9tIGFycmF5cywgYmFzZWQgb24gSlNPTiBub3RhdGlvbgoJCSAqIEBwYXJhbSB7Kn0gc291cmNlIEpTT04gbm90YXRpb24gc3RyaW5nCgkJICogQHJldHVybnMgVmFsdWUgcmVhZAoJCSAqLwoJCWdldDogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgkJCWlmICggJC5pc1BsYWluT2JqZWN0KCBzb3VyY2UgKSApIHsKCQkJCS8vIEJ1aWxkIGFuIG9iamVjdCBvZiBnZXQgZnVuY3Rpb25zLCBhbmQgd3JhcCB0aGVtIGluIGEgc2luZ2xlIGNhbGwKCQkJCXZhciBvID0ge307CgkJCQkkLmVhY2goIHNvdXJjZSwgZnVuY3Rpb24gKGtleSwgdmFsKSB7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCW9ba2V5XSA9IERhdGFUYWJsZS51dGlsLmdldCggdmFsICk7CgkJCQkJfQoJCQkJfSApOwoJCQoJCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB0eXBlLCByb3csIG1ldGEpIHsKCQkJCQl2YXIgdCA9IG9bdHlwZV0gfHwgby5fOwoJCQkJCXJldHVybiB0ICE9PSB1bmRlZmluZWQgPwoJCQkJCQl0KGRhdGEsIHR5cGUsIHJvdywgbWV0YSkgOgoJCQkJCQlkYXRhOwoJCQkJfTsKCQkJfQoJCQllbHNlIGlmICggc291cmNlID09PSBudWxsICkgewoJCQkJLy8gR2l2ZSBhbiBlbXB0eSBzdHJpbmcgZm9yIHJlbmRlcmluZyAvIHNvcnRpbmcgZXRjCgkJCQlyZXR1cm4gZnVuY3Rpb24gKGRhdGEpIHsgLy8gdHlwZSwgcm93IGFuZCBtZXRhIGFsc28gcGFzc2VkLCBidXQgbm90IHVzZWQKCQkJCQlyZXR1cm4gZGF0YTsKCQkJCX07CgkJCX0KCQkJZWxzZSBpZiAoIHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicgKSB7CgkJCQlyZXR1cm4gZnVuY3Rpb24gKGRhdGEsIHR5cGUsIHJvdywgbWV0YSkgewoJCQkJCXJldHVybiBzb3VyY2UoIGRhdGEsIHR5cGUsIHJvdywgbWV0YSApOwoJCQkJfTsKCQkJfQoJCQllbHNlIGlmICggdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgKHNvdXJjZS5pbmRleE9mKCcuJykgIT09IC0xIHx8CgkJCQkJICBzb3VyY2UuaW5kZXhPZignWycpICE9PSAtMSB8fCBzb3VyY2UuaW5kZXhPZignKCcpICE9PSAtMSkgKQoJCQl7CgkJCQkvKiBJZiB0aGVyZSBpcyBhIC4gaW4gdGhlIHNvdXJjZSBzdHJpbmcgdGhlbiB0aGUgZGF0YSBzb3VyY2UgaXMgaW4gYQoJCQkJICogbmVzdGVkIG9iamVjdCBzbyB3ZSBsb29wIG92ZXIgdGhlIGRhdGEgZm9yIGVhY2ggbGV2ZWwgdG8gZ2V0IHRoZSBuZXh0CgkJCQkgKiBsZXZlbCBkb3duLiBPbiBlYWNoIGxvb3Agd2UgdGVzdCBmb3IgdW5kZWZpbmVkLCBhbmQgaWYgZm91bmQgaW1tZWRpYXRlbHkKCQkJCSAqIHJldHVybi4gVGhpcyBhbGxvd3MgZW50aXJlIG9iamVjdHMgdG8gYmUgbWlzc2luZyBhbmQgc0RlZmF1bHRDb250ZW50IHRvCgkJCQkgKiBiZSB1c2VkIGlmIGRlZmluZWQsIHJhdGhlciB0aGFuIHRocm93aW5nIGFuIGVycm9yCgkJCQkgKi8KCQkJCXZhciBmZXRjaERhdGEgPSBmdW5jdGlvbiAoZGF0YSwgdHlwZSwgc3JjKSB7CgkJCQkJdmFyIGFycmF5Tm90YXRpb24sIGZ1bmNOb3RhdGlvbiwgb3V0LCBpbm5lclNyYzsKCQkKCQkJCQlpZiAoIHNyYyAhPT0gIiIgKSB7CgkJCQkJCXZhciBhID0gX2ZuU3BsaXRPYmpOb3RhdGlvbiggc3JjICk7CgkJCgkJCQkJCWZvciAoIHZhciBpPTAsIGlMZW49YS5sZW5ndGggOyBpPGlMZW4gOyBpKysgKSB7CgkJCQkJCQkvLyBDaGVjayBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIHNwZWNpYWwgbm90YXRpb24KCQkJCQkJCWFycmF5Tm90YXRpb24gPSBhW2ldLm1hdGNoKF9fcmVBcnJheSk7CgkJCQkJCQlmdW5jTm90YXRpb24gPSBhW2ldLm1hdGNoKF9fcmVGbik7CgkJCgkJCQkJCQlpZiAoIGFycmF5Tm90YXRpb24gKSB7CgkJCQkJCQkJLy8gQXJyYXkgbm90YXRpb24KCQkJCQkJCQlhW2ldID0gYVtpXS5yZXBsYWNlKF9fcmVBcnJheSwgJycpOwoJCQoJCQkJCQkJCS8vIENvbmRpdGlvbiBhbGxvd3Mgc2ltcGx5IFtdIHRvIGJlIHBhc3NlZCBpbgoJCQkJCQkJCWlmICggYVtpXSAhPT0gIiIgKSB7CgkJCQkJCQkJCWRhdGEgPSBkYXRhWyBhW2ldIF07CgkJCQkJCQkJfQoJCQkJCQkJCW91dCA9IFtdOwoJCQoJCQkJCQkJCS8vIEdldCB0aGUgcmVtYWluZGVyIG9mIHRoZSBuZXN0ZWQgb2JqZWN0IHRvIGdldAoJCQkJCQkJCWEuc3BsaWNlKCAwLCBpKzEgKTsKCQkJCQkJCQlpbm5lclNyYyA9IGEuam9pbignLicpOwoJCQoJCQkJCQkJCS8vIFRyYXZlcnNlIGVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGdldHRpbmcgdGhlIHByb3BlcnRpZXMgcmVxdWVzdGVkCgkJCQkJCQkJaWYgKCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJCQkJCWZvciAoIHZhciBqPTAsIGpMZW49ZGF0YS5sZW5ndGggOyBqPGpMZW4gOyBqKysgKSB7CgkJCQkJCQkJCQlvdXQucHVzaCggZmV0Y2hEYXRhKCBkYXRhW2pdLCB0eXBlLCBpbm5lclNyYyApICk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCgkJCQkJCQkJLy8gSWYgYSBzdHJpbmcgaXMgZ2l2ZW4gaW4gYmV0d2VlbiB0aGUgYXJyYXkgbm90YXRpb24gaW5kaWNhdG9ycywgdGhhdAoJCQkJCQkJCS8vIGlzIHVzZWQgdG8gam9pbiB0aGUgc3RyaW5ncyB0b2dldGhlciwgb3RoZXJ3aXNlIGFuIGFycmF5IGlzIHJldHVybmVkCgkJCQkJCQkJdmFyIGpvaW4gPSBhcnJheU5vdGF0aW9uWzBdLnN1YnN0cmluZygxLCBhcnJheU5vdGF0aW9uWzBdLmxlbmd0aC0xKTsKCQkJCQkJCQlkYXRhID0gKGpvaW49PT0iIikgPyBvdXQgOiBvdXQuam9pbihqb2luKTsKCQkKCQkJCQkJCQkvLyBUaGUgaW5uZXIgY2FsbCB0byBmZXRjaERhdGEgaGFzIGFscmVhZHkgdHJhdmVyc2VkIHRocm91Z2ggdGhlIHJlbWFpbmRlcgoJCQkJCQkJCS8vIG9mIHRoZSBzb3VyY2UgcmVxdWVzdGVkLCBzbyB3ZSBleGl0IGZyb20gdGhlIGxvb3AKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJCWVsc2UgaWYgKCBmdW5jTm90YXRpb24gKSB7CgkJCQkJCQkJLy8gRnVuY3Rpb24gY2FsbAoJCQkJCQkJCWFbaV0gPSBhW2ldLnJlcGxhY2UoX19yZUZuLCAnJyk7CgkJCQkJCQkJZGF0YSA9IGRhdGFbIGFbaV0gXSgpOwoJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJfQoJCQoJCQkJCQkJaWYgKCBkYXRhID09PSBudWxsIHx8IGRhdGFbIGFbaV0gXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJCXJldHVybiB1bmRlZmluZWQ7CgkJCQkJCQl9CgkKCQkJCQkJCWRhdGEgPSBkYXRhWyBhW2ldIF07CgkJCQkJCX0KCQkJCQl9CgkJCgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9OwoJCQoJCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB0eXBlKSB7IC8vIHJvdyBhbmQgbWV0YSBhbHNvIHBhc3NlZCwgYnV0IG5vdCB1c2VkCgkJCQkJcmV0dXJuIGZldGNoRGF0YSggZGF0YSwgdHlwZSwgc291cmNlICk7CgkJCQl9OwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gQXJyYXkgb3IgZmxhdCBvYmplY3QgbWFwcGluZwoJCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB0eXBlKSB7IC8vIHJvdyBhbmQgbWV0YSBhbHNvIHBhc3NlZCwgYnV0IG5vdCB1c2VkCgkJCQkJcmV0dXJuIGRhdGFbc291cmNlXTsKCQkJCX07CgkJCX0KCQl9Cgl9OwoJCgkKCQoJLyoqCgkgKiBDcmVhdGUgYSBtYXBwaW5nIG9iamVjdCB0aGF0IGFsbG93cyBjYW1lbCBjYXNlIHBhcmFtZXRlcnMgdG8gYmUgbG9va2VkIHVwCgkgKiBmb3IgdGhlaXIgSHVuZ2FyaWFuIGNvdW50ZXJwYXJ0cy4gVGhlIG1hcHBpbmcgaXMgc3RvcmVkIGluIGEgcHJpdmF0ZQoJICogcGFyYW1ldGVyIGNhbGxlZCBgX2h1bmdhcmlhbk1hcGAgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LgoJICogIEBwYXJhbSB7b2JqZWN0fSBvCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkh1bmdhcmlhbk1hcCAoIG8gKQoJewoJCXZhcgoJCQlodW5nYXJpYW4gPSAnYSBhYSBhaSBhbyBhcyBiIGZuIGkgbSBvIHMgJywKCQkJbWF0Y2gsCgkJCW5ld0tleSwKCQkJbWFwID0ge307CgkKCQkkLmVhY2goIG8sIGZ1bmN0aW9uIChrZXksIHZhbCkgewoJCQltYXRjaCA9IGtleS5tYXRjaCgvXihbXkEtWl0rPykoW0EtWl0pLyk7CgkKCQkJaWYgKCBtYXRjaCAmJiBodW5nYXJpYW4uaW5kZXhPZihtYXRjaFsxXSsnICcpICE9PSAtMSApCgkJCXsKCQkJCW5ld0tleSA9IGtleS5yZXBsYWNlKCBtYXRjaFswXSwgbWF0Y2hbMl0udG9Mb3dlckNhc2UoKSApOwoJCQkJbWFwWyBuZXdLZXkgXSA9IGtleTsKCQoJCQkJaWYgKCBtYXRjaFsxXSA9PT0gJ28nICkKCQkJCXsKCQkJCQlfZm5IdW5nYXJpYW5NYXAoIG9ba2V5XSApOwoJCQkJfQoJCQl9CgkJfSApOwoJCgkJby5faHVuZ2FyaWFuTWFwID0gbWFwOwoJfQoJCgkKCS8qKgoJICogQ29udmVydCBmcm9tIGNhbWVsIGNhc2UgcGFyYW1ldGVycyB0byBIdW5nYXJpYW4sIGJhc2VkIG9uIGEgSHVuZ2FyaWFuIG1hcAoJICogY3JlYXRlZCBieSBfZm5IdW5nYXJpYW5NYXAuCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNyYyBUaGUgbW9kZWwgb2JqZWN0IHdoaWNoIGhvbGRzIGFsbCBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlCgkgKiAgICBtYXBwZWQuCgkgKiAgQHBhcmFtIHtvYmplY3R9IHVzZXIgVGhlIG9iamVjdCB0byBjb252ZXJ0IGZyb20gY2FtZWwgY2FzZSB0byBIdW5nYXJpYW4uCgkgKiAgQHBhcmFtIHtib29sZWFufSBmb3JjZSBXaGVuIHNldCB0byBgdHJ1ZWAsIHByb3BlcnRpZXMgd2hpY2ggYWxyZWFkeSBoYXZlIGEKCSAqICAgIEh1bmdhcmlhbiB2YWx1ZSBpbiB0aGUgYHVzZXJgIG9iamVjdCB3aWxsIGJlIG92ZXJ3cml0dGVuLiBPdGhlcndpc2UgdGhleQoJICogICAgd29uJ3QgYmUuCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkNhbWVsVG9IdW5nYXJpYW4gKCBzcmMsIHVzZXIsIGZvcmNlICkKCXsKCQlpZiAoICEgc3JjLl9odW5nYXJpYW5NYXAgKSB7CgkJCV9mbkh1bmdhcmlhbk1hcCggc3JjICk7CgkJfQoJCgkJdmFyIGh1bmdhcmlhbktleTsKCQoJCSQuZWFjaCggdXNlciwgZnVuY3Rpb24gKGtleSwgdmFsKSB7CgkJCWh1bmdhcmlhbktleSA9IHNyYy5faHVuZ2FyaWFuTWFwWyBrZXkgXTsKCQoJCQlpZiAoIGh1bmdhcmlhbktleSAhPT0gdW5kZWZpbmVkICYmIChmb3JjZSB8fCB1c2VyW2h1bmdhcmlhbktleV0gPT09IHVuZGVmaW5lZCkgKQoJCQl7CgkJCQkvLyBGb3Igb2JqZWN0cywgd2UgbmVlZCB0byBidXp6IGRvd24gaW50byB0aGUgb2JqZWN0IHRvIGNvcHkgcGFyYW1ldGVycwoJCQkJaWYgKCBodW5nYXJpYW5LZXkuY2hhckF0KDApID09PSAnbycgKQoJCQkJewoJCQkJCS8vIENvcHkgdGhlIGNhbWVsQ2FzZSBvcHRpb25zIG92ZXIgdG8gdGhlIGh1bmdhcmlhbgoJCQkJCWlmICggISB1c2VyWyBodW5nYXJpYW5LZXkgXSApIHsKCQkJCQkJdXNlclsgaHVuZ2FyaWFuS2V5IF0gPSB7fTsKCQkJCQl9CgkJCQkJJC5leHRlbmQoIHRydWUsIHVzZXJbaHVuZ2FyaWFuS2V5XSwgdXNlcltrZXldICk7CgkKCQkJCQlfZm5DYW1lbFRvSHVuZ2FyaWFuKCBzcmNbaHVuZ2FyaWFuS2V5XSwgdXNlcltodW5nYXJpYW5LZXldLCBmb3JjZSApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdXNlcltodW5nYXJpYW5LZXldID0gdXNlclsga2V5IF07CgkJCQl9CgkJCX0KCQl9ICk7Cgl9CgkKCQoJLyoqCgkgKiBMYW5ndWFnZSBjb21wYXRpYmlsaXR5IC0gd2hlbiBjZXJ0YWluIG9wdGlvbnMgYXJlIGdpdmVuLCBhbmQgb3RoZXJzIGFyZW4ndCwgd2UKCSAqIG5lZWQgdG8gZHVwbGljYXRlIHRoZSB2YWx1ZXMgb3ZlciwgaW4gb3JkZXIgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoJICogd2l0aCBvbGRlciBsYW5ndWFnZSBmaWxlcy4KCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkxhbmd1YWdlQ29tcGF0KCBsYW5nICkKCXsKCQkvLyBOb3RlIHRoZSB1c2Ugb2YgdGhlIEh1bmdhcmlhbiBub3RhdGlvbiBmb3IgdGhlIHBhcmFtZXRlcnMgaW4gdGhpcyBtZXRob2QgYXMKCQkvLyB0aGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgbWFwcGluZyBvZiBjYW1lbENhc2UgdG8gSHVuZ2FyaWFuCgkJdmFyIGRlZmF1bHRzID0gRGF0YVRhYmxlLmRlZmF1bHRzLm9MYW5ndWFnZTsKCQoJCS8vIERlZmF1bHQgbWFwcGluZwoJCXZhciBkZWZhdWx0RGVjaW1hbCA9IGRlZmF1bHRzLnNEZWNpbWFsOwoJCWlmICggZGVmYXVsdERlY2ltYWwgKSB7CgkJCV9hZGROdW1lcmljU29ydCggZGVmYXVsdERlY2ltYWwgKTsKCQl9CgkKCQlpZiAoIGxhbmcgKSB7CgkJCXZhciB6ZXJvUmVjb3JkcyA9IGxhbmcuc1plcm9SZWNvcmRzOwoJCgkJCS8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IC0gaWYgdGhlcmUgaXMgbm8gc0VtcHR5VGFibGUgZ2l2ZW4sIHRoZW4gdXNlIHRoZSBzYW1lIGFzCgkJCS8vIHNaZXJvUmVjb3JkcyAtIGFzc3VtaW5nIHRoYXQgaXMgZ2l2ZW4uCgkJCWlmICggISBsYW5nLnNFbXB0eVRhYmxlICYmIHplcm9SZWNvcmRzICYmCgkJCQlkZWZhdWx0cy5zRW1wdHlUYWJsZSA9PT0gIk5vIGRhdGEgYXZhaWxhYmxlIGluIHRhYmxlIiApCgkJCXsKCQkJCV9mbk1hcCggbGFuZywgbGFuZywgJ3NaZXJvUmVjb3JkcycsICdzRW1wdHlUYWJsZScgKTsKCQkJfQoJCgkJCS8vIExpa2V3aXNlIHdpdGggbG9hZGluZyByZWNvcmRzCgkJCWlmICggISBsYW5nLnNMb2FkaW5nUmVjb3JkcyAmJiB6ZXJvUmVjb3JkcyAmJgoJCQkJZGVmYXVsdHMuc0xvYWRpbmdSZWNvcmRzID09PSAiTG9hZGluZy4uLiIgKQoJCQl7CgkJCQlfZm5NYXAoIGxhbmcsIGxhbmcsICdzWmVyb1JlY29yZHMnLCAnc0xvYWRpbmdSZWNvcmRzJyApOwoJCQl9CgkKCQkJLy8gT2xkIHBhcmFtZXRlciBuYW1lIG9mIHRoZSB0aG91c2FuZHMgc2VwYXJhdG9yIG1hcHBlZCBvbnRvIHRoZSBuZXcKCQkJaWYgKCBsYW5nLnNJbmZvVGhvdXNhbmRzICkgewoJCQkJbGFuZy5zVGhvdXNhbmRzID0gbGFuZy5zSW5mb1Rob3VzYW5kczsKCQkJfQoJCgkJCXZhciBkZWNpbWFsID0gbGFuZy5zRGVjaW1hbDsKCQkJaWYgKCBkZWNpbWFsICYmIGRlZmF1bHREZWNpbWFsICE9PSBkZWNpbWFsICkgewoJCQkJX2FkZE51bWVyaWNTb3J0KCBkZWNpbWFsICk7CgkJCX0KCQl9Cgl9CgkKCQoJLyoqCgkgKiBNYXAgb25lIHBhcmFtZXRlciBvbnRvIGFub3RoZXIKCSAqICBAcGFyYW0ge29iamVjdH0gbyBPYmplY3QgdG8gbWFwCgkgKiAgQHBhcmFtIHsqfSBrbmV3IFRoZSBuZXcgcGFyYW1ldGVyIG5hbWUKCSAqICBAcGFyYW0geyp9IG9sZCBUaGUgb2xkIHBhcmFtZXRlciBuYW1lCgkgKi8KCXZhciBfZm5Db21wYXRNYXAgPSBmdW5jdGlvbiAoIG8sIGtuZXcsIG9sZCApIHsKCQlpZiAoIG9bIGtuZXcgXSAhPT0gdW5kZWZpbmVkICkgewoJCQlvWyBvbGQgXSA9IG9bIGtuZXcgXTsKCQl9Cgl9OwoJCgkKCS8qKgoJICogUHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdGhlIG1haW4gRFQgb3B0aW9ucy4gTm90ZSB0aGF0IHRoZSBuZXcKCSAqIG9wdGlvbnMgYXJlIG1hcHBlZCBvbnRvIHRoZSBvbGQgcGFyYW1ldGVycywgc28gdGhpcyBpcyBhbiBleHRlcm5hbCBpbnRlcmZhY2UKCSAqIGNoYW5nZSBvbmx5LgoJICogIEBwYXJhbSB7b2JqZWN0fSBpbml0IE9iamVjdCB0byBtYXAKCSAqLwoJZnVuY3Rpb24gX2ZuQ29tcGF0T3B0cyAoIGluaXQgKQoJewoJCV9mbkNvbXBhdE1hcCggaW5pdCwgJ29yZGVyaW5nJywgICAgICAnYlNvcnQnICk7CgkJX2ZuQ29tcGF0TWFwKCBpbml0LCAnb3JkZXJNdWx0aScsICAgICdiU29ydE11bHRpJyApOwoJCV9mbkNvbXBhdE1hcCggaW5pdCwgJ29yZGVyQ2xhc3NlcycsICAnYlNvcnRDbGFzc2VzJyApOwoJCV9mbkNvbXBhdE1hcCggaW5pdCwgJ29yZGVyQ2VsbHNUb3AnLCAnYlNvcnRDZWxsc1RvcCcgKTsKCQlfZm5Db21wYXRNYXAoIGluaXQsICdvcmRlcicsICAgICAgICAgJ2FhU29ydGluZycgKTsKCQlfZm5Db21wYXRNYXAoIGluaXQsICdvcmRlckZpeGVkJywgICAgJ2FhU29ydGluZ0ZpeGVkJyApOwoJCV9mbkNvbXBhdE1hcCggaW5pdCwgJ3BhZ2luZycsICAgICAgICAnYlBhZ2luYXRlJyApOwoJCV9mbkNvbXBhdE1hcCggaW5pdCwgJ3BhZ2luZ1R5cGUnLCAgICAnc1BhZ2luYXRpb25UeXBlJyApOwoJCV9mbkNvbXBhdE1hcCggaW5pdCwgJ3BhZ2VMZW5ndGgnLCAgICAnaURpc3BsYXlMZW5ndGgnICk7CgkJX2ZuQ29tcGF0TWFwKCBpbml0LCAnc2VhcmNoaW5nJywgICAgICdiRmlsdGVyJyApOwoJCgkJLy8gQm9vbGVhbiBpbml0aWFsaXNhdGlvbiBvZiB4LXNjcm9sbGluZwoJCWlmICggdHlwZW9mIGluaXQuc1Njcm9sbFggPT09ICdib29sZWFuJyApIHsKCQkJaW5pdC5zU2Nyb2xsWCA9IGluaXQuc1Njcm9sbFggPyAnMTAwJScgOiAnJzsKCQl9CgkJaWYgKCB0eXBlb2YgaW5pdC5zY3JvbGxYID09PSAnYm9vbGVhbicgKSB7CgkJCWluaXQuc2Nyb2xsWCA9IGluaXQuc2Nyb2xsWCA/ICcxMDAlJyA6ICcnOwoJCX0KCQoJCS8vIENvbHVtbiBzZWFyY2ggb2JqZWN0cyBhcmUgaW4gYW4gYXJyYXksIHNvIGl0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZAoJCS8vIGVsZW1lbnQgYnkgZWxlbWVudAoJCXZhciBzZWFyY2hDb2xzID0gaW5pdC5hb1NlYXJjaENvbHM7CgkKCQlpZiAoIHNlYXJjaENvbHMgKSB7CgkJCWZvciAoIHZhciBpPTAsIGllbj1zZWFyY2hDb2xzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJaWYgKCBzZWFyY2hDb2xzW2ldICkgewoJCQkJCV9mbkNhbWVsVG9IdW5nYXJpYW4oIERhdGFUYWJsZS5tb2RlbHMub1NlYXJjaCwgc2VhcmNoQ29sc1tpXSApOwoJCQkJfQoJCQl9CgkJfQoJfQoJCgkKCS8qKgoJICogUHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgY29sdW1uIG9wdGlvbnMuIE5vdGUgdGhhdCB0aGUgbmV3IG9wdGlvbnMKCSAqIGFyZSBtYXBwZWQgb250byB0aGUgb2xkIHBhcmFtZXRlcnMsIHNvIHRoaXMgaXMgYW4gZXh0ZXJuYWwgaW50ZXJmYWNlIGNoYW5nZQoJICogb25seS4KCSAqICBAcGFyYW0ge29iamVjdH0gaW5pdCBPYmplY3QgdG8gbWFwCgkgKi8KCWZ1bmN0aW9uIF9mbkNvbXBhdENvbHMgKCBpbml0ICkKCXsKCQlfZm5Db21wYXRNYXAoIGluaXQsICdvcmRlcmFibGUnLCAgICAgJ2JTb3J0YWJsZScgKTsKCQlfZm5Db21wYXRNYXAoIGluaXQsICdvcmRlckRhdGEnLCAgICAgJ2FEYXRhU29ydCcgKTsKCQlfZm5Db21wYXRNYXAoIGluaXQsICdvcmRlclNlcXVlbmNlJywgJ2FzU29ydGluZycgKTsKCQlfZm5Db21wYXRNYXAoIGluaXQsICdvcmRlckRhdGFUeXBlJywgJ3NvcnREYXRhVHlwZScgKTsKCQoJCS8vIG9yZGVyRGF0YSBjYW4gYmUgZ2l2ZW4gYXMgYW4gaW50ZWdlcgoJCXZhciBkYXRhU29ydCA9IGluaXQuYURhdGFTb3J0OwoJCWlmICggdHlwZW9mIGRhdGFTb3J0ID09PSAnbnVtYmVyJyAmJiAhIEFycmF5LmlzQXJyYXkoIGRhdGFTb3J0ICkgKSB7CgkJCWluaXQuYURhdGFTb3J0ID0gWyBkYXRhU29ydCBdOwoJCX0KCX0KCQoJCgkvKioKCSAqIEJyb3dzZXIgZmVhdHVyZSBkZXRlY3Rpb24gZm9yIGNhcGFiaWxpdGllcywgcXVpcmtzCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkJyb3dzZXJEZXRlY3QoIHNldHRpbmdzICkKCXsKCQkvLyBXZSBkb24ndCBuZWVkIHRvIGRvIHRoaXMgZXZlcnkgdGltZSBEYXRhVGFibGVzIGlzIGNvbnN0cnVjdGVkLCB0aGUgdmFsdWVzCgkJLy8gY2FsY3VsYXRlZCBhcmUgc3BlY2lmaWMgdG8gdGhlIGJyb3dzZXIgYW5kIE9TIGNvbmZpZ3VyYXRpb24gd2hpY2ggd2UKCQkvLyBkb24ndCBleHBlY3QgdG8gY2hhbmdlIGJldHdlZW4gaW5pdGlhbGlzYXRpb25zCgkJaWYgKCAhIERhdGFUYWJsZS5fX2Jyb3dzZXIgKSB7CgkJCXZhciBicm93c2VyID0ge307CgkJCURhdGFUYWJsZS5fX2Jyb3dzZXIgPSBicm93c2VyOwoJCgkJCS8vIFNjcm9sbGluZyBmZWF0dXJlIC8gcXVpcmtzIGRldGVjdGlvbgoJCQl2YXIgbiA9ICQoJzxkaXYvPicpCgkJCQkuY3NzKCB7CgkJCQkJcG9zaXRpb246ICdmaXhlZCcsCgkJCQkJdG9wOiAwLAoJCQkJCWxlZnQ6ICQod2luZG93KS5zY3JvbGxMZWZ0KCkqLTEsIC8vIGFsbG93IGZvciBzY3JvbGxpbmcKCQkJCQloZWlnaHQ6IDEsCgkJCQkJd2lkdGg6IDEsCgkJCQkJb3ZlcmZsb3c6ICdoaWRkZW4nCgkJCQl9ICkKCQkJCS5hcHBlbmQoCgkJCQkJJCgnPGRpdi8+JykKCQkJCQkJLmNzcyggewoJCQkJCQkJcG9zaXRpb246ICdhYnNvbHV0ZScsCgkJCQkJCQl0b3A6IDEsCgkJCQkJCQlsZWZ0OiAxLAoJCQkJCQkJd2lkdGg6IDEwMCwKCQkJCQkJCW92ZXJmbG93OiAnc2Nyb2xsJwoJCQkJCQl9ICkKCQkJCQkJLmFwcGVuZCgKCQkJCQkJCSQoJzxkaXYvPicpCgkJCQkJCQkJLmNzcyggewoJCQkJCQkJCQl3aWR0aDogJzEwMCUnLAoJCQkJCQkJCQloZWlnaHQ6IDEwCgkJCQkJCQkJfSApCgkJCQkJCSkKCQkJCSkKCQkJCS5hcHBlbmRUbyggJ2JvZHknICk7CgkKCQkJdmFyIG91dGVyID0gbi5jaGlsZHJlbigpOwoJCQl2YXIgaW5uZXIgPSBvdXRlci5jaGlsZHJlbigpOwoJCgkJCS8vIE51bWJlcnMgYmVsb3csIGluIG9yZGVyLCBhcmU6CgkJCS8vIGlubmVyLm9mZnNldFdpZHRoLCBpbm5lci5jbGllbnRXaWR0aCwgb3V0ZXIub2Zmc2V0V2lkdGgsIG91dGVyLmNsaWVudFdpZHRoCgkJCS8vCgkJCS8vIElFNiBYUDogICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgMTAwIDEwMCAgODMKCQkJLy8gSUU3IFZpc3RhOiAgICAgICAgICAgICAgICAgICAgICAgIDEwMCAxMDAgMTAwICA4MwoJCQkvLyBJRSA4KyBXaW5kb3dzOiAgICAgICAgICAgICAgICAgICAgIDgzICA4MyAxMDAgIDgzCgkJCS8vIEV2ZXJncmVlbiBXaW5kb3dzOiAgICAgICAgICAgICAgICAgODMgIDgzIDEwMCAgODMKCQkJLy8gRXZlcmdyZWVuIE1hYyB3aXRoIHNjcm9sbGJhcnM6ICAgICA4NSAgODUgMTAwICA4NQoJCQkvLyBFdmVyZ3JlZW4gTWFjIHdpdGhvdXQgc2Nyb2xsYmFyczogMTAwIDEwMCAxMDAgMTAwCgkKCQkJLy8gR2V0IHNjcm9sbGJhciB3aWR0aAoJCQlicm93c2VyLmJhcldpZHRoID0gb3V0ZXJbMF0ub2Zmc2V0V2lkdGggLSBvdXRlclswXS5jbGllbnRXaWR0aDsKCQoJCQkvLyBJRTYvNyB3aWxsIG92ZXJzaXplIGEgd2lkdGggMTAwJSBlbGVtZW50IGluc2lkZSBhIHNjcm9sbGluZyBlbGVtZW50LCB0bwoJCQkvLyBpbmNsdWRlIHRoZSB3aWR0aCBvZiB0aGUgc2Nyb2xsYmFyLCB3aGlsZSBvdGhlciBicm93c2VycyBlbnN1cmUgdGhlIGlubmVyCgkJCS8vIGVsZW1lbnQgaXMgY29udGFpbmVkIHdpdGhvdXQgZm9yY2luZyBzY3JvbGxpbmcKCQkJYnJvd3Nlci5iU2Nyb2xsT3ZlcnNpemUgPSBpbm5lclswXS5vZmZzZXRXaWR0aCA9PT0gMTAwICYmIG91dGVyWzBdLmNsaWVudFdpZHRoICE9PSAxMDA7CgkKCQkJLy8gSW4gcnRsIHRleHQgbGF5b3V0LCBzb21lIGJyb3dzZXJzIChtb3N0LCBidXQgbm90IGFsbCkgd2lsbCBwbGFjZSB0aGUKCQkJLy8gc2Nyb2xsYmFyIG9uIHRoZSBsZWZ0LCByYXRoZXIgdGhhbiB0aGUgcmlnaHQuCgkJCWJyb3dzZXIuYlNjcm9sbGJhckxlZnQgPSBNYXRoLnJvdW5kKCBpbm5lci5vZmZzZXQoKS5sZWZ0ICkgIT09IDE7CgkKCQkJLy8gSUU4LSBkb24ndCBwcm92aWRlIGhlaWdodCBhbmQgd2lkdGggZm9yIGdldEJvdW5kaW5nQ2xpZW50UmVjdAoJCQlicm93c2VyLmJCb3VuZGluZyA9IG5bMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPyB0cnVlIDogZmFsc2U7CgkKCQkJbi5yZW1vdmUoKTsKCQl9CgkKCQkkLmV4dGVuZCggc2V0dGluZ3Mub0Jyb3dzZXIsIERhdGFUYWJsZS5fX2Jyb3dzZXIgKTsKCQlzZXR0aW5ncy5vU2Nyb2xsLmlCYXJXaWR0aCA9IERhdGFUYWJsZS5fX2Jyb3dzZXIuYmFyV2lkdGg7Cgl9CgkKCQoJLyoqCgkgKiBBcnJheS5wcm90b3R5cGUgcmVkdWNlW1JpZ2h0XSBtZXRob2QsIHVzZWQgZm9yIGJyb3dzZXJzIHdoaWNoIGRvbid0IHN1cHBvcnQKCSAqIEpTIDEuNi4gRG9uZSB0aGlzIHdheSB0byByZWR1Y2UgY29kZSBzaXplLCBzaW5jZSB3ZSBpdGVyYXRlIGVpdGhlciB3YXkKCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuUmVkdWNlICggdGhhdCwgZm4sIGluaXQsIHN0YXJ0LCBlbmQsIGluYyApCgl7CgkJdmFyCgkJCWkgPSBzdGFydCwKCQkJdmFsdWUsCgkJCWlzU2V0ID0gZmFsc2U7CgkKCQlpZiAoIGluaXQgIT09IHVuZGVmaW5lZCApIHsKCQkJdmFsdWUgPSBpbml0OwoJCQlpc1NldCA9IHRydWU7CgkJfQoJCgkJd2hpbGUgKCBpICE9PSBlbmQgKSB7CgkJCWlmICggISB0aGF0Lmhhc093blByb3BlcnR5KGkpICkgewoJCQkJY29udGludWU7CgkJCX0KCQoJCQl2YWx1ZSA9IGlzU2V0ID8KCQkJCWZuKCB2YWx1ZSwgdGhhdFtpXSwgaSwgdGhhdCApIDoKCQkJCXRoYXRbaV07CgkKCQkJaXNTZXQgPSB0cnVlOwoJCQlpICs9IGluYzsKCQl9CgkKCQlyZXR1cm4gdmFsdWU7Cgl9CgkKCS8qKgoJICogQWRkIGEgY29sdW1uIHRvIHRoZSBsaXN0IHVzZWQgZm9yIHRoZSB0YWJsZSB3aXRoIGRlZmF1bHQgdmFsdWVzCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7bm9kZX0gblRoIFRoZSB0aCBlbGVtZW50IGZvciB0aGlzIGNvbHVtbgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5BZGRDb2x1bW4oIG9TZXR0aW5ncywgblRoICkKCXsKCQkvLyBBZGQgY29sdW1uIHRvIGFvQ29sdW1ucyBhcnJheQoJCXZhciBvRGVmYXVsdHMgPSBEYXRhVGFibGUuZGVmYXVsdHMuY29sdW1uOwoJCXZhciBpQ29sID0gb1NldHRpbmdzLmFvQ29sdW1ucy5sZW5ndGg7CgkJdmFyIG9Db2wgPSAkLmV4dGVuZCgge30sIERhdGFUYWJsZS5tb2RlbHMub0NvbHVtbiwgb0RlZmF1bHRzLCB7CgkJCSJuVGgiOiBuVGggPyBuVGggOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0aCcpLAoJCQkic1RpdGxlIjogICAgb0RlZmF1bHRzLnNUaXRsZSAgICA/IG9EZWZhdWx0cy5zVGl0bGUgICAgOiBuVGggPyBuVGguaW5uZXJIVE1MIDogJycsCgkJCSJhRGF0YVNvcnQiOiBvRGVmYXVsdHMuYURhdGFTb3J0ID8gb0RlZmF1bHRzLmFEYXRhU29ydCA6IFtpQ29sXSwKCQkJIm1EYXRhIjogb0RlZmF1bHRzLm1EYXRhID8gb0RlZmF1bHRzLm1EYXRhIDogaUNvbCwKCQkJaWR4OiBpQ29sCgkJfSApOwoJCW9TZXR0aW5ncy5hb0NvbHVtbnMucHVzaCggb0NvbCApOwoJCgkJLy8gQWRkIHNlYXJjaCBvYmplY3QgZm9yIGNvbHVtbiBzcGVjaWZpYyBzZWFyY2guIE5vdGUgdGhhdCB0aGUgYHNlYXJjaENvbHNbIGlDb2wgXWAKCQkvLyBwYXNzZWQgaW50byBleHRlbmQgY2FuIGJlIHVuZGVmaW5lZC4gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gZ2l2ZSBhIGRlZmF1bHQKCQkvLyB3aXRoIG9ubHkgc29tZSBvZiB0aGUgcGFyYW1ldGVycyBkZWZpbmVkLCBhbmQgYWxzbyBub3QgZ2l2ZSBhIGRlZmF1bHQKCQl2YXIgc2VhcmNoQ29scyA9IG9TZXR0aW5ncy5hb1ByZVNlYXJjaENvbHM7CgkJc2VhcmNoQ29sc1sgaUNvbCBdID0gJC5leHRlbmQoIHt9LCBEYXRhVGFibGUubW9kZWxzLm9TZWFyY2gsIHNlYXJjaENvbHNbIGlDb2wgXSApOwoJCgkJLy8gVXNlIHRoZSBkZWZhdWx0IGNvbHVtbiBvcHRpb25zIGZ1bmN0aW9uIHRvIGluaXRpYWxpc2UgY2xhc3NlcyBldGMKCQlfZm5Db2x1bW5PcHRpb25zKCBvU2V0dGluZ3MsIGlDb2wsICQoblRoKS5kYXRhKCkgKTsKCX0KCQoJCgkvKioKCSAqIEFwcGx5IG9wdGlvbnMgZm9yIGEgY29sdW1uCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7aW50fSBpQ29sIGNvbHVtbiBpbmRleCB0byBjb25zaWRlcgoJICogIEBwYXJhbSB7b2JqZWN0fSBvT3B0aW9ucyBvYmplY3Qgd2l0aCBzVHlwZSwgYlZpc2libGUgYW5kIGJTZWFyY2hhYmxlIGV0YwoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5Db2x1bW5PcHRpb25zKCBvU2V0dGluZ3MsIGlDb2wsIG9PcHRpb25zICkKCXsKCQl2YXIgb0NvbCA9IG9TZXR0aW5ncy5hb0NvbHVtbnNbIGlDb2wgXTsKCQl2YXIgb0NsYXNzZXMgPSBvU2V0dGluZ3Mub0NsYXNzZXM7CgkJdmFyIHRoID0gJChvQ29sLm5UaCk7CgkKCQkvLyBUcnkgdG8gZ2V0IHdpZHRoIGluZm9ybWF0aW9uIGZyb20gdGhlIERPTS4gV2UgY2FuJ3QgZ2V0IGl0IGZyb20gQ1NTCgkJLy8gYXMgd2UnZCBuZWVkIHRvIHBhcnNlIHRoZSBDU1Mgc3R5bGVzaGVldC4gYHdpZHRoYCBvcHRpb24gY2FuIG92ZXJyaWRlCgkJaWYgKCAhIG9Db2wuc1dpZHRoT3JpZyApIHsKCQkJLy8gV2lkdGggYXR0cmlidXRlCgkJCW9Db2wuc1dpZHRoT3JpZyA9IHRoLmF0dHIoJ3dpZHRoJykgfHwgbnVsbDsKCQoJCQkvLyBTdHlsZSBhdHRyaWJ1dGUKCQkJdmFyIHQgPSAodGguYXR0cignc3R5bGUnKSB8fCAnJykubWF0Y2goL3dpZHRoOlxzKihcZCtbcHhlbSVdKykvKTsKCQkJaWYgKCB0ICkgewoJCQkJb0NvbC5zV2lkdGhPcmlnID0gdFsxXTsKCQkJfQoJCX0KCQoJCS8qIFVzZXIgc3BlY2lmaWVkIGNvbHVtbiBvcHRpb25zICovCgkJaWYgKCBvT3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIG9PcHRpb25zICE9PSBudWxsICkKCQl7CgkJCS8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgkJCV9mbkNvbXBhdENvbHMoIG9PcHRpb25zICk7CgkKCQkJLy8gTWFwIGNhbWVsIGNhc2UgcGFyYW1ldGVycyB0byB0aGVpciBIdW5nYXJpYW4gY291bnRlcnBhcnRzCgkJCV9mbkNhbWVsVG9IdW5nYXJpYW4oIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4sIG9PcHRpb25zLCB0cnVlICk7CgkKCQkJLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG1EYXRhUHJvcCAqLwoJCQlpZiAoIG9PcHRpb25zLm1EYXRhUHJvcCAhPT0gdW5kZWZpbmVkICYmICFvT3B0aW9ucy5tRGF0YSApCgkJCXsKCQkJCW9PcHRpb25zLm1EYXRhID0gb09wdGlvbnMubURhdGFQcm9wOwoJCQl9CgkKCQkJaWYgKCBvT3B0aW9ucy5zVHlwZSApCgkJCXsKCQkJCW9Db2wuX3NNYW51YWxUeXBlID0gb09wdGlvbnMuc1R5cGU7CgkJCX0KCQoJCQkvLyBgY2xhc3NgIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBKYXZhc2NyaXB0LCBzbyB3ZSBuZWVkIHRvIHByb3ZpZGUKCQkJLy8gdGhlIGFiaWxpdHkgdG8gdXNlIGEgdmFsaWQgbmFtZSBmb3IgdGhlIGNhbWVsIGNhc2UgaW5wdXQKCQkJaWYgKCBvT3B0aW9ucy5jbGFzc05hbWUgJiYgISBvT3B0aW9ucy5zQ2xhc3MgKQoJCQl7CgkJCQlvT3B0aW9ucy5zQ2xhc3MgPSBvT3B0aW9ucy5jbGFzc05hbWU7CgkJCX0KCQkJaWYgKCBvT3B0aW9ucy5zQ2xhc3MgKSB7CgkJCQl0aC5hZGRDbGFzcyggb09wdGlvbnMuc0NsYXNzICk7CgkJCX0KCQoJCQl2YXIgb3JpZ0NsYXNzID0gb0NvbC5zQ2xhc3M7CgkKCQkJJC5leHRlbmQoIG9Db2wsIG9PcHRpb25zICk7CgkJCV9mbk1hcCggb0NvbCwgb09wdGlvbnMsICJzV2lkdGgiLCAic1dpZHRoT3JpZyIgKTsKCQoJCQkvLyBNZXJnZSBjbGFzcyBmcm9tIHByZXZpb3VzbHkgZGVmaW5lZCBjbGFzc2VzIHdpdGggdGhpcyBvbmUsIHJhdGhlciB0aGFuIGp1c3QKCQkJLy8gb3ZlcndyaXRpbmcgaXQgaW4gdGhlIGV4dGVuZCBhYm92ZQoJCQlpZiAob3JpZ0NsYXNzICE9PSBvQ29sLnNDbGFzcykgewoJCQkJb0NvbC5zQ2xhc3MgPSBvcmlnQ2xhc3MgKyAnICcgKyBvQ29sLnNDbGFzczsKCQkJfQoJCgkJCS8qIGlEYXRhU29ydCB0byBiZSBhcHBsaWVkIChiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSksIGJ1dCBhRGF0YVNvcnQgd2lsbCB0YWtlCgkJCSAqIHByaW9yaXR5IGlmIGRlZmluZWQKCQkJICovCgkJCWlmICggb09wdGlvbnMuaURhdGFTb3J0ICE9PSB1bmRlZmluZWQgKQoJCQl7CgkJCQlvQ29sLmFEYXRhU29ydCA9IFsgb09wdGlvbnMuaURhdGFTb3J0IF07CgkJCX0KCQkJX2ZuTWFwKCBvQ29sLCBvT3B0aW9ucywgImFEYXRhU29ydCIgKTsKCQl9CgkKCQkvKiBDYWNoZSB0aGUgZGF0YSBnZXQgYW5kIHNldCBmdW5jdGlvbnMgZm9yIHNwZWVkICovCgkJdmFyIG1EYXRhU3JjID0gb0NvbC5tRGF0YTsKCQl2YXIgbURhdGEgPSBfZm5HZXRPYmplY3REYXRhRm4oIG1EYXRhU3JjICk7CgkJdmFyIG1SZW5kZXIgPSBvQ29sLm1SZW5kZXIgPyBfZm5HZXRPYmplY3REYXRhRm4oIG9Db2wubVJlbmRlciApIDogbnVsbDsKCQoJCXZhciBhdHRyVGVzdCA9IGZ1bmN0aW9uKCBzcmMgKSB7CgkJCXJldHVybiB0eXBlb2Ygc3JjID09PSAnc3RyaW5nJyAmJiBzcmMuaW5kZXhPZignQCcpICE9PSAtMTsKCQl9OwoJCW9Db2wuX2JBdHRyU3JjID0gJC5pc1BsYWluT2JqZWN0KCBtRGF0YVNyYyApICYmICgKCQkJYXR0clRlc3QobURhdGFTcmMuc29ydCkgfHwgYXR0clRlc3QobURhdGFTcmMudHlwZSkgfHwgYXR0clRlc3QobURhdGFTcmMuZmlsdGVyKQoJCSk7CgkJb0NvbC5fc2V0dGVyID0gbnVsbDsKCQoJCW9Db2wuZm5HZXREYXRhID0gZnVuY3Rpb24gKHJvd0RhdGEsIHR5cGUsIG1ldGEpIHsKCQkJdmFyIGlubmVyRGF0YSA9IG1EYXRhKCByb3dEYXRhLCB0eXBlLCB1bmRlZmluZWQsIG1ldGEgKTsKCQoJCQlyZXR1cm4gbVJlbmRlciAmJiB0eXBlID8KCQkJCW1SZW5kZXIoIGlubmVyRGF0YSwgdHlwZSwgcm93RGF0YSwgbWV0YSApIDoKCQkJCWlubmVyRGF0YTsKCQl9OwoJCW9Db2wuZm5TZXREYXRhID0gZnVuY3Rpb24gKCByb3dEYXRhLCB2YWwsIG1ldGEgKSB7CgkJCXJldHVybiBfZm5TZXRPYmplY3REYXRhRm4oIG1EYXRhU3JjICkoIHJvd0RhdGEsIHZhbCwgbWV0YSApOwoJCX07CgkKCQkvLyBJbmRpY2F0ZSBpZiBEYXRhVGFibGVzIHNob3VsZCByZWFkIERPTSBkYXRhIGFzIGFuIG9iamVjdCBvciBhcnJheQoJCS8vIFVzZWQgaW4gX2ZuR2V0Um93RWxlbWVudHMKCQlpZiAoIHR5cGVvZiBtRGF0YVNyYyAhPT0gJ251bWJlcicgKSB7CgkJCW9TZXR0aW5ncy5fcm93UmVhZE9iamVjdCA9IHRydWU7CgkJfQoJCgkJLyogRmVhdHVyZSBzb3J0aW5nIG92ZXJyaWRlcyBjb2x1bW4gc3BlY2lmaWMgd2hlbiBvZmYgKi8KCQlpZiAoICFvU2V0dGluZ3Mub0ZlYXR1cmVzLmJTb3J0ICkKCQl7CgkJCW9Db2wuYlNvcnRhYmxlID0gZmFsc2U7CgkJCXRoLmFkZENsYXNzKCBvQ2xhc3Nlcy5zU29ydGFibGVOb25lICk7IC8vIEhhdmUgdG8gYWRkIGNsYXNzIGhlcmUgYXMgb3JkZXIgZXZlbnQgaXNuJ3QgY2FsbGVkCgkJfQoJCgkJLyogQ2hlY2sgdGhhdCB0aGUgY2xhc3MgYXNzaWdubWVudCBpcyBjb3JyZWN0IGZvciBzb3J0aW5nICovCgkJdmFyIGJBc2MgPSAkLmluQXJyYXkoJ2FzYycsIG9Db2wuYXNTb3J0aW5nKSAhPT0gLTE7CgkJdmFyIGJEZXNjID0gJC5pbkFycmF5KCdkZXNjJywgb0NvbC5hc1NvcnRpbmcpICE9PSAtMTsKCQlpZiAoICFvQ29sLmJTb3J0YWJsZSB8fCAoIWJBc2MgJiYgIWJEZXNjKSApCgkJewoJCQlvQ29sLnNTb3J0aW5nQ2xhc3MgPSBvQ2xhc3Nlcy5zU29ydGFibGVOb25lOwoJCQlvQ29sLnNTb3J0aW5nQ2xhc3NKVUkgPSAiIjsKCQl9CgkJZWxzZSBpZiAoIGJBc2MgJiYgIWJEZXNjICkKCQl7CgkJCW9Db2wuc1NvcnRpbmdDbGFzcyA9IG9DbGFzc2VzLnNTb3J0YWJsZUFzYzsKCQkJb0NvbC5zU29ydGluZ0NsYXNzSlVJID0gb0NsYXNzZXMuc1NvcnRKVUlBc2NBbGxvd2VkOwoJCX0KCQllbHNlIGlmICggIWJBc2MgJiYgYkRlc2MgKQoJCXsKCQkJb0NvbC5zU29ydGluZ0NsYXNzID0gb0NsYXNzZXMuc1NvcnRhYmxlRGVzYzsKCQkJb0NvbC5zU29ydGluZ0NsYXNzSlVJID0gb0NsYXNzZXMuc1NvcnRKVUlEZXNjQWxsb3dlZDsKCQl9CgkJZWxzZQoJCXsKCQkJb0NvbC5zU29ydGluZ0NsYXNzID0gb0NsYXNzZXMuc1NvcnRhYmxlOwoJCQlvQ29sLnNTb3J0aW5nQ2xhc3NKVUkgPSBvQ2xhc3Nlcy5zU29ydEpVSTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBBZGp1c3QgdGhlIHRhYmxlIGNvbHVtbiB3aWR0aHMgZm9yIG5ldyBkYXRhLiBOb3RlOiB5b3Ugd291bGQgcHJvYmFibHkgd2FudCB0bwoJICogZG8gYSByZWRyYXcgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIQoJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5BZGp1c3RDb2x1bW5TaXppbmcgKCBzZXR0aW5ncyApCgl7CgkJLyogTm90IGludGVyZXN0ZWQgaW4gZG9pbmcgY29sdW1uIHdpZHRoIGNhbGN1bGF0aW9uIGlmIGF1dG8td2lkdGggaXMgZGlzYWJsZWQgKi8KCQlpZiAoIHNldHRpbmdzLm9GZWF0dXJlcy5iQXV0b1dpZHRoICE9PSBmYWxzZSApCgkJewoJCQl2YXIgY29sdW1ucyA9IHNldHRpbmdzLmFvQ29sdW1uczsKCQoJCQlfZm5DYWxjdWxhdGVDb2x1bW5XaWR0aHMoIHNldHRpbmdzICk7CgkJCWZvciAoIHZhciBpPTAgLCBpTGVuPWNvbHVtbnMubGVuZ3RoIDsgaTxpTGVuIDsgaSsrICkKCQkJewoJCQkJY29sdW1uc1tpXS5uVGguc3R5bGUud2lkdGggPSBjb2x1bW5zW2ldLnNXaWR0aDsKCQkJfQoJCX0KCQoJCXZhciBzY3JvbGwgPSBzZXR0aW5ncy5vU2Nyb2xsOwoJCWlmICggc2Nyb2xsLnNZICE9PSAnJyB8fCBzY3JvbGwuc1ggIT09ICcnKQoJCXsKCQkJX2ZuU2Nyb2xsRHJhdyggc2V0dGluZ3MgKTsKCQl9CgkKCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCBudWxsLCAnY29sdW1uLXNpemluZycsIFtzZXR0aW5nc10gKTsKCX0KCQoJCgkvKioKCSAqIENvbnZlcnQgdGhlIGluZGV4IG9mIGEgdmlzaWJsZSBjb2x1bW4gdG8gdGhlIGluZGV4IGluIHRoZSBkYXRhIGFycmF5ICh0YWtlIGFjY291bnQKCSAqIG9mIGhpZGRlbiBjb2x1bW5zKQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge2ludH0gaU1hdGNoIFZpc2libGUgY29sdW1uIGluZGV4IHRvIGxvb2t1cAoJICogIEByZXR1cm5zIHtpbnR9IGkgdGhlIGRhdGEgaW5kZXgKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuVmlzaWJsZVRvQ29sdW1uSW5kZXgoIG9TZXR0aW5ncywgaU1hdGNoICkKCXsKCQl2YXIgYWlWaXMgPSBfZm5HZXRDb2x1bW5zKCBvU2V0dGluZ3MsICdiVmlzaWJsZScgKTsKCQoJCXJldHVybiB0eXBlb2YgYWlWaXNbaU1hdGNoXSA9PT0gJ251bWJlcicgPwoJCQlhaVZpc1tpTWF0Y2hdIDoKCQkJbnVsbDsKCX0KCQoJCgkvKioKCSAqIENvbnZlcnQgdGhlIGluZGV4IG9mIGFuIGluZGV4IGluIHRoZSBkYXRhIGFycmF5IGFuZCBjb252ZXJ0IGl0IHRvIHRoZSB2aXNpYmxlCgkgKiAgIGNvbHVtbiBpbmRleCAodGFrZSBhY2NvdW50IG9mIGhpZGRlbiBjb2x1bW5zKQoJICogIEBwYXJhbSB7aW50fSBpTWF0Y2ggQ29sdW1uIGluZGV4IHRvIGxvb2t1cAoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcmV0dXJucyB7aW50fSBpIHRoZSBkYXRhIGluZGV4CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkNvbHVtbkluZGV4VG9WaXNpYmxlKCBvU2V0dGluZ3MsIGlNYXRjaCApCgl7CgkJdmFyIGFpVmlzID0gX2ZuR2V0Q29sdW1ucyggb1NldHRpbmdzLCAnYlZpc2libGUnICk7CgkJdmFyIGlQb3MgPSAkLmluQXJyYXkoIGlNYXRjaCwgYWlWaXMgKTsKCQoJCXJldHVybiBpUG9zICE9PSAtMSA/IGlQb3MgOiBudWxsOwoJfQoJCgkKCS8qKgoJICogR2V0IHRoZSBudW1iZXIgb2YgdmlzaWJsZSBjb2x1bW5zCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEByZXR1cm5zIHtpbnR9IGkgdGhlIG51bWJlciBvZiB2aXNpYmxlIGNvbHVtbnMKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuVmlzYmxlQ29sdW1ucyggb1NldHRpbmdzICkKCXsKCQl2YXIgdmlzID0gMDsKCQoJCS8vIE5vIHJlZHVjZSBpbiBJRTgsIHVzZSBhIGxvb3AgZm9yIG5vdwoJCSQuZWFjaCggb1NldHRpbmdzLmFvQ29sdW1ucywgZnVuY3Rpb24gKCBpLCBjb2wgKSB7CgkJCWlmICggY29sLmJWaXNpYmxlICYmICQoY29sLm5UaCkuY3NzKCdkaXNwbGF5JykgIT09ICdub25lJyApIHsKCQkJCXZpcysrOwoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIHZpczsKCX0KCQoJCgkvKioKCSAqIEdldCBhbiBhcnJheSBvZiBjb2x1bW4gaW5kZXhlcyB0aGF0IG1hdGNoIGEgZ2l2ZW4gcHJvcGVydHkKCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtzdHJpbmd9IHNQYXJhbSBQYXJhbWV0ZXIgaW4gYW9Db2x1bW5zIHRvIGxvb2sgZm9yIC0gdHlwaWNhbGx5CgkgKiAgICBiVmlzaWJsZSBvciBiU2VhcmNoYWJsZQoJICogIEByZXR1cm5zIHthcnJheX0gQXJyYXkgb2YgaW5kZXhlcyB3aXRoIG1hdGNoZWQgcHJvcGVydGllcwoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5HZXRDb2x1bW5zKCBvU2V0dGluZ3MsIHNQYXJhbSApCgl7CgkJdmFyIGEgPSBbXTsKCQoJCSQubWFwKCBvU2V0dGluZ3MuYW9Db2x1bW5zLCBmdW5jdGlvbih2YWwsIGkpIHsKCQkJaWYgKCB2YWxbc1BhcmFtXSApIHsKCQkJCWEucHVzaCggaSApOwoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIGE7Cgl9CgkKCQoJLyoqCgkgKiBDYWxjdWxhdGUgdGhlICd0eXBlJyBvZiBhIGNvbHVtbgoJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5Db2x1bW5UeXBlcyAoIHNldHRpbmdzICkKCXsKCQl2YXIgY29sdW1ucyA9IHNldHRpbmdzLmFvQ29sdW1uczsKCQl2YXIgZGF0YSA9IHNldHRpbmdzLmFvRGF0YTsKCQl2YXIgdHlwZXMgPSBEYXRhVGFibGUuZXh0LnR5cGUuZGV0ZWN0OwoJCXZhciBpLCBpZW4sIGosIGplbiwgaywga2VuOwoJCXZhciBjb2wsIGNlbGwsIGRldGVjdGVkVHlwZSwgY2FjaGU7CgkKCQkvLyBGb3IgZWFjaCBjb2x1bW4sIHNwaW4gb3ZlciB0aGUgCgkJZm9yICggaT0wLCBpZW49Y29sdW1ucy5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJY29sID0gY29sdW1uc1tpXTsKCQkJY2FjaGUgPSBbXTsKCQoJCQlpZiAoICEgY29sLnNUeXBlICYmIGNvbC5fc01hbnVhbFR5cGUgKSB7CgkJCQljb2wuc1R5cGUgPSBjb2wuX3NNYW51YWxUeXBlOwoJCQl9CgkJCWVsc2UgaWYgKCAhIGNvbC5zVHlwZSApIHsKCQkJCWZvciAoIGo9MCwgamVuPXR5cGVzLmxlbmd0aCA7IGo8amVuIDsgaisrICkgewoJCQkJCWZvciAoIGs9MCwga2VuPWRhdGEubGVuZ3RoIDsgazxrZW4gOyBrKysgKSB7CgkJCQkJCS8vIFVzZSBhIGNhY2hlIGFycmF5IHNvIHdlIG9ubHkgbmVlZCB0byBnZXQgdGhlIHR5cGUgZGF0YQoJCQkJCQkvLyBmcm9tIHRoZSBmb3JtYXR0ZXIgb25jZSAod2hlbiB1c2luZyBtdWx0aXBsZSBkZXRlY3RvcnMpCgkJCQkJCWlmICggY2FjaGVba10gPT09IHVuZGVmaW5lZCApIHsKCQkJCQkJCWNhY2hlW2tdID0gX2ZuR2V0Q2VsbERhdGEoIHNldHRpbmdzLCBrLCBpLCAndHlwZScgKTsKCQkJCQkJfQoJCgkJCQkJCWRldGVjdGVkVHlwZSA9IHR5cGVzW2pdKCBjYWNoZVtrXSwgc2V0dGluZ3MgKTsKCQoJCQkJCQkvLyBJZiBudWxsLCB0aGVuIHRoaXMgdHlwZSBjYW4ndCBhcHBseSB0byB0aGlzIGNvbHVtbiwgc28KCQkJCQkJLy8gcmF0aGVyIHRoYW4gdGVzdGluZyBhbGwgY2VsbHMsIGJyZWFrIG91dC4gVGhlcmUgaXMgYW4KCQkJCQkJLy8gZXhjZXB0aW9uIGZvciB0aGUgbGFzdCB0eXBlIHdoaWNoIGlzIGBodG1sYC4gV2UgbmVlZCB0bwoJCQkJCQkvLyBzY2FuIGFsbCByb3dzIHNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIG1peCBzdHJpbmcgYW5kIEhUTUwKCQkJCQkJLy8gdHlwZXMKCQkJCQkJaWYgKCAhIGRldGVjdGVkVHlwZSAmJiBqICE9PSB0eXBlcy5sZW5ndGgtMSApIHsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkKCQkJCQkJLy8gT25seSBhIHNpbmdsZSBtYXRjaCBpcyBuZWVkZWQgZm9yIGh0bWwgdHlwZSBzaW5jZSBpdCBpcwoJCQkJCQkvLyBib3R0b20gb2YgdGhlIHBpbGUgYW5kIHZlcnkgc2ltaWxhciB0byBzdHJpbmcgLSBidXQgaXQKCQkJCQkJLy8gbXVzdCBub3QgYmUgZW1wdHkKCQkJCQkJaWYgKCBkZXRlY3RlZFR5cGUgPT09ICdodG1sJyAmJiAhIF9lbXB0eShjYWNoZVtrXSkgKSB7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQoJCQkJCS8vIFR5cGUgaXMgdmFsaWQgZm9yIGFsbCBkYXRhIHBvaW50cyBpbiB0aGUgY29sdW1uIC0gdXNlIHRoaXMKCQkJCQkvLyB0eXBlCgkJCQkJaWYgKCBkZXRlY3RlZFR5cGUgKSB7CgkJCQkJCWNvbC5zVHlwZSA9IGRldGVjdGVkVHlwZTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCgkJCQkvLyBGYWxsIGJhY2sgLSBpZiBubyB0eXBlIHdhcyBkZXRlY3RlZCwgYWx3YXlzIHVzZSBzdHJpbmcKCQkJCWlmICggISBjb2wuc1R5cGUgKSB7CgkJCQkJY29sLnNUeXBlID0gJ3N0cmluZyc7CgkJCQl9CgkJCX0KCQl9Cgl9CgkKCQoJLyoqCgkgKiBUYWtlIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgYW5kIHN0YXRpYyBjb2x1bW5zIGFycmF5cyBhbmQgY2FsY3VsYXRlIGhvdwoJICogdGhleSByZWxhdGUgdG8gY29sdW1uIGluZGV4ZXMuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIHRoZW4gYXBwbHkgdGhlCgkgKiBkZWZpbml0aW9uIGZvdW5kIGZvciBhIGNvbHVtbiB0byBhIHN1aXRhYmxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge2FycmF5fSBhb0NvbERlZnMgVGhlIGFvQ29sdW1uRGVmcyBhcnJheSB0aGF0IGlzIHRvIGJlIGFwcGxpZWQKCSAqICBAcGFyYW0ge2FycmF5fSBhb0NvbHMgVGhlIGFvQ29sdW1ucyBhcnJheSB0aGF0IGRlZmluZXMgY29sdW1ucyBpbmRpdmlkdWFsbHkKCSAqICBAcGFyYW0ge2Z1bmN0aW9ufSBmbiBDYWxsYmFjayBmdW5jdGlvbiAtIHRha2VzIHR3byBwYXJhbWV0ZXJzLCB0aGUgY2FsY3VsYXRlZAoJICogICAgY29sdW1uIGluZGV4IGFuZCB0aGUgZGVmaW5pdGlvbiBmb3IgdGhhdCBjb2x1bW4uCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkFwcGx5Q29sdW1uRGVmcyggb1NldHRpbmdzLCBhb0NvbERlZnMsIGFvQ29scywgZm4gKQoJewoJCXZhciBpLCBpTGVuLCBqLCBqTGVuLCBrLCBrTGVuLCBkZWY7CgkJdmFyIGNvbHVtbnMgPSBvU2V0dGluZ3MuYW9Db2x1bW5zOwoJCgkJLy8gQ29sdW1uIGRlZmluaXRpb25zIHdpdGggYVRhcmdldHMKCQlpZiAoIGFvQ29sRGVmcyApCgkJewoJCQkvKiBMb29wIG92ZXIgdGhlIGRlZmluaXRpb25zIGFycmF5IC0gbG9vcCBpbiByZXZlcnNlIHNvIGZpcnN0IGluc3RhbmNlIGhhcyBwcmlvcml0eSAqLwoJCQlmb3IgKCBpPWFvQ29sRGVmcy5sZW5ndGgtMSA7IGk+PTAgOyBpLS0gKQoJCQl7CgkJCQlkZWYgPSBhb0NvbERlZnNbaV07CgkKCQkJCS8qIEVhY2ggZGVmaW5pdGlvbiBjYW4gdGFyZ2V0IG11bHRpcGxlIGNvbHVtbnMsIGFzIGl0IGlzIGFuIGFycmF5ICovCgkJCQl2YXIgYVRhcmdldHMgPSBkZWYudGFyZ2V0ICE9PSB1bmRlZmluZWQKCQkJCQk/IGRlZi50YXJnZXQKCQkJCQk6IGRlZi50YXJnZXRzICE9PSB1bmRlZmluZWQKCQkJCQkJPyBkZWYudGFyZ2V0cwoJCQkJCQk6IGRlZi5hVGFyZ2V0czsKCQoJCQkJaWYgKCAhIEFycmF5LmlzQXJyYXkoIGFUYXJnZXRzICkgKQoJCQkJewoJCQkJCWFUYXJnZXRzID0gWyBhVGFyZ2V0cyBdOwoJCQkJfQoJCgkJCQlmb3IgKCBqPTAsIGpMZW49YVRhcmdldHMubGVuZ3RoIDsgajxqTGVuIDsgaisrICkKCQkJCXsKCQkJCQlpZiAoIHR5cGVvZiBhVGFyZ2V0c1tqXSA9PT0gJ251bWJlcicgJiYgYVRhcmdldHNbal0gPj0gMCApCgkJCQkJewoJCQkJCQkvKiBBZGQgY29sdW1ucyB0aGF0IHdlIGRvbid0IHlldCBrbm93IGFib3V0ICovCgkJCQkJCXdoaWxlKCBjb2x1bW5zLmxlbmd0aCA8PSBhVGFyZ2V0c1tqXSApCgkJCQkJCXsKCQkJCQkJCV9mbkFkZENvbHVtbiggb1NldHRpbmdzICk7CgkJCQkJCX0KCQoJCQkJCQkvKiBJbnRlZ2VyLCBiYXNpYyBpbmRleCAqLwoJCQkJCQlmbiggYVRhcmdldHNbal0sIGRlZiApOwoJCQkJCX0KCQkJCQllbHNlIGlmICggdHlwZW9mIGFUYXJnZXRzW2pdID09PSAnbnVtYmVyJyAmJiBhVGFyZ2V0c1tqXSA8IDAgKQoJCQkJCXsKCQkJCQkJLyogTmVnYXRpdmUgaW50ZWdlciwgcmlnaHQgdG8gbGVmdCBjb2x1bW4gY291bnRpbmcgKi8KCQkJCQkJZm4oIGNvbHVtbnMubGVuZ3RoK2FUYXJnZXRzW2pdLCBkZWYgKTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoIHR5cGVvZiBhVGFyZ2V0c1tqXSA9PT0gJ3N0cmluZycgKQoJCQkJCXsKCQkJCQkJLyogQ2xhc3MgbmFtZSBtYXRjaGluZyBvbiBUSCBlbGVtZW50ICovCgkJCQkJCWZvciAoIGs9MCwga0xlbj1jb2x1bW5zLmxlbmd0aCA7IGs8a0xlbiA7IGsrKyApCgkJCQkJCXsKCQkJCQkJCWlmICggYVRhcmdldHNbal0gPT0gIl9hbGwiIHx8CgkJCQkJCQkgICAgICQoY29sdW1uc1trXS5uVGgpLmhhc0NsYXNzKCBhVGFyZ2V0c1tqXSApICkKCQkJCQkJCXsKCQkJCQkJCQlmbiggaywgZGVmICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkKCQkvLyBTdGF0aWNhbGx5IGRlZmluZWQgY29sdW1ucyBhcnJheQoJCWlmICggYW9Db2xzICkKCQl7CgkJCWZvciAoIGk9MCwgaUxlbj1hb0NvbHMubGVuZ3RoIDsgaTxpTGVuIDsgaSsrICkKCQkJewoJCQkJZm4oIGksIGFvQ29sc1tpXSApOwoJCQl9CgkJfQoJfQoJCgkvKioKCSAqIEFkZCBhIGRhdGEgYXJyYXkgdG8gdGhlIHRhYmxlLCBjcmVhdGluZyBET00gbm9kZSBldGMuIFRoaXMgaXMgdGhlIHBhcmFsbGVsIHRvCgkgKiBfZm5HYXRoZXJEYXRhLCBidXQgZm9yIGFkZGluZyByb3dzIGZyb20gYSBKYXZhc2NyaXB0IHNvdXJjZSwgcmF0aGVyIHRoYW4gYQoJICogRE9NIHNvdXJjZS4KCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHthcnJheX0gYURhdGEgZGF0YSBhcnJheSB0byBiZSBhZGRlZAoJICogIEBwYXJhbSB7bm9kZX0gW25Ucl0gVFIgZWxlbWVudCB0byBhZGQgdG8gdGhlIHRhYmxlIC0gb3B0aW9uYWwuIElmIG5vdCBnaXZlbiwKCSAqICAgIERhdGFUYWJsZXMgd2lsbCBjcmVhdGUgYSByb3cgYXV0b21hdGljYWxseQoJICogIEBwYXJhbSB7YXJyYXl9IFthblRkc10gQXJyYXkgb2YgVER8VEggZWxlbWVudHMgZm9yIHRoZSByb3cgLSBtdXN0IGJlIGdpdmVuCgkgKiAgICBpZiBuVHIgaXMuCgkgKiAgQHJldHVybnMge2ludH0gPj0wIGlmIHN1Y2Nlc3NmdWwgKGluZGV4IG9mIG5ldyBhb0RhdGEgZW50cnkpLCAtMSBpZiBmYWlsZWQKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuQWRkRGF0YSAoIG9TZXR0aW5ncywgYURhdGFJbiwgblRyLCBhblRkcyApCgl7CgkJLyogQ3JlYXRlIHRoZSBvYmplY3QgZm9yIHN0b3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuZXcgcm93ICovCgkJdmFyIGlSb3cgPSBvU2V0dGluZ3MuYW9EYXRhLmxlbmd0aDsKCQl2YXIgb0RhdGEgPSAkLmV4dGVuZCggdHJ1ZSwge30sIERhdGFUYWJsZS5tb2RlbHMub1JvdywgewoJCQlzcmM6IG5UciA/ICdkb20nIDogJ2RhdGEnLAoJCQlpZHg6IGlSb3cKCQl9ICk7CgkKCQlvRGF0YS5fYURhdGEgPSBhRGF0YUluOwoJCW9TZXR0aW5ncy5hb0RhdGEucHVzaCggb0RhdGEgKTsKCQoJCS8qIENyZWF0ZSB0aGUgY2VsbHMgKi8KCQl2YXIgblRkLCBzVGhpc1R5cGU7CgkJdmFyIGNvbHVtbnMgPSBvU2V0dGluZ3MuYW9Db2x1bW5zOwoJCgkJLy8gSW52YWxpZGF0ZSB0aGUgY29sdW1uIHR5cGVzIGFzIHRoZSBuZXcgZGF0YSBuZWVkcyB0byBiZSByZXZhbGlkYXRlZAoJCWZvciAoIHZhciBpPTAsIGlMZW49Y29sdW1ucy5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCXsKCQkJY29sdW1uc1tpXS5zVHlwZSA9IG51bGw7CgkJfQoJCgkJLyogQWRkIHRvIHRoZSBkaXNwbGF5IGFycmF5ICovCgkJb1NldHRpbmdzLmFpRGlzcGxheU1hc3Rlci5wdXNoKCBpUm93ICk7CgkKCQl2YXIgaWQgPSBvU2V0dGluZ3Mucm93SWRGbiggYURhdGFJbiApOwoJCWlmICggaWQgIT09IHVuZGVmaW5lZCApIHsKCQkJb1NldHRpbmdzLmFJZHNbIGlkIF0gPSBvRGF0YTsKCQl9CgkKCQkvKiBDcmVhdGUgdGhlIERPTSBpbmZvcm1hdGlvbiwgb3IgcmVnaXN0ZXIgaXQgaWYgYWxyZWFkeSBwcmVzZW50ICovCgkJaWYgKCBuVHIgfHwgISBvU2V0dGluZ3Mub0ZlYXR1cmVzLmJEZWZlclJlbmRlciApCgkJewoJCQlfZm5DcmVhdGVUciggb1NldHRpbmdzLCBpUm93LCBuVHIsIGFuVGRzICk7CgkJfQoJCgkJcmV0dXJuIGlSb3c7Cgl9CgkKCQoJLyoqCgkgKiBBZGQgb25lIG9yIG1vcmUgVFIgZWxlbWVudHMgdG8gdGhlIHRhYmxlLiBHZW5lcmFsbHkgd2UnZCBleHBlY3QgdG8KCSAqIHVzZSB0aGlzIGZvciByZWFkaW5nIGRhdGEgZnJvbSBhIERPTSBzb3VyY2VkIHRhYmxlLCBidXQgaXQgY291bGQgYmUKCSAqIHVzZWQgZm9yIGFuIFRSIGVsZW1lbnQuIE5vdGUgdGhhdCBpZiBhIFRSIGlzIGdpdmVuLCBpdCBpcyB1c2VkIChpLmUuCgkgKiBpdCBpcyBub3QgY2xvbmVkKS4KCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge2FycmF5fG5vZGV8alF1ZXJ5fSB0cnMgVGhlIFRSIGVsZW1lbnQocykgdG8gYWRkIHRvIHRoZSB0YWJsZQoJICogIEByZXR1cm5zIHthcnJheX0gQXJyYXkgb2YgaW5kZXhlcyBmb3IgdGhlIGFkZGVkIHJvd3MKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuQWRkVHIoIHNldHRpbmdzLCB0cnMgKQoJewoJCXZhciByb3c7CgkKCQkvLyBBbGxvdyBhbiBpbmRpdmlkdWFsIG5vZGUgdG8gYmUgcGFzc2VkIGluCgkJaWYgKCAhICh0cnMgaW5zdGFuY2VvZiAkKSApIHsKCQkJdHJzID0gJCh0cnMpOwoJCX0KCQoJCXJldHVybiB0cnMubWFwKCBmdW5jdGlvbiAoaSwgZWwpIHsKCQkJcm93ID0gX2ZuR2V0Um93RWxlbWVudHMoIHNldHRpbmdzLCBlbCApOwoJCQlyZXR1cm4gX2ZuQWRkRGF0YSggc2V0dGluZ3MsIHJvdy5kYXRhLCBlbCwgcm93LmNlbGxzICk7CgkJfSApOwoJfQoJCgkKCS8qKgoJICogVGFrZSBhIFRSIGVsZW1lbnQgYW5kIGNvbnZlcnQgaXQgdG8gYW4gaW5kZXggaW4gYW9EYXRhCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7bm9kZX0gbiB0aGUgVFIgZWxlbWVudCB0byBmaW5kCgkgKiAgQHJldHVybnMge2ludH0gaW5kZXggaWYgdGhlIG5vZGUgaXMgZm91bmQsIG51bGwgaWYgbm90CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbk5vZGVUb0RhdGFJbmRleCggb1NldHRpbmdzLCBuICkKCXsKCQlyZXR1cm4gKG4uX0RUX1Jvd0luZGV4IT09dW5kZWZpbmVkKSA/IG4uX0RUX1Jvd0luZGV4IDogbnVsbDsKCX0KCQoJCgkvKioKCSAqIFRha2UgYSBURCBlbGVtZW50IGFuZCBjb252ZXJ0IGl0IGludG8gYSBjb2x1bW4gZGF0YSBpbmRleCAobm90IHRoZSB2aXNpYmxlIGluZGV4KQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge2ludH0gaVJvdyBUaGUgcm93IG51bWJlciB0aGUgVEQvVEggY2FuIGJlIGZvdW5kIGluCgkgKiAgQHBhcmFtIHtub2RlfSBuIFRoZSBURC9USCBlbGVtZW50IHRvIGZpbmQKCSAqICBAcmV0dXJucyB7aW50fSBpbmRleCBpZiB0aGUgbm9kZSBpcyBmb3VuZCwgLTEgaWYgbm90CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbk5vZGVUb0NvbHVtbkluZGV4KCBvU2V0dGluZ3MsIGlSb3csIG4gKQoJewoJCXJldHVybiAkLmluQXJyYXkoIG4sIG9TZXR0aW5ncy5hb0RhdGFbIGlSb3cgXS5hbkNlbGxzICk7Cgl9CgkKCQoJLyoqCgkgKiBHZXQgdGhlIGRhdGEgZm9yIGEgZ2l2ZW4gY2VsbCBmcm9tIHRoZSBpbnRlcm5hbCBjYWNoZSwgdGFraW5nIGludG8gYWNjb3VudCBkYXRhIG1hcHBpbmcKCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge2ludH0gcm93SWR4IGFvRGF0YSByb3cgaWQKCSAqICBAcGFyYW0ge2ludH0gY29sSWR4IENvbHVtbiBpbmRleAoJICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIGRhdGEgZ2V0IHR5cGUgKCdkaXNwbGF5JywgJ3R5cGUnICdmaWx0ZXJ8c2VhcmNoJyAnc29ydHxvcmRlcicpCgkgKiAgQHJldHVybnMgeyp9IENlbGwgZGF0YQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5HZXRDZWxsRGF0YSggc2V0dGluZ3MsIHJvd0lkeCwgY29sSWR4LCB0eXBlICkKCXsKCQlpZiAodHlwZSA9PT0gJ3NlYXJjaCcpIHsKCQkJdHlwZSA9ICdmaWx0ZXInOwoJCX0KCQllbHNlIGlmICh0eXBlID09PSAnb3JkZXInKSB7CgkJCXR5cGUgPSAnc29ydCc7CgkJfQoJCgkJdmFyIGRyYXcgICAgICAgICAgID0gc2V0dGluZ3MuaURyYXc7CgkJdmFyIGNvbCAgICAgICAgICAgID0gc2V0dGluZ3MuYW9Db2x1bW5zW2NvbElkeF07CgkJdmFyIHJvd0RhdGEgICAgICAgID0gc2V0dGluZ3MuYW9EYXRhW3Jvd0lkeF0uX2FEYXRhOwoJCXZhciBkZWZhdWx0Q29udGVudCA9IGNvbC5zRGVmYXVsdENvbnRlbnQ7CgkJdmFyIGNlbGxEYXRhICAgICAgID0gY29sLmZuR2V0RGF0YSggcm93RGF0YSwgdHlwZSwgewoJCQlzZXR0aW5nczogc2V0dGluZ3MsCgkJCXJvdzogICAgICByb3dJZHgsCgkJCWNvbDogICAgICBjb2xJZHgKCQl9ICk7CgkKCQlpZiAoIGNlbGxEYXRhID09PSB1bmRlZmluZWQgKSB7CgkJCWlmICggc2V0dGluZ3MuaURyYXdFcnJvciAhPSBkcmF3ICYmIGRlZmF1bHRDb250ZW50ID09PSBudWxsICkgewoJCQkJX2ZuTG9nKCBzZXR0aW5ncywgMCwgIlJlcXVlc3RlZCB1bmtub3duIHBhcmFtZXRlciAiKwoJCQkJCSh0eXBlb2YgY29sLm1EYXRhPT0nZnVuY3Rpb24nID8gJ3tmdW5jdGlvbn0nIDogIiciK2NvbC5tRGF0YSsiJyIpKwoJCQkJCSIgZm9yIHJvdyAiK3Jvd0lkeCsiLCBjb2x1bW4gIitjb2xJZHgsIDQgKTsKCQkJCXNldHRpbmdzLmlEcmF3RXJyb3IgPSBkcmF3OwoJCQl9CgkJCXJldHVybiBkZWZhdWx0Q29udGVudDsKCQl9CgkKCQkvLyBXaGVuIHRoZSBkYXRhIHNvdXJjZSBpcyBudWxsIGFuZCBhIHNwZWNpZmljIGRhdGEgdHlwZSBpcyByZXF1ZXN0ZWQgKGkuZS4KCQkvLyBub3QgdGhlIG9yaWdpbmFsIGRhdGEpLCB3ZSBjYW4gdXNlIGRlZmF1bHQgY29sdW1uIGRhdGEKCQlpZiAoIChjZWxsRGF0YSA9PT0gcm93RGF0YSB8fCBjZWxsRGF0YSA9PT0gbnVsbCkgJiYgZGVmYXVsdENvbnRlbnQgIT09IG51bGwgJiYgdHlwZSAhPT0gdW5kZWZpbmVkICkgewoJCQljZWxsRGF0YSA9IGRlZmF1bHRDb250ZW50OwoJCX0KCQllbHNlIGlmICggdHlwZW9mIGNlbGxEYXRhID09PSAnZnVuY3Rpb24nICkgewoJCQkvLyBJZiB0aGUgZGF0YSBzb3VyY2UgaXMgYSBmdW5jdGlvbiwgdGhlbiB3ZSBydW4gaXQgYW5kIHVzZSB0aGUgcmV0dXJuLAoJCQkvLyBleGVjdXRpbmcgaW4gdGhlIHNjb3BlIG9mIHRoZSBkYXRhIG9iamVjdCAoZm9yIGluc3RhbmNlcykKCQkJcmV0dXJuIGNlbGxEYXRhLmNhbGwoIHJvd0RhdGEgKTsKCQl9CgkKCQlpZiAoIGNlbGxEYXRhID09PSBudWxsICYmIHR5cGUgPT09ICdkaXNwbGF5JyApIHsKCQkJcmV0dXJuICcnOwoJCX0KCQoJCWlmICggdHlwZSA9PT0gJ2ZpbHRlcicgKSB7CgkJCXZhciBmb21hdHRlcnMgPSBEYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoOwoJCgkJCWlmICggZm9tYXR0ZXJzWyBjb2wuc1R5cGUgXSApIHsKCQkJCWNlbGxEYXRhID0gZm9tYXR0ZXJzWyBjb2wuc1R5cGUgXSggY2VsbERhdGEgKTsKCQkJfQoJCX0KCQoJCXJldHVybiBjZWxsRGF0YTsKCX0KCQoJCgkvKioKCSAqIFNldCB0aGUgdmFsdWUgZm9yIGEgc3BlY2lmaWMgY2VsbCwgaW50byB0aGUgaW50ZXJuYWwgZGF0YSBjYWNoZQoJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7aW50fSByb3dJZHggYW9EYXRhIHJvdyBpZAoJICogIEBwYXJhbSB7aW50fSBjb2xJZHggQ29sdW1uIGluZGV4CgkgKiAgQHBhcmFtIHsqfSB2YWwgVmFsdWUgdG8gc2V0CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNldENlbGxEYXRhKCBzZXR0aW5ncywgcm93SWR4LCBjb2xJZHgsIHZhbCApCgl7CgkJdmFyIGNvbCAgICAgPSBzZXR0aW5ncy5hb0NvbHVtbnNbY29sSWR4XTsKCQl2YXIgcm93RGF0YSA9IHNldHRpbmdzLmFvRGF0YVtyb3dJZHhdLl9hRGF0YTsKCQoJCWNvbC5mblNldERhdGEoIHJvd0RhdGEsIHZhbCwgewoJCQlzZXR0aW5nczogc2V0dGluZ3MsCgkJCXJvdzogICAgICByb3dJZHgsCgkJCWNvbDogICAgICBjb2xJZHgKCQl9ICApOwoJfQoJCgkKCS8vIFByaXZhdGUgdmFyaWFibGUgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIGFjdGlvbiBzeW50YXggaW4gdGhlIGRhdGEgcHJvcGVydHkgb2JqZWN0Cgl2YXIgX19yZUFycmF5ID0gL1xbLio/XF0kLzsKCXZhciBfX3JlRm4gPSAvXChcKSQvOwoJCgkvKioKCSAqIFNwbGl0IHN0cmluZyBvbiBwZXJpb2RzLCB0YWtpbmcgaW50byBhY2NvdW50IGVzY2FwZWQgcGVyaW9kcwoJICogQHBhcmFtICB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIHNwbGl0CgkgKiBAcmV0dXJuIHthcnJheX0gU3BsaXQgc3RyaW5nCgkgKi8KCWZ1bmN0aW9uIF9mblNwbGl0T2JqTm90YXRpb24oIHN0ciApCgl7CgkJcmV0dXJuICQubWFwKCBzdHIubWF0Y2goLyhcXC58W15cLl0pKy9nKSB8fCBbJyddLCBmdW5jdGlvbiAoIHMgKSB7CgkJCXJldHVybiBzLnJlcGxhY2UoL1xcXC4vZywgJy4nKTsKCQl9ICk7Cgl9CgkKCQoJLyoqCgkgKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCBkYXRhIGZyb20gYSBzb3VyY2Ugb2JqZWN0LCB0YWtpbmcKCSAqIGludG8gYWNjb3VudCB0aGUgYWJpbGl0eSB0byB1c2UgbmVzdGVkIG9iamVjdHMgYXMgYSBzb3VyY2UKCSAqICBAcGFyYW0ge3N0cmluZ3xpbnR8ZnVuY3Rpb259IG1Tb3VyY2UgVGhlIGRhdGEgc291cmNlIGZvciB0aGUgb2JqZWN0CgkgKiAgQHJldHVybnMge2Z1bmN0aW9ufSBEYXRhIGdldCBmdW5jdGlvbgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCgl2YXIgX2ZuR2V0T2JqZWN0RGF0YUZuID0gRGF0YVRhYmxlLnV0aWwuZ2V0OwoJCgkKCS8qKgoJICogUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQgZGF0YSBmcm9tIGEgc291cmNlIG9iamVjdCwgdGFraW5nCgkgKiBpbnRvIGFjY291bnQgdGhlIGFiaWxpdHkgdG8gdXNlIG5lc3RlZCBvYmplY3RzIGFzIGEgc291cmNlCgkgKiAgQHBhcmFtIHtzdHJpbmd8aW50fGZ1bmN0aW9ufSBtU291cmNlIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIG9iamVjdAoJICogIEByZXR1cm5zIHtmdW5jdGlvbn0gRGF0YSBzZXQgZnVuY3Rpb24KCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJdmFyIF9mblNldE9iamVjdERhdGFGbiA9IERhdGFUYWJsZS51dGlsLnNldDsKCQoJCgkvKioKCSAqIFJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBmdWxsIHRhYmxlIGRhdGEKCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHJldHVybnMgYXJyYXkge2FycmF5fSBhRGF0YSBNYXN0ZXIgZGF0YSBhcnJheQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5HZXREYXRhTWFzdGVyICggc2V0dGluZ3MgKQoJewoJCXJldHVybiBfcGx1Y2soIHNldHRpbmdzLmFvRGF0YSwgJ19hRGF0YScgKTsKCX0KCQoJCgkvKioKCSAqIE51a2UgdGhlIHRhYmxlCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5DbGVhclRhYmxlKCBzZXR0aW5ncyApCgl7CgkJc2V0dGluZ3MuYW9EYXRhLmxlbmd0aCA9IDA7CgkJc2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aCA9IDA7CgkJc2V0dGluZ3MuYWlEaXNwbGF5Lmxlbmd0aCA9IDA7CgkJc2V0dGluZ3MuYUlkcyA9IHt9OwoJfQoJCgkKCSAvKioKCSAqIFRha2UgYW4gYXJyYXkgb2YgaW50ZWdlcnMgKGluZGV4IGFycmF5KSBhbmQgcmVtb3ZlIGEgdGFyZ2V0IGludGVnZXIgKHZhbHVlIC0gbm90CgkgKiB0aGUga2V5ISkKCSAqICBAcGFyYW0ge2FycmF5fSBhIEluZGV4IGFycmF5IHRvIHRhcmdldAoJICogIEBwYXJhbSB7aW50fSBpVGFyZ2V0IHZhbHVlIHRvIGZpbmQKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuRGVsZXRlSW5kZXgoIGEsIGlUYXJnZXQsIHNwbGljZSApCgl7CgkJdmFyIGlUYXJnZXRJbmRleCA9IC0xOwoJCgkJZm9yICggdmFyIGk9MCwgaUxlbj1hLmxlbmd0aCA7IGk8aUxlbiA7IGkrKyApCgkJewoJCQlpZiAoIGFbaV0gPT0gaVRhcmdldCApCgkJCXsKCQkJCWlUYXJnZXRJbmRleCA9IGk7CgkJCX0KCQkJZWxzZSBpZiAoIGFbaV0gPiBpVGFyZ2V0ICkKCQkJewoJCQkJYVtpXS0tOwoJCQl9CgkJfQoJCgkJaWYgKCBpVGFyZ2V0SW5kZXggIT0gLTEgJiYgc3BsaWNlID09PSB1bmRlZmluZWQgKQoJCXsKCQkJYS5zcGxpY2UoIGlUYXJnZXRJbmRleCwgMSApOwoJCX0KCX0KCQoJCgkvKioKCSAqIE1hcmsgY2FjaGVkIGRhdGEgYXMgaW52YWxpZCBzdWNoIHRoYXQgYSByZS1yZWFkIG9mIHRoZSBkYXRhIHdpbGwgb2NjdXIgd2hlbgoJICogdGhlIGNhY2hlZCBkYXRhIGlzIG5leHQgcmVxdWVzdGVkLiBBbHNvIHVwZGF0ZSBmcm9tIHRoZSBkYXRhIHNvdXJjZSBvYmplY3QuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiBAcGFyYW0ge2ludH0gICAgcm93SWR4ICAgUm93IGluZGV4IHRvIGludmFsaWRhdGUKCSAqIEBwYXJhbSB7c3RyaW5nfSBbc3JjXSAgICBTb3VyY2UgdG8gaW52YWxpZGF0ZSBmcm9tOiB1bmRlZmluZWQsICdhdXRvJywgJ2RvbScKCSAqICAgICBvciAnZGF0YScKCSAqIEBwYXJhbSB7aW50fSAgICBbY29sSWR4XSBDb2x1bW4gaW5kZXggdG8gaW52YWxpZGF0ZS4gSWYgdW5kZWZpbmVkIHRoZSB3aG9sZQoJICogICAgIHJvdyB3aWxsIGJlIGludmFsaWRhdGVkCgkgKiBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqCgkgKiBAdG9kbyBGb3IgdGhlIG1vZHVsYXJpc2F0aW9uIG9mIHYxLjExIHRoaXMgd2lsbCBuZWVkIHRvIGJlY29tZSBhIGNhbGxiYWNrLCBzbwoJICogICB0aGUgc29ydCBhbmQgZmlsdGVyIG1ldGhvZHMgY2FuIHN1YnNjcmliZSB0byBpdC4gVGhhdCB3aWxsIHJlcXVpcmVkCgkgKiAgIGluaXRpYWxpc2F0aW9uIG9wdGlvbnMgZm9yIHNvcnRpbmcsIHdoaWNoIGlzIHdoeSBpdCBpcyBub3QgYWxyZWFkeSBiYWtlZCBpbgoJICovCglmdW5jdGlvbiBfZm5JbnZhbGlkYXRlKCBzZXR0aW5ncywgcm93SWR4LCBzcmMsIGNvbElkeCApCgl7CgkJdmFyIHJvdyA9IHNldHRpbmdzLmFvRGF0YVsgcm93SWR4IF07CgkJdmFyIGksIGllbjsKCQl2YXIgY2VsbFdyaXRlID0gZnVuY3Rpb24gKCBjZWxsLCBjb2wgKSB7CgkJCS8vIFRoaXMgaXMgdmVyeSBmcnVzdHJhdGluZywgYnV0IGluIElFIGlmIHlvdSBqdXN0IHdyaXRlIGRpcmVjdGx5CgkJCS8vIHRvIGlubmVySFRNTCwgYW5kIGVsZW1lbnRzIHRoYXQgYXJlIG92ZXJ3cml0dGVuIGFyZSBHQydlZCwKCQkJLy8gZXZlbiBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byB0aGVtIGVsc2V3aGVyZQoJCQl3aGlsZSAoIGNlbGwuY2hpbGROb2Rlcy5sZW5ndGggKSB7CgkJCQljZWxsLnJlbW92ZUNoaWxkKCBjZWxsLmZpcnN0Q2hpbGQgKTsKCQkJfQoJCgkJCWNlbGwuaW5uZXJIVE1MID0gX2ZuR2V0Q2VsbERhdGEoIHNldHRpbmdzLCByb3dJZHgsIGNvbCwgJ2Rpc3BsYXknICk7CgkJfTsKCQoJCS8vIEFyZSB3ZSByZWFkaW5nIGxhc3QgZGF0YSBmcm9tIERPTSBvciB0aGUgZGF0YSBvYmplY3Q/CgkJaWYgKCBzcmMgPT09ICdkb20nIHx8ICgoISBzcmMgfHwgc3JjID09PSAnYXV0bycpICYmIHJvdy5zcmMgPT09ICdkb20nKSApIHsKCQkJLy8gUmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBET00KCQkJcm93Ll9hRGF0YSA9IF9mbkdldFJvd0VsZW1lbnRzKAoJCQkJCXNldHRpbmdzLCByb3csIGNvbElkeCwgY29sSWR4ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByb3cuX2FEYXRhCgkJCQkpCgkJCQkuZGF0YTsKCQl9CgkJZWxzZSB7CgkJCS8vIFJlYWRpbmcgZnJvbSBkYXRhIG9iamVjdCwgdXBkYXRlIHRoZSBET00KCQkJdmFyIGNlbGxzID0gcm93LmFuQ2VsbHM7CgkKCQkJaWYgKCBjZWxscyApIHsKCQkJCWlmICggY29sSWR4ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJY2VsbFdyaXRlKCBjZWxsc1tjb2xJZHhdLCBjb2xJZHggKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWZvciAoIGk9MCwgaWVuPWNlbGxzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCQljZWxsV3JpdGUoIGNlbGxzW2ldLCBpICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCgkJLy8gRm9yIGJvdGggcm93IGFuZCBjZWxsIGludmFsaWRhdGlvbiwgdGhlIGNhY2hlZCBkYXRhIGZvciBzb3J0aW5nIGFuZAoJCS8vIGZpbHRlcmluZyBpcyBudWxsZWQgb3V0CgkJcm93Ll9hU29ydERhdGEgPSBudWxsOwoJCXJvdy5fYUZpbHRlckRhdGEgPSBudWxsOwoJCgkJLy8gSW52YWxpZGF0ZSB0aGUgdHlwZSBmb3IgYSBzcGVjaWZpYyBjb2x1bW4gKGlmIGdpdmVuKSBvciBhbGwgY29sdW1ucyBzaW5jZQoJCS8vIHRoZSBkYXRhIG1pZ2h0IGhhdmUgY2hhbmdlZAoJCXZhciBjb2xzID0gc2V0dGluZ3MuYW9Db2x1bW5zOwoJCWlmICggY29sSWR4ICE9PSB1bmRlZmluZWQgKSB7CgkJCWNvbHNbIGNvbElkeCBdLnNUeXBlID0gbnVsbDsKCQl9CgkJZWxzZSB7CgkJCWZvciAoIGk9MCwgaWVuPWNvbHMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQljb2xzW2ldLnNUeXBlID0gbnVsbDsKCQkJfQoJCgkJCS8vIFVwZGF0ZSBEYXRhVGFibGVzIHNwZWNpYWwgYERUXypgIGF0dHJpYnV0ZXMgZm9yIHRoZSByb3cKCQkJX2ZuUm93QXR0cmlidXRlcyggc2V0dGluZ3MsIHJvdyApOwoJCX0KCX0KCQoJCgkvKioKCSAqIEJ1aWxkIGEgZGF0YSBzb3VyY2Ugb2JqZWN0IGZyb20gYW4gSFRNTCByb3csIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQoJICogY2VsbHMgdGhhdCBhcmUgaW4gdGhlIHJvdy4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqIEBwYXJhbSB7bm9kZXxvYmplY3R9IFRSIGVsZW1lbnQgZnJvbSB3aGljaCB0byByZWFkIGRhdGEgb3IgZXhpc3Rpbmcgcm93CgkgKiAgIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJlLXJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgY2VsbHMKCSAqIEBwYXJhbSB7aW50fSBbY29sSWR4XSBPcHRpb25hbCBjb2x1bW4gaW5kZXgKCSAqIEBwYXJhbSB7YXJyYXl8b2JqZWN0fSBbZF0gRGF0YSBzb3VyY2Ugb2JqZWN0LiBJZiBgY29sSWR4YCBpcyBnaXZlbiB0aGVuIHRoaXMKCSAqICAgcGFyYW1ldGVyIHNob3VsZCBhbHNvIGJlIGdpdmVuIGFuZCB3aWxsIGJlIHVzZWQgdG8gd3JpdGUgdGhlIGRhdGEgaW50by4KCSAqICAgT25seSB0aGUgY29sdW1uIGluIHF1ZXN0aW9uIHdpbGwgYmUgd3JpdHRlbgoJICogQHJldHVybnMge29iamVjdH0gT2JqZWN0IHdpdGggdHdvIHBhcmFtZXRlcnM6IGBkYXRhYCB0aGUgZGF0YSByZWFkLCBpbgoJICogICBkb2N1bWVudCBvcmRlciwgYW5kIGBjZWxsc2AgYW5kIGFycmF5IG9mIG5vZGVzICh0aGV5IGNhbiBiZSB1c2VmdWwgdG8gdGhlCgkgKiAgIGNhbGxlciwgc28gcmF0aGVyIHRoYW4gbmVlZGluZyBhIHNlY29uZCB0cmF2ZXJzYWwgdG8gZ2V0IHRoZW0sIGp1c3QgcmV0dXJuCgkgKiAgIHRoZW0gZnJvbSBoZXJlKS4KCSAqIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5HZXRSb3dFbGVtZW50cyggc2V0dGluZ3MsIHJvdywgY29sSWR4LCBkICkKCXsKCQl2YXIKCQkJdGRzID0gW10sCgkJCXRkID0gcm93LmZpcnN0Q2hpbGQsCgkJCW5hbWUsIGNvbCwgbywgaT0wLCBjb250ZW50cywKCQkJY29sdW1ucyA9IHNldHRpbmdzLmFvQ29sdW1ucywKCQkJb2JqZWN0UmVhZCA9IHNldHRpbmdzLl9yb3dSZWFkT2JqZWN0OwoJCgkJLy8gQWxsb3cgdGhlIGRhdGEgb2JqZWN0IHRvIGJlIHBhc3NlZCBpbiwgb3IgY29uc3RydWN0CgkJZCA9IGQgIT09IHVuZGVmaW5lZCA/CgkJCWQgOgoJCQlvYmplY3RSZWFkID8KCQkJCXt9IDoKCQkJCVtdOwoJCgkJdmFyIGF0dHIgPSBmdW5jdGlvbiAoIHN0ciwgdGQgICkgewoJCQlpZiAoIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICkgewoJCQkJdmFyIGlkeCA9IHN0ci5pbmRleE9mKCdAJyk7CgkKCQkJCWlmICggaWR4ICE9PSAtMSApIHsKCQkJCQl2YXIgYXR0ciA9IHN0ci5zdWJzdHJpbmcoIGlkeCsxICk7CgkJCQkJdmFyIHNldHRlciA9IF9mblNldE9iamVjdERhdGFGbiggc3RyICk7CgkJCQkJc2V0dGVyKCBkLCB0ZC5nZXRBdHRyaWJ1dGUoIGF0dHIgKSApOwoJCQkJfQoJCQl9CgkJfTsKCQoJCS8vIFJlYWQgZGF0YSBmcm9tIGEgY2VsbCBhbmQgc3RvcmUgaW50byB0aGUgZGF0YSBvYmplY3QKCQl2YXIgY2VsbFByb2Nlc3MgPSBmdW5jdGlvbiAoIGNlbGwgKSB7CgkJCWlmICggY29sSWR4ID09PSB1bmRlZmluZWQgfHwgY29sSWR4ID09PSBpICkgewoJCQkJY29sID0gY29sdW1uc1tpXTsKCQkJCWNvbnRlbnRzID0gKGNlbGwuaW5uZXJIVE1MKS50cmltKCk7CgkKCQkJCWlmICggY29sICYmIGNvbC5fYkF0dHJTcmMgKSB7CgkJCQkJdmFyIHNldHRlciA9IF9mblNldE9iamVjdERhdGFGbiggY29sLm1EYXRhLl8gKTsKCQkJCQlzZXR0ZXIoIGQsIGNvbnRlbnRzICk7CgkKCQkJCQlhdHRyKCBjb2wubURhdGEuc29ydCwgY2VsbCApOwoJCQkJCWF0dHIoIGNvbC5tRGF0YS50eXBlLCBjZWxsICk7CgkJCQkJYXR0ciggY29sLm1EYXRhLmZpbHRlciwgY2VsbCApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJLy8gRGVwZW5kaW5nIG9uIHRoZSBgZGF0YWAgb3B0aW9uIGZvciB0aGUgY29sdW1ucyB0aGUgZGF0YSBjYW4KCQkJCQkvLyBiZSByZWFkIHRvIGVpdGhlciBhbiBvYmplY3Qgb3IgYW4gYXJyYXkuCgkJCQkJaWYgKCBvYmplY3RSZWFkICkgewoJCQkJCQlpZiAoICEgY29sLl9zZXR0ZXIgKSB7CgkJCQkJCQkvLyBDYWNoZSB0aGUgc2V0dGVyIGZ1bmN0aW9uCgkJCQkJCQljb2wuX3NldHRlciA9IF9mblNldE9iamVjdERhdGFGbiggY29sLm1EYXRhICk7CgkJCQkJCX0KCQkJCQkJY29sLl9zZXR0ZXIoIGQsIGNvbnRlbnRzICk7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlkW2ldID0gY29udGVudHM7CgkJCQkJfQoJCQkJfQoJCQl9CgkKCQkJaSsrOwoJCX07CgkKCQlpZiAoIHRkICkgewoJCQkvLyBgdHJgIGVsZW1lbnQgd2FzIHBhc3NlZCBpbgoJCQl3aGlsZSAoIHRkICkgewoJCQkJbmFtZSA9IHRkLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7CgkKCQkJCWlmICggbmFtZSA9PSAiVEQiIHx8IG5hbWUgPT0gIlRIIiApIHsKCQkJCQljZWxsUHJvY2VzcyggdGQgKTsKCQkJCQl0ZHMucHVzaCggdGQgKTsKCQkJCX0KCQoJCQkJdGQgPSB0ZC5uZXh0U2libGluZzsKCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gRXhpc3Rpbmcgcm93IG9iamVjdCBwYXNzZWQgaW4KCQkJdGRzID0gcm93LmFuQ2VsbHM7CgkKCQkJZm9yICggdmFyIGo9MCwgamVuPXRkcy5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCWNlbGxQcm9jZXNzKCB0ZHNbal0gKTsKCQkJfQoJCX0KCQoJCS8vIFJlYWQgdGhlIElEIGZyb20gdGhlIERPTSBpZiBwcmVzZW50CgkJdmFyIHJvd05vZGUgPSByb3cuZmlyc3RDaGlsZCA/IHJvdyA6IHJvdy5uVHI7CgkKCQlpZiAoIHJvd05vZGUgKSB7CgkJCXZhciBpZCA9IHJvd05vZGUuZ2V0QXR0cmlidXRlKCAnaWQnICk7CgkKCQkJaWYgKCBpZCApIHsKCQkJCV9mblNldE9iamVjdERhdGFGbiggc2V0dGluZ3Mucm93SWQgKSggZCwgaWQgKTsKCQkJfQoJCX0KCQoJCXJldHVybiB7CgkJCWRhdGE6IGQsCgkJCWNlbGxzOiB0ZHMKCQl9OwoJfQoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgVFIgZWxlbWVudCAoYW5kIGl0J3MgVEQgY2hpbGRyZW4pIGZvciBhIHJvdwoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge2ludH0gaVJvdyBSb3cgdG8gY29uc2lkZXIKCSAqICBAcGFyYW0ge25vZGV9IFtuVHJJbl0gVFIgZWxlbWVudCB0byBhZGQgdG8gdGhlIHRhYmxlIC0gb3B0aW9uYWwuIElmIG5vdCBnaXZlbiwKCSAqICAgIERhdGFUYWJsZXMgd2lsbCBjcmVhdGUgYSByb3cgYXV0b21hdGljYWxseQoJICogIEBwYXJhbSB7YXJyYXl9IFthblRkc10gQXJyYXkgb2YgVER8VEggZWxlbWVudHMgZm9yIHRoZSByb3cgLSBtdXN0IGJlIGdpdmVuCgkgKiAgICBpZiBuVHIgaXMuCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkNyZWF0ZVRyICggb1NldHRpbmdzLCBpUm93LCBuVHJJbiwgYW5UZHMgKQoJewoJCXZhcgoJCQlyb3cgPSBvU2V0dGluZ3MuYW9EYXRhW2lSb3ddLAoJCQlyb3dEYXRhID0gcm93Ll9hRGF0YSwKCQkJY2VsbHMgPSBbXSwKCQkJblRyLCBuVGQsIG9Db2wsCgkJCWksIGlMZW4sIGNyZWF0ZTsKCQoJCWlmICggcm93Lm5UciA9PT0gbnVsbCApCgkJewoJCQluVHIgPSBuVHJJbiB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCgkJCXJvdy5uVHIgPSBuVHI7CgkJCXJvdy5hbkNlbGxzID0gY2VsbHM7CgkKCQkJLyogVXNlIGEgcHJpdmF0ZSBwcm9wZXJ0eSBvbiB0aGUgbm9kZSB0byBhbGxvdyByZXNlcnZlIG1hcHBpbmcgZnJvbSB0aGUgbm9kZQoJCQkgKiB0byB0aGUgYW9EYXRhIGFycmF5IGZvciBmYXN0IGxvb2sgdXAKCQkJICovCgkJCW5Uci5fRFRfUm93SW5kZXggPSBpUm93OwoJCgkJCS8qIFNwZWNpYWwgcGFyYW1ldGVycyBjYW4gYmUgZ2l2ZW4gYnkgdGhlIGRhdGEgc291cmNlIHRvIGJlIHVzZWQgb24gdGhlIHJvdyAqLwoJCQlfZm5Sb3dBdHRyaWJ1dGVzKCBvU2V0dGluZ3MsIHJvdyApOwoJCgkJCS8qIFByb2Nlc3MgZWFjaCBjb2x1bW4gKi8KCQkJZm9yICggaT0wLCBpTGVuPW9TZXR0aW5ncy5hb0NvbHVtbnMubGVuZ3RoIDsgaTxpTGVuIDsgaSsrICkKCQkJewoJCQkJb0NvbCA9IG9TZXR0aW5ncy5hb0NvbHVtbnNbaV07CgkJCQljcmVhdGUgPSBuVHJJbiA/IGZhbHNlIDogdHJ1ZTsKCQoJCQkJblRkID0gY3JlYXRlID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggb0NvbC5zQ2VsbFR5cGUgKSA6IGFuVGRzW2ldOwoJCQkJblRkLl9EVF9DZWxsSW5kZXggPSB7CgkJCQkJcm93OiBpUm93LAoJCQkJCWNvbHVtbjogaQoJCQkJfTsKCQkJCQoJCQkJY2VsbHMucHVzaCggblRkICk7CgkKCQkJCS8vIE5lZWQgdG8gY3JlYXRlIHRoZSBIVE1MIGlmIG5ldywgb3IgaWYgYSByZW5kZXJpbmcgZnVuY3Rpb24gaXMgZGVmaW5lZAoJCQkJaWYgKCBjcmVhdGUgfHwgKChvQ29sLm1SZW5kZXIgfHwgb0NvbC5tRGF0YSAhPT0gaSkgJiYKCQkJCQkgKCEkLmlzUGxhaW5PYmplY3Qob0NvbC5tRGF0YSkgfHwgb0NvbC5tRGF0YS5fICE9PSBpKycuZGlzcGxheScpCgkJCQkpKSB7CgkJCQkJblRkLmlubmVySFRNTCA9IF9mbkdldENlbGxEYXRhKCBvU2V0dGluZ3MsIGlSb3csIGksICdkaXNwbGF5JyApOwoJCQkJfQoJCgkJCQkvKiBBZGQgdXNlciBkZWZpbmVkIGNsYXNzICovCgkJCQlpZiAoIG9Db2wuc0NsYXNzICkKCQkJCXsKCQkJCQluVGQuY2xhc3NOYW1lICs9ICcgJytvQ29sLnNDbGFzczsKCQkJCX0KCQoJCQkJLy8gVmlzaWJpbGl0eSAtIGFkZCBvciByZW1vdmUgYXMgcmVxdWlyZWQKCQkJCWlmICggb0NvbC5iVmlzaWJsZSAmJiAhIG5UckluICkKCQkJCXsKCQkJCQluVHIuYXBwZW5kQ2hpbGQoIG5UZCApOwoJCQkJfQoJCQkJZWxzZSBpZiAoICEgb0NvbC5iVmlzaWJsZSAmJiBuVHJJbiApCgkJCQl7CgkJCQkJblRkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5UZCApOwoJCQkJfQoJCgkJCQlpZiAoIG9Db2wuZm5DcmVhdGVkQ2VsbCApCgkJCQl7CgkJCQkJb0NvbC5mbkNyZWF0ZWRDZWxsLmNhbGwoIG9TZXR0aW5ncy5vSW5zdGFuY2UsCgkJCQkJCW5UZCwgX2ZuR2V0Q2VsbERhdGEoIG9TZXR0aW5ncywgaVJvdywgaSApLCByb3dEYXRhLCBpUm93LCBpCgkJCQkJKTsKCQkJCX0KCQkJfQoJCgkJCV9mbkNhbGxiYWNrRmlyZSggb1NldHRpbmdzLCAnYW9Sb3dDcmVhdGVkQ2FsbGJhY2snLCBudWxsLCBbblRyLCByb3dEYXRhLCBpUm93LCBjZWxsc10gKTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBBZGQgYXR0cmlidXRlcyB0byBhIHJvdyBiYXNlZCBvbiB0aGUgc3BlY2lhbCBgRFRfKmAgcGFyYW1ldGVycyBpbiBhIGRhdGEKCSAqIHNvdXJjZSBvYmplY3QuCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtvYmplY3R9IERhdGFUYWJsZXMgcm93IG9iamVjdCBmb3IgdGhlIHJvdyB0byBiZSBtb2RpZmllZAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5Sb3dBdHRyaWJ1dGVzKCBzZXR0aW5ncywgcm93ICkKCXsKCQl2YXIgdHIgPSByb3cublRyOwoJCXZhciBkYXRhID0gcm93Ll9hRGF0YTsKCQoJCWlmICggdHIgKSB7CgkJCXZhciBpZCA9IHNldHRpbmdzLnJvd0lkRm4oIGRhdGEgKTsKCQoJCQlpZiAoIGlkICkgewoJCQkJdHIuaWQgPSBpZDsKCQkJfQoJCgkJCWlmICggZGF0YS5EVF9Sb3dDbGFzcyApIHsKCQkJCS8vIFJlbW92ZSBhbnkgY2xhc3NlcyBhZGRlZCBieSBEVF9Sb3dDbGFzcyBiZWZvcmUKCQkJCXZhciBhID0gZGF0YS5EVF9Sb3dDbGFzcy5zcGxpdCgnICcpOwoJCQkJcm93Ll9fcm93YyA9IHJvdy5fX3Jvd2MgPwoJCQkJCV91bmlxdWUoIHJvdy5fX3Jvd2MuY29uY2F0KCBhICkgKSA6CgkJCQkJYTsKCQoJCQkJJCh0cikKCQkJCQkucmVtb3ZlQ2xhc3MoIHJvdy5fX3Jvd2Muam9pbignICcpICkKCQkJCQkuYWRkQ2xhc3MoIGRhdGEuRFRfUm93Q2xhc3MgKTsKCQkJfQoJCgkJCWlmICggZGF0YS5EVF9Sb3dBdHRyICkgewoJCQkJJCh0cikuYXR0ciggZGF0YS5EVF9Sb3dBdHRyICk7CgkJCX0KCQoJCQlpZiAoIGRhdGEuRFRfUm93RGF0YSApIHsKCQkJCSQodHIpLmRhdGEoIGRhdGEuRFRfUm93RGF0YSApOwoJCQl9CgkJfQoJfQoJCgkKCS8qKgoJICogQ3JlYXRlIHRoZSBIVE1MIGhlYWRlciBmb3IgdGhlIHRhYmxlCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5CdWlsZEhlYWQoIG9TZXR0aW5ncyApCgl7CgkJdmFyIGksIGllbiwgY2VsbCwgcm93LCBjb2x1bW47CgkJdmFyIHRoZWFkID0gb1NldHRpbmdzLm5USGVhZDsKCQl2YXIgdGZvb3QgPSBvU2V0dGluZ3MublRGb290OwoJCXZhciBjcmVhdGVIZWFkZXIgPSAkKCd0aCwgdGQnLCB0aGVhZCkubGVuZ3RoID09PSAwOwoJCXZhciBjbGFzc2VzID0gb1NldHRpbmdzLm9DbGFzc2VzOwoJCXZhciBjb2x1bW5zID0gb1NldHRpbmdzLmFvQ29sdW1uczsKCQoJCWlmICggY3JlYXRlSGVhZGVyICkgewoJCQlyb3cgPSAkKCc8dHIvPicpLmFwcGVuZFRvKCB0aGVhZCApOwoJCX0KCQoJCWZvciAoIGk9MCwgaWVuPWNvbHVtbnMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCWNvbHVtbiA9IGNvbHVtbnNbaV07CgkJCWNlbGwgPSAkKCBjb2x1bW4ublRoICkuYWRkQ2xhc3MoIGNvbHVtbi5zQ2xhc3MgKTsKCQoJCQlpZiAoIGNyZWF0ZUhlYWRlciApIHsKCQkJCWNlbGwuYXBwZW5kVG8oIHJvdyApOwoJCQl9CgkKCQkJLy8gMS4xMSBtb3ZlIGludG8gc29ydGluZwoJCQlpZiAoIG9TZXR0aW5ncy5vRmVhdHVyZXMuYlNvcnQgKSB7CgkJCQljZWxsLmFkZENsYXNzKCBjb2x1bW4uc1NvcnRpbmdDbGFzcyApOwoJCgkJCQlpZiAoIGNvbHVtbi5iU29ydGFibGUgIT09IGZhbHNlICkgewoJCQkJCWNlbGwKCQkJCQkJLmF0dHIoICd0YWJpbmRleCcsIG9TZXR0aW5ncy5pVGFiSW5kZXggKQoJCQkJCQkuYXR0ciggJ2FyaWEtY29udHJvbHMnLCBvU2V0dGluZ3Muc1RhYmxlSWQgKTsKCQoJCQkJCV9mblNvcnRBdHRhY2hMaXN0ZW5lciggb1NldHRpbmdzLCBjb2x1bW4ublRoLCBpICk7CgkJCQl9CgkJCX0KCQoJCQlpZiAoIGNvbHVtbi5zVGl0bGUgIT0gY2VsbFswXS5pbm5lckhUTUwgKSB7CgkJCQljZWxsLmh0bWwoIGNvbHVtbi5zVGl0bGUgKTsKCQkJfQoJCgkJCV9mblJlbmRlcmVyKCBvU2V0dGluZ3MsICdoZWFkZXInICkoCgkJCQlvU2V0dGluZ3MsIGNlbGwsIGNvbHVtbiwgY2xhc3NlcwoJCQkpOwoJCX0KCQoJCWlmICggY3JlYXRlSGVhZGVyICkgewoJCQlfZm5EZXRlY3RIZWFkZXIoIG9TZXR0aW5ncy5hb0hlYWRlciwgdGhlYWQgKTsKCQl9CgkKCQkvKiBEZWFsIHdpdGggdGhlIGZvb3RlciAtIGFkZCBjbGFzc2VzIGlmIHJlcXVpcmVkICovCgkJJCh0aGVhZCkuY2hpbGRyZW4oJ3RyJykuY2hpbGRyZW4oJ3RoLCB0ZCcpLmFkZENsYXNzKCBjbGFzc2VzLnNIZWFkZXJUSCApOwoJCSQodGZvb3QpLmNoaWxkcmVuKCd0cicpLmNoaWxkcmVuKCd0aCwgdGQnKS5hZGRDbGFzcyggY2xhc3Nlcy5zRm9vdGVyVEggKTsKCQoJCS8vIENhY2hlIHRoZSBmb290ZXIgY2VsbHMuIE5vdGUgdGhhdCB3ZSBvbmx5IHRha2UgdGhlIGNlbGxzIGZyb20gdGhlIGZpcnN0CgkJLy8gcm93IGluIHRoZSBmb290ZXIuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcm93IHRoZSB1c2VyIHdhbnRzIHRvCgkJLy8gaW50ZXJhY3Qgd2l0aCwgdGhleSBuZWVkIHRvIHVzZSB0aGUgdGFibGUoKS5mb290KCkgbWV0aG9kLiBOb3RlIGFsc28gdGhpcwoJCS8vIGFsbG93cyBjZWxscyB0byBiZSB1c2VkIGZvciBtdWx0aXBsZSBjb2x1bW5zIHVzaW5nIGNvbHNwYW4KCQlpZiAoIHRmb290ICE9PSBudWxsICkgewoJCQl2YXIgY2VsbHMgPSBvU2V0dGluZ3MuYW9Gb290ZXJbMF07CgkKCQkJZm9yICggaT0wLCBpZW49Y2VsbHMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQljb2x1bW4gPSBjb2x1bW5zW2ldOwoJCQkJY29sdW1uLm5UZiA9IGNlbGxzW2ldLmNlbGw7CgkKCQkJCWlmICggY29sdW1uLnNDbGFzcyApIHsKCQkJCQkkKGNvbHVtbi5uVGYpLmFkZENsYXNzKCBjb2x1bW4uc0NsYXNzICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgkKCQoJLyoqCgkgKiBEcmF3IHRoZSBoZWFkZXIgKG9yIGZvb3RlcikgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29sdW1uIHZpc2liaWxpdHkgc3RhdGVzLiBUaGUKCSAqIG1ldGhvZG9sb2d5IGhlcmUgaXMgdG8gdXNlIHRoZSBsYXlvdXQgYXJyYXkgZnJvbSBfZm5EZXRlY3RIZWFkZXIsIG1vZGlmaWVkIGZvcgoJICogdGhlIGluc3RhbnRhbmVvdXMgY29sdW1uIHZpc2liaWxpdHksIHRvIGNvbnN0cnVjdCB0aGUgbmV3IGxheW91dC4gVGhlIGdyaWQgaXMKCSAqIHRyYXZlcnNlZCBvdmVyIGNlbGwgYXQgYSB0aW1lIGluIGEgcm93cyB4IGNvbHVtbnMgZ3JpZCBmYXNoaW9uLCBhbHRob3VnaCBlYWNoCgkgKiBjZWxsIGluc2VydCBjYW4gY292ZXIgbXVsdGlwbGUgZWxlbWVudHMgaW4gdGhlIGdyaWQgLSB3aGljaCBpcyB0cmFja3MgdXNpbmcgdGhlCgkgKiBhQXBwbGllZCBhcnJheS4gQ2VsbCBpbnNlcnRzIGluIHRoZSBncmlkIHdpbGwgb25seSBvY2N1ciB3aGVyZSB0aGVyZSBpc24ndAoJICogYWxyZWFkeSBhIGNlbGwgaW4gdGhhdCBwb3NpdGlvbi4KCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIGFycmF5IHtvYmplY3RzfSBhb1NvdXJjZSBMYXlvdXQgYXJyYXkgZnJvbSBfZm5EZXRlY3RIZWFkZXIKCSAqICBAcGFyYW0ge2Jvb2xlYW59IFtiSW5jbHVkZUhpZGRlbj1mYWxzZV0gSWYgdHJ1ZSB0aGVuIGluY2x1ZGUgdGhlIGhpZGRlbiBjb2x1bW5zIGluIHRoZSBjYWxjLAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5EcmF3SGVhZCggb1NldHRpbmdzLCBhb1NvdXJjZSwgYkluY2x1ZGVIaWRkZW4gKQoJewoJCXZhciBpLCBpTGVuLCBqLCBqTGVuLCBrLCBrTGVuLCBuLCBuTG9jYWxUcjsKCQl2YXIgYW9Mb2NhbCA9IFtdOwoJCXZhciBhQXBwbGllZCA9IFtdOwoJCXZhciBpQ29sdW1ucyA9IG9TZXR0aW5ncy5hb0NvbHVtbnMubGVuZ3RoOwoJCXZhciBpUm93c3BhbiwgaUNvbHNwYW47CgkKCQlpZiAoICEgYW9Tb3VyY2UgKQoJCXsKCQkJcmV0dXJuOwoJCX0KCQoJCWlmICggIGJJbmNsdWRlSGlkZGVuID09PSB1bmRlZmluZWQgKQoJCXsKCQkJYkluY2x1ZGVIaWRkZW4gPSBmYWxzZTsKCQl9CgkKCQkvKiBNYWtlIGEgY29weSBvZiB0aGUgbWFzdGVyIGxheW91dCBhcnJheSwgYnV0IHdpdGhvdXQgdGhlIHZpc2libGUgY29sdW1ucyBpbiBpdCAqLwoJCWZvciAoIGk9MCwgaUxlbj1hb1NvdXJjZS5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCXsKCQkJYW9Mb2NhbFtpXSA9IGFvU291cmNlW2ldLnNsaWNlKCk7CgkJCWFvTG9jYWxbaV0ublRyID0gYW9Tb3VyY2VbaV0ublRyOwoJCgkJCS8qIFJlbW92ZSBhbnkgY29sdW1ucyB3aGljaCBhcmUgY3VycmVudGx5IGhpZGRlbiAqLwoJCQlmb3IgKCBqPWlDb2x1bW5zLTEgOyBqPj0wIDsgai0tICkKCQkJewoJCQkJaWYgKCAhb1NldHRpbmdzLmFvQ29sdW1uc1tqXS5iVmlzaWJsZSAmJiAhYkluY2x1ZGVIaWRkZW4gKQoJCQkJewoJCQkJCWFvTG9jYWxbaV0uc3BsaWNlKCBqLCAxICk7CgkJCQl9CgkJCX0KCQoJCQkvKiBQcmVwIHRoZSBhcHBsaWVkIGFycmF5IC0gaXQgbmVlZHMgYW4gZWxlbWVudCBmb3IgZWFjaCByb3cgKi8KCQkJYUFwcGxpZWQucHVzaCggW10gKTsKCQl9CgkKCQlmb3IgKCBpPTAsIGlMZW49YW9Mb2NhbC5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCXsKCQkJbkxvY2FsVHIgPSBhb0xvY2FsW2ldLm5UcjsKCQoJCQkvKiBBbGwgY2VsbHMgYXJlIGdvaW5nIHRvIGJlIHJlcGxhY2VkLCBzbyBlbXB0eSBvdXQgdGhlIHJvdyAqLwoJCQlpZiAoIG5Mb2NhbFRyICkKCQkJewoJCQkJd2hpbGUoIChuID0gbkxvY2FsVHIuZmlyc3RDaGlsZCkgKQoJCQkJewoJCQkJCW5Mb2NhbFRyLnJlbW92ZUNoaWxkKCBuICk7CgkJCQl9CgkJCX0KCQoJCQlmb3IgKCBqPTAsIGpMZW49YW9Mb2NhbFtpXS5sZW5ndGggOyBqPGpMZW4gOyBqKysgKQoJCQl7CgkJCQlpUm93c3BhbiA9IDE7CgkJCQlpQ29sc3BhbiA9IDE7CgkKCQkJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgY2VsbCAocm93L2NvbHNwYW4pIGNvdmVyaW5nIG91ciB0YXJnZXQKCQkJCSAqIGluc2VydCBwb2ludC4gSWYgdGhlcmUgaXMsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4KCQkJCSAqLwoJCQkJaWYgKCBhQXBwbGllZFtpXVtqXSA9PT0gdW5kZWZpbmVkICkKCQkJCXsKCQkJCQluTG9jYWxUci5hcHBlbmRDaGlsZCggYW9Mb2NhbFtpXVtqXS5jZWxsICk7CgkJCQkJYUFwcGxpZWRbaV1bal0gPSAxOwoJCgkJCQkJLyogRXhwYW5kIHRoZSBjZWxsIHRvIGNvdmVyIGFzIG1hbnkgcm93cyBhcyBuZWVkZWQgKi8KCQkJCQl3aGlsZSAoIGFvTG9jYWxbaStpUm93c3Bhbl0gIT09IHVuZGVmaW5lZCAmJgoJCQkJCSAgICAgICAgYW9Mb2NhbFtpXVtqXS5jZWxsID09IGFvTG9jYWxbaStpUm93c3Bhbl1bal0uY2VsbCApCgkJCQkJewoJCQkJCQlhQXBwbGllZFtpK2lSb3dzcGFuXVtqXSA9IDE7CgkJCQkJCWlSb3dzcGFuKys7CgkJCQkJfQoJCgkJCQkJLyogRXhwYW5kIHRoZSBjZWxsIHRvIGNvdmVyIGFzIG1hbnkgY29sdW1ucyBhcyBuZWVkZWQgKi8KCQkJCQl3aGlsZSAoIGFvTG9jYWxbaV1baitpQ29sc3Bhbl0gIT09IHVuZGVmaW5lZCAmJgoJCQkJCSAgICAgICAgYW9Mb2NhbFtpXVtqXS5jZWxsID09IGFvTG9jYWxbaV1baitpQ29sc3Bhbl0uY2VsbCApCgkJCQkJewoJCQkJCQkvKiBNdXN0IHVwZGF0ZSB0aGUgYXBwbGllZCBhcnJheSBvdmVyIHRoZSByb3dzIGZvciB0aGUgY29sdW1ucyAqLwoJCQkJCQlmb3IgKCBrPTAgOyBrPGlSb3dzcGFuIDsgaysrICkKCQkJCQkJewoJCQkJCQkJYUFwcGxpZWRbaStrXVtqK2lDb2xzcGFuXSA9IDE7CgkJCQkJCX0KCQkJCQkJaUNvbHNwYW4rKzsKCQkJCQl9CgkKCQkJCQkvKiBEbyB0aGUgYWN0dWFsIGV4cGFuc2lvbiBpbiB0aGUgRE9NICovCgkJCQkJJChhb0xvY2FsW2ldW2pdLmNlbGwpCgkJCQkJCS5hdHRyKCdyb3dzcGFuJywgaVJvd3NwYW4pCgkJCQkJCS5hdHRyKCdjb2xzcGFuJywgaUNvbHNwYW4pOwoJCQkJfQoJCQl9CgkJfQoJfQoJCgkKCS8qKgoJICogSW5zZXJ0IHRoZSByZXF1aXJlZCBUUiBub2RlcyBpbnRvIHRoZSB0YWJsZSBmb3IgZGlzcGxheQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0gYWpheENvbXBsZXRlIHRydWUgYWZ0ZXIgYWpheCBjYWxsIHRvIGNvbXBsZXRlIHJlbmRlcmluZwoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5EcmF3KCBvU2V0dGluZ3MsIGFqYXhDb21wbGV0ZSApCgl7CgkJLy8gQWxsb3cgZm9yIHN0YXRlIHNhdmluZyBhbmQgYSBjdXN0b20gc3RhcnQgcG9zaXRpb24KCQlfZm5TdGFydCggb1NldHRpbmdzICk7CgkKCQkvKiBQcm92aWRlIGEgcHJlLWNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNhbmNlbCB0aGUgZHJhdyBpcyBmYWxzZSBpcyByZXR1cm5lZCAqLwoJCXZhciBhUHJlRHJhdyA9IF9mbkNhbGxiYWNrRmlyZSggb1NldHRpbmdzLCAnYW9QcmVEcmF3Q2FsbGJhY2snLCAncHJlRHJhdycsIFtvU2V0dGluZ3NdICk7CgkJaWYgKCAkLmluQXJyYXkoIGZhbHNlLCBhUHJlRHJhdyApICE9PSAtMSApCgkJewoJCQlfZm5Qcm9jZXNzaW5nRGlzcGxheSggb1NldHRpbmdzLCBmYWxzZSApOwoJCQlyZXR1cm47CgkJfQoJCgkJdmFyIGFuUm93cyA9IFtdOwoJCXZhciBpUm93Q291bnQgPSAwOwoJCXZhciBhc1N0cmlwZUNsYXNzZXMgPSBvU2V0dGluZ3MuYXNTdHJpcGVDbGFzc2VzOwoJCXZhciBpU3RyaXBlcyA9IGFzU3RyaXBlQ2xhc3Nlcy5sZW5ndGg7CgkJdmFyIG9MYW5nID0gb1NldHRpbmdzLm9MYW5ndWFnZTsKCQl2YXIgYlNlcnZlclNpZGUgPSBfZm5EYXRhU291cmNlKCBvU2V0dGluZ3MgKSA9PSAnc3NwJzsKCQl2YXIgYWlEaXNwbGF5ID0gb1NldHRpbmdzLmFpRGlzcGxheTsKCQl2YXIgaURpc3BsYXlTdGFydCA9IG9TZXR0aW5ncy5faURpc3BsYXlTdGFydDsKCQl2YXIgaURpc3BsYXlFbmQgPSBvU2V0dGluZ3MuZm5EaXNwbGF5RW5kKCk7CgkKCQlvU2V0dGluZ3MuYkRyYXdpbmcgPSB0cnVlOwoJCgkJLyogU2VydmVyLXNpZGUgcHJvY2Vzc2luZyBkcmF3IGludGVyY2VwdCAqLwoJCWlmICggb1NldHRpbmdzLmJEZWZlckxvYWRpbmcgKQoJCXsKCQkJb1NldHRpbmdzLmJEZWZlckxvYWRpbmcgPSBmYWxzZTsKCQkJb1NldHRpbmdzLmlEcmF3Kys7CgkJCV9mblByb2Nlc3NpbmdEaXNwbGF5KCBvU2V0dGluZ3MsIGZhbHNlICk7CgkJfQoJCWVsc2UgaWYgKCAhYlNlcnZlclNpZGUgKQoJCXsKCQkJb1NldHRpbmdzLmlEcmF3Kys7CgkJfQoJCWVsc2UgaWYgKCAhb1NldHRpbmdzLmJEZXN0cm95aW5nICYmICFhamF4Q29tcGxldGUpCgkJewoJCQlfZm5BamF4VXBkYXRlKCBvU2V0dGluZ3MgKTsKCQkJcmV0dXJuOwoJCX0KCQoJCWlmICggYWlEaXNwbGF5Lmxlbmd0aCAhPT0gMCApCgkJewoJCQl2YXIgaVN0YXJ0ID0gYlNlcnZlclNpZGUgPyAwIDogaURpc3BsYXlTdGFydDsKCQkJdmFyIGlFbmQgPSBiU2VydmVyU2lkZSA/IG9TZXR0aW5ncy5hb0RhdGEubGVuZ3RoIDogaURpc3BsYXlFbmQ7CgkKCQkJZm9yICggdmFyIGo9aVN0YXJ0IDsgajxpRW5kIDsgaisrICkKCQkJewoJCQkJdmFyIGlEYXRhSW5kZXggPSBhaURpc3BsYXlbal07CgkJCQl2YXIgYW9EYXRhID0gb1NldHRpbmdzLmFvRGF0YVsgaURhdGFJbmRleCBdOwoJCQkJaWYgKCBhb0RhdGEublRyID09PSBudWxsICkKCQkJCXsKCQkJCQlfZm5DcmVhdGVUciggb1NldHRpbmdzLCBpRGF0YUluZGV4ICk7CgkJCQl9CgkKCQkJCXZhciBuUm93ID0gYW9EYXRhLm5UcjsKCQoJCQkJLyogUmVtb3ZlIHRoZSBvbGQgc3RyaXBpbmcgY2xhc3NlcyBhbmQgdGhlbiBhZGQgdGhlIG5ldyBvbmUgKi8KCQkJCWlmICggaVN0cmlwZXMgIT09IDAgKQoJCQkJewoJCQkJCXZhciBzU3RyaXBlID0gYXNTdHJpcGVDbGFzc2VzWyBpUm93Q291bnQgJSBpU3RyaXBlcyBdOwoJCQkJCWlmICggYW9EYXRhLl9zUm93U3RyaXBlICE9IHNTdHJpcGUgKQoJCQkJCXsKCQkJCQkJJChuUm93KS5yZW1vdmVDbGFzcyggYW9EYXRhLl9zUm93U3RyaXBlICkuYWRkQ2xhc3MoIHNTdHJpcGUgKTsKCQkJCQkJYW9EYXRhLl9zUm93U3RyaXBlID0gc1N0cmlwZTsKCQkJCQl9CgkJCQl9CgkKCQkJCS8vIFJvdyBjYWxsYmFjayBmdW5jdGlvbnMgLSBtaWdodCB3YW50IHRvIG1hbmlwdWxhdGUgdGhlIHJvdwoJCQkJLy8gaVJvd0NvdW50IGFuZCBqIGFyZSBub3QgY3VycmVudGx5IGRvY3VtZW50ZWQuIEFyZSB0aGV5IGF0IGFsbAoJCQkJLy8gdXNlZnVsPwoJCQkJX2ZuQ2FsbGJhY2tGaXJlKCBvU2V0dGluZ3MsICdhb1Jvd0NhbGxiYWNrJywgbnVsbCwKCQkJCQlbblJvdywgYW9EYXRhLl9hRGF0YSwgaVJvd0NvdW50LCBqLCBpRGF0YUluZGV4XSApOwoJCgkJCQlhblJvd3MucHVzaCggblJvdyApOwoJCQkJaVJvd0NvdW50Kys7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJLyogVGFibGUgaXMgZW1wdHkgLSBjcmVhdGUgYSByb3cgd2l0aCBhbiBlbXB0eSBtZXNzYWdlIGluIGl0ICovCgkJCXZhciBzWmVybyA9IG9MYW5nLnNaZXJvUmVjb3JkczsKCQkJaWYgKCBvU2V0dGluZ3MuaURyYXcgPT0gMSAmJiAgX2ZuRGF0YVNvdXJjZSggb1NldHRpbmdzICkgPT0gJ2FqYXgnICkKCQkJewoJCQkJc1plcm8gPSBvTGFuZy5zTG9hZGluZ1JlY29yZHM7CgkJCX0KCQkJZWxzZSBpZiAoIG9MYW5nLnNFbXB0eVRhYmxlICYmIG9TZXR0aW5ncy5mblJlY29yZHNUb3RhbCgpID09PSAwICkKCQkJewoJCQkJc1plcm8gPSBvTGFuZy5zRW1wdHlUYWJsZTsKCQkJfQoJCgkJCWFuUm93c1sgMCBdID0gJCggJzx0ci8+JywgeyAnY2xhc3MnOiBpU3RyaXBlcyA/IGFzU3RyaXBlQ2xhc3Nlc1swXSA6ICcnIH0gKQoJCQkJLmFwcGVuZCggJCgnPHRkIC8+JywgewoJCQkJCSd2YWxpZ24nOiAgJ3RvcCcsCgkJCQkJJ2NvbFNwYW4nOiBfZm5WaXNibGVDb2x1bW5zKCBvU2V0dGluZ3MgKSwKCQkJCQknY2xhc3MnOiAgIG9TZXR0aW5ncy5vQ2xhc3Nlcy5zUm93RW1wdHkKCQkJCX0gKS5odG1sKCBzWmVybyApIClbMF07CgkJfQoJCgkJLyogSGVhZGVyIGFuZCBmb290ZXIgY2FsbGJhY2tzICovCgkJX2ZuQ2FsbGJhY2tGaXJlKCBvU2V0dGluZ3MsICdhb0hlYWRlckNhbGxiYWNrJywgJ2hlYWRlcicsIFsgJChvU2V0dGluZ3MublRIZWFkKS5jaGlsZHJlbigndHInKVswXSwKCQkJX2ZuR2V0RGF0YU1hc3Rlciggb1NldHRpbmdzICksIGlEaXNwbGF5U3RhcnQsIGlEaXNwbGF5RW5kLCBhaURpc3BsYXkgXSApOwoJCgkJX2ZuQ2FsbGJhY2tGaXJlKCBvU2V0dGluZ3MsICdhb0Zvb3RlckNhbGxiYWNrJywgJ2Zvb3RlcicsIFsgJChvU2V0dGluZ3MublRGb290KS5jaGlsZHJlbigndHInKVswXSwKCQkJX2ZuR2V0RGF0YU1hc3Rlciggb1NldHRpbmdzICksIGlEaXNwbGF5U3RhcnQsIGlEaXNwbGF5RW5kLCBhaURpc3BsYXkgXSApOwoJCgkJdmFyIGJvZHkgPSAkKG9TZXR0aW5ncy5uVEJvZHkpOwoJCgkJYm9keS5jaGlsZHJlbigpLmRldGFjaCgpOwoJCWJvZHkuYXBwZW5kKCAkKGFuUm93cykgKTsKCQoJCS8qIENhbGwgYWxsIHJlcXVpcmVkIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgdGhlIGVuZCBvZiBhIGRyYXcgKi8KCQlfZm5DYWxsYmFja0ZpcmUoIG9TZXR0aW5ncywgJ2FvRHJhd0NhbGxiYWNrJywgJ2RyYXcnLCBbb1NldHRpbmdzXSApOwoJCgkJLyogRHJhdyBpcyBjb21wbGV0ZSwgc29ydGluZyBhbmQgZmlsdGVyaW5nIG11c3QgYmUgYXMgd2VsbCAqLwoJCW9TZXR0aW5ncy5iU29ydGVkID0gZmFsc2U7CgkJb1NldHRpbmdzLmJGaWx0ZXJlZCA9IGZhbHNlOwoJCW9TZXR0aW5ncy5iRHJhd2luZyA9IGZhbHNlOwoJfQoJCgkKCS8qKgoJICogUmVkcmF3IHRoZSB0YWJsZSAtIHRha2luZyBhY2NvdW50IG9mIHRoZSB2YXJpb3VzIGZlYXR1cmVzIHdoaWNoIGFyZSBlbmFibGVkCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7Ym9vbGVhbn0gW2hvbGRQb3NpdGlvbl0gS2VlcCB0aGUgY3VycmVudCBwYWdpbmcgcG9zaXRpb24uIEJ5IGRlZmF1bHQKCSAqICAgIHRoZSBwYWdpbmcgaXMgcmVzZXQgdG8gdGhlIGZpcnN0IHBhZ2UKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuUmVEcmF3KCBzZXR0aW5ncywgaG9sZFBvc2l0aW9uICkKCXsKCQl2YXIKCQkJZmVhdHVyZXMgPSBzZXR0aW5ncy5vRmVhdHVyZXMsCgkJCXNvcnQgICAgID0gZmVhdHVyZXMuYlNvcnQsCgkJCWZpbHRlciAgID0gZmVhdHVyZXMuYkZpbHRlcjsKCQoJCWlmICggc29ydCApIHsKCQkJX2ZuU29ydCggc2V0dGluZ3MgKTsKCQl9CgkKCQlpZiAoIGZpbHRlciApIHsKCQkJX2ZuRmlsdGVyQ29tcGxldGUoIHNldHRpbmdzLCBzZXR0aW5ncy5vUHJldmlvdXNTZWFyY2ggKTsKCQl9CgkJZWxzZSB7CgkJCS8vIE5vIGZpbHRlcmluZywgc28gd2Ugd2FudCB0byBqdXN0IHVzZSB0aGUgZGlzcGxheSBtYXN0ZXIKCQkJc2V0dGluZ3MuYWlEaXNwbGF5ID0gc2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCk7CgkJfQoJCgkJaWYgKCBob2xkUG9zaXRpb24gIT09IHRydWUgKSB7CgkJCXNldHRpbmdzLl9pRGlzcGxheVN0YXJ0ID0gMDsKCQl9CgkKCQkvLyBMZXQgYW55IG1vZHVsZXMga25vdyBhYm91dCB0aGUgZHJhdyBob2xkIHBvc2l0aW9uIHN0YXRlICh1c2VkIGJ5CgkJLy8gc2Nyb2xsaW5nIGludGVybmFsbHkpCgkJc2V0dGluZ3MuX2RyYXdIb2xkID0gaG9sZFBvc2l0aW9uOwoJCgkJX2ZuRHJhdyggc2V0dGluZ3MgKTsKCQoJCXNldHRpbmdzLl9kcmF3SG9sZCA9IGZhbHNlOwoJfQoJCgkKCS8qKgoJICogQWRkIHRoZSBvcHRpb25zIHRvIHRoZSBwYWdlIEhUTUwgZm9yIHRoZSB0YWJsZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuQWRkT3B0aW9uc0h0bWwgKCBvU2V0dGluZ3MgKQoJewoJCXZhciBjbGFzc2VzID0gb1NldHRpbmdzLm9DbGFzc2VzOwoJCXZhciB0YWJsZSA9ICQob1NldHRpbmdzLm5UYWJsZSk7CgkJdmFyIGhvbGRpbmcgPSAkKCc8ZGl2Lz4nKS5pbnNlcnRCZWZvcmUoIHRhYmxlICk7IC8vIEhvbGRpbmcgZWxlbWVudCBmb3Igc3BlZWQKCQl2YXIgZmVhdHVyZXMgPSBvU2V0dGluZ3Mub0ZlYXR1cmVzOwoJCgkJLy8gQWxsIERhdGFUYWJsZXMgYXJlIHdyYXBwZWQgaW4gYSBkaXYKCQl2YXIgaW5zZXJ0ID0gJCgnPGRpdi8+JywgewoJCQlpZDogICAgICBvU2V0dGluZ3Muc1RhYmxlSWQrJ193cmFwcGVyJywKCQkJJ2NsYXNzJzogY2xhc3Nlcy5zV3JhcHBlciArIChvU2V0dGluZ3MublRGb290ID8gJycgOiAnICcrY2xhc3Nlcy5zTm9Gb290ZXIpCgkJfSApOwoJCgkJb1NldHRpbmdzLm5Ib2xkaW5nID0gaG9sZGluZ1swXTsKCQlvU2V0dGluZ3MublRhYmxlV3JhcHBlciA9IGluc2VydFswXTsKCQlvU2V0dGluZ3MublRhYmxlUmVpbnNlcnRCZWZvcmUgPSBvU2V0dGluZ3MublRhYmxlLm5leHRTaWJsaW5nOwoJCgkJLyogTG9vcCBvdmVyIHRoZSB1c2VyIHNldCBwb3NpdGlvbmluZyBhbmQgcGxhY2UgdGhlIGVsZW1lbnRzIGFzIG5lZWRlZCAqLwoJCXZhciBhRG9tID0gb1NldHRpbmdzLnNEb20uc3BsaXQoJycpOwoJCXZhciBmZWF0dXJlTm9kZSwgY09wdGlvbiwgbk5ld05vZGUsIGNOZXh0LCBzQXR0ciwgajsKCQlmb3IgKCB2YXIgaT0wIDsgaTxhRG9tLmxlbmd0aCA7IGkrKyApCgkJewoJCQlmZWF0dXJlTm9kZSA9IG51bGw7CgkJCWNPcHRpb24gPSBhRG9tW2ldOwoJCgkJCWlmICggY09wdGlvbiA9PSAnPCcgKQoJCQl7CgkJCQkvKiBOZXcgY29udGFpbmVyIGRpdiAqLwoJCQkJbk5ld05vZGUgPSAkKCc8ZGl2Lz4nKVswXTsKCQoJCQkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBhcHBlbmQgYW4gaWQgYW5kL29yIGEgY2xhc3MgbmFtZSB0byB0aGUgY29udGFpbmVyICovCgkJCQljTmV4dCA9IGFEb21baSsxXTsKCQkJCWlmICggY05leHQgPT0gIiciIHx8IGNOZXh0ID09ICciJyApCgkJCQl7CgkJCQkJc0F0dHIgPSAiIjsKCQkJCQlqID0gMjsKCQkJCQl3aGlsZSAoIGFEb21baStqXSAhPSBjTmV4dCApCgkJCQkJewoJCQkJCQlzQXR0ciArPSBhRG9tW2kral07CgkJCQkJCWorKzsKCQkJCQl9CgkKCQkJCQkvKiBSZXBsYWNlIGpRdWVyeSBVSSBjb25zdGFudHMgQHRvZG8gZGVwcmVjaWF0ZWQgKi8KCQkJCQlpZiAoIHNBdHRyID09ICJIIiApCgkJCQkJewoJCQkJCQlzQXR0ciA9IGNsYXNzZXMuc0pVSUhlYWRlcjsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoIHNBdHRyID09ICJGIiApCgkJCQkJewoJCQkJCQlzQXR0ciA9IGNsYXNzZXMuc0pVSUZvb3RlcjsKCQkJCQl9CgkKCQkJCQkvKiBUaGUgYXR0cmlidXRlIGNhbiBiZSBpbiB0aGUgZm9ybWF0IG9mICIjaWQuY2xhc3MiLCAiI2lkIiBvciAiY2xhc3MiIFRoaXMgbG9naWMKCQkJCQkgKiBicmVha3MgdGhlIHN0cmluZyBpbnRvIHBhcnRzIGFuZCBhcHBsaWVzIHRoZW0gYXMgbmVlZGVkCgkJCQkJICovCgkJCQkJaWYgKCBzQXR0ci5pbmRleE9mKCcuJykgIT0gLTEgKQoJCQkJCXsKCQkJCQkJdmFyIGFTcGxpdCA9IHNBdHRyLnNwbGl0KCcuJyk7CgkJCQkJCW5OZXdOb2RlLmlkID0gYVNwbGl0WzBdLnN1YnN0cigxLCBhU3BsaXRbMF0ubGVuZ3RoLTEpOwoJCQkJCQluTmV3Tm9kZS5jbGFzc05hbWUgPSBhU3BsaXRbMV07CgkJCQkJfQoJCQkJCWVsc2UgaWYgKCBzQXR0ci5jaGFyQXQoMCkgPT0gIiMiICkKCQkJCQl7CgkJCQkJCW5OZXdOb2RlLmlkID0gc0F0dHIuc3Vic3RyKDEsIHNBdHRyLmxlbmd0aC0xKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJbk5ld05vZGUuY2xhc3NOYW1lID0gc0F0dHI7CgkJCQkJfQoJCgkJCQkJaSArPSBqOyAvKiBNb3ZlIGFsb25nIHRoZSBwb3NpdGlvbiBhcnJheSAqLwoJCQkJfQoJCgkJCQlpbnNlcnQuYXBwZW5kKCBuTmV3Tm9kZSApOwoJCQkJaW5zZXJ0ID0gJChuTmV3Tm9kZSk7CgkJCX0KCQkJZWxzZSBpZiAoIGNPcHRpb24gPT0gJz4nICkKCQkJewoJCQkJLyogRW5kIGNvbnRhaW5lciBkaXYgKi8KCQkJCWluc2VydCA9IGluc2VydC5wYXJlbnQoKTsKCQkJfQoJCQkvLyBAdG9kbyBNb3ZlIG9wdGlvbnMgaW50byB0aGVpciBvd24gcGx1Z2lucz8KCQkJZWxzZSBpZiAoIGNPcHRpb24gPT0gJ2wnICYmIGZlYXR1cmVzLmJQYWdpbmF0ZSAmJiBmZWF0dXJlcy5iTGVuZ3RoQ2hhbmdlICkKCQkJewoJCQkJLyogTGVuZ3RoICovCgkJCQlmZWF0dXJlTm9kZSA9IF9mbkZlYXR1cmVIdG1sTGVuZ3RoKCBvU2V0dGluZ3MgKTsKCQkJfQoJCQllbHNlIGlmICggY09wdGlvbiA9PSAnZicgJiYgZmVhdHVyZXMuYkZpbHRlciApCgkJCXsKCQkJCS8qIEZpbHRlciAqLwoJCQkJZmVhdHVyZU5vZGUgPSBfZm5GZWF0dXJlSHRtbEZpbHRlciggb1NldHRpbmdzICk7CgkJCX0KCQkJZWxzZSBpZiAoIGNPcHRpb24gPT0gJ3InICYmIGZlYXR1cmVzLmJQcm9jZXNzaW5nICkKCQkJewoJCQkJLyogcFJvY2Vzc2luZyAqLwoJCQkJZmVhdHVyZU5vZGUgPSBfZm5GZWF0dXJlSHRtbFByb2Nlc3NpbmcoIG9TZXR0aW5ncyApOwoJCQl9CgkJCWVsc2UgaWYgKCBjT3B0aW9uID09ICd0JyApCgkJCXsKCQkJCS8qIFRhYmxlICovCgkJCQlmZWF0dXJlTm9kZSA9IF9mbkZlYXR1cmVIdG1sVGFibGUoIG9TZXR0aW5ncyApOwoJCQl9CgkJCWVsc2UgaWYgKCBjT3B0aW9uID09ICAnaScgJiYgZmVhdHVyZXMuYkluZm8gKQoJCQl7CgkJCQkvKiBJbmZvICovCgkJCQlmZWF0dXJlTm9kZSA9IF9mbkZlYXR1cmVIdG1sSW5mbyggb1NldHRpbmdzICk7CgkJCX0KCQkJZWxzZSBpZiAoIGNPcHRpb24gPT0gJ3AnICYmIGZlYXR1cmVzLmJQYWdpbmF0ZSApCgkJCXsKCQkJCS8qIFBhZ2luYXRpb24gKi8KCQkJCWZlYXR1cmVOb2RlID0gX2ZuRmVhdHVyZUh0bWxQYWdpbmF0ZSggb1NldHRpbmdzICk7CgkJCX0KCQkJZWxzZSBpZiAoIERhdGFUYWJsZS5leHQuZmVhdHVyZS5sZW5ndGggIT09IDAgKQoJCQl7CgkJCQkvKiBQbHVnLWluIGZlYXR1cmVzICovCgkJCQl2YXIgYW9GZWF0dXJlcyA9IERhdGFUYWJsZS5leHQuZmVhdHVyZTsKCQkJCWZvciAoIHZhciBrPTAsIGtMZW49YW9GZWF0dXJlcy5sZW5ndGggOyBrPGtMZW4gOyBrKysgKQoJCQkJewoJCQkJCWlmICggY09wdGlvbiA9PSBhb0ZlYXR1cmVzW2tdLmNGZWF0dXJlICkKCQkJCQl7CgkJCQkJCWZlYXR1cmVOb2RlID0gYW9GZWF0dXJlc1trXS5mbkluaXQoIG9TZXR0aW5ncyApOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQoJCQkvKiBBZGQgdG8gdGhlIDJEIGZlYXR1cmVzIGFycmF5ICovCgkJCWlmICggZmVhdHVyZU5vZGUgKQoJCQl7CgkJCQl2YXIgYWFuRmVhdHVyZXMgPSBvU2V0dGluZ3MuYWFuRmVhdHVyZXM7CgkKCQkJCWlmICggISBhYW5GZWF0dXJlc1tjT3B0aW9uXSApCgkJCQl7CgkJCQkJYWFuRmVhdHVyZXNbY09wdGlvbl0gPSBbXTsKCQkJCX0KCQoJCQkJYWFuRmVhdHVyZXNbY09wdGlvbl0ucHVzaCggZmVhdHVyZU5vZGUgKTsKCQkJCWluc2VydC5hcHBlbmQoIGZlYXR1cmVOb2RlICk7CgkJCX0KCQl9CgkKCQkvKiBCdWlsdCBvdXIgRE9NIHN0cnVjdHVyZSAtIHJlcGxhY2UgdGhlIGhvbGRpbmcgZGl2IHdpdGggd2hhdCB3ZSB3YW50ICovCgkJaG9sZGluZy5yZXBsYWNlV2l0aCggaW5zZXJ0ICk7CgkJb1NldHRpbmdzLm5Ib2xkaW5nID0gbnVsbDsKCX0KCQoJCgkvKioKCSAqIFVzZSB0aGUgRE9NIHNvdXJjZSB0byBjcmVhdGUgdXAgYW4gYXJyYXkgb2YgaGVhZGVyIGNlbGxzLiBUaGUgaWRlYSBoZXJlIGlzIHRvCgkgKiBjcmVhdGUgYSBsYXlvdXQgZ3JpZCAoYXJyYXkpIG9mIHJvd3MgeCBjb2x1bW5zLCB3aGljaCBjb250YWlucyBhIHJlZmVyZW5jZQoJICogdG8gdGhlIGNlbGwgdGhhdCB0aGF0IHBvaW50IGluIHRoZSBncmlkIChyZWdhcmRsZXNzIG9mIGNvbC9yb3dzcGFuKSwgc3VjaCB0aGF0CgkgKiBhbnkgY29sdW1uIC8gcm93IGNvdWxkIGJlIHJlbW92ZWQgYW5kIHRoZSBuZXcgZ3JpZCBjb25zdHJ1Y3RlZAoJICogIEBwYXJhbSBhcnJheSB7b2JqZWN0fSBhTGF5b3V0IEFycmF5IHRvIHN0b3JlIHRoZSBjYWxjdWxhdGVkIGxheW91dCBpbgoJICogIEBwYXJhbSB7bm9kZX0gblRoZWFkIFRoZSBoZWFkZXIvZm9vdGVyIGVsZW1lbnQgZm9yIHRoZSB0YWJsZQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5EZXRlY3RIZWFkZXIgKCBhTGF5b3V0LCBuVGhlYWQgKQoJewoJCXZhciBuVHJzID0gJChuVGhlYWQpLmNoaWxkcmVuKCd0cicpOwoJCXZhciBuVHIsIG5DZWxsOwoJCXZhciBpLCBrLCBsLCBpTGVuLCBqTGVuLCBpQ29sU2hpZnRlZCwgaUNvbHVtbiwgaUNvbHNwYW4sIGlSb3dzcGFuOwoJCXZhciBiVW5pcXVlOwoJCXZhciBmblNoaWZ0Q29sID0gZnVuY3Rpb24gKCBhLCBpLCBqICkgewoJCQl2YXIgayA9IGFbaV07CgkgICAgICAgICAgICAgICAgd2hpbGUgKCBrW2pdICkgewoJCQkJaisrOwoJCQl9CgkJCXJldHVybiBqOwoJCX07CgkKCQlhTGF5b3V0LnNwbGljZSggMCwgYUxheW91dC5sZW5ndGggKTsKCQoJCS8qIFdlIGtub3cgaG93IG1hbnkgcm93cyB0aGVyZSBhcmUgaW4gdGhlIGxheW91dCAtIHNvIHByZXAgaXQgKi8KCQlmb3IgKCBpPTAsIGlMZW49blRycy5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCXsKCQkJYUxheW91dC5wdXNoKCBbXSApOwoJCX0KCQoJCS8qIENhbGN1bGF0ZSBhIGxheW91dCBhcnJheSAqLwoJCWZvciAoIGk9MCwgaUxlbj1uVHJzLmxlbmd0aCA7IGk8aUxlbiA7IGkrKyApCgkJewoJCQluVHIgPSBuVHJzW2ldOwoJCQlpQ29sdW1uID0gMDsKCQoJCQkvKiBGb3IgZXZlcnkgY2VsbCBpbiB0aGUgcm93Li4uICovCgkJCW5DZWxsID0gblRyLmZpcnN0Q2hpbGQ7CgkJCXdoaWxlICggbkNlbGwgKSB7CgkJCQlpZiAoIG5DZWxsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gIlREIiB8fAoJCQkJICAgICBuQ2VsbC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09ICJUSCIgKQoJCQkJewoJCQkJCS8qIEdldCB0aGUgY29sIGFuZCByb3dzcGFuIGF0dHJpYnV0ZXMgZnJvbSB0aGUgRE9NIGFuZCBzYW5pdGlzZSB0aGVtICovCgkJCQkJaUNvbHNwYW4gPSBuQ2VsbC5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSAqIDE7CgkJCQkJaVJvd3NwYW4gPSBuQ2VsbC5nZXRBdHRyaWJ1dGUoJ3Jvd3NwYW4nKSAqIDE7CgkJCQkJaUNvbHNwYW4gPSAoIWlDb2xzcGFuIHx8IGlDb2xzcGFuPT09MCB8fCBpQ29sc3Bhbj09PTEpID8gMSA6IGlDb2xzcGFuOwoJCQkJCWlSb3dzcGFuID0gKCFpUm93c3BhbiB8fCBpUm93c3Bhbj09PTAgfHwgaVJvd3NwYW49PT0xKSA/IDEgOiBpUm93c3BhbjsKCQoJCQkJCS8qIFRoZXJlIG1pZ2h0IGJlIGNvbHNwYW4gY2VsbHMgYWxyZWFkeSBpbiB0aGlzIHJvdywgc28gc2hpZnQgb3VyIHRhcmdldAoJCQkJCSAqIGFjY29yZGluZ2x5CgkJCQkJICovCgkJCQkJaUNvbFNoaWZ0ZWQgPSBmblNoaWZ0Q29sKCBhTGF5b3V0LCBpLCBpQ29sdW1uICk7CgkKCQkJCQkvKiBDYWNoZSBjYWxjdWxhdGlvbiBmb3IgdW5pcXVlIGNvbHVtbnMgKi8KCQkJCQliVW5pcXVlID0gaUNvbHNwYW4gPT09IDEgPyB0cnVlIDogZmFsc2U7CgkKCQkJCQkvKiBJZiB0aGVyZSBpcyBjb2wgLyByb3dzcGFuLCBjb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBsYXlvdXQgZ3JpZCAqLwoJCQkJCWZvciAoIGw9MCA7IGw8aUNvbHNwYW4gOyBsKysgKQoJCQkJCXsKCQkJCQkJZm9yICggaz0wIDsgazxpUm93c3BhbiA7IGsrKyApCgkJCQkJCXsKCQkJCQkJCWFMYXlvdXRbaStrXVtpQ29sU2hpZnRlZCtsXSA9IHsKCQkJCQkJCQkiY2VsbCI6IG5DZWxsLAoJCQkJCQkJCSJ1bmlxdWUiOiBiVW5pcXVlCgkJCQkJCQl9OwoJCQkJCQkJYUxheW91dFtpK2tdLm5UciA9IG5UcjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCW5DZWxsID0gbkNlbGwubmV4dFNpYmxpbmc7CgkJCX0KCQl9Cgl9CgkKCQoJLyoqCgkgKiBHZXQgYW4gYXJyYXkgb2YgdW5pcXVlIHRoIGVsZW1lbnRzLCBvbmUgZm9yIGVhY2ggY29sdW1uCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7bm9kZX0gbkhlYWRlciBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgbGF5b3V0IGZyb20gdGhpcyBub2RlIC0gb3B0aW9uYWwKCSAqICBAcGFyYW0ge2FycmF5fSBhTGF5b3V0IHRoZWFkL3Rmb290IGxheW91dCBmcm9tIF9mbkRldGVjdEhlYWRlciAtIG9wdGlvbmFsCgkgKiAgQHJldHVybnMgYXJyYXkge25vZGV9IGFSZXR1cm4gbGlzdCBvZiB1bmlxdWUgdGgncwoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5HZXRVbmlxdWVUaHMgKCBvU2V0dGluZ3MsIG5IZWFkZXIsIGFMYXlvdXQgKQoJewoJCXZhciBhUmV0dXJuID0gW107CgkJaWYgKCAhYUxheW91dCApCgkJewoJCQlhTGF5b3V0ID0gb1NldHRpbmdzLmFvSGVhZGVyOwoJCQlpZiAoIG5IZWFkZXIgKQoJCQl7CgkJCQlhTGF5b3V0ID0gW107CgkJCQlfZm5EZXRlY3RIZWFkZXIoIGFMYXlvdXQsIG5IZWFkZXIgKTsKCQkJfQoJCX0KCQoJCWZvciAoIHZhciBpPTAsIGlMZW49YUxheW91dC5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCXsKCQkJZm9yICggdmFyIGo9MCwgakxlbj1hTGF5b3V0W2ldLmxlbmd0aCA7IGo8akxlbiA7IGorKyApCgkJCXsKCQkJCWlmICggYUxheW91dFtpXVtqXS51bmlxdWUgJiYKCQkJCQkgKCFhUmV0dXJuW2pdIHx8ICFvU2V0dGluZ3MuYlNvcnRDZWxsc1RvcCkgKQoJCQkJewoJCQkJCWFSZXR1cm5bal0gPSBhTGF5b3V0W2ldW2pdLmNlbGw7CgkJCQl9CgkJCX0KCQl9CgkKCQlyZXR1cm4gYVJldHVybjsKCX0KCQoJLyoqCgkgKiBTZXQgdGhlIHN0YXJ0IHBvc2l0aW9uIGZvciBkcmF3CgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICovCglmdW5jdGlvbiBfZm5TdGFydCggb1NldHRpbmdzICkKCXsKCQl2YXIgYlNlcnZlclNpZGUgPSBfZm5EYXRhU291cmNlKCBvU2V0dGluZ3MgKSA9PSAnc3NwJzsKCQl2YXIgaUluaXREaXNwbGF5U3RhcnQgPSBvU2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQ7CgkKCQkvLyBDaGVjayBhbmQgc2VlIGlmIHdlIGhhdmUgYW4gaW5pdGlhbCBkcmF3IHBvc2l0aW9uIGZyb20gc3RhdGUgc2F2aW5nCgkJaWYgKCBpSW5pdERpc3BsYXlTdGFydCAhPT0gdW5kZWZpbmVkICYmIGlJbml0RGlzcGxheVN0YXJ0ICE9PSAtMSApCgkJewoJCQlvU2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQgPSBiU2VydmVyU2lkZSA/CgkJCQlpSW5pdERpc3BsYXlTdGFydCA6CgkJCQlpSW5pdERpc3BsYXlTdGFydCA+PSBvU2V0dGluZ3MuZm5SZWNvcmRzRGlzcGxheSgpID8KCQkJCQkwIDoKCQkJCQlpSW5pdERpc3BsYXlTdGFydDsKCQoJCQlvU2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQgPSAtMTsKCQl9Cgl9CgkKCS8qKgoJICogQ3JlYXRlIGFuIEFqYXggY2FsbCBiYXNlZCBvbiB0aGUgdGFibGUncyBzZXR0aW5ncywgdGFraW5nIGludG8gYWNjb3VudCB0aGF0CgkgKiBwYXJhbWV0ZXJzIGNhbiBoYXZlIG11bHRpcGxlIGZvcm1zLCBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogQHBhcmFtIHthcnJheX0gZGF0YSBEYXRhIHRvIHNlbmQgdG8gdGhlIHNlcnZlciwgcmVxdWlyZWQgYnkKCSAqICAgICBEYXRhVGFibGVzIC0gbWF5IGJlIGF1Z21lbnRlZCBieSBkZXZlbG9wZXIgY2FsbGJhY2tzCgkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiBDYWxsYmFjayBmdW5jdGlvbiB0byBydW4gd2hlbiBkYXRhIGlzIG9idGFpbmVkCgkgKi8KCWZ1bmN0aW9uIF9mbkJ1aWxkQWpheCggb1NldHRpbmdzLCBkYXRhLCBmbiApCgl7CgkJLy8gQ29tcGF0aWJpbGl0eSB3aXRoIDEuOS0sIGFsbG93IGZuU2VydmVyRGF0YSBhbmQgZXZlbnQgdG8gbWFuaXB1bGF0ZQoJCV9mbkNhbGxiYWNrRmlyZSggb1NldHRpbmdzLCAnYW9TZXJ2ZXJQYXJhbXMnLCAnc2VydmVyUGFyYW1zJywgW2RhdGFdICk7CgkKCQkvLyBDb252ZXJ0IHRvIG9iamVjdCBiYXNlZCBmb3IgMS4xMCsgaWYgdXNpbmcgdGhlIG9sZCBhcnJheSBzY2hlbWUgd2hpY2ggY2FuCgkJLy8gY29tZSBmcm9tIHNlcnZlci1zaWRlIHByb2Nlc3Npbmcgb3Igc2VydmVyUGFyYW1zCgkJaWYgKCBkYXRhICYmIEFycmF5LmlzQXJyYXkoZGF0YSkgKSB7CgkJCXZhciB0bXAgPSB7fTsKCQkJdmFyIHJicmFja2V0ID0gLyguKj8pXFtcXSQvOwoJCgkJCSQuZWFjaCggZGF0YSwgZnVuY3Rpb24gKGtleSwgdmFsKSB7CgkJCQl2YXIgbWF0Y2ggPSB2YWwubmFtZS5tYXRjaChyYnJhY2tldCk7CgkKCQkJCWlmICggbWF0Y2ggKSB7CgkJCQkJLy8gU3VwcG9ydCBmb3IgYXJyYXlzCgkJCQkJdmFyIG5hbWUgPSBtYXRjaFswXTsKCQoJCQkJCWlmICggISB0bXBbIG5hbWUgXSApIHsKCQkJCQkJdG1wWyBuYW1lIF0gPSBbXTsKCQkJCQl9CgkJCQkJdG1wWyBuYW1lIF0ucHVzaCggdmFsLnZhbHVlICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQl0bXBbdmFsLm5hbWVdID0gdmFsLnZhbHVlOwoJCQkJfQoJCQl9ICk7CgkJCWRhdGEgPSB0bXA7CgkJfQoJCgkJdmFyIGFqYXhEYXRhOwoJCXZhciBhamF4ID0gb1NldHRpbmdzLmFqYXg7CgkJdmFyIGluc3RhbmNlID0gb1NldHRpbmdzLm9JbnN0YW5jZTsKCQl2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiAoIGpzb24gKSB7CgkJCXZhciBzdGF0dXMgPSBvU2V0dGluZ3MuanFYSFIKCQkJCT8gb1NldHRpbmdzLmpxWEhSLnN0YXR1cwoJCQkJOiBudWxsOwoJCgkJCWlmICgganNvbiA9PT0gbnVsbCB8fCAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicgJiYgc3RhdHVzID09IDIwNCApICkgewoJCQkJanNvbiA9IHt9OwoJCQkJX2ZuQWpheERhdGFTcmMoIG9TZXR0aW5ncywganNvbiwgW10gKTsKCQkJfQoJCgkJCXZhciBlcnJvciA9IGpzb24uZXJyb3IgfHwganNvbi5zRXJyb3I7CgkJCWlmICggZXJyb3IgKSB7CgkJCQlfZm5Mb2coIG9TZXR0aW5ncywgMCwgZXJyb3IgKTsKCQkJfQoJCgkJCW9TZXR0aW5ncy5qc29uID0ganNvbjsKCQoJCQlfZm5DYWxsYmFja0ZpcmUoIG9TZXR0aW5ncywgbnVsbCwgJ3hocicsIFtvU2V0dGluZ3MsIGpzb24sIG9TZXR0aW5ncy5qcVhIUl0gKTsKCQkJZm4oIGpzb24gKTsKCQl9OwoJCgkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIGFqYXggKSAmJiBhamF4LmRhdGEgKQoJCXsKCQkJYWpheERhdGEgPSBhamF4LmRhdGE7CgkKCQkJdmFyIG5ld0RhdGEgPSB0eXBlb2YgYWpheERhdGEgPT09ICdmdW5jdGlvbicgPwoJCQkJYWpheERhdGEoIGRhdGEsIG9TZXR0aW5ncyApIDogIC8vIGZuIGNhbiBtYW5pcHVsYXRlIGRhdGEgb3IgcmV0dXJuCgkJCQlhamF4RGF0YTsgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gb2JqZWN0IG9iamVjdCBvciBhcnJheSB0byBtZXJnZQoJCgkJCS8vIElmIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBzb21ldGhpbmcsIHVzZSB0aGF0IGFsb25lCgkJCWRhdGEgPSB0eXBlb2YgYWpheERhdGEgPT09ICdmdW5jdGlvbicgJiYgbmV3RGF0YSA/CgkJCQluZXdEYXRhIDoKCQkJCSQuZXh0ZW5kKCB0cnVlLCBkYXRhLCBuZXdEYXRhICk7CgkKCQkJLy8gUmVtb3ZlIHRoZSBkYXRhIHByb3BlcnR5IGFzIHdlJ3ZlIHJlc29sdmVkIGl0IGFscmVhZHkgYW5kIGRvbid0IHdhbnQKCQkJLy8galF1ZXJ5IHRvIGRvIGl0IGFnYWluIChpdCBpcyByZXN0b3JlZCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbikKCQkJZGVsZXRlIGFqYXguZGF0YTsKCQl9CgkKCQl2YXIgYmFzZUFqYXggPSB7CgkJCSJkYXRhIjogZGF0YSwKCQkJInN1Y2Nlc3MiOiBjYWxsYmFjaywKCQkJImRhdGFUeXBlIjogImpzb24iLAoJCQkiY2FjaGUiOiBmYWxzZSwKCQkJInR5cGUiOiBvU2V0dGluZ3Muc1NlcnZlck1ldGhvZCwKCQkJImVycm9yIjogZnVuY3Rpb24gKHhociwgZXJyb3IsIHRocm93bikgewoJCQkJdmFyIHJldCA9IF9mbkNhbGxiYWNrRmlyZSggb1NldHRpbmdzLCBudWxsLCAneGhyJywgW29TZXR0aW5ncywgbnVsbCwgb1NldHRpbmdzLmpxWEhSXSApOwoJCgkJCQlpZiAoICQuaW5BcnJheSggdHJ1ZSwgcmV0ICkgPT09IC0xICkgewoJCQkJCWlmICggZXJyb3IgPT0gInBhcnNlcmVycm9yIiApIHsKCQkJCQkJX2ZuTG9nKCBvU2V0dGluZ3MsIDAsICdJbnZhbGlkIEpTT04gcmVzcG9uc2UnLCAxICk7CgkJCQkJfQoJCQkJCWVsc2UgaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCQkJCQkJX2ZuTG9nKCBvU2V0dGluZ3MsIDAsICdBamF4IGVycm9yJywgNyApOwoJCQkJCX0KCQkJCX0KCQoJCQkJX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIG9TZXR0aW5ncywgZmFsc2UgKTsKCQkJfQoJCX07CgkKCQkvLyBTdG9yZSB0aGUgZGF0YSBzdWJtaXR0ZWQgZm9yIHRoZSBBUEkKCQlvU2V0dGluZ3Mub0FqYXhEYXRhID0gZGF0YTsKCQoJCS8vIEFsbG93IHBsdWctaW5zIGFuZCBleHRlcm5hbCBwcm9jZXNzZXMgdG8gbW9kaWZ5IHRoZSBkYXRhCgkJX2ZuQ2FsbGJhY2tGaXJlKCBvU2V0dGluZ3MsIG51bGwsICdwcmVYaHInLCBbb1NldHRpbmdzLCBkYXRhXSApOwoJCgkJaWYgKCBvU2V0dGluZ3MuZm5TZXJ2ZXJEYXRhICkKCQl7CgkJCS8vIERhdGFUYWJsZXMgMS45LSBjb21wYXRpYmlsaXR5CgkJCW9TZXR0aW5ncy5mblNlcnZlckRhdGEuY2FsbCggaW5zdGFuY2UsCgkJCQlvU2V0dGluZ3Muc0FqYXhTb3VyY2UsCgkJCQkkLm1hcCggZGF0YSwgZnVuY3Rpb24gKHZhbCwga2V5KSB7IC8vIE5lZWQgdG8gY29udmVydCBiYWNrIHRvIDEuOSB0cmFkIGZvcm1hdAoJCQkJCXJldHVybiB7IG5hbWU6IGtleSwgdmFsdWU6IHZhbCB9OwoJCQkJfSApLAoJCQkJY2FsbGJhY2ssCgkJCQlvU2V0dGluZ3MKCQkJKTsKCQl9CgkJZWxzZSBpZiAoIG9TZXR0aW5ncy5zQWpheFNvdXJjZSB8fCB0eXBlb2YgYWpheCA9PT0gJ3N0cmluZycgKQoJCXsKCQkJLy8gRGF0YVRhYmxlcyAxLjktIGNvbXBhdGliaWxpdHkKCQkJb1NldHRpbmdzLmpxWEhSID0gJC5hamF4KCAkLmV4dGVuZCggYmFzZUFqYXgsIHsKCQkJCXVybDogYWpheCB8fCBvU2V0dGluZ3Muc0FqYXhTb3VyY2UKCQkJfSApICk7CgkJfQoJCWVsc2UgaWYgKCB0eXBlb2YgYWpheCA9PT0gJ2Z1bmN0aW9uJyApCgkJewoJCQkvLyBJcyBhIGZ1bmN0aW9uIC0gbGV0IHRoZSBjYWxsZXIgZGVmaW5lIHdoYXQgbmVlZHMgdG8gYmUgZG9uZQoJCQlvU2V0dGluZ3MuanFYSFIgPSBhamF4LmNhbGwoIGluc3RhbmNlLCBkYXRhLCBjYWxsYmFjaywgb1NldHRpbmdzICk7CgkJfQoJCWVsc2UKCQl7CgkJCS8vIE9iamVjdCB0byBleHRlbmQgdGhlIGJhc2Ugc2V0dGluZ3MKCQkJb1NldHRpbmdzLmpxWEhSID0gJC5hamF4KCAkLmV4dGVuZCggYmFzZUFqYXgsIGFqYXggKSApOwoJCgkJCS8vIFJlc3RvcmUgZm9yIG5leHQgdGltZSBhcm91bmQKCQkJYWpheC5kYXRhID0gYWpheERhdGE7CgkJfQoJfQoJCgkKCS8qKgoJICogVXBkYXRlIHRoZSB0YWJsZSB1c2luZyBhbiBBamF4IGNhbGwKCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcmV0dXJucyB7Ym9vbGVhbn0gQmxvY2sgdGhlIHRhYmxlIGRyYXdpbmcgb3Igbm90CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkFqYXhVcGRhdGUoIHNldHRpbmdzICkKCXsKCQlzZXR0aW5ncy5pRHJhdysrOwoJCV9mblByb2Nlc3NpbmdEaXNwbGF5KCBzZXR0aW5ncywgdHJ1ZSApOwoJCgkJX2ZuQnVpbGRBamF4KAoJCQlzZXR0aW5ncywKCQkJX2ZuQWpheFBhcmFtZXRlcnMoIHNldHRpbmdzICksCgkJCWZ1bmN0aW9uKGpzb24pIHsKCQkJCV9mbkFqYXhVcGRhdGVEcmF3KCBzZXR0aW5ncywganNvbiApOwoJCQl9CgkJKTsKCX0KCQoJCgkvKioKCSAqIEJ1aWxkIHVwIHRoZSBwYXJhbWV0ZXJzIGluIGFuIG9iamVjdCBuZWVkZWQgZm9yIGEgc2VydmVyLXNpZGUgcHJvY2Vzc2luZwoJICogcmVxdWVzdC4gTm90ZSB0aGF0IHRoaXMgaXMgYmFzaWNhbGx5IGRvbmUgdHdpY2UsIGlzIGRpZmZlcmVudCB3YXlzIC0gYSBtb2Rlcm4KCSAqIG1ldGhvZCB3aGljaCBpcyB1c2VkIGJ5IGRlZmF1bHQgaW4gRGF0YVRhYmxlcyAxLjEwIHdoaWNoIHVzZXMgb2JqZWN0cyBhbmQKCSAqIGFycmF5cywgb3IgdGhlIDEuOS0gbWV0aG9kIHdpdGggaXMgbmFtZSAvIHZhbHVlIHBhaXJzLiAxLjkgbWV0aG9kIGlzIHVzZWQgaWYKCSAqIHRoZSBzQWpheFNvdXJjZSBvcHRpb24gaXMgdXNlZCBpbiB0aGUgaW5pdGlhbGlzYXRpb24sIG9yIHRoZSBsZWdhY3lBamF4CgkgKiBvcHRpb24gaXMgc2V0LgoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcmV0dXJucyB7Ym9vbH0gYmxvY2sgdGhlIHRhYmxlIGRyYXdpbmcgb3Igbm90CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkFqYXhQYXJhbWV0ZXJzKCBzZXR0aW5ncyApCgl7CgkJdmFyCgkJCWNvbHVtbnMgPSBzZXR0aW5ncy5hb0NvbHVtbnMsCgkJCWNvbHVtbkNvdW50ID0gY29sdW1ucy5sZW5ndGgsCgkJCWZlYXR1cmVzID0gc2V0dGluZ3Mub0ZlYXR1cmVzLAoJCQlwcmVTZWFyY2ggPSBzZXR0aW5ncy5vUHJldmlvdXNTZWFyY2gsCgkJCXByZUNvbFNlYXJjaCA9IHNldHRpbmdzLmFvUHJlU2VhcmNoQ29scywKCQkJaSwgZGF0YSA9IFtdLCBkYXRhUHJvcCwgY29sdW1uLCBjb2x1bW5TZWFyY2gsCgkJCXNvcnQgPSBfZm5Tb3J0RmxhdHRlbiggc2V0dGluZ3MgKSwKCQkJZGlzcGxheVN0YXJ0ID0gc2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQsCgkJCWRpc3BsYXlMZW5ndGggPSBmZWF0dXJlcy5iUGFnaW5hdGUgIT09IGZhbHNlID8KCQkJCXNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCA6CgkJCQktMTsKCQoJCXZhciBwYXJhbSA9IGZ1bmN0aW9uICggbmFtZSwgdmFsdWUgKSB7CgkJCWRhdGEucHVzaCggeyAnbmFtZSc6IG5hbWUsICd2YWx1ZSc6IHZhbHVlIH0gKTsKCQl9OwoJCgkJLy8gRGF0YVRhYmxlcyAxLjktIGNvbXBhdGlibGUgbWV0aG9kCgkJcGFyYW0oICdzRWNobycsICAgICAgICAgIHNldHRpbmdzLmlEcmF3ICk7CgkJcGFyYW0oICdpQ29sdW1ucycsICAgICAgIGNvbHVtbkNvdW50ICk7CgkJcGFyYW0oICdzQ29sdW1ucycsICAgICAgIF9wbHVjayggY29sdW1ucywgJ3NOYW1lJyApLmpvaW4oJywnKSApOwoJCXBhcmFtKCAnaURpc3BsYXlTdGFydCcsICBkaXNwbGF5U3RhcnQgKTsKCQlwYXJhbSggJ2lEaXNwbGF5TGVuZ3RoJywgZGlzcGxheUxlbmd0aCApOwoJCgkJLy8gRGF0YVRhYmxlcyAxLjEwKyBtZXRob2QKCQl2YXIgZCA9IHsKCQkJZHJhdzogICAgc2V0dGluZ3MuaURyYXcsCgkJCWNvbHVtbnM6IFtdLAoJCQlvcmRlcjogICBbXSwKCQkJc3RhcnQ6ICAgZGlzcGxheVN0YXJ0LAoJCQlsZW5ndGg6ICBkaXNwbGF5TGVuZ3RoLAoJCQlzZWFyY2g6ICB7CgkJCQl2YWx1ZTogcHJlU2VhcmNoLnNTZWFyY2gsCgkJCQlyZWdleDogcHJlU2VhcmNoLmJSZWdleAoJCQl9CgkJfTsKCQoJCWZvciAoIGk9MCA7IGk8Y29sdW1uQ291bnQgOyBpKysgKSB7CgkJCWNvbHVtbiA9IGNvbHVtbnNbaV07CgkJCWNvbHVtblNlYXJjaCA9IHByZUNvbFNlYXJjaFtpXTsKCQkJZGF0YVByb3AgPSB0eXBlb2YgY29sdW1uLm1EYXRhPT0iZnVuY3Rpb24iID8gJ2Z1bmN0aW9uJyA6IGNvbHVtbi5tRGF0YSA7CgkKCQkJZC5jb2x1bW5zLnB1c2goIHsKCQkJCWRhdGE6ICAgICAgIGRhdGFQcm9wLAoJCQkJbmFtZTogICAgICAgY29sdW1uLnNOYW1lLAoJCQkJc2VhcmNoYWJsZTogY29sdW1uLmJTZWFyY2hhYmxlLAoJCQkJb3JkZXJhYmxlOiAgY29sdW1uLmJTb3J0YWJsZSwKCQkJCXNlYXJjaDogICAgIHsKCQkJCQl2YWx1ZTogY29sdW1uU2VhcmNoLnNTZWFyY2gsCgkJCQkJcmVnZXg6IGNvbHVtblNlYXJjaC5iUmVnZXgKCQkJCX0KCQkJfSApOwoJCgkJCXBhcmFtKCAibURhdGFQcm9wXyIraSwgZGF0YVByb3AgKTsKCQoJCQlpZiAoIGZlYXR1cmVzLmJGaWx0ZXIgKSB7CgkJCQlwYXJhbSggJ3NTZWFyY2hfJytpLCAgICAgY29sdW1uU2VhcmNoLnNTZWFyY2ggKTsKCQkJCXBhcmFtKCAnYlJlZ2V4XycraSwgICAgICBjb2x1bW5TZWFyY2guYlJlZ2V4ICk7CgkJCQlwYXJhbSggJ2JTZWFyY2hhYmxlXycraSwgY29sdW1uLmJTZWFyY2hhYmxlICk7CgkJCX0KCQoJCQlpZiAoIGZlYXR1cmVzLmJTb3J0ICkgewoJCQkJcGFyYW0oICdiU29ydGFibGVfJytpLCBjb2x1bW4uYlNvcnRhYmxlICk7CgkJCX0KCQl9CgkKCQlpZiAoIGZlYXR1cmVzLmJGaWx0ZXIgKSB7CgkJCXBhcmFtKCAnc1NlYXJjaCcsIHByZVNlYXJjaC5zU2VhcmNoICk7CgkJCXBhcmFtKCAnYlJlZ2V4JywgcHJlU2VhcmNoLmJSZWdleCApOwoJCX0KCQoJCWlmICggZmVhdHVyZXMuYlNvcnQgKSB7CgkJCSQuZWFjaCggc29ydCwgZnVuY3Rpb24gKCBpLCB2YWwgKSB7CgkJCQlkLm9yZGVyLnB1c2goIHsgY29sdW1uOiB2YWwuY29sLCBkaXI6IHZhbC5kaXIgfSApOwoJCgkJCQlwYXJhbSggJ2lTb3J0Q29sXycraSwgdmFsLmNvbCApOwoJCQkJcGFyYW0oICdzU29ydERpcl8nK2ksIHZhbC5kaXIgKTsKCQkJfSApOwoJCgkJCXBhcmFtKCAnaVNvcnRpbmdDb2xzJywgc29ydC5sZW5ndGggKTsKCQl9CgkKCQkvLyBJZiB0aGUgbGVnYWN5LmFqYXggcGFyYW1ldGVyIGlzIG51bGwsIHRoZW4gd2UgYXV0b21hdGljYWxseSBkZWNpZGUgd2hpY2gKCQkvLyBmb3JtIHRvIHVzZSwgYmFzZWQgb24gc0FqYXhTb3VyY2UKCQl2YXIgbGVnYWN5ID0gRGF0YVRhYmxlLmV4dC5sZWdhY3kuYWpheDsKCQlpZiAoIGxlZ2FjeSA9PT0gbnVsbCApIHsKCQkJcmV0dXJuIHNldHRpbmdzLnNBamF4U291cmNlID8gZGF0YSA6IGQ7CgkJfQoJCgkJLy8gT3RoZXJ3aXNlLCBpZiBsZWdhY3kgaGFzIGJlZW4gc3BlY2lmaWVkIHRoZW4gd2UgdXNlIHRoYXQgdG8gZGVjaWRlIG9uIHRoZQoJCS8vIGZvcm0KCQlyZXR1cm4gbGVnYWN5ID8gZGF0YSA6IGQ7Cgl9CgkKCQoJLyoqCgkgKiBEYXRhIHRoZSBkYXRhIGZyb20gdGhlIHNlcnZlciAobnVraW5nIHRoZSBvbGQpIGFuZCByZWRyYXcgdGhlIHRhYmxlCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7b2JqZWN0fSBqc29uIGpzb24gZGF0YSByZXR1cm4gZnJvbSB0aGUgc2VydmVyLgoJICogIEBwYXJhbSB7c3RyaW5nfSBqc29uLnNFY2hvIFRyYWNraW5nIGZsYWcgZm9yIERhdGFUYWJsZXMgdG8gbWF0Y2ggcmVxdWVzdHMKCSAqICBAcGFyYW0ge2ludH0ganNvbi5pVG90YWxSZWNvcmRzIE51bWJlciBvZiByZWNvcmRzIGluIHRoZSBkYXRhIHNldCwgbm90IGFjY291bnRpbmcgZm9yIGZpbHRlcmluZwoJICogIEBwYXJhbSB7aW50fSBqc29uLmlUb3RhbERpc3BsYXlSZWNvcmRzIE51bWJlciBvZiByZWNvcmRzIGluIHRoZSBkYXRhIHNldCwgYWNjb3VudGluZyBmb3IgZmlsdGVyaW5nCgkgKiAgQHBhcmFtIHthcnJheX0ganNvbi5hYURhdGEgVGhlIGRhdGEgdG8gZGlzcGxheSBvbiB0aGlzIHBhZ2UKCSAqICBAcGFyYW0ge3N0cmluZ30gW2pzb24uc0NvbHVtbnNdIENvbHVtbiBvcmRlcmluZyAoc05hbWUsIGNvbW1hIHNlcGFyYXRlZCkKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuQWpheFVwZGF0ZURyYXcgKCBzZXR0aW5ncywganNvbiApCgl7CgkJLy8gdjEuMTAgdXNlcyBjYW1lbENhc2UgdmFyaWFibGVzLCB3aGlsZSAxLjkgdXNlcyBIdW5nYXJpYW4gbm90YXRpb24uCgkJLy8gU3VwcG9ydCBib3RoCgkJdmFyIGNvbXBhdCA9IGZ1bmN0aW9uICggb2xkLCBtb2Rlcm4gKSB7CgkJCXJldHVybiBqc29uW29sZF0gIT09IHVuZGVmaW5lZCA/IGpzb25bb2xkXSA6IGpzb25bbW9kZXJuXTsKCQl9OwoJCgkJdmFyIGRhdGEgPSBfZm5BamF4RGF0YVNyYyggc2V0dGluZ3MsIGpzb24gKTsKCQl2YXIgZHJhdyAgICAgICAgICAgID0gY29tcGF0KCAnc0VjaG8nLCAgICAgICAgICAgICAgICAnZHJhdycgKTsKCQl2YXIgcmVjb3Jkc1RvdGFsICAgID0gY29tcGF0KCAnaVRvdGFsUmVjb3JkcycsICAgICAgICAncmVjb3Jkc1RvdGFsJyApOwoJCXZhciByZWNvcmRzRmlsdGVyZWQgPSBjb21wYXQoICdpVG90YWxEaXNwbGF5UmVjb3JkcycsICdyZWNvcmRzRmlsdGVyZWQnICk7CgkKCQlpZiAoIGRyYXcgIT09IHVuZGVmaW5lZCApIHsKCQkJLy8gUHJvdGVjdCBhZ2FpbnN0IG91dCBvZiBzZXF1ZW5jZSByZXR1cm5zCgkJCWlmICggZHJhdyoxIDwgc2V0dGluZ3MuaURyYXcgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJc2V0dGluZ3MuaURyYXcgPSBkcmF3ICogMTsKCQl9CgkKCQkvLyBObyBkYXRhIGluIHJldHVybmVkIG9iamVjdCwgc28gcmF0aGVyIHRoYW4gYW4gYXJyYXksIHdlIHNob3cgYW4gZW1wdHkgdGFibGUKCQlpZiAoICEgZGF0YSApIHsKCQkJZGF0YSA9IFtdOwoJCX0KCQoJCV9mbkNsZWFyVGFibGUoIHNldHRpbmdzICk7CgkJc2V0dGluZ3MuX2lSZWNvcmRzVG90YWwgICA9IHBhcnNlSW50KHJlY29yZHNUb3RhbCwgMTApOwoJCXNldHRpbmdzLl9pUmVjb3Jkc0Rpc3BsYXkgPSBwYXJzZUludChyZWNvcmRzRmlsdGVyZWQsIDEwKTsKCQoJCWZvciAoIHZhciBpPTAsIGllbj1kYXRhLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQlfZm5BZGREYXRhKCBzZXR0aW5ncywgZGF0YVtpXSApOwoJCX0KCQlzZXR0aW5ncy5haURpc3BsYXkgPSBzZXR0aW5ncy5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKTsKCQoJCV9mbkRyYXcoIHNldHRpbmdzLCB0cnVlICk7CgkKCQlpZiAoICEgc2V0dGluZ3MuX2JJbml0Q29tcGxldGUgKSB7CgkJCV9mbkluaXRDb21wbGV0ZSggc2V0dGluZ3MsIGpzb24gKTsKCQl9CgkKCQlfZm5Qcm9jZXNzaW5nRGlzcGxheSggc2V0dGluZ3MsIGZhbHNlICk7Cgl9CgkKCQoJLyoqCgkgKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgSlNPTiBkYXRhIHNvdXJjZSB0byB1c2UgZm9yIGRyYXdpbmcgYSB0YWJsZS4gVXNpbmcKCSAqIGBfZm5HZXRPYmplY3REYXRhRm5gIGFsbG93cyB0aGUgZGF0YSB0byBiZSBzb3VyY2VkIGZyb20gYSBwcm9wZXJ0eSBvZiB0aGUKCSAqIHNvdXJjZSBvYmplY3QsIG9yIGZyb20gYSBwcm9jZXNzaW5nIGZ1bmN0aW9uLgoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0gIHtvYmplY3R9IGpzb24gRGF0YSBzb3VyY2Ugb2JqZWN0IC8gYXJyYXkgZnJvbSB0aGUgc2VydmVyCgkgKiAgQHJldHVybiB7YXJyYXl9IEFycmF5IG9mIGRhdGEgdG8gdXNlCgkgKi8KCSBmdW5jdGlvbiBfZm5BamF4RGF0YVNyYyAoIG9TZXR0aW5ncywganNvbiwgd3JpdGUgKQoJIHsKCQl2YXIgZGF0YVNyYyA9ICQuaXNQbGFpbk9iamVjdCggb1NldHRpbmdzLmFqYXggKSAmJiBvU2V0dGluZ3MuYWpheC5kYXRhU3JjICE9PSB1bmRlZmluZWQgPwoJCQlvU2V0dGluZ3MuYWpheC5kYXRhU3JjIDoKCQkJb1NldHRpbmdzLnNBamF4RGF0YVByb3A7IC8vIENvbXBhdGliaWxpdHkgd2l0aCAxLjktLgoJCgkJaWYgKCAhIHdyaXRlICkgewoJCQlpZiAoIGRhdGFTcmMgPT09ICdkYXRhJyApIHsKCQkJCS8vIElmIHRoZSBkZWZhdWx0LCB0aGVuIHdlIHN0aWxsIHdhbnQgdG8gc3VwcG9ydCB0aGUgb2xkIHN0eWxlLCBhbmQgc2FmZWx5IGlnbm9yZQoJCQkJLy8gaXQgaWYgcG9zc2libGUKCQkJCXJldHVybiBqc29uLmFhRGF0YSB8fCBqc29uW2RhdGFTcmNdOwoJCQl9CgkKCQkJcmV0dXJuIGRhdGFTcmMgIT09ICIiID8KCQkJCV9mbkdldE9iamVjdERhdGFGbiggZGF0YVNyYyApKCBqc29uICkgOgoJCQkJanNvbjsKCQl9CgkKCQkvLyBzZXQKCQlfZm5TZXRPYmplY3REYXRhRm4oIGRhdGFTcmMgKSgganNvbiwgd3JpdGUgKTsKCX0KCQoJLyoqCgkgKiBHZW5lcmF0ZSB0aGUgbm9kZSByZXF1aXJlZCBmb3IgZmlsdGVyaW5nIHRleHQKCSAqICBAcmV0dXJucyB7bm9kZX0gRmlsdGVyIGNvbnRyb2wgZWxlbWVudAoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuRmVhdHVyZUh0bWxGaWx0ZXIgKCBzZXR0aW5ncyApCgl7CgkJdmFyIGNsYXNzZXMgPSBzZXR0aW5ncy5vQ2xhc3NlczsKCQl2YXIgdGFibGVJZCA9IHNldHRpbmdzLnNUYWJsZUlkOwoJCXZhciBsYW5ndWFnZSA9IHNldHRpbmdzLm9MYW5ndWFnZTsKCQl2YXIgcHJldmlvdXNTZWFyY2ggPSBzZXR0aW5ncy5vUHJldmlvdXNTZWFyY2g7CgkJdmFyIGZlYXR1cmVzID0gc2V0dGluZ3MuYWFuRmVhdHVyZXM7CgkJdmFyIGlucHV0ID0gJzxpbnB1dCB0eXBlPSJzZWFyY2giIGNsYXNzPSInK2NsYXNzZXMuc0ZpbHRlcklucHV0KyciLz4nOwoJCgkJdmFyIHN0ciA9IGxhbmd1YWdlLnNTZWFyY2g7CgkJc3RyID0gc3RyLm1hdGNoKC9fSU5QVVRfLykgPwoJCQlzdHIucmVwbGFjZSgnX0lOUFVUXycsIGlucHV0KSA6CgkJCXN0citpbnB1dDsKCQoJCXZhciBmaWx0ZXIgPSAkKCc8ZGl2Lz4nLCB7CgkJCQknaWQnOiAhIGZlYXR1cmVzLmYgPyB0YWJsZUlkKydfZmlsdGVyJyA6IG51bGwsCgkJCQknY2xhc3MnOiBjbGFzc2VzLnNGaWx0ZXIKCQkJfSApCgkJCS5hcHBlbmQoICQoJzxsYWJlbC8+JyApLmFwcGVuZCggc3RyICkgKTsKCQoJCXZhciBzZWFyY2hGbiA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJCS8qIFVwZGF0ZSBhbGwgb3RoZXIgZmlsdGVyIGlucHV0IGVsZW1lbnRzIGZvciB0aGUgbmV3IGRpc3BsYXkgKi8KCQkJdmFyIG4gPSBmZWF0dXJlcy5mOwoJCQl2YXIgdmFsID0gIXRoaXMudmFsdWUgPyAiIiA6IHRoaXMudmFsdWU7IC8vIG1lbnRhbCBJRTggZml4IDotKAoJCQlpZihwcmV2aW91c1NlYXJjaC5yZXR1cm4gJiYgZXZlbnQua2V5ICE9PSAiRW50ZXIiKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJLyogTm93IGRvIHRoZSBmaWx0ZXIgKi8KCQkJaWYgKCB2YWwgIT0gcHJldmlvdXNTZWFyY2guc1NlYXJjaCApIHsKCQkJCV9mbkZpbHRlckNvbXBsZXRlKCBzZXR0aW5ncywgewoJCQkJCSJzU2VhcmNoIjogdmFsLAoJCQkJCSJiUmVnZXgiOiBwcmV2aW91c1NlYXJjaC5iUmVnZXgsCgkJCQkJImJTbWFydCI6IHByZXZpb3VzU2VhcmNoLmJTbWFydCAsCgkJCQkJImJDYXNlSW5zZW5zaXRpdmUiOiBwcmV2aW91c1NlYXJjaC5iQ2FzZUluc2Vuc2l0aXZlLAoJCQkJCSJyZXR1cm4iOiBwcmV2aW91c1NlYXJjaC5yZXR1cm4KCQkJCX0gKTsKCQoJCQkJLy8gTmVlZCB0byByZWRyYXcsIHdpdGhvdXQgcmVzb3J0aW5nCgkJCQlzZXR0aW5ncy5faURpc3BsYXlTdGFydCA9IDA7CgkJCQlfZm5EcmF3KCBzZXR0aW5ncyApOwoJCQl9CgkJfTsKCQoJCXZhciBzZWFyY2hEZWxheSA9IHNldHRpbmdzLnNlYXJjaERlbGF5ICE9PSBudWxsID8KCQkJc2V0dGluZ3Muc2VhcmNoRGVsYXkgOgoJCQlfZm5EYXRhU291cmNlKCBzZXR0aW5ncyApID09PSAnc3NwJyA/CgkJCQk0MDAgOgoJCQkJMDsKCQoJCXZhciBqcUZpbHRlciA9ICQoJ2lucHV0JywgZmlsdGVyKQoJCQkudmFsKCBwcmV2aW91c1NlYXJjaC5zU2VhcmNoICkKCQkJLmF0dHIoICdwbGFjZWhvbGRlcicsIGxhbmd1YWdlLnNTZWFyY2hQbGFjZWhvbGRlciApCgkJCS5vbigKCQkJCSdrZXl1cC5EVCBzZWFyY2guRFQgaW5wdXQuRFQgcGFzdGUuRFQgY3V0LkRUJywKCQkJCXNlYXJjaERlbGF5ID8KCQkJCQlfZm5UaHJvdHRsZSggc2VhcmNoRm4sIHNlYXJjaERlbGF5ICkgOgoJCQkJCXNlYXJjaEZuCgkJCSkKCQkJLm9uKCAnbW91c2V1cCcsIGZ1bmN0aW9uKGUpIHsKCQkJCS8vIEVkZ2UgZml4ISBFZGdlIDE3IGRvZXMgbm90IHRyaWdnZXIgYW55dGhpbmcgb3RoZXIgdGhhbiBtb3VzZSBldmVudHMgd2hlbiBjbGlja2luZwoJCQkJLy8gb24gdGhlIGNsZWFyIGljb24gKEVkZ2UgYnVnIDE3NTg0NTE1KS4gVGhpcyBpcyBzYWZlIGluIG90aGVyIGJyb3dzZXJzIGFzIGBzZWFyY2hGbmAKCQkJCS8vIGNoZWNrcyB0aGUgdmFsdWUgdG8gc2VlIGlmIGl0IGhhcyBjaGFuZ2VkLiBJbiBvdGhlciBicm93c2VycyBpdCB3b24ndCBoYXZlLgoJCQkJc2V0VGltZW91dCggZnVuY3Rpb24gKCkgewoJCQkJCXNlYXJjaEZuLmNhbGwoanFGaWx0ZXJbMF0sIGUpOwoJCQkJfSwgMTApOwoJCQl9ICkKCQkJLm9uKCAna2V5cHJlc3MuRFQnLCBmdW5jdGlvbihlKSB7CgkJCQkvKiBQcmV2ZW50IGZvcm0gc3VibWlzc2lvbiAqLwoJCQkJaWYgKCBlLmtleUNvZGUgPT0gMTMgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9ICkKCQkJLmF0dHIoJ2FyaWEtY29udHJvbHMnLCB0YWJsZUlkKTsKCQoJCS8vIFVwZGF0ZSB0aGUgaW5wdXQgZWxlbWVudHMgd2hlbmV2ZXIgdGhlIHRhYmxlIGlzIGZpbHRlcmVkCgkJJChzZXR0aW5ncy5uVGFibGUpLm9uKCAnc2VhcmNoLmR0LkRUJywgZnVuY3Rpb24gKCBldiwgcyApIHsKCQkJaWYgKCBzZXR0aW5ncyA9PT0gcyApIHsKCQkJCS8vIElFOSB0aHJvd3MgYW4gJ3Vua25vd24gZXJyb3InIGlmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaXMgdXNlZAoJCQkJLy8gaW5zaWRlIGFuIGlmcmFtZSBvciBmcmFtZS4uLgoJCQkJdHJ5IHsKCQkJCQlpZiAoIGpxRmlsdGVyWzBdICE9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICkgewoJCQkJCQlqcUZpbHRlci52YWwoIHByZXZpb3VzU2VhcmNoLnNTZWFyY2ggKTsKCQkJCQl9CgkJCQl9CgkJCQljYXRjaCAoIGUgKSB7fQoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIGZpbHRlclswXTsKCX0KCQoJCgkvKioKCSAqIEZpbHRlciB0aGUgdGFibGUgdXNpbmcgYm90aCB0aGUgZ2xvYmFsIGZpbHRlciBhbmQgY29sdW1uIGJhc2VkIGZpbHRlcmluZwoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge29iamVjdH0gb1NlYXJjaCBzZWFyY2ggaW5mb3JtYXRpb24KCSAqICBAcGFyYW0ge2ludH0gW2lGb3JjZV0gZm9yY2UgYSByZXNlYXJjaCBvZiB0aGUgbWFzdGVyIGFycmF5ICgxKSBvciBub3QgKHVuZGVmaW5lZCBvciAwKQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5GaWx0ZXJDb21wbGV0ZSAoIG9TZXR0aW5ncywgb0lucHV0LCBpRm9yY2UgKQoJewoJCXZhciBvUHJldlNlYXJjaCA9IG9TZXR0aW5ncy5vUHJldmlvdXNTZWFyY2g7CgkJdmFyIGFvUHJldlNlYXJjaCA9IG9TZXR0aW5ncy5hb1ByZVNlYXJjaENvbHM7CgkJdmFyIGZuU2F2ZUZpbHRlciA9IGZ1bmN0aW9uICggb0ZpbHRlciApIHsKCQkJLyogU2F2ZSB0aGUgZmlsdGVyaW5nIHZhbHVlcyAqLwoJCQlvUHJldlNlYXJjaC5zU2VhcmNoID0gb0ZpbHRlci5zU2VhcmNoOwoJCQlvUHJldlNlYXJjaC5iUmVnZXggPSBvRmlsdGVyLmJSZWdleDsKCQkJb1ByZXZTZWFyY2guYlNtYXJ0ID0gb0ZpbHRlci5iU21hcnQ7CgkJCW9QcmV2U2VhcmNoLmJDYXNlSW5zZW5zaXRpdmUgPSBvRmlsdGVyLmJDYXNlSW5zZW5zaXRpdmU7CgkJCW9QcmV2U2VhcmNoLnJldHVybiA9IG9GaWx0ZXIucmV0dXJuOwoJCX07CgkJdmFyIGZuUmVnZXggPSBmdW5jdGlvbiAoIG8gKSB7CgkJCS8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGJFc2NhcGVSZWdleCBvcHRpb24KCQkJcmV0dXJuIG8uYkVzY2FwZVJlZ2V4ICE9PSB1bmRlZmluZWQgPyAhby5iRXNjYXBlUmVnZXggOiBvLmJSZWdleDsKCQl9OwoJCgkJLy8gUmVzb2x2ZSBhbnkgY29sdW1uIHR5cGVzIHRoYXQgYXJlIHVua25vd24gZHVlIHRvIGFkZGl0aW9uIG9yIGludmFsaWRhdGlvbgoJCS8vIEB0b2RvIEFzIHBlciBzb3J0IC0gY2FuIHRoaXMgYmUgbW92ZWQgaW50byBhbiBldmVudCBoYW5kbGVyPwoJCV9mbkNvbHVtblR5cGVzKCBvU2V0dGluZ3MgKTsKCQoJCS8qIEluIHNlcnZlci1zaWRlIHByb2Nlc3NpbmcgYWxsIGZpbHRlcmluZyBpcyBkb25lIGJ5IHRoZSBzZXJ2ZXIsIHNvIG5vIHBvaW50IGhhbmdpbmcgYXJvdW5kIGhlcmUgKi8KCQlpZiAoIF9mbkRhdGFTb3VyY2UoIG9TZXR0aW5ncyApICE9ICdzc3AnICkKCQl7CgkJCS8qIEdsb2JhbCBmaWx0ZXIgKi8KCQkJX2ZuRmlsdGVyKCBvU2V0dGluZ3MsIG9JbnB1dC5zU2VhcmNoLCBpRm9yY2UsIGZuUmVnZXgob0lucHV0KSwgb0lucHV0LmJTbWFydCwgb0lucHV0LmJDYXNlSW5zZW5zaXRpdmUsIG9JbnB1dC5yZXR1cm4gKTsKCQkJZm5TYXZlRmlsdGVyKCBvSW5wdXQgKTsKCQoJCQkvKiBOb3cgZG8gdGhlIGluZGl2aWR1YWwgY29sdW1uIGZpbHRlciAqLwoJCQlmb3IgKCB2YXIgaT0wIDsgaTxhb1ByZXZTZWFyY2gubGVuZ3RoIDsgaSsrICkKCQkJewoJCQkJX2ZuRmlsdGVyQ29sdW1uKCBvU2V0dGluZ3MsIGFvUHJldlNlYXJjaFtpXS5zU2VhcmNoLCBpLCBmblJlZ2V4KGFvUHJldlNlYXJjaFtpXSksCgkJCQkJYW9QcmV2U2VhcmNoW2ldLmJTbWFydCwgYW9QcmV2U2VhcmNoW2ldLmJDYXNlSW5zZW5zaXRpdmUgKTsKCQkJfQoJCgkJCS8qIEN1c3RvbSBmaWx0ZXJpbmcgKi8KCQkJX2ZuRmlsdGVyQ3VzdG9tKCBvU2V0dGluZ3MgKTsKCQl9CgkJZWxzZQoJCXsKCQkJZm5TYXZlRmlsdGVyKCBvSW5wdXQgKTsKCQl9CgkKCQkvKiBUZWxsIHRoZSBkcmF3IGZ1bmN0aW9uIHdlIGhhdmUgYmVlbiBmaWx0ZXJpbmcgKi8KCQlvU2V0dGluZ3MuYkZpbHRlcmVkID0gdHJ1ZTsKCQlfZm5DYWxsYmFja0ZpcmUoIG9TZXR0aW5ncywgbnVsbCwgJ3NlYXJjaCcsIFtvU2V0dGluZ3NdICk7Cgl9CgkKCQoJLyoqCgkgKiBBcHBseSBjdXN0b20gZmlsdGVyaW5nIGZ1bmN0aW9ucwoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuRmlsdGVyQ3VzdG9tKCBzZXR0aW5ncyApCgl7CgkJdmFyIGZpbHRlcnMgPSBEYXRhVGFibGUuZXh0LnNlYXJjaDsKCQl2YXIgZGlzcGxheVJvd3MgPSBzZXR0aW5ncy5haURpc3BsYXk7CgkJdmFyIHJvdywgcm93SWR4OwoJCgkJZm9yICggdmFyIGk9MCwgaWVuPWZpbHRlcnMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCXZhciByb3dzID0gW107CgkKCQkJLy8gTG9vcCBvdmVyIGVhY2ggcm93IGFuZCBzZWUgaWYgaXQgc2hvdWxkIGJlIGluY2x1ZGVkCgkJCWZvciAoIHZhciBqPTAsIGplbj1kaXNwbGF5Um93cy5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCXJvd0lkeCA9IGRpc3BsYXlSb3dzWyBqIF07CgkJCQlyb3cgPSBzZXR0aW5ncy5hb0RhdGFbIHJvd0lkeCBdOwoJCgkJCQlpZiAoIGZpbHRlcnNbaV0oIHNldHRpbmdzLCByb3cuX2FGaWx0ZXJEYXRhLCByb3dJZHgsIHJvdy5fYURhdGEsIGogKSApIHsKCQkJCQlyb3dzLnB1c2goIHJvd0lkeCApOwoJCQkJfQoJCQl9CgkKCQkJLy8gU28gdGhlIGFycmF5IHJlZmVyZW5jZSBkb2Vzbid0IGJyZWFrIHNldCB0aGUgcmVzdWx0cyBpbnRvIHRoZQoJCQkvLyBleGlzdGluZyBhcnJheQoJCQlkaXNwbGF5Um93cy5sZW5ndGggPSAwOwoJCQkkLm1lcmdlKCBkaXNwbGF5Um93cywgcm93cyApOwoJCX0KCX0KCQoJCgkvKioKCSAqIEZpbHRlciB0aGUgdGFibGUgb24gYSBwZXItY29sdW1uIGJhc2lzCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7c3RyaW5nfSBzSW5wdXQgc3RyaW5nIHRvIGZpbHRlciBvbgoJICogIEBwYXJhbSB7aW50fSBpQ29sdW1uIGNvbHVtbiB0byBmaWx0ZXIKCSAqICBAcGFyYW0ge2Jvb2x9IGJSZWdleCB0cmVhdCBzZWFyY2ggc3RyaW5nIGFzIGEgcmVndWxhciBleHByZXNzaW9uIG9yIG5vdAoJICogIEBwYXJhbSB7Ym9vbH0gYlNtYXJ0IHVzZSBzbWFydCBmaWx0ZXJpbmcgb3Igbm90CgkgKiAgQHBhcmFtIHtib29sfSBiQ2FzZUluc2Vuc2l0aXZlIERvIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hpbmcgb3Igbm90CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkZpbHRlckNvbHVtbiAoIHNldHRpbmdzLCBzZWFyY2hTdHIsIGNvbElkeCwgcmVnZXgsIHNtYXJ0LCBjYXNlSW5zZW5zaXRpdmUgKQoJewoJCWlmICggc2VhcmNoU3RyID09PSAnJyApIHsKCQkJcmV0dXJuOwoJCX0KCQoJCXZhciBkYXRhOwoJCXZhciBvdXQgPSBbXTsKCQl2YXIgZGlzcGxheSA9IHNldHRpbmdzLmFpRGlzcGxheTsKCQl2YXIgcnBTZWFyY2ggPSBfZm5GaWx0ZXJDcmVhdGVTZWFyY2goIHNlYXJjaFN0ciwgcmVnZXgsIHNtYXJ0LCBjYXNlSW5zZW5zaXRpdmUgKTsKCQoJCWZvciAoIHZhciBpPTAgOyBpPGRpc3BsYXkubGVuZ3RoIDsgaSsrICkgewoJCQlkYXRhID0gc2V0dGluZ3MuYW9EYXRhWyBkaXNwbGF5W2ldIF0uX2FGaWx0ZXJEYXRhWyBjb2xJZHggXTsKCQoJCQlpZiAoIHJwU2VhcmNoLnRlc3QoIGRhdGEgKSApIHsKCQkJCW91dC5wdXNoKCBkaXNwbGF5W2ldICk7CgkJCX0KCQl9CgkKCQlzZXR0aW5ncy5haURpc3BsYXkgPSBvdXQ7Cgl9CgkKCQoJLyoqCgkgKiBGaWx0ZXIgdGhlIGRhdGEgdGFibGUgYmFzZWQgb24gdXNlciBpbnB1dCBhbmQgZHJhdyB0aGUgdGFibGUKCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge3N0cmluZ30gaW5wdXQgc3RyaW5nIHRvIGZpbHRlciBvbgoJICogIEBwYXJhbSB7aW50fSBmb3JjZSBvcHRpb25hbCAtIGZvcmNlIGEgcmVzZWFyY2ggb2YgdGhlIG1hc3RlciBhcnJheSAoMSkgb3Igbm90ICh1bmRlZmluZWQgb3IgMCkKCSAqICBAcGFyYW0ge2Jvb2x9IHJlZ2V4IHRyZWF0IGFzIGEgcmVndWxhciBleHByZXNzaW9uIG9yIG5vdAoJICogIEBwYXJhbSB7Ym9vbH0gc21hcnQgcGVyZm9ybSBzbWFydCBmaWx0ZXJpbmcgb3Igbm90CgkgKiAgQHBhcmFtIHtib29sfSBjYXNlSW5zZW5zaXRpdmUgRG8gY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaGluZyBvciBub3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuRmlsdGVyKCBzZXR0aW5ncywgaW5wdXQsIGZvcmNlLCByZWdleCwgc21hcnQsIGNhc2VJbnNlbnNpdGl2ZSApCgl7CgkJdmFyIHJwU2VhcmNoID0gX2ZuRmlsdGVyQ3JlYXRlU2VhcmNoKCBpbnB1dCwgcmVnZXgsIHNtYXJ0LCBjYXNlSW5zZW5zaXRpdmUgKTsKCQl2YXIgcHJldlNlYXJjaCA9IHNldHRpbmdzLm9QcmV2aW91c1NlYXJjaC5zU2VhcmNoOwoJCXZhciBkaXNwbGF5TWFzdGVyID0gc2V0dGluZ3MuYWlEaXNwbGF5TWFzdGVyOwoJCXZhciBkaXNwbGF5LCBpbnZhbGlkYXRlZCwgaTsKCQl2YXIgZmlsdGVyZWQgPSBbXTsKCQoJCS8vIE5lZWQgdG8gdGFrZSBhY2NvdW50IG9mIGN1c3RvbSBmaWx0ZXJpbmcgZnVuY3Rpb25zIC0gYWx3YXlzIGZpbHRlcgoJCWlmICggRGF0YVRhYmxlLmV4dC5zZWFyY2gubGVuZ3RoICE9PSAwICkgewoJCQlmb3JjZSA9IHRydWU7CgkJfQoJCgkJLy8gQ2hlY2sgaWYgYW55IG9mIHRoZSByb3dzIHdlcmUgaW52YWxpZGF0ZWQKCQlpbnZhbGlkYXRlZCA9IF9mbkZpbHRlckRhdGEoIHNldHRpbmdzICk7CgkKCQkvLyBJZiB0aGUgaW5wdXQgaXMgYmxhbmsgLSB3ZSBqdXN0IHdhbnQgdGhlIGZ1bGwgZGF0YSBzZXQKCQlpZiAoIGlucHV0Lmxlbmd0aCA8PSAwICkgewoJCQlzZXR0aW5ncy5haURpc3BsYXkgPSBkaXNwbGF5TWFzdGVyLnNsaWNlKCk7CgkJfQoJCWVsc2UgewoJCQkvLyBOZXcgc2VhcmNoIC0gc3RhcnQgZnJvbSB0aGUgbWFzdGVyIGFycmF5CgkJCWlmICggaW52YWxpZGF0ZWQgfHwKCQkJCSBmb3JjZSB8fAoJCQkJIHJlZ2V4IHx8CgkJCQkgcHJldlNlYXJjaC5sZW5ndGggPiBpbnB1dC5sZW5ndGggfHwKCQkJCSBpbnB1dC5pbmRleE9mKHByZXZTZWFyY2gpICE9PSAwIHx8CgkJCQkgc2V0dGluZ3MuYlNvcnRlZCAvLyBPbiByZXNvcnQsIHRoZSBkaXNwbGF5IG1hc3RlciBuZWVkcyB0byBiZQoJCQkJICAgICAgICAgICAgICAgICAgLy8gcmUtZmlsdGVyZWQgc2luY2UgaW5kZXhlcyB3aWxsIGhhdmUgY2hhbmdlZAoJCQkpIHsKCQkJCXNldHRpbmdzLmFpRGlzcGxheSA9IGRpc3BsYXlNYXN0ZXIuc2xpY2UoKTsKCQkJfQoJCgkJCS8vIFNlYXJjaCB0aGUgZGlzcGxheSBhcnJheQoJCQlkaXNwbGF5ID0gc2V0dGluZ3MuYWlEaXNwbGF5OwoJCgkJCWZvciAoIGk9MCA7IGk8ZGlzcGxheS5sZW5ndGggOyBpKysgKSB7CgkJCQlpZiAoIHJwU2VhcmNoLnRlc3QoIHNldHRpbmdzLmFvRGF0YVsgZGlzcGxheVtpXSBdLl9zRmlsdGVyUm93ICkgKSB7CgkJCQkJZmlsdGVyZWQucHVzaCggZGlzcGxheVtpXSApOwoJCQkJfQoJCQl9CgkKCQkJc2V0dGluZ3MuYWlEaXNwbGF5ID0gZmlsdGVyZWQ7CgkJfQoJfQoJCgkKCS8qKgoJICogQnVpbGQgYSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0IHN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYSB0YWJsZQoJICogIEBwYXJhbSB7c3RyaW5nfSBzU2VhcmNoIHN0cmluZyB0byBzZWFyY2ggZm9yCgkgKiAgQHBhcmFtIHtib29sfSBiUmVnZXggdHJlYXQgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gb3Igbm90CgkgKiAgQHBhcmFtIHtib29sfSBiU21hcnQgcGVyZm9ybSBzbWFydCBmaWx0ZXJpbmcgb3Igbm90CgkgKiAgQHBhcmFtIHtib29sfSBiQ2FzZUluc2Vuc2l0aXZlIERvIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hpbmcgb3Igbm90CgkgKiAgQHJldHVybnMge1JlZ0V4cH0gY29uc3RydWN0ZWQgb2JqZWN0CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkZpbHRlckNyZWF0ZVNlYXJjaCggc2VhcmNoLCByZWdleCwgc21hcnQsIGNhc2VJbnNlbnNpdGl2ZSApCgl7CgkJc2VhcmNoID0gcmVnZXggPwoJCQlzZWFyY2ggOgoJCQlfZm5Fc2NhcGVSZWdleCggc2VhcmNoICk7CgkJCgkJaWYgKCBzbWFydCApIHsKCQkJLyogRm9yIHNtYXJ0IGZpbHRlcmluZyB3ZSB3YW50IHRvIGFsbG93IHRoZSBzZWFyY2ggdG8gd29yayByZWdhcmRsZXNzIG9mCgkJCSAqIHdvcmQgb3JkZXIuIFdlIGFsc28gd2FudCBkb3VibGUgcXVvdGVkIHRleHQgdG8gYmUgcHJlc2VydmVkLCBzbyB3b3JkCgkJCSAqIG9yZGVyIGlzIGltcG9ydGFudCAtIGEgbGEgZ29vZ2xlLiBTbyB0aGlzIGlzIHdoYXQgd2Ugd2FudCB0bwoJCQkgKiBnZW5lcmF0ZToKCQkJICogCgkJCSAqIF4oPz0uKj9cYm9uZVxiKSg/PS4qP1xidHdvIHRocmVlXGIpKD89Lio/XGJmb3VyXGIpLiokCgkJCSAqLwoJCQl2YXIgYSA9ICQubWFwKCBzZWFyY2gubWF0Y2goIC8iW14iXSsifFteIF0rL2cgKSB8fCBbJyddLCBmdW5jdGlvbiAoIHdvcmQgKSB7CgkJCQlpZiAoIHdvcmQuY2hhckF0KDApID09PSAnIicgKSB7CgkJCQkJdmFyIG0gPSB3b3JkLm1hdGNoKCAvXiIoLiopIiQvICk7CgkJCQkJd29yZCA9IG0gPyBtWzFdIDogd29yZDsKCQkJCX0KCQoJCQkJcmV0dXJuIHdvcmQucmVwbGFjZSgnIicsICcnKTsKCQkJfSApOwoJCgkJCXNlYXJjaCA9ICdeKD89Lio/JythLmpvaW4oICcpKD89Lio/JyApKycpLiokJzsKCQl9CgkKCQlyZXR1cm4gbmV3IFJlZ0V4cCggc2VhcmNoLCBjYXNlSW5zZW5zaXRpdmUgPyAnaScgOiAnJyApOwoJfQoJCgkKCS8qKgoJICogRXNjYXBlIGEgc3RyaW5nIHN1Y2ggdGhhdCBpdCBjYW4gYmUgdXNlZCBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbgoJICogIEBwYXJhbSB7c3RyaW5nfSBzVmFsIHN0cmluZyB0byBlc2NhcGUKCSAqICBAcmV0dXJucyB7c3RyaW5nfSBlc2NhcGVkIHN0cmluZwoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCgl2YXIgX2ZuRXNjYXBlUmVnZXggPSBEYXRhVGFibGUudXRpbC5lc2NhcGVSZWdleDsKCQoJdmFyIF9fZmlsdGVyX2RpdiA9ICQoJzxkaXY+JylbMF07Cgl2YXIgX19maWx0ZXJfZGl2X3RleHRDb250ZW50ID0gX19maWx0ZXJfZGl2LnRleHRDb250ZW50ICE9PSB1bmRlZmluZWQ7CgkKCS8vIFVwZGF0ZSB0aGUgZmlsdGVyaW5nIGRhdGEgZm9yIGVhY2ggcm93IGlmIG5lZWRlZCAoYnkgaW52YWxpZGF0aW9uIG9yIGZpcnN0IHJ1bikKCWZ1bmN0aW9uIF9mbkZpbHRlckRhdGEgKCBzZXR0aW5ncyApCgl7CgkJdmFyIGNvbHVtbnMgPSBzZXR0aW5ncy5hb0NvbHVtbnM7CgkJdmFyIGNvbHVtbjsKCQl2YXIgaSwgaiwgaWVuLCBqZW4sIGZpbHRlckRhdGEsIGNlbGxEYXRhLCByb3c7CgkJdmFyIHdhc0ludmFsaWRhdGVkID0gZmFsc2U7CgkKCQlmb3IgKCBpPTAsIGllbj1zZXR0aW5ncy5hb0RhdGEubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCXJvdyA9IHNldHRpbmdzLmFvRGF0YVtpXTsKCQoJCQlpZiAoICEgcm93Ll9hRmlsdGVyRGF0YSApIHsKCQkJCWZpbHRlckRhdGEgPSBbXTsKCQoJCQkJZm9yICggaj0wLCBqZW49Y29sdW1ucy5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCQljb2x1bW4gPSBjb2x1bW5zW2pdOwoJCgkJCQkJaWYgKCBjb2x1bW4uYlNlYXJjaGFibGUgKSB7CgkJCQkJCWNlbGxEYXRhID0gX2ZuR2V0Q2VsbERhdGEoIHNldHRpbmdzLCBpLCBqLCAnZmlsdGVyJyApOwoJCgkJCQkJCS8vIFNlYXJjaCBpbiBEYXRhVGFibGVzIDEuMTAgaXMgc3RyaW5nIGJhc2VkLiBJbiAxLjExIHRoaXMKCQkJCQkJLy8gc2hvdWxkIGJlIGFsdGVyZWQgdG8gYWxzbyBhbGxvdyBzdHJpY3QgdHlwZSBjaGVja2luZy4KCQkJCQkJaWYgKCBjZWxsRGF0YSA9PT0gbnVsbCApIHsKCQkJCQkJCWNlbGxEYXRhID0gJyc7CgkJCQkJCX0KCQoJCQkJCQlpZiAoIHR5cGVvZiBjZWxsRGF0YSAhPT0gJ3N0cmluZycgJiYgY2VsbERhdGEudG9TdHJpbmcgKSB7CgkJCQkJCQljZWxsRGF0YSA9IGNlbGxEYXRhLnRvU3RyaW5nKCk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCWNlbGxEYXRhID0gJyc7CgkJCQkJfQoJCgkJCQkJLy8gSWYgaXQgbG9va3MgbGlrZSB0aGVyZSBpcyBhbiBIVE1MIGVudGl0eSBpbiB0aGUgc3RyaW5nLAoJCQkJCS8vIGF0dGVtcHQgdG8gZGVjb2RlIGl0IHNvIHNvcnRpbmcgd29ya3MgYXMgZXhwZWN0ZWQuIE5vdGUgdGhhdAoJCQkJCS8vIHdlIGNvdWxkIHVzZSBhIHNpbmdsZSBsaW5lIG9mIGpRdWVyeSB0byBkbyB0aGlzLCBidXQgdGhlIERPTQoJCQkJCS8vIG1ldGhvZCB1c2VkIGhlcmUgaXMgbXVjaCBmYXN0ZXIgaHR0cDovL2pzcGVyZi5jb20vaHRtbC1kZWNvZGUKCQkJCQlpZiAoIGNlbGxEYXRhLmluZGV4T2YgJiYgY2VsbERhdGEuaW5kZXhPZignJicpICE9PSAtMSApIHsKCQkJCQkJX19maWx0ZXJfZGl2LmlubmVySFRNTCA9IGNlbGxEYXRhOwoJCQkJCQljZWxsRGF0YSA9IF9fZmlsdGVyX2Rpdl90ZXh0Q29udGVudCA/CgkJCQkJCQlfX2ZpbHRlcl9kaXYudGV4dENvbnRlbnQgOgoJCQkJCQkJX19maWx0ZXJfZGl2LmlubmVyVGV4dDsKCQkJCQl9CgkKCQkJCQlpZiAoIGNlbGxEYXRhLnJlcGxhY2UgKSB7CgkJCQkJCWNlbGxEYXRhID0gY2VsbERhdGEucmVwbGFjZSgvW1xyXG5cdTIwMjhdL2csICcnKTsKCQkJCQl9CgkKCQkJCQlmaWx0ZXJEYXRhLnB1c2goIGNlbGxEYXRhICk7CgkJCQl9CgkKCQkJCXJvdy5fYUZpbHRlckRhdGEgPSBmaWx0ZXJEYXRhOwoJCQkJcm93Ll9zRmlsdGVyUm93ID0gZmlsdGVyRGF0YS5qb2luKCcgICcpOwoJCQkJd2FzSW52YWxpZGF0ZWQgPSB0cnVlOwoJCQl9CgkJfQoJCgkJcmV0dXJuIHdhc0ludmFsaWRhdGVkOwoJfQoJCgkKCS8qKgoJICogQ29udmVydCBmcm9tIHRoZSBpbnRlcm5hbCBIdW5nYXJpYW4gbm90YXRpb24gdG8gY2FtZWxDYXNlIGZvciBleHRlcm5hbAoJICogaW50ZXJhY3Rpb24KCSAqICBAcGFyYW0ge29iamVjdH0gb2JqIE9iamVjdCB0byBjb252ZXJ0CgkgKiAgQHJldHVybnMge29iamVjdH0gSW52ZXJ0ZWQgb2JqZWN0CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNlYXJjaFRvQ2FtZWwgKCBvYmogKQoJewoJCXJldHVybiB7CgkJCXNlYXJjaDogICAgICAgICAgb2JqLnNTZWFyY2gsCgkJCXNtYXJ0OiAgICAgICAgICAgb2JqLmJTbWFydCwKCQkJcmVnZXg6ICAgICAgICAgICBvYmouYlJlZ2V4LAoJCQljYXNlSW5zZW5zaXRpdmU6IG9iai5iQ2FzZUluc2Vuc2l0aXZlCgkJfTsKCX0KCQoJCgkKCS8qKgoJICogQ29udmVydCBmcm9tIGNhbWVsQ2FzZSBub3RhdGlvbiB0byB0aGUgaW50ZXJuYWwgSHVuZ2FyaWFuLiBXZSBjb3VsZCB1c2UgdGhlCgkgKiBIdW5nYXJpYW4gY29udmVydCBmdW5jdGlvbiBoZXJlLCBidXQgdGhpcyBpcyBjbGVhbmVyCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9iaiBPYmplY3QgdG8gY29udmVydAoJICogIEByZXR1cm5zIHtvYmplY3R9IEludmVydGVkIG9iamVjdAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5TZWFyY2hUb0h1bmcgKCBvYmogKQoJewoJCXJldHVybiB7CgkJCXNTZWFyY2g6ICAgICAgICAgIG9iai5zZWFyY2gsCgkJCWJTbWFydDogICAgICAgICAgIG9iai5zbWFydCwKCQkJYlJlZ2V4OiAgICAgICAgICAgb2JqLnJlZ2V4LAoJCQliQ2FzZUluc2Vuc2l0aXZlOiBvYmouY2FzZUluc2Vuc2l0aXZlCgkJfTsKCX0KCQoJLyoqCgkgKiBHZW5lcmF0ZSB0aGUgbm9kZSByZXF1aXJlZCBmb3IgdGhlIGluZm8gZGlzcGxheQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcmV0dXJucyB7bm9kZX0gSW5mb3JtYXRpb24gZWxlbWVudAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5GZWF0dXJlSHRtbEluZm8gKCBzZXR0aW5ncyApCgl7CgkJdmFyCgkJCXRpZCA9IHNldHRpbmdzLnNUYWJsZUlkLAoJCQlub2RlcyA9IHNldHRpbmdzLmFhbkZlYXR1cmVzLmksCgkJCW4gPSAkKCc8ZGl2Lz4nLCB7CgkJCQknY2xhc3MnOiBzZXR0aW5ncy5vQ2xhc3Nlcy5zSW5mbywKCQkJCSdpZCc6ICEgbm9kZXMgPyB0aWQrJ19pbmZvJyA6IG51bGwKCQkJfSApOwoJCgkJaWYgKCAhIG5vZGVzICkgewoJCQkvLyBVcGRhdGUgZGlzcGxheSBvbiBlYWNoIGRyYXcKCQkJc2V0dGluZ3MuYW9EcmF3Q2FsbGJhY2sucHVzaCggewoJCQkJImZuIjogX2ZuVXBkYXRlSW5mbywKCQkJCSJzTmFtZSI6ICJpbmZvcm1hdGlvbiIKCQkJfSApOwoJCgkJCW4KCQkJCS5hdHRyKCAncm9sZScsICdzdGF0dXMnICkKCQkJCS5hdHRyKCAnYXJpYS1saXZlJywgJ3BvbGl0ZScgKTsKCQoJCQkvLyBUYWJsZSBpcyBkZXNjcmliZWQgYnkgb3VyIGluZm8gZGl2CgkJCSQoc2V0dGluZ3MublRhYmxlKS5hdHRyKCAnYXJpYS1kZXNjcmliZWRieScsIHRpZCsnX2luZm8nICk7CgkJfQoJCgkJcmV0dXJuIG5bMF07Cgl9CgkKCQoJLyoqCgkgKiBVcGRhdGUgdGhlIGluZm9ybWF0aW9uIGVsZW1lbnRzIGluIHRoZSBkaXNwbGF5CgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblVwZGF0ZUluZm8gKCBzZXR0aW5ncyApCgl7CgkJLyogU2hvdyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFibGUgKi8KCQl2YXIgbm9kZXMgPSBzZXR0aW5ncy5hYW5GZWF0dXJlcy5pOwoJCWlmICggbm9kZXMubGVuZ3RoID09PSAwICkgewoJCQlyZXR1cm47CgkJfQoJCgkJdmFyCgkJCWxhbmcgID0gc2V0dGluZ3Mub0xhbmd1YWdlLAoJCQlzdGFydCA9IHNldHRpbmdzLl9pRGlzcGxheVN0YXJ0KzEsCgkJCWVuZCAgID0gc2V0dGluZ3MuZm5EaXNwbGF5RW5kKCksCgkJCW1heCAgID0gc2V0dGluZ3MuZm5SZWNvcmRzVG90YWwoKSwKCQkJdG90YWwgPSBzZXR0aW5ncy5mblJlY29yZHNEaXNwbGF5KCksCgkJCW91dCAgID0gdG90YWwgPwoJCQkJbGFuZy5zSW5mbyA6CgkJCQlsYW5nLnNJbmZvRW1wdHk7CgkKCQlpZiAoIHRvdGFsICE9PSBtYXggKSB7CgkJCS8qIFJlY29yZCBzZXQgYWZ0ZXIgZmlsdGVyaW5nICovCgkJCW91dCArPSAnICcgKyBsYW5nLnNJbmZvRmlsdGVyZWQ7CgkJfQoJCgkJLy8gQ29udmVydCB0aGUgbWFjcm9zCgkJb3V0ICs9IGxhbmcuc0luZm9Qb3N0Rml4OwoJCW91dCA9IF9mbkluZm9NYWNyb3MoIHNldHRpbmdzLCBvdXQgKTsKCQoJCXZhciBjYWxsYmFjayA9IGxhbmcuZm5JbmZvQ2FsbGJhY2s7CgkJaWYgKCBjYWxsYmFjayAhPT0gbnVsbCApIHsKCQkJb3V0ID0gY2FsbGJhY2suY2FsbCggc2V0dGluZ3Mub0luc3RhbmNlLAoJCQkJc2V0dGluZ3MsIHN0YXJ0LCBlbmQsIG1heCwgdG90YWwsIG91dAoJCQkpOwoJCX0KCQoJCSQobm9kZXMpLmh0bWwoIG91dCApOwoJfQoJCgkKCWZ1bmN0aW9uIF9mbkluZm9NYWNyb3MgKCBzZXR0aW5ncywgc3RyICkKCXsKCQkvLyBXaGVuIGluZmluaXRlIHNjcm9sbGluZywgd2UgYXJlIGFsd2F5cyBzdGFydGluZyBhdCAxLiBfaURpc3BsYXlTdGFydCBpcyB1c2VkIG9ubHkKCQkvLyBpbnRlcm5hbGx5CgkJdmFyCgkJCWZvcm1hdHRlciAgPSBzZXR0aW5ncy5mbkZvcm1hdE51bWJlciwKCQkJc3RhcnQgICAgICA9IHNldHRpbmdzLl9pRGlzcGxheVN0YXJ0KzEsCgkJCWxlbiAgICAgICAgPSBzZXR0aW5ncy5faURpc3BsYXlMZW5ndGgsCgkJCXZpcyAgICAgICAgPSBzZXR0aW5ncy5mblJlY29yZHNEaXNwbGF5KCksCgkJCWFsbCAgICAgICAgPSBsZW4gPT09IC0xOwoJCgkJcmV0dXJuIHN0ci4KCQkJcmVwbGFjZSgvX1NUQVJUXy9nLCBmb3JtYXR0ZXIuY2FsbCggc2V0dGluZ3MsIHN0YXJ0ICkgKS4KCQkJcmVwbGFjZSgvX0VORF8vZywgICBmb3JtYXR0ZXIuY2FsbCggc2V0dGluZ3MsIHNldHRpbmdzLmZuRGlzcGxheUVuZCgpICkgKS4KCQkJcmVwbGFjZSgvX01BWF8vZywgICBmb3JtYXR0ZXIuY2FsbCggc2V0dGluZ3MsIHNldHRpbmdzLmZuUmVjb3Jkc1RvdGFsKCkgKSApLgoJCQlyZXBsYWNlKC9fVE9UQUxfL2csIGZvcm1hdHRlci5jYWxsKCBzZXR0aW5ncywgdmlzICkgKS4KCQkJcmVwbGFjZSgvX1BBR0VfL2csICBmb3JtYXR0ZXIuY2FsbCggc2V0dGluZ3MsIGFsbCA/IDEgOiBNYXRoLmNlaWwoIHN0YXJ0IC8gbGVuICkgKSApLgoJCQlyZXBsYWNlKC9fUEFHRVNfL2csIGZvcm1hdHRlci5jYWxsKCBzZXR0aW5ncywgYWxsID8gMSA6IE1hdGguY2VpbCggdmlzIC8gbGVuICkgKSApOwoJfQoJCgkKCQoJLyoqCgkgKiBEcmF3IHRoZSB0YWJsZSBmb3IgdGhlIGZpcnN0IHRpbWUsIGFkZGluZyBhbGwgcmVxdWlyZWQgZmVhdHVyZXMKCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuSW5pdGlhbGlzZSAoIHNldHRpbmdzICkKCXsKCQl2YXIgaSwgaUxlbiwgaUFqYXhTdGFydD1zZXR0aW5ncy5pSW5pdERpc3BsYXlTdGFydDsKCQl2YXIgY29sdW1ucyA9IHNldHRpbmdzLmFvQ29sdW1ucywgY29sdW1uOwoJCXZhciBmZWF0dXJlcyA9IHNldHRpbmdzLm9GZWF0dXJlczsKCQl2YXIgZGVmZXJMb2FkaW5nID0gc2V0dGluZ3MuYkRlZmVyTG9hZGluZzsgLy8gdmFsdWUgbW9kaWZpZWQgYnkgdGhlIGRyYXcKCQoJCS8qIEVuc3VyZSB0aGF0IHRoZSB0YWJsZSBkYXRhIGlzIGZ1bGx5IGluaXRpYWxpc2VkICovCgkJaWYgKCAhIHNldHRpbmdzLmJJbml0aWFsaXNlZCApIHsKCQkJc2V0VGltZW91dCggZnVuY3Rpb24oKXsgX2ZuSW5pdGlhbGlzZSggc2V0dGluZ3MgKTsgfSwgMjAwICk7CgkJCXJldHVybjsKCQl9CgkKCQkvKiBTaG93IHRoZSBkaXNwbGF5IEhUTUwgb3B0aW9ucyAqLwoJCV9mbkFkZE9wdGlvbnNIdG1sKCBzZXR0aW5ncyApOwoJCgkJLyogQnVpbGQgYW5kIGRyYXcgdGhlIGhlYWRlciAvIGZvb3RlciBmb3IgdGhlIHRhYmxlICovCgkJX2ZuQnVpbGRIZWFkKCBzZXR0aW5ncyApOwoJCV9mbkRyYXdIZWFkKCBzZXR0aW5ncywgc2V0dGluZ3MuYW9IZWFkZXIgKTsKCQlfZm5EcmF3SGVhZCggc2V0dGluZ3MsIHNldHRpbmdzLmFvRm9vdGVyICk7CgkKCQkvKiBPa2F5IHRvIHNob3cgdGhhdCBzb21ldGhpbmcgaXMgZ29pbmcgb24gbm93ICovCgkJX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIHNldHRpbmdzLCB0cnVlICk7CgkKCQkvKiBDYWxjdWxhdGUgc2l6ZXMgZm9yIGNvbHVtbnMgKi8KCQlpZiAoIGZlYXR1cmVzLmJBdXRvV2lkdGggKSB7CgkJCV9mbkNhbGN1bGF0ZUNvbHVtbldpZHRocyggc2V0dGluZ3MgKTsKCQl9CgkKCQlmb3IgKCBpPTAsIGlMZW49Y29sdW1ucy5sZW5ndGggOyBpPGlMZW4gOyBpKysgKSB7CgkJCWNvbHVtbiA9IGNvbHVtbnNbaV07CgkKCQkJaWYgKCBjb2x1bW4uc1dpZHRoICkgewoJCQkJY29sdW1uLm5UaC5zdHlsZS53aWR0aCA9IF9mblN0cmluZ1RvQ3NzKCBjb2x1bW4uc1dpZHRoICk7CgkJCX0KCQl9CgkKCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCBudWxsLCAncHJlSW5pdCcsIFtzZXR0aW5nc10gKTsKCQoJCS8vIElmIHRoZXJlIGlzIGRlZmF1bHQgc29ydGluZyByZXF1aXJlZCAtIGxldCdzIGRvIGl0LiBUaGUgc29ydCBmdW5jdGlvbgoJCS8vIHdpbGwgZG8gdGhlIGRyYXdpbmcgZm9yIHVzLiBPdGhlcndpc2Ugd2UgZHJhdyB0aGUgdGFibGUgcmVnYXJkbGVzcyBvZiB0aGUKCQkvLyBBamF4IHNvdXJjZSAtIHRoaXMgYWxsb3dzIHRoZSB0YWJsZSB0byBsb29rIGluaXRpYWxpc2VkIGZvciBBamF4IHNvdXJjaW5nCgkJLy8gZGF0YSAoc2hvdyAnbG9hZGluZycgbWVzc2FnZSBwb3NzaWJseSkKCQlfZm5SZURyYXcoIHNldHRpbmdzICk7CgkKCQkvLyBTZXJ2ZXItc2lkZSBwcm9jZXNzaW5nIGluaXQgY29tcGxldGUgaXMgZG9uZSBieSBfZm5BamF4VXBkYXRlRHJhdwoJCXZhciBkYXRhU3JjID0gX2ZuRGF0YVNvdXJjZSggc2V0dGluZ3MgKTsKCQlpZiAoIGRhdGFTcmMgIT0gJ3NzcCcgfHwgZGVmZXJMb2FkaW5nICkgewoJCQkvLyBpZiB0aGVyZSBpcyBhbiBhamF4IHNvdXJjZSBsb2FkIHRoZSBkYXRhCgkJCWlmICggZGF0YVNyYyA9PSAnYWpheCcgKSB7CgkJCQlfZm5CdWlsZEFqYXgoIHNldHRpbmdzLCBbXSwgZnVuY3Rpb24oanNvbikgewoJCQkJCXZhciBhRGF0YSA9IF9mbkFqYXhEYXRhU3JjKCBzZXR0aW5ncywganNvbiApOwoJCgkJCQkJLy8gR290IHRoZSBkYXRhIC0gYWRkIGl0IHRvIHRoZSB0YWJsZQoJCQkJCWZvciAoIGk9MCA7IGk8YURhdGEubGVuZ3RoIDsgaSsrICkgewoJCQkJCQlfZm5BZGREYXRhKCBzZXR0aW5ncywgYURhdGFbaV0gKTsKCQkJCQl9CgkKCQkJCQkvLyBSZXNldCB0aGUgaW5pdCBkaXNwbGF5IGZvciBjb29raWUgc2F2aW5nLiBXZSd2ZSBhbHJlYWR5IGRvbmUKCQkJCQkvLyBhIGZpbHRlciwgYW5kIHRoZXJlZm9yZSBjbGVhcmVkIGl0IGJlZm9yZS4gU28gd2UgbmVlZCB0byBtYWtlCgkJCQkJLy8gaXQgYXBwZWFyICdmcmVzaCcKCQkJCQlzZXR0aW5ncy5pSW5pdERpc3BsYXlTdGFydCA9IGlBamF4U3RhcnQ7CgkKCQkJCQlfZm5SZURyYXcoIHNldHRpbmdzICk7CgkKCQkJCQlfZm5Qcm9jZXNzaW5nRGlzcGxheSggc2V0dGluZ3MsIGZhbHNlICk7CgkJCQkJX2ZuSW5pdENvbXBsZXRlKCBzZXR0aW5ncywganNvbiApOwoJCQkJfSwgc2V0dGluZ3MgKTsKCQkJfQoJCQllbHNlIHsKCQkJCV9mblByb2Nlc3NpbmdEaXNwbGF5KCBzZXR0aW5ncywgZmFsc2UgKTsKCQkJCV9mbkluaXRDb21wbGV0ZSggc2V0dGluZ3MgKTsKCQkJfQoJCX0KCX0KCQoJCgkvKioKCSAqIERyYXcgdGhlIHRhYmxlIGZvciB0aGUgZmlyc3QgdGltZSwgYWRkaW5nIGFsbCByZXF1aXJlZCBmZWF0dXJlcwoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge29iamVjdH0gW2pzb25dIEpTT04gZnJvbSB0aGUgc2VydmVyIHRoYXQgY29tcGxldGVkIHRoZSB0YWJsZSwgaWYgdXNpbmcgQWpheCBzb3VyY2UKCSAqICAgIHdpdGggY2xpZW50LXNpZGUgcHJvY2Vzc2luZyAob3B0aW9uYWwpCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkluaXRDb21wbGV0ZSAoIHNldHRpbmdzLCBqc29uICkKCXsKCQlzZXR0aW5ncy5fYkluaXRDb21wbGV0ZSA9IHRydWU7CgkKCQkvLyBXaGVuIGRhdGEgd2FzIGFkZGVkIGFmdGVyIHRoZSBpbml0aWFsaXNhdGlvbiAoZGF0YSBvciBBamF4KSB3ZSBuZWVkIHRvCgkJLy8gY2FsY3VsYXRlIHRoZSBjb2x1bW4gc2l6aW5nCgkJaWYgKCBqc29uIHx8IHNldHRpbmdzLm9Jbml0LmFhRGF0YSApIHsKCQkJX2ZuQWRqdXN0Q29sdW1uU2l6aW5nKCBzZXR0aW5ncyApOwoJCX0KCQoJCV9mbkNhbGxiYWNrRmlyZSggc2V0dGluZ3MsIG51bGwsICdwbHVnaW4taW5pdCcsIFtzZXR0aW5ncywganNvbl0gKTsKCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCAnYW9Jbml0Q29tcGxldGUnLCAnaW5pdCcsIFtzZXR0aW5ncywganNvbl0gKTsKCX0KCQoJCglmdW5jdGlvbiBfZm5MZW5ndGhDaGFuZ2UgKCBzZXR0aW5ncywgdmFsICkKCXsKCQl2YXIgbGVuID0gcGFyc2VJbnQoIHZhbCwgMTAgKTsKCQlzZXR0aW5ncy5faURpc3BsYXlMZW5ndGggPSBsZW47CgkKCQlfZm5MZW5ndGhPdmVyZmxvdyggc2V0dGluZ3MgKTsKCQoJCS8vIEZpcmUgbGVuZ3RoIGNoYW5nZSBldmVudAoJCV9mbkNhbGxiYWNrRmlyZSggc2V0dGluZ3MsIG51bGwsICdsZW5ndGgnLCBbc2V0dGluZ3MsIGxlbl0gKTsKCX0KCQoJCgkvKioKCSAqIEdlbmVyYXRlIHRoZSBub2RlIHJlcXVpcmVkIGZvciB1c2VyIGRpc3BsYXkgbGVuZ3RoIGNoYW5naW5nCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHJldHVybnMge25vZGV9IERpc3BsYXkgbGVuZ3RoIGZlYXR1cmUgbm9kZQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5GZWF0dXJlSHRtbExlbmd0aCAoIHNldHRpbmdzICkKCXsKCQl2YXIKCQkJY2xhc3NlcyAgPSBzZXR0aW5ncy5vQ2xhc3NlcywKCQkJdGFibGVJZCAgPSBzZXR0aW5ncy5zVGFibGVJZCwKCQkJbWVudSAgICAgPSBzZXR0aW5ncy5hTGVuZ3RoTWVudSwKCQkJZDIgICAgICAgPSBBcnJheS5pc0FycmF5KCBtZW51WzBdICksCgkJCWxlbmd0aHMgID0gZDIgPyBtZW51WzBdIDogbWVudSwKCQkJbGFuZ3VhZ2UgPSBkMiA/IG1lbnVbMV0gOiBtZW51OwoJCgkJdmFyIHNlbGVjdCA9ICQoJzxzZWxlY3QvPicsIHsKCQkJJ25hbWUnOiAgICAgICAgICB0YWJsZUlkKydfbGVuZ3RoJywKCQkJJ2FyaWEtY29udHJvbHMnOiB0YWJsZUlkLAoJCQknY2xhc3MnOiAgICAgICAgIGNsYXNzZXMuc0xlbmd0aFNlbGVjdAoJCX0gKTsKCQoJCWZvciAoIHZhciBpPTAsIGllbj1sZW5ndGhzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQlzZWxlY3RbMF1bIGkgXSA9IG5ldyBPcHRpb24oCgkJCQl0eXBlb2YgbGFuZ3VhZ2VbaV0gPT09ICdudW1iZXInID8KCQkJCQlzZXR0aW5ncy5mbkZvcm1hdE51bWJlciggbGFuZ3VhZ2VbaV0gKSA6CgkJCQkJbGFuZ3VhZ2VbaV0sCgkJCQlsZW5ndGhzW2ldCgkJCSk7CgkJfQoJCgkJdmFyIGRpdiA9ICQoJzxkaXY+PGxhYmVsLz48L2Rpdj4nKS5hZGRDbGFzcyggY2xhc3Nlcy5zTGVuZ3RoICk7CgkJaWYgKCAhIHNldHRpbmdzLmFhbkZlYXR1cmVzLmwgKSB7CgkJCWRpdlswXS5pZCA9IHRhYmxlSWQrJ19sZW5ndGgnOwoJCX0KCQoJCWRpdi5jaGlsZHJlbigpLmFwcGVuZCgKCQkJc2V0dGluZ3Mub0xhbmd1YWdlLnNMZW5ndGhNZW51LnJlcGxhY2UoICdfTUVOVV8nLCBzZWxlY3RbMF0ub3V0ZXJIVE1MICkKCQkpOwoJCgkJLy8gQ2FuJ3QgdXNlIGBzZWxlY3RgIHZhcmlhYmxlIGFzIHVzZXIgbWlnaHQgcHJvdmlkZSB0aGVpciBvd24gYW5kIHRoZQoJCS8vIHJlZmVyZW5jZSBpcyBicm9rZW4gYnkgdGhlIHVzZSBvZiBvdXRlckhUTUwKCQkkKCdzZWxlY3QnLCBkaXYpCgkJCS52YWwoIHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCApCgkJCS5vbiggJ2NoYW5nZS5EVCcsIGZ1bmN0aW9uKGUpIHsKCQkJCV9mbkxlbmd0aENoYW5nZSggc2V0dGluZ3MsICQodGhpcykudmFsKCkgKTsKCQkJCV9mbkRyYXcoIHNldHRpbmdzICk7CgkJCX0gKTsKCQoJCS8vIFVwZGF0ZSBub2RlIHZhbHVlIHdoZW5ldmVyIGFueXRoaW5nIGNoYW5nZXMgdGhlIHRhYmxlJ3MgbGVuZ3RoCgkJJChzZXR0aW5ncy5uVGFibGUpLm9uKCAnbGVuZ3RoLmR0LkRUJywgZnVuY3Rpb24gKGUsIHMsIGxlbikgewoJCQlpZiAoIHNldHRpbmdzID09PSBzICkgewoJCQkJJCgnc2VsZWN0JywgZGl2KS52YWwoIGxlbiApOwoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIGRpdlswXTsKCX0KCQoJCgkKCS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqCgkgKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgcGFnaW5nIGxvZ2ljIGlzIGRvbmUgaW4KCSAqIERhdGFUYWJsZS5leHQucGFnZXIKCSAqLwoJCgkvKioKCSAqIEdlbmVyYXRlIHRoZSBub2RlIHJlcXVpcmVkIGZvciBkZWZhdWx0IHBhZ2luYXRpb24KCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHJldHVybnMge25vZGV9IFBhZ2luYXRpb24gZmVhdHVyZSBub2RlCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkZlYXR1cmVIdG1sUGFnaW5hdGUgKCBzZXR0aW5ncyApCgl7CgkJdmFyCgkJCXR5cGUgICA9IHNldHRpbmdzLnNQYWdpbmF0aW9uVHlwZSwKCQkJcGx1Z2luID0gRGF0YVRhYmxlLmV4dC5wYWdlclsgdHlwZSBdLAoJCQltb2Rlcm4gPSB0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nLAoJCQlyZWRyYXcgPSBmdW5jdGlvbiggc2V0dGluZ3MgKSB7CgkJCQlfZm5EcmF3KCBzZXR0aW5ncyApOwoJCQl9LAoJCQlub2RlID0gJCgnPGRpdi8+JykuYWRkQ2xhc3MoIHNldHRpbmdzLm9DbGFzc2VzLnNQYWdpbmcgKyB0eXBlIClbMF0sCgkJCWZlYXR1cmVzID0gc2V0dGluZ3MuYWFuRmVhdHVyZXM7CgkKCQlpZiAoICEgbW9kZXJuICkgewoJCQlwbHVnaW4uZm5Jbml0KCBzZXR0aW5ncywgbm9kZSwgcmVkcmF3ICk7CgkJfQoJCgkJLyogQWRkIGEgZHJhdyBjYWxsYmFjayBmb3IgdGhlIHBhZ2luYXRpb24gb24gZmlyc3QgaW5zdGFuY2UsIHRvIHVwZGF0ZSB0aGUgcGFnaW5nIGRpc3BsYXkgKi8KCQlpZiAoICEgZmVhdHVyZXMucCApCgkJewoJCQlub2RlLmlkID0gc2V0dGluZ3Muc1RhYmxlSWQrJ19wYWdpbmF0ZSc7CgkKCQkJc2V0dGluZ3MuYW9EcmF3Q2FsbGJhY2sucHVzaCggewoJCQkJImZuIjogZnVuY3Rpb24oIHNldHRpbmdzICkgewoJCQkJCWlmICggbW9kZXJuICkgewoJCQkJCQl2YXIKCQkJCQkJCXN0YXJ0ICAgICAgPSBzZXR0aW5ncy5faURpc3BsYXlTdGFydCwKCQkJCQkJCWxlbiAgICAgICAgPSBzZXR0aW5ncy5faURpc3BsYXlMZW5ndGgsCgkJCQkJCQl2aXNSZWNvcmRzID0gc2V0dGluZ3MuZm5SZWNvcmRzRGlzcGxheSgpLAoJCQkJCQkJYWxsICAgICAgICA9IGxlbiA9PT0gLTEsCgkJCQkJCQlwYWdlID0gYWxsID8gMCA6IE1hdGguY2VpbCggc3RhcnQgLyBsZW4gKSwKCQkJCQkJCXBhZ2VzID0gYWxsID8gMSA6IE1hdGguY2VpbCggdmlzUmVjb3JkcyAvIGxlbiApLAoJCQkJCQkJYnV0dG9ucyA9IHBsdWdpbihwYWdlLCBwYWdlcyksCgkJCQkJCQlpLCBpZW47CgkKCQkJCQkJZm9yICggaT0wLCBpZW49ZmVhdHVyZXMucC5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCQkJCV9mblJlbmRlcmVyKCBzZXR0aW5ncywgJ3BhZ2VCdXR0b24nICkoCgkJCQkJCQkJc2V0dGluZ3MsIGZlYXR1cmVzLnBbaV0sIGksIGJ1dHRvbnMsIHBhZ2UsIHBhZ2VzCgkJCQkJCQkpOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlwbHVnaW4uZm5VcGRhdGUoIHNldHRpbmdzLCByZWRyYXcgKTsKCQkJCQl9CgkJCQl9LAoJCQkJInNOYW1lIjogInBhZ2luYXRpb24iCgkJCX0gKTsKCQl9CgkKCQlyZXR1cm4gbm9kZTsKCX0KCQoJCgkvKioKCSAqIEFsdGVyIHRoZSBkaXNwbGF5IHNldHRpbmdzIHRvIGNoYW5nZSB0aGUgcGFnZQoJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7c3RyaW5nfGludH0gYWN0aW9uIFBhZ2luZyBhY3Rpb24gdG8gdGFrZTogImZpcnN0IiwgInByZXZpb3VzIiwKCSAqICAgICJuZXh0IiBvciAibGFzdCIgb3IgcGFnZSBudW1iZXIgdG8ganVtcCB0byAoaW50ZWdlcikKCSAqICBAcGFyYW0gW2Jvb2xdIHJlZHJhdyBBdXRvbWF0aWNhbGx5IGRyYXcgdGhlIHVwZGF0ZSBvciBub3QKCSAqICBAcmV0dXJucyB7Ym9vbH0gdHJ1ZSBwYWdlIGhhcyBjaGFuZ2VkLCBmYWxzZSAtIG5vIGNoYW5nZQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5QYWdlQ2hhbmdlICggc2V0dGluZ3MsIGFjdGlvbiwgcmVkcmF3ICkKCXsKCQl2YXIKCQkJc3RhcnQgICAgID0gc2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQsCgkJCWxlbiAgICAgICA9IHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCwKCQkJcmVjb3JkcyAgID0gc2V0dGluZ3MuZm5SZWNvcmRzRGlzcGxheSgpOwoJCgkJaWYgKCByZWNvcmRzID09PSAwIHx8IGxlbiA9PT0gLTEgKQoJCXsKCQkJc3RhcnQgPSAwOwoJCX0KCQllbHNlIGlmICggdHlwZW9mIGFjdGlvbiA9PT0gIm51bWJlciIgKQoJCXsKCQkJc3RhcnQgPSBhY3Rpb24gKiBsZW47CgkKCQkJaWYgKCBzdGFydCA+IHJlY29yZHMgKQoJCQl7CgkJCQlzdGFydCA9IDA7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIGFjdGlvbiA9PSAiZmlyc3QiICkKCQl7CgkJCXN0YXJ0ID0gMDsKCQl9CgkJZWxzZSBpZiAoIGFjdGlvbiA9PSAicHJldmlvdXMiICkKCQl7CgkJCXN0YXJ0ID0gbGVuID49IDAgPwoJCQkJc3RhcnQgLSBsZW4gOgoJCQkJMDsKCQoJCQlpZiAoIHN0YXJ0IDwgMCApCgkJCXsKCQkJICBzdGFydCA9IDA7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIGFjdGlvbiA9PSAibmV4dCIgKQoJCXsKCQkJaWYgKCBzdGFydCArIGxlbiA8IHJlY29yZHMgKQoJCQl7CgkJCQlzdGFydCArPSBsZW47CgkJCX0KCQl9CgkJZWxzZSBpZiAoIGFjdGlvbiA9PSAibGFzdCIgKQoJCXsKCQkJc3RhcnQgPSBNYXRoLmZsb29yKCAocmVjb3Jkcy0xKSAvIGxlbikgKiBsZW47CgkJfQoJCWVsc2UKCQl7CgkJCV9mbkxvZyggc2V0dGluZ3MsIDAsICJVbmtub3duIHBhZ2luZyBhY3Rpb246ICIrYWN0aW9uLCA1ICk7CgkJfQoJCgkJdmFyIGNoYW5nZWQgPSBzZXR0aW5ncy5faURpc3BsYXlTdGFydCAhPT0gc3RhcnQ7CgkJc2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQgPSBzdGFydDsKCQoJCWlmICggY2hhbmdlZCApIHsKCQkJX2ZuQ2FsbGJhY2tGaXJlKCBzZXR0aW5ncywgbnVsbCwgJ3BhZ2UnLCBbc2V0dGluZ3NdICk7CgkKCQkJaWYgKCByZWRyYXcgKSB7CgkJCQlfZm5EcmF3KCBzZXR0aW5ncyApOwoJCQl9CgkJfQoJCgkJcmV0dXJuIGNoYW5nZWQ7Cgl9CgkKCQoJCgkvKioKCSAqIEdlbmVyYXRlIHRoZSBub2RlIHJlcXVpcmVkIGZvciB0aGUgcHJvY2Vzc2luZyBub2RlCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHJldHVybnMge25vZGV9IFByb2Nlc3NpbmcgZWxlbWVudAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5GZWF0dXJlSHRtbFByb2Nlc3NpbmcgKCBzZXR0aW5ncyApCgl7CgkJcmV0dXJuICQoJzxkaXYvPicsIHsKCQkJCSdpZCc6ICEgc2V0dGluZ3MuYWFuRmVhdHVyZXMuciA/IHNldHRpbmdzLnNUYWJsZUlkKydfcHJvY2Vzc2luZycgOiBudWxsLAoJCQkJJ2NsYXNzJzogc2V0dGluZ3Mub0NsYXNzZXMuc1Byb2Nlc3NpbmcKCQkJfSApCgkJCS5odG1sKCBzZXR0aW5ncy5vTGFuZ3VhZ2Uuc1Byb2Nlc3NpbmcgKQoJCQkuYXBwZW5kKCc8ZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+JykKCQkJLmluc2VydEJlZm9yZSggc2V0dGluZ3MublRhYmxlIClbMF07Cgl9CgkKCQoJLyoqCgkgKiBEaXNwbGF5IG9yIGhpZGUgdGhlIHByb2Nlc3NpbmcgaW5kaWNhdG9yCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtib29sfSBzaG93IFNob3cgdGhlIHByb2Nlc3NpbmcgaW5kaWNhdG9yICh0cnVlKSBvciBub3QgKGZhbHNlKQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5Qcm9jZXNzaW5nRGlzcGxheSAoIHNldHRpbmdzLCBzaG93ICkKCXsKCQlpZiAoIHNldHRpbmdzLm9GZWF0dXJlcy5iUHJvY2Vzc2luZyApIHsKCQkJJChzZXR0aW5ncy5hYW5GZWF0dXJlcy5yKS5jc3MoICdkaXNwbGF5Jywgc2hvdyA/ICdibG9jaycgOiAnbm9uZScgKTsKCQl9CgkKCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCBudWxsLCAncHJvY2Vzc2luZycsIFtzZXR0aW5ncywgc2hvd10gKTsKCX0KCQoJLyoqCgkgKiBBZGQgYW55IGNvbnRyb2wgZWxlbWVudHMgZm9yIHRoZSB0YWJsZSAtIHNwZWNpZmljYWxseSBzY3JvbGxpbmcKCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcmV0dXJucyB7bm9kZX0gTm9kZSB0byBhZGQgdG8gdGhlIERPTQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5GZWF0dXJlSHRtbFRhYmxlICggc2V0dGluZ3MgKQoJewoJCXZhciB0YWJsZSA9ICQoc2V0dGluZ3MublRhYmxlKTsKCQoJCS8vIFNjcm9sbGluZyBmcm9tIGhlcmUgb24gaW4KCQl2YXIgc2Nyb2xsID0gc2V0dGluZ3Mub1Njcm9sbDsKCQoJCWlmICggc2Nyb2xsLnNYID09PSAnJyAmJiBzY3JvbGwuc1kgPT09ICcnICkgewoJCQlyZXR1cm4gc2V0dGluZ3MublRhYmxlOwoJCX0KCQoJCXZhciBzY3JvbGxYID0gc2Nyb2xsLnNYOwoJCXZhciBzY3JvbGxZID0gc2Nyb2xsLnNZOwoJCXZhciBjbGFzc2VzID0gc2V0dGluZ3Mub0NsYXNzZXM7CgkJdmFyIGNhcHRpb24gPSB0YWJsZS5jaGlsZHJlbignY2FwdGlvbicpOwoJCXZhciBjYXB0aW9uU2lkZSA9IGNhcHRpb24ubGVuZ3RoID8gY2FwdGlvblswXS5fY2FwdGlvblNpZGUgOiBudWxsOwoJCXZhciBoZWFkZXJDbG9uZSA9ICQoIHRhYmxlWzBdLmNsb25lTm9kZShmYWxzZSkgKTsKCQl2YXIgZm9vdGVyQ2xvbmUgPSAkKCB0YWJsZVswXS5jbG9uZU5vZGUoZmFsc2UpICk7CgkJdmFyIGZvb3RlciA9IHRhYmxlLmNoaWxkcmVuKCd0Zm9vdCcpOwoJCXZhciBfZGl2ID0gJzxkaXYvPic7CgkJdmFyIHNpemUgPSBmdW5jdGlvbiAoIHMgKSB7CgkJCXJldHVybiAhcyA/IG51bGwgOiBfZm5TdHJpbmdUb0NzcyggcyApOwoJCX07CgkKCQlpZiAoICEgZm9vdGVyLmxlbmd0aCApIHsKCQkJZm9vdGVyID0gbnVsbDsKCQl9CgkKCQkvKgoJCSAqIFRoZSBIVE1MIHN0cnVjdHVyZSB0aGF0IHdlIHdhbnQgdG8gZ2VuZXJhdGUgaW4gdGhpcyBmdW5jdGlvbiBpczoKCQkgKiAgZGl2IC0gc2Nyb2xsZXIKCQkgKiAgICBkaXYgLSBzY3JvbGwgaGVhZAoJCSAqICAgICAgZGl2IC0gc2Nyb2xsIGhlYWQgaW5uZXIKCQkgKiAgICAgICAgdGFibGUgLSBzY3JvbGwgaGVhZCB0YWJsZQoJCSAqICAgICAgICAgIHRoZWFkIC0gdGhlYWQKCQkgKiAgICBkaXYgLSBzY3JvbGwgYm9keQoJCSAqICAgICAgdGFibGUgLSB0YWJsZSAobWFzdGVyIHRhYmxlKQoJCSAqICAgICAgICB0aGVhZCAtIHRoZWFkIGNsb25lIGZvciBzaXppbmcKCQkgKiAgICAgICAgdGJvZHkgLSB0Ym9keQoJCSAqICAgIGRpdiAtIHNjcm9sbCBmb290CgkJICogICAgICBkaXYgLSBzY3JvbGwgZm9vdCBpbm5lcgoJCSAqICAgICAgICB0YWJsZSAtIHNjcm9sbCBmb290IHRhYmxlCgkJICogICAgICAgICAgdGZvb3QgLSB0Zm9vdAoJCSAqLwoJCXZhciBzY3JvbGxlciA9ICQoIF9kaXYsIHsgJ2NsYXNzJzogY2xhc3Nlcy5zU2Nyb2xsV3JhcHBlciB9ICkKCQkJLmFwcGVuZCgKCQkJCSQoX2RpdiwgeyAnY2xhc3MnOiBjbGFzc2VzLnNTY3JvbGxIZWFkIH0gKQoJCQkJCS5jc3MoIHsKCQkJCQkJb3ZlcmZsb3c6ICdoaWRkZW4nLAoJCQkJCQlwb3NpdGlvbjogJ3JlbGF0aXZlJywKCQkJCQkJYm9yZGVyOiAwLAoJCQkJCQl3aWR0aDogc2Nyb2xsWCA/IHNpemUoc2Nyb2xsWCkgOiAnMTAwJScKCQkJCQl9ICkKCQkJCQkuYXBwZW5kKAoJCQkJCQkkKF9kaXYsIHsgJ2NsYXNzJzogY2xhc3Nlcy5zU2Nyb2xsSGVhZElubmVyIH0gKQoJCQkJCQkJLmNzcyggewoJCQkJCQkJCSdib3gtc2l6aW5nJzogJ2NvbnRlbnQtYm94JywKCQkJCQkJCQl3aWR0aDogc2Nyb2xsLnNYSW5uZXIgfHwgJzEwMCUnCgkJCQkJCQl9ICkKCQkJCQkJCS5hcHBlbmQoCgkJCQkJCQkJaGVhZGVyQ2xvbmUKCQkJCQkJCQkJLnJlbW92ZUF0dHIoJ2lkJykKCQkJCQkJCQkJLmNzcyggJ21hcmdpbi1sZWZ0JywgMCApCgkJCQkJCQkJCS5hcHBlbmQoIGNhcHRpb25TaWRlID09PSAndG9wJyA/IGNhcHRpb24gOiBudWxsICkKCQkJCQkJCQkJLmFwcGVuZCgKCQkJCQkJCQkJCXRhYmxlLmNoaWxkcmVuKCd0aGVhZCcpCgkJCQkJCQkJCSkKCQkJCQkJCSkKCQkJCQkpCgkJCSkKCQkJLmFwcGVuZCgKCQkJCSQoX2RpdiwgeyAnY2xhc3MnOiBjbGFzc2VzLnNTY3JvbGxCb2R5IH0gKQoJCQkJCS5jc3MoIHsKCQkJCQkJcG9zaXRpb246ICdyZWxhdGl2ZScsCgkJCQkJCW92ZXJmbG93OiAnYXV0bycsCgkJCQkJCXdpZHRoOiBzaXplKCBzY3JvbGxYICkKCQkJCQl9ICkKCQkJCQkuYXBwZW5kKCB0YWJsZSApCgkJCSk7CgkKCQlpZiAoIGZvb3RlciApIHsKCQkJc2Nyb2xsZXIuYXBwZW5kKAoJCQkJJChfZGl2LCB7ICdjbGFzcyc6IGNsYXNzZXMuc1Njcm9sbEZvb3QgfSApCgkJCQkJLmNzcyggewoJCQkJCQlvdmVyZmxvdzogJ2hpZGRlbicsCgkJCQkJCWJvcmRlcjogMCwKCQkJCQkJd2lkdGg6IHNjcm9sbFggPyBzaXplKHNjcm9sbFgpIDogJzEwMCUnCgkJCQkJfSApCgkJCQkJLmFwcGVuZCgKCQkJCQkJJChfZGl2LCB7ICdjbGFzcyc6IGNsYXNzZXMuc1Njcm9sbEZvb3RJbm5lciB9ICkKCQkJCQkJCS5hcHBlbmQoCgkJCQkJCQkJZm9vdGVyQ2xvbmUKCQkJCQkJCQkJLnJlbW92ZUF0dHIoJ2lkJykKCQkJCQkJCQkJLmNzcyggJ21hcmdpbi1sZWZ0JywgMCApCgkJCQkJCQkJCS5hcHBlbmQoIGNhcHRpb25TaWRlID09PSAnYm90dG9tJyA/IGNhcHRpb24gOiBudWxsICkKCQkJCQkJCQkJLmFwcGVuZCgKCQkJCQkJCQkJCXRhYmxlLmNoaWxkcmVuKCd0Zm9vdCcpCgkJCQkJCQkJCSkKCQkJCQkJCSkKCQkJCQkpCgkJCSk7CgkJfQoJCgkJdmFyIGNoaWxkcmVuID0gc2Nyb2xsZXIuY2hpbGRyZW4oKTsKCQl2YXIgc2Nyb2xsSGVhZCA9IGNoaWxkcmVuWzBdOwoJCXZhciBzY3JvbGxCb2R5ID0gY2hpbGRyZW5bMV07CgkJdmFyIHNjcm9sbEZvb3QgPSBmb290ZXIgPyBjaGlsZHJlblsyXSA6IG51bGw7CgkKCQkvLyBXaGVuIHRoZSBib2R5IGlzIHNjcm9sbGVkLCB0aGVuIHdlIGFsc28gd2FudCB0byBzY3JvbGwgdGhlIGhlYWRlcnMKCQlpZiAoIHNjcm9sbFggKSB7CgkJCSQoc2Nyb2xsQm9keSkub24oICdzY3JvbGwuRFQnLCBmdW5jdGlvbiAoZSkgewoJCQkJdmFyIHNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQ7CgkKCQkJCXNjcm9sbEhlYWQuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7CgkKCQkJCWlmICggZm9vdGVyICkgewoJCQkJCXNjcm9sbEZvb3Quc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7CgkJCQl9CgkJCX0gKTsKCQl9CgkKCQkkKHNjcm9sbEJvZHkpLmNzcygnbWF4LWhlaWdodCcsIHNjcm9sbFkpOwoJCWlmICghIHNjcm9sbC5iQ29sbGFwc2UpIHsKCQkJJChzY3JvbGxCb2R5KS5jc3MoJ2hlaWdodCcsIHNjcm9sbFkpOwoJCX0KCQoJCXNldHRpbmdzLm5TY3JvbGxIZWFkID0gc2Nyb2xsSGVhZDsKCQlzZXR0aW5ncy5uU2Nyb2xsQm9keSA9IHNjcm9sbEJvZHk7CgkJc2V0dGluZ3MublNjcm9sbEZvb3QgPSBzY3JvbGxGb290OwoJCgkJLy8gT24gcmVkcmF3IC0gYWxpZ24gY29sdW1ucwoJCXNldHRpbmdzLmFvRHJhd0NhbGxiYWNrLnB1c2goIHsKCQkJImZuIjogX2ZuU2Nyb2xsRHJhdywKCQkJInNOYW1lIjogInNjcm9sbGluZyIKCQl9ICk7CgkKCQlyZXR1cm4gc2Nyb2xsZXJbMF07Cgl9CgkKCQoJCgkvKioKCSAqIFVwZGF0ZSB0aGUgaGVhZGVyLCBmb290ZXIgYW5kIGJvZHkgdGFibGVzIGZvciByZXNpemluZyAtIGkuZS4gY29sdW1uCgkgKiBhbGlnbm1lbnQuCgkgKgoJICogV2VsY29tZSB0byB0aGUgbW9zdCBob3JyaWJsZSBmdW5jdGlvbiBEYXRhVGFibGVzLiBUaGUgcHJvY2VzcyB0aGF0IHRoaXMKCSAqIGZ1bmN0aW9uIGZvbGxvd3MgaXMgYmFzaWNhbGx5OgoJICogICAxLiBSZS1jcmVhdGUgdGhlIHRhYmxlIGluc2lkZSB0aGUgc2Nyb2xsaW5nIGRpdgoJICogICAyLiBUYWtlIGxpdmUgbWVhc3VyZW1lbnRzIGZyb20gdGhlIERPTQoJICogICAzLiBBcHBseSB0aGUgbWVhc3VyZW1lbnRzIHRvIGFsaWduIHRoZSBjb2x1bW5zCgkgKiAgIDQuIENsZWFuIHVwCgkgKgoJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5TY3JvbGxEcmF3ICggc2V0dGluZ3MgKQoJewoJCS8vIEdpdmVuIHRoYXQgdGhpcyBpcyBzdWNoIGEgbW9uc3RlciBmdW5jdGlvbiwgYSBsb3Qgb2YgdmFyaWFibGVzIGFyZSB1c2UKCQkvLyB0byB0cnkgYW5kIGtlZXAgdGhlIG1pbmltaXNlZCBzaXplIGFzIHNtYWxsIGFzIHBvc3NpYmxlCgkJdmFyCgkJCXNjcm9sbCAgICAgICAgID0gc2V0dGluZ3Mub1Njcm9sbCwKCQkJc2Nyb2xsWCAgICAgICAgPSBzY3JvbGwuc1gsCgkJCXNjcm9sbFhJbm5lciAgID0gc2Nyb2xsLnNYSW5uZXIsCgkJCXNjcm9sbFkgICAgICAgID0gc2Nyb2xsLnNZLAoJCQliYXJXaWR0aCAgICAgICA9IHNjcm9sbC5pQmFyV2lkdGgsCgkJCWRpdkhlYWRlciAgICAgID0gJChzZXR0aW5ncy5uU2Nyb2xsSGVhZCksCgkJCWRpdkhlYWRlclN0eWxlID0gZGl2SGVhZGVyWzBdLnN0eWxlLAoJCQlkaXZIZWFkZXJJbm5lciA9IGRpdkhlYWRlci5jaGlsZHJlbignZGl2JyksCgkJCWRpdkhlYWRlcklubmVyU3R5bGUgPSBkaXZIZWFkZXJJbm5lclswXS5zdHlsZSwKCQkJZGl2SGVhZGVyVGFibGUgPSBkaXZIZWFkZXJJbm5lci5jaGlsZHJlbigndGFibGUnKSwKCQkJZGl2Qm9keUVsICAgICAgPSBzZXR0aW5ncy5uU2Nyb2xsQm9keSwKCQkJZGl2Qm9keSAgICAgICAgPSAkKGRpdkJvZHlFbCksCgkJCWRpdkJvZHlTdHlsZSAgID0gZGl2Qm9keUVsLnN0eWxlLAoJCQlkaXZGb290ZXIgICAgICA9ICQoc2V0dGluZ3MublNjcm9sbEZvb3QpLAoJCQlkaXZGb290ZXJJbm5lciA9IGRpdkZvb3Rlci5jaGlsZHJlbignZGl2JyksCgkJCWRpdkZvb3RlclRhYmxlID0gZGl2Rm9vdGVySW5uZXIuY2hpbGRyZW4oJ3RhYmxlJyksCgkJCWhlYWRlciAgICAgICAgID0gJChzZXR0aW5ncy5uVEhlYWQpLAoJCQl0YWJsZSAgICAgICAgICA9ICQoc2V0dGluZ3MublRhYmxlKSwKCQkJdGFibGVFbCAgICAgICAgPSB0YWJsZVswXSwKCQkJdGFibGVTdHlsZSAgICAgPSB0YWJsZUVsLnN0eWxlLAoJCQlmb290ZXIgICAgICAgICA9IHNldHRpbmdzLm5URm9vdCA/ICQoc2V0dGluZ3MublRGb290KSA6IG51bGwsCgkJCWJyb3dzZXIgICAgICAgID0gc2V0dGluZ3Mub0Jyb3dzZXIsCgkJCWllNjcgICAgICAgICAgID0gYnJvd3Nlci5iU2Nyb2xsT3ZlcnNpemUsCgkJCWR0SGVhZGVyQ2VsbHMgID0gX3BsdWNrKCBzZXR0aW5ncy5hb0NvbHVtbnMsICduVGgnICksCgkJCWhlYWRlclRyZ0VscywgZm9vdGVyVHJnRWxzLAoJCQloZWFkZXJTcmNFbHMsIGZvb3RlclNyY0VscywKCQkJaGVhZGVyQ29weSwgZm9vdGVyQ29weSwKCQkJaGVhZGVyV2lkdGhzPVtdLCBmb290ZXJXaWR0aHM9W10sCgkJCWhlYWRlckNvbnRlbnQ9W10sIGZvb3RlckNvbnRlbnQ9W10sCgkJCWlkeCwgY29ycmVjdGlvbiwgc2FuaXR5V2lkdGgsCgkJCXplcm9PdXQgPSBmdW5jdGlvbihuU2l6ZXIpIHsKCQkJCXZhciBzdHlsZSA9IG5TaXplci5zdHlsZTsKCQkJCXN0eWxlLnBhZGRpbmdUb3AgPSAiMCI7CgkJCQlzdHlsZS5wYWRkaW5nQm90dG9tID0gIjAiOwoJCQkJc3R5bGUuYm9yZGVyVG9wV2lkdGggPSAiMCI7CgkJCQlzdHlsZS5ib3JkZXJCb3R0b21XaWR0aCA9ICIwIjsKCQkJCXN0eWxlLmhlaWdodCA9IDA7CgkJCX07CgkKCQkvLyBJZiB0aGUgc2Nyb2xsYmFyIHZpc2liaWxpdHkgaGFzIGNoYW5nZWQgZnJvbSB0aGUgbGFzdCBkcmF3LCB3ZSBuZWVkIHRvCgkJLy8gYWRqdXN0IHRoZSBjb2x1bW4gc2l6ZXMgYXMgdGhlIHRhYmxlIHdpZHRoIHdpbGwgaGF2ZSBjaGFuZ2VkIHRvIGFjY291bnQKCQkvLyBmb3IgdGhlIHNjcm9sbGJhcgoJCXZhciBzY3JvbGxCYXJWaXMgPSBkaXZCb2R5RWwuc2Nyb2xsSGVpZ2h0ID4gZGl2Qm9keUVsLmNsaWVudEhlaWdodDsKCQkKCQlpZiAoIHNldHRpbmdzLnNjcm9sbEJhclZpcyAhPT0gc2Nyb2xsQmFyVmlzICYmIHNldHRpbmdzLnNjcm9sbEJhclZpcyAhPT0gdW5kZWZpbmVkICkgewoJCQlzZXR0aW5ncy5zY3JvbGxCYXJWaXMgPSBzY3JvbGxCYXJWaXM7CgkJCV9mbkFkanVzdENvbHVtblNpemluZyggc2V0dGluZ3MgKTsKCQkJcmV0dXJuOyAvLyBhZGp1c3QgY29sdW1uIHNpemluZyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbgoJCX0KCQllbHNlIHsKCQkJc2V0dGluZ3Muc2Nyb2xsQmFyVmlzID0gc2Nyb2xsQmFyVmlzOwoJCX0KCQoJCS8qCgkJICogMS4gUmUtY3JlYXRlIHRoZSB0YWJsZSBpbnNpZGUgdGhlIHNjcm9sbGluZyBkaXYKCQkgKi8KCQoJCS8vIFJlbW92ZSB0aGUgb2xkIG1pbmltaXNlZCB0aGVhZCBhbmQgdGZvb3QgZWxlbWVudHMgaW4gdGhlIGlubmVyIHRhYmxlCgkJdGFibGUuY2hpbGRyZW4oJ3RoZWFkLCB0Zm9vdCcpLnJlbW92ZSgpOwoJCgkJaWYgKCBmb290ZXIgKSB7CgkJCWZvb3RlckNvcHkgPSBmb290ZXIuY2xvbmUoKS5wcmVwZW5kVG8oIHRhYmxlICk7CgkJCWZvb3RlclRyZ0VscyA9IGZvb3Rlci5maW5kKCd0cicpOyAvLyB0aGUgb3JpZ2luYWwgdGZvb3QgaXMgaW4gaXRzIG93biB0YWJsZSBhbmQgbXVzdCBiZSBzaXplZAoJCQlmb290ZXJTcmNFbHMgPSBmb290ZXJDb3B5LmZpbmQoJ3RyJyk7CgkJCWZvb3RlckNvcHkuZmluZCgnW2lkXScpLnJlbW92ZUF0dHIoJ2lkJyk7CgkJfQoJCgkJLy8gQ2xvbmUgdGhlIGN1cnJlbnQgaGVhZGVyIGFuZCBmb290ZXIgZWxlbWVudHMgYW5kIHRoZW4gcGxhY2UgaXQgaW50byB0aGUgaW5uZXIgdGFibGUKCQloZWFkZXJDb3B5ID0gaGVhZGVyLmNsb25lKCkucHJlcGVuZFRvKCB0YWJsZSApOwoJCWhlYWRlclRyZ0VscyA9IGhlYWRlci5maW5kKCd0cicpOyAvLyBvcmlnaW5hbCBoZWFkZXIgaXMgaW4gaXRzIG93biB0YWJsZQoJCWhlYWRlclNyY0VscyA9IGhlYWRlckNvcHkuZmluZCgndHInKTsKCQloZWFkZXJDb3B5LmZpbmQoJ3RoLCB0ZCcpLnJlbW92ZUF0dHIoJ3RhYmluZGV4Jyk7CgkJaGVhZGVyQ29weS5maW5kKCdbaWRdJykucmVtb3ZlQXR0cignaWQnKTsKCQoJCgkJLyoKCQkgKiAyLiBUYWtlIGxpdmUgbWVhc3VyZW1lbnRzIGZyb20gdGhlIERPTSAtIGRvIG5vdCBhbHRlciB0aGUgRE9NIGl0c2VsZiEKCQkgKi8KCQoJCS8vIFJlbW92ZSBvbGQgc2l6aW5nIGFuZCBhcHBseSB0aGUgY2FsY3VsYXRlZCBjb2x1bW4gd2lkdGhzCgkJLy8gR2V0IHRoZSB1bmlxdWUgY29sdW1uIGhlYWRlcnMgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgKGNsb25lZCkgaGVhZGVyLiBXZSB3YW50IHRvIGFwcGx5IHRoZQoJCS8vIGNhbGN1bGF0ZWQgc2l6ZXMgdG8gdGhpcyBoZWFkZXIKCQlpZiAoICEgc2Nyb2xsWCApCgkJewoJCQlkaXZCb2R5U3R5bGUud2lkdGggPSAnMTAwJSc7CgkJCWRpdkhlYWRlclswXS5zdHlsZS53aWR0aCA9ICcxMDAlJzsKCQl9CgkKCQkkLmVhY2goIF9mbkdldFVuaXF1ZVRocyggc2V0dGluZ3MsIGhlYWRlckNvcHkgKSwgZnVuY3Rpb24gKCBpLCBlbCApIHsKCQkJaWR4ID0gX2ZuVmlzaWJsZVRvQ29sdW1uSW5kZXgoIHNldHRpbmdzLCBpICk7CgkJCWVsLnN0eWxlLndpZHRoID0gc2V0dGluZ3MuYW9Db2x1bW5zW2lkeF0uc1dpZHRoOwoJCX0gKTsKCQoJCWlmICggZm9vdGVyICkgewoJCQlfZm5BcHBseVRvQ2hpbGRyZW4oIGZ1bmN0aW9uKG4pIHsKCQkJCW4uc3R5bGUud2lkdGggPSAiIjsKCQkJfSwgZm9vdGVyU3JjRWxzICk7CgkJfQoJCgkJLy8gU2l6ZSB0aGUgdGFibGUgYXMgYSB3aG9sZQoJCXNhbml0eVdpZHRoID0gdGFibGUub3V0ZXJXaWR0aCgpOwoJCWlmICggc2Nyb2xsWCA9PT0gIiIgKSB7CgkJCS8vIE5vIHggc2Nyb2xsaW5nCgkJCXRhYmxlU3R5bGUud2lkdGggPSAiMTAwJSI7CgkKCQkJLy8gSUU3IHdpbGwgbWFrZSB0aGUgd2lkdGggb2YgdGhlIHRhYmxlIHdoZW4gMTAwJSBpbmNsdWRlIHRoZSBzY3JvbGxiYXIKCQkJLy8gLSB3aGljaCBpcyBzaG91bGRuJ3QuIFdoZW4gdGhlcmUgaXMgYSBzY3JvbGxiYXIgd2UgbmVlZCB0byB0YWtlIHRoaXMKCQkJLy8gaW50byBhY2NvdW50LgoJCQlpZiAoIGllNjcgJiYgKHRhYmxlLmZpbmQoJ3Rib2R5JykuaGVpZ2h0KCkgPiBkaXZCb2R5RWwub2Zmc2V0SGVpZ2h0IHx8CgkJCQlkaXZCb2R5LmNzcygnb3ZlcmZsb3cteScpID09ICJzY3JvbGwiKQoJCQkpIHsKCQkJCXRhYmxlU3R5bGUud2lkdGggPSBfZm5TdHJpbmdUb0NzcyggdGFibGUub3V0ZXJXaWR0aCgpIC0gYmFyV2lkdGgpOwoJCQl9CgkKCQkJLy8gUmVjYWxjdWxhdGUgdGhlIHNhbml0eSB3aWR0aAoJCQlzYW5pdHlXaWR0aCA9IHRhYmxlLm91dGVyV2lkdGgoKTsKCQl9CgkJZWxzZSBpZiAoIHNjcm9sbFhJbm5lciAhPT0gIiIgKSB7CgkJCS8vIGxlZ2FjeSB4IHNjcm9sbCBpbm5lciBoYXMgYmVlbiBnaXZlbiAtIHVzZSBpdAoJCQl0YWJsZVN0eWxlLndpZHRoID0gX2ZuU3RyaW5nVG9Dc3Moc2Nyb2xsWElubmVyKTsKCQoJCQkvLyBSZWNhbGN1bGF0ZSB0aGUgc2FuaXR5IHdpZHRoCgkJCXNhbml0eVdpZHRoID0gdGFibGUub3V0ZXJXaWR0aCgpOwoJCX0KCQoJCS8vIEhpZGRlbiBoZWFkZXIgc2hvdWxkIGhhdmUgemVybyBoZWlnaHQsIHNvIHJlbW92ZSBwYWRkaW5nIGFuZCBib3JkZXJzLiBUaGVuCgkJLy8gc2V0IHRoZSB3aWR0aCBiYXNlZCBvbiB0aGUgcmVhbCBoZWFkZXJzCgkKCQkvLyBBcHBseSBhbGwgc3R5bGVzIGluIG9uZSBwYXNzCgkJX2ZuQXBwbHlUb0NoaWxkcmVuKCB6ZXJvT3V0LCBoZWFkZXJTcmNFbHMgKTsKCQoJCS8vIFJlYWQgYWxsIHdpZHRocyBpbiBuZXh0IHBhc3MKCQlfZm5BcHBseVRvQ2hpbGRyZW4oIGZ1bmN0aW9uKG5TaXplcikgewoJCQl2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSA/CgkJCQl3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShuU2l6ZXIpLndpZHRoIDoKCQkJCV9mblN0cmluZ1RvQ3NzKCAkKG5TaXplcikud2lkdGgoKSApOwoJCgkJCWhlYWRlckNvbnRlbnQucHVzaCggblNpemVyLmlubmVySFRNTCApOwoJCQloZWFkZXJXaWR0aHMucHVzaCggc3R5bGUgKTsKCQl9LCBoZWFkZXJTcmNFbHMgKTsKCQoJCS8vIEFwcGx5IGFsbCB3aWR0aHMgaW4gZmluYWwgcGFzcwoJCV9mbkFwcGx5VG9DaGlsZHJlbiggZnVuY3Rpb24oblRvU2l6ZSwgaSkgewoJCQluVG9TaXplLnN0eWxlLndpZHRoID0gaGVhZGVyV2lkdGhzW2ldOwoJCX0sIGhlYWRlclRyZ0VscyApOwoJCgkJJChoZWFkZXJTcmNFbHMpLmNzcygnaGVpZ2h0JywgMCk7CgkKCQkvKiBTYW1lIGFnYWluIHdpdGggdGhlIGZvb3RlciBpZiB3ZSBoYXZlIG9uZSAqLwoJCWlmICggZm9vdGVyICkKCQl7CgkJCV9mbkFwcGx5VG9DaGlsZHJlbiggemVyb091dCwgZm9vdGVyU3JjRWxzICk7CgkKCQkJX2ZuQXBwbHlUb0NoaWxkcmVuKCBmdW5jdGlvbihuU2l6ZXIpIHsKCQkJCWZvb3RlckNvbnRlbnQucHVzaCggblNpemVyLmlubmVySFRNTCApOwoJCQkJZm9vdGVyV2lkdGhzLnB1c2goIF9mblN0cmluZ1RvQ3NzKCAkKG5TaXplcikuY3NzKCd3aWR0aCcpICkgKTsKCQkJfSwgZm9vdGVyU3JjRWxzICk7CgkKCQkJX2ZuQXBwbHlUb0NoaWxkcmVuKCBmdW5jdGlvbihuVG9TaXplLCBpKSB7CgkJCQluVG9TaXplLnN0eWxlLndpZHRoID0gZm9vdGVyV2lkdGhzW2ldOwoJCQl9LCBmb290ZXJUcmdFbHMgKTsKCQoJCQkkKGZvb3RlclNyY0VscykuaGVpZ2h0KDApOwoJCX0KCQoJCgkJLyoKCQkgKiAzLiBBcHBseSB0aGUgbWVhc3VyZW1lbnRzCgkJICovCgkKCQkvLyAiSGlkZSIgdGhlIGhlYWRlciBhbmQgZm9vdGVyIHRoYXQgd2UgdXNlZCBmb3IgdGhlIHNpemluZy4gV2UgbmVlZCB0byBrZWVwCgkJLy8gdGhlIGNvbnRlbnQgb2YgdGhlIGNlbGwgc28gdGhhdCB0aGUgd2lkdGggYXBwbGllZCB0byB0aGUgaGVhZGVyIGFuZCBib2R5CgkJLy8gYm90aCBtYXRjaCwgYnV0IHdlIHdhbnQgdG8gaGlkZSBpdCBjb21wbGV0ZWx5LiBXZSB3YW50IHRvIGFsc28gZml4IHRoZWlyCgkJLy8gd2lkdGggdG8gd2hhdCB0aGV5IGN1cnJlbnRseSBhcmUKCQlfZm5BcHBseVRvQ2hpbGRyZW4oIGZ1bmN0aW9uKG5TaXplciwgaSkgewoJCQluU2l6ZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImRhdGFUYWJsZXNfc2l6aW5nIj4nK2hlYWRlckNvbnRlbnRbaV0rJzwvZGl2Pic7CgkJCW5TaXplci5jaGlsZE5vZGVzWzBdLnN0eWxlLmhlaWdodCA9ICIwIjsKCQkJblNpemVyLmNoaWxkTm9kZXNbMF0uc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCQkJblNpemVyLnN0eWxlLndpZHRoID0gaGVhZGVyV2lkdGhzW2ldOwoJCX0sIGhlYWRlclNyY0VscyApOwoJCgkJaWYgKCBmb290ZXIgKQoJCXsKCQkJX2ZuQXBwbHlUb0NoaWxkcmVuKCBmdW5jdGlvbihuU2l6ZXIsIGkpIHsKCQkJCW5TaXplci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iZGF0YVRhYmxlc19zaXppbmciPicrZm9vdGVyQ29udGVudFtpXSsnPC9kaXY+JzsKCQkJCW5TaXplci5jaGlsZE5vZGVzWzBdLnN0eWxlLmhlaWdodCA9ICIwIjsKCQkJCW5TaXplci5jaGlsZE5vZGVzWzBdLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJCQluU2l6ZXIuc3R5bGUud2lkdGggPSBmb290ZXJXaWR0aHNbaV07CgkJCX0sIGZvb3RlclNyY0VscyApOwoJCX0KCQoJCS8vIFNhbml0eSBjaGVjayB0aGF0IHRoZSB0YWJsZSBpcyBvZiBhIHNlbnNpYmxlIHdpZHRoLiBJZiBub3QgdGhlbiB3ZSBhcmUgZ29pbmcgdG8gZ2V0CgkJLy8gbWlzYWxpZ25tZW50IC0gdHJ5IHRvIHByZXZlbnQgdGhpcyBieSBub3QgYWxsb3dpbmcgdGhlIHRhYmxlIHRvIHNocmluayBiZWxvdyBpdHMgbWluIHdpZHRoCgkJaWYgKCBNYXRoLnJvdW5kKHRhYmxlLm91dGVyV2lkdGgoKSkgPCBNYXRoLnJvdW5kKHNhbml0eVdpZHRoKSApCgkJewoJCQkvLyBUaGUgbWluIHdpZHRoIGRlcGVuZHMgdXBvbiBpZiB3ZSBoYXZlIGEgdmVydGljYWwgc2Nyb2xsYmFyIHZpc2libGUgb3Igbm90ICovCgkJCWNvcnJlY3Rpb24gPSAoKGRpdkJvZHlFbC5zY3JvbGxIZWlnaHQgPiBkaXZCb2R5RWwub2Zmc2V0SGVpZ2h0IHx8CgkJCQlkaXZCb2R5LmNzcygnb3ZlcmZsb3cteScpID09ICJzY3JvbGwiKSkgPwoJCQkJCXNhbml0eVdpZHRoK2JhcldpZHRoIDoKCQkJCQlzYW5pdHlXaWR0aDsKCQoJCQkvLyBJRTYvNyBhcmUgYSBsYXcgdW50byB0aGVtc2VsdmVzLi4uCgkJCWlmICggaWU2NyAmJiAoZGl2Qm9keUVsLnNjcm9sbEhlaWdodCA+CgkJCQlkaXZCb2R5RWwub2Zmc2V0SGVpZ2h0IHx8IGRpdkJvZHkuY3NzKCdvdmVyZmxvdy15JykgPT0gInNjcm9sbCIpCgkJCSkgewoJCQkJdGFibGVTdHlsZS53aWR0aCA9IF9mblN0cmluZ1RvQ3NzKCBjb3JyZWN0aW9uLWJhcldpZHRoICk7CgkJCX0KCQoJCQkvLyBBbmQgZ2l2ZSB0aGUgdXNlciBhIHdhcm5pbmcgdGhhdCB3ZSd2ZSBzdG9wcGVkIHRoZSB0YWJsZSBnZXR0aW5nIHRvbyBzbWFsbAoJCQlpZiAoIHNjcm9sbFggPT09ICIiIHx8IHNjcm9sbFhJbm5lciAhPT0gIiIgKSB7CgkJCQlfZm5Mb2coIHNldHRpbmdzLCAxLCAnUG9zc2libGUgY29sdW1uIG1pc2FsaWdubWVudCcsIDYgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQljb3JyZWN0aW9uID0gJzEwMCUnOwoJCX0KCQoJCS8vIEFwcGx5IHRvIHRoZSBjb250YWluZXIgZWxlbWVudHMKCQlkaXZCb2R5U3R5bGUud2lkdGggPSBfZm5TdHJpbmdUb0NzcyggY29ycmVjdGlvbiApOwoJCWRpdkhlYWRlclN0eWxlLndpZHRoID0gX2ZuU3RyaW5nVG9Dc3MoIGNvcnJlY3Rpb24gKTsKCQoJCWlmICggZm9vdGVyICkgewoJCQlzZXR0aW5ncy5uU2Nyb2xsRm9vdC5zdHlsZS53aWR0aCA9IF9mblN0cmluZ1RvQ3NzKCBjb3JyZWN0aW9uICk7CgkJfQoJCgkKCQkvKgoJCSAqIDQuIENsZWFuIHVwCgkJICovCgkJaWYgKCAhIHNjcm9sbFkgKSB7CgkJCS8qIElFNzwgcHV0cyBhIHZlcnRpY2FsIHNjcm9sbGJhciBpbiBwbGFjZSAod2hlbiBpdCBzaG91bGRuJ3QgYmUpIGR1ZSB0byBzdWJ0cmFjdGluZwoJCQkgKiB0aGUgc2Nyb2xsYmFyIGhlaWdodCBmcm9tIHRoZSB2aXNpYmxlIGRpc3BsYXksIHJhdGhlciB0aGFuIGFkZGluZyBpdCBvbi4gV2UgbmVlZCB0bwoJCQkgKiBzZXQgdGhlIGhlaWdodCBpbiBvcmRlciB0byBzb3J0IHRoaXMuIERvbid0IHdhbnQgdG8gZG8gaXQgaW4gYW55IG90aGVyIGJyb3dzZXJzLgoJCQkgKi8KCQkJaWYgKCBpZTY3ICkgewoJCQkJZGl2Qm9keVN0eWxlLmhlaWdodCA9IF9mblN0cmluZ1RvQ3NzKCB0YWJsZUVsLm9mZnNldEhlaWdodCtiYXJXaWR0aCApOwoJCQl9CgkJfQoJCgkJLyogRmluYWxseSBzZXQgdGhlIHdpZHRoJ3Mgb2YgdGhlIGhlYWRlciBhbmQgZm9vdGVyIHRhYmxlcyAqLwoJCXZhciBpT3V0ZXJXaWR0aCA9IHRhYmxlLm91dGVyV2lkdGgoKTsKCQlkaXZIZWFkZXJUYWJsZVswXS5zdHlsZS53aWR0aCA9IF9mblN0cmluZ1RvQ3NzKCBpT3V0ZXJXaWR0aCApOwoJCWRpdkhlYWRlcklubmVyU3R5bGUud2lkdGggPSBfZm5TdHJpbmdUb0NzcyggaU91dGVyV2lkdGggKTsKCQoJCS8vIEZpZ3VyZSBvdXQgaWYgdGhlcmUgYXJlIHNjcm9sbGJhciBwcmVzZW50IC0gaWYgc28gdGhlbiB3ZSBuZWVkIGEgdGhlIGhlYWRlciBhbmQgZm9vdGVyIHRvCgkJLy8gcHJvdmlkZSBhIGJpdCBtb3JlIHNwYWNlIHRvIGFsbG93ICJvdmVyZmxvdyIgc2Nyb2xsaW5nIChpLmUuIHBhc3QgdGhlIHNjcm9sbGJhcikKCQl2YXIgYlNjcm9sbGluZyA9IHRhYmxlLmhlaWdodCgpID4gZGl2Qm9keUVsLmNsaWVudEhlaWdodCB8fCBkaXZCb2R5LmNzcygnb3ZlcmZsb3cteScpID09ICJzY3JvbGwiOwoJCXZhciBwYWRkaW5nID0gJ3BhZGRpbmcnICsgKGJyb3dzZXIuYlNjcm9sbGJhckxlZnQgPyAnTGVmdCcgOiAnUmlnaHQnICk7CgkJZGl2SGVhZGVySW5uZXJTdHlsZVsgcGFkZGluZyBdID0gYlNjcm9sbGluZyA/IGJhcldpZHRoKyJweCIgOiAiMHB4IjsKCQoJCWlmICggZm9vdGVyICkgewoJCQlkaXZGb290ZXJUYWJsZVswXS5zdHlsZS53aWR0aCA9IF9mblN0cmluZ1RvQ3NzKCBpT3V0ZXJXaWR0aCApOwoJCQlkaXZGb290ZXJJbm5lclswXS5zdHlsZS53aWR0aCA9IF9mblN0cmluZ1RvQ3NzKCBpT3V0ZXJXaWR0aCApOwoJCQlkaXZGb290ZXJJbm5lclswXS5zdHlsZVtwYWRkaW5nXSA9IGJTY3JvbGxpbmcgPyBiYXJXaWR0aCsicHgiIDogIjBweCI7CgkJfQoJCgkJLy8gQ29ycmVjdCBET00gb3JkZXJpbmcgZm9yIGNvbGdyb3VwIC0gY29tZXMgYmVmb3JlIHRoZSB0aGVhZAoJCXRhYmxlLmNoaWxkcmVuKCdjb2xncm91cCcpLmluc2VydEJlZm9yZSggdGFibGUuY2hpbGRyZW4oJ3RoZWFkJykgKTsKCQoJCS8qIEFkanVzdCB0aGUgcG9zaXRpb24gb2YgdGhlIGhlYWRlciBpbiBjYXNlIHdlIGxvb3NlIHRoZSB5LXNjcm9sbGJhciAqLwoJCWRpdkJvZHkudHJpZ2dlcignc2Nyb2xsJyk7CgkKCQkvLyBJZiBzb3J0aW5nIG9yIGZpbHRlcmluZyBoYXMgb2NjdXJyZWQsIGp1bXAgdGhlIHNjcm9sbGluZyBiYWNrIHRvIHRoZSB0b3AKCQkvLyBvbmx5IGlmIHdlIGFyZW4ndCBob2xkaW5nIHRoZSBwb3NpdGlvbgoJCWlmICggKHNldHRpbmdzLmJTb3J0ZWQgfHwgc2V0dGluZ3MuYkZpbHRlcmVkKSAmJiAhIHNldHRpbmdzLl9kcmF3SG9sZCApIHsKCQkJZGl2Qm9keUVsLnNjcm9sbFRvcCA9IDA7CgkJfQoJfQoJCgkKCQoJLyoqCgkgKiBBcHBseSBhIGdpdmVuIGZ1bmN0aW9uIHRvIHRoZSBkaXNwbGF5IGNoaWxkIG5vZGVzIG9mIGFuIGVsZW1lbnQgYXJyYXkgKHR5cGljYWxseQoJICogVEQgY2hpbGRyZW4gb2YgVFIgcm93cwoJICogIEBwYXJhbSB7ZnVuY3Rpb259IGZuIE1ldGhvZCB0byBhcHBseSB0byB0aGUgb2JqZWN0cwoJICogIEBwYXJhbSBhcnJheSB7bm9kZXN9IGFuMSBMaXN0IG9mIGVsZW1lbnRzIHRvIGxvb2sgdGhyb3VnaCBmb3IgZGlzcGxheSBjaGlsZHJlbgoJICogIEBwYXJhbSBhcnJheSB7bm9kZXN9IGFuMiBBbm90aGVyIGxpc3QgKGlkZW50aWNhbCBzdHJ1Y3R1cmUgdG8gdGhlIGZpcnN0KSAtIG9wdGlvbmFsCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkFwcGx5VG9DaGlsZHJlbiggZm4sIGFuMSwgYW4yICkKCXsKCQl2YXIgaW5kZXg9MCwgaT0wLCBpTGVuPWFuMS5sZW5ndGg7CgkJdmFyIG5Ob2RlMSwgbk5vZGUyOwoJCgkJd2hpbGUgKCBpIDwgaUxlbiApIHsKCQkJbk5vZGUxID0gYW4xW2ldLmZpcnN0Q2hpbGQ7CgkJCW5Ob2RlMiA9IGFuMiA/IGFuMltpXS5maXJzdENoaWxkIDogbnVsbDsKCQoJCQl3aGlsZSAoIG5Ob2RlMSApIHsKCQkJCWlmICggbk5vZGUxLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggYW4yICkgewoJCQkJCQlmbiggbk5vZGUxLCBuTm9kZTIsIGluZGV4ICk7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlmbiggbk5vZGUxLCBpbmRleCApOwoJCQkJCX0KCQoJCQkJCWluZGV4Kys7CgkJCQl9CgkKCQkJCW5Ob2RlMSA9IG5Ob2RlMS5uZXh0U2libGluZzsKCQkJCW5Ob2RlMiA9IGFuMiA/IG5Ob2RlMi5uZXh0U2libGluZyA6IG51bGw7CgkJCX0KCQoJCQlpKys7CgkJfQoJfQoJCgkKCQoJdmFyIF9fcmVfaHRtbF9yZW1vdmUgPSAvPC4qPz4vZzsKCQoJCgkvKioKCSAqIENhbGN1bGF0ZSB0aGUgd2lkdGggb2YgY29sdW1ucyBmb3IgdGhlIHRhYmxlCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5DYWxjdWxhdGVDb2x1bW5XaWR0aHMgKCBvU2V0dGluZ3MgKQoJewoJCXZhcgoJCQl0YWJsZSA9IG9TZXR0aW5ncy5uVGFibGUsCgkJCWNvbHVtbnMgPSBvU2V0dGluZ3MuYW9Db2x1bW5zLAoJCQlzY3JvbGwgPSBvU2V0dGluZ3Mub1Njcm9sbCwKCQkJc2Nyb2xsWSA9IHNjcm9sbC5zWSwKCQkJc2Nyb2xsWCA9IHNjcm9sbC5zWCwKCQkJc2Nyb2xsWElubmVyID0gc2Nyb2xsLnNYSW5uZXIsCgkJCWNvbHVtbkNvdW50ID0gY29sdW1ucy5sZW5ndGgsCgkJCXZpc2libGVDb2x1bW5zID0gX2ZuR2V0Q29sdW1ucyggb1NldHRpbmdzLCAnYlZpc2libGUnICksCgkJCWhlYWRlckNlbGxzID0gJCgndGgnLCBvU2V0dGluZ3MublRIZWFkKSwKCQkJdGFibGVXaWR0aEF0dHIgPSB0YWJsZS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyksIC8vIGZyb20gRE9NIGVsZW1lbnQKCQkJdGFibGVDb250YWluZXIgPSB0YWJsZS5wYXJlbnROb2RlLAoJCQl1c2VySW5wdXRzID0gZmFsc2UsCgkJCWksIGNvbHVtbiwgY29sdW1uSWR4LCB3aWR0aCwgb3V0ZXJXaWR0aCwKCQkJYnJvd3NlciA9IG9TZXR0aW5ncy5vQnJvd3NlciwKCQkJaWU2NyA9IGJyb3dzZXIuYlNjcm9sbE92ZXJzaXplOwoJCgkJdmFyIHN0eWxlV2lkdGggPSB0YWJsZS5zdHlsZS53aWR0aDsKCQlpZiAoIHN0eWxlV2lkdGggJiYgc3R5bGVXaWR0aC5pbmRleE9mKCclJykgIT09IC0xICkgewoJCQl0YWJsZVdpZHRoQXR0ciA9IHN0eWxlV2lkdGg7CgkJfQoJCgkJLyogQ29udmVydCBhbnkgdXNlciBpbnB1dCBzaXplcyBpbnRvIHBpeGVsIHNpemVzICovCgkJZm9yICggaT0wIDsgaTx2aXNpYmxlQ29sdW1ucy5sZW5ndGggOyBpKysgKSB7CgkJCWNvbHVtbiA9IGNvbHVtbnNbIHZpc2libGVDb2x1bW5zW2ldIF07CgkKCQkJaWYgKCBjb2x1bW4uc1dpZHRoICE9PSBudWxsICkgewoJCQkJY29sdW1uLnNXaWR0aCA9IF9mbkNvbnZlcnRUb1dpZHRoKCBjb2x1bW4uc1dpZHRoT3JpZywgdGFibGVDb250YWluZXIgKTsKCQoJCQkJdXNlcklucHV0cyA9IHRydWU7CgkJCX0KCQl9CgkKCQkvKiBJZiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIERPTSBlcXVhbHMgdGhlIG51bWJlciB0aGF0IHdlIGhhdmUgdG8KCQkgKiBwcm9jZXNzIGluIERhdGFUYWJsZXMsIHRoZW4gd2UgY2FuIHVzZSB0aGUgb2Zmc2V0cyB0aGF0IGFyZSBjcmVhdGVkIGJ5CgkJICogdGhlIHdlYi0gYnJvd3Nlci4gTm8gY3VzdG9tIHNpemVzIGNhbiBiZSBzZXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gaGFwcGVuLAoJCSAqIG5vciBzY3JvbGxpbmcgdXNlZAoJCSAqLwoJCWlmICggaWU2NyB8fCAhIHVzZXJJbnB1dHMgJiYgISBzY3JvbGxYICYmICEgc2Nyb2xsWSAmJgoJCSAgICAgY29sdW1uQ291bnQgPT0gX2ZuVmlzYmxlQ29sdW1ucyggb1NldHRpbmdzICkgJiYKCQkgICAgIGNvbHVtbkNvdW50ID09IGhlYWRlckNlbGxzLmxlbmd0aAoJCSkgewoJCQlmb3IgKCBpPTAgOyBpPGNvbHVtbkNvdW50IDsgaSsrICkgewoJCQkJdmFyIGNvbElkeCA9IF9mblZpc2libGVUb0NvbHVtbkluZGV4KCBvU2V0dGluZ3MsIGkgKTsKCQoJCQkJaWYgKCBjb2xJZHggIT09IG51bGwgKSB7CgkJCQkJY29sdW1uc1sgY29sSWR4IF0uc1dpZHRoID0gX2ZuU3RyaW5nVG9Dc3MoIGhlYWRlckNlbGxzLmVxKGkpLndpZHRoKCkgKTsKCQkJCX0KCQkJfQoJCX0KCQllbHNlCgkJewoJCQkvLyBPdGhlcndpc2UgY29uc3RydWN0IGEgc2luZ2xlIHJvdywgd29yc3QgY2FzZSwgdGFibGUgd2l0aCB0aGUgd2lkZXN0CgkJCS8vIG5vZGUgaW4gdGhlIGRhdGEsIGFzc2lnbiBhbnkgdXNlciBkZWZpbmVkIHdpZHRocywgdGhlbiBpbnNlcnQgaXQgaW50bwoJCQkvLyB0aGUgRE9NIGFuZCBhbGxvdyB0aGUgYnJvd3NlciB0byBkbyBhbGwgdGhlIGhhcmQgd29yayBvZiBjYWxjdWxhdGluZwoJCQkvLyB0YWJsZSB3aWR0aHMKCQkJdmFyIHRtcFRhYmxlID0gJCh0YWJsZSkuY2xvbmUoKSAvLyBkb24ndCB1c2UgY2xvbmVOb2RlIC0gSUU4IHdpbGwgcmVtb3ZlIGV2ZW50cyBvbiB0aGUgbWFpbiB0YWJsZQoJCQkJLmNzcyggJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyApCgkJCQkucmVtb3ZlQXR0ciggJ2lkJyApOwoJCgkJCS8vIENsZWFuIHVwIHRoZSB0YWJsZSBib2R5CgkJCXRtcFRhYmxlLmZpbmQoJ3Rib2R5IHRyJykucmVtb3ZlKCk7CgkJCXZhciB0ciA9ICQoJzx0ci8+JykuYXBwZW5kVG8oIHRtcFRhYmxlLmZpbmQoJ3Rib2R5JykgKTsKCQoJCQkvLyBDbG9uZSB0aGUgdGFibGUgaGVhZGVyIGFuZCBmb290ZXIgLSB3ZSBjYW4ndCB1c2UgdGhlIGhlYWRlciAvIGZvb3RlcgoJCQkvLyBmcm9tIHRoZSBjbG9uZWQgdGFibGUsIHNpbmNlIGlmIHNjcm9sbGluZyBpcyBhY3RpdmUsIHRoZSB0YWJsZSdzCgkJCS8vIHJlYWwgaGVhZGVyIGFuZCBmb290ZXIgYXJlIGNvbnRhaW5lZCBpbiBkaWZmZXJlbnQgdGFibGUgdGFncwoJCQl0bXBUYWJsZS5maW5kKCd0aGVhZCwgdGZvb3QnKS5yZW1vdmUoKTsKCQkJdG1wVGFibGUKCQkJCS5hcHBlbmQoICQob1NldHRpbmdzLm5USGVhZCkuY2xvbmUoKSApCgkJCQkuYXBwZW5kKCAkKG9TZXR0aW5ncy5uVEZvb3QpLmNsb25lKCkgKTsKCQoJCQkvLyBSZW1vdmUgYW55IGFzc2lnbmVkIHdpZHRocyBmcm9tIHRoZSBmb290ZXIgKGZyb20gc2Nyb2xsaW5nKQoJCQl0bXBUYWJsZS5maW5kKCd0Zm9vdCB0aCwgdGZvb3QgdGQnKS5jc3MoJ3dpZHRoJywgJycpOwoJCgkJCS8vIEFwcGx5IGN1c3RvbSBzaXppbmcgdG8gdGhlIGNsb25lZCBoZWFkZXIKCQkJaGVhZGVyQ2VsbHMgPSBfZm5HZXRVbmlxdWVUaHMoIG9TZXR0aW5ncywgdG1wVGFibGUuZmluZCgndGhlYWQnKVswXSApOwoJCgkJCWZvciAoIGk9MCA7IGk8dmlzaWJsZUNvbHVtbnMubGVuZ3RoIDsgaSsrICkgewoJCQkJY29sdW1uID0gY29sdW1uc1sgdmlzaWJsZUNvbHVtbnNbaV0gXTsKCQoJCQkJaGVhZGVyQ2VsbHNbaV0uc3R5bGUud2lkdGggPSBjb2x1bW4uc1dpZHRoT3JpZyAhPT0gbnVsbCAmJiBjb2x1bW4uc1dpZHRoT3JpZyAhPT0gJycgPwoJCQkJCV9mblN0cmluZ1RvQ3NzKCBjb2x1bW4uc1dpZHRoT3JpZyApIDoKCQkJCQknJzsKCQoJCQkJLy8gRm9yIHNjcm9sbFggd2UgbmVlZCB0byBmb3JjZSB0aGUgY29sdW1uIHdpZHRoIG90aGVyd2lzZSB0aGUKCQkJCS8vIGJyb3dzZXIgd2lsbCBjb2xsYXBzZSBpdC4gSWYgdGhpcyB3aWR0aCBpcyBzbWFsbGVyIHRoYW4gdGhlCgkJCQkvLyB3aWR0aCB0aGUgY29sdW1uIHJlcXVpcmVzLCB0aGVuIGl0IHdpbGwgaGF2ZSBubyBlZmZlY3QKCQkJCWlmICggY29sdW1uLnNXaWR0aE9yaWcgJiYgc2Nyb2xsWCApIHsKCQkJCQkkKCBoZWFkZXJDZWxsc1tpXSApLmFwcGVuZCggJCgnPGRpdi8+JykuY3NzKCB7CgkJCQkJCXdpZHRoOiBjb2x1bW4uc1dpZHRoT3JpZywKCQkJCQkJbWFyZ2luOiAwLAoJCQkJCQlwYWRkaW5nOiAwLAoJCQkJCQlib3JkZXI6IDAsCgkJCQkJCWhlaWdodDogMQoJCQkJCX0gKSApOwoJCQkJfQoJCQl9CgkKCQkJLy8gRmluZCB0aGUgd2lkZXN0IGNlbGwgZm9yIGVhY2ggY29sdW1uIGFuZCBwdXQgaXQgaW50byB0aGUgdGFibGUKCQkJaWYgKCBvU2V0dGluZ3MuYW9EYXRhLmxlbmd0aCApIHsKCQkJCWZvciAoIGk9MCA7IGk8dmlzaWJsZUNvbHVtbnMubGVuZ3RoIDsgaSsrICkgewoJCQkJCWNvbHVtbklkeCA9IHZpc2libGVDb2x1bW5zW2ldOwoJCQkJCWNvbHVtbiA9IGNvbHVtbnNbIGNvbHVtbklkeCBdOwoJCgkJCQkJJCggX2ZuR2V0V2lkZXN0Tm9kZSggb1NldHRpbmdzLCBjb2x1bW5JZHggKSApCgkJCQkJCS5jbG9uZSggZmFsc2UgKQoJCQkJCQkuYXBwZW5kKCBjb2x1bW4uc0NvbnRlbnRQYWRkaW5nICkKCQkJCQkJLmFwcGVuZFRvKCB0ciApOwoJCQkJfQoJCQl9CgkKCQkJLy8gVGlkeSB0aGUgdGVtcG9yYXJ5IHRhYmxlIC0gcmVtb3ZlIG5hbWUgYXR0cmlidXRlcyBzbyB0aGVyZSBhcmVuJ3QKCQkJLy8gZHVwbGljYXRlZCBpbiB0aGUgZG9tIChyYWRpbyBlbGVtZW50cyBmb3IgZXhhbXBsZSkKCQkJJCgnW25hbWVdJywgdG1wVGFibGUpLnJlbW92ZUF0dHIoJ25hbWUnKTsKCQoJCQkvLyBUYWJsZSBoYXMgYmVlbiBidWlsdCwgYXR0YWNoIHRvIHRoZSBkb2N1bWVudCBzbyB3ZSBjYW4gd29yayB3aXRoIGl0LgoJCQkvLyBBIGhvbGRpbmcgZWxlbWVudCBpcyB1c2VkLCBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb2YgdGhlIGNvbnRhaW5lcgoJCQkvLyB3aXRoIG1pbmltYWwgaGVpZ2h0LCBzbyBpdCBoYXMgbm8gZWZmZWN0IG9uIGlmIHRoZSBjb250YWluZXIgc2Nyb2xscwoJCQkvLyBvciBub3QuIE90aGVyd2lzZSBpdCBtaWdodCB0cmlnZ2VyIHNjcm9sbGluZyB3aGVuIGl0IGFjdHVhbGx5IGlzbid0CgkJCS8vIG5lZWRlZAoJCQl2YXIgaG9sZGVyID0gJCgnPGRpdi8+JykuY3NzKCBzY3JvbGxYIHx8IHNjcm9sbFkgPwoJCQkJCXsKCQkJCQkJcG9zaXRpb246ICdhYnNvbHV0ZScsCgkJCQkJCXRvcDogMCwKCQkJCQkJbGVmdDogMCwKCQkJCQkJaGVpZ2h0OiAxLAoJCQkJCQlyaWdodDogMCwKCQkJCQkJb3ZlcmZsb3c6ICdoaWRkZW4nCgkJCQkJfSA6CgkJCQkJe30KCQkJCSkKCQkJCS5hcHBlbmQoIHRtcFRhYmxlICkKCQkJCS5hcHBlbmRUbyggdGFibGVDb250YWluZXIgKTsKCQoJCQkvLyBXaGVuIHNjcm9sbGluZyAoWCBvciBZKSB3ZSB3YW50IHRvIHNldCB0aGUgd2lkdGggb2YgdGhlIHRhYmxlIGFzIAoJCQkvLyBhcHByb3ByaWF0ZS4gSG93ZXZlciwgd2hlbiBub3Qgc2Nyb2xsaW5nIGxlYXZlIHRoZSB0YWJsZSB3aWR0aCBhcyBpdAoJCQkvLyBpcy4gVGhpcyByZXN1bHRzIGluIHNsaWdodGx5IGRpZmZlcmVudCwgYnV0IEkgdGhpbmsgY29ycmVjdCBiZWhhdmlvdXIKCQkJaWYgKCBzY3JvbGxYICYmIHNjcm9sbFhJbm5lciApIHsKCQkJCXRtcFRhYmxlLndpZHRoKCBzY3JvbGxYSW5uZXIgKTsKCQkJfQoJCQllbHNlIGlmICggc2Nyb2xsWCApIHsKCQkJCXRtcFRhYmxlLmNzcyggJ3dpZHRoJywgJ2F1dG8nICk7CgkJCQl0bXBUYWJsZS5yZW1vdmVBdHRyKCd3aWR0aCcpOwoJCgkJCQkvLyBJZiB0aGVyZSBpcyBubyB3aWR0aCBhdHRyaWJ1dGUgb3Igc3R5bGUsIHRoZW4gYWxsb3cgdGhlIHRhYmxlIHRvCgkJCQkvLyBjb2xsYXBzZQoJCQkJaWYgKCB0bXBUYWJsZS53aWR0aCgpIDwgdGFibGVDb250YWluZXIuY2xpZW50V2lkdGggJiYgdGFibGVXaWR0aEF0dHIgKSB7CgkJCQkJdG1wVGFibGUud2lkdGgoIHRhYmxlQ29udGFpbmVyLmNsaWVudFdpZHRoICk7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZiAoIHNjcm9sbFkgKSB7CgkJCQl0bXBUYWJsZS53aWR0aCggdGFibGVDb250YWluZXIuY2xpZW50V2lkdGggKTsKCQkJfQoJCQllbHNlIGlmICggdGFibGVXaWR0aEF0dHIgKSB7CgkJCQl0bXBUYWJsZS53aWR0aCggdGFibGVXaWR0aEF0dHIgKTsKCQkJfQoJCgkJCS8vIEdldCB0aGUgd2lkdGggb2YgZWFjaCBjb2x1bW4gaW4gdGhlIGNvbnN0cnVjdGVkIHRhYmxlIC0gd2UgbmVlZCB0bwoJCQkvLyBrbm93IHRoZSBpbm5lciB3aWR0aCAoc28gaXQgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBvdGhlciB0YWJsZSdzCgkJCS8vIGNlbGxzKSBhbmQgdGhlIG91dGVyIHdpZHRoIHNvIHdlIGNhbiBjYWxjdWxhdGUgdGhlIGZ1bGwgd2lkdGggb2YgdGhlCgkJCS8vIHRhYmxlLiBUaGlzIGlzIHNhZmUgc2luY2UgRGF0YVRhYmxlcyByZXF1aXJlcyBhIHVuaXF1ZSBjZWxsIGZvciBlYWNoCgkJCS8vIGNvbHVtbiwgYnV0IGlmIGV2ZXIgYSBoZWFkZXIgY2FuIHNwYW4gbXVsdGlwbGUgY29sdW1ucywgdGhpcyB3aWxsCgkJCS8vIG5lZWQgdG8gYmUgbW9kaWZpZWQuCgkJCXZhciB0b3RhbCA9IDA7CgkJCWZvciAoIGk9MCA7IGk8dmlzaWJsZUNvbHVtbnMubGVuZ3RoIDsgaSsrICkgewoJCQkJdmFyIGNlbGwgPSAkKGhlYWRlckNlbGxzW2ldKTsKCQkJCXZhciBib3JkZXIgPSBjZWxsLm91dGVyV2lkdGgoKSAtIGNlbGwud2lkdGgoKTsKCQoJCQkJLy8gVXNlIGdldEJvdW5kaW5nLi4uIHdoZXJlIHBvc3NpYmxlIChub3QgSUU4LSkgYmVjYXVzZSBpdCBjYW4gZ2l2ZQoJCQkJLy8gc3ViLXBpeGVsIGFjY3VyYWN5LCB3aGljaCB3ZSB0aGVuIHdhbnQgdG8gcm91bmQgdXAhCgkJCQl2YXIgYm91bmRpbmcgPSBicm93c2VyLmJCb3VuZGluZyA/CgkJCQkJTWF0aC5jZWlsKCBoZWFkZXJDZWxsc1tpXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApIDoKCQkJCQljZWxsLm91dGVyV2lkdGgoKTsKCQoJCQkJLy8gVG90YWwgaXMgdHJhY2tlZCB0byByZW1vdmUgYW55IHN1Yi1waXhlbCBlcnJvcnMgYXMgdGhlIG91dGVyV2lkdGgKCQkJCS8vIG9mIHRoZSB0YWJsZSBtaWdodCBub3QgZXF1YWwgdGhlIHRvdGFsIGdpdmVuIGhlcmUgKElFISkuCgkJCQl0b3RhbCArPSBib3VuZGluZzsKCQoJCQkJLy8gV2lkdGggZm9yIGVhY2ggY29sdW1uIHRvIHVzZQoJCQkJY29sdW1uc1sgdmlzaWJsZUNvbHVtbnNbaV0gXS5zV2lkdGggPSBfZm5TdHJpbmdUb0NzcyggYm91bmRpbmcgLSBib3JkZXIgKTsKCQkJfQoJCgkJCXRhYmxlLnN0eWxlLndpZHRoID0gX2ZuU3RyaW5nVG9Dc3MoIHRvdGFsICk7CgkKCQkJLy8gRmluaXNoZWQgd2l0aCB0aGUgdGFibGUgLSBkaXRjaCBpdAoJCQlob2xkZXIucmVtb3ZlKCk7CgkJfQoJCgkJLy8gSWYgdGhlcmUgaXMgYSB3aWR0aCBhdHRyLCB3ZSB3YW50IHRvIGF0dGFjaCBhbiBldmVudCBsaXN0ZW5lciB3aGljaAoJCS8vIGFsbG93cyB0aGUgdGFibGUgc2l6aW5nIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHdoZW4gdGhlIHdpbmRvdyBpcwoJCS8vIHJlc2l6ZWQuIFVzZSB0aGUgd2lkdGggYXR0ciByYXRoZXIgdGhhbiBDU1MsIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgdGhlCgkJLy8gQ1NTIGlzIGEgcmVsYXRpdmUgdmFsdWUgb3IgYWJzb2x1dGUgLSBET00gcmVhZCBpcyBhbHdheXMgcHguCgkJaWYgKCB0YWJsZVdpZHRoQXR0ciApIHsKCQkJdGFibGUuc3R5bGUud2lkdGggPSBfZm5TdHJpbmdUb0NzcyggdGFibGVXaWR0aEF0dHIgKTsKCQl9CgkKCQlpZiAoICh0YWJsZVdpZHRoQXR0ciB8fCBzY3JvbGxYKSAmJiAhIG9TZXR0aW5ncy5fcmVzekV2dCApIHsKCQkJdmFyIGJpbmRSZXNpemUgPSBmdW5jdGlvbiAoKSB7CgkJCQkkKHdpbmRvdykub24oJ3Jlc2l6ZS5EVC0nK29TZXR0aW5ncy5zSW5zdGFuY2UsIF9mblRocm90dGxlKCBmdW5jdGlvbiAoKSB7CgkJCQkJX2ZuQWRqdXN0Q29sdW1uU2l6aW5nKCBvU2V0dGluZ3MgKTsKCQkJCX0gKSApOwoJCQl9OwoJCgkJCS8vIElFNi83IHdpbGwgY3Jhc2ggaWYgd2UgYmluZCBhIHJlc2l6ZSBldmVudCBoYW5kbGVyIG9uIHBhZ2UgbG9hZC4KCQkJLy8gVG8gYmUgcmVtb3ZlZCBpbiAxLjExIHdoaWNoIGRyb3BzIElFNi83IHN1cHBvcnQKCQkJaWYgKCBpZTY3ICkgewoJCQkJc2V0VGltZW91dCggYmluZFJlc2l6ZSwgMTAwMCApOwoJCQl9CgkJCWVsc2UgewoJCQkJYmluZFJlc2l6ZSgpOwoJCQl9CgkKCQkJb1NldHRpbmdzLl9yZXN6RXZ0ID0gdHJ1ZTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBUaHJvdHRsZSB0aGUgY2FsbHMgdG8gYSBmdW5jdGlvbi4gQXJndW1lbnRzIGFuZCBjb250ZXh0IGFyZSBtYWludGFpbmVkIGZvcgoJICogdGhlIHRocm90dGxlZCBmdW5jdGlvbgoJICogIEBwYXJhbSB7ZnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZAoJICogIEBwYXJhbSB7aW50fSBbZnJlcT0yMDBdIGNhbGwgZnJlcXVlbmN5IGluIG1TCgkgKiAgQHJldHVybnMge2Z1bmN0aW9ufSB3cmFwcGVkIGZ1bmN0aW9uCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCXZhciBfZm5UaHJvdHRsZSA9IERhdGFUYWJsZS51dGlsLnRocm90dGxlOwoJCgkKCS8qKgoJICogQ29udmVydCBhIENTUyB1bml0IHdpZHRoIHRvIHBpeGVscyAoZS5nLiAyZW0pCgkgKiAgQHBhcmFtIHtzdHJpbmd9IHdpZHRoIHdpZHRoIHRvIGJlIGNvbnZlcnRlZAoJICogIEBwYXJhbSB7bm9kZX0gcGFyZW50IHBhcmVudCB0byBnZXQgdGhlIHdpdGggZm9yIChyZXF1aXJlZCBmb3IgcmVsYXRpdmUgd2lkdGhzKSAtIG9wdGlvbmFsCgkgKiAgQHJldHVybnMge2ludH0gd2lkdGggaW4gcGl4ZWxzCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkNvbnZlcnRUb1dpZHRoICggd2lkdGgsIHBhcmVudCApCgl7CgkJaWYgKCAhIHdpZHRoICkgewoJCQlyZXR1cm4gMDsKCQl9CgkKCQl2YXIgbiA9ICQoJzxkaXYvPicpCgkJCS5jc3MoICd3aWR0aCcsIF9mblN0cmluZ1RvQ3NzKCB3aWR0aCApICkKCQkJLmFwcGVuZFRvKCBwYXJlbnQgfHwgZG9jdW1lbnQuYm9keSApOwoJCgkJdmFyIHZhbCA9IG5bMF0ub2Zmc2V0V2lkdGg7CgkJbi5yZW1vdmUoKTsKCQoJCXJldHVybiB2YWw7Cgl9CgkKCQoJLyoqCgkgKiBHZXQgdGhlIHdpZGVzdCBub2RlCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtpbnR9IGNvbElkeCBjb2x1bW4gb2YgaW50ZXJlc3QKCSAqICBAcmV0dXJucyB7bm9kZX0gd2lkZXN0IHRhYmxlIG5vZGUKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuR2V0V2lkZXN0Tm9kZSggc2V0dGluZ3MsIGNvbElkeCApCgl7CgkJdmFyIGlkeCA9IF9mbkdldE1heExlblN0cmluZyggc2V0dGluZ3MsIGNvbElkeCApOwoJCWlmICggaWR4IDwgMCApIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCgkJdmFyIGRhdGEgPSBzZXR0aW5ncy5hb0RhdGFbIGlkeCBdOwoJCXJldHVybiAhIGRhdGEublRyID8gLy8gTWlnaHQgbm90IGhhdmUgYmVlbiBjcmVhdGVkIHdoZW4gZGVmZXJyZWQgcmVuZGVyaW5nCgkJCSQoJzx0ZC8+JykuaHRtbCggX2ZuR2V0Q2VsbERhdGEoIHNldHRpbmdzLCBpZHgsIGNvbElkeCwgJ2Rpc3BsYXknICkgKVswXSA6CgkJCWRhdGEuYW5DZWxsc1sgY29sSWR4IF07Cgl9CgkKCQoJLyoqCgkgKiBHZXQgdGhlIG1heGltdW0gc3RybGVuIGZvciBlYWNoIGRhdGEgY29sdW1uCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtpbnR9IGNvbElkeCBjb2x1bW4gb2YgaW50ZXJlc3QKCSAqICBAcmV0dXJucyB7c3RyaW5nfSBtYXggc3RyaW5nIGxlbmd0aCBmb3IgZWFjaCBjb2x1bW4KCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuR2V0TWF4TGVuU3RyaW5nKCBzZXR0aW5ncywgY29sSWR4ICkKCXsKCQl2YXIgcywgbWF4PS0xLCBtYXhJZHggPSAtMTsKCQoJCWZvciAoIHZhciBpPTAsIGllbj1zZXR0aW5ncy5hb0RhdGEubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCXMgPSBfZm5HZXRDZWxsRGF0YSggc2V0dGluZ3MsIGksIGNvbElkeCwgJ2Rpc3BsYXknICkrJyc7CgkJCXMgPSBzLnJlcGxhY2UoIF9fcmVfaHRtbF9yZW1vdmUsICcnICk7CgkJCXMgPSBzLnJlcGxhY2UoIC8mbmJzcDsvZywgJyAnICk7CgkKCQkJaWYgKCBzLmxlbmd0aCA+IG1heCApIHsKCQkJCW1heCA9IHMubGVuZ3RoOwoJCQkJbWF4SWR4ID0gaTsKCQkJfQoJCX0KCQoJCXJldHVybiBtYXhJZHg7Cgl9CgkKCQoJLyoqCgkgKiBBcHBlbmQgYSBDU1MgdW5pdCAob25seSBpZiByZXF1aXJlZCkgdG8gYSBzdHJpbmcKCSAqICBAcGFyYW0ge3N0cmluZ30gdmFsdWUgdG8gY3NzLWlmeQoJICogIEByZXR1cm5zIHtzdHJpbmd9IHZhbHVlIHdpdGggY3NzIHVuaXQKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuU3RyaW5nVG9Dc3MoIHMgKQoJewoJCWlmICggcyA9PT0gbnVsbCApIHsKCQkJcmV0dXJuICcwcHgnOwoJCX0KCQoJCWlmICggdHlwZW9mIHMgPT0gJ251bWJlcicgKSB7CgkJCXJldHVybiBzIDwgMCA/CgkJCQknMHB4JyA6CgkJCQlzKydweCc7CgkJfQoJCgkJLy8gQ2hlY2sgaXQgaGFzIGEgdW5pdCBjaGFyYWN0ZXIgYWxyZWFkeQoJCXJldHVybiBzLm1hdGNoKC9cZCQvKSA/CgkJCXMrJ3B4JyA6CgkJCXM7Cgl9CgkKCQoJCglmdW5jdGlvbiBfZm5Tb3J0RmxhdHRlbiAoIHNldHRpbmdzICkKCXsKCQl2YXIKCQkJaSwgaUxlbiwgaywga0xlbiwKCQkJYVNvcnQgPSBbXSwKCQkJYWlPcmlnID0gW10sCgkJCWFvQ29sdW1ucyA9IHNldHRpbmdzLmFvQ29sdW1ucywKCQkJYURhdGFTb3J0LCBpQ29sLCBzVHlwZSwgc3JjQ29sLAoJCQlmaXhlZCA9IHNldHRpbmdzLmFhU29ydGluZ0ZpeGVkLAoJCQlmaXhlZE9iaiA9ICQuaXNQbGFpbk9iamVjdCggZml4ZWQgKSwKCQkJbmVzdGVkU29ydCA9IFtdLAoJCQlhZGQgPSBmdW5jdGlvbiAoIGEgKSB7CgkJCQlpZiAoIGEubGVuZ3RoICYmICEgQXJyYXkuaXNBcnJheSggYVswXSApICkgewoJCQkJCS8vIDFEIGFycmF5CgkJCQkJbmVzdGVkU29ydC5wdXNoKCBhICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQkvLyAyRCBhcnJheQoJCQkJCSQubWVyZ2UoIG5lc3RlZFNvcnQsIGEgKTsKCQkJCX0KCQkJfTsKCQoJCS8vIEJ1aWxkIHRoZSBzb3J0IGFycmF5LCB3aXRoIHByZS1maXggYW5kIHBvc3QtZml4IG9wdGlvbnMgaWYgdGhleSBoYXZlIGJlZW4KCQkvLyBzcGVjaWZpZWQKCQlpZiAoIEFycmF5LmlzQXJyYXkoIGZpeGVkICkgKSB7CgkJCWFkZCggZml4ZWQgKTsKCQl9CgkKCQlpZiAoIGZpeGVkT2JqICYmIGZpeGVkLnByZSApIHsKCQkJYWRkKCBmaXhlZC5wcmUgKTsKCQl9CgkKCQlhZGQoIHNldHRpbmdzLmFhU29ydGluZyApOwoJCgkJaWYgKGZpeGVkT2JqICYmIGZpeGVkLnBvc3QgKSB7CgkJCWFkZCggZml4ZWQucG9zdCApOwoJCX0KCQoJCWZvciAoIGk9MCA7IGk8bmVzdGVkU29ydC5sZW5ndGggOyBpKysgKQoJCXsKCQkJc3JjQ29sID0gbmVzdGVkU29ydFtpXVswXTsKCQkJYURhdGFTb3J0ID0gYW9Db2x1bW5zWyBzcmNDb2wgXS5hRGF0YVNvcnQ7CgkKCQkJZm9yICggaz0wLCBrTGVuPWFEYXRhU29ydC5sZW5ndGggOyBrPGtMZW4gOyBrKysgKQoJCQl7CgkJCQlpQ29sID0gYURhdGFTb3J0W2tdOwoJCQkJc1R5cGUgPSBhb0NvbHVtbnNbIGlDb2wgXS5zVHlwZSB8fCAnc3RyaW5nJzsKCQoJCQkJaWYgKCBuZXN0ZWRTb3J0W2ldLl9pZHggPT09IHVuZGVmaW5lZCApIHsKCQkJCQluZXN0ZWRTb3J0W2ldLl9pZHggPSAkLmluQXJyYXkoIG5lc3RlZFNvcnRbaV1bMV0sIGFvQ29sdW1uc1tpQ29sXS5hc1NvcnRpbmcgKTsKCQkJCX0KCQoJCQkJYVNvcnQucHVzaCggewoJCQkJCXNyYzogICAgICAgc3JjQ29sLAoJCQkJCWNvbDogICAgICAgaUNvbCwKCQkJCQlkaXI6ICAgICAgIG5lc3RlZFNvcnRbaV1bMV0sCgkJCQkJaW5kZXg6ICAgICBuZXN0ZWRTb3J0W2ldLl9pZHgsCgkJCQkJdHlwZTogICAgICBzVHlwZSwKCQkJCQlmb3JtYXR0ZXI6IERhdGFUYWJsZS5leHQudHlwZS5vcmRlclsgc1R5cGUrIi1wcmUiIF0KCQkJCX0gKTsKCQkJfQoJCX0KCQoJCXJldHVybiBhU29ydDsKCX0KCQoJLyoqCgkgKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSB0YWJsZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqICBAdG9kbyBUaGlzIHJlYWxseSBuZWVkcyBzcGxpdCB1cCEKCSAqLwoJZnVuY3Rpb24gX2ZuU29ydCAoIG9TZXR0aW5ncyApCgl7CgkJdmFyCgkJCWksIGllbiwgaUxlbiwgaiwgakxlbiwgaywga0xlbiwKCQkJc0RhdGFUeXBlLCBuVGgsCgkJCWFpT3JpZyA9IFtdLAoJCQlvRXh0U29ydCA9IERhdGFUYWJsZS5leHQudHlwZS5vcmRlciwKCQkJYW9EYXRhID0gb1NldHRpbmdzLmFvRGF0YSwKCQkJYW9Db2x1bW5zID0gb1NldHRpbmdzLmFvQ29sdW1ucywKCQkJYURhdGFTb3J0LCBkYXRhLCBpQ29sLCBzVHlwZSwgb1NvcnQsCgkJCWZvcm1hdHRlcnMgPSAwLAoJCQlzb3J0Q29sLAoJCQlkaXNwbGF5TWFzdGVyID0gb1NldHRpbmdzLmFpRGlzcGxheU1hc3RlciwKCQkJYVNvcnQ7CgkKCQkvLyBSZXNvbHZlIGFueSBjb2x1bW4gdHlwZXMgdGhhdCBhcmUgdW5rbm93biBkdWUgdG8gYWRkaXRpb24gb3IgaW52YWxpZGF0aW9uCgkJLy8gQHRvZG8gQ2FuIHRoaXMgYmUgbW92ZWQgaW50byBhICdkYXRhLXJlYWR5JyBoYW5kbGVyIHdoaWNoIGlzIGNhbGxlZCB3aGVuCgkJLy8gICBkYXRhIGlzIGdvaW5nIHRvIGJlIHVzZWQgaW4gdGhlIHRhYmxlPwoJCV9mbkNvbHVtblR5cGVzKCBvU2V0dGluZ3MgKTsKCQoJCWFTb3J0ID0gX2ZuU29ydEZsYXR0ZW4oIG9TZXR0aW5ncyApOwoJCgkJZm9yICggaT0wLCBpZW49YVNvcnQubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCXNvcnRDb2wgPSBhU29ydFtpXTsKCQoJCQkvLyBUcmFjayBpZiB3ZSBjYW4gdXNlIHRoZSBmYXN0IHNvcnQgYWxnb3JpdGhtCgkJCWlmICggc29ydENvbC5mb3JtYXR0ZXIgKSB7CgkJCQlmb3JtYXR0ZXJzKys7CgkJCX0KCQoJCQkvLyBMb2FkIHRoZSBkYXRhIG5lZWRlZCBmb3IgdGhlIHNvcnQsIGZvciBlYWNoIGNlbGwKCQkJX2ZuU29ydERhdGEoIG9TZXR0aW5ncywgc29ydENvbC5jb2wgKTsKCQl9CgkKCQkvKiBObyBzb3J0aW5nIHJlcXVpcmVkIGlmIHNlcnZlci1zaWRlIG9yIG5vIHNvcnRpbmcgYXJyYXkgKi8KCQlpZiAoIF9mbkRhdGFTb3VyY2UoIG9TZXR0aW5ncyApICE9ICdzc3AnICYmIGFTb3J0Lmxlbmd0aCAhPT0gMCApCgkJewoJCQkvLyBDcmVhdGUgYSB2YWx1ZSAtIGtleSBhcnJheSBvZiB0aGUgY3VycmVudCByb3cgcG9zaXRpb25zIHN1Y2ggdGhhdCB3ZSBjYW4gdXNlIHRoZWlyCgkJCS8vIGN1cnJlbnQgcG9zaXRpb24gZHVyaW5nIHRoZSBzb3J0LCBpZiB2YWx1ZXMgbWF0Y2gsIGluIG9yZGVyIHRvIHBlcmZvcm0gc3RhYmxlIHNvcnRpbmcKCQkJZm9yICggaT0wLCBpTGVuPWRpc3BsYXlNYXN0ZXIubGVuZ3RoIDsgaTxpTGVuIDsgaSsrICkgewoJCQkJYWlPcmlnWyBkaXNwbGF5TWFzdGVyW2ldIF0gPSBpOwoJCQl9CgkKCQkJLyogRG8gdGhlIHNvcnQgLSBoZXJlIHdlIHdhbnQgbXVsdGktY29sdW1uIHNvcnRpbmcgYmFzZWQgb24gYSBnaXZlbiBkYXRhIHNvdXJjZSAoY29sdW1uKQoJCQkgKiBhbmQgc29ydGluZyBmdW5jdGlvbiAoZnJvbSBvU29ydCkgaW4gYSBjZXJ0YWluIGRpcmVjdGlvbi4gSXQncyByZWFzb25hYmx5IGNvbXBsZXggdG8KCQkJICogZm9sbG93IG9uIGl0J3Mgb3duLCBidXQgdGhpcyBpcyB3aGF0IHdlIHdhbnQgKGV4YW1wbGUgdHdvIGNvbHVtbiBzb3J0aW5nKToKCQkJICogIGZuTG9jYWxTb3J0aW5nID0gZnVuY3Rpb24oYSxiKXsKCQkJICogICAgdmFyIGlUZXN0OwoJCQkgKiAgICBpVGVzdCA9IG9Tb3J0WydzdHJpbmctYXNjJ10oJ2RhdGExMScsICdkYXRhMTInKTsKCQkJICogICAgICBpZiAoaVRlc3QgIT09IDApCgkJCSAqICAgICAgICByZXR1cm4gaVRlc3Q7CgkJCSAqICAgIGlUZXN0ID0gb1NvcnRbJ251bWVyaWMtZGVzYyddKCdkYXRhMjEnLCAnZGF0YTIyJyk7CgkJCSAqICAgIGlmIChpVGVzdCAhPT0gMCkKCQkJICogICAgICByZXR1cm4gaVRlc3Q7CgkJCSAqICAgIHJldHVybiBvU29ydFsnbnVtZXJpYy1hc2MnXSggYWlPcmlnW2FdLCBhaU9yaWdbYl0gKTsKCQkJICogIH0KCQkJICogQmFzaWNhbGx5IHdlIGhhdmUgYSB0ZXN0IGZvciBlYWNoIHNvcnRpbmcgY29sdW1uLCBpZiB0aGUgZGF0YSBpbiB0aGF0IGNvbHVtbiBpcyBlcXVhbCwKCQkJICogdGVzdCB0aGUgbmV4dCBjb2x1bW4uIElmIGFsbCBjb2x1bW5zIG1hdGNoLCB0aGVuIHdlIHVzZSBhIG51bWVyaWMgc29ydCBvbiB0aGUgcm93CgkJCSAqIHBvc2l0aW9ucyBpbiB0aGUgb3JpZ2luYWwgZGF0YSBhcnJheSB0byBwcm92aWRlIGEgc3RhYmxlIHNvcnQuCgkJCSAqCgkJCSAqIE5vdGUgLSBJIGtub3cgaXQgc2VlbXMgZXhjZXNzaXZlIHRvIGhhdmUgdHdvIHNvcnRpbmcgbWV0aG9kcywgYnV0IHRoZSBmaXJzdCBpcyBhcm91bmQKCQkJICogMTUlIGZhc3Rlciwgc28gdGhlIHNlY29uZCBpcyBvbmx5IG1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggc29ydGluZwoJCQkgKiBtZXRob2RzIHdoaWNoIGRvIG5vdCBoYXZlIGEgcHJlLXNvcnQgZm9ybWF0dGluZyBmdW5jdGlvbi4KCQkJICovCgkJCWlmICggZm9ybWF0dGVycyA9PT0gYVNvcnQubGVuZ3RoICkgewoJCQkJLy8gQWxsIHNvcnQgdHlwZXMgaGF2ZSBmb3JtYXR0aW5nIGZ1bmN0aW9ucwoJCQkJZGlzcGxheU1hc3Rlci5zb3J0KCBmdW5jdGlvbiAoIGEsIGIgKSB7CgkJCQkJdmFyCgkJCQkJCXgsIHksIGssIHRlc3QsIHNvcnQsCgkJCQkJCWxlbj1hU29ydC5sZW5ndGgsCgkJCQkJCWRhdGFBID0gYW9EYXRhW2FdLl9hU29ydERhdGEsCgkJCQkJCWRhdGFCID0gYW9EYXRhW2JdLl9hU29ydERhdGE7CgkKCQkJCQlmb3IgKCBrPTAgOyBrPGxlbiA7IGsrKyApIHsKCQkJCQkJc29ydCA9IGFTb3J0W2tdOwoJCgkJCQkJCXggPSBkYXRhQVsgc29ydC5jb2wgXTsKCQkJCQkJeSA9IGRhdGFCWyBzb3J0LmNvbCBdOwoJCgkJCQkJCXRlc3QgPSB4PHkgPyAtMSA6IHg+eSA/IDEgOiAwOwoJCQkJCQlpZiAoIHRlc3QgIT09IDAgKSB7CgkJCQkJCQlyZXR1cm4gc29ydC5kaXIgPT09ICdhc2MnID8gdGVzdCA6IC10ZXN0OwoJCQkJCQl9CgkJCQkJfQoJCgkJCQkJeCA9IGFpT3JpZ1thXTsKCQkJCQl5ID0gYWlPcmlnW2JdOwoJCQkJCXJldHVybiB4PHkgPyAtMSA6IHg+eSA/IDEgOiAwOwoJCQkJfSApOwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gRGVwcmVjaWF0ZWQgLSByZW1vdmUgaW4gMS4xMSAocHJvdmlkaW5nIGEgcGx1Zy1pbiBvcHRpb24pCgkJCQkvLyBOb3QgYWxsIHNvcnQgdHlwZXMgaGF2ZSBmb3JtYXR0aW5nIG1ldGhvZHMsIHNvIHdlIGhhdmUgdG8gY2FsbCB0aGVpciBzb3J0aW5nCgkJCQkvLyBtZXRob2RzLgoJCQkJZGlzcGxheU1hc3Rlci5zb3J0KCBmdW5jdGlvbiAoIGEsIGIgKSB7CgkJCQkJdmFyCgkJCQkJCXgsIHksIGssIGwsIHRlc3QsIHNvcnQsIGZuLAoJCQkJCQlsZW49YVNvcnQubGVuZ3RoLAoJCQkJCQlkYXRhQSA9IGFvRGF0YVthXS5fYVNvcnREYXRhLAoJCQkJCQlkYXRhQiA9IGFvRGF0YVtiXS5fYVNvcnREYXRhOwoJCgkJCQkJZm9yICggaz0wIDsgazxsZW4gOyBrKysgKSB7CgkJCQkJCXNvcnQgPSBhU29ydFtrXTsKCQoJCQkJCQl4ID0gZGF0YUFbIHNvcnQuY29sIF07CgkJCQkJCXkgPSBkYXRhQlsgc29ydC5jb2wgXTsKCQoJCQkJCQlmbiA9IG9FeHRTb3J0WyBzb3J0LnR5cGUrIi0iK3NvcnQuZGlyIF0gfHwgb0V4dFNvcnRbICJzdHJpbmctIitzb3J0LmRpciBdOwoJCQkJCQl0ZXN0ID0gZm4oIHgsIHkgKTsKCQkJCQkJaWYgKCB0ZXN0ICE9PSAwICkgewoJCQkJCQkJcmV0dXJuIHRlc3Q7CgkJCQkJCX0KCQkJCQl9CgkKCQkJCQl4ID0gYWlPcmlnW2FdOwoJCQkJCXkgPSBhaU9yaWdbYl07CgkJCQkJcmV0dXJuIHg8eSA/IC0xIDogeD55ID8gMSA6IDA7CgkJCQl9ICk7CgkJCX0KCQl9CgkKCQkvKiBUZWxsIHRoZSBkcmF3IGZ1bmN0aW9uIHRoYXQgd2UgaGF2ZSBzb3J0ZWQgdGhlIGRhdGEgKi8KCQlvU2V0dGluZ3MuYlNvcnRlZCA9IHRydWU7Cgl9CgkKCQoJZnVuY3Rpb24gX2ZuU29ydEFyaWEgKCBzZXR0aW5ncyApCgl7CgkJdmFyIGxhYmVsOwoJCXZhciBuZXh0U29ydDsKCQl2YXIgY29sdW1ucyA9IHNldHRpbmdzLmFvQ29sdW1uczsKCQl2YXIgYVNvcnQgPSBfZm5Tb3J0RmxhdHRlbiggc2V0dGluZ3MgKTsKCQl2YXIgb0FyaWEgPSBzZXR0aW5ncy5vTGFuZ3VhZ2Uub0FyaWE7CgkKCQkvLyBBUklBIGF0dHJpYnV0ZXMgLSBuZWVkIHRvIGxvb3AgYWxsIGNvbHVtbnMsIHRvIHVwZGF0ZSBhbGwgKHJlbW92aW5nIG9sZAoJCS8vIGF0dHJpYnV0ZXMgYXMgbmVlZGVkKQoJCWZvciAoIHZhciBpPTAsIGlMZW49Y29sdW1ucy5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCXsKCQkJdmFyIGNvbCA9IGNvbHVtbnNbaV07CgkJCXZhciBhc1NvcnRpbmcgPSBjb2wuYXNTb3J0aW5nOwoJCQl2YXIgc1RpdGxlID0gY29sLmFyaWFUaXRsZSB8fCBjb2wuc1RpdGxlLnJlcGxhY2UoIC88Lio/Pi9nLCAiIiApOwoJCQl2YXIgdGggPSBjb2wublRoOwoJCgkJCS8vIElFNyBpcyB0aHJvd2luZyBhbiBlcnJvciB3aGVuIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcyB3aXRoIGpRdWVyeSdzCgkJCS8vIGF0dHIoKSBhbmQgcmVtb3ZlQXR0cigpIG1ldGhvZHMuLi4KCQkJdGgucmVtb3ZlQXR0cmlidXRlKCdhcmlhLXNvcnQnKTsKCQoJCQkvKiBJbiBBUklBIG9ubHkgdGhlIGZpcnN0IHNvcnRpbmcgY29sdW1uIGNhbiBiZSBtYXJrZWQgYXMgc29ydGluZyAtIG5vIG11bHRpLXNvcnQgb3B0aW9uICovCgkJCWlmICggY29sLmJTb3J0YWJsZSApIHsKCQkJCWlmICggYVNvcnQubGVuZ3RoID4gMCAmJiBhU29ydFswXS5jb2wgPT0gaSApIHsKCQkJCQl0aC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc29ydCcsIGFTb3J0WzBdLmRpcj09ImFzYyIgPyAiYXNjZW5kaW5nIiA6ICJkZXNjZW5kaW5nIiApOwoJCQkJCW5leHRTb3J0ID0gYXNTb3J0aW5nWyBhU29ydFswXS5pbmRleCsxIF0gfHwgYXNTb3J0aW5nWzBdOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJbmV4dFNvcnQgPSBhc1NvcnRpbmdbMF07CgkJCQl9CgkKCQkJCWxhYmVsID0gc1RpdGxlICsgKCBuZXh0U29ydCA9PT0gImFzYyIgPwoJCQkJCW9BcmlhLnNTb3J0QXNjZW5kaW5nIDoKCQkJCQlvQXJpYS5zU29ydERlc2NlbmRpbmcKCQkJCSk7CgkJCX0KCQkJZWxzZSB7CgkJCQlsYWJlbCA9IHNUaXRsZTsKCQkJfQoJCgkJCXRoLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGxhYmVsKTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBGdW5jdGlvbiB0byBydW4gb24gdXNlciBzb3J0IHJlcXVlc3QKCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAcGFyYW0ge25vZGV9IGF0dGFjaFRvIG5vZGUgdG8gYXR0YWNoIHRoZSBoYW5kbGVyIHRvCgkgKiAgQHBhcmFtIHtpbnR9IGNvbElkeCBjb2x1bW4gc29ydGluZyBpbmRleAoJICogIEBwYXJhbSB7Ym9vbGVhbn0gW2FwcGVuZD1mYWxzZV0gQXBwZW5kIHRoZSByZXF1ZXN0ZWQgc29ydCB0byB0aGUgZXhpc3RpbmcKCSAqICAgIHNvcnQgaWYgdHJ1ZSAoaS5lLiBtdWx0aS1jb2x1bW4gc29ydCkKCSAqICBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIGNhbGxiYWNrIGZ1bmN0aW9uCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNvcnRMaXN0ZW5lciAoIHNldHRpbmdzLCBjb2xJZHgsIGFwcGVuZCwgY2FsbGJhY2sgKQoJewoJCXZhciBjb2wgPSBzZXR0aW5ncy5hb0NvbHVtbnNbIGNvbElkeCBdOwoJCXZhciBzb3J0aW5nID0gc2V0dGluZ3MuYWFTb3J0aW5nOwoJCXZhciBhc1NvcnRpbmcgPSBjb2wuYXNTb3J0aW5nOwoJCXZhciBuZXh0U29ydElkeDsKCQl2YXIgbmV4dCA9IGZ1bmN0aW9uICggYSwgb3ZlcmZsb3cgKSB7CgkJCXZhciBpZHggPSBhLl9pZHg7CgkJCWlmICggaWR4ID09PSB1bmRlZmluZWQgKSB7CgkJCQlpZHggPSAkLmluQXJyYXkoIGFbMV0sIGFzU29ydGluZyApOwoJCQl9CgkKCQkJcmV0dXJuIGlkeCsxIDwgYXNTb3J0aW5nLmxlbmd0aCA/CgkJCQlpZHgrMSA6CgkJCQlvdmVyZmxvdyA/CgkJCQkJbnVsbCA6CgkJCQkJMDsKCQl9OwoJCgkJLy8gQ29udmVydCB0byAyRCBhcnJheSBpZiBuZWVkZWQKCQlpZiAoIHR5cGVvZiBzb3J0aW5nWzBdID09PSAnbnVtYmVyJyApIHsKCQkJc29ydGluZyA9IHNldHRpbmdzLmFhU29ydGluZyA9IFsgc29ydGluZyBdOwoJCX0KCQoJCS8vIElmIGFwcGVuZGluZyB0aGUgc29ydCB0aGVuIHdlIGFyZSBtdWx0aS1jb2x1bW4gc29ydGluZwoJCWlmICggYXBwZW5kICYmIHNldHRpbmdzLm9GZWF0dXJlcy5iU29ydE11bHRpICkgewoJCQkvLyBBcmUgd2UgYWxyZWFkeSBkb2luZyBzb21lIGtpbmQgb2Ygc29ydCBvbiB0aGlzIGNvbHVtbj8KCQkJdmFyIHNvcnRJZHggPSAkLmluQXJyYXkoIGNvbElkeCwgX3BsdWNrKHNvcnRpbmcsICcwJykgKTsKCQoJCQlpZiAoIHNvcnRJZHggIT09IC0xICkgewoJCQkJLy8gWWVzLCBtb2RpZnkgdGhlIHNvcnQKCQkJCW5leHRTb3J0SWR4ID0gbmV4dCggc29ydGluZ1tzb3J0SWR4XSwgdHJ1ZSApOwoJCgkJCQlpZiAoIG5leHRTb3J0SWR4ID09PSBudWxsICYmIHNvcnRpbmcubGVuZ3RoID09PSAxICkgewoJCQkJCW5leHRTb3J0SWR4ID0gMDsgLy8gY2FuJ3QgcmVtb3ZlIHNvcnRpbmcgY29tcGxldGVseQoJCQkJfQoJCgkJCQlpZiAoIG5leHRTb3J0SWR4ID09PSBudWxsICkgewoJCQkJCXNvcnRpbmcuc3BsaWNlKCBzb3J0SWR4LCAxICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlzb3J0aW5nW3NvcnRJZHhdWzFdID0gYXNTb3J0aW5nWyBuZXh0U29ydElkeCBdOwoJCQkJCXNvcnRpbmdbc29ydElkeF0uX2lkeCA9IG5leHRTb3J0SWR4OwoJCQkJfQoJCQl9CgkJCWVsc2UgewoJCQkJLy8gTm8gc29ydCBvbiB0aGlzIGNvbHVtbiB5ZXQKCQkJCXNvcnRpbmcucHVzaCggWyBjb2xJZHgsIGFzU29ydGluZ1swXSwgMCBdICk7CgkJCQlzb3J0aW5nW3NvcnRpbmcubGVuZ3RoLTFdLl9pZHggPSAwOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzb3J0aW5nLmxlbmd0aCAmJiBzb3J0aW5nWzBdWzBdID09IGNvbElkeCApIHsKCQkJLy8gU2luZ2xlIGNvbHVtbiAtIGFscmVhZHkgc29ydGluZyBvbiB0aGlzIGNvbHVtbiwgbW9kaWZ5IHRoZSBzb3J0CgkJCW5leHRTb3J0SWR4ID0gbmV4dCggc29ydGluZ1swXSApOwoJCgkJCXNvcnRpbmcubGVuZ3RoID0gMTsKCQkJc29ydGluZ1swXVsxXSA9IGFzU29ydGluZ1sgbmV4dFNvcnRJZHggXTsKCQkJc29ydGluZ1swXS5faWR4ID0gbmV4dFNvcnRJZHg7CgkJfQoJCWVsc2UgewoJCQkvLyBTaW5nbGUgY29sdW1uIC0gc29ydCBvbmx5IG9uIHRoaXMgY29sdW1uCgkJCXNvcnRpbmcubGVuZ3RoID0gMDsKCQkJc29ydGluZy5wdXNoKCBbIGNvbElkeCwgYXNTb3J0aW5nWzBdIF0gKTsKCQkJc29ydGluZ1swXS5faWR4ID0gMDsKCQl9CgkKCQkvLyBSdW4gdGhlIHNvcnQgYnkgY2FsbGluZyBhIGZ1bGwgcmVkcmF3CgkJX2ZuUmVEcmF3KCBzZXR0aW5ncyApOwoJCgkJLy8gY2FsbGJhY2sgdXNlZCBmb3IgYXN5bmMgdXNlciBpbnRlcmFjdGlvbgoJCWlmICggdHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicgKSB7CgkJCWNhbGxiYWNrKCBzZXR0aW5ncyApOwoJCX0KCX0KCQoJCgkvKioKCSAqIEF0dGFjaCBhIHNvcnQgaGFuZGxlciAoY2xpY2spIHRvIGEgbm9kZQoJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7bm9kZX0gYXR0YWNoVG8gbm9kZSB0byBhdHRhY2ggdGhlIGhhbmRsZXIgdG8KCSAqICBAcGFyYW0ge2ludH0gY29sSWR4IGNvbHVtbiBzb3J0aW5nIGluZGV4CgkgKiAgQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBjYWxsYmFjayBmdW5jdGlvbgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5Tb3J0QXR0YWNoTGlzdGVuZXIgKCBzZXR0aW5ncywgYXR0YWNoVG8sIGNvbElkeCwgY2FsbGJhY2sgKQoJewoJCXZhciBjb2wgPSBzZXR0aW5ncy5hb0NvbHVtbnNbIGNvbElkeCBdOwoJCgkJX2ZuQmluZEFjdGlvbiggYXR0YWNoVG8sIHt9LCBmdW5jdGlvbiAoZSkgewoJCQkvKiBJZiB0aGUgY29sdW1uIGlzIG5vdCBzb3J0YWJsZSAtIGRvbid0IHRvIGFueXRoaW5nICovCgkJCWlmICggY29sLmJTb3J0YWJsZSA9PT0gZmFsc2UgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQoJCQkvLyBJZiBwcm9jZXNzaW5nIGlzIGVuYWJsZWQgdXNlIGEgdGltZW91dCB0byBhbGxvdyB0aGUgcHJvY2Vzc2luZwoJCQkvLyBkaXNwbGF5IHRvIGJlIHNob3duIC0gb3RoZXJ3aXNlIHRvIGl0IHN5bmNocm9ub3VzbHkKCQkJaWYgKCBzZXR0aW5ncy5vRmVhdHVyZXMuYlByb2Nlc3NpbmcgKSB7CgkJCQlfZm5Qcm9jZXNzaW5nRGlzcGxheSggc2V0dGluZ3MsIHRydWUgKTsKCQoJCQkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCQkJX2ZuU29ydExpc3RlbmVyKCBzZXR0aW5ncywgY29sSWR4LCBlLnNoaWZ0S2V5LCBjYWxsYmFjayApOwoJCgkJCQkJLy8gSW4gc2VydmVyLXNpZGUgcHJvY2Vzc2luZywgdGhlIGRyYXcgY2FsbGJhY2sgd2lsbCByZW1vdmUgdGhlCgkJCQkJLy8gcHJvY2Vzc2luZyBkaXNwbGF5CgkJCQkJaWYgKCBfZm5EYXRhU291cmNlKCBzZXR0aW5ncyApICE9PSAnc3NwJyApIHsKCQkJCQkJX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIHNldHRpbmdzLCBmYWxzZSApOwoJCQkJCX0KCQkJCX0sIDAgKTsKCQkJfQoJCQllbHNlIHsKCQkJCV9mblNvcnRMaXN0ZW5lciggc2V0dGluZ3MsIGNvbElkeCwgZS5zaGlmdEtleSwgY2FsbGJhY2sgKTsKCQkJfQoJCX0gKTsKCX0KCQoJCgkvKioKCSAqIFNldCB0aGUgc29ydGluZyBjbGFzc2VzIG9uIHRhYmxlJ3MgYm9keSwgTm90ZTogaXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24KCSAqIHdoZW4gYlNvcnQgYW5kIGJTb3J0Q2xhc3NlcyBhcmUgZmFsc2UKCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNvcnRpbmdDbGFzc2VzKCBzZXR0aW5ncyApCgl7CgkJdmFyIG9sZFNvcnQgPSBzZXR0aW5ncy5hTGFzdFNvcnQ7CgkJdmFyIHNvcnRDbGFzcyA9IHNldHRpbmdzLm9DbGFzc2VzLnNTb3J0Q29sdW1uOwoJCXZhciBzb3J0ID0gX2ZuU29ydEZsYXR0ZW4oIHNldHRpbmdzICk7CgkJdmFyIGZlYXR1cmVzID0gc2V0dGluZ3Mub0ZlYXR1cmVzOwoJCXZhciBpLCBpZW4sIGNvbElkeDsKCQoJCWlmICggZmVhdHVyZXMuYlNvcnQgJiYgZmVhdHVyZXMuYlNvcnRDbGFzc2VzICkgewoJCQkvLyBSZW1vdmUgb2xkIHNvcnRpbmcgY2xhc3NlcwoJCQlmb3IgKCBpPTAsIGllbj1vbGRTb3J0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJY29sSWR4ID0gb2xkU29ydFtpXS5zcmM7CgkKCQkJCS8vIFJlbW92ZSBjb2x1bW4gc29ydGluZwoJCQkJJCggX3BsdWNrKCBzZXR0aW5ncy5hb0RhdGEsICdhbkNlbGxzJywgY29sSWR4ICkgKQoJCQkJCS5yZW1vdmVDbGFzcyggc29ydENsYXNzICsgKGk8MiA/IGkrMSA6IDMpICk7CgkJCX0KCQoJCQkvLyBBZGQgbmV3IGNvbHVtbiBzb3J0aW5nCgkJCWZvciAoIGk9MCwgaWVuPXNvcnQubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQljb2xJZHggPSBzb3J0W2ldLnNyYzsKCQoJCQkJJCggX3BsdWNrKCBzZXR0aW5ncy5hb0RhdGEsICdhbkNlbGxzJywgY29sSWR4ICkgKQoJCQkJCS5hZGRDbGFzcyggc29ydENsYXNzICsgKGk8MiA/IGkrMSA6IDMpICk7CgkJCX0KCQl9CgkKCQlzZXR0aW5ncy5hTGFzdFNvcnQgPSBzb3J0OwoJfQoJCgkKCS8vIEdldCB0aGUgZGF0YSB0byBzb3J0IGEgY29sdW1uLCBiZSBpdCBmcm9tIGNhY2hlLCBmcmVzaCAocG9wdWxhdGluZyB0aGUKCS8vIGNhY2hlKSwgb3IgZnJvbSBhIHNvcnQgZm9ybWF0dGVyCglmdW5jdGlvbiBfZm5Tb3J0RGF0YSggc2V0dGluZ3MsIGlkeCApCgl7CgkJLy8gQ3VzdG9tIHNvcnRpbmcgZnVuY3Rpb24gLSBwcm92aWRlZCBieSB0aGUgc29ydCBkYXRhIHR5cGUKCQl2YXIgY29sdW1uID0gc2V0dGluZ3MuYW9Db2x1bW5zWyBpZHggXTsKCQl2YXIgY3VzdG9tU29ydCA9IERhdGFUYWJsZS5leHQub3JkZXJbIGNvbHVtbi5zU29ydERhdGFUeXBlIF07CgkJdmFyIGN1c3RvbURhdGE7CgkKCQlpZiAoIGN1c3RvbVNvcnQgKSB7CgkJCWN1c3RvbURhdGEgPSBjdXN0b21Tb3J0LmNhbGwoIHNldHRpbmdzLm9JbnN0YW5jZSwgc2V0dGluZ3MsIGlkeCwKCQkJCV9mbkNvbHVtbkluZGV4VG9WaXNpYmxlKCBzZXR0aW5ncywgaWR4ICkKCQkJKTsKCQl9CgkKCQkvLyBVc2UgLyBwb3B1bGF0ZSBjYWNoZQoJCXZhciByb3csIGNlbGxEYXRhOwoJCXZhciBmb3JtYXR0ZXIgPSBEYXRhVGFibGUuZXh0LnR5cGUub3JkZXJbIGNvbHVtbi5zVHlwZSsiLXByZSIgXTsKCQoJCWZvciAoIHZhciBpPTAsIGllbj1zZXR0aW5ncy5hb0RhdGEubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCXJvdyA9IHNldHRpbmdzLmFvRGF0YVtpXTsKCQoJCQlpZiAoICEgcm93Ll9hU29ydERhdGEgKSB7CgkJCQlyb3cuX2FTb3J0RGF0YSA9IFtdOwoJCQl9CgkKCQkJaWYgKCAhIHJvdy5fYVNvcnREYXRhW2lkeF0gfHwgY3VzdG9tU29ydCApIHsKCQkJCWNlbGxEYXRhID0gY3VzdG9tU29ydCA/CgkJCQkJY3VzdG9tRGF0YVtpXSA6IC8vIElmIHRoZXJlIHdhcyBhIGN1c3RvbSBzb3J0IGZ1bmN0aW9uLCB1c2UgZGF0YSBmcm9tIHRoZXJlCgkJCQkJX2ZuR2V0Q2VsbERhdGEoIHNldHRpbmdzLCBpLCBpZHgsICdzb3J0JyApOwoJCgkJCQlyb3cuX2FTb3J0RGF0YVsgaWR4IF0gPSBmb3JtYXR0ZXIgPwoJCQkJCWZvcm1hdHRlciggY2VsbERhdGEgKSA6CgkJCQkJY2VsbERhdGE7CgkJCX0KCQl9Cgl9CgkKCQoJCgkvKioKCSAqIFNhdmUgdGhlIHN0YXRlIG9mIGEgdGFibGUKCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNhdmVTdGF0ZSAoIHNldHRpbmdzICkKCXsKCQlpZiAoc2V0dGluZ3MuX2JMb2FkaW5nU3RhdGUpIHsKCQkJcmV0dXJuOwoJCX0KCQoJCS8qIFN0b3JlIHRoZSBpbnRlcmVzdGluZyB2YXJpYWJsZXMgKi8KCQl2YXIgc3RhdGUgPSB7CgkJCXRpbWU6ICAgICtuZXcgRGF0ZSgpLAoJCQlzdGFydDogICBzZXR0aW5ncy5faURpc3BsYXlTdGFydCwKCQkJbGVuZ3RoOiAgc2V0dGluZ3MuX2lEaXNwbGF5TGVuZ3RoLAoJCQlvcmRlcjogICAkLmV4dGVuZCggdHJ1ZSwgW10sIHNldHRpbmdzLmFhU29ydGluZyApLAoJCQlzZWFyY2g6ICBfZm5TZWFyY2hUb0NhbWVsKCBzZXR0aW5ncy5vUHJldmlvdXNTZWFyY2ggKSwKCQkJY29sdW1uczogJC5tYXAoIHNldHRpbmdzLmFvQ29sdW1ucywgZnVuY3Rpb24gKCBjb2wsIGkgKSB7CgkJCQlyZXR1cm4gewoJCQkJCXZpc2libGU6IGNvbC5iVmlzaWJsZSwKCQkJCQlzZWFyY2g6IF9mblNlYXJjaFRvQ2FtZWwoIHNldHRpbmdzLmFvUHJlU2VhcmNoQ29sc1tpXSApCgkJCQl9OwoJCQl9ICkKCQl9OwoJCgkJc2V0dGluZ3Mub1NhdmVkU3RhdGUgPSBzdGF0ZTsKCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCAiYW9TdGF0ZVNhdmVQYXJhbXMiLCAnc3RhdGVTYXZlUGFyYW1zJywgW3NldHRpbmdzLCBzdGF0ZV0gKTsKCQkKCQlpZiAoIHNldHRpbmdzLm9GZWF0dXJlcy5iU3RhdGVTYXZlICYmICFzZXR0aW5ncy5iRGVzdHJveWluZyApCgkJewoJCQlzZXR0aW5ncy5mblN0YXRlU2F2ZUNhbGxiYWNrLmNhbGwoIHNldHRpbmdzLm9JbnN0YW5jZSwgc2V0dGluZ3MsIHN0YXRlICk7CgkJfQkKCX0KCQoJCgkvKioKCSAqIEF0dGVtcHQgdG8gbG9hZCBhIHNhdmVkIHRhYmxlIHN0YXRlCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7b2JqZWN0fSBvSW5pdCBEYXRhVGFibGVzIGluaXQgb2JqZWN0IHNvIHdlIGNhbiBvdmVycmlkZSBzZXR0aW5ncwoJICogIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgc3RhdGUgaGFzIGJlZW4gbG9hZGVkCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkxvYWRTdGF0ZSAoIHNldHRpbmdzLCBvSW5pdCwgY2FsbGJhY2sgKQoJewoJCWlmICggISBzZXR0aW5ncy5vRmVhdHVyZXMuYlN0YXRlU2F2ZSApIHsKCQkJY2FsbGJhY2soKTsKCQkJcmV0dXJuOwoJCX0KCQoJCXZhciBsb2FkZWQgPSBmdW5jdGlvbihzdGF0ZSkgewoJCQlfZm5JbXBsZW1lbnRTdGF0ZShzZXR0aW5ncywgc3RhdGUsIGNhbGxiYWNrKTsKCQl9CgkKCQl2YXIgc3RhdGUgPSBzZXR0aW5ncy5mblN0YXRlTG9hZENhbGxiYWNrLmNhbGwoIHNldHRpbmdzLm9JbnN0YW5jZSwgc2V0dGluZ3MsIGxvYWRlZCApOwoJCgkJaWYgKCBzdGF0ZSAhPT0gdW5kZWZpbmVkICkgewoJCQlfZm5JbXBsZW1lbnRTdGF0ZSggc2V0dGluZ3MsIHN0YXRlLCBjYWxsYmFjayApOwoJCX0KCQkvLyBvdGhlcndpc2UsIHdhaXQgZm9yIHRoZSBsb2FkZWQgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQKCQoJCXJldHVybiB0cnVlOwoJfQoJCglmdW5jdGlvbiBfZm5JbXBsZW1lbnRTdGF0ZSAoIHNldHRpbmdzLCBzLCBjYWxsYmFjaykgewoJCXZhciBpLCBpZW47CgkJdmFyIGNvbHVtbnMgPSBzZXR0aW5ncy5hb0NvbHVtbnM7CgkJc2V0dGluZ3MuX2JMb2FkaW5nU3RhdGUgPSB0cnVlOwoJCgkJLy8gV2hlbiBTdGF0ZVJlc3RvcmUgd2FzIGludHJvZHVjZWQgdGhlIHN0YXRlIGNvdWxkIG5vdyBiZSBpbXBsZW1lbnRlZCBhdCBhbnkgdGltZQoJCS8vIE5vdCBqdXN0IGluaXRpYWxpc2F0aW9uLiBUbyBkbyB0aGlzIGFuIGFwaSBpbnN0YW5jZSBpcyByZXF1aXJlZCBpbiBzb21lIHBsYWNlcwoJCXZhciBhcGkgPSBzZXR0aW5ncy5fYkluaXRDb21wbGV0ZSA/IG5ldyBEYXRhVGFibGUuQXBpKHNldHRpbmdzKSA6IG51bGw7CgkKCQlpZiAoICEgcyB8fCAhIHMudGltZSApIHsKCQkJc2V0dGluZ3MuX2JMb2FkaW5nU3RhdGUgPSBmYWxzZTsKCQkJY2FsbGJhY2soKTsKCQkJcmV0dXJuOwoJCX0KCQoJCS8vIEFsbG93IGN1c3RvbSBhbmQgcGx1Zy1pbiBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIHRvIGFsdGVyIHRoZSBzYXZlZCBkYXRhIHNldCBhbmQKCQkvLyBjYW5jZWxsaW5nIG9mIGxvYWRpbmcgYnkgcmV0dXJuaW5nIGZhbHNlCgkJdmFyIGFiU3RhdGVMb2FkID0gX2ZuQ2FsbGJhY2tGaXJlKCBzZXR0aW5ncywgJ2FvU3RhdGVMb2FkUGFyYW1zJywgJ3N0YXRlTG9hZFBhcmFtcycsIFtzZXR0aW5ncywgc10gKTsKCQlpZiAoICQuaW5BcnJheSggZmFsc2UsIGFiU3RhdGVMb2FkICkgIT09IC0xICkgewoJCQlzZXR0aW5ncy5fYkxvYWRpbmdTdGF0ZSA9IGZhbHNlOwoJCQljYWxsYmFjaygpOwoJCQlyZXR1cm47CgkJfQoJCgkJLy8gUmVqZWN0IG9sZCBkYXRhCgkJdmFyIGR1cmF0aW9uID0gc2V0dGluZ3MuaVN0YXRlRHVyYXRpb247CgkJaWYgKCBkdXJhdGlvbiA+IDAgJiYgcy50aW1lIDwgK25ldyBEYXRlKCkgLSAoZHVyYXRpb24qMTAwMCkgKSB7CgkJCXNldHRpbmdzLl9iTG9hZGluZ1N0YXRlID0gZmFsc2U7CgkJCWNhbGxiYWNrKCk7CgkJCXJldHVybjsKCQl9CgkKCQkvLyBOdW1iZXIgb2YgY29sdW1ucyBoYXZlIGNoYW5nZWQgLSBhbGwgYmV0cyBhcmUgb2ZmLCBubyByZXN0b3JlIG9mIHNldHRpbmdzCgkJaWYgKCBzLmNvbHVtbnMgJiYgY29sdW1ucy5sZW5ndGggIT09IHMuY29sdW1ucy5sZW5ndGggKSB7CgkJCXNldHRpbmdzLl9iTG9hZGluZ1N0YXRlID0gZmFsc2U7CgkJCWNhbGxiYWNrKCk7CgkJCXJldHVybjsKCQl9CgkKCQkvLyBTdG9yZSB0aGUgc2F2ZWQgc3RhdGUgc28gaXQgbWlnaHQgYmUgYWNjZXNzZWQgYXQgYW55IHRpbWUKCQlzZXR0aW5ncy5vTG9hZGVkU3RhdGUgPSAkLmV4dGVuZCggdHJ1ZSwge30sIHMgKTsKCQoJCS8vIFBhZ2UgTGVuZ3RoCgkJaWYgKCBzLmxlbmd0aCAhPT0gdW5kZWZpbmVkICkgewoJCQkvLyBJZiBhbHJlYWR5IGluaXRpYWxpc2VkIGp1c3Qgc2V0IHRoZSB2YWx1ZSBkaXJlY3RseSBzbyB0aGF0IHRoZSBzZWxlY3QgZWxlbWVudCBpcyBhbHNvIHVwZGF0ZWQKCQkJaWYgKGFwaSkgewoJCQkJYXBpLnBhZ2UubGVuKHMubGVuZ3RoKQoJCQl9CgkJCWVsc2UgewoJCQkJc2V0dGluZ3MuX2lEaXNwbGF5TGVuZ3RoICAgPSBzLmxlbmd0aDsKCQkJfQoJCX0KCQoJCS8vIFJlc3RvcmUga2V5IGZlYXR1cmVzIC0gdG9kbyAtIGZvciAxLjExIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBieQoJCS8vIHN1YnNjcmliZWQgZXZlbnRzCgkJaWYgKCBzLnN0YXJ0ICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmKGFwaSA9PT0gbnVsbCkgewoJCQkJc2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQgICAgPSBzLnN0YXJ0OwoJCQkJc2V0dGluZ3MuaUluaXREaXNwbGF5U3RhcnQgPSBzLnN0YXJ0OwoJCQl9CgkJCWVsc2UgewoJCQkJX2ZuUGFnZUNoYW5nZShzZXR0aW5ncywgcy5zdGFydC9zZXR0aW5ncy5faURpc3BsYXlMZW5ndGgpOwoJCQl9CgkJfQoJCgkJLy8gT3JkZXIKCQlpZiAoIHMub3JkZXIgIT09IHVuZGVmaW5lZCApIHsKCQkJc2V0dGluZ3MuYWFTb3J0aW5nID0gW107CgkJCSQuZWFjaCggcy5vcmRlciwgZnVuY3Rpb24gKCBpLCBjb2wgKSB7CgkJCQlzZXR0aW5ncy5hYVNvcnRpbmcucHVzaCggY29sWzBdID49IGNvbHVtbnMubGVuZ3RoID8KCQkJCQlbIDAsIGNvbFsxXSBdIDoKCQkJCQljb2wKCQkJCSk7CgkJCX0gKTsKCQl9CgkKCQkvLyBTZWFyY2gKCQlpZiAoIHMuc2VhcmNoICE9PSB1bmRlZmluZWQgKSB7CgkJCSQuZXh0ZW5kKCBzZXR0aW5ncy5vUHJldmlvdXNTZWFyY2gsIF9mblNlYXJjaFRvSHVuZyggcy5zZWFyY2ggKSApOwoJCX0KCQoJCS8vIENvbHVtbnMKCQlpZiAoIHMuY29sdW1ucyApIHsKCQkJZm9yICggaT0wLCBpZW49cy5jb2x1bW5zLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJdmFyIGNvbCA9IHMuY29sdW1uc1tpXTsKCQoJCQkJLy8gVmlzaWJpbGl0eQoJCQkJaWYgKCBjb2wudmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCS8vIElmIHRoZSBhcGkgaXMgZGVmaW5lZCwgdGhlIHRhYmxlIGhhcyBiZWVuIGluaXRpYWxpc2VkIHNvIHdlIG5lZWQgdG8gdXNlIGl0IHJhdGhlciB0aGFuIGludGVybmFsIHNldHRpbmdzCgkJCQkJaWYgKGFwaSkgewoJCQkJCQkvLyBEb24ndCByZWRyYXcgdGhlIGNvbHVtbnMgb24gZXZlcnkgaXRlcmF0aW9uIG9mIHRoaXMgbG9vcCwgd2Ugd2lsbCBkbyB0aGlzIGF0IHRoZSBlbmQgaW5zdGVhZAoJCQkJCQlhcGkuY29sdW1uKGkpLnZpc2libGUoY29sLnZpc2libGUsIGZhbHNlKTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCWNvbHVtbnNbaV0uYlZpc2libGUgPSBjb2wudmlzaWJsZTsKCQkJCQl9CgkJCQl9CgkKCQkJCS8vIFNlYXJjaAoJCQkJaWYgKCBjb2wuc2VhcmNoICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJJC5leHRlbmQoIHNldHRpbmdzLmFvUHJlU2VhcmNoQ29sc1tpXSwgX2ZuU2VhcmNoVG9IdW5nKCBjb2wuc2VhcmNoICkgKTsKCQkJCX0KCQkJfQoJCQkKCQkJLy8gSWYgdGhlIGFwaSBpcyBkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBhZGp1c3QgdGhlIGNvbHVtbnMgb25jZSB0aGUgdmlzaWJpbGl0eSBoYXMgYmVlbiBjaGFuZ2VkCgkJCWlmIChhcGkpIHsKCQkJCWFwaS5jb2x1bW5zLmFkanVzdCgpOwoJCQl9CgkJfQoJCgkJc2V0dGluZ3MuX2JMb2FkaW5nU3RhdGUgPSBmYWxzZTsKCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCAnYW9TdGF0ZUxvYWRlZCcsICdzdGF0ZUxvYWRlZCcsIFtzZXR0aW5ncywgc10gKTsKCQljYWxsYmFjaygpOwoJfTsKCQoJCgkvKioKCSAqIFJldHVybiB0aGUgc2V0dGluZ3Mgb2JqZWN0IGZvciBhIHBhcnRpY3VsYXIgdGFibGUKCSAqICBAcGFyYW0ge25vZGV9IHRhYmxlIHRhYmxlIHdlIGFyZSB1c2luZyBhcyBhIGRhdGFUYWJsZQoJICogIEByZXR1cm5zIHtvYmplY3R9IFNldHRpbmdzIG9iamVjdCAtIG9yIG51bGwgaWYgbm90IGZvdW5kCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mblNldHRpbmdzRnJvbU5vZGUgKCB0YWJsZSApCgl7CgkJdmFyIHNldHRpbmdzID0gRGF0YVRhYmxlLnNldHRpbmdzOwoJCXZhciBpZHggPSAkLmluQXJyYXkoIHRhYmxlLCBfcGx1Y2soIHNldHRpbmdzLCAnblRhYmxlJyApICk7CgkKCQlyZXR1cm4gaWR4ICE9PSAtMSA/CgkJCXNldHRpbmdzWyBpZHggXSA6CgkJCW51bGw7Cgl9CgkKCQoJLyoqCgkgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZQoJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEBwYXJhbSB7aW50fSBsZXZlbCBsb2cgZXJyb3IgbWVzc2FnZXMsIG9yIGRpc3BsYXkgdGhlbSB0byB0aGUgdXNlcgoJICogIEBwYXJhbSB7c3RyaW5nfSBtc2cgZXJyb3IgbWVzc2FnZQoJICogIEBwYXJhbSB7aW50fSB0biBUZWNobmljYWwgbm90ZSBpZCB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkxvZyggc2V0dGluZ3MsIGxldmVsLCBtc2csIHRuICkKCXsKCQltc2cgPSAnRGF0YVRhYmxlcyB3YXJuaW5nOiAnKwoJCQkoc2V0dGluZ3MgPyAndGFibGUgaWQ9JytzZXR0aW5ncy5zVGFibGVJZCsnIC0gJyA6ICcnKSttc2c7CgkKCQlpZiAoIHRuICkgewoJCQltc2cgKz0gJy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlcnJvciwgcGxlYXNlIHNlZSAnKwoJCQknaHR0cDovL2RhdGF0YWJsZXMubmV0L3RuLycrdG47CgkJfQoJCgkJaWYgKCAhIGxldmVsICApIHsKCQkJLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcHJlIDEuMTAKCQkJdmFyIGV4dCA9IERhdGFUYWJsZS5leHQ7CgkJCXZhciB0eXBlID0gZXh0LnNFcnJNb2RlIHx8IGV4dC5lcnJNb2RlOwoJCgkJCWlmICggc2V0dGluZ3MgKSB7CgkJCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCBudWxsLCAnZXJyb3InLCBbIHNldHRpbmdzLCB0biwgbXNnIF0gKTsKCQkJfQoJCgkJCWlmICggdHlwZSA9PSAnYWxlcnQnICkgewoJCQkJYWxlcnQoIG1zZyApOwoJCQl9CgkJCWVsc2UgaWYgKCB0eXBlID09ICd0aHJvdycgKSB7CgkJCQl0aHJvdyBuZXcgRXJyb3IobXNnKTsKCQkJfQoJCQllbHNlIGlmICggdHlwZW9mIHR5cGUgPT0gJ2Z1bmN0aW9uJyApIHsKCQkJCXR5cGUoIHNldHRpbmdzLCB0biwgbXNnICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICkgewoJCQljb25zb2xlLmxvZyggbXNnICk7CgkJfQoJfQoJCgkKCS8qKgoJICogU2VlIGlmIGEgcHJvcGVydHkgaXMgZGVmaW5lZCBvbiBvbmUgb2JqZWN0LCBpZiBzbyBhc3NpZ24gaXQgdG8gdGhlIG90aGVyIG9iamVjdAoJICogIEBwYXJhbSB7b2JqZWN0fSByZXQgdGFyZ2V0IG9iamVjdAoJICogIEBwYXJhbSB7b2JqZWN0fSBzcmMgc291cmNlIG9iamVjdAoJICogIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHByb3BlcnR5CgkgKiAgQHBhcmFtIHtzdHJpbmd9IFttYXBwZWROYW1lXSBuYW1lIHRvIG1hcCB0b28gLSBvcHRpb25hbCwgbmFtZSB1c2VkIGlmIG5vdCBnaXZlbgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5NYXAoIHJldCwgc3JjLCBuYW1lLCBtYXBwZWROYW1lICkKCXsKCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJJC5lYWNoKCBuYW1lLCBmdW5jdGlvbiAoaSwgdmFsKSB7CgkJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJCV9mbk1hcCggcmV0LCBzcmMsIHZhbFswXSwgdmFsWzFdICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlfZm5NYXAoIHJldCwgc3JjLCB2YWwgKTsKCQkJCX0KCQkJfSApOwoJCgkJCXJldHVybjsKCQl9CgkKCQlpZiAoIG1hcHBlZE5hbWUgPT09IHVuZGVmaW5lZCApIHsKCQkJbWFwcGVkTmFtZSA9IG5hbWU7CgkJfQoJCgkJaWYgKCBzcmNbbmFtZV0gIT09IHVuZGVmaW5lZCApIHsKCQkJcmV0W21hcHBlZE5hbWVdID0gc3JjW25hbWVdOwoJCX0KCX0KCQoJCgkvKioKCSAqIEV4dGVuZCBvYmplY3RzIC0gdmVyeSBzaW1pbGFyIHRvIGpRdWVyeS5leHRlbmQsIGJ1dCBkZWVwIGNvcHkgb2JqZWN0cywgYW5kCgkgKiBzaGFsbG93IGNvcHkgYXJyYXlzLiBUaGUgcmVhc29uIHdlIG5lZWQgdG8gZG8gdGhpcywgaXMgdGhhdCB3ZSBkb24ndCB3YW50IHRvCgkgKiBkZWVwIGNvcHkgYXJyYXkgaW5pdCB2YWx1ZXMgKHN1Y2ggYXMgYWFTb3J0aW5nKSBzaW5jZSB0aGUgZGV2IHdvdWxkbid0IGJlCgkgKiBhYmxlIHRvIG92ZXJyaWRlIHRoZW0sIGJ1dCB3ZSBkbyB3YW50IHRvIGRlZXAgY29weSBhcnJheXMuCgkgKiAgQHBhcmFtIHtvYmplY3R9IG91dCBPYmplY3QgdG8gZXh0ZW5kCgkgKiAgQHBhcmFtIHtvYmplY3R9IGV4dGVuZGVyIE9iamVjdCBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIHdpbGwgYmUgYXBwbGllZCB0bwoJICogICAgICBvdXQKCSAqICBAcGFyYW0ge2Jvb2xlYW59IGJyZWFrUmVmcyBJZiB0cnVlLCB0aGVuIGFycmF5cyB3aWxsIGJlIHNsaWNlZCB0byB0YWtlIGFuCgkgKiAgICAgIGluZGVwZW5kZW50IGNvcHkgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBgZGF0YWAgb3IgYGFhRGF0YWAgcGFyYW1ldGVycwoJICogICAgICBpZiB0aGV5IGFyZSBwcmVzZW50LiBUaGlzIGlzIHNvIHlvdSBjYW4gcGFzcyBpbiBhIGNvbGxlY3Rpb24gdG8KCSAqICAgICAgRGF0YVRhYmxlcyBhbmQgaGF2ZSB0aGF0IHVzZWQgYXMgeW91ciBkYXRhIHNvdXJjZSB3aXRob3V0IGJyZWFraW5nIHRoZQoJICogICAgICByZWZlcmVuY2VzCgkgKiAgQHJldHVybnMge29iamVjdH0gb3V0IFJlZmVyZW5jZSwganVzdCBmb3IgY29udmVuaWVuY2UgLSBvdXQgPT09IHRoZSByZXR1cm4uCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKiAgQHRvZG8gVGhpcyBkb2Vzbid0IHRha2UgYWNjb3VudCBvZiBhcnJheXMgaW5zaWRlIHRoZSBkZWVwIGNvcGllZCBvYmplY3RzLgoJICovCglmdW5jdGlvbiBfZm5FeHRlbmQoIG91dCwgZXh0ZW5kZXIsIGJyZWFrUmVmcyApCgl7CgkJdmFyIHZhbDsKCQoJCWZvciAoIHZhciBwcm9wIGluIGV4dGVuZGVyICkgewoJCQlpZiAoIGV4dGVuZGVyLmhhc093blByb3BlcnR5KHByb3ApICkgewoJCQkJdmFsID0gZXh0ZW5kZXJbcHJvcF07CgkKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWwgKSApIHsKCQkJCQlpZiAoICEgJC5pc1BsYWluT2JqZWN0KCBvdXRbcHJvcF0gKSApIHsKCQkJCQkJb3V0W3Byb3BdID0ge307CgkJCQkJfQoJCQkJCSQuZXh0ZW5kKCB0cnVlLCBvdXRbcHJvcF0sIHZhbCApOwoJCQkJfQoJCQkJZWxzZSBpZiAoIGJyZWFrUmVmcyAmJiBwcm9wICE9PSAnZGF0YScgJiYgcHJvcCAhPT0gJ2FhRGF0YScgJiYgQXJyYXkuaXNBcnJheSh2YWwpICkgewoJCQkJCW91dFtwcm9wXSA9IHZhbC5zbGljZSgpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJb3V0W3Byb3BdID0gdmFsOwoJCQkJfQoJCQl9CgkJfQoJCgkJcmV0dXJuIG91dDsKCX0KCQoJCgkvKioKCSAqIEJpbmQgYW4gZXZlbnQgaGFuZGVycyB0byBhbGxvdyBhIGNsaWNrIG9yIHJldHVybiBrZXkgdG8gYWN0aXZhdGUgdGhlIGNhbGxiYWNrLgoJICogVGhpcyBpcyBnb29kIGZvciBhY2Nlc3NpYmlsaXR5IHNpbmNlIGEgcmV0dXJuIG9uIHRoZSBrZXlib2FyZCB3aWxsIGhhdmUgdGhlCgkgKiBzYW1lIGVmZmVjdCBhcyBhIGNsaWNrLCBpZiB0aGUgZWxlbWVudCBoYXMgZm9jdXMuCgkgKiAgQHBhcmFtIHtlbGVtZW50fSBuIEVsZW1lbnQgdG8gYmluZCB0aGUgYWN0aW9uIHRvCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9EYXRhIERhdGEgb2JqZWN0IHRvIHBhc3MgdG8gdGhlIHRyaWdnZXJlZCBmdW5jdGlvbgoJICogIEBwYXJhbSB7ZnVuY3Rpb259IGZuIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuQmluZEFjdGlvbiggbiwgb0RhdGEsIGZuICkKCXsKCQkkKG4pCgkJCS5vbiggJ2NsaWNrLkRUJywgb0RhdGEsIGZ1bmN0aW9uIChlKSB7CgkJCQkJJChuKS50cmlnZ2VyKCdibHVyJyk7IC8vIFJlbW92ZSBmb2N1cyBvdXRsaW5lIGZvciBtb3VzZSB1c2VycwoJCQkJCWZuKGUpOwoJCQkJfSApCgkJCS5vbiggJ2tleXByZXNzLkRUJywgb0RhdGEsIGZ1bmN0aW9uIChlKXsKCQkJCQlpZiAoIGUud2hpY2ggPT09IDEzICkgewoJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCWZuKGUpOwoJCQkJCX0KCQkJCX0gKQoJCQkub24oICdzZWxlY3RzdGFydC5EVCcsIGZ1bmN0aW9uICgpIHsKCQkJCQkvKiBUYWtlIHRoZSBicnV0YWwgYXBwcm9hY2ggdG8gY2FuY2VsbGluZyB0ZXh0IHNlbGVjdGlvbiAqLwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0gKTsKCX0KCQoJCgkvKioKCSAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24uIEVhc2lseSBhbGxvd3MgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBhZGRlZCB0bwoJICogYW4gYXJyYXkgc3RvcmUgb2YgY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXQgY2FuIHRoZW4gYWxsIGJlIGNhbGxlZCB0b2dldGhlci4KCSAqICBAcGFyYW0ge29iamVjdH0gb1NldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtzdHJpbmd9IHNTdG9yZSBOYW1lIG9mIHRoZSBhcnJheSBzdG9yYWdlIGZvciB0aGUgY2FsbGJhY2tzIGluIG9TZXR0aW5ncwoJICogIEBwYXJhbSB7ZnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrCgkgKiAgQHBhcmFtIHtzdHJpbmd9IHNOYW1lIElkZW50aWZ5aW5nIG5hbWUgZm9yIHRoZSBjYWxsYmFjayAoaS5lLiBhIGxhYmVsKQoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5DYWxsYmFja1JlZyggb1NldHRpbmdzLCBzU3RvcmUsIGZuLCBzTmFtZSApCgl7CgkJaWYgKCBmbiApCgkJewoJCQlvU2V0dGluZ3Nbc1N0b3JlXS5wdXNoKCB7CgkJCQkiZm4iOiBmbiwKCQkJCSJzTmFtZSI6IHNOYW1lCgkJCX0gKTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBGaXJlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhbmQgdHJpZ2dlciBldmVudHMuIE5vdGUgdGhhdCB0aGUgbG9vcCBvdmVyIHRoZQoJICogY2FsbGJhY2sgYXJyYXkgc3RvcmUgaXMgZG9uZSBiYWNrd2FyZHMhIEZ1cnRoZXIgbm90ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0bwoJICogZmlyZSBvZmYgdHJpZ2dlcnMgaW4gdGltZSBzZW5zaXRpdmUgYXBwbGljYXRpb25zIChmb3IgZXhhbXBsZSBjZWxsIGNyZWF0aW9uKQoJICogYXMgaXRzIHNsb3cuCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrQXJyIE5hbWUgb2YgdGhlIGFycmF5IHN0b3JhZ2UgZm9yIHRoZSBjYWxsYmFja3MgaW4KCSAqICAgICAgb1NldHRpbmdzCgkgKiAgQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBqUXVlcnkgY3VzdG9tIGV2ZW50IHRvIHRyaWdnZXIuIElmCgkgKiAgICAgIG51bGwgbm8gdHJpZ2dlciBpcyBmaXJlZAoJICogIEBwYXJhbSB7YXJyYXl9IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIC8KCSAqICAgICAgdHJpZ2dlcgoJICogIEBtZW1iZXJvZiBEYXRhVGFibGUjb0FwaQoJICovCglmdW5jdGlvbiBfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCBjYWxsYmFja0FyciwgZXZlbnROYW1lLCBhcmdzICkKCXsKCQl2YXIgcmV0ID0gW107CgkKCQlpZiAoIGNhbGxiYWNrQXJyICkgewoJCQlyZXQgPSAkLm1hcCggc2V0dGluZ3NbY2FsbGJhY2tBcnJdLnNsaWNlKCkucmV2ZXJzZSgpLCBmdW5jdGlvbiAodmFsLCBpKSB7CgkJCQlyZXR1cm4gdmFsLmZuLmFwcGx5KCBzZXR0aW5ncy5vSW5zdGFuY2UsIGFyZ3MgKTsKCQkJfSApOwoJCX0KCQoJCWlmICggZXZlbnROYW1lICE9PSBudWxsICkgewoJCQl2YXIgZSA9ICQuRXZlbnQoIGV2ZW50TmFtZSsnLmR0JyApOwoJCgkJCSQoc2V0dGluZ3MublRhYmxlKS50cmlnZ2VyKCBlLCBhcmdzICk7CgkKCQkJcmV0LnB1c2goIGUucmVzdWx0ICk7CgkJfQoJCgkJcmV0dXJuIHJldDsKCX0KCQoJCglmdW5jdGlvbiBfZm5MZW5ndGhPdmVyZmxvdyAoIHNldHRpbmdzICkKCXsKCQl2YXIKCQkJc3RhcnQgPSBzZXR0aW5ncy5faURpc3BsYXlTdGFydCwKCQkJZW5kID0gc2V0dGluZ3MuZm5EaXNwbGF5RW5kKCksCgkJCWxlbiA9IHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aDsKCQoJCS8qIElmIHdlIGhhdmUgc3BhY2UgdG8gc2hvdyBleHRyYSByb3dzIChiYWNraW5nIHVwIGZyb20gdGhlIGVuZCBwb2ludCAtIHRoZW4gZG8gc28gKi8KCQlpZiAoIHN0YXJ0ID49IGVuZCApCgkJewoJCQlzdGFydCA9IGVuZCAtIGxlbjsKCQl9CgkKCQkvLyBLZWVwIHRoZSBzdGFydCByZWNvcmQgb24gdGhlIGN1cnJlbnQgcGFnZQoJCXN0YXJ0IC09IChzdGFydCAlIGxlbik7CgkKCQlpZiAoIGxlbiA9PT0gLTEgfHwgc3RhcnQgPCAwICkKCQl7CgkJCXN0YXJ0ID0gMDsKCQl9CgkKCQlzZXR0aW5ncy5faURpc3BsYXlTdGFydCA9IHN0YXJ0OwoJfQoJCgkKCWZ1bmN0aW9uIF9mblJlbmRlcmVyKCBzZXR0aW5ncywgdHlwZSApCgl7CgkJdmFyIHJlbmRlcmVyID0gc2V0dGluZ3MucmVuZGVyZXI7CgkJdmFyIGhvc3QgPSBEYXRhVGFibGUuZXh0LnJlbmRlcmVyW3R5cGVdOwoJCgkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHJlbmRlcmVyICkgJiYgcmVuZGVyZXJbdHlwZV0gKSB7CgkJCS8vIFNwZWNpZmljIHJlbmRlcmVyIGZvciB0aGlzIHR5cGUuIElmIGF2YWlsYWJsZSB1c2UgaXQsIG90aGVyd2lzZSB1c2UKCQkJLy8gdGhlIGRlZmF1bHQuCgkJCXJldHVybiBob3N0W3JlbmRlcmVyW3R5cGVdXSB8fCBob3N0Ll87CgkJfQoJCWVsc2UgaWYgKCB0eXBlb2YgcmVuZGVyZXIgPT09ICdzdHJpbmcnICkgewoJCQkvLyBDb21tb24gcmVuZGVyZXIgLSBpZiB0aGVyZSBpcyBvbmUgYXZhaWxhYmxlIGZvciB0aGlzIHR5cGUgdXNlIGl0LAoJCQkvLyBvdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0CgkJCXJldHVybiBob3N0W3JlbmRlcmVyXSB8fCBob3N0Ll87CgkJfQoJCgkJLy8gVXNlIHRoZSBkZWZhdWx0CgkJcmV0dXJuIGhvc3QuXzsKCX0KCQoJCgkvKioKCSAqIERldGVjdCB0aGUgZGF0YSBzb3VyY2UgYmVpbmcgdXNlZCBmb3IgdGhlIHRhYmxlLiBVc2VkIHRvIHNpbXBsaWZ5IHRoZSBjb2RlCgkgKiBhIGxpdHRsZSAoYWpheCkgYW5kIHRvIG1ha2UgaXQgY29tcHJlc3MgYSBsaXR0bGUgc21hbGxlci4KCSAqCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIGRhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiAgQHJldHVybnMge3N0cmluZ30gRGF0YSBzb3VyY2UKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuRGF0YVNvdXJjZSAoIHNldHRpbmdzICkKCXsKCQlpZiAoIHNldHRpbmdzLm9GZWF0dXJlcy5iU2VydmVyU2lkZSApIHsKCQkJcmV0dXJuICdzc3AnOwoJCX0KCQllbHNlIGlmICggc2V0dGluZ3MuYWpheCB8fCBzZXR0aW5ncy5zQWpheFNvdXJjZSApIHsKCQkJcmV0dXJuICdhamF4JzsKCQl9CgkJcmV0dXJuICdkb20nOwoJfQoJCgkKCQoJCgkvKioKCSAqIENvbXB1dGVkIHN0cnVjdHVyZSBvZiB0aGUgRGF0YVRhYmxlcyBBUEksIGRlZmluZWQgYnkgdGhlIG9wdGlvbnMgcGFzc2VkIHRvCgkgKiBgRGF0YVRhYmxlLkFwaS5yZWdpc3RlcigpYCB3aGVuIGJ1aWxkaW5nIHRoZSBBUEkuCgkgKgoJICogVGhlIHN0cnVjdHVyZSBpcyBidWlsdCBpbiBvcmRlciB0byBzcGVlZCBjcmVhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBBcGkKCSAqIG9iamVjdHMgc2luY2UgdGhlIGV4dGVuc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHByZS1wYXJzZWQuCgkgKgoJICogVGhlIGFycmF5IGlzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSwgd2hlcmUgdGhpcwoJICogYmFzZSBhcnJheSByZXByZXNlbnRzIHRoZSBBcGkgcHJvdG90eXBlIGJhc2U6CgkgKgoJICogICAgIFsKCSAqICAgICAgIHsKCSAqICAgICAgICAgbmFtZTogICAgICAnZGF0YScgICAgICAgICAgICAgICAgLS0gc3RyaW5nICAgLSBQcm9wZXJ0eSBuYW1lCgkgKiAgICAgICAgIHZhbDogICAgICAgZnVuY3Rpb24gKCkge30sICAgICAgIC0tIGZ1bmN0aW9uIC0gQXBpIG1ldGhvZCAob3IgdW5kZWZpbmVkIGlmIGp1c3QgYW4gb2JqZWN0CgkgKiAgICAgICAgIG1ldGhvZEV4dDogWyAuLi4gXSwgICAgICAgICAgICAgIC0tIGFycmF5ICAgIC0gQXJyYXkgb2YgQXBpIG9iamVjdCBkZWZpbml0aW9ucyB0byBleHRlbmQgdGhlIG1ldGhvZCByZXN1bHQKCSAqICAgICAgICAgcHJvcEV4dDogICBbIC4uLiBdICAgICAgICAgICAgICAgLS0gYXJyYXkgICAgLSBBcnJheSBvZiBBcGkgb2JqZWN0IGRlZmluaXRpb25zIHRvIGV4dGVuZCB0aGUgcHJvcGVydHkKCSAqICAgICAgIH0sCgkgKiAgICAgICB7CgkgKiAgICAgICAgIG5hbWU6ICAgICAncm93JwoJICogICAgICAgICB2YWw6ICAgICAgIHt9LAoJICogICAgICAgICBtZXRob2RFeHQ6IFsgLi4uIF0sCgkgKiAgICAgICAgIHByb3BFeHQ6ICAgWwoJICogICAgICAgICAgIHsKCSAqICAgICAgICAgICAgIG5hbWU6ICAgICAgJ2RhdGEnCgkgKiAgICAgICAgICAgICB2YWw6ICAgICAgIGZ1bmN0aW9uICgpIHt9LAoJICogICAgICAgICAgICAgbWV0aG9kRXh0OiBbIC4uLiBdLAoJICogICAgICAgICAgICAgcHJvcEV4dDogICBbIC4uLiBdCgkgKiAgICAgICAgICAgfSwKCSAqICAgICAgICAgICAuLi4KCSAqICAgICAgICAgXQoJICogICAgICAgfQoJICogICAgIF0KCSAqCgkgKiBAdHlwZSB7QXJyYXl9CgkgKiBAaWdub3JlCgkgKi8KCXZhciBfX2FwaVN0cnVjdCA9IFtdOwoJCgkKCS8qKgoJICogYEFycmF5LnByb3RvdHlwZWAgcmVmZXJlbmNlLgoJICoKCSAqIEB0eXBlIG9iamVjdAoJICogQGlnbm9yZQoJICovCgl2YXIgX19hcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlOwoJCgkKCS8qKgoJICogQWJzdHJhY3Rpb24gZm9yIGBjb250ZXh0YCBwYXJhbWV0ZXIgb2YgdGhlIGBBcGlgIGNvbnN0cnVjdG9yIHRvIGFsbG93IGl0IHRvCgkgKiB0YWtlIHNldmVyYWwgZGlmZmVyZW50IGZvcm1zIGZvciBlYXNlIG9mIHVzZS4KCSAqCgkgKiBFYWNoIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXIgdHlwZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBEYXRhVGFibGVzIHNldHRpbmdzCgkgKiBvYmplY3Qgd2hlcmUgcG9zc2libGUuCgkgKgoJICogQHBhcmFtICB7c3RyaW5nfG5vZGV8alF1ZXJ5fG9iamVjdH0gbWl4ZWQgRGF0YVRhYmxlIGlkZW50aWZpZXIuIENhbiBiZSBvbmUKCSAqICAgb2Y6CgkgKgoJICogICAqIGBzdHJpbmdgIC0galF1ZXJ5IHNlbGVjdG9yLiBBbnkgRGF0YVRhYmxlcycgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yCgkgKiAgICAgd2l0aCBiZSBmb3VuZCBhbmQgdXNlZC4KCSAqICAgKiBgbm9kZWAgLSBgVEFCTEVgIG5vZGUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBmb3JtZWQgaW50byBhIERhdGFUYWJsZS4KCSAqICAgKiBgalF1ZXJ5YCAtIEEgalF1ZXJ5IG9iamVjdCBvZiBgVEFCTEVgIG5vZGVzLgoJICogICAqIGBvYmplY3RgIC0gRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICAgKiBgRGF0YVRhYmxlcy5BcGlgIC0gQVBJIGluc3RhbmNlCgkgKiBAcmV0dXJuIHthcnJheXxudWxsfSBNYXRjaGluZyBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdHMuIGBudWxsYCBvcgoJICogICBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZCBpZiBubyBtYXRjaGluZyBEYXRhVGFibGUgaXMgZm91bmQuCgkgKiBAaWdub3JlCgkgKi8KCXZhciBfdG9TZXR0aW5ncyA9IGZ1bmN0aW9uICggbWl4ZWQgKQoJewoJCXZhciBpZHgsIGpxOwoJCXZhciBzZXR0aW5ncyA9IERhdGFUYWJsZS5zZXR0aW5nczsKCQl2YXIgdGFibGVzID0gJC5tYXAoIHNldHRpbmdzLCBmdW5jdGlvbiAoZWwsIGkpIHsKCQkJcmV0dXJuIGVsLm5UYWJsZTsKCQl9ICk7CgkKCQlpZiAoICEgbWl4ZWQgKSB7CgkJCXJldHVybiBbXTsKCQl9CgkJZWxzZSBpZiAoIG1peGVkLm5UYWJsZSAmJiBtaXhlZC5vQXBpICkgewoJCQkvLyBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJCQlyZXR1cm4gWyBtaXhlZCBdOwoJCX0KCQllbHNlIGlmICggbWl4ZWQubm9kZU5hbWUgJiYgbWl4ZWQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RhYmxlJyApIHsKCQkJLy8gVGFibGUgbm9kZQoJCQlpZHggPSAkLmluQXJyYXkoIG1peGVkLCB0YWJsZXMgKTsKCQkJcmV0dXJuIGlkeCAhPT0gLTEgPyBbIHNldHRpbmdzW2lkeF0gXSA6IG51bGw7CgkJfQoJCWVsc2UgaWYgKCBtaXhlZCAmJiB0eXBlb2YgbWl4ZWQuc2V0dGluZ3MgPT09ICdmdW5jdGlvbicgKSB7CgkJCXJldHVybiBtaXhlZC5zZXR0aW5ncygpLnRvQXJyYXkoKTsKCQl9CgkJZWxzZSBpZiAoIHR5cGVvZiBtaXhlZCA9PT0gJ3N0cmluZycgKSB7CgkJCS8vIGpRdWVyeSBzZWxlY3RvcgoJCQlqcSA9ICQobWl4ZWQpOwoJCX0KCQllbHNlIGlmICggbWl4ZWQgaW5zdGFuY2VvZiAkICkgewoJCQkvLyBqUXVlcnkgb2JqZWN0IChhbHNvIERhdGFUYWJsZXMgaW5zdGFuY2UpCgkJCWpxID0gbWl4ZWQ7CgkJfQoJCgkJaWYgKCBqcSApIHsKCQkJcmV0dXJuIGpxLm1hcCggZnVuY3Rpb24oaSkgewoJCQkJaWR4ID0gJC5pbkFycmF5KCB0aGlzLCB0YWJsZXMgKTsKCQkJCXJldHVybiBpZHggIT09IC0xID8gc2V0dGluZ3NbaWR4XSA6IG51bGw7CgkJCX0gKS50b0FycmF5KCk7CgkJfQoJfTsKCQoJCgkvKioKCSAqIERhdGFUYWJsZXMgQVBJIGNsYXNzIC0gdXNlZCB0byBjb250cm9sIGFuZCBpbnRlcmZhY2Ugd2l0aCAgb25lIG9yIG1vcmUKCSAqIERhdGFUYWJsZXMgZW5oYW5jZWQgdGFibGVzLgoJICoKCSAqIFRoZSBBUEkgY2xhc3MgaXMgaGVhdmlseSBiYXNlZCBvbiBqUXVlcnksIHByZXNlbnRpbmcgYSBjaGFpbmFibGUgaW50ZXJmYWNlCgkgKiB0aGF0IHlvdSBjYW4gdXNlIHRvIGludGVyYWN0IHdpdGggdGFibGVzLiBFYWNoIGluc3RhbmNlIG9mIHRoZSBBUEkgY2xhc3MgaGFzCgkgKiBhICJjb250ZXh0IiAtIGkuZS4gdGhlIHRhYmxlcyB0aGF0IGl0IHdpbGwgb3BlcmF0ZSBvbi4gVGhpcyBjb3VsZCBiZSBhIHNpbmdsZQoJICogdGFibGUsIGFsbCB0YWJsZXMgb24gYSBwYWdlIG9yIGEgc3ViLXNldCB0aGVyZW9mLgoJICoKCSAqIEFkZGl0aW9uYWxseSB0aGUgQVBJIGlzIGRlc2lnbmVkIHRvIGFsbG93IHlvdSB0byBlYXNpbHkgd29yayB3aXRoIHRoZSBkYXRhIGluCgkgKiB0aGUgdGFibGVzLCByZXRyaWV2aW5nIGFuZCBtYW5pcHVsYXRpbmcgaXQgYXMgcmVxdWlyZWQuIFRoaXMgaXMgZG9uZSBieQoJICogcHJlc2VudGluZyB0aGUgQVBJIGNsYXNzIGFzIGFuIGFycmF5IGxpa2UgaW50ZXJmYWNlLiBUaGUgY29udGVudHMgb2YgdGhlCgkgKiBhcnJheSBkZXBlbmQgdXBvbiB0aGUgYWN0aW9ucyByZXF1ZXN0ZWQgYnkgZWFjaCBtZXRob2QgKGZvciBleGFtcGxlCgkgKiBgcm93cygpLm5vZGVzKClgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIG5vZGVzLCB3aGlsZSBgcm93cygpLmRhdGEoKWAgd2lsbAoJICogcmV0dXJuIGFuIGFycmF5IG9mIG9iamVjdHMgb3IgYXJyYXlzIGRlcGVuZGluZyB1cG9uIHlvdXIgdGFibGUncwoJICogY29uZmlndXJhdGlvbikuIFRoZSBBUEkgb2JqZWN0IGhhcyBhIG51bWJlciBvZiBhcnJheSBsaWtlIG1ldGhvZHMgKGBwdXNoYCwKCSAqIGBwb3BgLCBgcmV2ZXJzZWAgZXRjKSBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaGVscGVyIG1ldGhvZHMgKGBlYWNoYCwgYHBsdWNrYCwKCSAqIGB1bmlxdWVgIGV0YykgdG8gYXNzaXN0IHlvdXIgd29ya2luZyB3aXRoIHRoZSBkYXRhIGhlbGQgaW4gYSB0YWJsZS4KCSAqCgkgKiBNb3N0IG1ldGhvZHMgKHRob3NlIHdoaWNoIHJldHVybiBhbiBBcGkgaW5zdGFuY2UpIGFyZSBjaGFpbmFibGUsIHdoaWNoIG1lYW5zCgkgKiB0aGUgcmV0dXJuIGZyb20gYSBtZXRob2QgY2FsbCBhbHNvIGhhcyBhbGwgb2YgdGhlIG1ldGhvZHMgYXZhaWxhYmxlIHRoYXQgdGhlCgkgKiB0b3AgbGV2ZWwgb2JqZWN0IGhhZC4gRm9yIGV4YW1wbGUsIHRoZXNlIHR3byBjYWxscyBhcmUgZXF1aXZhbGVudDoKCSAqCgkgKiAgICAgLy8gTm90IGNoYWluZWQKCSAqICAgICBhcGkucm93LmFkZCggey4uLn0gKTsKCSAqICAgICBhcGkuZHJhdygpOwoJICoKCSAqICAgICAvLyBDaGFpbmVkCgkgKiAgICAgYXBpLnJvdy5hZGQoIHsuLi59ICkuZHJhdygpOwoJICoKCSAqIEBjbGFzcyBEYXRhVGFibGUuQXBpCgkgKiBAcGFyYW0ge2FycmF5fG9iamVjdHxzdHJpbmd8alF1ZXJ5fSBjb250ZXh0IERhdGFUYWJsZSBpZGVudGlmaWVyLiBUaGlzIGlzCgkgKiAgIHVzZWQgdG8gZGVmaW5lIHdoaWNoIERhdGFUYWJsZXMgZW5oYW5jZWQgdGFibGVzIHRoaXMgQVBJIHdpbGwgb3BlcmF0ZSBvbi4KCSAqICAgQ2FuIGJlIG9uZSBvZjoKCSAqCgkgKiAgICogYHN0cmluZ2AgLSBqUXVlcnkgc2VsZWN0b3IuIEFueSBEYXRhVGFibGVzJyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IKCSAqICAgICB3aXRoIGJlIGZvdW5kIGFuZCB1c2VkLgoJICogICAqIGBub2RlYCAtIGBUQUJMRWAgbm9kZSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGZvcm1lZCBpbnRvIGEgRGF0YVRhYmxlLgoJICogICAqIGBqUXVlcnlgIC0gQSBqUXVlcnkgb2JqZWN0IG9mIGBUQUJMRWAgbm9kZXMuCgkgKiAgICogYG9iamVjdGAgLSBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogQHBhcmFtIHthcnJheX0gW2RhdGFdIERhdGEgdG8gaW5pdGlhbGlzZSB0aGUgQXBpIGluc3RhbmNlIHdpdGguCgkgKgoJICogQGV4YW1wbGUKCSAqICAgLy8gRGlyZWN0IGluaXRpYWxpc2F0aW9uIGR1cmluZyBEYXRhVGFibGVzIGNvbnN0cnVjdGlvbgoJICogICB2YXIgYXBpID0gJCgnI2V4YW1wbGUnKS5EYXRhVGFibGUoKTsKCSAqCgkgKiBAZXhhbXBsZQoJICogICAvLyBJbml0aWFsaXNhdGlvbiB1c2luZyBhIERhdGFUYWJsZXMgalF1ZXJ5IG9iamVjdAoJICogICB2YXIgYXBpID0gJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoKS5hcGkoKTsKCSAqCgkgKiBAZXhhbXBsZQoJICogICAvLyBJbml0aWFsaXNhdGlvbiBhcyBhIGNvbnN0cnVjdG9yCgkgKiAgIHZhciBhcGkgPSBuZXcgJC5mbi5EYXRhVGFibGUuQXBpKCAndGFibGUuZGF0YVRhYmxlJyApOwoJICovCglfQXBpID0gZnVuY3Rpb24gKCBjb250ZXh0LCBkYXRhICkKCXsKCQlpZiAoICEgKHRoaXMgaW5zdGFuY2VvZiBfQXBpKSApIHsKCQkJcmV0dXJuIG5ldyBfQXBpKCBjb250ZXh0LCBkYXRhICk7CgkJfQoJCgkJdmFyIHNldHRpbmdzID0gW107CgkJdmFyIGN0eFNldHRpbmdzID0gZnVuY3Rpb24gKCBvICkgewoJCQl2YXIgYSA9IF90b1NldHRpbmdzKCBvICk7CgkJCWlmICggYSApIHsKCQkJCXNldHRpbmdzLnB1c2guYXBwbHkoIHNldHRpbmdzLCBhICk7CgkJCX0KCQl9OwoJCgkJaWYgKCBBcnJheS5pc0FycmF5KCBjb250ZXh0ICkgKSB7CgkJCWZvciAoIHZhciBpPTAsIGllbj1jb250ZXh0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJY3R4U2V0dGluZ3MoIGNvbnRleHRbaV0gKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJY3R4U2V0dGluZ3MoIGNvbnRleHQgKTsKCQl9CgkKCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCXRoaXMuY29udGV4dCA9IF91bmlxdWUoIHNldHRpbmdzICk7CgkKCQkvLyBJbml0aWFsIGRhdGEKCQlpZiAoIGRhdGEgKSB7CgkJCSQubWVyZ2UoIHRoaXMsIGRhdGEgKTsKCQl9CgkKCQkvLyBzZWxlY3RvcgoJCXRoaXMuc2VsZWN0b3IgPSB7CgkJCXJvd3M6IG51bGwsCgkJCWNvbHM6IG51bGwsCgkJCW9wdHM6IG51bGwKCQl9OwoJCgkJX0FwaS5leHRlbmQoIHRoaXMsIHRoaXMsIF9fYXBpU3RydWN0ICk7Cgl9OwoJCglEYXRhVGFibGUuQXBpID0gX0FwaTsKCQoJLy8gRG9uJ3QgZGVzdHJveSB0aGUgZXhpc3RpbmcgcHJvdG90eXBlLCBqdXN0IGV4dGVuZCBpdC4gUmVxdWlyZWQgZm9yIGpRdWVyeSAyJ3MKCS8vIGlzUGxhaW5PYmplY3QuCgkkLmV4dGVuZCggX0FwaS5wcm90b3R5cGUsIHsKCQlhbnk6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gdGhpcy5jb3VudCgpICE9PSAwOwoJCX0sCgkKCQoJCWNvbmNhdDogIF9fYXJyYXlQcm90by5jb25jYXQsCgkKCQoJCWNvbnRleHQ6IFtdLCAvLyBhcnJheSBvZiB0YWJsZSBzZXR0aW5ncyBvYmplY3RzCgkKCQoJCWNvdW50OiBmdW5jdGlvbiAoKQoJCXsKCQkJcmV0dXJuIHRoaXMuZmxhdHRlbigpLmxlbmd0aDsKCQl9LAoJCgkKCQllYWNoOiBmdW5jdGlvbiAoIGZuICkKCQl7CgkJCWZvciAoIHZhciBpPTAsIGllbj10aGlzLmxlbmd0aCA7IGk8aWVuOyBpKysgKSB7CgkJCQlmbi5jYWxsKCB0aGlzLCB0aGlzW2ldLCBpLCB0aGlzICk7CgkJCX0KCQoJCQlyZXR1cm4gdGhpczsKCQl9LAoJCgkKCQllcTogZnVuY3Rpb24gKCBpZHggKQoJCXsKCQkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCQlyZXR1cm4gY3R4Lmxlbmd0aCA+IGlkeCA/CgkJCQluZXcgX0FwaSggY3R4W2lkeF0sIHRoaXNbaWR4XSApIDoKCQkJCW51bGw7CgkJfSwKCQoJCgkJZmlsdGVyOiBmdW5jdGlvbiAoIGZuICkKCQl7CgkJCXZhciBhID0gW107CgkKCQkJaWYgKCBfX2FycmF5UHJvdG8uZmlsdGVyICkgewoJCQkJYSA9IF9fYXJyYXlQcm90by5maWx0ZXIuY2FsbCggdGhpcywgZm4sIHRoaXMgKTsKCQkJfQoJCQllbHNlIHsKCQkJCS8vIENvbXBhdGliaWxpdHkgZm9yIGJyb3dzZXJzIHdpdGhvdXQgRU1DQS0yNTItNSAoSlMgMS42KQoJCQkJZm9yICggdmFyIGk9MCwgaWVuPXRoaXMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQkJaWYgKCBmbi5jYWxsKCB0aGlzLCB0aGlzW2ldLCBpLCB0aGlzICkgKSB7CgkJCQkJCWEucHVzaCggdGhpc1tpXSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCgkJCXJldHVybiBuZXcgX0FwaSggdGhpcy5jb250ZXh0LCBhICk7CgkJfSwKCQoJCgkJZmxhdHRlbjogZnVuY3Rpb24gKCkKCQl7CgkJCXZhciBhID0gW107CgkJCXJldHVybiBuZXcgX0FwaSggdGhpcy5jb250ZXh0LCBhLmNvbmNhdC5hcHBseSggYSwgdGhpcy50b0FycmF5KCkgKSApOwoJCX0sCgkKCQoJCWpvaW46ICAgIF9fYXJyYXlQcm90by5qb2luLAoJCgkKCQlpbmRleE9mOiBfX2FycmF5UHJvdG8uaW5kZXhPZiB8fCBmdW5jdGlvbiAob2JqLCBzdGFydCkKCQl7CgkJCWZvciAoIHZhciBpPShzdGFydCB8fCAwKSwgaWVuPXRoaXMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlpZiAoIHRoaXNbaV0gPT09IG9iaiApIHsKCQkJCQlyZXR1cm4gaTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gLTE7CgkJfSwKCQoJCWl0ZXJhdG9yOiBmdW5jdGlvbiAoIGZsYXR0ZW4sIHR5cGUsIGZuLCBhbHdheXNOZXcgKSB7CgkJCXZhcgoJCQkJYSA9IFtdLCByZXQsCgkJCQlpLCBpZW4sIGosIGplbiwKCQkJCWNvbnRleHQgPSB0aGlzLmNvbnRleHQsCgkJCQlyb3dzLCBpdGVtcywgaXRlbSwKCQkJCXNlbGVjdG9yID0gdGhpcy5zZWxlY3RvcjsKCQoJCQkvLyBBcmd1bWVudCBzaGlmdGluZwoJCQlpZiAoIHR5cGVvZiBmbGF0dGVuID09PSAnc3RyaW5nJyApIHsKCQkJCWFsd2F5c05ldyA9IGZuOwoJCQkJZm4gPSB0eXBlOwoJCQkJdHlwZSA9IGZsYXR0ZW47CgkJCQlmbGF0dGVuID0gZmFsc2U7CgkJCX0KCQoJCQlmb3IgKCBpPTAsIGllbj1jb250ZXh0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJdmFyIGFwaUluc3QgPSBuZXcgX0FwaSggY29udGV4dFtpXSApOwoJCgkJCQlpZiAoIHR5cGUgPT09ICd0YWJsZScgKSB7CgkJCQkJcmV0ID0gZm4uY2FsbCggYXBpSW5zdCwgY29udGV4dFtpXSwgaSApOwoJCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJYS5wdXNoKCByZXQgKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIGlmICggdHlwZSA9PT0gJ2NvbHVtbnMnIHx8IHR5cGUgPT09ICdyb3dzJyApIHsKCQkJCQkvLyB0aGlzIGhhcyBzYW1lIGxlbmd0aCBhcyBjb250ZXh0IC0gb25lIGVudHJ5IGZvciBlYWNoIHRhYmxlCgkJCQkJcmV0ID0gZm4uY2FsbCggYXBpSW5zdCwgY29udGV4dFtpXSwgdGhpc1tpXSwgaSApOwoJCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJYS5wdXNoKCByZXQgKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIGlmICggdHlwZSA9PT0gJ2NvbHVtbicgfHwgdHlwZSA9PT0gJ2NvbHVtbi1yb3dzJyB8fCB0eXBlID09PSAncm93JyB8fCB0eXBlID09PSAnY2VsbCcgKSB7CgkJCQkJLy8gY29sdW1ucyBhbmQgcm93cyBzaGFyZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCgkJCQkJLy8gJ3RoaXMnIGlzIGFuIGFycmF5IG9mIGNvbHVtbiBpbmRleGVzIGZvciBlYWNoIGNvbnRleHQKCQkJCQlpdGVtcyA9IHRoaXNbaV07CgkKCQkJCQlpZiAoIHR5cGUgPT09ICdjb2x1bW4tcm93cycgKSB7CgkJCQkJCXJvd3MgPSBfc2VsZWN0b3Jfcm93X2luZGV4ZXMoIGNvbnRleHRbaV0sIHNlbGVjdG9yLm9wdHMgKTsKCQkJCQl9CgkKCQkJCQlmb3IgKCBqPTAsIGplbj1pdGVtcy5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCQkJaXRlbSA9IGl0ZW1zW2pdOwoJCgkJCQkJCWlmICggdHlwZSA9PT0gJ2NlbGwnICkgewoJCQkJCQkJcmV0ID0gZm4uY2FsbCggYXBpSW5zdCwgY29udGV4dFtpXSwgaXRlbS5yb3csIGl0ZW0uY29sdW1uLCBpLCBqICk7CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQlyZXQgPSBmbi5jYWxsKCBhcGlJbnN0LCBjb250ZXh0W2ldLCBpdGVtLCBpLCBqLCByb3dzICk7CgkJCQkJCX0KCQoJCQkJCQlpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkgewoJCQkJCQkJYS5wdXNoKCByZXQgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCgkJCWlmICggYS5sZW5ndGggfHwgYWx3YXlzTmV3ICkgewoJCQkJdmFyIGFwaSA9IG5ldyBfQXBpKCBjb250ZXh0LCBmbGF0dGVuID8gYS5jb25jYXQuYXBwbHkoIFtdLCBhICkgOiBhICk7CgkJCQl2YXIgYXBpU2VsZWN0b3IgPSBhcGkuc2VsZWN0b3I7CgkJCQlhcGlTZWxlY3Rvci5yb3dzID0gc2VsZWN0b3Iucm93czsKCQkJCWFwaVNlbGVjdG9yLmNvbHMgPSBzZWxlY3Rvci5jb2xzOwoJCQkJYXBpU2VsZWN0b3Iub3B0cyA9IHNlbGVjdG9yLm9wdHM7CgkJCQlyZXR1cm4gYXBpOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0sCgkKCQoJCWxhc3RJbmRleE9mOiBfX2FycmF5UHJvdG8ubGFzdEluZGV4T2YgfHwgZnVuY3Rpb24gKG9iaiwgc3RhcnQpCgkJewoJCQkvLyBCaXQgY2hlZWt5Li4uCgkJCXJldHVybiB0aGlzLmluZGV4T2YuYXBwbHkoIHRoaXMudG9BcnJheS5yZXZlcnNlKCksIGFyZ3VtZW50cyApOwoJCX0sCgkKCQoJCWxlbmd0aDogIDAsCgkKCQoJCW1hcDogZnVuY3Rpb24gKCBmbiApCgkJewoJCQl2YXIgYSA9IFtdOwoJCgkJCWlmICggX19hcnJheVByb3RvLm1hcCApIHsKCQkJCWEgPSBfX2FycmF5UHJvdG8ubWFwLmNhbGwoIHRoaXMsIGZuLCB0aGlzICk7CgkJCX0KCQkJZWxzZSB7CgkJCQkvLyBDb21wYXRpYmlsaXR5IGZvciBicm93c2VycyB3aXRob3V0IEVNQ0EtMjUyLTUgKEpTIDEuNikKCQkJCWZvciAoIHZhciBpPTAsIGllbj10aGlzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCWEucHVzaCggZm4uY2FsbCggdGhpcywgdGhpc1tpXSwgaSApICk7CgkJCQl9CgkJCX0KCQoJCQlyZXR1cm4gbmV3IF9BcGkoIHRoaXMuY29udGV4dCwgYSApOwoJCX0sCgkKCQoJCXBsdWNrOiBmdW5jdGlvbiAoIHByb3AgKQoJCXsKCQkJbGV0IGZuID0gRGF0YVRhYmxlLnV0aWwuZ2V0KHByb3ApOwoJCgkJCXJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24gKCBlbCApIHsKCQkJCXJldHVybiBmbihlbCk7CgkJCX0gKTsKCQl9LAoJCgkJcG9wOiAgICAgX19hcnJheVByb3RvLnBvcCwKCQoJCgkJcHVzaDogICAgX19hcnJheVByb3RvLnB1c2gsCgkKCQoJCS8vIERvZXMgbm90IHJldHVybiBhbiBBUEkgaW5zdGFuY2UKCQlyZWR1Y2U6IF9fYXJyYXlQcm90by5yZWR1Y2UgfHwgZnVuY3Rpb24gKCBmbiwgaW5pdCApCgkJewoJCQlyZXR1cm4gX2ZuUmVkdWNlKCB0aGlzLCBmbiwgaW5pdCwgMCwgdGhpcy5sZW5ndGgsIDEgKTsKCQl9LAoJCgkKCQlyZWR1Y2VSaWdodDogX19hcnJheVByb3RvLnJlZHVjZVJpZ2h0IHx8IGZ1bmN0aW9uICggZm4sIGluaXQgKQoJCXsKCQkJcmV0dXJuIF9mblJlZHVjZSggdGhpcywgZm4sIGluaXQsIHRoaXMubGVuZ3RoLTEsIC0xLCAtMSApOwoJCX0sCgkKCQoJCXJldmVyc2U6IF9fYXJyYXlQcm90by5yZXZlcnNlLAoJCgkKCQkvLyBPYmplY3Qgd2l0aCByb3dzLCBjb2x1bW5zIGFuZCBvcHRzCgkJc2VsZWN0b3I6IG51bGwsCgkKCQoJCXNoaWZ0OiAgIF9fYXJyYXlQcm90by5zaGlmdCwKCQoJCgkJc2xpY2U6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIG5ldyBfQXBpKCB0aGlzLmNvbnRleHQsIHRoaXMgKTsKCQl9LAoJCgkKCQlzb3J0OiAgICBfX2FycmF5UHJvdG8uc29ydCwgLy8gPyBuYW1lIC0gb3JkZXI/CgkKCQoJCXNwbGljZTogIF9fYXJyYXlQcm90by5zcGxpY2UsCgkKCQoJCXRvQXJyYXk6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gX19hcnJheVByb3RvLnNsaWNlLmNhbGwoIHRoaXMgKTsKCQl9LAoJCgkKCQl0byQ6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gJCggdGhpcyApOwoJCX0sCgkKCQoJCXRvSlF1ZXJ5OiBmdW5jdGlvbiAoKQoJCXsKCQkJcmV0dXJuICQoIHRoaXMgKTsKCQl9LAoJCgkKCQl1bmlxdWU6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gbmV3IF9BcGkoIHRoaXMuY29udGV4dCwgX3VuaXF1ZSh0aGlzKSApOwoJCX0sCgkKCQoJCXVuc2hpZnQ6IF9fYXJyYXlQcm90by51bnNoaWZ0Cgl9ICk7CgkKCQoJX0FwaS5leHRlbmQgPSBmdW5jdGlvbiAoIHNjb3BlLCBvYmosIGV4dCApCgl7CgkJLy8gT25seSBleHRlbmQgQVBJIGluc3RhbmNlcyBhbmQgc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIEFQSQoJCWlmICggISBleHQubGVuZ3RoIHx8ICEgb2JqIHx8ICggISAob2JqIGluc3RhbmNlb2YgX0FwaSkgJiYgISBvYmouX19kdF93cmFwcGVyICkgKSB7CgkJCXJldHVybjsKCQl9CgkKCQl2YXIKCQkJaSwgaWVuLAoJCQlzdHJ1Y3QsCgkJCW1ldGhvZFNjb3BpbmcgPSBmdW5jdGlvbiAoIHNjb3BlLCBmbiwgc3RydWMgKSB7CgkJCQlyZXR1cm4gZnVuY3Rpb24gKCkgewoJCQkJCXZhciByZXQgPSBmbi5hcHBseSggc2NvcGUsIGFyZ3VtZW50cyApOwoJCgkJCQkJLy8gTWV0aG9kIGV4dGVuc2lvbgoJCQkJCV9BcGkuZXh0ZW5kKCByZXQsIHJldCwgc3RydWMubWV0aG9kRXh0ICk7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX07CgkJCX07CgkKCQlmb3IgKCBpPTAsIGllbj1leHQubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCXN0cnVjdCA9IGV4dFtpXTsKCQoJCQkvLyBWYWx1ZQoJCQlvYmpbIHN0cnVjdC5uYW1lIF0gPSBzdHJ1Y3QudHlwZSA9PT0gJ2Z1bmN0aW9uJyA/CgkJCQltZXRob2RTY29waW5nKCBzY29wZSwgc3RydWN0LnZhbCwgc3RydWN0ICkgOgoJCQkJc3RydWN0LnR5cGUgPT09ICdvYmplY3QnID8KCQkJCQl7fSA6CgkJCQkJc3RydWN0LnZhbDsKCQoJCQlvYmpbIHN0cnVjdC5uYW1lIF0uX19kdF93cmFwcGVyID0gdHJ1ZTsKCQoJCQkvLyBQcm9wZXJ0eSBleHRlbnNpb24KCQkJX0FwaS5leHRlbmQoIHNjb3BlLCBvYmpbIHN0cnVjdC5uYW1lIF0sIHN0cnVjdC5wcm9wRXh0ICk7CgkJfQoJfTsKCQoJCgkvLyBAdG9kbyAtIElzIHRoZXJlIG5lZWQgZm9yIGFuIGF1Z21lbnQgZnVuY3Rpb24/CgkvLyBfQXBpLmF1Z21lbnQgPSBmdW5jdGlvbiAoIGluc3QsIG5hbWUgKQoJLy8gewoJLy8gCS8vIEZpbmQgc3JjIG9iamVjdCBpbiB0aGUgc3RydWN0dXJlIGZyb20gdGhlIG5hbWUKCS8vIAl2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7CgkKCS8vIAlfQXBpLmV4dGVuZCggaW5zdCwgb2JqICk7CgkvLyB9OwoJCgkKCS8vICAgICBbCgkvLyAgICAgICB7CgkvLyAgICAgICAgIG5hbWU6ICAgICAgJ2RhdGEnICAgICAgICAgICAgICAgIC0tIHN0cmluZyAgIC0gUHJvcGVydHkgbmFtZQoJLy8gICAgICAgICB2YWw6ICAgICAgIGZ1bmN0aW9uICgpIHt9LCAgICAgICAtLSBmdW5jdGlvbiAtIEFwaSBtZXRob2QgKG9yIHVuZGVmaW5lZCBpZiBqdXN0IGFuIG9iamVjdAoJLy8gICAgICAgICBtZXRob2RFeHQ6IFsgLi4uIF0sICAgICAgICAgICAgICAtLSBhcnJheSAgICAtIEFycmF5IG9mIEFwaSBvYmplY3QgZGVmaW5pdGlvbnMgdG8gZXh0ZW5kIHRoZSBtZXRob2QgcmVzdWx0CgkvLyAgICAgICAgIHByb3BFeHQ6ICAgWyAuLi4gXSAgICAgICAgICAgICAgIC0tIGFycmF5ICAgIC0gQXJyYXkgb2YgQXBpIG9iamVjdCBkZWZpbml0aW9ucyB0byBleHRlbmQgdGhlIHByb3BlcnR5CgkvLyAgICAgICB9LAoJLy8gICAgICAgewoJLy8gICAgICAgICBuYW1lOiAgICAgJ3JvdycKCS8vICAgICAgICAgdmFsOiAgICAgICB7fSwKCS8vICAgICAgICAgbWV0aG9kRXh0OiBbIC4uLiBdLAoJLy8gICAgICAgICBwcm9wRXh0OiAgIFsKCS8vICAgICAgICAgICB7CgkvLyAgICAgICAgICAgICBuYW1lOiAgICAgICdkYXRhJwoJLy8gICAgICAgICAgICAgdmFsOiAgICAgICBmdW5jdGlvbiAoKSB7fSwKCS8vICAgICAgICAgICAgIG1ldGhvZEV4dDogWyAuLi4gXSwKCS8vICAgICAgICAgICAgIHByb3BFeHQ6ICAgWyAuLi4gXQoJLy8gICAgICAgICAgIH0sCgkvLyAgICAgICAgICAgLi4uCgkvLyAgICAgICAgIF0KCS8vICAgICAgIH0KCS8vICAgICBdCgkKCV9BcGkucmVnaXN0ZXIgPSBfYXBpX3JlZ2lzdGVyID0gZnVuY3Rpb24gKCBuYW1lLCB2YWwgKQoJewoJCWlmICggQXJyYXkuaXNBcnJheSggbmFtZSApICkgewoJCQlmb3IgKCB2YXIgaj0wLCBqZW49bmFtZS5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCV9BcGkucmVnaXN0ZXIoIG5hbWVbal0sIHZhbCApOwoJCQl9CgkJCXJldHVybjsKCQl9CgkKCQl2YXIKCQkJaSwgaWVuLAoJCQloZWlyID0gbmFtZS5zcGxpdCgnLicpLAoJCQlzdHJ1Y3QgPSBfX2FwaVN0cnVjdCwKCQkJa2V5LCBtZXRob2Q7CgkKCQl2YXIgZmluZCA9IGZ1bmN0aW9uICggc3JjLCBuYW1lICkgewoJCQlmb3IgKCB2YXIgaT0wLCBpZW49c3JjLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJaWYgKCBzcmNbaV0ubmFtZSA9PT0gbmFtZSApIHsKCQkJCQlyZXR1cm4gc3JjW2ldOwoJCQkJfQoJCQl9CgkJCXJldHVybiBudWxsOwoJCX07CgkKCQlmb3IgKCBpPTAsIGllbj1oZWlyLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQltZXRob2QgPSBoZWlyW2ldLmluZGV4T2YoJygpJykgIT09IC0xOwoJCQlrZXkgPSBtZXRob2QgPwoJCQkJaGVpcltpXS5yZXBsYWNlKCcoKScsICcnKSA6CgkJCQloZWlyW2ldOwoJCgkJCXZhciBzcmMgPSBmaW5kKCBzdHJ1Y3QsIGtleSApOwoJCQlpZiAoICEgc3JjICkgewoJCQkJc3JjID0gewoJCQkJCW5hbWU6ICAgICAga2V5LAoJCQkJCXZhbDogICAgICAge30sCgkJCQkJbWV0aG9kRXh0OiBbXSwKCQkJCQlwcm9wRXh0OiAgIFtdLAoJCQkJCXR5cGU6ICAgICAgJ29iamVjdCcKCQkJCX07CgkJCQlzdHJ1Y3QucHVzaCggc3JjICk7CgkJCX0KCQoJCQlpZiAoIGkgPT09IGllbi0xICkgewoJCQkJc3JjLnZhbCA9IHZhbDsKCQkJCXNyYy50eXBlID0gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyA/CgkJCQkJJ2Z1bmN0aW9uJyA6CgkJCQkJJC5pc1BsYWluT2JqZWN0KCB2YWwgKSA/CgkJCQkJCSdvYmplY3QnIDoKCQkJCQkJJ290aGVyJzsKCQkJfQoJCQllbHNlIHsKCQkJCXN0cnVjdCA9IG1ldGhvZCA/CgkJCQkJc3JjLm1ldGhvZEV4dCA6CgkJCQkJc3JjLnByb3BFeHQ7CgkJCX0KCQl9Cgl9OwoJCglfQXBpLnJlZ2lzdGVyUGx1cmFsID0gX2FwaV9yZWdpc3RlclBsdXJhbCA9IGZ1bmN0aW9uICggcGx1cmFsTmFtZSwgc2luZ3VsYXJOYW1lLCB2YWwgKSB7CgkJX0FwaS5yZWdpc3RlciggcGx1cmFsTmFtZSwgdmFsICk7CgkKCQlfQXBpLnJlZ2lzdGVyKCBzaW5ndWxhck5hbWUsIGZ1bmN0aW9uICgpIHsKCQkJdmFyIHJldCA9IHZhbC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkKCQkJaWYgKCByZXQgPT09IHRoaXMgKSB7CgkJCQkvLyBSZXR1cm5lZCBpdGVtIGlzIHRoZSBBUEkgaW5zdGFuY2UgdGhhdCB3YXMgcGFzc2VkIGluLCByZXR1cm4gaXQKCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJCWVsc2UgaWYgKCByZXQgaW5zdGFuY2VvZiBfQXBpICkgewoJCQkJLy8gTmV3IEFQSSBpbnN0YW5jZSByZXR1cm5lZCwgd2FudCB0aGUgdmFsdWUgZnJvbSB0aGUgZmlyc3QgaXRlbQoJCQkJLy8gaW4gdGhlIHJldHVybmVkIGFycmF5IGZvciB0aGUgc2luZ3VsYXIgcmVzdWx0LgoJCQkJcmV0dXJuIHJldC5sZW5ndGggPwoJCQkJCUFycmF5LmlzQXJyYXkoIHJldFswXSApID8KCQkJCQkJbmV3IF9BcGkoIHJldC5jb250ZXh0LCByZXRbMF0gKSA6IC8vIEFycmF5IHJlc3VsdHMgYXJlICdlbmhhbmNlZCcKCQkJCQkJcmV0WzBdIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0KCQoJCQkvLyBOb24tQVBJIHJldHVybiAtIGp1c3QgZmlyZSBpdCBiYWNrCgkJCXJldHVybiByZXQ7CgkJfSApOwoJfTsKCQoJCgkvKioKCSAqIFNlbGVjdG9yIGZvciBIVE1MIHRhYmxlcy4gQXBwbHkgdGhlIGdpdmVuIHNlbGVjdG9yIHRvIHRoZSBnaXZlIGFycmF5IG9mCgkgKiBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdHMuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd8aW50ZWdlcn0gW3NlbGVjdG9yXSBqUXVlcnkgc2VsZWN0b3Igc3RyaW5nIG9yIGludGVnZXIKCSAqIEBwYXJhbSAge2FycmF5fSBBcnJheSBvZiBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdHMgdG8gYmUgZmlsdGVyZWQKCSAqIEByZXR1cm4ge2FycmF5fQoJICogQGlnbm9yZQoJICovCgl2YXIgX190YWJsZV9zZWxlY3RvciA9IGZ1bmN0aW9uICggc2VsZWN0b3IsIGEgKQoJewoJCWlmICggQXJyYXkuaXNBcnJheShzZWxlY3RvcikgKSB7CgkJCXJldHVybiAkLm1hcCggc2VsZWN0b3IsIGZ1bmN0aW9uIChpdGVtKSB7CgkJCQlyZXR1cm4gX190YWJsZV9zZWxlY3RvcihpdGVtLCBhKTsKCQkJfSApOwoJCX0KCQoJCS8vIEludGVnZXIgaXMgdXNlZCB0byBwaWNrIG91dCBhIHRhYmxlIGJ5IGluZGV4CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICdudW1iZXInICkgewoJCQlyZXR1cm4gWyBhWyBzZWxlY3RvciBdIF07CgkJfQoJCgkJLy8gUGVyZm9ybSBhIGpRdWVyeSBzZWxlY3RvciBvbiB0aGUgdGFibGUgbm9kZXMKCQl2YXIgbm9kZXMgPSAkLm1hcCggYSwgZnVuY3Rpb24gKGVsLCBpKSB7CgkJCXJldHVybiBlbC5uVGFibGU7CgkJfSApOwoJCgkJcmV0dXJuICQobm9kZXMpCgkJCS5maWx0ZXIoIHNlbGVjdG9yICkKCQkJLm1hcCggZnVuY3Rpb24gKGkpIHsKCQkJCS8vIE5lZWQgdG8gdHJhbnNsYXRlIGJhY2sgZnJvbSB0aGUgdGFibGUgbm9kZSB0byB0aGUgc2V0dGluZ3MKCQkJCXZhciBpZHggPSAkLmluQXJyYXkoIHRoaXMsIG5vZGVzICk7CgkJCQlyZXR1cm4gYVsgaWR4IF07CgkJCX0gKQoJCQkudG9BcnJheSgpOwoJfTsKCQoJCgkKCS8qKgoJICogQ29udGV4dCBzZWxlY3RvciBmb3IgdGhlIEFQSSdzIGNvbnRleHQgKGkuZS4gdGhlIHRhYmxlcyB0aGUgQVBJIGluc3RhbmNlCgkgKiByZWZlcnMgdG8uCgkgKgoJICogQG5hbWUgICAgRGF0YVRhYmxlLkFwaSN0YWJsZXMKCSAqIEBwYXJhbSB7c3RyaW5nfGludGVnZXJ9IFtzZWxlY3Rvcl0gU2VsZWN0b3IgdG8gcGljayB3aGljaCB0YWJsZXMgdGhlIGl0ZXJhdG9yCgkgKiAgIHNob3VsZCBvcGVyYXRlIG9uLiBJZiBub3QgZ2l2ZW4sIGFsbCB0YWJsZXMgaW4gdGhlIGN1cnJlbnQgY29udGV4dCBhcmUKCSAqICAgdXNlZC4gVGhpcyBjYW4gYmUgZ2l2ZW4gYXMgYSBqUXVlcnkgc2VsZWN0b3IgKGZvciBleGFtcGxlIGAnOmd0KDApJ2ApIHRvCgkgKiAgIHNlbGVjdCBtdWx0aXBsZSB0YWJsZXMgb3IgYXMgYW4gaW50ZWdlciB0byBzZWxlY3QgYSBzaW5nbGUgdGFibGUuCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlLkFwaX0gUmV0dXJucyBhIG5ldyBBUEkgaW5zdGFuY2UgaWYgYSBzZWxlY3RvciBpcyBnaXZlbi4KCSAqLwoJX2FwaV9yZWdpc3RlciggJ3RhYmxlcygpJywgZnVuY3Rpb24gKCBzZWxlY3RvciApIHsKCQkvLyBBIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGlmIHRoZXJlIHdhcyBhIHNlbGVjdG9yIHNwZWNpZmllZAoJCXJldHVybiBzZWxlY3RvciAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdG9yICE9PSBudWxsID8KCQkJbmV3IF9BcGkoIF9fdGFibGVfc2VsZWN0b3IoIHNlbGVjdG9yLCB0aGlzLmNvbnRleHQgKSApIDoKCQkJdGhpczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAndGFibGUoKScsIGZ1bmN0aW9uICggc2VsZWN0b3IgKSB7CgkJdmFyIHRhYmxlcyA9IHRoaXMudGFibGVzKCBzZWxlY3RvciApOwoJCXZhciBjdHggPSB0YWJsZXMuY29udGV4dDsKCQoJCS8vIFRydW5jYXRlIHRvIHRoZSBmaXJzdCBtYXRjaGVkIHRhYmxlCgkJcmV0dXJuIGN0eC5sZW5ndGggPwoJCQluZXcgX0FwaSggY3R4WzBdICkgOgoJCQl0YWJsZXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3RhYmxlcygpLm5vZGVzKCknLCAndGFibGUoKS5ub2RlKCknICwgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIGN0eCApIHsKCQkJcmV0dXJuIGN0eC5uVGFibGU7CgkJfSwgMSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICd0YWJsZXMoKS5ib2R5KCknLCAndGFibGUoKS5ib2R5KCknICwgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIGN0eCApIHsKCQkJcmV0dXJuIGN0eC5uVEJvZHk7CgkJfSwgMSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICd0YWJsZXMoKS5oZWFkZXIoKScsICd0YWJsZSgpLmhlYWRlcigpJyAsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBjdHggKSB7CgkJCXJldHVybiBjdHgublRIZWFkOwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAndGFibGVzKCkuZm9vdGVyKCknLCAndGFibGUoKS5mb290ZXIoKScgLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggY3R4ICkgewoJCQlyZXR1cm4gY3R4Lm5URm9vdDsKCQl9LCAxICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3RhYmxlcygpLmNvbnRhaW5lcnMoKScsICd0YWJsZSgpLmNvbnRhaW5lcigpJyAsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBjdHggKSB7CgkJCXJldHVybiBjdHgublRhYmxlV3JhcHBlcjsKCQl9LCAxICk7Cgl9ICk7CgkKCQoJCgkvKioKCSAqIFJlZHJhdyB0aGUgdGFibGVzIGluIHRoZSBjdXJyZW50IGNvbnRleHQuCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdkcmF3KCknLCBmdW5jdGlvbiAoIHBhZ2luZyApIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJaWYgKCBwYWdpbmcgPT09ICdwYWdlJyApIHsKCQkJCV9mbkRyYXcoIHNldHRpbmdzICk7CgkJCX0KCQkJZWxzZSB7CgkJCQlpZiAoIHR5cGVvZiBwYWdpbmcgPT09ICdzdHJpbmcnICkgewoJCQkJCXBhZ2luZyA9IHBhZ2luZyA9PT0gJ2Z1bGwtaG9sZCcgPwoJCQkJCQlmYWxzZSA6CgkJCQkJCXRydWU7CgkJCQl9CgkKCQkJCV9mblJlRHJhdyggc2V0dGluZ3MsIHBhZ2luZz09PWZhbHNlICk7CgkJCX0KCQl9ICk7Cgl9ICk7CgkKCQoJCgkvKioKCSAqIEdldCB0aGUgY3VycmVudCBwYWdlIGluZGV4LgoJICoKCSAqIEByZXR1cm4ge2ludGVnZXJ9IEN1cnJlbnQgcGFnZSBpbmRleCAoemVybyBiYXNlZCkKCSAqLy8qKgoJICogU2V0IHRoZSBjdXJyZW50IHBhZ2UuCgkgKgoJICogTm90ZSB0aGF0IGlmIHlvdSBhdHRlbXB0IHRvIHNob3cgYSBwYWdlIHdoaWNoIGRvZXMgbm90IGV4aXN0LCBEYXRhVGFibGVzIHdpbGwKCSAqIG5vdCB0aHJvdyBhbiBlcnJvciwgYnV0IHJhdGhlciByZXNldCB0aGUgcGFnaW5nLgoJICoKCSAqIEBwYXJhbSB7aW50ZWdlcnxzdHJpbmd9IGFjdGlvbiBUaGUgcGFnaW5nIGFjdGlvbiB0byB0YWtlLiBUaGlzIGNhbiBiZSBvbmUgb2Y6CgkgKiAgKiBgaW50ZWdlcmAgLSBUaGUgcGFnZSBpbmRleCB0byBqdW1wIHRvCgkgKiAgKiBgc3RyaW5nYCAtIEFuIGFjdGlvbiB0byB0YWtlOgoJICogICAgKiBgZmlyc3RgIC0gSnVtcCB0byBmaXJzdCBwYWdlLgoJICogICAgKiBgbmV4dGAgLSBKdW1wIHRvIHRoZSBuZXh0IHBhZ2UKCSAqICAgICogYHByZXZpb3VzYCAtIEp1bXAgdG8gcHJldmlvdXMgcGFnZQoJICogICAgKiBgbGFzdGAgLSBKdW1wIHRvIHRoZSBsYXN0IHBhZ2UuCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlcy5BcGl9IHRoaXMKCSAqLwoJX2FwaV9yZWdpc3RlciggJ3BhZ2UoKScsIGZ1bmN0aW9uICggYWN0aW9uICkgewoJCWlmICggYWN0aW9uID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzLnBhZ2UuaW5mbygpLnBhZ2U7IC8vIG5vdCBhbiBleHBlbnNpdmUgY2FsbAoJCX0KCQoJCS8vIGVsc2UsIGhhdmUgYW4gYWN0aW9uIHRvIHRha2Ugb24gYWxsIHRhYmxlcwoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5QYWdlQ2hhbmdlKCBzZXR0aW5ncywgYWN0aW9uICk7CgkJfSApOwoJfSApOwoJCgkKCS8qKgoJICogUGFnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmlyc3QgdGFibGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KCSAqCgkgKiBJZiB5b3UgcmVxdWlyZSBwYWdpbmcgaW5mb3JtYXRpb24gZm9yIGFub3RoZXIgdGFibGUsIHVzZSB0aGUgYHRhYmxlKClgIG1ldGhvZAoJICogd2l0aCBhIHN1aXRhYmxlIHNlbGVjdG9yLgoJICoKCSAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHNldDoKCSAqICAqIGBwYWdlYCAtIEN1cnJlbnQgcGFnZSBpbmRleCAoemVybyBiYXNlZCAtIGkuZS4gdGhlIGZpcnN0IHBhZ2UgaXMgYDBgKQoJICogICogYHBhZ2VzYCAtIFRvdGFsIG51bWJlciBvZiBwYWdlcwoJICogICogYHN0YXJ0YCAtIERpc3BsYXkgaW5kZXggZm9yIHRoZSBmaXJzdCByZWNvcmQgc2hvd24gb24gdGhlIGN1cnJlbnQgcGFnZQoJICogICogYGVuZGAgLSBEaXNwbGF5IGluZGV4IGZvciB0aGUgbGFzdCByZWNvcmQgc2hvd24gb24gdGhlIGN1cnJlbnQgcGFnZQoJICogICogYGxlbmd0aGAgLSBEaXNwbGF5IGxlbmd0aCAobnVtYmVyIG9mIHJlY29yZHMpLiBOb3RlIHRoYXQgZ2VuZXJhbGx5IGBzdGFydAoJICogICAgKyBsZW5ndGggPSBlbmRgLCBidXQgdGhpcyBpcyBub3QgYWx3YXlzIHRydWUsIGZvciBleGFtcGxlIGlmIHRoZXJlIGFyZQoJICogICAgb25seSAyIHJlY29yZHMgdG8gc2hvdyBvbiB0aGUgZmluYWwgcGFnZSwgd2l0aCBhIGxlbmd0aCBvZiAxMC4KCSAqICAqIGByZWNvcmRzVG90YWxgIC0gRnVsbCBkYXRhIHNldCBsZW5ndGgKCSAqICAqIGByZWNvcmRzRGlzcGxheWAgLSBEYXRhIHNldCBsZW5ndGggb25jZSB0aGUgY3VycmVudCBmaWx0ZXJpbmcgY3JpdGVyaW9uCgkgKiAgICBhcmUgYXBwbGllZC4KCSAqLwoJX2FwaV9yZWdpc3RlciggJ3BhZ2UuaW5mbygpJywgZnVuY3Rpb24gKCBhY3Rpb24gKSB7CgkJaWYgKCB0aGlzLmNvbnRleHQubGVuZ3RoID09PSAwICkgewoJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCX0KCQoJCXZhcgoJCQlzZXR0aW5ncyAgID0gdGhpcy5jb250ZXh0WzBdLAoJCQlzdGFydCAgICAgID0gc2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQsCgkJCWxlbiAgICAgICAgPSBzZXR0aW5ncy5vRmVhdHVyZXMuYlBhZ2luYXRlID8gc2V0dGluZ3MuX2lEaXNwbGF5TGVuZ3RoIDogLTEsCgkJCXZpc1JlY29yZHMgPSBzZXR0aW5ncy5mblJlY29yZHNEaXNwbGF5KCksCgkJCWFsbCAgICAgICAgPSBsZW4gPT09IC0xOwoJCgkJcmV0dXJuIHsKCQkJInBhZ2UiOiAgICAgICAgICAgYWxsID8gMCA6IE1hdGguZmxvb3IoIHN0YXJ0IC8gbGVuICksCgkJCSJwYWdlcyI6ICAgICAgICAgIGFsbCA/IDEgOiBNYXRoLmNlaWwoIHZpc1JlY29yZHMgLyBsZW4gKSwKCQkJInN0YXJ0IjogICAgICAgICAgc3RhcnQsCgkJCSJlbmQiOiAgICAgICAgICAgIHNldHRpbmdzLmZuRGlzcGxheUVuZCgpLAoJCQkibGVuZ3RoIjogICAgICAgICBsZW4sCgkJCSJyZWNvcmRzVG90YWwiOiAgIHNldHRpbmdzLmZuUmVjb3Jkc1RvdGFsKCksCgkJCSJyZWNvcmRzRGlzcGxheSI6IHZpc1JlY29yZHMsCgkJCSJzZXJ2ZXJTaWRlIjogICAgIF9mbkRhdGFTb3VyY2UoIHNldHRpbmdzICkgPT09ICdzc3AnCgkJfTsKCX0gKTsKCQoJCgkvKioKCSAqIEdldCB0aGUgY3VycmVudCBwYWdlIGxlbmd0aC4KCSAqCgkgKiBAcmV0dXJuIHtpbnRlZ2VyfSBDdXJyZW50IHBhZ2UgbGVuZ3RoLiBOb3RlIGAtMWAgaW5kaWNhdGVzIHRoYXQgYWxsIHJlY29yZHMKCSAqICAgYXJlIHRvIGJlIHNob3duLgoJICovLyoqCgkgKiBTZXQgdGhlIGN1cnJlbnQgcGFnZSBsZW5ndGguCgkgKgoJICogQHBhcmFtIHtpbnRlZ2VyfSBQYWdlIGxlbmd0aCB0byBzZXQuIFVzZSBgLTFgIHRvIHNob3cgYWxsIHJlY29yZHMuCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlcy5BcGl9IHRoaXMKCSAqLwoJX2FwaV9yZWdpc3RlciggJ3BhZ2UubGVuKCknLCBmdW5jdGlvbiAoIGxlbiApIHsKCQkvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY2FsbCB0aGlzIGZ1bmN0aW9uICdsZW5ndGgoKScgYmVjYXVzZSBgbGVuZ3RoYAoJCS8vIGlzIGEgSmF2YXNjcmlwdCBwcm9wZXJ0eSBvZiBmdW5jdGlvbnMgd2hpY2ggZGVmaW5lcyBob3cgbWFueSBhcmd1bWVudHMKCQkvLyB0aGUgZnVuY3Rpb24gZXhwZWN0cy4KCQlpZiAoIGxlbiA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5jb250ZXh0Lmxlbmd0aCAhPT0gMCA/CgkJCQl0aGlzLmNvbnRleHRbMF0uX2lEaXNwbGF5TGVuZ3RoIDoKCQkJCXVuZGVmaW5lZDsKCQl9CgkKCQkvLyBlbHNlLCBzZXQgdGhlIHBhZ2UgbGVuZ3RoCgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCV9mbkxlbmd0aENoYW5nZSggc2V0dGluZ3MsIGxlbiApOwoJCX0gKTsKCX0gKTsKCQoJCgkKCXZhciBfX3JlbG9hZCA9IGZ1bmN0aW9uICggc2V0dGluZ3MsIGhvbGRQb3NpdGlvbiwgY2FsbGJhY2sgKSB7CgkJLy8gVXNlIHRoZSBkcmF3IGV2ZW50IHRvIHRyaWdnZXIgYSBjYWxsYmFjawoJCWlmICggY2FsbGJhY2sgKSB7CgkJCXZhciBhcGkgPSBuZXcgX0FwaSggc2V0dGluZ3MgKTsKCQoJCQlhcGkub25lKCAnZHJhdycsIGZ1bmN0aW9uICgpIHsKCQkJCWNhbGxiYWNrKCBhcGkuYWpheC5qc29uKCkgKTsKCQkJfSApOwoJCX0KCQoJCWlmICggX2ZuRGF0YVNvdXJjZSggc2V0dGluZ3MgKSA9PSAnc3NwJyApIHsKCQkJX2ZuUmVEcmF3KCBzZXR0aW5ncywgaG9sZFBvc2l0aW9uICk7CgkJfQoJCWVsc2UgewoJCQlfZm5Qcm9jZXNzaW5nRGlzcGxheSggc2V0dGluZ3MsIHRydWUgKTsKCQoJCQkvLyBDYW5jZWwgYW4gZXhpc3RpbmcgcmVxdWVzdAoJCQl2YXIgeGhyID0gc2V0dGluZ3MuanFYSFI7CgkJCWlmICggeGhyICYmIHhoci5yZWFkeVN0YXRlICE9PSA0ICkgewoJCQkJeGhyLmFib3J0KCk7CgkJCX0KCQoJCQkvLyBUcmlnZ2VyIHhocgoJCQlfZm5CdWlsZEFqYXgoIHNldHRpbmdzLCBbXSwgZnVuY3Rpb24oIGpzb24gKSB7CgkJCQlfZm5DbGVhclRhYmxlKCBzZXR0aW5ncyApOwoJCgkJCQl2YXIgZGF0YSA9IF9mbkFqYXhEYXRhU3JjKCBzZXR0aW5ncywganNvbiApOwoJCQkJZm9yICggdmFyIGk9MCwgaWVuPWRhdGEubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQkJX2ZuQWRkRGF0YSggc2V0dGluZ3MsIGRhdGFbaV0gKTsKCQkJCX0KCQoJCQkJX2ZuUmVEcmF3KCBzZXR0aW5ncywgaG9sZFBvc2l0aW9uICk7CgkJCQlfZm5Qcm9jZXNzaW5nRGlzcGxheSggc2V0dGluZ3MsIGZhbHNlICk7CgkJCX0gKTsKCQl9Cgl9OwoJCgkKCS8qKgoJICogR2V0IHRoZSBKU09OIHJlc3BvbnNlIGZyb20gdGhlIGxhc3QgQWpheCByZXF1ZXN0IHRoYXQgRGF0YVRhYmxlcyBtYWRlIHRvIHRoZQoJICogc2VydmVyLiBOb3RlIHRoYXQgdGhpcyByZXR1cm5zIHRoZSBKU09OIGZyb20gdGhlIGZpcnN0IHRhYmxlIGluIHRoZSBjdXJyZW50CgkgKiBjb250ZXh0LgoJICoKCSAqIEByZXR1cm4ge29iamVjdH0gSlNPTiByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4Lmpzb24oKScsIGZ1bmN0aW9uICgpIHsKCQl2YXIgY3R4ID0gdGhpcy5jb250ZXh0OwoJCgkJaWYgKCBjdHgubGVuZ3RoID4gMCApIHsKCQkJcmV0dXJuIGN0eFswXS5qc29uOwoJCX0KCQoJCS8vIGVsc2UgcmV0dXJuIHVuZGVmaW5lZDsKCX0gKTsKCQoJCgkvKioKCSAqIEdldCB0aGUgZGF0YSBzdWJtaXR0ZWQgaW4gdGhlIGxhc3QgQWpheCByZXF1ZXN0CgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4LnBhcmFtcygpJywgZnVuY3Rpb24gKCkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGN0eC5sZW5ndGggPiAwICkgewoJCQlyZXR1cm4gY3R4WzBdLm9BamF4RGF0YTsKCQl9CgkKCQkvLyBlbHNlIHJldHVybiB1bmRlZmluZWQ7Cgl9ICk7CgkKCQoJLyoqCgkgKiBSZWxvYWQgdGFibGVzIGZyb20gdGhlIEFqYXggZGF0YSBzb3VyY2UuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwKCSAqIGF1dG9tYXRpY2FsbHkgcmUtZHJhdyB0aGUgdGFibGUgd2hlbiB0aGUgcmVtb3RlIGRhdGEgaGFzIGJlZW4gbG9hZGVkLgoJICoKCSAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc2V0PXRydWVdIFJlc2V0IChkZWZhdWx0KSBvciBob2xkIHRoZSBjdXJyZW50IHBhZ2luZwoJICogICBwb3NpdGlvbi4gQSBmdWxsIHJlLXNvcnQgYW5kIHJlLWZpbHRlciBpcyBwZXJmb3JtZWQgd2hlbiB0aGlzIG1ldGhvZCBpcwoJICogICBjYWxsZWQsIHdoaWNoIGlzIHdoeSB0aGUgcGFnaW5hdGlvbiByZXNldCBpcyB0aGUgZGVmYXVsdCBhY3Rpb24uCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlcy5BcGl9IHRoaXMKCSAqLwoJX2FwaV9yZWdpc3RlciggJ2FqYXgucmVsb2FkKCknLCBmdW5jdGlvbiAoIGNhbGxiYWNrLCByZXNldFBhZ2luZyApIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKHNldHRpbmdzKSB7CgkJCV9fcmVsb2FkKCBzZXR0aW5ncywgcmVzZXRQYWdpbmc9PT1mYWxzZSwgY2FsbGJhY2sgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJLyoqCgkgKiBHZXQgdGhlIGN1cnJlbnQgQWpheCBVUkwuIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgdGhlIFVSTCBmcm9tIHRoZSBmaXJzdAoJICogdGFibGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KCSAqCgkgKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgQWpheCBzb3VyY2UgVVJMCgkgKi8vKioKCSAqIFNldCB0aGUgQWpheCBVUkwuIE5vdGUgdGhhdCB0aGlzIHdpbGwgc2V0IHRoZSBVUkwgZm9yIGFsbCB0YWJsZXMgaW4gdGhlCgkgKiBjdXJyZW50IGNvbnRleHQuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gc2V0LgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4LnVybCgpJywgZnVuY3Rpb24gKCB1cmwgKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCWlmICggdXJsID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIGdldAoJCQlpZiAoIGN0eC5sZW5ndGggPT09IDAgKSB7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCQl9CgkJCWN0eCA9IGN0eFswXTsKCQoJCQlyZXR1cm4gY3R4LmFqYXggPwoJCQkJJC5pc1BsYWluT2JqZWN0KCBjdHguYWpheCApID8KCQkJCQljdHguYWpheC51cmwgOgoJCQkJCWN0eC5hamF4IDoKCQkJCWN0eC5zQWpheFNvdXJjZTsKCQl9CgkKCQkvLyBzZXQKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHNldHRpbmdzLmFqYXggKSApIHsKCQkJCXNldHRpbmdzLmFqYXgudXJsID0gdXJsOwoJCQl9CgkJCWVsc2UgewoJCQkJc2V0dGluZ3MuYWpheCA9IHVybDsKCQkJfQoJCQkvLyBObyBuZWVkIHRvIGNvbnNpZGVyIHNBamF4U291cmNlIGhlcmUgc2luY2UgRGF0YVRhYmxlcyBnaXZlcyBwcmlvcml0eQoJCQkvLyB0byBgYWpheGAgb3ZlciBgc0FqYXhTb3VyY2VgLiBTbyBzZXR0aW5nIGBhamF4YCBoZXJlLCByZW5kZXJzIGFueQoJCQkvLyB2YWx1ZSBvZiBgc0FqYXhTb3VyY2VgIHJlZHVuZGFudC4KCQl9ICk7Cgl9ICk7CgkKCQoJLyoqCgkgKiBMb2FkIGRhdGEgZnJvbSB0aGUgbmV3bHkgc2V0IEFqYXggVVJMLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgb25seQoJICogYXZhaWxhYmxlIHdoZW4gYGFqYXgudXJsKClgIGlzIHVzZWQgdG8gc2V0IGEgVVJMLiBBZGRpdGlvbmFsbHksIHRoaXMgbWV0aG9kCgkgKiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcgYGFqYXgucmVsb2FkKClgIGJ1dCBpcyBwcm92aWRlZCBmb3IKCSAqIGNvbnZlbmllbmNlIHdoZW4gc2V0dGluZyBhIG5ldyBVUkwuIExpa2UgYGFqYXgucmVsb2FkKClgIGl0IHdpbGwKCSAqIGF1dG9tYXRpY2FsbHkgcmVkcmF3IHRoZSB0YWJsZSBvbmNlIHRoZSByZW1vdGUgZGF0YSBoYXMgYmVlbiBsb2FkZWQuCgkgKgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdhamF4LnVybCgpLmxvYWQoKScsIGZ1bmN0aW9uICggY2FsbGJhY2ssIHJlc2V0UGFnaW5nICkgewoJCS8vIFNhbWUgYXMgYSByZWxvYWQsIGJ1dCBtYWtlcyBzZW5zZSB0byBwcmVzZW50IGl0IGZvciBlYXN5IGFjY2VzcyBhZnRlciBhCgkJLy8gdXJsIGNoYW5nZQoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIGN0eCApIHsKCQkJX19yZWxvYWQoIGN0eCwgcmVzZXRQYWdpbmc9PT1mYWxzZSwgY2FsbGJhY2sgKTsKCQl9ICk7Cgl9ICk7CgkKCQoJCgkKCXZhciBfc2VsZWN0b3JfcnVuID0gZnVuY3Rpb24gKCB0eXBlLCBzZWxlY3Rvciwgc2VsZWN0Rm4sIHNldHRpbmdzLCBvcHRzICkKCXsKCQl2YXIKCQkJb3V0ID0gW10sIHJlcywKCQkJYSwgaSwgaWVuLCBqLCBqZW4sCgkJCXNlbGVjdG9yVHlwZSA9IHR5cGVvZiBzZWxlY3RvcjsKCQoJCS8vIENhbid0IGp1c3QgY2hlY2sgZm9yIGlzQXJyYXkgaGVyZSwgYXMgYW4gQVBJIG9yIGpRdWVyeSBpbnN0YW5jZSBtaWdodCBiZQoJCS8vIGdpdmVuIHdpdGggdGhlaXIgYXJyYXkgbGlrZSBsb29rCgkJaWYgKCAhIHNlbGVjdG9yIHx8IHNlbGVjdG9yVHlwZSA9PT0gJ3N0cmluZycgfHwgc2VsZWN0b3JUeXBlID09PSAnZnVuY3Rpb24nIHx8IHNlbGVjdG9yLmxlbmd0aCA9PT0gdW5kZWZpbmVkICkgewoJCQlzZWxlY3RvciA9IFsgc2VsZWN0b3IgXTsKCQl9CgkKCQlmb3IgKCBpPTAsIGllbj1zZWxlY3Rvci5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJLy8gT25seSBzcGxpdCBvbiBzaW1wbGUgc3RyaW5ncyAtIGNvbXBsZXggZXhwcmVzc2lvbnMgd2lsbCBiZSBqUXVlcnkgc2VsZWN0b3JzCgkJCWEgPSBzZWxlY3RvcltpXSAmJiBzZWxlY3RvcltpXS5zcGxpdCAmJiAhIHNlbGVjdG9yW2ldLm1hdGNoKC9bXFtcKDpdLykgPwoJCQkJc2VsZWN0b3JbaV0uc3BsaXQoJywnKSA6CgkJCQlbIHNlbGVjdG9yW2ldIF07CgkKCQkJZm9yICggaj0wLCBqZW49YS5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCXJlcyA9IHNlbGVjdEZuKCB0eXBlb2YgYVtqXSA9PT0gJ3N0cmluZycgPyAoYVtqXSkudHJpbSgpIDogYVtqXSApOwoJCgkJCQlpZiAoIHJlcyAmJiByZXMubGVuZ3RoICkgewoJCQkJCW91dCA9IG91dC5jb25jYXQoIHJlcyApOwoJCQkJfQoJCQl9CgkJfQoJCgkJLy8gc2VsZWN0b3IgZXh0ZW5zaW9ucwoJCXZhciBleHQgPSBfZXh0LnNlbGVjdG9yWyB0eXBlIF07CgkJaWYgKCBleHQubGVuZ3RoICkgewoJCQlmb3IgKCBpPTAsIGllbj1leHQubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlvdXQgPSBleHRbaV0oIHNldHRpbmdzLCBvcHRzLCBvdXQgKTsKCQkJfQoJCX0KCQoJCXJldHVybiBfdW5pcXVlKCBvdXQgKTsKCX07CgkKCQoJdmFyIF9zZWxlY3Rvcl9vcHRzID0gZnVuY3Rpb24gKCBvcHRzICkKCXsKCQlpZiAoICEgb3B0cyApIHsKCQkJb3B0cyA9IHt9OwoJCX0KCQoJCS8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciAxLjktIHdoaWNoIHVzZWQgdGhlIHRlcm1pbm9sb2d5IGZpbHRlciByYXRoZXIKCQkvLyB0aGFuIHNlYXJjaAoJCWlmICggb3B0cy5maWx0ZXIgJiYgb3B0cy5zZWFyY2ggPT09IHVuZGVmaW5lZCApIHsKCQkJb3B0cy5zZWFyY2ggPSBvcHRzLmZpbHRlcjsKCQl9CgkKCQlyZXR1cm4gJC5leHRlbmQoIHsKCQkJc2VhcmNoOiAnbm9uZScsCgkJCW9yZGVyOiAnY3VycmVudCcsCgkJCXBhZ2U6ICdhbGwnCgkJfSwgb3B0cyApOwoJfTsKCQoJCgl2YXIgX3NlbGVjdG9yX2ZpcnN0ID0gZnVuY3Rpb24gKCBpbnN0ICkKCXsKCQkvLyBSZWR1Y2UgdGhlIEFQSSBpbnN0YW5jZSB0byB0aGUgZmlyc3QgaXRlbSBmb3VuZAoJCWZvciAoIHZhciBpPTAsIGllbj1pbnN0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQlpZiAoIGluc3RbaV0ubGVuZ3RoID4gMCApIHsKCQkJCS8vIEFzc2lnbiB0aGUgZmlyc3QgZWxlbWVudCB0byB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgaW5zdGFuY2UKCQkJCS8vIGFuZCB0cnVuY2F0ZSB0aGUgaW5zdGFuY2UgYW5kIGNvbnRleHQKCQkJCWluc3RbMF0gPSBpbnN0W2ldOwoJCQkJaW5zdFswXS5sZW5ndGggPSAxOwoJCQkJaW5zdC5sZW5ndGggPSAxOwoJCQkJaW5zdC5jb250ZXh0ID0gWyBpbnN0LmNvbnRleHRbaV0gXTsKCQoJCQkJcmV0dXJuIGluc3Q7CgkJCX0KCQl9CgkKCQkvLyBOb3QgZm91bmQgLSByZXR1cm4gYW4gZW1wdHkgaW5zdGFuY2UKCQlpbnN0Lmxlbmd0aCA9IDA7CgkJcmV0dXJuIGluc3Q7Cgl9OwoJCgkKCXZhciBfc2VsZWN0b3Jfcm93X2luZGV4ZXMgPSBmdW5jdGlvbiAoIHNldHRpbmdzLCBvcHRzICkKCXsKCQl2YXIKCQkJaSwgaWVuLCB0bXAsIGE9W10sCgkJCWRpc3BsYXlGaWx0ZXJlZCA9IHNldHRpbmdzLmFpRGlzcGxheSwKCQkJZGlzcGxheU1hc3RlciA9IHNldHRpbmdzLmFpRGlzcGxheU1hc3RlcjsKCQoJCXZhcgoJCQlzZWFyY2ggPSBvcHRzLnNlYXJjaCwgIC8vIG5vbmUsIGFwcGxpZWQsIHJlbW92ZWQKCQkJb3JkZXIgID0gb3B0cy5vcmRlciwgICAvLyBhcHBsaWVkLCBjdXJyZW50LCBpbmRleCAob3JpZ2luYWwgLSBjb21wYXRpYmlsaXR5IHdpdGggMS45KQoJCQlwYWdlICAgPSBvcHRzLnBhZ2U7ICAgIC8vIGFsbCwgY3VycmVudAoJCgkJaWYgKCBfZm5EYXRhU291cmNlKCBzZXR0aW5ncyApID09ICdzc3AnICkgewoJCQkvLyBJbiBzZXJ2ZXItc2lkZSBwcm9jZXNzaW5nIG1vZGUsIG1vc3Qgb3B0aW9ucyBhcmUgaXJyZWxldmFudCBzaW5jZQoJCQkvLyByb3dzIG5vdCBzaG93biBkb24ndCBleGlzdCBhbmQgdGhlIGluZGV4IG9yZGVyIGlzIHRoZSBhcHBsaWVkIG9yZGVyCgkJCS8vIFJlbW92ZWQgaXMgYSBzcGVjaWFsIGNhc2UgLSBmb3IgY29uc2lzdGVuY3kganVzdCByZXR1cm4gYW4gZW1wdHkKCQkJLy8gYXJyYXkKCQkJcmV0dXJuIHNlYXJjaCA9PT0gJ3JlbW92ZWQnID8KCQkJCVtdIDoKCQkJCV9yYW5nZSggMCwgZGlzcGxheU1hc3Rlci5sZW5ndGggKTsKCQl9CgkJZWxzZSBpZiAoIHBhZ2UgPT0gJ2N1cnJlbnQnICkgewoJCQkvLyBDdXJyZW50IHBhZ2UgaW1wbGllcyB0aGF0IG9yZGVyPWN1cnJlbnQgYW5kIGZpbHRlcj1hcHBsaWVkLCBzaW5jZSBpdCBpcwoJCQkvLyBmYWlybHkgc2Vuc2VsZXNzIG90aGVyd2lzZSwgcmVnYXJkbGVzcyBvZiB3aGF0IG9yZGVyIGFuZCBzZWFyY2ggYWN0dWFsbHkKCQkJLy8gYXJlCgkJCWZvciAoIGk9c2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQsIGllbj1zZXR0aW5ncy5mbkRpc3BsYXlFbmQoKSA7IGk8aWVuIDsgaSsrICkgewoJCQkJYS5wdXNoKCBkaXNwbGF5RmlsdGVyZWRbaV0gKTsKCQkJfQoJCX0KCQllbHNlIGlmICggb3JkZXIgPT0gJ2N1cnJlbnQnIHx8IG9yZGVyID09ICdhcHBsaWVkJyApIHsKCQkJaWYgKCBzZWFyY2ggPT0gJ25vbmUnKSB7CgkJCQlhID0gZGlzcGxheU1hc3Rlci5zbGljZSgpOwoJCQl9CgkJCWVsc2UgaWYgKCBzZWFyY2ggPT0gJ2FwcGxpZWQnICkgewoJCQkJYSA9IGRpc3BsYXlGaWx0ZXJlZC5zbGljZSgpOwoJCQl9CgkJCWVsc2UgaWYgKCBzZWFyY2ggPT0gJ3JlbW92ZWQnICkgewoJCQkJLy8gTyhuK20pIHNvbHV0aW9uIGJ5IGNyZWF0aW5nIGEgaGFzaCBtYXAKCQkJCXZhciBkaXNwbGF5RmlsdGVyZWRNYXAgPSB7fTsKCQoJCQkJZm9yICggdmFyIGk9MCwgaWVuPWRpc3BsYXlGaWx0ZXJlZC5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCQlkaXNwbGF5RmlsdGVyZWRNYXBbZGlzcGxheUZpbHRlcmVkW2ldXSA9IG51bGw7CgkJCQl9CgkKCQkJCWEgPSAkLm1hcCggZGlzcGxheU1hc3RlciwgZnVuY3Rpb24gKGVsKSB7CgkJCQkJcmV0dXJuICEgZGlzcGxheUZpbHRlcmVkTWFwLmhhc093blByb3BlcnR5KGVsKSA/CgkJCQkJCWVsIDoKCQkJCQkJbnVsbDsKCQkJCX0gKTsKCQkJfQoJCX0KCQllbHNlIGlmICggb3JkZXIgPT0gJ2luZGV4JyB8fCBvcmRlciA9PSAnb3JpZ2luYWwnICkgewoJCQlmb3IgKCBpPTAsIGllbj1zZXR0aW5ncy5hb0RhdGEubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlpZiAoIHNlYXJjaCA9PSAnbm9uZScgKSB7CgkJCQkJYS5wdXNoKCBpICk7CgkJCQl9CgkJCQllbHNlIHsgLy8gYXBwbGllZCB8IHJlbW92ZWQKCQkJCQl0bXAgPSAkLmluQXJyYXkoIGksIGRpc3BsYXlGaWx0ZXJlZCApOwoJCgkJCQkJaWYgKCh0bXAgPT09IC0xICYmIHNlYXJjaCA9PSAncmVtb3ZlZCcpIHx8CgkJCQkJCSh0bXAgPj0gMCAgICYmIHNlYXJjaCA9PSAnYXBwbGllZCcpICkKCQkJCQl7CgkJCQkJCWEucHVzaCggaSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQoJCXJldHVybiBhOwoJfTsKCQoJCgkvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICoKCSAqIFJvd3MKCSAqCgkgKiB7fSAgICAgICAgICAtIG5vIHNlbGVjdG9yIC0gdXNlIGFsbCBhdmFpbGFibGUgcm93cwoJICoge2ludGVnZXJ9ICAgLSByb3cgYW9EYXRhIGluZGV4CgkgKiB7bm9kZX0gICAgICAtIFRSIG5vZGUKCSAqIHtzdHJpbmd9ICAgIC0galF1ZXJ5IHNlbGVjdG9yIHRvIGFwcGx5IHRvIHRoZSBUUiBlbGVtZW50cwoJICoge2FycmF5fSAgICAgLSBqUXVlcnkgYXJyYXkgb2Ygbm9kZXMsIG9yIHNpbXBseSBhbiBhcnJheSBvZiBUUiBub2RlcwoJICoKCSAqLwoJdmFyIF9fcm93X3NlbGVjdG9yID0gZnVuY3Rpb24gKCBzZXR0aW5ncywgc2VsZWN0b3IsIG9wdHMgKQoJewoJCXZhciByb3dzOwoJCXZhciBydW4gPSBmdW5jdGlvbiAoIHNlbCApIHsKCQkJdmFyIHNlbEludCA9IF9pbnRWYWwoIHNlbCApOwoJCQl2YXIgaSwgaWVuOwoJCQl2YXIgYW9EYXRhID0gc2V0dGluZ3MuYW9EYXRhOwoJCgkJCS8vIFNob3J0IGN1dCAtIHNlbGVjdG9yIGlzIGEgbnVtYmVyIGFuZCBubyBvcHRpb25zIHByb3ZpZGVkIChkZWZhdWx0IGlzCgkJCS8vIGFsbCByZWNvcmRzLCBzbyBubyBuZWVkIHRvIGNoZWNrIGlmIHRoZSBpbmRleCBpcyBpbiB0aGVyZSwgc2luY2UgaXQKCQkJLy8gbXVzdCBiZSAtIGRldiBlcnJvciBpZiB0aGUgaW5kZXggZG9lc24ndCBleGlzdCkuCgkJCWlmICggc2VsSW50ICE9PSBudWxsICYmICEgb3B0cyApIHsKCQkJCXJldHVybiBbIHNlbEludCBdOwoJCQl9CgkKCQkJaWYgKCAhIHJvd3MgKSB7CgkJCQlyb3dzID0gX3NlbGVjdG9yX3Jvd19pbmRleGVzKCBzZXR0aW5ncywgb3B0cyApOwoJCQl9CgkKCQkJaWYgKCBzZWxJbnQgIT09IG51bGwgJiYgJC5pbkFycmF5KCBzZWxJbnQsIHJvd3MgKSAhPT0gLTEgKSB7CgkJCQkvLyBTZWxlY3RvciAtIGludGVnZXIKCQkJCXJldHVybiBbIHNlbEludCBdOwoJCQl9CgkJCWVsc2UgaWYgKCBzZWwgPT09IG51bGwgfHwgc2VsID09PSB1bmRlZmluZWQgfHwgc2VsID09PSAnJyApIHsKCQkJCS8vIFNlbGVjdG9yIC0gbm9uZQoJCQkJcmV0dXJuIHJvd3M7CgkJCX0KCQoJCQkvLyBTZWxlY3RvciAtIGZ1bmN0aW9uCgkJCWlmICggdHlwZW9mIHNlbCA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJCXJldHVybiAkLm1hcCggcm93cywgZnVuY3Rpb24gKGlkeCkgewoJCQkJCXZhciByb3cgPSBhb0RhdGFbIGlkeCBdOwoJCQkJCXJldHVybiBzZWwoIGlkeCwgcm93Ll9hRGF0YSwgcm93Lm5UciApID8gaWR4IDogbnVsbDsKCQkJCX0gKTsKCQkJfQoJCgkJCS8vIFNlbGVjdG9yIC0gbm9kZQoJCQlpZiAoIHNlbC5ub2RlTmFtZSApIHsKCQkJCXZhciByb3dJZHggPSBzZWwuX0RUX1Jvd0luZGV4OyAgLy8gUHJvcGVydHkgYWRkZWQgYnkgRFQgZm9yIGZhc3QgbG9va3VwCgkJCQl2YXIgY2VsbElkeCA9IHNlbC5fRFRfQ2VsbEluZGV4OwoJCgkJCQlpZiAoIHJvd0lkeCAhPT0gdW5kZWZpbmVkICkgewoJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByb3cgaXMgYWN0dWFsbHkgc3RpbGwgcHJlc2VudCBpbiB0aGUgdGFibGUKCQkJCQlyZXR1cm4gYW9EYXRhWyByb3dJZHggXSAmJiBhb0RhdGFbIHJvd0lkeCBdLm5UciA9PT0gc2VsID8KCQkJCQkJWyByb3dJZHggXSA6CgkJCQkJCVtdOwoJCQkJfQoJCQkJZWxzZSBpZiAoIGNlbGxJZHggKSB7CgkJCQkJcmV0dXJuIGFvRGF0YVsgY2VsbElkeC5yb3cgXSAmJiBhb0RhdGFbIGNlbGxJZHgucm93IF0ublRyID09PSBzZWwucGFyZW50Tm9kZSA/CgkJCQkJCVsgY2VsbElkeC5yb3cgXSA6CgkJCQkJCVtdOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdmFyIGhvc3QgPSAkKHNlbCkuY2xvc2VzdCgnKltkYXRhLWR0LXJvd10nKTsKCQkJCQlyZXR1cm4gaG9zdC5sZW5ndGggPwoJCQkJCQlbIGhvc3QuZGF0YSgnZHQtcm93JykgXSA6CgkJCQkJCVtdOwoJCQkJfQoJCQl9CgkKCQkJLy8gSUQgc2VsZWN0b3IuIFdhbnQgdG8gYWx3YXlzIGJlIGFibGUgdG8gc2VsZWN0IHJvd3MgYnkgaWQsIHJlZ2FyZGxlc3MKCQkJLy8gb2YgaWYgdGhlIHRyIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZCBvciBub3QsIHNvIGNhbid0IHJlbHkgdXBvbgoJCQkvLyBqUXVlcnkgaGVyZSAtIGhlbmNlIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLiBUaGlzIGRvZXMgbm90IG1hdGNoCgkJCS8vIFNpenpsZSdzIGZhc3Qgc2VsZWN0b3Igb3IgSFRNTDQgLSBpbiBIVE1MNSB0aGUgSUQgY2FuIGJlIGFueXRoaW5nLAoJCQkvLyBidXQgdG8gc2VsZWN0IGl0IHVzaW5nIGEgQ1NTIHNlbGVjdG9yIGVuZ2luZSAobGlrZSBTaXp6bGUgb3IKCQkJLy8gcXVlcnlTZWxlY3QpIGl0IHdvdWxkIG5lZWQgdG8gbmVlZCB0byBiZSBlc2NhcGVkIGZvciBzb21lIGNoYXJhY3RlcnMuCgkJCS8vIERhdGFUYWJsZXMgc2ltcGxpZmllcyB0aGlzIGZvciByb3cgc2VsZWN0b3JzIHNpbmNlIHlvdSBjYW4gc2VsZWN0CgkJCS8vIG9ubHkgYSByb3cuIEEgIyBpbmRpY2F0ZXMgYW4gaWQgYW55IGFueXRoaW5nIHRoYXQgZm9sbG93cyBpcyB0aGUgaWQgLQoJCQkvLyB1bmVzY2FwZWQuCgkJCWlmICggdHlwZW9mIHNlbCA9PT0gJ3N0cmluZycgJiYgc2VsLmNoYXJBdCgwKSA9PT0gJyMnICkgewoJCQkJLy8gZ2V0IHJvdyBpbmRleCBmcm9tIGlkCgkJCQl2YXIgcm93T2JqID0gc2V0dGluZ3MuYUlkc1sgc2VsLnJlcGxhY2UoIC9eIy8sICcnICkgXTsKCQkJCWlmICggcm93T2JqICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIFsgcm93T2JqLmlkeCBdOwoJCQkJfQoJCgkJCQkvLyBuZWVkIHRvIGZhbGwgdGhyb3VnaCB0byBqUXVlcnkgaW4gY2FzZSB0aGVyZSBpcyBET00gaWQgdGhhdAoJCQkJLy8gbWF0Y2hlcwoJCQl9CgkJCQoJCQkvLyBHZXQgbm9kZXMgaW4gdGhlIG9yZGVyIGZyb20gdGhlIGByb3dzYCBhcnJheSB3aXRoIG51bGwgdmFsdWVzIHJlbW92ZWQKCQkJdmFyIG5vZGVzID0gX3JlbW92ZUVtcHR5KAoJCQkJX3BsdWNrX29yZGVyKCBzZXR0aW5ncy5hb0RhdGEsIHJvd3MsICduVHInICkKCQkJKTsKCQoJCQkvLyBTZWxlY3RvciAtIGpRdWVyeSBzZWxlY3RvciBzdHJpbmcsIGFycmF5IG9mIG5vZGVzIG9yIGpRdWVyeSBvYmplY3QvCgkJCS8vIEFzIGpRdWVyeSdzIC5maWx0ZXIoKSBhbGxvd3MgalF1ZXJ5IG9iamVjdHMgdG8gYmUgcGFzc2VkIGluIGZpbHRlciwKCQkJLy8gaXQgYWxzbyBhbGxvd3MgYXJyYXlzLCBzbyB0aGlzIHdpbGwgY29wZSB3aXRoIGFsbCB0aHJlZSBvcHRpb25zCgkJCXJldHVybiAkKG5vZGVzKQoJCQkJLmZpbHRlciggc2VsICkKCQkJCS5tYXAoIGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gdGhpcy5fRFRfUm93SW5kZXg7CgkJCQl9ICkKCQkJCS50b0FycmF5KCk7CgkJfTsKCQoJCXJldHVybiBfc2VsZWN0b3JfcnVuKCAncm93Jywgc2VsZWN0b3IsIHJ1biwgc2V0dGluZ3MsIG9wdHMgKTsKCX07CgkKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MoKScsIGZ1bmN0aW9uICggc2VsZWN0b3IsIG9wdHMgKSB7CgkJLy8gYXJndW1lbnQgc2hpZnRpbmcKCQlpZiAoIHNlbGVjdG9yID09PSB1bmRlZmluZWQgKSB7CgkJCXNlbGVjdG9yID0gJyc7CgkJfQoJCWVsc2UgaWYgKCAkLmlzUGxhaW5PYmplY3QoIHNlbGVjdG9yICkgKSB7CgkJCW9wdHMgPSBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSAnJzsKCQl9CgkKCQlvcHRzID0gX3NlbGVjdG9yX29wdHMoIG9wdHMgKTsKCQoJCXZhciBpbnN0ID0gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJcmV0dXJuIF9fcm93X3NlbGVjdG9yKCBzZXR0aW5ncywgc2VsZWN0b3IsIG9wdHMgKTsKCQl9LCAxICk7CgkKCQkvLyBXYW50IGFyZ3VtZW50IHNoaWZ0aW5nIGhlcmUgYW5kIGluIF9fcm93X3NlbGVjdG9yPwoJCWluc3Quc2VsZWN0b3Iucm93cyA9IHNlbGVjdG9yOwoJCWluc3Quc2VsZWN0b3Iub3B0cyA9IG9wdHM7CgkKCQlyZXR1cm4gaW5zdDsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MoKS5ub2RlcygpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAncm93JywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93ICkgewoJCQlyZXR1cm4gc2V0dGluZ3MuYW9EYXRhWyByb3cgXS5uVHIgfHwgdW5kZWZpbmVkOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MoKS5kYXRhKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoIHRydWUsICdyb3dzJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93cyApIHsKCQkJcmV0dXJuIF9wbHVja19vcmRlciggc2V0dGluZ3MuYW9EYXRhLCByb3dzLCAnX2FEYXRhJyApOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3Jvd3MoKS5jYWNoZSgpJywgJ3JvdygpLmNhY2hlKCknLCBmdW5jdGlvbiAoIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdyb3cnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCByb3cgKSB7CgkJCXZhciByID0gc2V0dGluZ3MuYW9EYXRhWyByb3cgXTsKCQkJcmV0dXJuIHR5cGUgPT09ICdzZWFyY2gnID8gci5fYUZpbHRlckRhdGEgOiByLl9hU29ydERhdGE7CgkJfSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAncm93cygpLmludmFsaWRhdGUoKScsICdyb3coKS5pbnZhbGlkYXRlKCknLCBmdW5jdGlvbiAoIHNyYyApIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3JvdycsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdyApIHsKCQkJX2ZuSW52YWxpZGF0ZSggc2V0dGluZ3MsIHJvdywgc3JjICk7CgkJfSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAncm93cygpLmluZGV4ZXMoKScsICdyb3coKS5pbmRleCgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAncm93JywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93ICkgewoJCQlyZXR1cm4gcm93OwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ3Jvd3MoKS5pZHMoKScsICdyb3coKS5pZCgpJywgZnVuY3Rpb24gKCBoYXNoICkgewoJCXZhciBhID0gW107CgkJdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CgkKCQkvLyBgaXRlcmF0b3JgIHdpbGwgZHJvcCB1bmRlZmluZWQgdmFsdWVzLCBidXQgaW4gdGhpcyBjYXNlIHdlIHdhbnQgdGhlbQoJCWZvciAoIHZhciBpPTAsIGllbj1jb250ZXh0Lmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQlmb3IgKCB2YXIgaj0wLCBqZW49dGhpc1tpXS5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCXZhciBpZCA9IGNvbnRleHRbaV0ucm93SWRGbiggY29udGV4dFtpXS5hb0RhdGFbIHRoaXNbaV1bal0gXS5fYURhdGEgKTsKCQkJCWEucHVzaCggKGhhc2ggPT09IHRydWUgPyAnIycgOiAnJyApKyBpZCApOwoJCQl9CgkJfQoJCgkJcmV0dXJuIG5ldyBfQXBpKCBjb250ZXh0LCBhICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdyb3dzKCkucmVtb3ZlKCknLCAncm93KCkucmVtb3ZlKCknLCBmdW5jdGlvbiAoKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoJCgkJdGhpcy5pdGVyYXRvciggJ3JvdycsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgdGhhdElkeCApIHsKCQkJdmFyIGRhdGEgPSBzZXR0aW5ncy5hb0RhdGE7CgkJCXZhciByb3dEYXRhID0gZGF0YVsgcm93IF07CgkJCXZhciBpLCBpZW4sIGosIGplbjsKCQkJdmFyIGxvb3BSb3csIGxvb3BDZWxsczsKCQoJCQlkYXRhLnNwbGljZSggcm93LCAxICk7CgkKCQkJLy8gVXBkYXRlIHRoZSBjYWNoZWQgaW5kZXhlcwoJCQlmb3IgKCBpPTAsIGllbj1kYXRhLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJbG9vcFJvdyA9IGRhdGFbaV07CgkJCQlsb29wQ2VsbHMgPSBsb29wUm93LmFuQ2VsbHM7CgkKCQkJCS8vIFJvd3MKCQkJCWlmICggbG9vcFJvdy5uVHIgIT09IG51bGwgKSB7CgkJCQkJbG9vcFJvdy5uVHIuX0RUX1Jvd0luZGV4ID0gaTsKCQkJCX0KCQoJCQkJLy8gQ2VsbHMKCQkJCWlmICggbG9vcENlbGxzICE9PSBudWxsICkgewoJCQkJCWZvciAoIGo9MCwgamVuPWxvb3BDZWxscy5sZW5ndGggOyBqPGplbiA7IGorKyApIHsKCQkJCQkJbG9vcENlbGxzW2pdLl9EVF9DZWxsSW5kZXgucm93ID0gaTsKCQkJCQl9CgkJCQl9CgkJCX0KCQoJCQkvLyBEZWxldGUgZnJvbSB0aGUgZGlzcGxheSBhcnJheXMKCQkJX2ZuRGVsZXRlSW5kZXgoIHNldHRpbmdzLmFpRGlzcGxheU1hc3Rlciwgcm93ICk7CgkJCV9mbkRlbGV0ZUluZGV4KCBzZXR0aW5ncy5haURpc3BsYXksIHJvdyApOwoJCQlfZm5EZWxldGVJbmRleCggdGhhdFsgdGhhdElkeCBdLCByb3csIGZhbHNlICk7IC8vIG1haW50YWluIGxvY2FsIGluZGV4ZXMKCQoJCQkvLyBGb3Igc2VydmVyLXNpZGUgcHJvY2Vzc2luZyB0YWJsZXMgLSBzdWJ0cmFjdCB0aGUgZGVsZXRlZCByb3cgZnJvbSB0aGUgY291bnQKCQkJaWYgKCBzZXR0aW5ncy5faVJlY29yZHNEaXNwbGF5ID4gMCApIHsKCQkJCXNldHRpbmdzLl9pUmVjb3Jkc0Rpc3BsYXktLTsKCQkJfQoJCgkJCS8vIENoZWNrIGZvciBhbiAnb3ZlcmZsb3cnIHRoZXkgY2FzZSBmb3IgZGlzcGxheWluZyB0aGUgdGFibGUKCQkJX2ZuTGVuZ3RoT3ZlcmZsb3coIHNldHRpbmdzICk7CgkKCQkJLy8gUmVtb3ZlIHRoZSByb3cncyBJRCByZWZlcmVuY2UgaWYgdGhlcmUgaXMgb25lCgkJCXZhciBpZCA9IHNldHRpbmdzLnJvd0lkRm4oIHJvd0RhdGEuX2FEYXRhICk7CgkJCWlmICggaWQgIT09IHVuZGVmaW5lZCApIHsKCQkJCWRlbGV0ZSBzZXR0aW5ncy5hSWRzWyBpZCBdOwoJCQl9CgkJfSApOwoJCgkJdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJZm9yICggdmFyIGk9MCwgaWVuPXNldHRpbmdzLmFvRGF0YS5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCXNldHRpbmdzLmFvRGF0YVtpXS5pZHggPSBpOwoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3Jvd3MuYWRkKCknLCBmdW5jdGlvbiAoIHJvd3MgKSB7CgkJdmFyIG5ld1Jvd3MgPSB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQkJdmFyIHJvdywgaSwgaWVuOwoJCQkJdmFyIG91dCA9IFtdOwoJCgkJCQlmb3IgKCBpPTAsIGllbj1yb3dzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCXJvdyA9IHJvd3NbaV07CgkKCQkJCQlpZiAoIHJvdy5ub2RlTmFtZSAmJiByb3cubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1RSJyApIHsKCQkJCQkJb3V0LnB1c2goIF9mbkFkZFRyKCBzZXR0aW5ncywgcm93IClbMF0gKTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCW91dC5wdXNoKCBfZm5BZGREYXRhKCBzZXR0aW5ncywgcm93ICkgKTsKCQkJCQl9CgkJCQl9CgkKCQkJCXJldHVybiBvdXQ7CgkJCX0sIDEgKTsKCQoJCS8vIFJldHVybiBhbiBBcGkucm93cygpIGV4dGVuZGVkIGluc3RhbmNlLCBzbyByb3dzKCkubm9kZXMoKSBldGMgY2FuIGJlIHVzZWQKCQl2YXIgbW9kUm93cyA9IHRoaXMucm93cyggLTEgKTsKCQltb2RSb3dzLnBvcCgpOwoJCSQubWVyZ2UoIG1vZFJvd3MsIG5ld1Jvd3MgKTsKCQoJCXJldHVybiBtb2RSb3dzOwoJfSApOwoJCgkKCQoJCgkKCS8qKgoJICoKCSAqLwoJX2FwaV9yZWdpc3RlciggJ3JvdygpJywgZnVuY3Rpb24gKCBzZWxlY3Rvciwgb3B0cyApIHsKCQlyZXR1cm4gX3NlbGVjdG9yX2ZpcnN0KCB0aGlzLnJvd3MoIHNlbGVjdG9yLCBvcHRzICkgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAncm93KCkuZGF0YSgpJywgZnVuY3Rpb24gKCBkYXRhICkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJLy8gR2V0CgkJCXJldHVybiBjdHgubGVuZ3RoICYmIHRoaXMubGVuZ3RoID8KCQkJCWN0eFswXS5hb0RhdGFbIHRoaXNbMF0gXS5fYURhdGEgOgoJCQkJdW5kZWZpbmVkOwoJCX0KCQoJCS8vIFNldAoJCXZhciByb3cgPSBjdHhbMF0uYW9EYXRhWyB0aGlzWzBdIF07CgkJcm93Ll9hRGF0YSA9IGRhdGE7CgkKCQkvLyBJZiB0aGUgRE9NIGhhcyBhbiBpZCwgYW5kIHRoZSBkYXRhIHNvdXJjZSBpcyBhbiBhcnJheQoJCWlmICggQXJyYXkuaXNBcnJheSggZGF0YSApICYmIHJvdy5uVHIgJiYgcm93Lm5Uci5pZCApIHsKCQkJX2ZuU2V0T2JqZWN0RGF0YUZuKCBjdHhbMF0ucm93SWQgKSggZGF0YSwgcm93Lm5Uci5pZCApOwoJCX0KCQoJCS8vIEF1dG9tYXRpY2FsbHkgaW52YWxpZGF0ZQoJCV9mbkludmFsaWRhdGUoIGN0eFswXSwgdGhpc1swXSwgJ2RhdGEnICk7CgkKCQlyZXR1cm4gdGhpczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAncm93KCkubm9kZSgpJywgZnVuY3Rpb24gKCkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlyZXR1cm4gY3R4Lmxlbmd0aCAmJiB0aGlzLmxlbmd0aCA/CgkJCWN0eFswXS5hb0RhdGFbIHRoaXNbMF0gXS5uVHIgfHwgbnVsbCA6CgkJCW51bGw7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3Jvdy5hZGQoKScsIGZ1bmN0aW9uICggcm93ICkgewoJCS8vIEFsbG93IGEgalF1ZXJ5IG9iamVjdCB0byBiZSBwYXNzZWQgaW4gLSBvbmx5IGEgc2luZ2xlIHJvdyBpcyBhZGRlZCBmcm9tCgkJLy8gaXQgdGhvdWdoIC0gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNldAoJCWlmICggcm93IGluc3RhbmNlb2YgJCAmJiByb3cubGVuZ3RoICkgewoJCQlyb3cgPSByb3dbMF07CgkJfQoJCgkJdmFyIHJvd3MgPSB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlpZiAoIHJvdy5ub2RlTmFtZSAmJiByb3cubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1RSJyApIHsKCQkJCXJldHVybiBfZm5BZGRUciggc2V0dGluZ3MsIHJvdyApWzBdOwoJCQl9CgkJCXJldHVybiBfZm5BZGREYXRhKCBzZXR0aW5ncywgcm93ICk7CgkJfSApOwoJCgkJLy8gUmV0dXJuIGFuIEFwaS5yb3dzKCkgZXh0ZW5kZWQgaW5zdGFuY2UsIHdpdGggdGhlIG5ld2x5IGFkZGVkIHJvdyBzZWxlY3RlZAoJCXJldHVybiB0aGlzLnJvdyggcm93c1swXSApOwoJfSApOwoJCgkKCSQoZG9jdW1lbnQpLm9uKCdwbHVnaW4taW5pdC5kdCcsIGZ1bmN0aW9uIChlLCBjb250ZXh0KSB7CgkJdmFyIGFwaSA9IG5ldyBfQXBpKCBjb250ZXh0ICk7CgkKCQlhcGkub24oICdzdGF0ZVNhdmVQYXJhbXMnLCBmdW5jdGlvbiAoIGUsIHNldHRpbmdzLCBkICkgewoJCQkvLyBUaGlzIGNvdWxkIGJlIG1vcmUgY29tcGFjdCB3aXRoIHRoZSBBUEksIGJ1dCBpdCBpcyBhIGxvdCBmYXN0ZXIgYXMgYSBzaW1wbGUKCQkJLy8gaW50ZXJuYWwgbG9vcAoJCQl2YXIgaWRGbiA9IHNldHRpbmdzLnJvd0lkRm47CgkJCXZhciBkYXRhID0gc2V0dGluZ3MuYW9EYXRhOwoJCQl2YXIgaWRzID0gW107CgkKCQkJZm9yICh2YXIgaT0wIDsgaTxkYXRhLmxlbmd0aCA7IGkrKykgewoJCQkJaWYgKGRhdGFbaV0uX2RldGFpbHNTaG93KSB7CgkJCQkJaWRzLnB1c2goICcjJyArIGlkRm4oZGF0YVtpXS5fYURhdGEpICk7CgkJCQl9CgkJCX0KCQoJCQlkLmNoaWxkUm93cyA9IGlkczsKCQl9KQoJCgkJdmFyIGxvYWRlZCA9IGFwaS5zdGF0ZS5sb2FkZWQoKTsKCQoJCWlmICggbG9hZGVkICYmIGxvYWRlZC5jaGlsZFJvd3MgKSB7CgkJCWFwaQoJCQkJLnJvd3MoICQubWFwKGxvYWRlZC5jaGlsZFJvd3MsIGZ1bmN0aW9uIChpZCl7CgkJCQkJcmV0dXJuIGlkLnJlcGxhY2UoLzovZywgJ1xcOicpCgkJCQl9KSApCgkJCQkuZXZlcnkoIGZ1bmN0aW9uICgpIHsKCQkJCQlfZm5DYWxsYmFja0ZpcmUoIGNvbnRleHQsIG51bGwsICdyZXF1ZXN0Q2hpbGQnLCBbIHRoaXMgXSApCgkJCQl9KTsKCQl9Cgl9KTsKCQoJdmFyIF9fZGV0YWlsc19hZGQgPSBmdW5jdGlvbiAoIGN0eCwgcm93LCBkYXRhLCBrbGFzcyApCgl7CgkJLy8gQ29udmVydCB0byBhcnJheSBvZiBUUiBlbGVtZW50cwoJCXZhciByb3dzID0gW107CgkJdmFyIGFkZFJvdyA9IGZ1bmN0aW9uICggciwgayApIHsKCQkJLy8gUmVjdXJzaW9uIHRvIGFsbG93IGZvciBhcnJheXMgb2YgalF1ZXJ5IG9iamVjdHMKCQkJaWYgKCBBcnJheS5pc0FycmF5KCByICkgfHwgciBpbnN0YW5jZW9mICQgKSB7CgkJCQlmb3IgKCB2YXIgaT0wLCBpZW49ci5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCQlhZGRSb3coIHJbaV0sIGsgKTsKCQkJCX0KCQkJCXJldHVybjsKCQkJfQoJCgkJCS8vIElmIHdlIGdldCBhIFRSIGVsZW1lbnQsIHRoZW4ganVzdCBhZGQgaXQgZGlyZWN0bHkgLSB1cCB0byB0aGUgZGV2CgkJCS8vIHRvIGFkZCB0aGUgY29ycmVjdCBudW1iZXIgb2YgY29sdW1ucyBldGMKCQkJaWYgKCByLm5vZGVOYW1lICYmIHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RyJyApIHsKCQkJCXJvd3MucHVzaCggciApOwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIHJvdyB3aXRoIGEgd3JhcHBlcgoJCQkJdmFyIGNyZWF0ZWQgPSAkKCc8dHI+PHRkPjwvdGQ+PC90cj4nKS5hZGRDbGFzcyggayApOwoJCQkJJCgndGQnLCBjcmVhdGVkKQoJCQkJCS5hZGRDbGFzcyggayApCgkJCQkJLmh0bWwoIHIgKQoJCQkJCVswXS5jb2xTcGFuID0gX2ZuVmlzYmxlQ29sdW1ucyggY3R4ICk7CgkKCQkJCXJvd3MucHVzaCggY3JlYXRlZFswXSApOwoJCQl9CgkJfTsKCQoJCWFkZFJvdyggZGF0YSwga2xhc3MgKTsKCQoJCWlmICggcm93Ll9kZXRhaWxzICkgewoJCQlyb3cuX2RldGFpbHMuZGV0YWNoKCk7CgkJfQoJCgkJcm93Ll9kZXRhaWxzID0gJChyb3dzKTsKCQoJCS8vIElmIHRoZSBjaGlsZHJlbiB3ZXJlIGFscmVhZHkgc2hvd24sIHRoYXQgc3RhdGUgc2hvdWxkIGJlIHJldGFpbmVkCgkJaWYgKCByb3cuX2RldGFpbHNTaG93ICkgewoJCQlyb3cuX2RldGFpbHMuaW5zZXJ0QWZ0ZXIoIHJvdy5uVHIgKTsKCQl9Cgl9OwoJCgkKCS8vIE1ha2Ugc3RhdGUgc2F2aW5nIG9mIGNoaWxkIHJvdyBkZXRhaWxzIGFzeW5jIHRvIGFsbG93IHRoZW0gdG8gYmUgYmF0Y2ggcHJvY2Vzc2VkCgl2YXIgX19kZXRhaWxzX3N0YXRlID0gRGF0YVRhYmxlLnV0aWwudGhyb3R0bGUoCgkJZnVuY3Rpb24gKGN0eCkgewoJCQlfZm5TYXZlU3RhdGUoIGN0eFswXSApCgkJfSwKCQk1MDAKCSk7CgkKCQoJdmFyIF9fZGV0YWlsc19yZW1vdmUgPSBmdW5jdGlvbiAoIGFwaSwgaWR4ICkKCXsKCQl2YXIgY3R4ID0gYXBpLmNvbnRleHQ7CgkKCQlpZiAoIGN0eC5sZW5ndGggKSB7CgkJCXZhciByb3cgPSBjdHhbMF0uYW9EYXRhWyBpZHggIT09IHVuZGVmaW5lZCA/IGlkeCA6IGFwaVswXSBdOwoJCgkJCWlmICggcm93ICYmIHJvdy5fZGV0YWlscyApIHsKCQkJCXJvdy5fZGV0YWlscy5yZW1vdmUoKTsKCQoJCQkJcm93Ll9kZXRhaWxzU2hvdyA9IHVuZGVmaW5lZDsKCQkJCXJvdy5fZGV0YWlscyA9IHVuZGVmaW5lZDsKCQkJCSQoIHJvdy5uVHIgKS5yZW1vdmVDbGFzcyggJ2R0LWhhc0NoaWxkJyApOwoJCQkJX19kZXRhaWxzX3N0YXRlKCBjdHggKTsKCQkJfQoJCX0KCX07CgkKCQoJdmFyIF9fZGV0YWlsc19kaXNwbGF5ID0gZnVuY3Rpb24gKCBhcGksIHNob3cgKSB7CgkJdmFyIGN0eCA9IGFwaS5jb250ZXh0OwoJCgkJaWYgKCBjdHgubGVuZ3RoICYmIGFwaS5sZW5ndGggKSB7CgkJCXZhciByb3cgPSBjdHhbMF0uYW9EYXRhWyBhcGlbMF0gXTsKCQoJCQlpZiAoIHJvdy5fZGV0YWlscyApIHsKCQkJCXJvdy5fZGV0YWlsc1Nob3cgPSBzaG93OwoJCgkJCQlpZiAoIHNob3cgKSB7CgkJCQkJcm93Ll9kZXRhaWxzLmluc2VydEFmdGVyKCByb3cublRyICk7CgkJCQkJJCggcm93Lm5UciApLmFkZENsYXNzKCAnZHQtaGFzQ2hpbGQnICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyb3cuX2RldGFpbHMuZGV0YWNoKCk7CgkJCQkJJCggcm93Lm5UciApLnJlbW92ZUNsYXNzKCAnZHQtaGFzQ2hpbGQnICk7CgkJCQl9CgkKCQkJCV9mbkNhbGxiYWNrRmlyZSggY3R4WzBdLCBudWxsLCAnY2hpbGRSb3cnLCBbIHNob3csIGFwaS5yb3coIGFwaVswXSApIF0gKQoJCgkJCQlfX2RldGFpbHNfZXZlbnRzKCBjdHhbMF0gKTsKCQkJCV9fZGV0YWlsc19zdGF0ZSggY3R4ICk7CgkJCX0KCQl9Cgl9OwoJCgkKCXZhciBfX2RldGFpbHNfZXZlbnRzID0gZnVuY3Rpb24gKCBzZXR0aW5ncyApCgl7CgkJdmFyIGFwaSA9IG5ldyBfQXBpKCBzZXR0aW5ncyApOwoJCXZhciBuYW1lc3BhY2UgPSAnLmR0LkRUX2RldGFpbHMnOwoJCXZhciBkcmF3RXZlbnQgPSAnZHJhdycrbmFtZXNwYWNlOwoJCXZhciBjb2x2aXNFdmVudCA9ICdjb2x1bW4tc2l6aW5nJytuYW1lc3BhY2U7CgkJdmFyIGRlc3Ryb3lFdmVudCA9ICdkZXN0cm95JytuYW1lc3BhY2U7CgkJdmFyIGRhdGEgPSBzZXR0aW5ncy5hb0RhdGE7CgkKCQlhcGkub2ZmKCBkcmF3RXZlbnQgKycgJysgY29sdmlzRXZlbnQgKycgJysgZGVzdHJveUV2ZW50ICk7CgkKCQlpZiAoIF9wbHVjayggZGF0YSwgJ19kZXRhaWxzJyApLmxlbmd0aCA+IDAgKSB7CgkJCS8vIE9uIGVhY2ggZHJhdywgaW5zZXJ0IHRoZSByZXF1aXJlZCBlbGVtZW50cyBpbnRvIHRoZSBkb2N1bWVudAoJCQlhcGkub24oIGRyYXdFdmVudCwgZnVuY3Rpb24gKCBlLCBjdHggKSB7CgkJCQlpZiAoIHNldHRpbmdzICE9PSBjdHggKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCgkJCQlhcGkucm93cygge3BhZ2U6J2N1cnJlbnQnfSApLmVxKDApLmVhY2goIGZ1bmN0aW9uIChpZHgpIHsKCQkJCQkvLyBJbnRlcm5hbCBkYXRhIGdyYWIKCQkJCQl2YXIgcm93ID0gZGF0YVsgaWR4IF07CgkKCQkJCQlpZiAoIHJvdy5fZGV0YWlsc1Nob3cgKSB7CgkJCQkJCXJvdy5fZGV0YWlscy5pbnNlcnRBZnRlciggcm93Lm5UciApOwoJCQkJCX0KCQkJCX0gKTsKCQkJfSApOwoJCgkJCS8vIENvbHVtbiB2aXNpYmlsaXR5IGNoYW5nZSAtIHVwZGF0ZSB0aGUgY29sc3BhbgoJCQlhcGkub24oIGNvbHZpc0V2ZW50LCBmdW5jdGlvbiAoIGUsIGN0eCwgaWR4LCB2aXMgKSB7CgkJCQlpZiAoIHNldHRpbmdzICE9PSBjdHggKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCgkJCQkvLyBVcGRhdGUgdGhlIGNvbHNwYW4gZm9yIHRoZSBkZXRhaWxzIHJvd3MgKG5vdGUsIG9ubHkgaWYgaXQgYWxyZWFkeSBoYXMKCQkJCS8vIGEgY29sc3BhbikKCQkJCXZhciByb3csIHZpc2libGUgPSBfZm5WaXNibGVDb2x1bW5zKCBjdHggKTsKCQoJCQkJZm9yICggdmFyIGk9MCwgaWVuPWRhdGEubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQkJcm93ID0gZGF0YVtpXTsKCQoJCQkJCWlmICggcm93Ll9kZXRhaWxzICkgewoJCQkJCQlyb3cuX2RldGFpbHMuY2hpbGRyZW4oJ3RkW2NvbHNwYW5dJykuYXR0cignY29sc3BhbicsIHZpc2libGUgKTsKCQkJCQl9CgkJCQl9CgkJCX0gKTsKCQoJCQkvLyBUYWJsZSBkZXN0cm95ZWQgLSBudWtlIGFueSBjaGlsZCByb3dzCgkJCWFwaS5vbiggZGVzdHJveUV2ZW50LCBmdW5jdGlvbiAoIGUsIGN0eCApIHsKCQkJCWlmICggc2V0dGluZ3MgIT09IGN0eCApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkKCQkJCWZvciAoIHZhciBpPTAsIGllbj1kYXRhLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJCWlmICggZGF0YVtpXS5fZGV0YWlscyApIHsKCQkJCQkJX19kZXRhaWxzX3JlbW92ZSggYXBpLCBpICk7CgkJCQkJfQoJCQkJfQoJCQl9ICk7CgkJfQoJfTsKCQoJLy8gU3RyaW5ncyBmb3IgdGhlIG1ldGhvZCBuYW1lcyB0byBoZWxwIG1pbmlmaWNhdGlvbgoJdmFyIF9lbXAgPSAnJzsKCXZhciBfY2hpbGRfb2JqID0gX2VtcCsncm93KCkuY2hpbGQnOwoJdmFyIF9jaGlsZF9tdGggPSBfY2hpbGRfb2JqKycoKSc7CgkKCS8vIGRhdGEgY2FuIGJlOgoJLy8gIHRyCgkvLyAgc3RyaW5nCgkvLyAgalF1ZXJ5IG9yIGFycmF5IG9mIGFueSBvZiB0aGUgYWJvdmUKCV9hcGlfcmVnaXN0ZXIoIF9jaGlsZF9tdGgsIGZ1bmN0aW9uICggZGF0YSwga2xhc3MgKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQoJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkgewoJCQkvLyBnZXQKCQkJcmV0dXJuIGN0eC5sZW5ndGggJiYgdGhpcy5sZW5ndGggPwoJCQkJY3R4WzBdLmFvRGF0YVsgdGhpc1swXSBdLl9kZXRhaWxzIDoKCQkJCXVuZGVmaW5lZDsKCQl9CgkJZWxzZSBpZiAoIGRhdGEgPT09IHRydWUgKSB7CgkJCS8vIHNob3cKCQkJdGhpcy5jaGlsZC5zaG93KCk7CgkJfQoJCWVsc2UgaWYgKCBkYXRhID09PSBmYWxzZSApIHsKCQkJLy8gcmVtb3ZlCgkJCV9fZGV0YWlsc19yZW1vdmUoIHRoaXMgKTsKCQl9CgkJZWxzZSBpZiAoIGN0eC5sZW5ndGggJiYgdGhpcy5sZW5ndGggKSB7CgkJCS8vIHNldAoJCQlfX2RldGFpbHNfYWRkKCBjdHhbMF0sIGN0eFswXS5hb0RhdGFbIHRoaXNbMF0gXSwgZGF0YSwga2xhc3MgKTsKCQl9CgkKCQlyZXR1cm4gdGhpczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCBbCgkJX2NoaWxkX29iaisnLnNob3coKScsCgkJX2NoaWxkX210aCsnLnNob3coKScgLy8gb25seSB3aGVuIGBjaGlsZCgpYCB3YXMgY2FsbGVkIHdpdGggcGFyYW1ldGVycyAod2l0aG91dAoJXSwgZnVuY3Rpb24gKCBzaG93ICkgeyAgIC8vIGl0IHJldHVybnMgYW4gb2JqZWN0IGFuZCB0aGlzIG1ldGhvZCBpcyBub3QgZXhlY3V0ZWQpCgkJX19kZXRhaWxzX2Rpc3BsYXkoIHRoaXMsIHRydWUgKTsKCQlyZXR1cm4gdGhpczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCBbCgkJX2NoaWxkX29iaisnLmhpZGUoKScsCgkJX2NoaWxkX210aCsnLmhpZGUoKScgLy8gb25seSB3aGVuIGBjaGlsZCgpYCB3YXMgY2FsbGVkIHdpdGggcGFyYW1ldGVycyAod2l0aG91dAoJXSwgZnVuY3Rpb24gKCkgeyAgICAgICAgIC8vIGl0IHJldHVybnMgYW4gb2JqZWN0IGFuZCB0aGlzIG1ldGhvZCBpcyBub3QgZXhlY3V0ZWQpCgkJX19kZXRhaWxzX2Rpc3BsYXkoIHRoaXMsIGZhbHNlICk7CgkJcmV0dXJuIHRoaXM7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggWwoJCV9jaGlsZF9vYmorJy5yZW1vdmUoKScsCgkJX2NoaWxkX210aCsnLnJlbW92ZSgpJyAvLyBvbmx5IHdoZW4gYGNoaWxkKClgIHdhcyBjYWxsZWQgd2l0aCBwYXJhbWV0ZXJzICh3aXRob3V0CgldLCBmdW5jdGlvbiAoKSB7ICAgICAgICAgICAvLyBpdCByZXR1cm5zIGFuIG9iamVjdCBhbmQgdGhpcyBtZXRob2QgaXMgbm90IGV4ZWN1dGVkKQoJCV9fZGV0YWlsc19yZW1vdmUoIHRoaXMgKTsKCQlyZXR1cm4gdGhpczsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCBfY2hpbGRfb2JqKycuaXNTaG93bigpJywgZnVuY3Rpb24gKCkgewoJCXZhciBjdHggPSB0aGlzLmNvbnRleHQ7CgkKCQlpZiAoIGN0eC5sZW5ndGggJiYgdGhpcy5sZW5ndGggKSB7CgkJCS8vIF9kZXRhaWxzU2hvd24gYXMgZmFsc2Ugb3IgdW5kZWZpbmVkIHdpbGwgZmFsbCB0aHJvdWdoIHRvIHJldHVybiBmYWxzZQoJCQlyZXR1cm4gY3R4WzBdLmFvRGF0YVsgdGhpc1swXSBdLl9kZXRhaWxzU2hvdyB8fCBmYWxzZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfSApOwoJCgkKCQoJLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqCgkgKiBDb2x1bW5zCgkgKgoJICoge2ludGVnZXJ9ICAgICAgICAgICAtIGNvbHVtbiBpbmRleCAoPj0wIGNvdW50IGZyb20gbGVmdCwgPDAgY291bnQgZnJvbSByaWdodCkKCSAqICJ7aW50ZWdlcn06dmlzSWR4IiAgLSB2aXNpYmxlIGNvbHVtbiBpbmRleCAoaS5lLiB0cmFuc2xhdGUgdG8gY29sdW1uIGluZGV4KSAgKD49MCBjb3VudCBmcm9tIGxlZnQsIDwwIGNvdW50IGZyb20gcmlnaHQpCgkgKiAie2ludGVnZXJ9OnZpc2libGUiIC0gYWxpYXMgZm9yIHtpbnRlZ2VyfTp2aXNJZHggICg+PTAgY291bnQgZnJvbSBsZWZ0LCA8MCBjb3VudCBmcm9tIHJpZ2h0KQoJICogIntzdHJpbmd9Om5hbWUiICAgICAtIGNvbHVtbiBuYW1lCgkgKiAie3N0cmluZ30iICAgICAgICAgIC0galF1ZXJ5IHNlbGVjdG9yIG9uIGNvbHVtbiBoZWFkZXIgbm9kZXMKCSAqCgkgKi8KCQoJLy8gY2FuIGJlIGFuIGFycmF5IG9mIHRoZXNlIGl0ZW1zLCBjb21tYSBzZXBhcmF0ZWQgbGlzdCwgb3IgYW4gYXJyYXkgb2YgY29tbWEKCS8vIHNlcGFyYXRlZCBsaXN0cwoJCgl2YXIgX19yZV9jb2x1bW5fc2VsZWN0b3IgPSAvXihbXjpdKyk6KG5hbWV8dmlzSWR4fHZpc2libGUpJC87CgkKCQoJLy8gcjEgYW5kIHIyIGFyZSByZWR1bmRhbnQgLSBidXQgaXQgbWVhbnMgdGhhdCB0aGUgcGFyYW1ldGVycyBtYXRjaCBmb3IgdGhlCgkvLyBpdGVyYXRvciBjYWxsYmFjayBpbiBjb2x1bW5zKCkuZGF0YSgpCgl2YXIgX19jb2x1bW5EYXRhID0gZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uLCByMSwgcjIsIHJvd3MgKSB7CgkJdmFyIGEgPSBbXTsKCQlmb3IgKCB2YXIgcm93PTAsIGllbj1yb3dzLmxlbmd0aCA7IHJvdzxpZW4gOyByb3crKyApIHsKCQkJYS5wdXNoKCBfZm5HZXRDZWxsRGF0YSggc2V0dGluZ3MsIHJvd3Nbcm93XSwgY29sdW1uICkgKTsKCQl9CgkJcmV0dXJuIGE7Cgl9OwoJCgkKCXZhciBfX2NvbHVtbl9zZWxlY3RvciA9IGZ1bmN0aW9uICggc2V0dGluZ3MsIHNlbGVjdG9yLCBvcHRzICkKCXsKCQl2YXIKCQkJY29sdW1ucyA9IHNldHRpbmdzLmFvQ29sdW1ucywKCQkJbmFtZXMgPSBfcGx1Y2soIGNvbHVtbnMsICdzTmFtZScgKSwKCQkJbm9kZXMgPSBfcGx1Y2soIGNvbHVtbnMsICduVGgnICk7CgkKCQl2YXIgcnVuID0gZnVuY3Rpb24gKCBzICkgewoJCQl2YXIgc2VsSW50ID0gX2ludFZhbCggcyApOwoJCgkJCS8vIFNlbGVjdG9yIC0gYWxsCgkJCWlmICggcyA9PT0gJycgKSB7CgkJCQlyZXR1cm4gX3JhbmdlKCBjb2x1bW5zLmxlbmd0aCApOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgLSBpbmRleAoJCQlpZiAoIHNlbEludCAhPT0gbnVsbCApIHsKCQkJCXJldHVybiBbIHNlbEludCA+PSAwID8KCQkJCQlzZWxJbnQgOiAvLyBDb3VudCBmcm9tIGxlZnQKCQkJCQljb2x1bW5zLmxlbmd0aCArIHNlbEludCAvLyBDb3VudCBmcm9tIHJpZ2h0ICgrIGJlY2F1c2UgaXRzIGEgbmVnYXRpdmUgdmFsdWUpCgkJCQldOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgPSBmdW5jdGlvbgoJCQlpZiAoIHR5cGVvZiBzID09PSAnZnVuY3Rpb24nICkgewoJCQkJdmFyIHJvd3MgPSBfc2VsZWN0b3Jfcm93X2luZGV4ZXMoIHNldHRpbmdzLCBvcHRzICk7CgkKCQkJCXJldHVybiAkLm1hcCggY29sdW1ucywgZnVuY3Rpb24gKGNvbCwgaWR4KSB7CgkJCQkJcmV0dXJuIHMoCgkJCQkJCQlpZHgsCgkJCQkJCQlfX2NvbHVtbkRhdGEoIHNldHRpbmdzLCBpZHgsIDAsIDAsIHJvd3MgKSwKCQkJCQkJCW5vZGVzWyBpZHggXQoJCQkJCQkpID8gaWR4IDogbnVsbDsKCQkJCX0gKTsKCQkJfQoJCgkJCS8vIGpRdWVyeSBvciBzdHJpbmcgc2VsZWN0b3IKCQkJdmFyIG1hdGNoID0gdHlwZW9mIHMgPT09ICdzdHJpbmcnID8KCQkJCXMubWF0Y2goIF9fcmVfY29sdW1uX3NlbGVjdG9yICkgOgoJCQkJJyc7CgkKCQkJaWYgKCBtYXRjaCApIHsKCQkJCXN3aXRjaCggbWF0Y2hbMl0gKSB7CgkJCQkJY2FzZSAndmlzSWR4JzoKCQkJCQljYXNlICd2aXNpYmxlJzoKCQkJCQkJdmFyIGlkeCA9IHBhcnNlSW50KCBtYXRjaFsxXSwgMTAgKTsKCQkJCQkJLy8gVmlzaWJsZSBpbmRleCBnaXZlbiwgY29udmVydCB0byBjb2x1bW4gaW5kZXgKCQkJCQkJaWYgKCBpZHggPCAwICkgewoJCQkJCQkJLy8gQ291bnRpbmcgZnJvbSB0aGUgcmlnaHQKCQkJCQkJCXZhciB2aXNDb2x1bW5zID0gJC5tYXAoIGNvbHVtbnMsIGZ1bmN0aW9uIChjb2wsaSkgewoJCQkJCQkJCXJldHVybiBjb2wuYlZpc2libGUgPyBpIDogbnVsbDsKCQkJCQkJCX0gKTsKCQkJCQkJCXJldHVybiBbIHZpc0NvbHVtbnNbIHZpc0NvbHVtbnMubGVuZ3RoICsgaWR4IF0gXTsKCQkJCQkJfQoJCQkJCQkvLyBDb3VudGluZyBmcm9tIHRoZSBsZWZ0CgkJCQkJCXJldHVybiBbIF9mblZpc2libGVUb0NvbHVtbkluZGV4KCBzZXR0aW5ncywgaWR4ICkgXTsKCQoJCQkJCWNhc2UgJ25hbWUnOgoJCQkJCQkvLyBtYXRjaCBieSBuYW1lLiBgbmFtZXNgIGlzIGNvbHVtbiBpbmRleCBjb21wbGV0ZSBhbmQgaW4gb3JkZXIKCQkJCQkJcmV0dXJuICQubWFwKCBuYW1lcywgZnVuY3Rpb24gKG5hbWUsIGkpIHsKCQkJCQkJCXJldHVybiBuYW1lID09PSBtYXRjaFsxXSA/IGkgOiBudWxsOwoJCQkJCQl9ICk7CgkKCQkJCQlkZWZhdWx0OgoJCQkJCQlyZXR1cm4gW107CgkJCQl9CgkJCX0KCQoJCQkvLyBDZWxsIGluIHRoZSB0YWJsZSBib2R5CgkJCWlmICggcy5ub2RlTmFtZSAmJiBzLl9EVF9DZWxsSW5kZXggKSB7CgkJCQlyZXR1cm4gWyBzLl9EVF9DZWxsSW5kZXguY29sdW1uIF07CgkJCX0KCQoJCQkvLyBqUXVlcnkgc2VsZWN0b3Igb24gdGhlIFRIIGVsZW1lbnRzIGZvciB0aGUgY29sdW1ucwoJCQl2YXIganFSZXN1bHQgPSAkKCBub2RlcyApCgkJCQkuZmlsdGVyKCBzICkKCQkJCS5tYXAoIGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gJC5pbkFycmF5KCB0aGlzLCBub2RlcyApOyAvLyBgbm9kZXNgIGlzIGNvbHVtbiBpbmRleCBjb21wbGV0ZSBhbmQgaW4gb3JkZXIKCQkJCX0gKQoJCQkJLnRvQXJyYXkoKTsKCQoJCQlpZiAoIGpxUmVzdWx0Lmxlbmd0aCB8fCAhIHMubm9kZU5hbWUgKSB7CgkJCQlyZXR1cm4ganFSZXN1bHQ7CgkJCX0KCQoJCQkvLyBPdGhlcndpc2UgYSBub2RlIHdoaWNoIG1pZ2h0IGhhdmUgYSBgZHQtY29sdW1uYCBkYXRhIGF0dHJpYnV0ZSwgb3IgYmUKCQkJLy8gYSBjaGlsZCBvciBzdWNoIGFuIGVsZW1lbnQKCQkJdmFyIGhvc3QgPSAkKHMpLmNsb3Nlc3QoJypbZGF0YS1kdC1jb2x1bW5dJyk7CgkJCXJldHVybiBob3N0Lmxlbmd0aCA/CgkJCQlbIGhvc3QuZGF0YSgnZHQtY29sdW1uJykgXSA6CgkJCQlbXTsKCQl9OwoJCgkJcmV0dXJuIF9zZWxlY3Rvcl9ydW4oICdjb2x1bW4nLCBzZWxlY3RvciwgcnVuLCBzZXR0aW5ncywgb3B0cyApOwoJfTsKCQoJCgl2YXIgX19zZXRDb2x1bW5WaXMgPSBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4sIHZpcyApIHsKCQl2YXIKCQkJY29scyA9IHNldHRpbmdzLmFvQ29sdW1ucywKCQkJY29sICA9IGNvbHNbIGNvbHVtbiBdLAoJCQlkYXRhID0gc2V0dGluZ3MuYW9EYXRhLAoJCQlyb3csIGNlbGxzLCBpLCBpZW4sIHRyOwoJCgkJLy8gR2V0CgkJaWYgKCB2aXMgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIGNvbC5iVmlzaWJsZTsKCQl9CgkKCQkvLyBTZXQKCQkvLyBObyBjaGFuZ2UKCQlpZiAoIGNvbC5iVmlzaWJsZSA9PT0gdmlzICkgewoJCQlyZXR1cm47CgkJfQoJCgkJaWYgKCB2aXMgKSB7CgkJCS8vIEluc2VydCBjb2x1bW4KCQkJLy8gTmVlZCB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIHVzZSBhcHBlbmRDaGlsZCBvciBpbnNlcnRCZWZvcmUKCQkJdmFyIGluc2VydEJlZm9yZSA9ICQuaW5BcnJheSggdHJ1ZSwgX3BsdWNrKGNvbHMsICdiVmlzaWJsZScpLCBjb2x1bW4rMSApOwoJCgkJCWZvciAoIGk9MCwgaWVuPWRhdGEubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQl0ciA9IGRhdGFbaV0ublRyOwoJCQkJY2VsbHMgPSBkYXRhW2ldLmFuQ2VsbHM7CgkKCQkJCWlmICggdHIgKSB7CgkJCQkJLy8gaW5zZXJ0QmVmb3JlIGNhbiBhY3QgbGlrZSBhcHBlbmRDaGlsZCBpZiAybmQgYXJnIGlzIG51bGwKCQkJCQl0ci5pbnNlcnRCZWZvcmUoIGNlbGxzWyBjb2x1bW4gXSwgY2VsbHNbIGluc2VydEJlZm9yZSBdIHx8IG51bGwgKTsKCQkJCX0KCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gUmVtb3ZlIGNvbHVtbgoJCQkkKCBfcGx1Y2soIHNldHRpbmdzLmFvRGF0YSwgJ2FuQ2VsbHMnLCBjb2x1bW4gKSApLmRldGFjaCgpOwoJCX0KCQoJCS8vIENvbW1vbiBhY3Rpb25zCgkJY29sLmJWaXNpYmxlID0gdmlzOwoJfTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnY29sdW1ucygpJywgZnVuY3Rpb24gKCBzZWxlY3Rvciwgb3B0cyApIHsKCQkvLyBhcmd1bWVudCBzaGlmdGluZwoJCWlmICggc2VsZWN0b3IgPT09IHVuZGVmaW5lZCApIHsKCQkJc2VsZWN0b3IgPSAnJzsKCQl9CgkJZWxzZSBpZiAoICQuaXNQbGFpbk9iamVjdCggc2VsZWN0b3IgKSApIHsKCQkJb3B0cyA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9ICcnOwoJCX0KCQoJCW9wdHMgPSBfc2VsZWN0b3Jfb3B0cyggb3B0cyApOwoJCgkJdmFyIGluc3QgPSB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlyZXR1cm4gX19jb2x1bW5fc2VsZWN0b3IoIHNldHRpbmdzLCBzZWxlY3Rvciwgb3B0cyApOwoJCX0sIDEgKTsKCQoJCS8vIFdhbnQgYXJndW1lbnQgc2hpZnRpbmcgaGVyZSBhbmQgaW4gX3Jvd19zZWxlY3Rvcj8KCQlpbnN0LnNlbGVjdG9yLmNvbHMgPSBzZWxlY3RvcjsKCQlpbnN0LnNlbGVjdG9yLm9wdHMgPSBvcHRzOwoJCgkJcmV0dXJuIGluc3Q7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjb2x1bW5zKCkuaGVhZGVyKCknLCAnY29sdW1uKCkuaGVhZGVyKCknLCBmdW5jdGlvbiAoIHNlbGVjdG9yLCBvcHRzICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY29sdW1uJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uICkgewoJCQlyZXR1cm4gc2V0dGluZ3MuYW9Db2x1bW5zW2NvbHVtbl0ublRoOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NvbHVtbnMoKS5mb290ZXIoKScsICdjb2x1bW4oKS5mb290ZXIoKScsIGZ1bmN0aW9uICggc2VsZWN0b3IsIG9wdHMgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4nLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4gKSB7CgkJCXJldHVybiBzZXR0aW5ncy5hb0NvbHVtbnNbY29sdW1uXS5uVGY7CgkJfSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY29sdW1ucygpLmRhdGEoKScsICdjb2x1bW4oKS5kYXRhKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4tcm93cycsIF9fY29sdW1uRGF0YSwgMSApOwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY29sdW1ucygpLmRhdGFTcmMoKScsICdjb2x1bW4oKS5kYXRhU3JjKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4nLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4gKSB7CgkJCXJldHVybiBzZXR0aW5ncy5hb0NvbHVtbnNbY29sdW1uXS5tRGF0YTsKCQl9LCAxICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjb2x1bW5zKCkuY2FjaGUoKScsICdjb2x1bW4oKS5jYWNoZSgpJywgZnVuY3Rpb24gKCB0eXBlICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY29sdW1uLXJvd3MnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4sIGksIGosIHJvd3MgKSB7CgkJCXJldHVybiBfcGx1Y2tfb3JkZXIoIHNldHRpbmdzLmFvRGF0YSwgcm93cywKCQkJCXR5cGUgPT09ICdzZWFyY2gnID8gJ19hRmlsdGVyRGF0YScgOiAnX2FTb3J0RGF0YScsIGNvbHVtbgoJCQkpOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlclBsdXJhbCggJ2NvbHVtbnMoKS5ub2RlcygpJywgJ2NvbHVtbigpLm5vZGVzKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4tcm93cycsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiwgaSwgaiwgcm93cyApIHsKCQkJcmV0dXJuIF9wbHVja19vcmRlciggc2V0dGluZ3MuYW9EYXRhLCByb3dzLCAnYW5DZWxscycsIGNvbHVtbiApIDsKCQl9LCAxICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjb2x1bW5zKCkudmlzaWJsZSgpJywgJ2NvbHVtbigpLnZpc2libGUoKScsIGZ1bmN0aW9uICggdmlzLCBjYWxjICkgewoJCXZhciB0aGF0ID0gdGhpczsKCQl2YXIgcmV0ID0gdGhpcy5pdGVyYXRvciggJ2NvbHVtbicsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGNvbHVtbiApIHsKCQkJaWYgKCB2aXMgPT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiBzZXR0aW5ncy5hb0NvbHVtbnNbIGNvbHVtbiBdLmJWaXNpYmxlOwoJCQl9IC8vIGVsc2UKCQkJX19zZXRDb2x1bW5WaXMoIHNldHRpbmdzLCBjb2x1bW4sIHZpcyApOwoJCX0gKTsKCQoJCS8vIEdyb3VwIHRoZSBjb2x1bW4gdmlzaWJpbGl0eSBjaGFuZ2VzCgkJaWYgKCB2aXMgIT09IHVuZGVmaW5lZCApIHsKCQkJdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJCS8vIFJlZHJhdyB0aGUgaGVhZGVyIGFmdGVyIGNoYW5nZXMKCQkJCV9mbkRyYXdIZWFkKCBzZXR0aW5ncywgc2V0dGluZ3MuYW9IZWFkZXIgKTsKCQkJCV9mbkRyYXdIZWFkKCBzZXR0aW5ncywgc2V0dGluZ3MuYW9Gb290ZXIgKTsKCQkKCQkJCS8vIFVwZGF0ZSBjb2xzcGFuIGZvciBubyByZWNvcmRzIGRpc3BsYXkuIENoaWxkIHJvd3MgYW5kIGV4dGVuc2lvbnMgd2lsbCB1c2UgdGhlaXIgb3duCgkJCQkvLyBsaXN0ZW5lcnMgdG8gZG8gdGhpcyAtIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIGVtcHR5IHRhYmxlIGl0ZW0gaGVyZQoJCQkJaWYgKCAhIHNldHRpbmdzLmFpRGlzcGxheS5sZW5ndGggKSB7CgkJCQkJJChzZXR0aW5ncy5uVEJvZHkpLmZpbmQoJ3RkW2NvbHNwYW5dJykuYXR0cignY29sc3BhbicsIF9mblZpc2JsZUNvbHVtbnMoc2V0dGluZ3MpKTsKCQkJCX0KCQkKCQkJCV9mblNhdmVTdGF0ZSggc2V0dGluZ3MgKTsKCQoJCQkJLy8gU2Vjb25kIGxvb3Agb25jZSB0aGUgZmlyc3QgaXMgZG9uZSBmb3IgZXZlbnRzCgkJCQl0aGF0Lml0ZXJhdG9yKCAnY29sdW1uJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uICkgewoJCQkJCV9mbkNhbGxiYWNrRmlyZSggc2V0dGluZ3MsIG51bGwsICdjb2x1bW4tdmlzaWJpbGl0eScsIFtzZXR0aW5ncywgY29sdW1uLCB2aXMsIGNhbGNdICk7CgkJCQl9ICk7CgkKCQkJCWlmICggY2FsYyA9PT0gdW5kZWZpbmVkIHx8IGNhbGMgKSB7CgkJCQkJdGhhdC5jb2x1bW5zLmFkanVzdCgpOwoJCQkJfQoJCQl9KTsKCQl9CgkKCQlyZXR1cm4gcmV0OwoJfSApOwoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY29sdW1ucygpLmluZGV4ZXMoKScsICdjb2x1bW4oKS5pbmRleCgpJywgZnVuY3Rpb24gKCB0eXBlICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY29sdW1uJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgY29sdW1uICkgewoJCQlyZXR1cm4gdHlwZSA9PT0gJ3Zpc2libGUnID8KCQkJCV9mbkNvbHVtbkluZGV4VG9WaXNpYmxlKCBzZXR0aW5ncywgY29sdW1uICkgOgoJCQkJY29sdW1uOwoJCX0sIDEgKTsKCX0gKTsKCQoJX2FwaV9yZWdpc3RlciggJ2NvbHVtbnMuYWRqdXN0KCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCV9mbkFkanVzdENvbHVtblNpemluZyggc2V0dGluZ3MgKTsKCQl9LCAxICk7Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXIoICdjb2x1bW4uaW5kZXgoKScsIGZ1bmN0aW9uICggdHlwZSwgaWR4ICkgewoJCWlmICggdGhpcy5jb250ZXh0Lmxlbmd0aCAhPT0gMCApIHsKCQkJdmFyIGN0eCA9IHRoaXMuY29udGV4dFswXTsKCQoJCQlpZiAoIHR5cGUgPT09ICdmcm9tVmlzaWJsZScgfHwgdHlwZSA9PT0gJ3RvRGF0YScgKSB7CgkJCQlyZXR1cm4gX2ZuVmlzaWJsZVRvQ29sdW1uSW5kZXgoIGN0eCwgaWR4ICk7CgkJCX0KCQkJZWxzZSBpZiAoIHR5cGUgPT09ICdmcm9tRGF0YScgfHwgdHlwZSA9PT0gJ3RvVmlzaWJsZScgKSB7CgkJCQlyZXR1cm4gX2ZuQ29sdW1uSW5kZXhUb1Zpc2libGUoIGN0eCwgaWR4ICk7CgkJCX0KCQl9Cgl9ICk7CgkKCV9hcGlfcmVnaXN0ZXIoICdjb2x1bW4oKScsIGZ1bmN0aW9uICggc2VsZWN0b3IsIG9wdHMgKSB7CgkJcmV0dXJuIF9zZWxlY3Rvcl9maXJzdCggdGhpcy5jb2x1bW5zKCBzZWxlY3Rvciwgb3B0cyApICk7Cgl9ICk7CgkKCXZhciBfX2NlbGxfc2VsZWN0b3IgPSBmdW5jdGlvbiAoIHNldHRpbmdzLCBzZWxlY3Rvciwgb3B0cyApCgl7CgkJdmFyIGRhdGEgPSBzZXR0aW5ncy5hb0RhdGE7CgkJdmFyIHJvd3MgPSBfc2VsZWN0b3Jfcm93X2luZGV4ZXMoIHNldHRpbmdzLCBvcHRzICk7CgkJdmFyIGNlbGxzID0gX3JlbW92ZUVtcHR5KCBfcGx1Y2tfb3JkZXIoIGRhdGEsIHJvd3MsICdhbkNlbGxzJyApICk7CgkJdmFyIGFsbENlbGxzID0gJChfZmxhdHRlbiggW10sIGNlbGxzICkpOwoJCXZhciByb3c7CgkJdmFyIGNvbHVtbnMgPSBzZXR0aW5ncy5hb0NvbHVtbnMubGVuZ3RoOwoJCXZhciBhLCBpLCBpZW4sIGosIG8sIGhvc3Q7CgkKCQl2YXIgcnVuID0gZnVuY3Rpb24gKCBzICkgewoJCQl2YXIgZm5TZWxlY3RvciA9IHR5cGVvZiBzID09PSAnZnVuY3Rpb24nOwoJCgkJCWlmICggcyA9PT0gbnVsbCB8fCBzID09PSB1bmRlZmluZWQgfHwgZm5TZWxlY3RvciApIHsKCQkJCS8vIEFsbCBjZWxscyBhbmQgZnVuY3Rpb24gc2VsZWN0b3JzCgkJCQlhID0gW107CgkKCQkJCWZvciAoIGk9MCwgaWVuPXJvd3MubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQkJcm93ID0gcm93c1tpXTsKCQoJCQkJCWZvciAoIGo9MCA7IGo8Y29sdW1ucyA7IGorKyApIHsKCQkJCQkJbyA9IHsKCQkJCQkJCXJvdzogcm93LAoJCQkJCQkJY29sdW1uOiBqCgkJCQkJCX07CgkKCQkJCQkJaWYgKCBmblNlbGVjdG9yICkgewoJCQkJCQkJLy8gU2VsZWN0b3IgLSBmdW5jdGlvbgoJCQkJCQkJaG9zdCA9IGRhdGFbIHJvdyBdOwoJCgkJCQkJCQlpZiAoIHMoIG8sIF9mbkdldENlbGxEYXRhKHNldHRpbmdzLCByb3csIGopLCBob3N0LmFuQ2VsbHMgPyBob3N0LmFuQ2VsbHNbal0gOiBudWxsICkgKSB7CgkJCQkJCQkJYS5wdXNoKCBvICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQkvLyBTZWxlY3RvciAtIGFsbAoJCQkJCQkJYS5wdXNoKCBvICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkKCQkJCXJldHVybiBhOwoJCQl9CgkJCQoJCQkvLyBTZWxlY3RvciAtIGluZGV4CgkJCWlmICggJC5pc1BsYWluT2JqZWN0KCBzICkgKSB7CgkJCQkvLyBWYWxpZCBjZWxsIGluZGV4IGFuZCBpdHMgaW4gdGhlIGFycmF5IG9mIHNlbGVjdGFibGUgcm93cwoJCQkJcmV0dXJuIHMuY29sdW1uICE9PSB1bmRlZmluZWQgJiYgcy5yb3cgIT09IHVuZGVmaW5lZCAmJiAkLmluQXJyYXkoIHMucm93LCByb3dzICkgIT09IC0xID8KCQkJCQlbc10gOgoJCQkJCVtdOwoJCQl9CgkKCQkJLy8gU2VsZWN0b3IgLSBqUXVlcnkgZmlsdGVyZWQgY2VsbHMKCQkJdmFyIGpxUmVzdWx0ID0gYWxsQ2VsbHMKCQkJCS5maWx0ZXIoIHMgKQoJCQkJLm1hcCggZnVuY3Rpb24gKGksIGVsKSB7CgkJCQkJcmV0dXJuIHsgLy8gdXNlIGEgbmV3IG9iamVjdCwgaW4gY2FzZSBzb21lb25lIGNoYW5nZXMgdGhlIHZhbHVlcwoJCQkJCQlyb3c6ICAgIGVsLl9EVF9DZWxsSW5kZXgucm93LAoJCQkJCQljb2x1bW46IGVsLl9EVF9DZWxsSW5kZXguY29sdW1uCgkgCQkJCX07CgkJCQl9ICkKCQkJCS50b0FycmF5KCk7CgkKCQkJaWYgKCBqcVJlc3VsdC5sZW5ndGggfHwgISBzLm5vZGVOYW1lICkgewoJCQkJcmV0dXJuIGpxUmVzdWx0OwoJCQl9CgkKCQkJLy8gT3RoZXJ3aXNlIHRoZSBzZWxlY3RvciBpcyBhIG5vZGUsIGFuZCB0aGVyZSBpcyBvbmUgbGFzdCBvcHRpb24gLSB0aGUKCQkJLy8gZWxlbWVudCBtaWdodCBiZSBhIGNoaWxkIG9mIGFuIGVsZW1lbnQgd2hpY2ggaGFzIGR0LXJvdyBhbmQgZHQtY29sdW1uCgkJCS8vIGRhdGEgYXR0cmlidXRlcwoJCQlob3N0ID0gJChzKS5jbG9zZXN0KCcqW2RhdGEtZHQtcm93XScpOwoJCQlyZXR1cm4gaG9zdC5sZW5ndGggPwoJCQkJWyB7CgkJCQkJcm93OiBob3N0LmRhdGEoJ2R0LXJvdycpLAoJCQkJCWNvbHVtbjogaG9zdC5kYXRhKCdkdC1jb2x1bW4nKQoJCQkJfSBdIDoKCQkJCVtdOwoJCX07CgkKCQlyZXR1cm4gX3NlbGVjdG9yX3J1biggJ2NlbGwnLCBzZWxlY3RvciwgcnVuLCBzZXR0aW5ncywgb3B0cyApOwoJfTsKCQoJCgkKCQoJX2FwaV9yZWdpc3RlciggJ2NlbGxzKCknLCBmdW5jdGlvbiAoIHJvd1NlbGVjdG9yLCBjb2x1bW5TZWxlY3Rvciwgb3B0cyApIHsKCQkvLyBBcmd1bWVudCBzaGlmdGluZwoJCWlmICggJC5pc1BsYWluT2JqZWN0KCByb3dTZWxlY3RvciApICkgewoJCQkvLyBJbmRleGVzCgkJCWlmICggcm93U2VsZWN0b3Iucm93ID09PSB1bmRlZmluZWQgKSB7CgkJCQkvLyBTZWxlY3RvciBvcHRpb25zIGluIGZpcnN0IHBhcmFtZXRlcgoJCQkJb3B0cyA9IHJvd1NlbGVjdG9yOwoJCQkJcm93U2VsZWN0b3IgPSBudWxsOwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gQ2VsbCBpbmRleCBvYmplY3RzIGluIGZpcnN0IHBhcmFtZXRlcgoJCQkJb3B0cyA9IGNvbHVtblNlbGVjdG9yOwoJCQkJY29sdW1uU2VsZWN0b3IgPSBudWxsOwoJCQl9CgkJfQoJCWlmICggJC5pc1BsYWluT2JqZWN0KCBjb2x1bW5TZWxlY3RvciApICkgewoJCQlvcHRzID0gY29sdW1uU2VsZWN0b3I7CgkJCWNvbHVtblNlbGVjdG9yID0gbnVsbDsKCQl9CgkKCQkvLyBDZWxsIHNlbGVjdG9yCgkJaWYgKCBjb2x1bW5TZWxlY3RvciA9PT0gbnVsbCB8fCBjb2x1bW5TZWxlY3RvciA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJCXJldHVybiBfX2NlbGxfc2VsZWN0b3IoIHNldHRpbmdzLCByb3dTZWxlY3RvciwgX3NlbGVjdG9yX29wdHMoIG9wdHMgKSApOwoJCQl9ICk7CgkJfQoJCgkJLy8gVGhlIGRlZmF1bHQgYnVpbHQgaW4gb3B0aW9ucyBuZWVkIHRvIGFwcGx5IHRvIHJvdyBhbmQgY29sdW1ucwoJCXZhciBpbnRlcm5hbE9wdHMgPSBvcHRzID8gewoJCQlwYWdlOiBvcHRzLnBhZ2UsCgkJCW9yZGVyOiBvcHRzLm9yZGVyLAoJCQlzZWFyY2g6IG9wdHMuc2VhcmNoCgkJfSA6IHt9OwoJCgkJLy8gUm93ICsgY29sdW1uIHNlbGVjdG9yCgkJdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMoIGNvbHVtblNlbGVjdG9yLCBpbnRlcm5hbE9wdHMgKTsKCQl2YXIgcm93cyA9IHRoaXMucm93cyggcm93U2VsZWN0b3IsIGludGVybmFsT3B0cyApOwoJCXZhciBpLCBpZW4sIGosIGplbjsKCQoJCXZhciBjZWxsc05vT3B0cyA9IHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGlkeCApIHsKCQkJdmFyIGEgPSBbXTsKCQoJCQlmb3IgKCBpPTAsIGllbj1yb3dzW2lkeF0ubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQlmb3IgKCBqPTAsIGplbj1jb2x1bW5zW2lkeF0ubGVuZ3RoIDsgajxqZW4gOyBqKysgKSB7CgkJCQkJYS5wdXNoKCB7CgkJCQkJCXJvdzogICAgcm93c1tpZHhdW2ldLAoJCQkJCQljb2x1bW46IGNvbHVtbnNbaWR4XVtqXQoJCQkJCX0gKTsKCQkJCX0KCQkJfQoJCgkJCXJldHVybiBhOwoJCX0sIDEgKTsKCQoJCS8vIFRoZXJlIGlzIGN1cnJlbnRseSBvbmx5IG9uZSBleHRlbnNpb24gd2hpY2ggdXNlcyBhIGNlbGwgc2VsZWN0b3IgZXh0ZW5zaW9uCgkJLy8gSXQgaXMgYSBfbWFqb3JfIHBlcmZvcm1hbmNlIGRyYWcgdG8gcnVuIHRoaXMgaWYgaXQgaXNuJ3QgbmVlZGVkLCBzbyB0aGlzIGlzCgkJLy8gYW4gZXh0ZW5zaW9uIHNwZWNpZmljIGNoZWNrIGF0IHRoZSBtb21lbnQKCQl2YXIgY2VsbHMgPSBvcHRzICYmIG9wdHMuc2VsZWN0ZWQgPwoJCQl0aGlzLmNlbGxzKCBjZWxsc05vT3B0cywgb3B0cyApIDoKCQkJY2VsbHNOb09wdHM7CgkKCQkkLmV4dGVuZCggY2VsbHMuc2VsZWN0b3IsIHsKCQkJY29sczogY29sdW1uU2VsZWN0b3IsCgkJCXJvd3M6IHJvd1NlbGVjdG9yLAoJCQlvcHRzOiBvcHRzCgkJfSApOwoJCgkJcmV0dXJuIGNlbGxzOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjZWxscygpLm5vZGVzKCknLCAnY2VsbCgpLm5vZGUoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ2NlbGwnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCByb3csIGNvbHVtbiApIHsKCQkJdmFyIGRhdGEgPSBzZXR0aW5ncy5hb0RhdGFbIHJvdyBdOwoJCgkJCXJldHVybiBkYXRhICYmIGRhdGEuYW5DZWxscyA/CgkJCQlkYXRhLmFuQ2VsbHNbIGNvbHVtbiBdIDoKCQkJCXVuZGVmaW5lZDsKCQl9LCAxICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ2NlbGxzKCkuZGF0YSgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAnY2VsbCcsIGZ1bmN0aW9uICggc2V0dGluZ3MsIHJvdywgY29sdW1uICkgewoJCQlyZXR1cm4gX2ZuR2V0Q2VsbERhdGEoIHNldHRpbmdzLCByb3csIGNvbHVtbiApOwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY2VsbHMoKS5jYWNoZSgpJywgJ2NlbGwoKS5jYWNoZSgpJywgZnVuY3Rpb24gKCB0eXBlICkgewoJCXR5cGUgPSB0eXBlID09PSAnc2VhcmNoJyA/ICdfYUZpbHRlckRhdGEnIDogJ19hU29ydERhdGEnOwoJCgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjZWxsJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93LCBjb2x1bW4gKSB7CgkJCXJldHVybiBzZXR0aW5ncy5hb0RhdGFbIHJvdyBdWyB0eXBlIF1bIGNvbHVtbiBdOwoJCX0sIDEgKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyUGx1cmFsKCAnY2VsbHMoKS5yZW5kZXIoKScsICdjZWxsKCkucmVuZGVyKCknLCBmdW5jdGlvbiAoIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjZWxsJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93LCBjb2x1bW4gKSB7CgkJCXJldHVybiBfZm5HZXRDZWxsRGF0YSggc2V0dGluZ3MsIHJvdywgY29sdW1uLCB0eXBlICk7CgkJfSwgMSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjZWxscygpLmluZGV4ZXMoKScsICdjZWxsKCkuaW5kZXgoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ2NlbGwnLCBmdW5jdGlvbiAoIHNldHRpbmdzLCByb3csIGNvbHVtbiApIHsKCQkJcmV0dXJuIHsKCQkJCXJvdzogcm93LAoJCQkJY29sdW1uOiBjb2x1bW4sCgkJCQljb2x1bW5WaXNpYmxlOiBfZm5Db2x1bW5JbmRleFRvVmlzaWJsZSggc2V0dGluZ3MsIGNvbHVtbiApCgkJCX07CgkJfSwgMSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoICdjZWxscygpLmludmFsaWRhdGUoKScsICdjZWxsKCkuaW52YWxpZGF0ZSgpJywgZnVuY3Rpb24gKCBzcmMgKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjZWxsJywgZnVuY3Rpb24gKCBzZXR0aW5ncywgcm93LCBjb2x1bW4gKSB7CgkJCV9mbkludmFsaWRhdGUoIHNldHRpbmdzLCByb3csIHNyYywgY29sdW1uICk7CgkJfSApOwoJfSApOwoJCgkKCQoJX2FwaV9yZWdpc3RlciggJ2NlbGwoKScsIGZ1bmN0aW9uICggcm93U2VsZWN0b3IsIGNvbHVtblNlbGVjdG9yLCBvcHRzICkgewoJCXJldHVybiBfc2VsZWN0b3JfZmlyc3QoIHRoaXMuY2VsbHMoIHJvd1NlbGVjdG9yLCBjb2x1bW5TZWxlY3Rvciwgb3B0cyApICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ2NlbGwoKS5kYXRhKCknLCBmdW5jdGlvbiAoIGRhdGEgKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQl2YXIgY2VsbCA9IHRoaXNbMF07CgkKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJLy8gR2V0CgkJCXJldHVybiBjdHgubGVuZ3RoICYmIGNlbGwubGVuZ3RoID8KCQkJCV9mbkdldENlbGxEYXRhKCBjdHhbMF0sIGNlbGxbMF0ucm93LCBjZWxsWzBdLmNvbHVtbiApIDoKCQkJCXVuZGVmaW5lZDsKCQl9CgkKCQkvLyBTZXQKCQlfZm5TZXRDZWxsRGF0YSggY3R4WzBdLCBjZWxsWzBdLnJvdywgY2VsbFswXS5jb2x1bW4sIGRhdGEgKTsKCQlfZm5JbnZhbGlkYXRlKCBjdHhbMF0sIGNlbGxbMF0ucm93LCAnZGF0YScsIGNlbGxbMF0uY29sdW1uICk7CgkKCQlyZXR1cm4gdGhpczsKCX0gKTsKCQoJCgkKCS8qKgoJICogR2V0IGN1cnJlbnQgb3JkZXJpbmcgKHNvcnRpbmcpIHRoYXQgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgdGFibGUuCgkgKgoJICogQHJldHVybnMge2FycmF5fSAyRCBhcnJheSBjb250YWluaW5nIHRoZSBzb3J0aW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmlyc3QKCSAqICAgdGFibGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4gRWFjaCBlbGVtZW50IGluIHRoZSBwYXJlbnQgYXJyYXkgcmVwcmVzZW50cwoJICogICBhIGNvbHVtbiBiZWluZyBzb3J0ZWQgdXBvbiAoaS5lLiBtdWx0aS1zb3J0aW5nIHdpdGggdHdvIGNvbHVtbnMgd291bGQgaGF2ZQoJICogICAyIGlubmVyIGFycmF5cykuIFRoZSBpbm5lciBhcnJheXMgbWF5IGhhdmUgMiBvciAzIGVsZW1lbnRzLiBUaGUgZmlyc3QgaXMKCSAqICAgdGhlIGNvbHVtbiBpbmRleCB0aGF0IHRoZSBzb3J0aW5nIGNvbmRpdGlvbiBhcHBsaWVzIHRvLCB0aGUgc2Vjb25kIGlzIHRoZQoJICogICBkaXJlY3Rpb24gb2YgdGhlIHNvcnQgKGBkZXNjYCBvciBgYXNjYCkgYW5kLCBvcHRpb25hbGx5LCB0aGUgdGhpcmQgaXMgdGhlCgkgKiAgIGluZGV4IG9mIHRoZSBzb3J0aW5nIG9yZGVyIGZyb20gdGhlIGBjb2x1bW4uc29ydGluZ2AgaW5pdGlhbGlzYXRpb24gYXJyYXkuCgkgKi8vKioKCSAqIFNldCB0aGUgb3JkZXJpbmcgZm9yIHRoZSB0YWJsZS4KCSAqCgkgKiBAcGFyYW0ge2ludGVnZXJ9IG9yZGVyIENvbHVtbiBpbmRleCB0byBzb3J0IHVwb24uCgkgKiBAcGFyYW0ge3N0cmluZ30gZGlyZWN0aW9uIERpcmVjdGlvbiBvZiB0aGUgc29ydCB0byBiZSBhcHBsaWVkIChgYXNjYCBvciBgZGVzY2ApCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlcy5BcGl9IHRoaXMKCSAqLy8qKgoJICogU2V0IHRoZSBvcmRlcmluZyBmb3IgdGhlIHRhYmxlLgoJICoKCSAqIEBwYXJhbSB7YXJyYXl9IG9yZGVyIDFEIGFycmF5IG9mIHNvcnRpbmcgaW5mb3JtYXRpb24gdG8gYmUgYXBwbGllZC4KCSAqIEBwYXJhbSB7YXJyYXl9IFsuLi5dIE9wdGlvbmFsIGFkZGl0aW9uYWwgc29ydGluZyBjb25kaXRpb25zCgkgKiBAcmV0dXJucyB7RGF0YVRhYmxlcy5BcGl9IHRoaXMKCSAqLy8qKgoJICogU2V0IHRoZSBvcmRlcmluZyBmb3IgdGhlIHRhYmxlLgoJICoKCSAqIEBwYXJhbSB7YXJyYXl9IG9yZGVyIDJEIGFycmF5IG9mIHNvcnRpbmcgaW5mb3JtYXRpb24gdG8gYmUgYXBwbGllZC4KCSAqIEByZXR1cm5zIHtEYXRhVGFibGVzLkFwaX0gdGhpcwoJICovCglfYXBpX3JlZ2lzdGVyKCAnb3JkZXIoKScsIGZ1bmN0aW9uICggb3JkZXIsIGRpciApIHsKCQl2YXIgY3R4ID0gdGhpcy5jb250ZXh0OwoJCgkJaWYgKCBvcmRlciA9PT0gdW5kZWZpbmVkICkgewoJCQkvLyBnZXQKCQkJcmV0dXJuIGN0eC5sZW5ndGggIT09IDAgPwoJCQkJY3R4WzBdLmFhU29ydGluZyA6CgkJCQl1bmRlZmluZWQ7CgkJfQoJCgkJLy8gc2V0CgkJaWYgKCB0eXBlb2Ygb3JkZXIgPT09ICdudW1iZXInICkgewoJCQkvLyBTaW1wbGUgY29sdW1uIC8gZGlyZWN0aW9uIHBhc3NlZCBpbgoJCQlvcmRlciA9IFsgWyBvcmRlciwgZGlyIF0gXTsKCQl9CgkJZWxzZSBpZiAoIG9yZGVyLmxlbmd0aCAmJiAhIEFycmF5LmlzQXJyYXkoIG9yZGVyWzBdICkgKSB7CgkJCS8vIEFyZ3VtZW50cyBwYXNzZWQgaW4gKGxpc3Qgb2YgMUQgYXJyYXlzKQoJCQlvcmRlciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKTsKCQl9CgkJLy8gb3RoZXJ3aXNlIGEgMkQgYXJyYXkgd2FzIHBhc3NlZCBpbgoJCgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCXNldHRpbmdzLmFhU29ydGluZyA9IG9yZGVyLnNsaWNlKCk7CgkJfSApOwoJfSApOwoJCgkKCS8qKgoJICogQXR0YWNoIGEgc29ydCBsaXN0ZW5lciB0byBhbiBlbGVtZW50IGZvciBhIGdpdmVuIGNvbHVtbgoJICoKCSAqIEBwYXJhbSB7bm9kZXxqUXVlcnl8c3RyaW5nfSBub2RlIElkZW50aWZpZXIgZm9yIHRoZSBlbGVtZW50KHMpIHRvIGF0dGFjaCB0aGUKCSAqICAgbGlzdGVuZXIgdG8uIFRoaXMgY2FuIHRha2UgdGhlIGZvcm0gb2YgYSBzaW5nbGUgRE9NIG5vZGUsIGEgalF1ZXJ5CgkgKiAgIGNvbGxlY3Rpb24gb2Ygbm9kZXMgb3IgYSBqUXVlcnkgc2VsZWN0b3Igd2hpY2ggd2lsbCBpZGVudGlmeSB0aGUgbm9kZShzKS4KCSAqIEBwYXJhbSB7aW50ZWdlcn0gY29sdW1uIHRoZSBjb2x1bW4gdGhhdCBhIGNsaWNrIG9uIHRoaXMgbm9kZSB3aWxsIHNvcnQgb24KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBzb3J0IGlzIHJ1bgoJICogQHJldHVybnMge0RhdGFUYWJsZXMuQXBpfSB0aGlzCgkgKi8KCV9hcGlfcmVnaXN0ZXIoICdvcmRlci5saXN0ZW5lcigpJywgZnVuY3Rpb24gKCBub2RlLCBjb2x1bW4sIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5Tb3J0QXR0YWNoTGlzdGVuZXIoIHNldHRpbmdzLCBub2RlLCBjb2x1bW4sIGNhbGxiYWNrICk7CgkJfSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdvcmRlci5maXhlZCgpJywgZnVuY3Rpb24gKCBzZXQgKSB7CgkJaWYgKCAhIHNldCApIHsKCQkJdmFyIGN0eCA9IHRoaXMuY29udGV4dDsKCQkJdmFyIGZpeGVkID0gY3R4Lmxlbmd0aCA/CgkJCQljdHhbMF0uYWFTb3J0aW5nRml4ZWQgOgoJCQkJdW5kZWZpbmVkOwoJCgkJCXJldHVybiBBcnJheS5pc0FycmF5KCBmaXhlZCApID8KCQkJCXsgcHJlOiBmaXhlZCB9IDoKCQkJCWZpeGVkOwoJCX0KCQoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlzZXR0aW5ncy5hYVNvcnRpbmdGaXhlZCA9ICQuZXh0ZW5kKCB0cnVlLCB7fSwgc2V0ICk7CgkJfSApOwoJfSApOwoJCgkKCS8vIE9yZGVyIGJ5IHRoZSBzZWxlY3RlZCBjb2x1bW4ocykKCV9hcGlfcmVnaXN0ZXIoIFsKCQknY29sdW1ucygpLm9yZGVyKCknLAoJCSdjb2x1bW4oKS5vcmRlcigpJwoJXSwgZnVuY3Rpb24gKCBkaXIgKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoJCgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MsIGkgKSB7CgkJCXZhciBzb3J0ID0gW107CgkKCQkJJC5lYWNoKCB0aGF0W2ldLCBmdW5jdGlvbiAoaiwgY29sKSB7CgkJCQlzb3J0LnB1c2goIFsgY29sLCBkaXIgXSApOwoJCQl9ICk7CgkKCQkJc2V0dGluZ3MuYWFTb3J0aW5nID0gc29ydDsKCQl9ICk7Cgl9ICk7CgkKCQoJCglfYXBpX3JlZ2lzdGVyKCAnc2VhcmNoKCknLCBmdW5jdGlvbiAoIGlucHV0LCByZWdleCwgc21hcnQsIGNhc2VJbnNlbiApIHsKCQl2YXIgY3R4ID0gdGhpcy5jb250ZXh0OwoJCgkJaWYgKCBpbnB1dCA9PT0gdW5kZWZpbmVkICkgewoJCQkvLyBnZXQKCQkJcmV0dXJuIGN0eC5sZW5ndGggIT09IDAgPwoJCQkJY3R4WzBdLm9QcmV2aW91c1NlYXJjaC5zU2VhcmNoIDoKCQkJCXVuZGVmaW5lZDsKCQl9CgkKCQkvLyBzZXQKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJaWYgKCAhIHNldHRpbmdzLm9GZWF0dXJlcy5iRmlsdGVyICkgewoJCQkJcmV0dXJuOwoJCQl9CgkKCQkJX2ZuRmlsdGVyQ29tcGxldGUoIHNldHRpbmdzLCAkLmV4dGVuZCgge30sIHNldHRpbmdzLm9QcmV2aW91c1NlYXJjaCwgewoJCQkJInNTZWFyY2giOiBpbnB1dCsiIiwKCQkJCSJiUmVnZXgiOiAgcmVnZXggPT09IG51bGwgPyBmYWxzZSA6IHJlZ2V4LAoJCQkJImJTbWFydCI6ICBzbWFydCA9PT0gbnVsbCA/IHRydWUgIDogc21hcnQsCgkJCQkiYkNhc2VJbnNlbnNpdGl2ZSI6IGNhc2VJbnNlbiA9PT0gbnVsbCA/IHRydWUgOiBjYXNlSW5zZW4KCQkJfSApLCAxICk7CgkJfSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXJQbHVyYWwoCgkJJ2NvbHVtbnMoKS5zZWFyY2goKScsCgkJJ2NvbHVtbigpLnNlYXJjaCgpJywKCQlmdW5jdGlvbiAoIGlucHV0LCByZWdleCwgc21hcnQsIGNhc2VJbnNlbiApIHsKCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICdjb2x1bW4nLCBmdW5jdGlvbiAoIHNldHRpbmdzLCBjb2x1bW4gKSB7CgkJCQl2YXIgcHJlU2VhcmNoID0gc2V0dGluZ3MuYW9QcmVTZWFyY2hDb2xzOwoJCgkJCQlpZiAoIGlucHV0ID09PSB1bmRlZmluZWQgKSB7CgkJCQkJLy8gZ2V0CgkJCQkJcmV0dXJuIHByZVNlYXJjaFsgY29sdW1uIF0uc1NlYXJjaDsKCQkJCX0KCQoJCQkJLy8gc2V0CgkJCQlpZiAoICEgc2V0dGluZ3Mub0ZlYXR1cmVzLmJGaWx0ZXIgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCgkJCQkkLmV4dGVuZCggcHJlU2VhcmNoWyBjb2x1bW4gXSwgewoJCQkJCSJzU2VhcmNoIjogaW5wdXQrIiIsCgkJCQkJImJSZWdleCI6ICByZWdleCA9PT0gbnVsbCA/IGZhbHNlIDogcmVnZXgsCgkJCQkJImJTbWFydCI6ICBzbWFydCA9PT0gbnVsbCA/IHRydWUgIDogc21hcnQsCgkJCQkJImJDYXNlSW5zZW5zaXRpdmUiOiBjYXNlSW5zZW4gPT09IG51bGwgPyB0cnVlIDogY2FzZUluc2VuCgkJCQl9ICk7CgkKCQkJCV9mbkZpbHRlckNvbXBsZXRlKCBzZXR0aW5ncywgc2V0dGluZ3Mub1ByZXZpb3VzU2VhcmNoLCAxICk7CgkJCX0gKTsKCQl9CgkpOwoJCgkvKgoJICogU3RhdGUgQVBJIG1ldGhvZHMKCSAqLwoJCglfYXBpX3JlZ2lzdGVyKCAnc3RhdGUoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5jb250ZXh0Lmxlbmd0aCA/CgkJCXRoaXMuY29udGV4dFswXS5vU2F2ZWRTdGF0ZSA6CgkJCW51bGw7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3N0YXRlLmNsZWFyKCknLCBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCS8vIFNhdmUgYW4gZW1wdHkgb2JqZWN0CgkJCXNldHRpbmdzLmZuU3RhdGVTYXZlQ2FsbGJhY2suY2FsbCggc2V0dGluZ3Mub0luc3RhbmNlLCBzZXR0aW5ncywge30gKTsKCQl9ICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3N0YXRlLmxvYWRlZCgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLmNvbnRleHQubGVuZ3RoID8KCQkJdGhpcy5jb250ZXh0WzBdLm9Mb2FkZWRTdGF0ZSA6CgkJCW51bGw7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ3N0YXRlLnNhdmUoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggJ3RhYmxlJywgZnVuY3Rpb24gKCBzZXR0aW5ncyApIHsKCQkJX2ZuU2F2ZVN0YXRlKCBzZXR0aW5ncyApOwoJCX0gKTsKCX0gKTsKCQoJCgkKCS8qKgoJICogUHJvdmlkZSBhIGNvbW1vbiBtZXRob2QgZm9yIHBsdWctaW5zIHRvIGNoZWNrIHRoZSB2ZXJzaW9uIG9mIERhdGFUYWJsZXMgYmVpbmcKCSAqIHVzZWQsIGluIG9yZGVyIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5LgoJICoKCSAqICBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiBWZXJzaW9uIHN0cmluZyB0byBjaGVjayBmb3IsIGluIHRoZSBmb3JtYXQgIlguWS5aIi4KCSAqICAgIE5vdGUgdGhhdCB0aGUgZm9ybWF0cyAiWCIgYW5kICJYLlkiIGFyZSBhbHNvIGFjY2VwdGFibGUuCgkgKiAgQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhpcyB2ZXJzaW9uIG9mIERhdGFUYWJsZXMgaXMgZ3JlYXRlciBvciBlcXVhbCB0bwoJICogICAgdGhlIHJlcXVpcmVkIHZlcnNpb24sIG9yIGZhbHNlIGlmIHRoaXMgdmVyc2lvbiBvZiBEYXRhVGFsZXMgaXMgbm90CgkgKiAgICBzdWl0YWJsZQoJICogIEBzdGF0aWMKCSAqICBAZHRvcHQgQVBJLVN0YXRpYwoJICoKCSAqICBAZXhhbXBsZQoJICogICAgYWxlcnQoICQuZm4uZGF0YVRhYmxlLnZlcnNpb25DaGVjayggJzEuOS4wJyApICk7CgkgKi8KCURhdGFUYWJsZS52ZXJzaW9uQ2hlY2sgPSBEYXRhVGFibGUuZm5WZXJzaW9uQ2hlY2sgPSBmdW5jdGlvbiggdmVyc2lvbiApCgl7CgkJdmFyIGFUaGlzID0gRGF0YVRhYmxlLnZlcnNpb24uc3BsaXQoJy4nKTsKCQl2YXIgYVRoYXQgPSB2ZXJzaW9uLnNwbGl0KCcuJyk7CgkJdmFyIGlUaGlzLCBpVGhhdDsKCQoJCWZvciAoIHZhciBpPTAsIGlMZW49YVRoYXQubGVuZ3RoIDsgaTxpTGVuIDsgaSsrICkgewoJCQlpVGhpcyA9IHBhcnNlSW50KCBhVGhpc1tpXSwgMTAgKSB8fCAwOwoJCQlpVGhhdCA9IHBhcnNlSW50KCBhVGhhdFtpXSwgMTAgKSB8fCAwOwoJCgkJCS8vIFBhcnRzIGFyZSB0aGUgc2FtZSwga2VlcCBjb21wYXJpbmcKCQkJaWYgKGlUaGlzID09PSBpVGhhdCkgewoJCQkJY29udGludWU7CgkJCX0KCQoJCQkvLyBQYXJ0cyBhcmUgZGlmZmVyZW50LCByZXR1cm4gaW1tZWRpYXRlbHkKCQkJcmV0dXJuIGlUaGlzID4gaVRoYXQ7CgkJfQoJCgkJcmV0dXJuIHRydWU7Cgl9OwoJCgkKCS8qKgoJICogQ2hlY2sgaWYgYSBgPHRhYmxlPmAgbm9kZSBpcyBhIERhdGFUYWJsZSB0YWJsZSBhbHJlYWR5IG9yIG5vdC4KCSAqCgkgKiAgQHBhcmFtIHtub2RlfGpxdWVyeXxzdHJpbmd9IHRhYmxlIFRhYmxlIG5vZGUsIGpRdWVyeSBvYmplY3Qgb3IgalF1ZXJ5CgkgKiAgICAgIHNlbGVjdG9yIGZvciB0aGUgdGFibGUgdG8gdGVzdC4gTm90ZSB0aGF0IGlmIG1vcmUgdGhhbiBtb3JlIHRoYW4gb25lCgkgKiAgICAgIHRhYmxlIGlzIHBhc3NlZCBvbiwgb25seSB0aGUgZmlyc3Qgd2lsbCBiZSBjaGVja2VkCgkgKiAgQHJldHVybnMge2Jvb2xlYW59IHRydWUgdGhlIHRhYmxlIGdpdmVuIGlzIGEgRGF0YVRhYmxlLCBvciBmYWxzZSBvdGhlcndpc2UKCSAqICBAc3RhdGljCgkgKiAgQGR0b3B0IEFQSS1TdGF0aWMKCSAqCgkgKiAgQGV4YW1wbGUKCSAqICAgIGlmICggISAkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZSggJyNleGFtcGxlJyApICkgewoJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSgpOwoJICogICAgfQoJICovCglEYXRhVGFibGUuaXNEYXRhVGFibGUgPSBEYXRhVGFibGUuZm5Jc0RhdGFUYWJsZSA9IGZ1bmN0aW9uICggdGFibGUgKQoJewoJCXZhciB0ID0gJCh0YWJsZSkuZ2V0KDApOwoJCXZhciBpcyA9IGZhbHNlOwoJCgkJaWYgKCB0YWJsZSBpbnN0YW5jZW9mIERhdGFUYWJsZS5BcGkgKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQoJCSQuZWFjaCggRGF0YVRhYmxlLnNldHRpbmdzLCBmdW5jdGlvbiAoaSwgbykgewoJCQl2YXIgaGVhZCA9IG8ublNjcm9sbEhlYWQgPyAkKCd0YWJsZScsIG8ublNjcm9sbEhlYWQpWzBdIDogbnVsbDsKCQkJdmFyIGZvb3QgPSBvLm5TY3JvbGxGb290ID8gJCgndGFibGUnLCBvLm5TY3JvbGxGb290KVswXSA6IG51bGw7CgkKCQkJaWYgKCBvLm5UYWJsZSA9PT0gdCB8fCBoZWFkID09PSB0IHx8IGZvb3QgPT09IHQgKSB7CgkJCQlpcyA9IHRydWU7CgkJCX0KCQl9ICk7CgkKCQlyZXR1cm4gaXM7Cgl9OwoJCgkKCS8qKgoJICogR2V0IGFsbCBEYXRhVGFibGUgdGFibGVzIHRoYXQgaGF2ZSBiZWVuIGluaXRpYWxpc2VkIC0gb3B0aW9uYWxseSB5b3UgY2FuCgkgKiBzZWxlY3QgdG8gZ2V0IG9ubHkgY3VycmVudGx5IHZpc2libGUgdGFibGVzLgoJICoKCSAqICBAcGFyYW0ge2Jvb2xlYW59IFt2aXNpYmxlPWZhbHNlXSBGbGFnIHRvIGluZGljYXRlIGlmIHlvdSB3YW50IGFsbCAoZGVmYXVsdCkKCSAqICAgIG9yIHZpc2libGUgdGFibGVzIG9ubHkuCgkgKiAgQHJldHVybnMge2FycmF5fSBBcnJheSBvZiBgdGFibGVgIG5vZGVzIChub3QgRGF0YVRhYmxlIGluc3RhbmNlcykgd2hpY2ggYXJlCgkgKiAgICBEYXRhVGFibGVzCgkgKiAgQHN0YXRpYwoJICogIEBkdG9wdCBBUEktU3RhdGljCgkgKgoJICogIEBleGFtcGxlCgkgKiAgICAkLmVhY2goICQuZm4uZGF0YVRhYmxlLnRhYmxlcyh0cnVlKSwgZnVuY3Rpb24gKCkgewoJICogICAgICAkKHRhYmxlKS5EYXRhVGFibGUoKS5jb2x1bW5zLmFkanVzdCgpOwoJICogICAgfSApOwoJICovCglEYXRhVGFibGUudGFibGVzID0gRGF0YVRhYmxlLmZuVGFibGVzID0gZnVuY3Rpb24gKCB2aXNpYmxlICkKCXsKCQl2YXIgYXBpID0gZmFsc2U7CgkKCQlpZiAoICQuaXNQbGFpbk9iamVjdCggdmlzaWJsZSApICkgewoJCQlhcGkgPSB2aXNpYmxlLmFwaTsKCQkJdmlzaWJsZSA9IHZpc2libGUudmlzaWJsZTsKCQl9CgkKCQl2YXIgYSA9ICQubWFwKCBEYXRhVGFibGUuc2V0dGluZ3MsIGZ1bmN0aW9uIChvKSB7CgkJCWlmICggIXZpc2libGUgfHwgKHZpc2libGUgJiYgJChvLm5UYWJsZSkuaXMoJzp2aXNpYmxlJykpICkgewoJCQkJcmV0dXJuIG8ublRhYmxlOwoJCQl9CgkJfSApOwoJCgkJcmV0dXJuIGFwaSA/CgkJCW5ldyBfQXBpKCBhICkgOgoJCQlhOwoJfTsKCQoJCgkvKioKCSAqIENvbnZlcnQgZnJvbSBjYW1lbCBjYXNlIHBhcmFtZXRlcnMgdG8gSHVuZ2FyaWFuIG5vdGF0aW9uLiBUaGlzIGlzIG1hZGUgcHVibGljCgkgKiBmb3IgdGhlIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSB0aGUgc2FtZSBhYmlsaXR5IGFzIERhdGFUYWJsZXMgY29yZSB0byBhY2NlcHQKCSAqIGVpdGhlciB0aGUgMS45IHN0eWxlIEh1bmdhcmlhbiBub3RhdGlvbiwgb3IgdGhlIDEuMTArIHN0eWxlIGNhbWVsQ2FzZQoJICogcGFyYW1ldGVycy4KCSAqCgkgKiAgQHBhcmFtIHtvYmplY3R9IHNyYyBUaGUgbW9kZWwgb2JqZWN0IHdoaWNoIGhvbGRzIGFsbCBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlCgkgKiAgICBtYXBwZWQuCgkgKiAgQHBhcmFtIHtvYmplY3R9IHVzZXIgVGhlIG9iamVjdCB0byBjb252ZXJ0IGZyb20gY2FtZWwgY2FzZSB0byBIdW5nYXJpYW4uCgkgKiAgQHBhcmFtIHtib29sZWFufSBmb3JjZSBXaGVuIHNldCB0byBgdHJ1ZWAsIHByb3BlcnRpZXMgd2hpY2ggYWxyZWFkeSBoYXZlIGEKCSAqICAgIEh1bmdhcmlhbiB2YWx1ZSBpbiB0aGUgYHVzZXJgIG9iamVjdCB3aWxsIGJlIG92ZXJ3cml0dGVuLiBPdGhlcndpc2UgdGhleQoJICogICAgd29uJ3QgYmUuCgkgKi8KCURhdGFUYWJsZS5jYW1lbFRvSHVuZ2FyaWFuID0gX2ZuQ2FtZWxUb0h1bmdhcmlhbjsKCQoJCgkKCS8qKgoJICoKCSAqLwoJX2FwaV9yZWdpc3RlciggJyQoKScsIGZ1bmN0aW9uICggc2VsZWN0b3IsIG9wdHMgKSB7CgkJdmFyCgkJCXJvd3MgICA9IHRoaXMucm93cyggb3B0cyApLm5vZGVzKCksIC8vIEdldCBhbGwgcm93cwoJCQlqcVJvd3MgPSAkKHJvd3MpOwoJCgkJcmV0dXJuICQoIFtdLmNvbmNhdCgKCQkJanFSb3dzLmZpbHRlciggc2VsZWN0b3IgKS50b0FycmF5KCksCgkJCWpxUm93cy5maW5kKCBzZWxlY3RvciApLnRvQXJyYXkoKQoJCSkgKTsKCX0gKTsKCQoJCgkvLyBqUXVlcnkgZnVuY3Rpb25zIHRvIG9wZXJhdGUgb24gdGhlIHRhYmxlcwoJJC5lYWNoKCBbICdvbicsICdvbmUnLCAnb2ZmJyBdLCBmdW5jdGlvbiAoaSwga2V5KSB7CgkJX2FwaV9yZWdpc3Rlcigga2V5KycoKScsIGZ1bmN0aW9uICggLyogZXZlbnQsIGhhbmRsZXIgKi8gKSB7CgkJCXZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKCQoJCQkvLyBBZGQgdGhlIGBkdGAgbmFtZXNwYWNlIGF1dG9tYXRpY2FsbHkgaWYgaXQgaXNuJ3QgYWxyZWFkeSBwcmVzZW50CgkJCWFyZ3NbMF0gPSAkLm1hcCggYXJnc1swXS5zcGxpdCggL1xzLyApLCBmdW5jdGlvbiAoIGUgKSB7CgkJCQlyZXR1cm4gISBlLm1hdGNoKC9cLmR0XGIvKSA/CgkJCQkJZSsnLmR0JyA6CgkJCQkJZTsKCQkJCX0gKS5qb2luKCAnICcgKTsKCQoJCQl2YXIgaW5zdCA9ICQoIHRoaXMudGFibGVzKCkubm9kZXMoKSApOwoJCQlpbnN0W2tleV0uYXBwbHkoIGluc3QsIGFyZ3MgKTsKCQkJcmV0dXJuIHRoaXM7CgkJfSApOwoJfSApOwoJCgkKCV9hcGlfcmVnaXN0ZXIoICdjbGVhcigpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlfZm5DbGVhclRhYmxlKCBzZXR0aW5ncyApOwoJCX0gKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnc2V0dGluZ3MoKScsIGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gbmV3IF9BcGkoIHRoaXMuY29udGV4dCwgdGhpcy5jb250ZXh0ICk7Cgl9ICk7CgkKCQoJX2FwaV9yZWdpc3RlciggJ2luaXQoKScsIGZ1bmN0aW9uICgpIHsKCQl2YXIgY3R4ID0gdGhpcy5jb250ZXh0OwoJCXJldHVybiBjdHgubGVuZ3RoID8gY3R4WzBdLm9Jbml0IDogbnVsbDsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnZGF0YSgpJywgZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLml0ZXJhdG9yKCAndGFibGUnLCBmdW5jdGlvbiAoIHNldHRpbmdzICkgewoJCQlyZXR1cm4gX3BsdWNrKCBzZXR0aW5ncy5hb0RhdGEsICdfYURhdGEnICk7CgkJfSApLmZsYXR0ZW4oKTsKCX0gKTsKCQoJCglfYXBpX3JlZ2lzdGVyKCAnZGVzdHJveSgpJywgZnVuY3Rpb24gKCByZW1vdmUgKSB7CgkJcmVtb3ZlID0gcmVtb3ZlIHx8IGZhbHNlOwoJCgkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoICd0YWJsZScsIGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCXZhciBjbGFzc2VzICAgPSBzZXR0aW5ncy5vQ2xhc3NlczsKCQkJdmFyIHRhYmxlICAgICA9IHNldHRpbmdzLm5UYWJsZTsKCQkJdmFyIHRib2R5ICAgICA9IHNldHRpbmdzLm5UQm9keTsKCQkJdmFyIHRoZWFkICAgICA9IHNldHRpbmdzLm5USGVhZDsKCQkJdmFyIHRmb290ICAgICA9IHNldHRpbmdzLm5URm9vdDsKCQkJdmFyIGpxVGFibGUgICA9ICQodGFibGUpOwoJCQl2YXIganFUYm9keSAgID0gJCh0Ym9keSk7CgkJCXZhciBqcVdyYXBwZXIgPSAkKHNldHRpbmdzLm5UYWJsZVdyYXBwZXIpOwoJCQl2YXIgcm93cyAgICAgID0gJC5tYXAoIHNldHRpbmdzLmFvRGF0YSwgZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIublRyOyB9ICk7CgkJCXZhciBpLCBpZW47CgkKCQkJLy8gRmxhZyB0byBub3RlIHRoYXQgdGhlIHRhYmxlIGlzIGN1cnJlbnRseSBiZWluZyBkZXN0cm95ZWQgLSBubyBhY3Rpb24KCQkJLy8gc2hvdWxkIGJlIHRha2VuCgkJCXNldHRpbmdzLmJEZXN0cm95aW5nID0gdHJ1ZTsKCQoJCQkvLyBGaXJlIG9mZiB0aGUgZGVzdHJveSBjYWxsYmFja3MgZm9yIHBsdWctaW5zIGV0YwoJCQlfZm5DYWxsYmFja0ZpcmUoIHNldHRpbmdzLCAiYW9EZXN0cm95Q2FsbGJhY2siLCAiZGVzdHJveSIsIFtzZXR0aW5nc10gKTsKCQoJCQkvLyBJZiBub3QgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudCwgbWFrZSBhbGwgY29sdW1ucyB2aXNpYmxlCgkJCWlmICggISByZW1vdmUgKSB7CgkJCQluZXcgX0FwaSggc2V0dGluZ3MgKS5jb2x1bW5zKCkudmlzaWJsZSggdHJ1ZSApOwoJCQl9CgkKCQkJLy8gQmxpdHogYWxsIGBEVGAgbmFtZXNwYWNlZCBldmVudHMgKHRoZXNlIGFyZSBpbnRlcm5hbCBldmVudHMsIHRoZQoJCQkvLyBsb3dlcmNhc2UsIGBkdGAgZXZlbnRzIGFyZSB1c2VyIHN1YnNjcmliZWQgYW5kIHRoZXkgYXJlIHJlc3BvbnNpYmxlCgkJCS8vIGZvciByZW1vdmluZyB0aGVtCgkJCWpxV3JhcHBlci5vZmYoJy5EVCcpLmZpbmQoJzpub3QodGJvZHkgKiknKS5vZmYoJy5EVCcpOwoJCQkkKHdpbmRvdykub2ZmKCcuRFQtJytzZXR0aW5ncy5zSW5zdGFuY2UpOwoJCgkJCS8vIFdoZW4gc2Nyb2xsaW5nIHdlIGhhZCB0byBicmVhayB0aGUgdGFibGUgdXAgLSByZXN0b3JlIGl0CgkJCWlmICggdGFibGUgIT0gdGhlYWQucGFyZW50Tm9kZSApIHsKCQkJCWpxVGFibGUuY2hpbGRyZW4oJ3RoZWFkJykuZGV0YWNoKCk7CgkJCQlqcVRhYmxlLmFwcGVuZCggdGhlYWQgKTsKCQkJfQoJCgkJCWlmICggdGZvb3QgJiYgdGFibGUgIT0gdGZvb3QucGFyZW50Tm9kZSApIHsKCQkJCWpxVGFibGUuY2hpbGRyZW4oJ3Rmb290JykuZGV0YWNoKCk7CgkJCQlqcVRhYmxlLmFwcGVuZCggdGZvb3QgKTsKCQkJfQoJCgkJCXNldHRpbmdzLmFhU29ydGluZyA9IFtdOwoJCQlzZXR0aW5ncy5hYVNvcnRpbmdGaXhlZCA9IFtdOwoJCQlfZm5Tb3J0aW5nQ2xhc3Nlcyggc2V0dGluZ3MgKTsKCQoJCQkkKCByb3dzICkucmVtb3ZlQ2xhc3MoIHNldHRpbmdzLmFzU3RyaXBlQ2xhc3Nlcy5qb2luKCcgJykgKTsKCQoJCQkkKCd0aCwgdGQnLCB0aGVhZCkucmVtb3ZlQ2xhc3MoIGNsYXNzZXMuc1NvcnRhYmxlKycgJysKCQkJCWNsYXNzZXMuc1NvcnRhYmxlQXNjKycgJytjbGFzc2VzLnNTb3J0YWJsZURlc2MrJyAnK2NsYXNzZXMuc1NvcnRhYmxlTm9uZQoJCQkpOwoJCgkJCS8vIEFkZCB0aGUgVFIgZWxlbWVudHMgYmFjayBpbnRvIHRoZSB0YWJsZSBpbiB0aGVpciBvcmlnaW5hbCBvcmRlcgoJCQlqcVRib2R5LmNoaWxkcmVuKCkuZGV0YWNoKCk7CgkJCWpxVGJvZHkuYXBwZW5kKCByb3dzICk7CgkKCQkJdmFyIG9yaWcgPSBzZXR0aW5ncy5uVGFibGVXcmFwcGVyLnBhcmVudE5vZGU7CgkKCQkJLy8gUmVtb3ZlIHRoZSBEYXRhVGFibGVzIGdlbmVyYXRlZCBub2RlcywgZXZlbnRzIGFuZCBjbGFzc2VzCgkJCXZhciByZW1vdmVkTWV0aG9kID0gcmVtb3ZlID8gJ3JlbW92ZScgOiAnZGV0YWNoJzsKCQkJanFUYWJsZVsgcmVtb3ZlZE1ldGhvZCBdKCk7CgkJCWpxV3JhcHBlclsgcmVtb3ZlZE1ldGhvZCBdKCk7CgkKCQkJLy8gSWYgd2UgbmVlZCB0byByZWF0dGFjaCB0aGUgdGFibGUgdG8gdGhlIGRvY3VtZW50CgkJCWlmICggISByZW1vdmUgJiYgb3JpZyApIHsKCQkJCS8vIGluc2VydEJlZm9yZSBhY3RzIGxpa2UgYXBwZW5kQ2hpbGQgaWYgIWFyZ1sxXQoJCQkJb3JpZy5pbnNlcnRCZWZvcmUoIHRhYmxlLCBzZXR0aW5ncy5uVGFibGVSZWluc2VydEJlZm9yZSApOwoJCgkJCQkvLyBSZXN0b3JlIHRoZSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgdGFibGUgLSB3YXMgcmVhZCBmcm9tIHRoZSBzdHlsZSBwcm9wZXJ0eSwKCQkJCS8vIHNvIHdlIGNhbiByZXN0b3JlIGRpcmVjdGx5IHRvIHRoYXQKCQkJCWpxVGFibGUKCQkJCQkuY3NzKCAnd2lkdGgnLCBzZXR0aW5ncy5zRGVzdHJveVdpZHRoICkKCQkJCQkucmVtb3ZlQ2xhc3MoIGNsYXNzZXMuc1RhYmxlICk7CgkKCQkJCS8vIElmIHRoZSB3ZXJlIG9yaWdpbmFsbHkgc3RyaXBlIGNsYXNzZXMgLSB0aGVuIHdlIGFkZCB0aGVtIGJhY2sgaGVyZS4KCQkJCS8vIE5vdGUgdGhpcyBpcyBub3QgZm9vbCBwcm9vZiAoZm9yIGV4YW1wbGUgaWYgbm90IGFsbCByb3dzIGhhZCBzdHJpcGUKCQkJCS8vIGNsYXNzZXMgLSBidXQgaXQncyBhIGdvb2QgZWZmb3J0IHdpdGhvdXQgZ2V0dGluZyBjYXJyaWVkIGF3YXkKCQkJCWllbiA9IHNldHRpbmdzLmFzRGVzdHJveVN0cmlwZXMubGVuZ3RoOwoJCgkJCQlpZiAoIGllbiApIHsKCQkJCQlqcVRib2R5LmNoaWxkcmVuKCkuZWFjaCggZnVuY3Rpb24gKGkpIHsKCQkJCQkJJCh0aGlzKS5hZGRDbGFzcyggc2V0dGluZ3MuYXNEZXN0cm95U3RyaXBlc1tpICUgaWVuXSApOwoJCQkJCX0gKTsKCQkJCX0KCQkJfQoJCgkJCS8qIFJlbW92ZSB0aGUgc2V0dGluZ3Mgb2JqZWN0IGZyb20gdGhlIHNldHRpbmdzIGFycmF5ICovCgkJCXZhciBpZHggPSAkLmluQXJyYXkoIHNldHRpbmdzLCBEYXRhVGFibGUuc2V0dGluZ3MgKTsKCQkJaWYgKCBpZHggIT09IC0xICkgewoJCQkJRGF0YVRhYmxlLnNldHRpbmdzLnNwbGljZSggaWR4LCAxICk7CgkJCX0KCQl9ICk7Cgl9ICk7CgkKCQoJLy8gQWRkIHRoZSBgZXZlcnkoKWAgbWV0aG9kIGZvciByb3dzLCBjb2x1bW5zIGFuZCBjZWxscyBpbiBhIGNvbXBhY3QgZm9ybQoJJC5lYWNoKCBbICdjb2x1bW4nLCAncm93JywgJ2NlbGwnIF0sIGZ1bmN0aW9uICggaSwgdHlwZSApIHsKCQlfYXBpX3JlZ2lzdGVyKCB0eXBlKydzKCkuZXZlcnkoKScsIGZ1bmN0aW9uICggZm4gKSB7CgkJCXZhciBvcHRzID0gdGhpcy5zZWxlY3Rvci5vcHRzOwoJCQl2YXIgYXBpID0gdGhpczsKCQoJCQlyZXR1cm4gdGhpcy5pdGVyYXRvciggdHlwZSwgZnVuY3Rpb24gKCBzZXR0aW5ncywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCApIHsKCQkJCS8vIFJvd3MgYW5kIGNvbHVtbnM6CgkJCQkvLyAgYXJnMSAtIGluZGV4CgkJCQkvLyAgYXJnMiAtIHRhYmxlIGNvdW50ZXIKCQkJCS8vICBhcmczIC0gbG9vcCBjb3VudGVyCgkJCQkvLyAgYXJnNCAtIHVuZGVmaW5lZAoJCQkJLy8gQ2VsbHM6CgkJCQkvLyAgYXJnMSAtIHJvdyBpbmRleAoJCQkJLy8gIGFyZzIgLSBjb2x1bW4gaW5kZXgKCQkJCS8vICBhcmczIC0gdGFibGUgY291bnRlcgoJCQkJLy8gIGFyZzQgLSBsb29wIGNvdW50ZXIKCQkJCWZuLmNhbGwoCgkJCQkJYXBpWyB0eXBlIF0oCgkJCQkJCWFyZzEsCgkJCQkJCXR5cGU9PT0nY2VsbCcgPyBhcmcyIDogb3B0cywKCQkJCQkJdHlwZT09PSdjZWxsJyA/IG9wdHMgOiB1bmRlZmluZWQKCQkJCQkpLAoJCQkJCWFyZzEsIGFyZzIsIGFyZzMsIGFyZzQKCQkJCSk7CgkJCX0gKTsKCQl9ICk7Cgl9ICk7CgkKCQoJLy8gaTE4biBtZXRob2QgZm9yIGV4dGVuc2lvbnMgdG8gYmUgYWJsZSB0byB1c2UgdGhlIGxhbmd1YWdlIG9iamVjdCBmcm9tIHRoZQoJLy8gRGF0YVRhYmxlCglfYXBpX3JlZ2lzdGVyKCAnaTE4bigpJywgZnVuY3Rpb24gKCB0b2tlbiwgZGVmLCBwbHVyYWwgKSB7CgkJdmFyIGN0eCA9IHRoaXMuY29udGV4dFswXTsKCQl2YXIgcmVzb2x2ZWQgPSBfZm5HZXRPYmplY3REYXRhRm4oIHRva2VuICkoIGN0eC5vTGFuZ3VhZ2UgKTsKCQoJCWlmICggcmVzb2x2ZWQgPT09IHVuZGVmaW5lZCApIHsKCQkJcmVzb2x2ZWQgPSBkZWY7CgkJfQoJCgkJaWYgKCBwbHVyYWwgIT09IHVuZGVmaW5lZCAmJiAkLmlzUGxhaW5PYmplY3QoIHJlc29sdmVkICkgKSB7CgkJCXJlc29sdmVkID0gcmVzb2x2ZWRbIHBsdXJhbCBdICE9PSB1bmRlZmluZWQgPwoJCQkJcmVzb2x2ZWRbIHBsdXJhbCBdIDoKCQkJCXJlc29sdmVkLl87CgkJfQoJCgkJcmV0dXJuIHJlc29sdmVkLnJlcGxhY2UoICclZCcsIHBsdXJhbCApOyAvLyBuYjogcGx1cmFsIG1pZ2h0IGJlIHVuZGVmaW5lZCwKCX0gKTsJCgkvKioKCSAqIFZlcnNpb24gc3RyaW5nIGZvciBwbHVnLWlucyB0byBjaGVjayBjb21wYXRpYmlsaXR5LiBBbGxvd2VkIGZvcm1hdCBpcwoJICogYGEuYi5jLWRgIHdoZXJlOiBhOmludCwgYjppbnQsIGM6aW50LCBkOnN0cmluZyhkZXZ8YmV0YXxhbHBoYSkuIGBkYCBpcyB1c2VkCgkgKiBvbmx5IGZvciBub24tcmVsZWFzZSBidWlsZHMuIFNlZSBodHRwOi8vc2VtdmVyLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCgkgKiAgQG1lbWJlcgoJICogIEB0eXBlIHN0cmluZwoJICogIEBkZWZhdWx0IFZlcnNpb24gbnVtYmVyCgkgKi8KCURhdGFUYWJsZS52ZXJzaW9uID0gIjEuMTIuMSI7CgkKCS8qKgoJICogUHJpdmF0ZSBkYXRhIHN0b3JlLCBjb250YWluaW5nIGFsbCBvZiB0aGUgc2V0dGluZ3Mgb2JqZWN0cyB0aGF0IGFyZQoJICogY3JlYXRlZCBmb3IgdGhlIHRhYmxlcyBvbiBhIGdpdmVuIHBhZ2UuCgkgKgoJICogTm90ZSB0aGF0IHRoZSBgRGF0YVRhYmxlLnNldHRpbmdzYCBvYmplY3QgaXMgYWxpYXNlZCB0bwoJICogYGpRdWVyeS5mbi5kYXRhVGFibGVFeHRgIHRocm91Z2ggd2hpY2ggaXQgbWF5IGJlIGFjY2Vzc2VkIGFuZAoJICogbWFuaXB1bGF0ZWQsIG9yIGBqUXVlcnkuZm4uZGF0YVRhYmxlLnNldHRpbmdzYC4KCSAqICBAbWVtYmVyCgkgKiAgQHR5cGUgYXJyYXkKCSAqICBAZGVmYXVsdCBbXQoJICogIEBwcml2YXRlCgkgKi8KCURhdGFUYWJsZS5zZXR0aW5ncyA9IFtdOwoJCgkvKioKCSAqIE9iamVjdCBtb2RlbHMgY29udGFpbmVyLCBmb3IgdGhlIHZhcmlvdXMgbW9kZWxzIHRoYXQgRGF0YVRhYmxlcyBoYXMKCSAqIGF2YWlsYWJsZSB0byBpdC4gVGhlc2UgbW9kZWxzIGRlZmluZSB0aGUgb2JqZWN0cyB0aGF0IGFyZSB1c2VkIHRvIGhvbGQKCSAqIHRoZSBhY3RpdmUgc3RhdGUgYW5kIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhYmxlLgoJICogIEBuYW1lc3BhY2UKCSAqLwoJRGF0YVRhYmxlLm1vZGVscyA9IHt9OwoJCgkKCQoJLyoqCgkgKiBUZW1wbGF0ZSBvYmplY3QgZm9yIHRoZSB3YXkgaW4gd2hpY2ggRGF0YVRhYmxlcyBob2xkcyBpbmZvcm1hdGlvbiBhYm91dAoJICogc2VhcmNoIGluZm9ybWF0aW9uIGZvciB0aGUgZ2xvYmFsIGZpbHRlciBhbmQgaW5kaXZpZHVhbCBjb2x1bW4gZmlsdGVycy4KCSAqICBAbmFtZXNwYWNlCgkgKi8KCURhdGFUYWJsZS5tb2RlbHMub1NlYXJjaCA9IHsKCQkvKioKCQkgKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBmaWx0ZXJpbmcgc2hvdWxkIGJlIGNhc2UgaW5zZW5zaXRpdmUgb3Igbm90CgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgdHJ1ZQoJCSAqLwoJCSJiQ2FzZUluc2Vuc2l0aXZlIjogdHJ1ZSwKCQoJCS8qKgoJCSAqIEFwcGxpZWQgc2VhcmNoIHRlcm0KCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IDxpPkVtcHR5IHN0cmluZzwvaT4KCQkgKi8KCQkic1NlYXJjaCI6ICIiLAoJCgkJLyoqCgkJICogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgc2VhcmNoIHRlcm0gc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEKCQkgKiByZWd1bGFyIGV4cHJlc3Npb24gKHRydWUpIG9yIG5vdCAoZmFsc2UpIGFuZCB0aGVyZWZvcmUgYW5kIHNwZWNpYWwKCQkgKiByZWdleCBjaGFyYWN0ZXJzIGVzY2FwZWQuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgZmFsc2UKCQkgKi8KCQkiYlJlZ2V4IjogZmFsc2UsCgkKCQkvKioKCQkgKiBGbGFnIHRvIGluZGljYXRlIGlmIERhdGFUYWJsZXMgaXMgdG8gdXNlIGl0cyBzbWFydCBmaWx0ZXJpbmcgb3Igbm90LgoJCSAqICBAdHlwZSBib29sZWFuCgkJICogIEBkZWZhdWx0IHRydWUKCQkgKi8KCQkiYlNtYXJ0IjogdHJ1ZSwKCQoJCS8qKgoJCSAqIEZsYWcgdG8gaW5kaWNhdGUgaWYgRGF0YVRhYmxlcyBzaG91bGQgb25seSB0cmlnZ2VyIGEgc2VhcmNoIHdoZW4KCQkgKiB0aGUgcmV0dXJuIGtleSBpcyBwcmVzc2VkLgoJCSAqICBAdHlwZSBib29sZWFuCgkJICogIEBkZWZhdWx0IGZhbHNlCgkJICovCgkJInJldHVybiI6IGZhbHNlCgl9OwoJCgkKCQoJCgkvKioKCSAqIFRlbXBsYXRlIG9iamVjdCBmb3IgdGhlIHdheSBpbiB3aGljaCBEYXRhVGFibGVzIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0CgkgKiBlYWNoIGluZGl2aWR1YWwgcm93LiBUaGlzIGlzIHRoZSBvYmplY3QgZm9ybWF0IHVzZWQgZm9yIHRoZSBzZXR0aW5ncwoJICogYW9EYXRhIGFycmF5LgoJICogIEBuYW1lc3BhY2UKCSAqLwoJRGF0YVRhYmxlLm1vZGVscy5vUm93ID0gewoJCS8qKgoJCSAqIFRSIGVsZW1lbnQgZm9yIHRoZSByb3cKCQkgKiAgQHR5cGUgbm9kZQoJCSAqICBAZGVmYXVsdCBudWxsCgkJICovCgkJIm5UciI6IG51bGwsCgkKCQkvKioKCQkgKiBBcnJheSBvZiBURCBlbGVtZW50cyBmb3IgZWFjaCByb3cuIFRoaXMgaXMgbnVsbCB1bnRpbCB0aGUgcm93IGhhcyBiZWVuCgkJICogY3JlYXRlZC4KCQkgKiAgQHR5cGUgYXJyYXkgbm9kZXMKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW5DZWxscyI6IG51bGwsCgkKCQkvKioKCQkgKiBEYXRhIG9iamVjdCBmcm9tIHRoZSBvcmlnaW5hbCBkYXRhIHNvdXJjZSBmb3IgdGhlIHJvdy4gVGhpcyBpcyBlaXRoZXIKCQkgKiBhbiBhcnJheSBpZiB1c2luZyB0aGUgdHJhZGl0aW9uYWwgZm9ybSBvZiBEYXRhVGFibGVzLCBvciBhbiBvYmplY3QgaWYKCQkgKiB1c2luZyBtRGF0YSBvcHRpb25zLiBUaGUgZXhhY3QgdHlwZSB3aWxsIGRlcGVuZCBvbiB0aGUgcGFzc2VkIGluCgkJICogZGF0YSBmcm9tIHRoZSBkYXRhIHNvdXJjZSwgb3Igd2lsbCBiZSBhbiBhcnJheSBpZiB1c2luZyBET00gYSBkYXRhCgkJICogc291cmNlLgoJCSAqICBAdHlwZSBhcnJheXxvYmplY3QKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiX2FEYXRhIjogW10sCgkKCQkvKioKCQkgKiBTb3J0aW5nIGRhdGEgY2FjaGUgLSB0aGlzIGFycmF5IGlzIG9zdGVuc2libHkgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZQoJCSAqIG51bWJlciBvZiBjb2x1bW5zIChhbHRob3VnaCBlYWNoIGluZGV4IGlzIGdlbmVyYXRlZCBvbmx5IGFzIGl0IGlzCgkJICogbmVlZGVkKSwgYW5kIGhvbGRzIHRoZSBkYXRhIHRoYXQgaXMgdXNlZCBmb3Igc29ydGluZyBlYWNoIGNvbHVtbiBpbiB0aGUKCQkgKiByb3cuIFdlIGRvIHRoaXMgY2FjaGUgZ2VuZXJhdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHNvcnQgaW4gb3JkZXIgdGhhdAoJCSAqIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzb3J0IGRhdGEgbmVlZCBiZSBkb25lIG9ubHkgb25jZSBmb3IgZWFjaCBjZWxsCgkJICogcGVyIHNvcnQuIFRoaXMgYXJyYXkgc2hvdWxkIG5vdCBiZSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBieSBhbnl0aGluZwoJCSAqIG90aGVyIHRoYW4gdGhlIG1hc3RlciBzb3J0aW5nIG1ldGhvZHMuCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IG51bGwKCQkgKiAgQHByaXZhdGUKCQkgKi8KCQkiX2FTb3J0RGF0YSI6IG51bGwsCgkKCQkvKioKCQkgKiBQZXIgY2VsbCBmaWx0ZXJpbmcgZGF0YSBjYWNoZS4gQXMgcGVyIHRoZSBzb3J0IGRhdGEgY2FjaGUsIHVzZWQgdG8KCQkgKiBpbmNyZWFzZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZpbHRlcmluZyBpbiBEYXRhVGFibGVzCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IG51bGwKCQkgKiAgQHByaXZhdGUKCQkgKi8KCQkiX2FGaWx0ZXJEYXRhIjogbnVsbCwKCQoJCS8qKgoJCSAqIEZpbHRlcmluZyBkYXRhIGNhY2hlLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBjZWxsIGZpbHRlcmluZyBjYWNoZSwgYnV0CgkJICogaW4gdGhpcyBjYXNlIGEgc3RyaW5nIHJhdGhlciB0aGFuIGFuIGFycmF5LiBUaGlzIGlzIGVhc2lseSBjb21wdXRlZCB3aXRoCgkJICogYSBqb2luIG9uIGBfYUZpbHRlckRhdGFgLCBidXQgaXMgcHJvdmlkZWQgYXMgYSBjYWNoZSBzbyB0aGUgam9pbiBpc24ndAoJCSAqIG5lZWRlZCBvbiBldmVyeSBzZWFyY2ggKG1lbW9yeSB0cmFkZWQgZm9yIHBlcmZvcm1hbmNlKQoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBudWxsCgkJICogIEBwcml2YXRlCgkJICovCgkJIl9zRmlsdGVyUm93IjogbnVsbCwKCQoJCS8qKgoJCSAqIENhY2hlIG9mIHRoZSBjbGFzcyBuYW1lIHRoYXQgRGF0YVRhYmxlcyBoYXMgYXBwbGllZCB0byB0aGUgcm93LCBzbyB3ZQoJCSAqIGNhbiBxdWlja2x5IGxvb2sgYXQgdGhpcyB2YXJpYWJsZSByYXRoZXIgdGhhbiBuZWVkaW5nIHRvIGRvIGEgRE9NIGNoZWNrCgkJICogb24gY2xhc3NOYW1lIGZvciB0aGUgblRyIHByb3BlcnR5LgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgPGk+RW1wdHkgc3RyaW5nPC9pPgoJCSAqICBAcHJpdmF0ZQoJCSAqLwoJCSJfc1Jvd1N0cmlwZSI6ICIiLAoJCgkJLyoqCgkJICogRGVub3RlIGlmIHRoZSBvcmlnaW5hbCBkYXRhIHNvdXJjZSB3YXMgZnJvbSB0aGUgRE9NLCBvciB0aGUgZGF0YSBzb3VyY2UKCQkgKiBvYmplY3QuIFRoaXMgaXMgdXNlZCBmb3IgaW52YWxpZGF0aW5nIGRhdGEsIHNvIERhdGFUYWJsZXMgY2FuCgkJICogYXV0b21hdGljYWxseSByZWFkIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlLCB1bmxlc3MgdW5pbnN0cnVjdGVkCgkJICogb3RoZXJ3aXNlLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqICBAcHJpdmF0ZQoJCSAqLwoJCSJzcmMiOiBudWxsLAoJCgkJLyoqCgkJICogSW5kZXggaW4gdGhlIGFvRGF0YSBhcnJheS4gVGhpcyBzYXZlcyBhbiBpbmRleE9mIGxvb2t1cCB3aGVuIHdlIGhhdmUgdGhlCgkJICogb2JqZWN0LCBidXQgd2FudCB0byBrbm93IHRoZSBpbmRleAoJCSAqICBAdHlwZSBpbnRlZ2VyCgkJICogIEBkZWZhdWx0IC0xCgkJICogIEBwcml2YXRlCgkJICovCgkJImlkeCI6IC0xCgl9OwoJCgkKCS8qKgoJICogVGVtcGxhdGUgb2JqZWN0IGZvciB0aGUgY29sdW1uIGluZm9ybWF0aW9uIG9iamVjdCBpbiBEYXRhVGFibGVzLiBUaGlzIG9iamVjdAoJICogaXMgaGVsZCBpbiB0aGUgc2V0dGluZ3MgYW9Db2x1bW5zIGFycmF5IGFuZCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIHRoYXQKCSAqIERhdGFUYWJsZXMgbmVlZHMgYWJvdXQgZWFjaCBpbmRpdmlkdWFsIGNvbHVtbi4KCSAqCgkgKiBOb3RlIHRoYXQgdGhpcyBvYmplY3QgaXMgcmVsYXRlZCB0byB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzLmNvbHVtbn0KCSAqIGJ1dCB0aGlzIG9uZSBpcyB0aGUgaW50ZXJuYWwgZGF0YSBzdG9yZSBmb3IgRGF0YVRhYmxlcydzIGNhY2hlIG9mIGNvbHVtbnMuCgkgKiBJdCBzaG91bGQgTk9UIGJlIG1hbmlwdWxhdGVkIG91dHNpZGUgb2YgRGF0YVRhYmxlcy4gQW55IGNvbmZpZ3VyYXRpb24gc2hvdWxkCgkgKiBiZSBkb25lIHRocm91Z2ggdGhlIGluaXRpYWxpc2F0aW9uIG9wdGlvbnMuCgkgKiAgQG5hbWVzcGFjZQoJICovCglEYXRhVGFibGUubW9kZWxzLm9Db2x1bW4gPSB7CgkJLyoqCgkJICogQ29sdW1uIGluZGV4LiBUaGlzIGNvdWxkIGJlIHdvcmtlZCBvdXQgb24tdGhlLWZseSB3aXRoICQuaW5BcnJheSwgYnV0IGl0CgkJICogaXMgZmFzdGVyIHRvIGp1c3QgaG9sZCBpdCBhcyBhIHZhcmlhYmxlCgkJICogIEB0eXBlIGludGVnZXIKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJpZHgiOiBudWxsLAoJCgkJLyoqCgkJICogQSBsaXN0IG9mIHRoZSBjb2x1bW5zIHRoYXQgc29ydGluZyBzaG91bGQgb2NjdXIgb24gd2hlbiB0aGlzIGNvbHVtbgoJCSAqIGlzIHNvcnRlZC4gVGhhdCB0aGlzIHByb3BlcnR5IGlzIGFuIGFycmF5IGFsbG93cyBtdWx0aS1jb2x1bW4gc29ydGluZwoJCSAqIHRvIGJlIGRlZmluZWQgZm9yIGEgY29sdW1uIChmb3IgZXhhbXBsZSBmaXJzdCBuYW1lIC8gbGFzdCBuYW1lIGNvbHVtbnMKCQkgKiB3b3VsZCBiZW5lZml0IGZyb20gdGhpcykuIFRoZSB2YWx1ZXMgYXJlIGludGVnZXJzIHBvaW50aW5nIHRvIHRoZQoJCSAqIGNvbHVtbnMgdG8gYmUgc29ydGVkIG9uICh0eXBpY2FsbHkgaXQgd2lsbCBiZSBhIHNpbmdsZSBpbnRlZ2VyIHBvaW50aW5nCgkJICogYXQgaXRzZWxmLCBidXQgdGhhdCBkb2Vzbid0IG5lZWQgdG8gYmUgdGhlIGNhc2UpLgoJCSAqICBAdHlwZSBhcnJheQoJCSAqLwoJCSJhRGF0YVNvcnQiOiBudWxsLAoJCgkJLyoqCgkJICogRGVmaW5lIHRoZSBzb3J0aW5nIGRpcmVjdGlvbnMgdGhhdCBhcmUgYXBwbGllZCB0byB0aGUgY29sdW1uLCBpbiBzZXF1ZW5jZQoJCSAqIGFzIHRoZSBjb2x1bW4gaXMgcmVwZWF0ZWRseSBzb3J0ZWQgdXBvbiAtIGkuZS4gdGhlIGZpcnN0IHZhbHVlIGlzIHVzZWQKCQkgKiBhcyB0aGUgc29ydGluZyBkaXJlY3Rpb24gd2hlbiB0aGUgY29sdW1uIGlmIGZpcnN0IHNvcnRlZCAoY2xpY2tlZCBvbikuCgkJICogU29ydCBpdCBhZ2FpbiAoY2xpY2sgYWdhaW4pIGFuZCBpdCB3aWxsIG1vdmUgb24gdG8gdGhlIG5leHQgaW5kZXguCgkJICogUmVwZWF0IHVudGlsIGxvb3AuCgkJICogIEB0eXBlIGFycmF5CgkJICovCgkJImFzU29ydGluZyI6IG51bGwsCgkKCQkvKioKCQkgKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBjb2x1bW4gaXMgc2VhcmNoYWJsZSwgYW5kIHRodXMgc2hvdWxkIGJlIGluY2x1ZGVkCgkJICogaW4gdGhlIGZpbHRlcmluZyBvciBub3QuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKi8KCQkiYlNlYXJjaGFibGUiOiBudWxsLAoJCgkJLyoqCgkJICogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlIG9yIG5vdC4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqLwoJCSJiU29ydGFibGUiOiBudWxsLAoJCgkJLyoqCgkJICogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgY29sdW1uIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB0YWJsZSBvciBub3QKCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqLwoJCSJiVmlzaWJsZSI6IG51bGwsCgkKCQkvKioKCQkgKiBTdG9yZSBmb3IgbWFudWFsIHR5cGUgYXNzaWdubWVudCB1c2luZyB0aGUgYGNvbHVtbi50eXBlYCBvcHRpb24uIFRoaXMKCQkgKiBpcyBoZWxkIGluIHN0b3JlIHNvIHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBjb2x1bW4ncyBgc1R5cGVgIHByb3BlcnR5LgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqICBAcHJpdmF0ZQoJCSAqLwoJCSJfc01hbnVhbFR5cGUiOiBudWxsLAoJCgkJLyoqCgkJICogRmxhZyB0byBpbmRpY2F0ZSBpZiBIVE1MNSBkYXRhIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGRhdGEKCQkgKiBzb3VyY2UgZm9yIGZpbHRlcmluZyBvciBzb3J0aW5nLiBUcnVlIGlzIGVpdGhlciBhcmUuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgZmFsc2UKCQkgKiAgQHByaXZhdGUKCQkgKi8KCQkiX2JBdHRyU3JjIjogZmFsc2UsCgkKCQkvKioKCQkgKiBEZXZlbG9wZXIgZGVmaW5hYmxlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIGEgY2VsbCBpcyBjcmVhdGVkIChBamF4IHNvdXJjZSwKCQkgKiBldGMpIG9yIHByb2Nlc3NlZCBmb3IgaW5wdXQgKERPTSBzb3VyY2UpLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY29tcGxpbWVudCB0byBtUmVuZGVyCgkJICogYWxsb3dpbmcgeW91IHRvIG1vZGlmeSB0aGUgRE9NIGVsZW1lbnQgKGFkZCBiYWNrZ3JvdW5kIGNvbG91ciBmb3IgZXhhbXBsZSkgd2hlbiB0aGUKCQkgKiBlbGVtZW50IGlzIGF2YWlsYWJsZS4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKiAgQHBhcmFtIHtlbGVtZW50fSBuVGQgVGhlIFREIG5vZGUgdGhhdCBoYXMgYmVlbiBjcmVhdGVkCgkJICogIEBwYXJhbSB7Kn0gc0RhdGEgVGhlIERhdGEgZm9yIHRoZSBjZWxsCgkJICogIEBwYXJhbSB7YXJyYXl8b2JqZWN0fSBvRGF0YSBUaGUgZGF0YSBmb3IgdGhlIHdob2xlIHJvdwoJCSAqICBAcGFyYW0ge2ludH0gaVJvdyBUaGUgcm93IGluZGV4IGZvciB0aGUgYW9EYXRhIGRhdGEgc3RvcmUKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJmbkNyZWF0ZWRDZWxsIjogbnVsbCwKCQoJCS8qKgoJCSAqIEZ1bmN0aW9uIHRvIGdldCBkYXRhIGZyb20gYSBjZWxsIGluIGEgY29sdW1uLiBZb3Ugc2hvdWxkIDxiPm5ldmVyPC9iPgoJCSAqIGFjY2VzcyBkYXRhIGRpcmVjdGx5IHRocm91Z2ggX2FEYXRhIGludGVybmFsbHkgaW4gRGF0YVRhYmxlcyAtIGFsd2F5cyB1c2UKCQkgKiB0aGUgbWV0aG9kIGF0dGFjaGVkIHRvIHRoaXMgcHJvcGVydHkuIEl0IGFsbG93cyBtRGF0YSB0byBmdW5jdGlvbiBhcwoJCSAqIHJlcXVpcmVkLiBUaGlzIGZ1bmN0aW9uIGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgYnkgdGhlIGNvbHVtbgoJCSAqIGluaXRpYWxpc2F0aW9uIG1ldGhvZAoJCSAqICBAdHlwZSBmdW5jdGlvbgoJCSAqICBAcGFyYW0ge2FycmF5fG9iamVjdH0gb0RhdGEgVGhlIGRhdGEgYXJyYXkvb2JqZWN0IGZvciB0aGUgYXJyYXkKCQkgKiAgICAoaS5lLiBhb0RhdGFbXS5fYURhdGEpCgkJICogIEBwYXJhbSB7c3RyaW5nfSBzU3BlY2lmaWMgVGhlIHNwZWNpZmljIGRhdGEgdHlwZSB5b3Ugd2FudCB0byBnZXQgLQoJCSAqICAgICdkaXNwbGF5JywgJ3R5cGUnICdmaWx0ZXInICdzb3J0JwoJCSAqICBAcmV0dXJucyB7Kn0gVGhlIGRhdGEgZm9yIHRoZSBjZWxsIGZyb20gdGhlIGdpdmVuIHJvdydzIGRhdGEKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJmbkdldERhdGEiOiBudWxsLAoJCgkJLyoqCgkJICogRnVuY3Rpb24gdG8gc2V0IGRhdGEgZm9yIGEgY2VsbCBpbiB0aGUgY29sdW1uLiBZb3Ugc2hvdWxkIDxiPm5ldmVyPC9iPgoJCSAqIHNldCB0aGUgZGF0YSBkaXJlY3RseSB0byBfYURhdGEgaW50ZXJuYWxseSBpbiBEYXRhVGFibGVzIC0gYWx3YXlzIHVzZQoJCSAqIHRoaXMgbWV0aG9kLiBJdCBhbGxvd3MgbURhdGEgdG8gZnVuY3Rpb24gYXMgcmVxdWlyZWQuIFRoaXMgZnVuY3Rpb24KCQkgKiBpcyBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGJ5IHRoZSBjb2x1bW4gaW5pdGlhbGlzYXRpb24gbWV0aG9kCgkJICogIEB0eXBlIGZ1bmN0aW9uCgkJICogIEBwYXJhbSB7YXJyYXl8b2JqZWN0fSBvRGF0YSBUaGUgZGF0YSBhcnJheS9vYmplY3QgZm9yIHRoZSBhcnJheQoJCSAqICAgIChpLmUuIGFvRGF0YVtdLl9hRGF0YSkKCQkgKiAgQHBhcmFtIHsqfSBzVmFsdWUgVmFsdWUgdG8gc2V0CgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkiZm5TZXREYXRhIjogbnVsbCwKCQoJCS8qKgoJCSAqIFByb3BlcnR5IHRvIHJlYWQgdGhlIHZhbHVlIGZvciB0aGUgY2VsbHMgaW4gdGhlIGNvbHVtbiBmcm9tIHRoZSBkYXRhCgkJICogc291cmNlIGFycmF5IC8gb2JqZWN0LiBJZiBudWxsLCB0aGVuIHRoZSBkZWZhdWx0IGNvbnRlbnQgaXMgdXNlZCwgaWYgYQoJCSAqIGZ1bmN0aW9uIGlzIGdpdmVuIHRoZW4gdGhlIHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbiBpcyB1c2VkLgoJCSAqICBAdHlwZSBmdW5jdGlvbnxpbnR8c3RyaW5nfG51bGwKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJtRGF0YSI6IG51bGwsCgkKCQkvKioKCQkgKiBQYXJ0bmVyIHByb3BlcnR5IHRvIG1EYXRhIHdoaWNoIGlzIHVzZWQgKG9ubHkgd2hlbiBkZWZpbmVkKSB0byBnZXQKCQkgKiB0aGUgZGF0YSAtIGkuZS4gaXQgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIG1EYXRhLCBidXQgd2l0aG91dCB0aGUKCQkgKiAnc2V0JyBvcHRpb24sIGFuZCBhbHNvIHRoZSBkYXRhIGZlZCB0byBpdCBpcyB0aGUgcmVzdWx0IGZyb20gbURhdGEuCgkJICogVGhpcyBpcyB0aGUgcmVuZGVyaW5nIG1ldGhvZCB0byBtYXRjaCB0aGUgZGF0YSBtZXRob2Qgb2YgbURhdGEuCgkJICogIEB0eXBlIGZ1bmN0aW9ufGludHxzdHJpbmd8bnVsbAoJCSAqICBAZGVmYXVsdCBudWxsCgkJICovCgkJIm1SZW5kZXIiOiBudWxsLAoJCgkJLyoqCgkJICogVW5pcXVlIGhlYWRlciBUSC9URCBlbGVtZW50IGZvciB0aGlzIGNvbHVtbiAtIHRoaXMgaXMgd2hhdCB0aGUgc29ydGluZwoJCSAqIGxpc3RlbmVyIGlzIGF0dGFjaGVkIHRvIChpZiBzb3J0aW5nIGlzIGVuYWJsZWQuKQoJCSAqICBAdHlwZSBub2RlCgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkiblRoIjogbnVsbCwKCQoJCS8qKgoJCSAqIFVuaXF1ZSBmb290ZXIgVEgvVEQgZWxlbWVudCBmb3IgdGhpcyBjb2x1bW4gKGlmIHRoZXJlIGlzIG9uZSkuIE5vdCB1c2VkCgkJICogaW4gRGF0YVRhYmxlcyBhcyBzdWNoLCBidXQgY2FuIGJlIHVzZWQgZm9yIHBsdWctaW5zIHRvIHJlZmVyZW5jZSB0aGUKCQkgKiBmb290ZXIgZm9yIGVhY2ggY29sdW1uLgoJCSAqICBAdHlwZSBub2RlCgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkiblRmIjogbnVsbCwKCQoJCS8qKgoJCSAqIFRoZSBjbGFzcyB0byBhcHBseSB0byBhbGwgVEQgZWxlbWVudHMgaW4gdGhlIHRhYmxlJ3MgVEJPRFkgZm9yIHRoZSBjb2x1bW4KCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkic0NsYXNzIjogbnVsbCwKCQoJCS8qKgoJCSAqIFdoZW4gRGF0YVRhYmxlcyBjYWxjdWxhdGVzIHRoZSBjb2x1bW4gd2lkdGhzIHRvIGFzc2lnbiB0byBlYWNoIGNvbHVtbiwKCQkgKiBpdCBmaW5kcyB0aGUgbG9uZ2VzdCBzdHJpbmcgaW4gZWFjaCBjb2x1bW4gYW5kIHRoZW4gY29uc3RydWN0cyBhCgkJICogdGVtcG9yYXJ5IHRhYmxlIGFuZCByZWFkcyB0aGUgd2lkdGhzIGZyb20gdGhhdC4gVGhlIHByb2JsZW0gd2l0aCB0aGlzCgkJICogaXMgdGhhdCAibW1tIiBpcyBtdWNoIHdpZGVyIHRoZW4gImlpaWkiLCBidXQgdGhlIGxhdHRlciBpcyBhIGxvbmdlcgoJCSAqIHN0cmluZyAtIHRodXMgdGhlIGNhbGN1bGF0aW9uIGNhbiBnbyB3cm9uZyAoZG9pbmcgaXQgcHJvcGVybHkgYW5kIHB1dHRpbmcKCQkgKiBpdCBpbnRvIGFuIERPTSBvYmplY3QgYW5kIG1lYXN1cmluZyB0aGF0IGlzIGhvcnJpYmx5KCEpIHNsb3cpLiBUaHVzIGFzCgkJICogYSAid29yayBhcm91bmQiIHdlIHByb3ZpZGUgdGhpcyBvcHRpb24uIEl0IHdpbGwgYXBwZW5kIGl0cyB2YWx1ZSB0byB0aGUKCQkgKiB0ZXh0IHRoYXQgaXMgZm91bmQgdG8gYmUgdGhlIGxvbmdlc3Qgc3RyaW5nIGZvciB0aGUgY29sdW1uIC0gaS5lLiBwYWRkaW5nLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKi8KCQkic0NvbnRlbnRQYWRkaW5nIjogbnVsbCwKCQoJCS8qKgoJCSAqIEFsbG93cyBhIGRlZmF1bHQgdmFsdWUgdG8gYmUgZ2l2ZW4gZm9yIGEgY29sdW1uJ3MgZGF0YSwgYW5kIHdpbGwgYmUgdXNlZAoJCSAqIHdoZW5ldmVyIGEgbnVsbCBkYXRhIHNvdXJjZSBpcyBlbmNvdW50ZXJlZCAodGhpcyBjYW4gYmUgYmVjYXVzZSBtRGF0YQoJCSAqIGlzIHNldCB0byBudWxsLCBvciBiZWNhdXNlIHRoZSBkYXRhIHNvdXJjZSBpdHNlbGYgaXMgbnVsbCkuCgkJICogIEB0eXBlIHN0cmluZwoJCSAqICBAZGVmYXVsdCBudWxsCgkJICovCgkJInNEZWZhdWx0Q29udGVudCI6IG51bGwsCgkKCQkvKioKCQkgKiBOYW1lIGZvciB0aGUgY29sdW1uLCBhbGxvd2luZyByZWZlcmVuY2UgdG8gdGhlIGNvbHVtbiBieSBuYW1lIGFzIHdlbGwgYXMKCQkgKiBieSBpbmRleCAobmVlZHMgYSBsb29rdXAgdG8gd29yayBieSBuYW1lKS4KCQkgKiAgQHR5cGUgc3RyaW5nCgkJICovCgkJInNOYW1lIjogbnVsbCwKCQoJCS8qKgoJCSAqIEN1c3RvbSBzb3J0aW5nIGRhdGEgdHlwZSAtIGRlZmluZXMgd2hpY2ggb2YgdGhlIGF2YWlsYWJsZSBwbHVnLWlucyBpbgoJCSAqIGFmblNvcnREYXRhIHRoZSBjdXN0b20gc29ydGluZyB3aWxsIHVzZSAtIGlmIGFueSBpcyBkZWZpbmVkLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgc3RkCgkJICovCgkJInNTb3J0RGF0YVR5cGUiOiAnc3RkJywKCQoJCS8qKgoJCSAqIENsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGhlYWRlciBlbGVtZW50IHdoZW4gc29ydGluZyBvbiB0aGlzIGNvbHVtbgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJzU29ydGluZ0NsYXNzIjogbnVsbCwKCQoJCS8qKgoJCSAqIENsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGhlYWRlciBlbGVtZW50IHdoZW4gc29ydGluZyBvbiB0aGlzIGNvbHVtbiAtCgkJICogd2hlbiBqUXVlcnkgVUkgdGhlbWluZyBpcyB1c2VkLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJzU29ydGluZ0NsYXNzSlVJIjogbnVsbCwKCQoJCS8qKgoJCSAqIFRpdGxlIG9mIHRoZSBjb2x1bW4gLSB3aGF0IGlzIHNlZW4gaW4gdGhlIFRIIGVsZW1lbnQgKG5UaCkuCgkJICogIEB0eXBlIHN0cmluZwoJCSAqLwoJCSJzVGl0bGUiOiBudWxsLAoJCgkJLyoqCgkJICogQ29sdW1uIHNvcnRpbmcgYW5kIGZpbHRlcmluZyB0eXBlCgkJICogIEB0eXBlIHN0cmluZwoJCSAqICBAZGVmYXVsdCBudWxsCgkJICovCgkJInNUeXBlIjogbnVsbCwKCQoJCS8qKgoJCSAqIFdpZHRoIG9mIHRoZSBjb2x1bW4KCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkic1dpZHRoIjogbnVsbCwKCQoJCS8qKgoJCSAqIFdpZHRoIG9mIHRoZSBjb2x1bW4gd2hlbiBpdCB3YXMgZmlyc3QgImVuY291bnRlcmVkIgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJzV2lkdGhPcmlnIjogbnVsbAoJfTsKCQoJCgkvKgoJICogRGV2ZWxvcGVyIG5vdGU6IFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgYmVsb3cgYXJlIGdpdmVuIGluIEh1bmdhcmlhbgoJICogbm90YXRpb24sIHRoYXQgd2FzIHVzZWQgYXMgdGhlIGludGVyZmFjZSBmb3IgRGF0YVRhYmxlcyBwcmlvciB0byB2MS4xMCwgaG93ZXZlcgoJICogZnJvbSB2MS4xMCBvbndhcmRzIHRoZSBwcmltYXJ5IGludGVyZmFjZSBpcyBjYW1lbCBjYXNlLiBJbiBvcmRlciB0byBhdm9pZAoJICogYnJlYWtpbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdXR0ZXJseSB3aXRoIHRoaXMgY2hhbmdlLCB0aGUgSHVuZ2FyaWFuCgkgKiB2ZXJzaW9uIGlzIHN0aWxsLCBpbnRlcm5hbGx5IHRoZSBwcmltYXJ5IGludGVyZmFjZSwgYnV0IGlzIGlzIG5vdCBkb2N1bWVudGVkCgkgKiAtIGhlbmNlIHRoZSBAbmFtZSB0YWdzIGluIGVhY2ggZG9jIGNvbW1lbnQuIFRoaXMgYWxsb3dzIGEgSmF2YXNjcmlwdCBmdW5jdGlvbgoJICogdG8gY3JlYXRlIGEgbWFwIGZyb20gSHVuZ2FyaWFuIG5vdGF0aW9uIHRvIGNhbWVsIGNhc2UgKGdvaW5nIHRoZSBvdGhlciBkaXJlY3Rpb24KCSAqIHdvdWxkIHJlcXVpcmUgZWFjaCBwcm9wZXJ0eSB0byBiZSBsaXN0ZWQsIHdoaWNoIHdvdWxkIGFkZCBhcm91bmQgM0sgdG8gdGhlIHNpemUKCSAqIG9mIERhdGFUYWJsZXMsIHdoaWxlIHRoaXMgbWV0aG9kIGlzIGFib3V0IGEgMC41SyBoaXQpLgoJICoKCSAqIFVsdGltYXRlbHkgdGhpcyBkb2VzIHBhdmUgdGhlIHdheSBmb3IgSHVuZ2FyaWFuIG5vdGF0aW9uIHRvIGJlIGRyb3BwZWQKCSAqIGNvbXBsZXRlbHksIGJ1dCB0aGF0IGlzIGEgbWFzc2l2ZSBhbW91bnQgb2Ygd29yayBhbmQgd2lsbCBicmVhayBjdXJyZW50CgkgKiBpbnN0YWxscyAodGhlcmVmb3JlIGlzIG9uLWhvbGQgdW50aWwgdjIpLgoJICovCgkKCS8qKgoJICogSW5pdGlhbGlzYXRpb24gb3B0aW9ucyB0aGF0IGNhbiBiZSBnaXZlbiB0byBEYXRhVGFibGVzIGF0IGluaXRpYWxpc2F0aW9uCgkgKiB0aW1lLgoJICogIEBuYW1lc3BhY2UKCSAqLwoJRGF0YVRhYmxlLmRlZmF1bHRzID0gewoJCS8qKgoJCSAqIEFuIGFycmF5IG9mIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFibGUsIHBhc3NlZCBpbiBhdCBpbml0aWFsaXNhdGlvbiB3aGljaAoJCSAqIHdpbGwgYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIGFueSBkYXRhIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIERPTS4gVGhpcyBpcwoJCSAqIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGNvbnN0cnVjdGluZyB0YWJsZXMgcHVyZWx5IGluIEphdmFzY3JpcHQsIGZvcgoJCSAqIGV4YW1wbGUgd2l0aCBhIGN1c3RvbSBBamF4IGNhbGwuCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IG51bGwKCQkgKgoJCSAqICBAZHRvcHQgT3B0aW9uCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5kYXRhCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBVc2luZyBhIDJEIGFycmF5IGRhdGEgc291cmNlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uICgpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJkYXRhIjogWwoJCSAqICAgICAgICAgIFsnVHJpZGVudCcsICdJbnRlcm5ldCBFeHBsb3JlciA0LjAnLCAnV2luIDk1KycsIDQsICdYJ10sCgkJICogICAgICAgICAgWydUcmlkZW50JywgJ0ludGVybmV0IEV4cGxvcmVyIDUuMCcsICdXaW4gOTUrJywgNSwgJ0MnXSwKCQkgKiAgICAgICAgXSwKCQkgKiAgICAgICAgImNvbHVtbnMiOiBbCgkJICogICAgICAgICAgeyAidGl0bGUiOiAiRW5naW5lIiB9LAoJCSAqICAgICAgICAgIHsgInRpdGxlIjogIkJyb3dzZXIiIH0sCgkJICogICAgICAgICAgeyAidGl0bGUiOiAiUGxhdGZvcm0iIH0sCgkJICogICAgICAgICAgeyAidGl0bGUiOiAiVmVyc2lvbiIgfSwKCQkgKiAgICAgICAgICB7ICJ0aXRsZSI6ICJHcmFkZSIgfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYW4gYXJyYXkgb2Ygb2JqZWN0cyBhcyBhIGRhdGEgc291cmNlIChgZGF0YWApCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uICgpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJkYXRhIjogWwoJCSAqICAgICAgICAgIHsKCQkgKiAgICAgICAgICAgICJlbmdpbmUiOiAgICJUcmlkZW50IiwKCQkgKiAgICAgICAgICAgICJicm93c2VyIjogICJJbnRlcm5ldCBFeHBsb3JlciA0LjAiLAoJCSAqICAgICAgICAgICAgInBsYXRmb3JtIjogIldpbiA5NSsiLAoJCSAqICAgICAgICAgICAgInZlcnNpb24iOiAgNCwKCQkgKiAgICAgICAgICAgICJncmFkZSI6ICAgICJYIgoJCSAqICAgICAgICAgIH0sCgkJICogICAgICAgICAgewoJCSAqICAgICAgICAgICAgImVuZ2luZSI6ICAgIlRyaWRlbnQiLAoJCSAqICAgICAgICAgICAgImJyb3dzZXIiOiAgIkludGVybmV0IEV4cGxvcmVyIDUuMCIsCgkJICogICAgICAgICAgICAicGxhdGZvcm0iOiAiV2luIDk1KyIsCgkJICogICAgICAgICAgICAidmVyc2lvbiI6ICA1LAoJCSAqICAgICAgICAgICAgImdyYWRlIjogICAgIkMiCgkJICogICAgICAgICAgfQoJCSAqICAgICAgICBdLAoJCSAqICAgICAgICAiY29sdW1ucyI6IFsKCQkgKiAgICAgICAgICB7ICJ0aXRsZSI6ICJFbmdpbmUiLCAgICJkYXRhIjogImVuZ2luZSIgfSwKCQkgKiAgICAgICAgICB7ICJ0aXRsZSI6ICJCcm93c2VyIiwgICJkYXRhIjogImJyb3dzZXIiIH0sCgkJICogICAgICAgICAgeyAidGl0bGUiOiAiUGxhdGZvcm0iLCAiZGF0YSI6ICJwbGF0Zm9ybSIgfSwKCQkgKiAgICAgICAgICB7ICJ0aXRsZSI6ICJWZXJzaW9uIiwgICJkYXRhIjogInZlcnNpb24iIH0sCgkJICogICAgICAgICAgeyAidGl0bGUiOiAiR3JhZGUiLCAgICAiZGF0YSI6ICJncmFkZSIgfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJhYURhdGEiOiBudWxsLAoJCgkKCQkvKioKCQkgKiBJZiBvcmRlcmluZyBpcyBlbmFibGVkLCB0aGVuIERhdGFUYWJsZXMgd2lsbCBwZXJmb3JtIGEgZmlyc3QgcGFzcyBzb3J0IG9uCgkJICogaW5pdGlhbGlzYXRpb24uIFlvdSBjYW4gZGVmaW5lIHdoaWNoIGNvbHVtbihzKSB0aGUgc29ydCBpcyBwZXJmb3JtZWQKCQkgKiB1cG9uLCBhbmQgdGhlIHNvcnRpbmcgZGlyZWN0aW9uLCB3aXRoIHRoaXMgdmFyaWFibGUuIFRoZSBgc29ydGluZ2AgYXJyYXkKCQkgKiBzaG91bGQgY29udGFpbiBhbiBhcnJheSBmb3IgZWFjaCBjb2x1bW4gdG8gYmUgc29ydGVkIGluaXRpYWxseSBjb250YWluaW5nCgkJICogdGhlIGNvbHVtbidzIGluZGV4IGFuZCBhIGRpcmVjdGlvbiBzdHJpbmcgKCdhc2MnIG9yICdkZXNjJykuCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IFtbMCwnYXNjJ11dCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbgoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMub3JkZXIKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFNvcnQgYnkgM3JkIGNvbHVtbiBmaXJzdCwgYW5kIHRoZW4gNHRoIGNvbHVtbgoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJvcmRlciI6IFtbMiwnYXNjJ10sIFszLCdkZXNjJ11dCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogICAgLy8gTm8gaW5pdGlhbCBzb3J0aW5nCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgIm9yZGVyIjogW10KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImFhU29ydGluZyI6IFtbMCwnYXNjJ11dLAoJCgkKCQkvKioKCQkgKiBUaGlzIHBhcmFtZXRlciBpcyBiYXNpY2FsbHkgaWRlbnRpY2FsIHRvIHRoZSBgc29ydGluZ2AgcGFyYW1ldGVyLCBidXQKCQkgKiBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIGludGVyYWN0aW9uIHdpdGggdGhlIHRhYmxlLiBXaGF0IHRoaXMgbWVhbnMKCQkgKiBpcyB0aGF0IHlvdSBjb3VsZCBoYXZlIGEgY29sdW1uICh2aXNpYmxlIG9yIGhpZGRlbikgd2hpY2ggdGhlIHNvcnRpbmcKCQkgKiB3aWxsIGFsd2F5cyBiZSBmb3JjZWQgb24gZmlyc3QgLSBhbnkgc29ydGluZyBhZnRlciB0aGF0IChmcm9tIHRoZSB1c2VyKQoJCSAqIHdpbGwgdGhlbiBiZSBwZXJmb3JtZWQgYXMgcmVxdWlyZWQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZ3JvdXBpbmcgcm93cwoJCSAqIHRvZ2V0aGVyLgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBudWxsCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbgoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMub3JkZXJGaXhlZAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgIm9yZGVyRml4ZWQiOiBbWzAsJ2FzYyddXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKQoJCSAqLwoJCSJhYVNvcnRpbmdGaXhlZCI6IFtdLAoJCgkKCQkvKioKCQkgKiBEYXRhVGFibGVzIGNhbiBiZSBpbnN0cnVjdGVkIHRvIGxvYWQgZGF0YSB0byBkaXNwbGF5IGluIHRoZSB0YWJsZSBmcm9tIGEKCQkgKiBBamF4IHNvdXJjZS4gVGhpcyBvcHRpb24gZGVmaW5lcyBob3cgdGhhdCBBamF4IGNhbGwgaXMgbWFkZSBhbmQgd2hlcmUgdG8uCgkJICoKCQkgKiBUaGUgYGFqYXhgIHByb3BlcnR5IGhhcyB0aHJlZSBkaWZmZXJlbnQgbW9kZXMgb2Ygb3BlcmF0aW9uLCBkZXBlbmRpbmcgb24KCQkgKiBob3cgaXQgaXMgZGVmaW5lZC4gVGhlc2UgYXJlOgoJCSAqCgkJICogKiBgc3RyaW5nYCAtIFNldCB0aGUgVVJMIGZyb20gd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIGxvYWRlZCBmcm9tLgoJCSAqICogYG9iamVjdGAgLSBEZWZpbmUgcHJvcGVydGllcyBmb3IgYGpRdWVyeS5hamF4YC4KCQkgKiAqIGBmdW5jdGlvbmAgLSBDdXN0b20gZGF0YSBnZXQgZnVuY3Rpb24KCQkgKgoJCSAqIGBzdHJpbmdgCgkJICogLS0tLS0tLS0KCQkgKgoJCSAqIEFzIGEgc3RyaW5nLCB0aGUgYGFqYXhgIHByb3BlcnR5IHNpbXBseSBkZWZpbmVzIHRoZSBVUkwgZnJvbSB3aGljaAoJCSAqIERhdGFUYWJsZXMgd2lsbCBsb2FkIGRhdGEuCgkJICoKCQkgKiBgb2JqZWN0YAoJCSAqIC0tLS0tLS0tCgkJICoKCQkgKiBBcyBhbiBvYmplY3QsIHRoZSBwYXJhbWV0ZXJzIGluIHRoZSBvYmplY3QgYXJlIHBhc3NlZCB0bwoJCSAqIFtqUXVlcnkuYWpheF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2pRdWVyeS5hamF4LykgYWxsb3dpbmcgZmluZSBjb250cm9sCgkJICogb2YgdGhlIEFqYXggcmVxdWVzdC4gRGF0YVRhYmxlcyBoYXMgYSBudW1iZXIgb2YgZGVmYXVsdCBwYXJhbWV0ZXJzIHdoaWNoCgkJICogeW91IGNhbiBvdmVycmlkZSB1c2luZyB0aGlzIG9wdGlvbi4gUGxlYXNlIHJlZmVyIHRvIHRoZSBqUXVlcnkKCQkgKiBkb2N1bWVudGF0aW9uIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIG9wdGlvbnMgYXZhaWxhYmxlLCBhbHRob3VnaAoJCSAqIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBwcm92aWRlIGFkZGl0aW9uYWwgb3B0aW9ucyBpbiBEYXRhVGFibGVzIG9yCgkJICogcmVxdWlyZSBzcGVjaWFsIGNvbnNpZGVyYXRpb246CgkJICoKCQkgKiAqIGBkYXRhYCAtIEFzIHdpdGggalF1ZXJ5LCBgZGF0YWAgY2FuIGJlIHByb3ZpZGVkIGFzIGFuIG9iamVjdCwgYnV0IGl0CgkJICogICBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgZnVuY3Rpb24gdG8gbWFuaXB1bGF0ZSB0aGUgZGF0YSBEYXRhVGFibGVzIHNlbmRzCgkJICogICB0byB0aGUgc2VydmVyLiBUaGUgZnVuY3Rpb24gdGFrZXMgYSBzaW5nbGUgcGFyYW1ldGVyLCBhbiBvYmplY3Qgb2YKCQkgKiAgIHBhcmFtZXRlcnMgd2l0aCB0aGUgdmFsdWVzIHRoYXQgRGF0YVRhYmxlcyBoYXMgcmVhZGllZCBmb3Igc2VuZGluZy4gQW4KCQkgKiAgIG9iamVjdCBtYXkgYmUgcmV0dXJuZWQgd2hpY2ggd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgRGF0YVRhYmxlcwoJCSAqICAgZGVmYXVsdHMsIG9yIHlvdSBjYW4gYWRkIHRoZSBpdGVtcyB0byB0aGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBpbiBhbmQKCQkgKiAgIG5vdCByZXR1cm4gYW55dGhpbmcgZnJvbSB0aGUgZnVuY3Rpb24uIFRoaXMgc3VwZXJzZWRlcyBgZm5TZXJ2ZXJQYXJhbXNgCgkJICogICBmcm9tIERhdGFUYWJsZXMgMS45LS4KCQkgKgoJCSAqICogYGRhdGFTcmNgIC0gQnkgZGVmYXVsdCBEYXRhVGFibGVzIHdpbGwgbG9vayBmb3IgdGhlIHByb3BlcnR5IGBkYXRhYCAob3IKCQkgKiAgIGBhYURhdGFgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggRGF0YVRhYmxlcyAxLjktKSB3aGVuIG9idGFpbmluZyBkYXRhCgkJICogICBmcm9tIGFuIEFqYXggc291cmNlIG9yIGZvciBzZXJ2ZXItc2lkZSBwcm9jZXNzaW5nIC0gdGhpcyBwYXJhbWV0ZXIKCQkgKiAgIGFsbG93cyB0aGF0IHByb3BlcnR5IHRvIGJlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIEphdmFzY3JpcHQgZG90dGVkCgkJICogICBvYmplY3Qgbm90YXRpb24gdG8gZ2V0IGEgZGF0YSBzb3VyY2UgZm9yIG11bHRpcGxlIGxldmVscyBvZiBuZXN0aW5nLCBvcgoJCSAqICAgaXQgbXkgYmUgdXNlZCBhcyBhIGZ1bmN0aW9uLiBBcyBhIGZ1bmN0aW9uIGl0IHRha2VzIGEgc2luZ2xlIHBhcmFtZXRlciwKCQkgKiAgIHRoZSBKU09OIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgd2hpY2ggY2FuIGJlIG1hbmlwdWxhdGVkIGFzCgkJICogICByZXF1aXJlZCwgd2l0aCB0aGUgcmV0dXJuZWQgdmFsdWUgYmVpbmcgdGhhdCB1c2VkIGJ5IERhdGFUYWJsZXMgYXMgdGhlCgkJICogICBkYXRhIHNvdXJjZSBmb3IgdGhlIHRhYmxlLiBUaGlzIHN1cGVyc2VkZXMgYHNBamF4RGF0YVByb3BgIGZyb20KCQkgKiAgIERhdGFUYWJsZXMgMS45LS4KCQkgKgoJCSAqICogYHN1Y2Nlc3NgIC0gU2hvdWxkIG5vdCBiZSBvdmVycmlkZGVuIGl0IGlzIHVzZWQgaW50ZXJuYWxseSBpbgoJCSAqICAgRGF0YVRhYmxlcy4gVG8gbWFuaXB1bGF0ZSAvIHRyYW5zZm9ybSB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2VydmVyCgkJICogICB1c2UgYGFqYXguZGF0YVNyY2AsIG9yIHVzZSBgYWpheGAgYXMgYSBmdW5jdGlvbiAoc2VlIGJlbG93KS4KCQkgKgoJCSAqIGBmdW5jdGlvbmAKCQkgKiAtLS0tLS0tLS0tCgkJICoKCQkgKiBBcyBhIGZ1bmN0aW9uLCBtYWtpbmcgdGhlIEFqYXggY2FsbCBpcyBsZWZ0IHVwIHRvIHlvdXJzZWxmIGFsbG93aW5nCgkJICogY29tcGxldGUgY29udHJvbCBvZiB0aGUgQWpheCByZXF1ZXN0LiBJbmRlZWQsIGlmIGRlc2lyZWQsIGEgbWV0aG9kIG90aGVyCgkJICogdGhhbiBBamF4IGNvdWxkIGJlIHVzZWQgdG8gb2J0YWluIHRoZSByZXF1aXJlZCBkYXRhLCBzdWNoIGFzIFdlYiBzdG9yYWdlCgkJICogb3IgYW4gQUlSIGRhdGFiYXNlLgoJCSAqCgkJICogVGhlIGZ1bmN0aW9uIGlzIGdpdmVuIGZvdXIgcGFyYW1ldGVycyBhbmQgbm8gcmV0dXJuIGlzIHJlcXVpcmVkLiBUaGUKCQkgKiBwYXJhbWV0ZXJzIGFyZToKCQkgKgoJCSAqIDEuIF9vYmplY3RfIC0gRGF0YSB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIKCQkgKiAyLiBfZnVuY3Rpb25fIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBtdXN0IGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHJlcXVpcmVkCgkJICogICAgZGF0YSBoYXMgYmVlbiBvYnRhaW5lZC4gVGhhdCBkYXRhIHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGUgY2FsbGJhY2sKCQkgKiAgICBhcyB0aGUgb25seSBwYXJhbWV0ZXIKCQkgKiAzLiBfb2JqZWN0XyAtIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0IGZvciB0aGUgdGFibGUKCQkgKgoJCSAqIE5vdGUgdGhhdCB0aGlzIHN1cGVyc2VkZXMgYGZuU2VydmVyRGF0YWAgZnJvbSBEYXRhVGFibGVzIDEuOS0uCgkJICoKCQkgKiAgQHR5cGUgc3RyaW5nfG9iamVjdHxmdW5jdGlvbgoJCSAqICBAZGVmYXVsdCBudWxsCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbgoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuYWpheAoJCSAqICBAc2luY2UgMS4xMC4wCgkJICoKCQkgKiBAZXhhbXBsZQoJCSAqICAgLy8gR2V0IEpTT04gZGF0YSBmcm9tIGEgZmlsZSB2aWEgQWpheC4KCQkgKiAgIC8vIE5vdGUgRGF0YVRhYmxlcyBleHBlY3RzIGRhdGEgaW4gdGhlIGZvcm0gYHsgZGF0YTogWyAuLi5kYXRhLi4uIF0gfWAgYnkgZGVmYXVsdCkuCgkJICogICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAiYWpheCI6ICJkYXRhLmpzb24iCgkJICogICB9ICk7CgkJICoKCQkgKiBAZXhhbXBsZQoJCSAqICAgLy8gR2V0IEpTT04gZGF0YSBmcm9tIGEgZmlsZSB2aWEgQWpheCwgdXNpbmcgYGRhdGFTcmNgIHRvIGNoYW5nZQoJCSAqICAgLy8gYGRhdGFgIHRvIGB0YWJsZURhdGFgIChpLmUuIGB7IHRhYmxlRGF0YTogWyAuLi5kYXRhLi4uIF0gfWApCgkJICogICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAiYWpheCI6IHsKCQkgKiAgICAgICAidXJsIjogImRhdGEuanNvbiIsCgkJICogICAgICAgImRhdGFTcmMiOiAidGFibGVEYXRhIgoJCSAqICAgICB9CgkJICogICB9ICk7CgkJICoKCQkgKiBAZXhhbXBsZQoJCSAqICAgLy8gR2V0IEpTT04gZGF0YSBmcm9tIGEgZmlsZSB2aWEgQWpheCwgdXNpbmcgYGRhdGFTcmNgIHRvIHJlYWQgZGF0YQoJCSAqICAgLy8gZnJvbSBhIHBsYWluIGFycmF5IHJhdGhlciB0aGFuIGFuIGFycmF5IGluIGFuIG9iamVjdAoJCSAqICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgImFqYXgiOiB7CgkJICogICAgICAgInVybCI6ICJkYXRhLmpzb24iLAoJCSAqICAgICAgICJkYXRhU3JjIjogIiIKCQkgKiAgICAgfQoJCSAqICAgfSApOwoJCSAqCgkJICogQGV4YW1wbGUKCQkgKiAgIC8vIE1hbmlwdWxhdGUgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIC0gYWRkIGEgbGluayB0byBkYXRhCgkJICogICAvLyAobm90ZSB0aGlzIGNhbiwgc2hvdWxkLCBiZSBkb25lIHVzaW5nIGByZW5kZXJgIGZvciB0aGUgY29sdW1uIC0gdGhpcwoJCSAqICAgLy8gaXMganVzdCBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0aGUgZGF0YSBjYW4gYmUgbWFuaXB1bGF0ZWQpLgoJCSAqICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgImFqYXgiOiB7CgkJICogICAgICAgInVybCI6ICJkYXRhLmpzb24iLAoJCSAqICAgICAgICJkYXRhU3JjIjogZnVuY3Rpb24gKCBqc29uICkgewoJCSAqICAgICAgICAgZm9yICggdmFyIGk9MCwgaWVuPWpzb24ubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJICogICAgICAgICAgIGpzb25baV1bMF0gPSAnPGEgaHJlZj0iL21lc3NhZ2UvJytqc29uW2ldWzBdKyc+VmlldyBtZXNzYWdlPC9hPic7CgkJICogICAgICAgICB9CgkJICogICAgICAgICByZXR1cm4ganNvbjsKCQkgKiAgICAgICB9CgkJICogICAgIH0KCQkgKiAgIH0gKTsKCQkgKgoJCSAqIEBleGFtcGxlCgkJICogICAvLyBBZGQgZGF0YSB0byB0aGUgcmVxdWVzdAoJCSAqICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgImFqYXgiOiB7CgkJICogICAgICAgInVybCI6ICJkYXRhLmpzb24iLAoJCSAqICAgICAgICJkYXRhIjogZnVuY3Rpb24gKCBkICkgewoJCSAqICAgICAgICAgcmV0dXJuIHsKCQkgKiAgICAgICAgICAgImV4dHJhX3NlYXJjaCI6ICQoJyNleHRyYScpLnZhbCgpCgkJICogICAgICAgICB9OwoJCSAqICAgICAgIH0KCQkgKiAgICAgfQoJCSAqICAgfSApOwoJCSAqCgkJICogQGV4YW1wbGUKCQkgKiAgIC8vIFNlbmQgcmVxdWVzdCBhcyBQT1NUCgkJICogICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAiYWpheCI6IHsKCQkgKiAgICAgICAidXJsIjogImRhdGEuanNvbiIsCgkJICogICAgICAgInR5cGUiOiAiUE9TVCIKCQkgKiAgICAgfQoJCSAqICAgfSApOwoJCSAqCgkJICogQGV4YW1wbGUKCQkgKiAgIC8vIEdldCB0aGUgZGF0YSBmcm9tIGxvY2FsU3RvcmFnZSAoY291bGQgaW50ZXJmYWNlIHdpdGggYSBmb3JtIGZvcgoJCSAqICAgLy8gYWRkaW5nLCBlZGl0aW5nIGFuZCByZW1vdmluZyByb3dzKS4KCQkgKiAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICJhamF4IjogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrLCBzZXR0aW5ncykgewoJCSAqICAgICAgIGNhbGxiYWNrKAoJCSAqICAgICAgICAgSlNPTi5wYXJzZSggbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2RhdGFUYWJsZXNEYXRhJykgKQoJCSAqICAgICAgICk7CgkJICogICAgIH0KCQkgKiAgIH0gKTsKCQkgKi8KCQkiYWpheCI6IG51bGwsCgkKCQoJCS8qKgoJCSAqIFRoaXMgcGFyYW1ldGVyIGFsbG93cyB5b3UgdG8gcmVhZGlseSBzcGVjaWZ5IHRoZSBlbnRyaWVzIGluIHRoZSBsZW5ndGggZHJvcAoJCSAqIGRvd24gbWVudSB0aGF0IERhdGFUYWJsZXMgc2hvd3Mgd2hlbiBwYWdpbmF0aW9uIGlzIGVuYWJsZWQuIEl0IGNhbiBiZQoJCSAqIGVpdGhlciBhIDFEIGFycmF5IG9mIG9wdGlvbnMgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBib3RoIHRoZSBkaXNwbGF5ZWQKCQkgKiBvcHRpb24gYW5kIHRoZSB2YWx1ZSwgb3IgYSAyRCBhcnJheSB3aGljaCB3aWxsIHVzZSB0aGUgYXJyYXkgaW4gdGhlIGZpcnN0CgkJICogcG9zaXRpb24gYXMgdGhlIHZhbHVlLCBhbmQgdGhlIGFycmF5IGluIHRoZSBzZWNvbmQgcG9zaXRpb24gYXMgdGhlCgkJICogZGlzcGxheWVkIG9wdGlvbnMgKHVzZWZ1bCBmb3IgbGFuZ3VhZ2Ugc3RyaW5ncyBzdWNoIGFzICdBbGwnKS4KCQkgKgoJCSAqIE5vdGUgdGhhdCB0aGUgYHBhZ2VMZW5ndGhgIHByb3BlcnR5IHdpbGwgYmUgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlCgkJICogZmlyc3QgdmFsdWUgZ2l2ZW4gaW4gdGhpcyBhcnJheSwgdW5sZXNzIGBwYWdlTGVuZ3RoYCBpcyBhbHNvIHByb3ZpZGVkLgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbIDEwLCAyNSwgNTAsIDEwMCBdCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbgoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGVuZ3RoTWVudQoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImxlbmd0aE1lbnUiOiBbWzEwLCAyNSwgNTAsIC0xXSwgWzEwLCAyNSwgNTAsICJBbGwiXV0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImFMZW5ndGhNZW51IjogWyAxMCwgMjUsIDUwLCAxMDAgXSwKCQoJCgkJLyoqCgkJICogVGhlIGBjb2x1bW5zYCBvcHRpb24gaW4gdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIGRlZmluZQoJCSAqIGRldGFpbHMgYWJvdXQgdGhlIHdheSBpbmRpdmlkdWFsIGNvbHVtbnMgYmVoYXZlLiBGb3IgYSBmdWxsIGxpc3Qgb2YKCQkgKiBjb2x1bW4gb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQsIHBsZWFzZSBzZWUKCQkgKiB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzLmNvbHVtbn0uIE5vdGUgdGhhdCBpZiB5b3UgdXNlIGBjb2x1bW5zYCB0bwoJCSAqIGRlZmluZSB5b3VyIGNvbHVtbnMsIHlvdSBtdXN0IGhhdmUgYW4gZW50cnkgaW4gdGhlIGFycmF5IGZvciBldmVyeSBzaW5nbGUKCQkgKiBjb2x1bW4gdGhhdCB5b3UgaGF2ZSBpbiB5b3VyIHRhYmxlICh0aGVzZSBjYW4gYmUgbnVsbCBpZiB5b3UgZG9uJ3Qgd2hpY2gKCQkgKiB0byBzcGVjaWZ5IGFueSBvcHRpb25zKS4KCQkgKiAgQG1lbWJlcgoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4KCQkgKi8KCQkiYW9Db2x1bW5zIjogbnVsbCwKCQoJCS8qKgoJCSAqIFZlcnkgc2ltaWxhciB0byBgY29sdW1uc2AsIGBjb2x1bW5EZWZzYCBhbGxvd3MgeW91IHRvIHRhcmdldCBhIHNwZWNpZmljCgkJICogY29sdW1uLCBtdWx0aXBsZSBjb2x1bW5zLCBvciBhbGwgY29sdW1ucywgdXNpbmcgdGhlIGB0YXJnZXRzYCBwcm9wZXJ0eSBvZgoJCSAqIGVhY2ggb2JqZWN0IGluIHRoZSBhcnJheS4gVGhpcyBhbGxvd3MgZ3JlYXQgZmxleGliaWxpdHkgd2hlbiBjcmVhdGluZwoJCSAqIHRhYmxlcywgYXMgdGhlIGBjb2x1bW5EZWZzYCBhcnJheXMgY2FuIGJlIG9mIGFueSBsZW5ndGgsIHRhcmdldGluZyB0aGUKCQkgKiBjb2x1bW5zIHlvdSBzcGVjaWZpY2FsbHkgd2FudC4gYGNvbHVtbkRlZnNgIG1heSB1c2UgYW55IG9mIHRoZSBjb2x1bW4KCQkgKiBvcHRpb25zIGF2YWlsYWJsZToge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW59LCBidXQgaXQgX211c3RfCgkJICogaGF2ZSBgdGFyZ2V0c2AgZGVmaW5lZCBpbiBlYWNoIG9iamVjdCBpbiB0aGUgYXJyYXkuIFZhbHVlcyBpbiB0aGUgYHRhcmdldHNgCgkJICogYXJyYXkgbWF5IGJlOgoJCSAqICAgPHVsPgoJCSAqICAgICA8bGk+YSBzdHJpbmcgLSBjbGFzcyBuYW1lIHdpbGwgYmUgbWF0Y2hlZCBvbiB0aGUgVEggZm9yIHRoZSBjb2x1bW48L2xpPgoJCSAqICAgICA8bGk+MCBvciBhIHBvc2l0aXZlIGludGVnZXIgLSBjb2x1bW4gaW5kZXggY291bnRpbmcgZnJvbSB0aGUgbGVmdDwvbGk+CgkJICogICAgIDxsaT5hIG5lZ2F0aXZlIGludGVnZXIgLSBjb2x1bW4gaW5kZXggY291bnRpbmcgZnJvbSB0aGUgcmlnaHQ8L2xpPgoJCSAqICAgICA8bGk+dGhlIHN0cmluZyAiX2FsbCIgLSBhbGwgY29sdW1ucyAoaS5lLiBhc3NpZ24gYSBkZWZhdWx0KTwvbGk+CgkJICogICA8L3VsPgoJCSAqICBAbWVtYmVyCgkJICoKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmNvbHVtbkRlZnMKCQkgKi8KCQkiYW9Db2x1bW5EZWZzIjogbnVsbCwKCQoJCgkJLyoqCgkJICogQmFzaWNhbGx5IHRoZSBzYW1lIGFzIGBzZWFyY2hgLCB0aGlzIHBhcmFtZXRlciBkZWZpbmVzIHRoZSBpbmRpdmlkdWFsIGNvbHVtbgoJCSAqIGZpbHRlcmluZyBzdGF0ZSBhdCBpbml0aWFsaXNhdGlvbiB0aW1lLiBUaGUgYXJyYXkgbXVzdCBiZSBvZiB0aGUgc2FtZSBzaXplCgkJICogYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zLCBhbmQgZWFjaCBlbGVtZW50IGJlIGFuIG9iamVjdCB3aXRoIHRoZSBwYXJhbWV0ZXJzCgkJICogYHNlYXJjaGAgYW5kIGBlc2NhcGVSZWdleGAgKHRoZSBsYXR0ZXIgaXMgb3B0aW9uYWwpLiAnbnVsbCcgaXMgYWxzbwoJCSAqIGFjY2VwdGVkIGFuZCB0aGUgZGVmYXVsdCB3aWxsIGJlIHVzZWQuCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IFtdCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbgoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuc2VhcmNoQ29scwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgInNlYXJjaENvbHMiOiBbCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICB7ICJzZWFyY2giOiAiTXkgZmlsdGVyIiB9LAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgeyAic2VhcmNoIjogIl5bMC05XSIsICJlc2NhcGVSZWdleCI6IGZhbHNlIH0KCQkgKiAgICAgICAgXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKQoJCSAqLwoJCSJhb1NlYXJjaENvbHMiOiBbXSwKCQoJCgkJLyoqCgkJICogQW4gYXJyYXkgb2YgQ1NTIGNsYXNzZXMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byBkaXNwbGF5ZWQgcm93cy4gVGhpcwoJCSAqIGFycmF5IG1heSBiZSBvZiBhbnkgbGVuZ3RoLCBhbmQgRGF0YVRhYmxlcyB3aWxsIGFwcGx5IGVhY2ggY2xhc3MKCQkgKiBzZXF1ZW50aWFsbHksIGxvb3Bpbmcgd2hlbiByZXF1aXJlZC4KCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgbnVsbCA8aT5XaWxsIHRha2UgdGhlIHZhbHVlcyBkZXRlcm1pbmVkIGJ5IHRoZSBgb0NsYXNzZXMuc3RyaXBlKmAKCQkgKiAgICBvcHRpb25zPC9pPgoJCSAqCgkJICogIEBkdG9wdCBPcHRpb24KCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnN0cmlwZUNsYXNzZXMKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJzdHJpcGVDbGFzc2VzIjogWyAnc3RyaXAxJywgJ3N0cmlwMicsICdzdHJpcDMnIF0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICkKCQkgKi8KCQkiYXNTdHJpcGVDbGFzc2VzIjogbnVsbCwKCQoJCgkJLyoqCgkJICogRW5hYmxlIG9yIGRpc2FibGUgYXV0b21hdGljIGNvbHVtbiB3aWR0aCBjYWxjdWxhdGlvbi4gVGhpcyBjYW4gYmUgZGlzYWJsZWQKCQkgKiBhcyBhbiBvcHRpbWlzYXRpb24gKGl0IHRha2VzIHNvbWUgdGltZSB0byBjYWxjdWxhdGUgdGhlIHdpZHRocykgaWYgdGhlCgkJICogdGFibGVzIHdpZHRocyBhcmUgcGFzc2VkIGluIHVzaW5nIGBjb2x1bW5zYC4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCB0cnVlCgkJICoKCQkgKiAgQGR0b3B0IEZlYXR1cmVzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5hdXRvV2lkdGgKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbiAoKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiYXV0b1dpZHRoIjogZmFsc2UKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImJBdXRvV2lkdGgiOiB0cnVlLAoJCgkKCQkvKioKCQkgKiBEZWZlcnJlZCByZW5kZXJpbmcgY2FuIHByb3ZpZGUgRGF0YVRhYmxlcyB3aXRoIGEgaHVnZSBzcGVlZCBib29zdCB3aGVuIHlvdQoJCSAqIGFyZSB1c2luZyBhbiBBamF4IG9yIEpTIGRhdGEgc291cmNlIGZvciB0aGUgdGFibGUuIFRoaXMgb3B0aW9uLCB3aGVuIHNldCB0bwoJCSAqIHRydWUsIHdpbGwgY2F1c2UgRGF0YVRhYmxlcyB0byBkZWZlciB0aGUgY3JlYXRpb24gb2YgdGhlIHRhYmxlIGVsZW1lbnRzIGZvcgoJCSAqIGVhY2ggcm93IHVudGlsIHRoZXkgYXJlIG5lZWRlZCBmb3IgYSBkcmF3IC0gc2F2aW5nIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mCgkJICogdGltZS4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCBmYWxzZQoJCSAqCgkJICogIEBkdG9wdCBGZWF0dXJlcwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuZGVmZXJSZW5kZXIKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJhamF4IjogInNvdXJjZXMvYXJyYXlzLnR4dCIsCgkJICogICAgICAgICJkZWZlclJlbmRlciI6IHRydWUKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImJEZWZlclJlbmRlciI6IGZhbHNlLAoJCgkKCQkvKioKCQkgKiBSZXBsYWNlIGEgRGF0YVRhYmxlIHdoaWNoIG1hdGNoZXMgdGhlIGdpdmVuIHNlbGVjdG9yIGFuZCByZXBsYWNlIGl0IHdpdGgKCQkgKiBvbmUgd2hpY2ggaGFzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcgaW5pdGlhbGlzYXRpb24gb2JqZWN0IHBhc3NlZC4gSWYgbm8KCQkgKiB0YWJsZSBtYXRjaGVzIHRoZSBzZWxlY3RvciwgdGhlbiB0aGUgbmV3IERhdGFUYWJsZSB3aWxsIGJlIGNvbnN0cnVjdGVkIGFzCgkJICogcGVyIG5vcm1hbC4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCBmYWxzZQoJCSAqCgkJICogIEBkdG9wdCBPcHRpb25zCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5kZXN0cm95CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic3JvbGxZIjogIjIwMHB4IiwKCQkgKiAgICAgICAgInBhZ2luYXRlIjogZmFsc2UKCQkgKiAgICAgIH0gKTsKCQkgKgoJCSAqICAgICAgLy8gU29tZSB0aW1lIGxhdGVyLi4uLgoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImZpbHRlciI6IGZhbHNlLAoJCSAqICAgICAgICAiZGVzdHJveSI6IHRydWUKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImJEZXN0cm95IjogZmFsc2UsCgkKCQoJCS8qKgoJCSAqIEVuYWJsZSBvciBkaXNhYmxlIGZpbHRlcmluZyBvZiBkYXRhLiBGaWx0ZXJpbmcgaW4gRGF0YVRhYmxlcyBpcyAic21hcnQiIGluCgkJICogdGhhdCBpdCBhbGxvd3MgdGhlIGVuZCB1c2VyIHRvIGlucHV0IG11bHRpcGxlIHdvcmRzIChzcGFjZSBzZXBhcmF0ZWQpIGFuZAoJCSAqIHdpbGwgbWF0Y2ggYSByb3cgY29udGFpbmluZyB0aG9zZSB3b3JkcywgZXZlbiBpZiBub3QgaW4gdGhlIG9yZGVyIHRoYXQgd2FzCgkJICogc3BlY2lmaWVkICh0aGlzIGFsbG93IG1hdGNoaW5nIGFjcm9zcyBtdWx0aXBsZSBjb2x1bW5zKS4gTm90ZSB0aGF0IGlmIHlvdQoJCSAqIHdpc2ggdG8gdXNlIGZpbHRlcmluZyBpbiBEYXRhVGFibGVzIHRoaXMgbXVzdCByZW1haW4gJ3RydWUnIC0gdG8gcmVtb3ZlIHRoZQoJCSAqIGRlZmF1bHQgZmlsdGVyaW5nIGlucHV0IGJveCBhbmQgcmV0YWluIGZpbHRlcmluZyBhYmlsaXRpZXMsIHBsZWFzZSB1c2UKCQkgKiB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzLmRvbX0uCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgdHJ1ZQoJCSAqCgkJICogIEBkdG9wdCBGZWF0dXJlcwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuc2VhcmNoaW5nCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24gKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgInNlYXJjaGluZyI6IGZhbHNlCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJiRmlsdGVyIjogdHJ1ZSwKCQoJCgkJLyoqCgkJICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHRhYmxlIGluZm9ybWF0aW9uIGRpc3BsYXkuIFRoaXMgc2hvd3MgaW5mb3JtYXRpb24KCQkgKiBhYm91dCB0aGUgZGF0YSB0aGF0IGlzIGN1cnJlbnRseSB2aXNpYmxlIG9uIHRoZSBwYWdlLCBpbmNsdWRpbmcgaW5mb3JtYXRpb24KCQkgKiBhYm91dCBmaWx0ZXJlZCBkYXRhIGlmIHRoYXQgYWN0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZC4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCB0cnVlCgkJICoKCQkgKiAgQGR0b3B0IEZlYXR1cmVzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5pbmZvCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24gKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImluZm8iOiBmYWxzZQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkiYkluZm8iOiB0cnVlLAoJCgkKCQkvKioKCQkgKiBBbGxvd3MgdGhlIGVuZCB1c2VyIHRvIHNlbGVjdCB0aGUgc2l6ZSBvZiBhIGZvcm1hdHRlZCBwYWdlIGZyb20gYSBzZWxlY3QKCQkgKiBtZW51IChzaXplcyBhcmUgMTAsIDI1LCA1MCBhbmQgMTAwKS4gUmVxdWlyZXMgcGFnaW5hdGlvbiAoYHBhZ2luYXRlYCkuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgdHJ1ZQoJCSAqCgkJICogIEBkdG9wdCBGZWF0dXJlcwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGVuZ3RoQ2hhbmdlCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24gKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImxlbmd0aENoYW5nZSI6IGZhbHNlCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJiTGVuZ3RoQ2hhbmdlIjogdHJ1ZSwKCQoJCgkJLyoqCgkJICogRW5hYmxlIG9yIGRpc2FibGUgcGFnaW5hdGlvbi4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCB0cnVlCgkJICoKCQkgKiAgQGR0b3B0IEZlYXR1cmVzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5wYWdpbmcKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbiAoKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAicGFnaW5nIjogZmFsc2UKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImJQYWdpbmF0ZSI6IHRydWUsCgkKCQoJCS8qKgoJCSAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBkaXNwbGF5IG9mIGEgJ3Byb2Nlc3NpbmcnIGluZGljYXRvciB3aGVuIHRoZSB0YWJsZSBpcwoJCSAqIGJlaW5nIHByb2Nlc3NlZCAoZS5nLiBhIHNvcnQpLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHRhYmxlcyB3aXRoCgkJICogbGFyZ2UgYW1vdW50cyBvZiBkYXRhIHdoZXJlIGl0IGNhbiB0YWtlIGEgbm90aWNlYWJsZSBhbW91bnQgb2YgdGltZSB0byBzb3J0CgkJICogdGhlIGVudHJpZXMuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgZmFsc2UKCQkgKgoJCSAqICBAZHRvcHQgRmVhdHVyZXMKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnByb2Nlc3NpbmcKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbiAoKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAicHJvY2Vzc2luZyI6IHRydWUKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImJQcm9jZXNzaW5nIjogZmFsc2UsCgkKCQoJCS8qKgoJCSAqIFJldHJpZXZlIHRoZSBEYXRhVGFibGVzIG9iamVjdCBmb3IgdGhlIGdpdmVuIHNlbGVjdG9yLiBOb3RlIHRoYXQgaWYgdGhlCgkJICogdGFibGUgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCwgdGhpcyBwYXJhbWV0ZXIgd2lsbCBjYXVzZSBEYXRhVGFibGVzCgkJICogdG8gc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBzZXQgdXAgLSBpdCB3aWxsIG5vdCB0YWtlCgkJICogYWNjb3VudCBvZiBhbnkgY2hhbmdlcyB5b3UgbWlnaHQgaGF2ZSBtYWRlIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBvYmplY3QKCQkgKiBwYXNzZWQgdG8gRGF0YVRhYmxlcyAoc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGlzIGFuIGFja25vd2xlZGdlbWVudAoJCSAqIHRoYXQgeW91IHVuZGVyc3RhbmQgdGhpcykuIGBkZXN0cm95YCBjYW4gYmUgdXNlZCB0byByZWluaXRpYWxpc2UgYSB0YWJsZSBpZgoJCSAqIHlvdSBuZWVkLgoJCSAqICBAdHlwZSBib29sZWFuCgkJICogIEBkZWZhdWx0IGZhbHNlCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbnMKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnJldHJpZXZlCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICBpbml0VGFibGUoKTsKCQkgKiAgICAgIHRhYmxlQWN0aW9ucygpOwoJCSAqICAgIH0gKTsKCQkgKgoJCSAqICAgIGZ1bmN0aW9uIGluaXRUYWJsZSAoKQoJCSAqICAgIHsKCQkgKiAgICAgIHJldHVybiAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic2Nyb2xsWSI6ICIyMDBweCIsCgkJICogICAgICAgICJwYWdpbmF0ZSI6IGZhbHNlLAoJCSAqICAgICAgICAicmV0cmlldmUiOiB0cnVlCgkJICogICAgICB9ICk7CgkJICogICAgfQoJCSAqCgkJICogICAgZnVuY3Rpb24gdGFibGVBY3Rpb25zICgpCgkJICogICAgewoJCSAqICAgICAgdmFyIHRhYmxlID0gaW5pdFRhYmxlKCk7CgkJICogICAgICAvLyBwZXJmb3JtIEFQSSBvcGVyYXRpb25zIHdpdGggb1RhYmxlCgkJICogICAgfQoJCSAqLwoJCSJiUmV0cmlldmUiOiBmYWxzZSwKCQoJCgkJLyoqCgkJICogV2hlbiB2ZXJ0aWNhbCAoeSkgc2Nyb2xsaW5nIGlzIGVuYWJsZWQsIERhdGFUYWJsZXMgd2lsbCBmb3JjZSB0aGUgaGVpZ2h0IG9mCgkJICogdGhlIHRhYmxlJ3Mgdmlld3BvcnQgdG8gdGhlIGdpdmVuIGhlaWdodCBhdCBhbGwgdGltZXMgKHVzZWZ1bCBmb3IgbGF5b3V0KS4KCQkgKiBIb3dldmVyLCB0aGlzIGNhbiBsb29rIG9kZCB3aGVuIGZpbHRlcmluZyBkYXRhIGRvd24gdG8gYSBzbWFsbCBkYXRhIHNldCwKCQkgKiBhbmQgdGhlIGZvb3RlciBpcyBsZWZ0ICJmbG9hdGluZyIgZnVydGhlciBkb3duLiBUaGlzIHBhcmFtZXRlciAod2hlbgoJCSAqIGVuYWJsZWQpIHdpbGwgY2F1c2UgRGF0YVRhYmxlcyB0byBjb2xsYXBzZSB0aGUgdGFibGUncyB2aWV3cG9ydCBkb3duIHdoZW4KCQkgKiB0aGUgcmVzdWx0IHNldCB3aWxsIGZpdCB3aXRoaW4gdGhlIGdpdmVuIFkgaGVpZ2h0LgoJCSAqICBAdHlwZSBib29sZWFuCgkJICogIEBkZWZhdWx0IGZhbHNlCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbnMKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnNjcm9sbENvbGxhcHNlCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic2Nyb2xsWSI6ICIyMDAiLAoJCSAqICAgICAgICAic2Nyb2xsQ29sbGFwc2UiOiB0cnVlCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJiU2Nyb2xsQ29sbGFwc2UiOiBmYWxzZSwKCQoJCgkJLyoqCgkJICogQ29uZmlndXJlIERhdGFUYWJsZXMgdG8gdXNlIHNlcnZlci1zaWRlIHByb2Nlc3NpbmcuIE5vdGUgdGhhdCB0aGUKCQkgKiBgYWpheGAgcGFyYW1ldGVyIG11c3QgYWxzbyBiZSBnaXZlbiBpbiBvcmRlciB0byBnaXZlIERhdGFUYWJsZXMgYQoJCSAqIHNvdXJjZSB0byBvYnRhaW4gdGhlIHJlcXVpcmVkIGRhdGEgZm9yIGVhY2ggZHJhdy4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCBmYWxzZQoJCSAqCgkJICogIEBkdG9wdCBGZWF0dXJlcwoJCSAqICBAZHRvcHQgU2VydmVyLXNpZGUKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnNlcnZlclNpZGUKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbiAoKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic2VydmVyU2lkZSI6IHRydWUsCgkJICogICAgICAgICJhamF4IjogInhoci5waHAiCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJiU2VydmVyU2lkZSI6IGZhbHNlLAoJCgkKCQkvKioKCQkgKiBFbmFibGUgb3IgZGlzYWJsZSBzb3J0aW5nIG9mIGNvbHVtbnMuIFNvcnRpbmcgb2YgaW5kaXZpZHVhbCBjb2x1bW5zIGNhbiBiZQoJCSAqIGRpc2FibGVkIGJ5IHRoZSBgc29ydGFibGVgIG9wdGlvbiBmb3IgZWFjaCBjb2x1bW4uCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgdHJ1ZQoJCSAqCgkJICogIEBkdG9wdCBGZWF0dXJlcwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMub3JkZXJpbmcKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbiAoKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAib3JkZXJpbmciOiBmYWxzZQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkiYlNvcnQiOiB0cnVlLAoJCgkKCQkvKioKCQkgKiBFbmFibGUgb3IgZGlzcGxheSBEYXRhVGFibGVzJyBhYmlsaXR5IHRvIHNvcnQgbXVsdGlwbGUgY29sdW1ucyBhdCB0aGUKCQkgKiBzYW1lIHRpbWUgKGFjdGl2YXRlZCBieSBzaGlmdC1jbGljayBieSB0aGUgdXNlcikuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgdHJ1ZQoJCSAqCgkJICogIEBkdG9wdCBPcHRpb25zCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5vcmRlck11bHRpCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBEaXNhYmxlIG11bHRpcGxlIGNvbHVtbiBzb3J0aW5nIGFiaWxpdHkKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24gKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgIm9yZGVyTXVsdGkiOiBmYWxzZQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkiYlNvcnRNdWx0aSI6IHRydWUsCgkKCQoJCS8qKgoJCSAqIEFsbG93cyBjb250cm9sIG92ZXIgd2hldGhlciBEYXRhVGFibGVzIHNob3VsZCB1c2UgdGhlIHRvcCAodHJ1ZSkgdW5pcXVlCgkJICogY2VsbCB0aGF0IGlzIGZvdW5kIGZvciBhIHNpbmdsZSBjb2x1bW4sIG9yIHRoZSBib3R0b20gKGZhbHNlIC0gZGVmYXVsdCkuCgkJICogVGhpcyBpcyB1c2VmdWwgd2hlbiB1c2luZyBjb21wbGV4IGhlYWRlcnMuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgZmFsc2UKCQkgKgoJCSAqICBAZHRvcHQgT3B0aW9ucwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMub3JkZXJDZWxsc1RvcAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgIm9yZGVyQ2VsbHNUb3AiOiB0cnVlCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJiU29ydENlbGxzVG9wIjogZmFsc2UsCgkKCQoJCS8qKgoJCSAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBhZGRpdGlvbiBvZiB0aGUgY2xhc3NlcyBgc29ydGluZ1xfMWAsIGBzb3J0aW5nXF8yYCBhbmQKCQkgKiBgc29ydGluZ1xfM2AgdG8gdGhlIGNvbHVtbnMgd2hpY2ggYXJlIGN1cnJlbnRseSBiZWluZyBzb3J0ZWQgb24uIFRoaXMgaXMKCQkgKiBwcmVzZW50ZWQgYXMgYSBmZWF0dXJlIHN3aXRjaCBhcyBpdCBjYW4gaW5jcmVhc2UgcHJvY2Vzc2luZyB0aW1lICh3aGlsZQoJCSAqIGNsYXNzZXMgYXJlIHJlbW92ZWQgYW5kIGFkZGVkKSBzbyBmb3IgbGFyZ2UgZGF0YSBzZXRzIHlvdSBtaWdodCB3YW50IHRvCgkJICogdHVybiB0aGlzIG9mZi4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCB0cnVlCgkJICoKCQkgKiAgQGR0b3B0IEZlYXR1cmVzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5vcmRlckNsYXNzZXMKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbiAoKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAib3JkZXJDbGFzc2VzIjogZmFsc2UKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImJTb3J0Q2xhc3NlcyI6IHRydWUsCgkKCQoJCS8qKgoJCSAqIEVuYWJsZSBvciBkaXNhYmxlIHN0YXRlIHNhdmluZy4gV2hlbiBlbmFibGVkIEhUTUw1IGBsb2NhbFN0b3JhZ2VgIHdpbGwgYmUKCQkgKiB1c2VkIHRvIHNhdmUgdGFibGUgZGlzcGxheSBpbmZvcm1hdGlvbiBzdWNoIGFzIHBhZ2luYXRpb24gaW5mb3JtYXRpb24sCgkJICogZGlzcGxheSBsZW5ndGgsIGZpbHRlcmluZyBhbmQgc29ydGluZy4gQXMgc3VjaCB3aGVuIHRoZSBlbmQgdXNlciByZWxvYWRzCgkJICogdGhlIHBhZ2UgdGhlIGRpc3BsYXkgZGlzcGxheSB3aWxsIG1hdGNoIHdoYXQgdGh5IGhhZCBwcmV2aW91c2x5IHNldCB1cC4KCQkgKgoJCSAqIER1ZSB0byB0aGUgdXNlIG9mIGBsb2NhbFN0b3JhZ2VgIHRoZSBkZWZhdWx0IHN0YXRlIHNhdmluZyBpcyBub3Qgc3VwcG9ydGVkCgkJICogaW4gSUU2IG9yIDcuIElmIHN0YXRlIHNhdmluZyBpcyByZXF1aXJlZCBpbiB0aG9zZSBicm93c2VycywgdXNlCgkJICogYHN0YXRlU2F2ZUNhbGxiYWNrYCB0byBwcm92aWRlIGEgc3RvcmFnZSBzb2x1dGlvbiBzdWNoIGFzIGNvb2tpZXMuCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgZmFsc2UKCQkgKgoJCSAqICBAZHRvcHQgRmVhdHVyZXMKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnN0YXRlU2F2ZQoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uICgpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJzdGF0ZVNhdmUiOiB0cnVlCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJiU3RhdGVTYXZlIjogZmFsc2UsCgkKCQoJCS8qKgoJCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBUUiBlbGVtZW50IGlzIGNyZWF0ZWQgKGFuZCBhbGwgVEQgY2hpbGQKCQkgKiBlbGVtZW50cyBoYXZlIGJlZW4gaW5zZXJ0ZWQpLCBvciByZWdpc3RlcmVkIGlmIHVzaW5nIGEgRE9NIHNvdXJjZSwgYWxsb3dpbmcKCQkgKiBtYW5pcHVsYXRpb24gb2YgdGhlIFRSIGVsZW1lbnQgKGFkZGluZyBjbGFzc2VzIGV0YykuCgkJICogIEB0eXBlIGZ1bmN0aW9uCgkJICogIEBwYXJhbSB7bm9kZX0gcm93ICJUUiIgZWxlbWVudCBmb3IgdGhlIGN1cnJlbnQgcm93CgkJICogIEBwYXJhbSB7YXJyYXl9IGRhdGEgUmF3IGRhdGEgYXJyYXkgZm9yIHRoaXMgcm93CgkJICogIEBwYXJhbSB7aW50fSBkYXRhSW5kZXggVGhlIGluZGV4IG9mIHRoaXMgcm93IGluIHRoZSBpbnRlcm5hbCBhb0RhdGEgYXJyYXkKCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jcmVhdGVkUm93CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY3JlYXRlZFJvdyI6IGZ1bmN0aW9uKCByb3csIGRhdGEsIGRhdGFJbmRleCApIHsKCQkgKiAgICAgICAgICAvLyBCb2xkIHRoZSBncmFkZSBmb3IgYWxsICdBJyBncmFkZSBicm93c2VycwoJCSAqICAgICAgICAgIGlmICggZGF0YVs0XSA9PSAiQSIgKQoJCSAqICAgICAgICAgIHsKCQkgKiAgICAgICAgICAgICQoJ3RkOmVxKDQpJywgcm93KS5odG1sKCAnPGI+QTwvYj4nICk7CgkJICogICAgICAgICAgfQoJCSAqICAgICAgICB9CgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJmbkNyZWF0ZWRSb3ciOiBudWxsLAoJCgkKCQkvKioKCQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSAnZHJhdycgZXZlbnQsIGFuZCBhbGxvd3MgeW91IHRvCgkJICogZHluYW1pY2FsbHkgbW9kaWZ5IGFueSBhc3BlY3QgeW91IHdhbnQgYWJvdXQgdGhlIGNyZWF0ZWQgRE9NLgoJCSAqICBAdHlwZSBmdW5jdGlvbgoJCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5kcmF3Q2FsbGJhY2sKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJkcmF3Q2FsbGJhY2siOiBmdW5jdGlvbiggc2V0dGluZ3MgKSB7CgkJICogICAgICAgICAgYWxlcnQoICdEYXRhVGFibGVzIGhhcyByZWRyYXduIHRoZSB0YWJsZScgKTsKCQkgKiAgICAgICAgfQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkiZm5EcmF3Q2FsbGJhY2siOiBudWxsLAoJCgkKCQkvKioKCQkgKiBJZGVudGljYWwgdG8gZm5IZWFkZXJDYWxsYmFjaygpIGJ1dCBmb3IgdGhlIHRhYmxlIGZvb3RlciB0aGlzIGZ1bmN0aW9uCgkJICogYWxsb3dzIHlvdSB0byBtb2RpZnkgdGhlIHRhYmxlIGZvb3RlciBvbiBldmVyeSAnZHJhdycgZXZlbnQuCgkJICogIEB0eXBlIGZ1bmN0aW9uCgkJICogIEBwYXJhbSB7bm9kZX0gZm9vdCAiVFIiIGVsZW1lbnQgZm9yIHRoZSBmb290ZXIKCQkgKiAgQHBhcmFtIHthcnJheX0gZGF0YSBGdWxsIHRhYmxlIGRhdGEgKGFzIGRlcml2ZWQgZnJvbSB0aGUgb3JpZ2luYWwgSFRNTCkKCQkgKiAgQHBhcmFtIHtpbnR9IHN0YXJ0IEluZGV4IGZvciB0aGUgY3VycmVudCBkaXNwbGF5IHN0YXJ0aW5nIHBvaW50IGluIHRoZQoJCSAqICAgIGRpc3BsYXkgYXJyYXkKCQkgKiAgQHBhcmFtIHtpbnR9IGVuZCBJbmRleCBmb3IgdGhlIGN1cnJlbnQgZGlzcGxheSBlbmRpbmcgcG9pbnQgaW4gdGhlCgkJICogICAgZGlzcGxheSBhcnJheQoJCSAqICBAcGFyYW0ge2FycmF5IGludH0gZGlzcGxheSBJbmRleCBhcnJheSB0byB0cmFuc2xhdGUgdGhlIHZpc3VhbCBwb3NpdGlvbgoJCSAqICAgIHRvIHRoZSBmdWxsIGRhdGEgYXJyYXkKCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5mb290ZXJDYWxsYmFjawoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImZvb3RlckNhbGxiYWNrIjogZnVuY3Rpb24oIHRmb290LCBkYXRhLCBzdGFydCwgZW5kLCBkaXNwbGF5ICkgewoJCSAqICAgICAgICAgIHRmb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0aCcpWzBdLmlubmVySFRNTCA9ICJTdGFydGluZyBpbmRleCBpcyAiK3N0YXJ0OwoJCSAqICAgICAgICB9CgkJICogICAgICB9ICk7CgkJICogICAgfSApCgkJICovCgkJImZuRm9vdGVyQ2FsbGJhY2siOiBudWxsLAoJCgkKCQkvKioKCQkgKiBXaGVuIHJlbmRlcmluZyBsYXJnZSBudW1iZXJzIGluIHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IGZvciB0aGUgdGFibGUKCQkgKiAoaS5lLiAiU2hvd2luZyAxIHRvIDEwIG9mIDU3IGVudHJpZXMiKSBEYXRhVGFibGVzIHdpbGwgcmVuZGVyIGxhcmdlIG51bWJlcnMKCQkgKiB0byBoYXZlIGEgY29tbWEgc2VwYXJhdG9yIGZvciB0aGUgJ3Rob3VzYW5kcycgdW5pdHMgKGUuZy4gMSBtaWxsaW9uIGlzCgkJICogcmVuZGVyZWQgYXMgIjEsMDAwLDAwMCIpIHRvIGhlbHAgcmVhZGFiaWxpdHkgZm9yIHRoZSBlbmQgdXNlci4gVGhpcwoJCSAqIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbWV0aG9kIERhdGFUYWJsZXMgdXNlcy4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKiAgQG1lbWJlcgoJCSAqICBAcGFyYW0ge2ludH0gdG9Gb3JtYXQgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZAoJCSAqICBAcmV0dXJucyB7c3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nIGZvciBEYXRhVGFibGVzIHRvIHNob3cgdGhlIG51bWJlcgoJCSAqCgkJICogIEBkdG9wdCBDYWxsYmFja3MKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmZvcm1hdE51bWJlcgoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gRm9ybWF0IGEgbnVtYmVyIHVzaW5nIGEgc2luZ2xlIHF1b3RlIGZvciB0aGUgc2VwYXJhdG9yIChub3RlIHRoYXQKCQkgKiAgICAvLyB0aGlzIGNhbiBhbHNvIGJlIGRvbmUgd2l0aCB0aGUgbGFuZ3VhZ2UudGhvdXNhbmRzIG9wdGlvbikKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiZm9ybWF0TnVtYmVyIjogZnVuY3Rpb24gKCB0b0Zvcm1hdCApIHsKCQkgKiAgICAgICAgICByZXR1cm4gdG9Gb3JtYXQudG9TdHJpbmcoKS5yZXBsYWNlKAoJCSAqICAgICAgICAgICAgL1xCKD89KFxkezN9KSsoPyFcZCkpL2csICInIgoJCSAqICAgICAgICAgICk7CgkJICogICAgICAgIH07CgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJmbkZvcm1hdE51bWJlciI6IGZ1bmN0aW9uICggdG9Gb3JtYXQgKSB7CgkJCXJldHVybiB0b0Zvcm1hdC50b1N0cmluZygpLnJlcGxhY2UoCgkJCQkvXEIoPz0oXGR7M30pKyg/IVxkKSkvZywKCQkJCXRoaXMub0xhbmd1YWdlLnNUaG91c2FuZHMKCQkJKTsKCQl9LAoJCgkKCQkvKioKCQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSAnZHJhdycgZXZlbnQsIGFuZCBhbGxvd3MgeW91IHRvCgkJICogZHluYW1pY2FsbHkgbW9kaWZ5IHRoZSBoZWFkZXIgcm93LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBhbmQKCQkgKiBkaXNwbGF5IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFibGUuCgkJICogIEB0eXBlIGZ1bmN0aW9uCgkJICogIEBwYXJhbSB7bm9kZX0gaGVhZCAiVFIiIGVsZW1lbnQgZm9yIHRoZSBoZWFkZXIKCQkgKiAgQHBhcmFtIHthcnJheX0gZGF0YSBGdWxsIHRhYmxlIGRhdGEgKGFzIGRlcml2ZWQgZnJvbSB0aGUgb3JpZ2luYWwgSFRNTCkKCQkgKiAgQHBhcmFtIHtpbnR9IHN0YXJ0IEluZGV4IGZvciB0aGUgY3VycmVudCBkaXNwbGF5IHN0YXJ0aW5nIHBvaW50IGluIHRoZQoJCSAqICAgIGRpc3BsYXkgYXJyYXkKCQkgKiAgQHBhcmFtIHtpbnR9IGVuZCBJbmRleCBmb3IgdGhlIGN1cnJlbnQgZGlzcGxheSBlbmRpbmcgcG9pbnQgaW4gdGhlCgkJICogICAgZGlzcGxheSBhcnJheQoJCSAqICBAcGFyYW0ge2FycmF5IGludH0gZGlzcGxheSBJbmRleCBhcnJheSB0byB0cmFuc2xhdGUgdGhlIHZpc3VhbCBwb3NpdGlvbgoJCSAqICAgIHRvIHRoZSBmdWxsIGRhdGEgYXJyYXkKCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5oZWFkZXJDYWxsYmFjawoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImZoZWFkZXJDYWxsYmFjayI6IGZ1bmN0aW9uKCBoZWFkLCBkYXRhLCBzdGFydCwgZW5kLCBkaXNwbGF5ICkgewoJCSAqICAgICAgICAgIGhlYWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RoJylbMF0uaW5uZXJIVE1MID0gIkRpc3BsYXlpbmcgIisoZW5kLXN0YXJ0KSsiIHJlY29yZHMiOwoJCSAqICAgICAgICB9CgkJICogICAgICB9ICk7CgkJICogICAgfSApCgkJICovCgkJImZuSGVhZGVyQ2FsbGJhY2siOiBudWxsLAoJCgkKCQkvKioKCQkgKiBUaGUgaW5mb3JtYXRpb24gZWxlbWVudCBjYW4gYmUgdXNlZCB0byBjb252ZXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQKCQkgKiBzdGF0ZSBvZiB0aGUgdGFibGUuIEFsdGhvdWdoIHRoZSBpbnRlcm5hdGlvbmFsaXNhdGlvbiBvcHRpb25zIHByZXNlbnRlZCBieQoJCSAqIERhdGFUYWJsZXMgYXJlIHF1aXRlIGNhcGFibGUgb2YgZGVhbGluZyB3aXRoIG1vc3QgY3VzdG9taXNhdGlvbnMsIHRoZXJlIG1heQoJCSAqIGJlIHRpbWVzIHdoZXJlIHlvdSB3aXNoIHRvIGN1c3RvbWlzZSB0aGUgc3RyaW5nIGZ1cnRoZXIuIFRoaXMgY2FsbGJhY2sKCQkgKiBhbGxvd3MgeW91IHRvIGRvIGV4YWN0bHkgdGhhdC4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJCSAqICBAcGFyYW0ge2ludH0gc3RhcnQgU3RhcnRpbmcgcG9zaXRpb24gaW4gZGF0YSBmb3IgdGhlIGRyYXcKCQkgKiAgQHBhcmFtIHtpbnR9IGVuZCBFbmQgcG9zaXRpb24gaW4gZGF0YSBmb3IgdGhlIGRyYXcKCQkgKiAgQHBhcmFtIHtpbnR9IG1heCBUb3RhbCBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUgKHJlZ2FyZGxlc3Mgb2YKCQkgKiAgICBmaWx0ZXJpbmcpCgkJICogIEBwYXJhbSB7aW50fSB0b3RhbCBUb3RhbCBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZGF0YSBzZXQsIGFmdGVyIGZpbHRlcmluZwoJCSAqICBAcGFyYW0ge3N0cmluZ30gcHJlIFRoZSBzdHJpbmcgdGhhdCBEYXRhVGFibGVzIGhhcyBmb3JtYXR0ZWQgdXNpbmcgaXQncwoJCSAqICAgIG93biBydWxlcwoJCSAqICBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgaW5mb3JtYXRpb24gZWxlbWVudC4KCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5pbmZvQ2FsbGJhY2sKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAiaW5mb0NhbGxiYWNrIjogZnVuY3Rpb24oIHNldHRpbmdzLCBzdGFydCwgZW5kLCBtYXgsIHRvdGFsLCBwcmUgKSB7CgkJICogICAgICAgIHJldHVybiBzdGFydCArIiB0byAiKyBlbmQ7CgkJICogICAgICB9CgkJICogICAgfSApOwoJCSAqLwoJCSJmbkluZm9DYWxsYmFjayI6IG51bGwsCgkKCQoJCS8qKgoJCSAqIENhbGxlZCB3aGVuIHRoZSB0YWJsZSBoYXMgYmVlbiBpbml0aWFsaXNlZC4gTm9ybWFsbHkgRGF0YVRhYmxlcyB3aWxsCgkJICogaW5pdGlhbGlzZSBzZXF1ZW50aWFsbHkgYW5kIHRoZXJlIHdpbGwgYmUgbm8gbmVlZCBmb3IgdGhpcyBmdW5jdGlvbiwKCQkgKiBob3dldmVyLCB0aGlzIGRvZXMgbm90IGhvbGQgdHJ1ZSB3aGVuIHVzaW5nIGV4dGVybmFsIGxhbmd1YWdlIGluZm9ybWF0aW9uCgkJICogc2luY2UgdGhhdCBpcyBvYnRhaW5lZCB1c2luZyBhbiBhc3luYyBYSFIgY2FsbC4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkJICogIEBwYXJhbSB7b2JqZWN0fSBqc29uIFRoZSBKU09OIG9iamVjdCByZXF1ZXN0IGZyb20gdGhlIHNlcnZlciAtIG9ubHkKCQkgKiAgICBwcmVzZW50IGlmIGNsaWVudC1zaWRlIEFqYXggc291cmNlZCBkYXRhIGlzIHVzZWQKCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5pbml0Q29tcGxldGUKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJpbml0Q29tcGxldGUiOiBmdW5jdGlvbihzZXR0aW5ncywganNvbikgewoJCSAqICAgICAgICAgIGFsZXJ0KCAnRGF0YVRhYmxlcyBoYXMgZmluaXNoZWQgaXRzIGluaXRpYWxpc2F0aW9uLicgKTsKCQkgKiAgICAgICAgfQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKQoJCSAqLwoJCSJmbkluaXRDb21wbGV0ZSI6IG51bGwsCgkKCQoJCS8qKgoJCSAqIENhbGxlZCBhdCB0aGUgdmVyeSBzdGFydCBvZiBlYWNoIHRhYmxlIGRyYXcgYW5kIGNhbiBiZSB1c2VkIHRvIGNhbmNlbCB0aGUKCQkgKiBkcmF3IGJ5IHJldHVybmluZyBmYWxzZSwgYW55IG90aGVyIHJldHVybiAoaW5jbHVkaW5nIHVuZGVmaW5lZCkgcmVzdWx0cyBpbgoJCSAqIHRoZSBmdWxsIGRyYXcgb2NjdXJyaW5nKS4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKiAgQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkJICogIEByZXR1cm5zIHtib29sZWFufSBGYWxzZSB3aWxsIGNhbmNlbCB0aGUgZHJhdywgYW55dGhpbmcgZWxzZSAoaW5jbHVkaW5nIG5vCgkJICogICAgcmV0dXJuKSB3aWxsIGFsbG93IGl0IHRvIGNvbXBsZXRlLgoJCSAqCgkJICogIEBkdG9wdCBDYWxsYmFja3MKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnByZURyYXdDYWxsYmFjawoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgInByZURyYXdDYWxsYmFjayI6IGZ1bmN0aW9uKCBzZXR0aW5ncyApIHsKCQkgKiAgICAgICAgICBpZiAoICQoJyN0ZXN0JykudmFsKCkgPT0gMSApIHsKCQkgKiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCQkgKiAgICAgICAgICB9CgkJICogICAgICAgIH0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImZuUHJlRHJhd0NhbGxiYWNrIjogbnVsbCwKCQoJCgkJLyoqCgkJICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvICdwb3N0IHByb2Nlc3MnIGVhY2ggcm93IGFmdGVyIGl0IGhhdmUgYmVlbgoJCSAqIGdlbmVyYXRlZCBmb3IgZWFjaCB0YWJsZSBkcmF3LCBidXQgYmVmb3JlIGl0IGlzIHJlbmRlcmVkIG9uIHNjcmVlbi4gVGhpcwoJCSAqIGZ1bmN0aW9uIG1pZ2h0IGJlIHVzZWQgZm9yIHNldHRpbmcgdGhlIHJvdyBjbGFzcyBuYW1lIGV0Yy4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKiAgQHBhcmFtIHtub2RlfSByb3cgIlRSIiBlbGVtZW50IGZvciB0aGUgY3VycmVudCByb3cKCQkgKiAgQHBhcmFtIHthcnJheX0gZGF0YSBSYXcgZGF0YSBhcnJheSBmb3IgdGhpcyByb3cKCQkgKiAgQHBhcmFtIHtpbnR9IGRpc3BsYXlJbmRleCBUaGUgZGlzcGxheSBpbmRleCBmb3IgdGhlIGN1cnJlbnQgdGFibGUgZHJhdwoJCSAqICBAcGFyYW0ge2ludH0gZGlzcGxheUluZGV4RnVsbCBUaGUgaW5kZXggb2YgdGhlIGRhdGEgaW4gdGhlIGZ1bGwgbGlzdCBvZgoJCSAqICAgIHJvd3MgKGFmdGVyIGZpbHRlcmluZykKCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5yb3dDYWxsYmFjawoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgInJvd0NhbGxiYWNrIjogZnVuY3Rpb24oIHJvdywgZGF0YSwgZGlzcGxheUluZGV4LCBkaXNwbGF5SW5kZXhGdWxsICkgewoJCSAqICAgICAgICAgIC8vIEJvbGQgdGhlIGdyYWRlIGZvciBhbGwgJ0EnIGdyYWRlIGJyb3dzZXJzCgkJICogICAgICAgICAgaWYgKCBkYXRhWzRdID09ICJBIiApIHsKCQkgKiAgICAgICAgICAgICQoJ3RkOmVxKDQpJywgcm93KS5odG1sKCAnPGI+QTwvYj4nICk7CgkJICogICAgICAgICAgfQoJCSAqICAgICAgICB9CgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJmblJvd0NhbGxiYWNrIjogbnVsbCwKCQoJCgkJLyoqCgkJICogX19EZXByZWNhdGVkX18gVGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgdGhpcyBwYXJhbWV0ZXIgaGFzIG5vdyBiZWVuCgkJICogc3VwZXJzZWRlZCBieSB0aGF0IHByb3ZpZGVkIHRocm91Z2ggYGFqYXhgLCB3aGljaCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgoJCSAqCgkJICogVGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBmdW5jdGlvbiB3aGljaCBvYnRhaW5zCgkJICogdGhlIGRhdGEgZnJvbSB0aGUgc2VydmVyIHNvIHNvbWV0aGluZyBtb3JlIHN1aXRhYmxlIGZvciB5b3VyIGFwcGxpY2F0aW9uLgoJCSAqIEZvciBleGFtcGxlIHlvdSBjb3VsZCB1c2UgUE9TVCBkYXRhLCBvciBwdWxsIGluZm9ybWF0aW9uIGZyb20gYSBHZWFycyBvcgoJCSAqIEFJUiBkYXRhYmFzZS4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKiAgQG1lbWJlcgoJCSAqICBAcGFyYW0ge3N0cmluZ30gc291cmNlIEhUVFAgc291cmNlIHRvIG9idGFpbiB0aGUgZGF0YSBmcm9tIChgYWpheGApCgkJICogIEBwYXJhbSB7YXJyYXl9IGRhdGEgQSBrZXkvdmFsdWUgcGFpciBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSB0byBzZW5kCgkJICogICAgdG8gdGhlIHNlcnZlcgoJCSAqICBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gY29tcGxldGlvbiBvZiB0aGUgZGF0YSBnZXQKCQkgKiAgICBwcm9jZXNzIHRoYXQgd2lsbCBkcmF3IHRoZSBkYXRhIG9uIHRoZSBwYWdlLgoJCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBkdG9wdCBTZXJ2ZXItc2lkZQoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuc2VydmVyRGF0YQoJCSAqCgkJICogIEBkZXByZWNhdGVkIDEuMTAuIFBsZWFzZSB1c2UgYGFqYXhgIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkgbm93LgoJCSAqLwoJCSJmblNlcnZlckRhdGEiOiBudWxsLAoJCgkKCQkvKioKCQkgKiBfX0RlcHJlY2F0ZWRfXyBUaGUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSB0aGlzIHBhcmFtZXRlciBoYXMgbm93IGJlZW4KCQkgKiBzdXBlcnNlZGVkIGJ5IHRoYXQgcHJvdmlkZWQgdGhyb3VnaCBgYWpheGAsIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCgkJICoKCQkgKiAgSXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIHNlbmQgZXh0cmEgZGF0YSB0byB0aGUgc2VydmVyIHdoZW4gbWFraW5nIGFuIEFqYXgKCQkgKiByZXF1ZXN0IC0gZm9yIGV4YW1wbGUgY3VzdG9tIGZpbHRlcmluZyBpbmZvcm1hdGlvbiwgYW5kIHRoaXMgY2FsbGJhY2sKCQkgKiBmdW5jdGlvbiBtYWtlcyBpdCB0cml2aWFsIHRvIHNlbmQgZXh0cmEgaW5mb3JtYXRpb24gdG8gdGhlIHNlcnZlci4gVGhlCgkJICogcGFzc2VkIGluIHBhcmFtZXRlciBpcyB0aGUgZGF0YSBzZXQgdGhhdCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBieQoJCSAqIERhdGFUYWJsZXMsIGFuZCB5b3UgY2FuIGFkZCB0byB0aGlzIG9yIG1vZGlmeSBpdCBhcyB5b3UgcmVxdWlyZS4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKiAgQHBhcmFtIHthcnJheX0gZGF0YSBEYXRhIGFycmF5IChhcnJheSBvZiBvYmplY3RzIHdoaWNoIGFyZSBuYW1lL3ZhbHVlCgkJICogICAgcGFpcnMpIHRoYXQgaGFzIGJlZW4gY29uc3RydWN0ZWQgYnkgRGF0YVRhYmxlcyBhbmQgd2lsbCBiZSBzZW50IHRvIHRoZQoJCSAqICAgIHNlcnZlci4gSW4gdGhlIGNhc2Ugb2YgQWpheCBzb3VyY2VkIGRhdGEgd2l0aCBzZXJ2ZXItc2lkZSBwcm9jZXNzaW5nCgkJICogICAgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IGFycmF5LCBmb3Igc2VydmVyLXNpZGUgcHJvY2Vzc2luZyB0aGVyZSB3aWxsIGJlIGEKCQkgKiAgICBzaWduaWZpY2FudCBudW1iZXIgb2YgcGFyYW1ldGVycyEKCQkgKiAgQHJldHVybnMge3VuZGVmaW5lZH0gRW5zdXJlIHRoYXQgeW91IG1vZGlmeSB0aGUgZGF0YSBhcnJheSBwYXNzZWQgaW4sCgkJICogICAgYXMgdGhpcyBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlLgoJCSAqCgkJICogIEBkdG9wdCBDYWxsYmFja3MKCQkgKiAgQGR0b3B0IFNlcnZlci1zaWRlCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5zZXJ2ZXJQYXJhbXMKCQkgKgoJCSAqICBAZGVwcmVjYXRlZCAxLjEwLiBQbGVhc2UgdXNlIGBhamF4YCBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5IG5vdy4KCQkgKi8KCQkiZm5TZXJ2ZXJQYXJhbXMiOiBudWxsLAoJCgkKCQkvKioKCQkgKiBMb2FkIHRoZSB0YWJsZSBzdGF0ZS4gV2l0aCB0aGlzIGZ1bmN0aW9uIHlvdSBjYW4gZGVmaW5lIGZyb20gd2hlcmUsIGFuZCBob3csIHRoZQoJCSAqIHN0YXRlIG9mIGEgdGFibGUgaXMgbG9hZGVkLiBCeSBkZWZhdWx0IERhdGFUYWJsZXMgd2lsbCBsb2FkIGZyb20gYGxvY2FsU3RvcmFnZWAKCQkgKiBidXQgeW91IG1pZ2h0IHdpc2ggdG8gdXNlIGEgc2VydmVyLXNpZGUgZGF0YWJhc2Ugb3IgY29va2llcy4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKiAgQG1lbWJlcgoJCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCQkgKiAgQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIENhbGxiYWNrIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIHdoZW4gZG9uZS4gSXQKCQkgKiAgICBzaG91bGQgYmUgcGFzc2VkIHRoZSBsb2FkZWQgc3RhdGUgb2JqZWN0LgoJCSAqICBAcmV0dXJuIHtvYmplY3R9IFRoZSBEYXRhVGFibGVzIHN0YXRlIG9iamVjdCB0byBiZSBsb2FkZWQKCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5zdGF0ZUxvYWRDYWxsYmFjawoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgInN0YXRlU2F2ZSI6IHRydWUsCgkJICogICAgICAgICJzdGF0ZUxvYWRDYWxsYmFjayI6IGZ1bmN0aW9uIChzZXR0aW5ncywgY2FsbGJhY2spIHsKCQkgKiAgICAgICAgICAkLmFqYXgoIHsKCQkgKiAgICAgICAgICAgICJ1cmwiOiAiL3N0YXRlX2xvYWQiLAoJCSAqICAgICAgICAgICAgImRhdGFUeXBlIjogImpzb24iLAoJCSAqICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbiAoanNvbikgewoJCSAqICAgICAgICAgICAgICBjYWxsYmFjaygganNvbiApOwoJCSAqICAgICAgICAgICAgfQoJCSAqICAgICAgICAgIH0gKTsKCQkgKiAgICAgICAgfQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkiZm5TdGF0ZUxvYWRDYWxsYmFjayI6IGZ1bmN0aW9uICggc2V0dGluZ3MgKSB7CgkJCXRyeSB7CgkJCQlyZXR1cm4gSlNPTi5wYXJzZSgKCQkJCQkoc2V0dGluZ3MuaVN0YXRlRHVyYXRpb24gPT09IC0xID8gc2Vzc2lvblN0b3JhZ2UgOiBsb2NhbFN0b3JhZ2UpLmdldEl0ZW0oCgkJCQkJCSdEYXRhVGFibGVzXycrc2V0dGluZ3Muc0luc3RhbmNlKydfJytsb2NhdGlvbi5wYXRobmFtZQoJCQkJCSkKCQkJCSk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiB7fTsKCQkJfQoJCX0sCgkKCQoJCS8qKgoJCSAqIENhbGxiYWNrIHdoaWNoIGFsbG93cyBtb2RpZmljYXRpb24gb2YgdGhlIHNhdmVkIHN0YXRlIHByaW9yIHRvIGxvYWRpbmcgdGhhdCBzdGF0ZS4KCQkgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSB0YWJsZSBpcyBsb2FkaW5nIHN0YXRlIGZyb20gdGhlIHN0b3JlZCBkYXRhLCBidXQKCQkgKiBwcmlvciB0byB0aGUgc2V0dGluZ3Mgb2JqZWN0IGJlaW5nIG1vZGlmaWVkIGJ5IHRoZSBzYXZlZCBzdGF0ZS4gTm90ZSB0aGF0IGZvcgoJCSAqIHBsdWctaW4gYXV0aG9ycywgeW91IHNob3VsZCB1c2UgdGhlIGBzdGF0ZUxvYWRQYXJhbXNgIGV2ZW50IHRvIGxvYWQgcGFyYW1ldGVycyBmb3IKCQkgKiBhIHBsdWctaW4uCgkJICogIEB0eXBlIGZ1bmN0aW9uCgkJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJCSAqICBAcGFyYW0ge29iamVjdH0gZGF0YSBUaGUgc3RhdGUgb2JqZWN0IHRoYXQgaXMgdG8gYmUgbG9hZGVkCgkJICoKCQkgKiAgQGR0b3B0IENhbGxiYWNrcwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuc3RhdGVMb2FkUGFyYW1zCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBSZW1vdmUgYSBzYXZlZCBmaWx0ZXIsIHNvIGZpbHRlcmluZyBpcyBuZXZlciBsb2FkZWQKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic3RhdGVTYXZlIjogdHJ1ZSwKCQkgKiAgICAgICAgInN0YXRlTG9hZFBhcmFtcyI6IGZ1bmN0aW9uIChzZXR0aW5ncywgZGF0YSkgewoJCSAqICAgICAgICAgIGRhdGEub1NlYXJjaC5zU2VhcmNoID0gIiI7CgkJICogICAgICAgIH0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBEaXNhbGxvdyBzdGF0ZSBsb2FkaW5nIGJ5IHJldHVybmluZyBmYWxzZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJzdGF0ZVNhdmUiOiB0cnVlLAoJCSAqICAgICAgICAic3RhdGVMb2FkUGFyYW1zIjogZnVuY3Rpb24gKHNldHRpbmdzLCBkYXRhKSB7CgkJICogICAgICAgICAgcmV0dXJuIGZhbHNlOwoJCSAqICAgICAgICB9CgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJmblN0YXRlTG9hZFBhcmFtcyI6IG51bGwsCgkKCQoJCS8qKgoJCSAqIENhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHN0YXRlIGhhcyBiZWVuIGxvYWRlZCBmcm9tIHRoZSBzdGF0ZSBzYXZpbmcgbWV0aG9kCgkJICogYW5kIHRoZSBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBhcyBhIHJlc3VsdCBvZiB0aGUgbG9hZGVkIHN0YXRlLgoJCSAqICBAdHlwZSBmdW5jdGlvbgoJCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCQkgKiAgQHBhcmFtIHtvYmplY3R9IGRhdGEgVGhlIHN0YXRlIG9iamVjdCB0aGF0IHdhcyBsb2FkZWQKCQkgKgoJCSAqICBAZHRvcHQgQ2FsbGJhY2tzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5zdGF0ZUxvYWRlZAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gU2hvdyBhbiBhbGVydCB3aXRoIHRoZSBmaWx0ZXJpbmcgdmFsdWUgdGhhdCB3YXMgc2F2ZWQKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic3RhdGVTYXZlIjogdHJ1ZSwKCQkgKiAgICAgICAgInN0YXRlTG9hZGVkIjogZnVuY3Rpb24gKHNldHRpbmdzLCBkYXRhKSB7CgkJICogICAgICAgICAgYWxlcnQoICdTYXZlZCBmaWx0ZXIgd2FzOiAnK2RhdGEub1NlYXJjaC5zU2VhcmNoICk7CgkJICogICAgICAgIH0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImZuU3RhdGVMb2FkZWQiOiBudWxsLAoJCgkKCQkvKioKCQkgKiBTYXZlIHRoZSB0YWJsZSBzdGF0ZS4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIGRlZmluZSB3aGVyZSBhbmQgaG93IHRoZSBzdGF0ZQoJCSAqIGluZm9ybWF0aW9uIGZvciB0aGUgdGFibGUgaXMgc3RvcmVkIEJ5IGRlZmF1bHQgRGF0YVRhYmxlcyB3aWxsIHVzZSBgbG9jYWxTdG9yYWdlYAoJCSAqIGJ1dCB5b3UgbWlnaHQgd2lzaCB0byB1c2UgYSBzZXJ2ZXItc2lkZSBkYXRhYmFzZSBvciBjb29raWVzLgoJCSAqICBAdHlwZSBmdW5jdGlvbgoJCSAqICBAbWVtYmVyCgkJICogIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJCSAqICBAcGFyYW0ge29iamVjdH0gZGF0YSBUaGUgc3RhdGUgb2JqZWN0IHRvIGJlIHNhdmVkCgkJICoKCQkgKiAgQGR0b3B0IENhbGxiYWNrcwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuc3RhdGVTYXZlQ2FsbGJhY2sKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJzdGF0ZVNhdmUiOiB0cnVlLAoJCSAqICAgICAgICAic3RhdGVTYXZlQ2FsbGJhY2siOiBmdW5jdGlvbiAoc2V0dGluZ3MsIGRhdGEpIHsKCQkgKiAgICAgICAgICAvLyBTZW5kIGFuIEFqYXggcmVxdWVzdCB0byB0aGUgc2VydmVyIHdpdGggdGhlIHN0YXRlIG9iamVjdAoJCSAqICAgICAgICAgICQuYWpheCggewoJCSAqICAgICAgICAgICAgInVybCI6ICIvc3RhdGVfc2F2ZSIsCgkJICogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCgkJICogICAgICAgICAgICAiZGF0YVR5cGUiOiAianNvbiIsCgkJICogICAgICAgICAgICAibWV0aG9kIjogIlBPU1QiCgkJICogICAgICAgICAgICAic3VjY2VzcyI6IGZ1bmN0aW9uICgpIHt9CgkJICogICAgICAgICAgfSApOwoJCSAqICAgICAgICB9CgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJmblN0YXRlU2F2ZUNhbGxiYWNrIjogZnVuY3Rpb24gKCBzZXR0aW5ncywgZGF0YSApIHsKCQkJdHJ5IHsKCQkJCShzZXR0aW5ncy5pU3RhdGVEdXJhdGlvbiA9PT0gLTEgPyBzZXNzaW9uU3RvcmFnZSA6IGxvY2FsU3RvcmFnZSkuc2V0SXRlbSgKCQkJCQknRGF0YVRhYmxlc18nK3NldHRpbmdzLnNJbnN0YW5jZSsnXycrbG9jYXRpb24ucGF0aG5hbWUsCgkJCQkJSlNPTi5zdHJpbmdpZnkoIGRhdGEgKQoJCQkJKTsKCQkJfSBjYXRjaCAoZSkge30KCQl9LAoJCgkKCQkvKioKCQkgKiBDYWxsYmFjayB3aGljaCBhbGxvd3MgbW9kaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZSB0byBiZSBzYXZlZC4gQ2FsbGVkIHdoZW4gdGhlIHRhYmxlCgkJICogaGFzIGNoYW5nZWQgc3RhdGUgYSBuZXcgc3RhdGUgc2F2ZSBpcyByZXF1aXJlZC4gVGhpcyBtZXRob2QgYWxsb3dzIG1vZGlmaWNhdGlvbiBvZgoJCSAqIHRoZSBzdGF0ZSBzYXZpbmcgb2JqZWN0IHByaW9yIHRvIGFjdHVhbGx5IGRvaW5nIHRoZSBzYXZlLCBpbmNsdWRpbmcgYWRkaXRpb24gb3IKCQkgKiBvdGhlciBzdGF0ZSBwcm9wZXJ0aWVzIG9yIG1vZGlmaWNhdGlvbi4gTm90ZSB0aGF0IGZvciBwbHVnLWluIGF1dGhvcnMsIHlvdSBzaG91bGQKCQkgKiB1c2UgdGhlIGBzdGF0ZVNhdmVQYXJhbXNgIGV2ZW50IHRvIHNhdmUgcGFyYW1ldGVycyBmb3IgYSBwbHVnLWluLgoJCSAqICBAdHlwZSBmdW5jdGlvbgoJCSAqICBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3MgRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCQkgKiAgQHBhcmFtIHtvYmplY3R9IGRhdGEgVGhlIHN0YXRlIG9iamVjdCB0byBiZSBzYXZlZAoJCSAqCgkJICogIEBkdG9wdCBDYWxsYmFja3MKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnN0YXRlU2F2ZVBhcmFtcwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gUmVtb3ZlIGEgc2F2ZWQgZmlsdGVyLCBzbyBmaWx0ZXJpbmcgaXMgbmV2ZXIgc2F2ZWQKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic3RhdGVTYXZlIjogdHJ1ZSwKCQkgKiAgICAgICAgInN0YXRlU2F2ZVBhcmFtcyI6IGZ1bmN0aW9uIChzZXR0aW5ncywgZGF0YSkgewoJCSAqICAgICAgICAgIGRhdGEub1NlYXJjaC5zU2VhcmNoID0gIiI7CgkJICogICAgICAgIH0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImZuU3RhdGVTYXZlUGFyYW1zIjogbnVsbCwKCQoJCgkJLyoqCgkJICogRHVyYXRpb24gZm9yIHdoaWNoIHRoZSBzYXZlZCBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBjb25zaWRlcmVkIHZhbGlkLiBBZnRlciB0aGlzIHBlcmlvZAoJCSAqIGhhcyBlbGFwc2VkIHRoZSBzdGF0ZSB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSBkZWZhdWx0LgoJCSAqIFZhbHVlIGlzIGdpdmVuIGluIHNlY29uZHMuCgkJICogIEB0eXBlIGludAoJCSAqICBAZGVmYXVsdCA3MjAwIDxpPigyIGhvdXJzKTwvaT4KCQkgKgoJCSAqICBAZHRvcHQgT3B0aW9ucwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuc3RhdGVEdXJhdGlvbgoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgInN0YXRlRHVyYXRpb24iOiA2MCo2MCoyNDsgLy8gMSBkYXkKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICkKCQkgKi8KCQkiaVN0YXRlRHVyYXRpb24iOiA3MjAwLAoJCgkKCQkvKioKCQkgKiBXaGVuIGVuYWJsZWQgRGF0YVRhYmxlcyB3aWxsIG5vdCBtYWtlIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIGZvciB0aGUgZmlyc3QKCQkgKiBwYWdlIGRyYXcgLSByYXRoZXIgaXQgd2lsbCB1c2UgdGhlIGRhdGEgYWxyZWFkeSBvbiB0aGUgcGFnZSAobm8gc29ydGluZyBldGMKCQkgKiB3aWxsIGJlIGFwcGxpZWQgdG8gaXQpLCB0aHVzIHNhdmluZyBvbiBhbiBYSFIgYXQgbG9hZCB0aW1lLiBgZGVmZXJMb2FkaW5nYAoJCSAqIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBkZWZlcnJlZCBsb2FkaW5nIGlzIHJlcXVpcmVkLCBidXQgaXQgaXMgYWxzbyB1c2VkCgkJICogdG8gdGVsbCBEYXRhVGFibGVzIGhvdyBtYW55IHJlY29yZHMgdGhlcmUgYXJlIGluIHRoZSBmdWxsIHRhYmxlIChhbGxvd2luZwoJCSAqIHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IGFuZCBwYWdpbmF0aW9uIHRvIGJlIGRpc3BsYXllZCBjb3JyZWN0bHkpLiBJbiB0aGUgY2FzZQoJCSAqIHdoZXJlIGEgZmlsdGVyaW5nIGlzIGFwcGxpZWQgdG8gdGhlIHRhYmxlIG9uIGluaXRpYWwgbG9hZCwgdGhpcyBjYW4gYmUKCQkgKiBpbmRpY2F0ZWQgYnkgZ2l2aW5nIHRoZSBwYXJhbWV0ZXIgYXMgYW4gYXJyYXksIHdoZXJlIHRoZSBmaXJzdCBlbGVtZW50IGlzCgkJICogdGhlIG51bWJlciBvZiByZWNvcmRzIGF2YWlsYWJsZSBhZnRlciBmaWx0ZXJpbmcgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUKCQkgKiBudW1iZXIgb2YgcmVjb3JkcyB3aXRob3V0IGZpbHRlcmluZyAoYWxsb3dpbmcgdGhlIHRhYmxlIGluZm9ybWF0aW9uIGVsZW1lbnQKCQkgKiB0byBiZSBzaG93biBjb3JyZWN0bHkpLgoJCSAqICBAdHlwZSBpbnQgfCBhcnJheQoJCSAqICBAZGVmYXVsdCBudWxsCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbnMKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmRlZmVyTG9hZGluZwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gNTcgcmVjb3JkcyBhdmFpbGFibGUgaW4gdGhlIHRhYmxlLCBubyBmaWx0ZXJpbmcgYXBwbGllZAoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJzZXJ2ZXJTaWRlIjogdHJ1ZSwKCQkgKiAgICAgICAgImFqYXgiOiAic2NyaXB0cy9zZXJ2ZXJfcHJvY2Vzc2luZy5waHAiLAoJCSAqICAgICAgICAiZGVmZXJMb2FkaW5nIjogNTcKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyA1NyByZWNvcmRzIGFmdGVyIGZpbHRlcmluZywgMTAwIHdpdGhvdXQgZmlsdGVyaW5nIChhbiBpbml0aWFsIGZpbHRlciBhcHBsaWVkKQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJzZXJ2ZXJTaWRlIjogdHJ1ZSwKCQkgKiAgICAgICAgImFqYXgiOiAic2NyaXB0cy9zZXJ2ZXJfcHJvY2Vzc2luZy5waHAiLAoJCSAqICAgICAgICAiZGVmZXJMb2FkaW5nIjogWyA1NywgMTAwIF0sCgkJICogICAgICAgICJzZWFyY2giOiB7CgkJICogICAgICAgICAgInNlYXJjaCI6ICJteV9maWx0ZXIiCgkJICogICAgICAgIH0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImlEZWZlckxvYWRpbmciOiBudWxsLAoJCgkKCQkvKioKCQkgKiBOdW1iZXIgb2Ygcm93cyB0byBkaXNwbGF5IG9uIGEgc2luZ2xlIHBhZ2Ugd2hlbiB1c2luZyBwYWdpbmF0aW9uLiBJZgoJCSAqIGZlYXR1cmUgZW5hYmxlZCAoYGxlbmd0aENoYW5nZWApIHRoZW4gdGhlIGVuZCB1c2VyIHdpbGwgYmUgYWJsZSB0byBvdmVycmlkZQoJCSAqIHRoaXMgdG8gYSBjdXN0b20gc2V0dGluZyB1c2luZyBhIHBvcC11cCBtZW51LgoJCSAqICBAdHlwZSBpbnQKCQkgKiAgQGRlZmF1bHQgMTAKCQkgKgoJCSAqICBAZHRvcHQgT3B0aW9ucwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMucGFnZUxlbmd0aAoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgInBhZ2VMZW5ndGgiOiA1MAoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKQoJCSAqLwoJCSJpRGlzcGxheUxlbmd0aCI6IDEwLAoJCgkKCQkvKioKCQkgKiBEZWZpbmUgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkYXRhIGRpc3BsYXkgd2hlbiB1c2luZyBEYXRhVGFibGVzIHdpdGgKCQkgKiBwYWdpbmF0aW9uLiBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiByZWNvcmRzLCByYXRoZXIgdGhhbgoJCSAqIHRoZSBwYWdlIG51bWJlciwgc28gaWYgeW91IGhhdmUgMTAgcmVjb3JkcyBwZXIgcGFnZSBhbmQgd2FudCB0byBzdGFydCBvbgoJCSAqIHRoZSB0aGlyZCBwYWdlLCBpdCBzaG91bGQgYmUgIjIwIi4KCQkgKiAgQHR5cGUgaW50CgkJICogIEBkZWZhdWx0IDAKCQkgKgoJCSAqICBAZHRvcHQgT3B0aW9ucwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuZGlzcGxheVN0YXJ0CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiZGlzcGxheVN0YXJ0IjogMjAKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICkKCQkgKi8KCQkiaURpc3BsYXlTdGFydCI6IDAsCgkKCQoJCS8qKgoJCSAqIEJ5IGRlZmF1bHQgRGF0YVRhYmxlcyBhbGxvd3Mga2V5Ym9hcmQgbmF2aWdhdGlvbiBvZiB0aGUgdGFibGUgKHNvcnRpbmcsIHBhZ2luZywKCQkgKiBhbmQgZmlsdGVyaW5nKSBieSBhZGRpbmcgYSBgdGFiaW5kZXhgIGF0dHJpYnV0ZSB0byB0aGUgcmVxdWlyZWQgZWxlbWVudHMuIFRoaXMKCQkgKiBhbGxvd3MgeW91IHRvIHRhYiB0aHJvdWdoIHRoZSBjb250cm9scyBhbmQgcHJlc3MgdGhlIGVudGVyIGtleSB0byBhY3RpdmF0ZSB0aGVtLgoJCSAqIFRoZSB0YWJpbmRleCBpcyBkZWZhdWx0IDAsIG1lYW5pbmcgdGhhdCB0aGUgdGFiIGZvbGxvd3MgdGhlIGZsb3cgb2YgdGhlIGRvY3VtZW50LgoJCSAqIFlvdSBjYW4gb3ZlcnJ1bGUgdGhpcyB1c2luZyB0aGlzIHBhcmFtZXRlciBpZiB5b3Ugd2lzaC4gVXNlIGEgdmFsdWUgb2YgLTEgdG8KCQkgKiBkaXNhYmxlIGJ1aWx0LWluIGtleWJvYXJkIG5hdmlnYXRpb24uCgkJICogIEB0eXBlIGludAoJCSAqICBAZGVmYXVsdCAwCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbnMKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnRhYkluZGV4CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAidGFiSW5kZXgiOiAxCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJpVGFiSW5kZXgiOiAwLAoJCgkKCQkvKioKCQkgKiBDbGFzc2VzIHRoYXQgRGF0YVRhYmxlcyBhc3NpZ25zIHRvIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgYW5kIGZlYXR1cmVzCgkJICogdGhhdCBpdCBhZGRzIHRvIHRoZSBIVE1MIHRhYmxlLiBUaGlzIGFsbG93cyBjbGFzc2VzIHRvIGJlIGNvbmZpZ3VyZWQKCQkgKiBkdXJpbmcgaW5pdGlhbGlzYXRpb24gaW4gYWRkaXRpb24gdG8gdGhyb3VnaCB0aGUgc3RhdGljCgkJICoge0BsaW5rIERhdGFUYWJsZS5leHQub1N0ZENsYXNzZXN9IG9iamVjdCkuCgkJICogIEBuYW1lc3BhY2UKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmNsYXNzZXMKCQkgKi8KCQkib0NsYXNzZXMiOiB7fSwKCQoJCgkJLyoqCgkJICogQWxsIHN0cmluZ3MgdGhhdCBEYXRhVGFibGVzIHVzZXMgaW4gdGhlIHVzZXIgaW50ZXJmYWNlIHRoYXQgaXQgY3JlYXRlcwoJCSAqIGFyZSBkZWZpbmVkIGluIHRoaXMgb2JqZWN0LCBhbGxvd2luZyB5b3UgdG8gbW9kaWZpZWQgdGhlbSBpbmRpdmlkdWFsbHkgb3IKCQkgKiBjb21wbGV0ZWx5IHJlcGxhY2UgdGhlbSBhbGwgYXMgcmVxdWlyZWQuCgkJICogIEBuYW1lc3BhY2UKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmxhbmd1YWdlCgkJICovCgkJIm9MYW5ndWFnZSI6IHsKCQkJLyoqCgkJCSAqIFN0cmluZ3MgdGhhdCBhcmUgdXNlZCBmb3IgV0FJLUFSSUEgbGFiZWxzIGFuZCBjb250cm9scyBvbmx5ICh0aGVzZSBhcmUgbm90CgkJCSAqIGFjdHVhbGx5IHZpc2libGUgb24gdGhlIHBhZ2UsIGJ1dCB3aWxsIGJlIHJlYWQgYnkgc2NyZWVucmVhZGVycywgYW5kIHRodXMKCQkJICogbXVzdCBiZSBpbnRlcm5hdGlvbmFsaXNlZCBhcyB3ZWxsKS4KCQkJICogIEBuYW1lc3BhY2UKCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS5hcmlhCgkJCSAqLwoJCQkib0FyaWEiOiB7CgkJCQkvKioKCQkJCSAqIEFSSUEgbGFiZWwgdGhhdCBpcyBhZGRlZCB0byB0aGUgdGFibGUgaGVhZGVycyB3aGVuIHRoZSBjb2x1bW4gbWF5IGJlCgkJCQkgKiBzb3J0ZWQgYXNjZW5kaW5nIGJ5IGFjdGl2aW5nIHRoZSBjb2x1bW4gKGNsaWNrIG9yIHJldHVybiB3aGVuIGZvY3VzZWQpLgoJCQkJICogTm90ZSB0aGF0IHRoZSBjb2x1bW4gaGVhZGVyIGlzIHByZWZpeGVkIHRvIHRoaXMgc3RyaW5nLgoJCQkJICogIEB0eXBlIHN0cmluZwoJCQkJICogIEBkZWZhdWx0IDogYWN0aXZhdGUgdG8gc29ydCBjb2x1bW4gYXNjZW5kaW5nCgkJCQkgKgoJCQkJICogIEBkdG9wdCBMYW5ndWFnZQoJCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS5hcmlhLnNvcnRBc2NlbmRpbmcKCQkJCSAqCgkJCQkgKiAgQGV4YW1wbGUKCQkJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkJCSAqICAgICAgICAibGFuZ3VhZ2UiOiB7CgkJCQkgKiAgICAgICAgICAiYXJpYSI6IHsKCQkJCSAqICAgICAgICAgICAgInNvcnRBc2NlbmRpbmciOiAiIC0gY2xpY2svcmV0dXJuIHRvIHNvcnQgYXNjZW5kaW5nIgoJCQkJICogICAgICAgICAgfQoJCQkJICogICAgICAgIH0KCQkJCSAqICAgICAgfSApOwoJCQkJICogICAgfSApOwoJCQkJICovCgkJCQkic1NvcnRBc2NlbmRpbmciOiAiOiBhY3RpdmF0ZSB0byBzb3J0IGNvbHVtbiBhc2NlbmRpbmciLAoJCgkJCQkvKioKCQkJCSAqIEFSSUEgbGFiZWwgdGhhdCBpcyBhZGRlZCB0byB0aGUgdGFibGUgaGVhZGVycyB3aGVuIHRoZSBjb2x1bW4gbWF5IGJlCgkJCQkgKiBzb3J0ZWQgZGVzY2VuZGluZyBieSBhY3RpdmluZyB0aGUgY29sdW1uIChjbGljayBvciByZXR1cm4gd2hlbiBmb2N1c2VkKS4KCQkJCSAqIE5vdGUgdGhhdCB0aGUgY29sdW1uIGhlYWRlciBpcyBwcmVmaXhlZCB0byB0aGlzIHN0cmluZy4KCQkJCSAqICBAdHlwZSBzdHJpbmcKCQkJCSAqICBAZGVmYXVsdCA6IGFjdGl2YXRlIHRvIHNvcnQgY29sdW1uIGFzY2VuZGluZwoJCQkJICoKCQkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2UuYXJpYS5zb3J0RGVzY2VuZGluZwoJCQkJICoKCQkJCSAqICBAZXhhbXBsZQoJCQkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCQkJICogICAgICAgICJsYW5ndWFnZSI6IHsKCQkJCSAqICAgICAgICAgICJhcmlhIjogewoJCQkJICogICAgICAgICAgICAic29ydERlc2NlbmRpbmciOiAiIC0gY2xpY2svcmV0dXJuIHRvIHNvcnQgZGVzY2VuZGluZyIKCQkJCSAqICAgICAgICAgIH0KCQkJCSAqICAgICAgICB9CgkJCQkgKiAgICAgIH0gKTsKCQkJCSAqICAgIH0gKTsKCQkJCSAqLwoJCQkJInNTb3J0RGVzY2VuZGluZyI6ICI6IGFjdGl2YXRlIHRvIHNvcnQgY29sdW1uIGRlc2NlbmRpbmciCgkJCX0sCgkKCQkJLyoqCgkJCSAqIFBhZ2luYXRpb24gc3RyaW5nIHVzZWQgYnkgRGF0YVRhYmxlcyBmb3IgdGhlIGJ1aWx0LWluIHBhZ2luYXRpb24KCQkJICogY29udHJvbCB0eXBlcy4KCQkJICogIEBuYW1lc3BhY2UKCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS5wYWdpbmF0ZQoJCQkgKi8KCQkJIm9QYWdpbmF0ZSI6IHsKCQkJCS8qKgoJCQkJICogVGV4dCB0byB1c2Ugd2hlbiB1c2luZyB0aGUgJ2Z1bGxfbnVtYmVycycgdHlwZSBvZiBwYWdpbmF0aW9uIGZvciB0aGUKCQkJCSAqIGJ1dHRvbiB0byB0YWtlIHRoZSB1c2VyIHRvIHRoZSBmaXJzdCBwYWdlLgoJCQkJICogIEB0eXBlIHN0cmluZwoJCQkJICogIEBkZWZhdWx0IEZpcnN0CgkJCQkgKgoJCQkJICogIEBkdG9wdCBMYW5ndWFnZQoJCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS5wYWdpbmF0ZS5maXJzdAoJCQkJICoKCQkJCSAqICBAZXhhbXBsZQoJCQkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCQkJICogICAgICAgICJsYW5ndWFnZSI6IHsKCQkJCSAqICAgICAgICAgICJwYWdpbmF0ZSI6IHsKCQkJCSAqICAgICAgICAgICAgImZpcnN0IjogIkZpcnN0IHBhZ2UiCgkJCQkgKiAgICAgICAgICB9CgkJCQkgKiAgICAgICAgfQoJCQkJICogICAgICB9ICk7CgkJCQkgKiAgICB9ICk7CgkJCQkgKi8KCQkJCSJzRmlyc3QiOiAiRmlyc3QiLAoJCgkKCQkJCS8qKgoJCQkJICogVGV4dCB0byB1c2Ugd2hlbiB1c2luZyB0aGUgJ2Z1bGxfbnVtYmVycycgdHlwZSBvZiBwYWdpbmF0aW9uIGZvciB0aGUKCQkJCSAqIGJ1dHRvbiB0byB0YWtlIHRoZSB1c2VyIHRvIHRoZSBsYXN0IHBhZ2UuCgkJCQkgKiAgQHR5cGUgc3RyaW5nCgkJCQkgKiAgQGRlZmF1bHQgTGFzdAoJCQkJICoKCQkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2UucGFnaW5hdGUubGFzdAoJCQkJICoKCQkJCSAqICBAZXhhbXBsZQoJCQkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCQkJICogICAgICAgICJsYW5ndWFnZSI6IHsKCQkJCSAqICAgICAgICAgICJwYWdpbmF0ZSI6IHsKCQkJCSAqICAgICAgICAgICAgImxhc3QiOiAiTGFzdCBwYWdlIgoJCQkJICogICAgICAgICAgfQoJCQkJICogICAgICAgIH0KCQkJCSAqICAgICAgfSApOwoJCQkJICogICAgfSApOwoJCQkJICovCgkJCQkic0xhc3QiOiAiTGFzdCIsCgkKCQoJCQkJLyoqCgkJCQkgKiBUZXh0IHRvIHVzZSBmb3IgdGhlICduZXh0JyBwYWdpbmF0aW9uIGJ1dHRvbiAodG8gdGFrZSB0aGUgdXNlciB0byB0aGUKCQkJCSAqIG5leHQgcGFnZSkuCgkJCQkgKiAgQHR5cGUgc3RyaW5nCgkJCQkgKiAgQGRlZmF1bHQgTmV4dAoJCQkJICoKCQkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2UucGFnaW5hdGUubmV4dAoJCQkJICoKCQkJCSAqICBAZXhhbXBsZQoJCQkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCQkJICogICAgICAgICJsYW5ndWFnZSI6IHsKCQkJCSAqICAgICAgICAgICJwYWdpbmF0ZSI6IHsKCQkJCSAqICAgICAgICAgICAgIm5leHQiOiAiTmV4dCBwYWdlIgoJCQkJICogICAgICAgICAgfQoJCQkJICogICAgICAgIH0KCQkJCSAqICAgICAgfSApOwoJCQkJICogICAgfSApOwoJCQkJICovCgkJCQkic05leHQiOiAiTmV4dCIsCgkKCQoJCQkJLyoqCgkJCQkgKiBUZXh0IHRvIHVzZSBmb3IgdGhlICdwcmV2aW91cycgcGFnaW5hdGlvbiBidXR0b24gKHRvIHRha2UgdGhlIHVzZXIgdG8KCQkJCSAqIHRoZSBwcmV2aW91cyBwYWdlKS4KCQkJCSAqICBAdHlwZSBzdHJpbmcKCQkJCSAqICBAZGVmYXVsdCBQcmV2aW91cwoJCQkJICoKCQkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2UucGFnaW5hdGUucHJldmlvdXMKCQkJCSAqCgkJCQkgKiAgQGV4YW1wbGUKCQkJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkJCSAqICAgICAgICAibGFuZ3VhZ2UiOiB7CgkJCQkgKiAgICAgICAgICAicGFnaW5hdGUiOiB7CgkJCQkgKiAgICAgICAgICAgICJwcmV2aW91cyI6ICJQcmV2aW91cyBwYWdlIgoJCQkJICogICAgICAgICAgfQoJCQkJICogICAgICAgIH0KCQkJCSAqICAgICAgfSApOwoJCQkJICogICAgfSApOwoJCQkJICovCgkJCQkic1ByZXZpb3VzIjogIlByZXZpb3VzIgoJCQl9LAoJCgkJCS8qKgoJCQkgKiBUaGlzIHN0cmluZyBpcyBzaG93biBpbiBwcmVmZXJlbmNlIHRvIGB6ZXJvUmVjb3Jkc2Agd2hlbiB0aGUgdGFibGUgaXMKCQkJICogZW1wdHkgb2YgZGF0YSAocmVnYXJkbGVzcyBvZiBmaWx0ZXJpbmcpLiBOb3RlIHRoYXQgdGhpcyBpcyBhbiBvcHRpb25hbAoJCQkgKiBwYXJhbWV0ZXIgLSBpZiBpdCBpcyBub3QgZ2l2ZW4sIHRoZSB2YWx1ZSBvZiBgemVyb1JlY29yZHNgIHdpbGwgYmUgdXNlZAoJCQkgKiBpbnN0ZWFkIChlaXRoZXIgdGhlIGRlZmF1bHQgb3IgZ2l2ZW4gdmFsdWUpLgoJCQkgKiAgQHR5cGUgc3RyaW5nCgkJCSAqICBAZGVmYXVsdCBObyBkYXRhIGF2YWlsYWJsZSBpbiB0YWJsZQoJCQkgKgoJCQkgKiAgQGR0b3B0IExhbmd1YWdlCgkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2UuZW1wdHlUYWJsZQoJCQkgKgoJCQkgKiAgQGV4YW1wbGUKCQkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJCSAqICAgICAgICAibGFuZ3VhZ2UiOiB7CgkJCSAqICAgICAgICAgICJlbXB0eVRhYmxlIjogIk5vIGRhdGEgYXZhaWxhYmxlIGluIHRhYmxlIgoJCQkgKiAgICAgICAgfQoJCQkgKiAgICAgIH0gKTsKCQkJICogICAgfSApOwoJCQkgKi8KCQkJInNFbXB0eVRhYmxlIjogIk5vIGRhdGEgYXZhaWxhYmxlIGluIHRhYmxlIiwKCQoJCgkJCS8qKgoJCQkgKiBUaGlzIHN0cmluZyBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgZW5kIHVzZXIgYWJvdXQgdGhlIGluZm9ybWF0aW9uCgkJCSAqIHRoYXQgaXMgY3VycmVudCBvbiBkaXNwbGF5IG9uIHRoZSBwYWdlLiBUaGUgZm9sbG93aW5nIHRva2VucyBjYW4gYmUKCQkJICogdXNlZCBpbiB0aGUgc3RyaW5nIGFuZCB3aWxsIGJlIGR5bmFtaWNhbGx5IHJlcGxhY2VkIGFzIHRoZSB0YWJsZQoJCQkgKiBkaXNwbGF5IHVwZGF0ZXMuIFRoaXMgdG9rZW5zIGNhbiBiZSBwbGFjZWQgYW55d2hlcmUgaW4gdGhlIHN0cmluZywgb3IKCQkJICogcmVtb3ZlZCBhcyBuZWVkZWQgYnkgdGhlIGxhbmd1YWdlIHJlcXVpcmVzOgoJCQkgKgoJCQkgKiAqIGBcX1NUQVJUXF9gIC0gRGlzcGxheSBpbmRleCBvZiB0aGUgZmlyc3QgcmVjb3JkIG9uIHRoZSBjdXJyZW50IHBhZ2UKCQkJICogKiBgXF9FTkRcX2AgLSBEaXNwbGF5IGluZGV4IG9mIHRoZSBsYXN0IHJlY29yZCBvbiB0aGUgY3VycmVudCBwYWdlCgkJCSAqICogYFxfVE9UQUxcX2AgLSBOdW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgdGFibGUgYWZ0ZXIgZmlsdGVyaW5nCgkJCSAqICogYFxfTUFYXF9gIC0gTnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIHRhYmxlIHdpdGhvdXQgZmlsdGVyaW5nCgkJCSAqICogYFxfUEFHRVxfYCAtIEN1cnJlbnQgcGFnZSBudW1iZXIKCQkJICogKiBgXF9QQUdFU1xfYCAtIFRvdGFsIG51bWJlciBvZiBwYWdlcyBvZiBkYXRhIGluIHRoZSB0YWJsZQoJCQkgKgoJCQkgKiAgQHR5cGUgc3RyaW5nCgkJCSAqICBAZGVmYXVsdCBTaG93aW5nIF9TVEFSVF8gdG8gX0VORF8gb2YgX1RPVEFMXyBlbnRyaWVzCgkJCSAqCgkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS5pbmZvCgkJCSAqCgkJCSAqICBAZXhhbXBsZQoJCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkJICogICAgICAgICJsYW5ndWFnZSI6IHsKCQkJICogICAgICAgICAgImluZm8iOiAiU2hvd2luZyBwYWdlIF9QQUdFXyBvZiBfUEFHRVNfIgoJCQkgKiAgICAgICAgfQoJCQkgKiAgICAgIH0gKTsKCQkJICogICAgfSApOwoJCQkgKi8KCQkJInNJbmZvIjogIlNob3dpbmcgX1NUQVJUXyB0byBfRU5EXyBvZiBfVE9UQUxfIGVudHJpZXMiLAoJCgkKCQkJLyoqCgkJCSAqIERpc3BsYXkgaW5mb3JtYXRpb24gc3RyaW5nIGZvciB3aGVuIHRoZSB0YWJsZSBpcyBlbXB0eS4gVHlwaWNhbGx5IHRoZQoJCQkgKiBmb3JtYXQgb2YgdGhpcyBzdHJpbmcgc2hvdWxkIG1hdGNoIGBpbmZvYC4KCQkJICogIEB0eXBlIHN0cmluZwoJCQkgKiAgQGRlZmF1bHQgU2hvd2luZyAwIHRvIDAgb2YgMCBlbnRyaWVzCgkJCSAqCgkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS5pbmZvRW1wdHkKCQkJICoKCQkJICogIEBleGFtcGxlCgkJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCQkgKiAgICAgICAgImxhbmd1YWdlIjogewoJCQkgKiAgICAgICAgICAiaW5mb0VtcHR5IjogIk5vIGVudHJpZXMgdG8gc2hvdyIKCQkJICogICAgICAgIH0KCQkJICogICAgICB9ICk7CgkJCSAqICAgIH0gKTsKCQkJICovCgkJCSJzSW5mb0VtcHR5IjogIlNob3dpbmcgMCB0byAwIG9mIDAgZW50cmllcyIsCgkKCQoJCQkvKioKCQkJICogV2hlbiBhIHVzZXIgZmlsdGVycyB0aGUgaW5mb3JtYXRpb24gaW4gYSB0YWJsZSwgdGhpcyBzdHJpbmcgaXMgYXBwZW5kZWQKCQkJICogdG8gdGhlIGluZm9ybWF0aW9uIChgaW5mb2ApIHRvIGdpdmUgYW4gaWRlYSBvZiBob3cgc3Ryb25nIHRoZSBmaWx0ZXJpbmcKCQkJICogaXMuIFRoZSB2YXJpYWJsZSBfTUFYXyBpcyBkeW5hbWljYWxseSB1cGRhdGVkLgoJCQkgKiAgQHR5cGUgc3RyaW5nCgkJCSAqICBAZGVmYXVsdCAoZmlsdGVyZWQgZnJvbSBfTUFYXyB0b3RhbCBlbnRyaWVzKQoJCQkgKgoJCQkgKiAgQGR0b3B0IExhbmd1YWdlCgkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2UuaW5mb0ZpbHRlcmVkCgkJCSAqCgkJCSAqICBAZXhhbXBsZQoJCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkJICogICAgICAgICJsYW5ndWFnZSI6IHsKCQkJICogICAgICAgICAgImluZm9GaWx0ZXJlZCI6ICIgLSBmaWx0ZXJpbmcgZnJvbSBfTUFYXyByZWNvcmRzIgoJCQkgKiAgICAgICAgfQoJCQkgKiAgICAgIH0gKTsKCQkJICogICAgfSApOwoJCQkgKi8KCQkJInNJbmZvRmlsdGVyZWQiOiAiKGZpbHRlcmVkIGZyb20gX01BWF8gdG90YWwgZW50cmllcykiLAoJCgkKCQkJLyoqCgkJCSAqIElmIGNhbiBiZSB1c2VmdWwgdG8gYXBwZW5kIGV4dHJhIGluZm9ybWF0aW9uIHRvIHRoZSBpbmZvIHN0cmluZyBhdCB0aW1lcywKCQkJICogYW5kIHRoaXMgdmFyaWFibGUgZG9lcyBleGFjdGx5IHRoYXQuIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSBhcHBlbmRlZCB0bwoJCQkgKiB0aGUgYGluZm9gIChgaW5mb0VtcHR5YCBhbmQgYGluZm9GaWx0ZXJlZGAgaW4gd2hhdGV2ZXIgY29tYmluYXRpb24gdGhleSBhcmUKCQkJICogYmVpbmcgdXNlZCkgYXQgYWxsIHRpbWVzLgoJCQkgKiAgQHR5cGUgc3RyaW5nCgkJCSAqICBAZGVmYXVsdCA8aT5FbXB0eSBzdHJpbmc8L2k+CgkJCSAqCgkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS5pbmZvUG9zdEZpeAoJCQkgKgoJCQkgKiAgQGV4YW1wbGUKCQkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJCSAqICAgICAgICAibGFuZ3VhZ2UiOiB7CgkJCSAqICAgICAgICAgICJpbmZvUG9zdEZpeCI6ICJBbGwgcmVjb3JkcyBzaG93biBhcmUgZGVyaXZlZCBmcm9tIHJlYWwgaW5mb3JtYXRpb24uIgoJCQkgKiAgICAgICAgfQoJCQkgKiAgICAgIH0gKTsKCQkJICogICAgfSApOwoJCQkgKi8KCQkJInNJbmZvUG9zdEZpeCI6ICIiLAoJCgkKCQkJLyoqCgkJCSAqIFRoaXMgZGVjaW1hbCBwbGFjZSBvcGVyYXRvciBpcyBhIGxpdHRsZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIKCQkJICogbGFuZ3VhZ2Ugb3B0aW9ucyBzaW5jZSBEYXRhVGFibGVzIGRvZXNuJ3Qgb3V0cHV0IGZsb2F0aW5nIHBvaW50CgkJCSAqIG51bWJlcnMsIHNvIGl0IHdvbid0IGV2ZXIgdXNlIHRoaXMgZm9yIGRpc3BsYXkgb2YgYSBudW1iZXIuIFJhdGhlciwKCQkJICogd2hhdCB0aGlzIHBhcmFtZXRlciBkb2VzIGlzIG1vZGlmeSB0aGUgc29ydCBtZXRob2RzIG9mIHRoZSB0YWJsZSBzbwoJCQkgKiB0aGF0IG51bWJlcnMgd2hpY2ggYXJlIGluIGEgZm9ybWF0IHdoaWNoIGhhcyBhIGNoYXJhY3RlciBvdGhlciB0aGFuCgkJCSAqIGEgcGVyaW9kIChgLmApIGFzIGEgZGVjaW1hbCBwbGFjZSB3aWxsIGJlIHNvcnRlZCBudW1lcmljYWxseS4KCQkJICoKCQkJICogTm90ZSB0aGF0IG51bWJlcnMgd2l0aCBkaWZmZXJlbnQgZGVjaW1hbCBwbGFjZXMgY2Fubm90IGJlIHNob3duIGluCgkJCSAqIHRoZSBzYW1lIHRhYmxlIGFuZCBzdGlsbCBiZSBzb3J0YWJsZSwgdGhlIHRhYmxlIG11c3QgYmUgY29uc2lzdGVudC4KCQkJICogSG93ZXZlciwgbXVsdGlwbGUgZGlmZmVyZW50IHRhYmxlcyBvbiB0aGUgcGFnZSBjYW4gdXNlIGRpZmZlcmVudAoJCQkgKiBkZWNpbWFsIHBsYWNlIGNoYXJhY3RlcnMuCgkJCSAqICBAdHlwZSBzdHJpbmcKCQkJICogIEBkZWZhdWx0IAoJCQkgKgoJCQkgKiAgQGR0b3B0IExhbmd1YWdlCgkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2UuZGVjaW1hbAoJCQkgKgoJCQkgKiAgQGV4YW1wbGUKCQkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJCSAqICAgICAgICAibGFuZ3VhZ2UiOiB7CgkJCSAqICAgICAgICAgICJkZWNpbWFsIjogIiwiCgkJCSAqICAgICAgICAgICJ0aG91c2FuZHMiOiAiLiIKCQkJICogICAgICAgIH0KCQkJICogICAgICB9ICk7CgkJCSAqICAgIH0gKTsKCQkJICovCgkJCSJzRGVjaW1hbCI6ICIiLAoJCgkKCQkJLyoqCgkJCSAqIERhdGFUYWJsZXMgaGFzIGEgYnVpbGQgaW4gbnVtYmVyIGZvcm1hdHRlciAoYGZvcm1hdE51bWJlcmApIHdoaWNoIGlzCgkJCSAqIHVzZWQgdG8gZm9ybWF0IGxhcmdlIG51bWJlcnMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgdGFibGUgaW5mb3JtYXRpb24uCgkJCSAqIEJ5IGRlZmF1bHQgYSBjb21tYSBpcyB1c2VkLCBidXQgdGhpcyBjYW4gYmUgdHJpdmlhbGx5IGNoYW5nZWQgdG8gYW55CgkJCSAqIGNoYXJhY3RlciB5b3Ugd2lzaCB3aXRoIHRoaXMgcGFyYW1ldGVyLgoJCQkgKiAgQHR5cGUgc3RyaW5nCgkJCSAqICBAZGVmYXVsdCAsCgkJCSAqCgkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS50aG91c2FuZHMKCQkJICoKCQkJICogIEBleGFtcGxlCgkJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCQkgKiAgICAgICAgImxhbmd1YWdlIjogewoJCQkgKiAgICAgICAgICAidGhvdXNhbmRzIjogIiciCgkJCSAqICAgICAgICB9CgkJCSAqICAgICAgfSApOwoJCQkgKiAgICB9ICk7CgkJCSAqLwoJCQkic1Rob3VzYW5kcyI6ICIsIiwKCQoJCgkJCS8qKgoJCQkgKiBEZXRhaWwgdGhlIGFjdGlvbiB0aGF0IHdpbGwgYmUgdGFrZW4gd2hlbiB0aGUgZHJvcCBkb3duIG1lbnUgZm9yIHRoZQoJCQkgKiBwYWdpbmF0aW9uIGxlbmd0aCBvcHRpb24gaXMgY2hhbmdlZC4gVGhlICdfTUVOVV8nIHZhcmlhYmxlIGlzIHJlcGxhY2VkCgkJCSAqIHdpdGggYSBkZWZhdWx0IHNlbGVjdCBsaXN0IG9mIDEwLCAyNSwgNTAgYW5kIDEwMCwgYW5kIGNhbiBiZSByZXBsYWNlZAoJCQkgKiB3aXRoIGEgY3VzdG9tIHNlbGVjdCBib3ggaWYgcmVxdWlyZWQuCgkJCSAqICBAdHlwZSBzdHJpbmcKCQkJICogIEBkZWZhdWx0IFNob3cgX01FTlVfIGVudHJpZXMKCQkJICoKCQkJICogIEBkdG9wdCBMYW5ndWFnZQoJCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmxhbmd1YWdlLmxlbmd0aE1lbnUKCQkJICoKCQkJICogIEBleGFtcGxlCgkJCSAqICAgIC8vIExhbmd1YWdlIGNoYW5nZSBvbmx5CgkJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCQkgKiAgICAgICAgImxhbmd1YWdlIjogewoJCQkgKiAgICAgICAgICAibGVuZ3RoTWVudSI6ICJEaXNwbGF5IF9NRU5VXyByZWNvcmRzIgoJCQkgKiAgICAgICAgfQoJCQkgKiAgICAgIH0gKTsKCQkJICogICAgfSApOwoJCQkgKgoJCQkgKiAgQGV4YW1wbGUKCQkJICogICAgLy8gTGFuZ3VhZ2UgYW5kIG9wdGlvbnMgY2hhbmdlCgkJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCQkgKiAgICAgICAgImxhbmd1YWdlIjogewoJCQkgKiAgICAgICAgICAibGVuZ3RoTWVudSI6ICdEaXNwbGF5IDxzZWxlY3Q+JysKCQkJICogICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iMTAiPjEwPC9vcHRpb24+JysKCQkJICogICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iMjAiPjIwPC9vcHRpb24+JysKCQkJICogICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iMzAiPjMwPC9vcHRpb24+JysKCQkJICogICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iNDAiPjQwPC9vcHRpb24+JysKCQkJICogICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iNTAiPjUwPC9vcHRpb24+JysKCQkJICogICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iLTEiPkFsbDwvb3B0aW9uPicrCgkJCSAqICAgICAgICAgICAgJzwvc2VsZWN0PiByZWNvcmRzJwoJCQkgKiAgICAgICAgfQoJCQkgKiAgICAgIH0gKTsKCQkJICogICAgfSApOwoJCQkgKi8KCQkJInNMZW5ndGhNZW51IjogIlNob3cgX01FTlVfIGVudHJpZXMiLAoJCgkKCQkJLyoqCgkJCSAqIFdoZW4gdXNpbmcgQWpheCBzb3VyY2VkIGRhdGEgYW5kIGR1cmluZyB0aGUgZmlyc3QgZHJhdyB3aGVuIERhdGFUYWJsZXMgaXMKCQkJICogZ2F0aGVyaW5nIHRoZSBkYXRhLCB0aGlzIG1lc3NhZ2UgaXMgc2hvd24gaW4gYW4gZW1wdHkgcm93IGluIHRoZSB0YWJsZSB0bwoJCQkgKiBpbmRpY2F0ZSB0byB0aGUgZW5kIHVzZXIgdGhlIHRoZSBkYXRhIGlzIGJlaW5nIGxvYWRlZC4gTm90ZSB0aGF0IHRoaXMKCQkJICogcGFyYW1ldGVyIGlzIG5vdCB1c2VkIHdoZW4gbG9hZGluZyBkYXRhIGJ5IHNlcnZlci1zaWRlIHByb2Nlc3NpbmcsIGp1c3QKCQkJICogQWpheCBzb3VyY2VkIGRhdGEgd2l0aCBjbGllbnQtc2lkZSBwcm9jZXNzaW5nLgoJCQkgKiAgQHR5cGUgc3RyaW5nCgkJCSAqICBAZGVmYXVsdCBMb2FkaW5nLi4uCgkJCSAqCgkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS5sb2FkaW5nUmVjb3JkcwoJCQkgKgoJCQkgKiAgQGV4YW1wbGUKCQkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJCSAqICAgICAgICAibGFuZ3VhZ2UiOiB7CgkJCSAqICAgICAgICAgICJsb2FkaW5nUmVjb3JkcyI6ICJQbGVhc2Ugd2FpdCAtIGxvYWRpbmcuLi4iCgkJCSAqICAgICAgICB9CgkJCSAqICAgICAgfSApOwoJCQkgKiAgICB9ICk7CgkJCSAqLwoJCQkic0xvYWRpbmdSZWNvcmRzIjogIkxvYWRpbmcuLi4iLAoJCgkKCQkJLyoqCgkJCSAqIFRleHQgd2hpY2ggaXMgZGlzcGxheWVkIHdoZW4gdGhlIHRhYmxlIGlzIHByb2Nlc3NpbmcgYSB1c2VyIGFjdGlvbgoJCQkgKiAodXN1YWxseSBhIHNvcnQgY29tbWFuZCBvciBzaW1pbGFyKS4KCQkJICogIEB0eXBlIHN0cmluZwoJCQkgKgoJCQkgKiAgQGR0b3B0IExhbmd1YWdlCgkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2UucHJvY2Vzc2luZwoJCQkgKgoJCQkgKiAgQGV4YW1wbGUKCQkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJCSAqICAgICAgICAibGFuZ3VhZ2UiOiB7CgkJCSAqICAgICAgICAgICJwcm9jZXNzaW5nIjogIkRhdGFUYWJsZXMgaXMgY3VycmVudGx5IGJ1c3kiCgkJCSAqICAgICAgICB9CgkJCSAqICAgICAgfSApOwoJCQkgKiAgICB9ICk7CgkJCSAqLwoJCQkic1Byb2Nlc3NpbmciOiAiIiwKCQoJCgkJCS8qKgoJCQkgKiBEZXRhaWxzIHRoZSBhY3Rpb25zIHRoYXQgd2lsbCBiZSB0YWtlbiB3aGVuIHRoZSB1c2VyIHR5cGVzIGludG8gdGhlCgkJCSAqIGZpbHRlcmluZyBpbnB1dCB0ZXh0IGJveC4gVGhlIHZhcmlhYmxlICJfSU5QVVRfIiwgaWYgdXNlZCBpbiB0aGUgc3RyaW5nLAoJCQkgKiBpcyByZXBsYWNlZCB3aXRoIHRoZSBIVE1MIHRleHQgYm94IGZvciB0aGUgZmlsdGVyaW5nIGlucHV0IGFsbG93aW5nCgkJCSAqIGNvbnRyb2wgb3ZlciB3aGVyZSBpdCBhcHBlYXJzIGluIHRoZSBzdHJpbmcuIElmICJfSU5QVVRfIiBpcyBub3QgZ2l2ZW4KCQkJICogdGhlbiB0aGUgaW5wdXQgYm94IGlzIGFwcGVuZGVkIHRvIHRoZSBzdHJpbmcgYXV0b21hdGljYWxseS4KCQkJICogIEB0eXBlIHN0cmluZwoJCQkgKiAgQGRlZmF1bHQgU2VhcmNoOgoJCQkgKgoJCQkgKiAgQGR0b3B0IExhbmd1YWdlCgkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2Uuc2VhcmNoCgkJCSAqCgkJCSAqICBAZXhhbXBsZQoJCQkgKiAgICAvLyBJbnB1dCB0ZXh0IGJveCB3aWxsIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgYXV0b21hdGljYWxseQoJCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkJICogICAgICAgICJsYW5ndWFnZSI6IHsKCQkJICogICAgICAgICAgInNlYXJjaCI6ICJGaWx0ZXIgcmVjb3JkczoiCgkJCSAqICAgICAgICB9CgkJCSAqICAgICAgfSApOwoJCQkgKiAgICB9ICk7CgkJCSAqCgkJCSAqICBAZXhhbXBsZQoJCQkgKiAgICAvLyBTcGVjaWZ5IHdoZXJlIHRoZSBmaWx0ZXIgc2hvdWxkIGFwcGVhcgoJCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkJICogICAgICAgICJsYW5ndWFnZSI6IHsKCQkJICogICAgICAgICAgInNlYXJjaCI6ICJBcHBseSBmaWx0ZXIgX0lOUFVUXyB0byB0YWJsZSIKCQkJICogICAgICAgIH0KCQkJICogICAgICB9ICk7CgkJCSAqICAgIH0gKTsKCQkJICovCgkJCSJzU2VhcmNoIjogIlNlYXJjaDoiLAoJCgkKCQkJLyoqCgkJCSAqIEFzc2lnbiBhIGBwbGFjZWhvbGRlcmAgYXR0cmlidXRlIHRvIHRoZSBzZWFyY2ggYGlucHV0YCBlbGVtZW50CgkJCSAqICBAdHlwZSBzdHJpbmcKCQkJICogIEBkZWZhdWx0IAoJCQkgKgoJCQkgKiAgQGR0b3B0IExhbmd1YWdlCgkJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMubGFuZ3VhZ2Uuc2VhcmNoUGxhY2Vob2xkZXIKCQkJICovCgkJCSJzU2VhcmNoUGxhY2Vob2xkZXIiOiAiIiwKCQoJCgkJCS8qKgoJCQkgKiBBbGwgb2YgdGhlIGxhbmd1YWdlIGluZm9ybWF0aW9uIGNhbiBiZSBzdG9yZWQgaW4gYSBmaWxlIG9uIHRoZQoJCQkgKiBzZXJ2ZXItc2lkZSwgd2hpY2ggRGF0YVRhYmxlcyB3aWxsIGxvb2sgdXAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkLgoJCQkgKiBJdCBtdXN0IHN0b3JlIHRoZSBVUkwgb2YgdGhlIGxhbmd1YWdlIGZpbGUsIHdoaWNoIGlzIGluIGEgSlNPTiBmb3JtYXQsCgkJCSAqIGFuZCB0aGUgb2JqZWN0IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSBvTGFuZ3VhZ2Ugb2JqZWN0IGluIHRoZQoJCQkgKiBpbml0aWFsaXNlciBvYmplY3QgKGkuZS4gdGhlIGFib3ZlIHBhcmFtZXRlcnMpLiBQbGVhc2UgcmVmZXIgdG8gb25lIG9mCgkJCSAqIHRoZSBleGFtcGxlIGxhbmd1YWdlIGZpbGVzIHRvIHNlZSBob3cgdGhpcyB3b3JrcyBpbiBhY3Rpb24uCgkJCSAqICBAdHlwZSBzdHJpbmcKCQkJICogIEBkZWZhdWx0IDxpPkVtcHR5IHN0cmluZyAtIGkuZS4gZGlzYWJsZWQ8L2k+CgkJCSAqCgkJCSAqICBAZHRvcHQgTGFuZ3VhZ2UKCQkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5sYW5ndWFnZS51cmwKCQkJICoKCQkJICogIEBleGFtcGxlCgkJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCQkgKiAgICAgICAgImxhbmd1YWdlIjogewoJCQkgKiAgICAgICAgICAidXJsIjogImh0dHA6Ly93d3cuc3ByeW1lZGlhLmNvLnVrL2RhdGFUYWJsZXMvbGFuZy50eHQiCgkJCSAqICAgICAgICB9CgkJCSAqICAgICAgfSApOwoJCQkgKiAgICB9ICk7CgkJCSAqLwoJCQkic1VybCI6ICIiLAoJCgkKCQkJLyoqCgkJCSAqIFRleHQgc2hvd24gaW5zaWRlIHRoZSB0YWJsZSByZWNvcmRzIHdoZW4gdGhlIGlzIG5vIGluZm9ybWF0aW9uIHRvIGJlCgkJCSAqIGRpc3BsYXllZCBhZnRlciBmaWx0ZXJpbmcuIGBlbXB0eVRhYmxlYCBpcyBzaG93biB3aGVuIHRoZXJlIGlzIHNpbXBseSBubwoJCQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgdGFibGUgYXQgYWxsIChyZWdhcmRsZXNzIG9mIGZpbHRlcmluZykuCgkJCSAqICBAdHlwZSBzdHJpbmcKCQkJICogIEBkZWZhdWx0IE5vIG1hdGNoaW5nIHJlY29yZHMgZm91bmQKCQkJICoKCQkJICogIEBkdG9wdCBMYW5ndWFnZQoJCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmxhbmd1YWdlLnplcm9SZWNvcmRzCgkJCSAqCgkJCSAqICBAZXhhbXBsZQoJCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkJICogICAgICAgICJsYW5ndWFnZSI6IHsKCQkJICogICAgICAgICAgInplcm9SZWNvcmRzIjogIk5vIHJlY29yZHMgdG8gZGlzcGxheSIKCQkJICogICAgICAgIH0KCQkJICogICAgICB9ICk7CgkJCSAqICAgIH0gKTsKCQkJICovCgkJCSJzWmVyb1JlY29yZHMiOiAiTm8gbWF0Y2hpbmcgcmVjb3JkcyBmb3VuZCIKCQl9LAoJCgkKCQkvKioKCQkgKiBUaGlzIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIGhhdmUgZGVmaW5lIHRoZSBnbG9iYWwgZmlsdGVyaW5nIHN0YXRlIGF0CgkJICogaW5pdGlhbGlzYXRpb24gdGltZS4gQXMgYW4gb2JqZWN0IHRoZSBgc2VhcmNoYCBwYXJhbWV0ZXIgbXVzdCBiZQoJCSAqIGRlZmluZWQsIGJ1dCBhbGwgb3RoZXIgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwuIFdoZW4gYHJlZ2V4YCBpcyB0cnVlLAoJCSAqIHRoZSBzZWFyY2ggc3RyaW5nIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgd2hlbiBmYWxzZQoJCSAqIChkZWZhdWx0KSBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzdHJhaWdodCBzdHJpbmcuIFdoZW4gYHNtYXJ0YAoJCSAqIERhdGFUYWJsZXMgd2lsbCB1c2UgaXQncyBzbWFydCBmaWx0ZXJpbmcgbWV0aG9kcyAodG8gd29yZCBtYXRjaCBhdAoJCSAqIGFueSBwb2ludCBpbiB0aGUgZGF0YSksIHdoZW4gZmFsc2UgdGhpcyB3aWxsIG5vdCBiZSBkb25lLgoJCSAqICBAbmFtZXNwYWNlCgkJICogIEBleHRlbmRzIERhdGFUYWJsZS5tb2RlbHMub1NlYXJjaAoJCSAqCgkJICogIEBkdG9wdCBPcHRpb25zCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5zZWFyY2gKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJzZWFyY2giOiB7InNlYXJjaCI6ICJJbml0aWFsIHNlYXJjaCJ9CgkJICogICAgICB9ICk7CgkJICogICAgfSApCgkJICovCgkJIm9TZWFyY2giOiAkLmV4dGVuZCgge30sIERhdGFUYWJsZS5tb2RlbHMub1NlYXJjaCApLAoJCgkKCQkvKioKCQkgKiBfX0RlcHJlY2F0ZWRfXyBUaGUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSB0aGlzIHBhcmFtZXRlciBoYXMgbm93IGJlZW4KCQkgKiBzdXBlcnNlZGVkIGJ5IHRoYXQgcHJvdmlkZWQgdGhyb3VnaCBgYWpheGAsIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCgkJICoKCQkgKiBCeSBkZWZhdWx0IERhdGFUYWJsZXMgd2lsbCBsb29rIGZvciB0aGUgcHJvcGVydHkgYGRhdGFgIChvciBgYWFEYXRhYCBmb3IKCQkgKiBjb21wYXRpYmlsaXR5IHdpdGggRGF0YVRhYmxlcyAxLjktKSB3aGVuIG9idGFpbmluZyBkYXRhIGZyb20gYW4gQWpheAoJCSAqIHNvdXJjZSBvciBmb3Igc2VydmVyLXNpZGUgcHJvY2Vzc2luZyAtIHRoaXMgcGFyYW1ldGVyIGFsbG93cyB0aGF0CgkJICogcHJvcGVydHkgdG8gYmUgY2hhbmdlZC4gWW91IGNhbiB1c2UgSmF2YXNjcmlwdCBkb3R0ZWQgb2JqZWN0IG5vdGF0aW9uIHRvCgkJICogZ2V0IGEgZGF0YSBzb3VyY2UgZm9yIG11bHRpcGxlIGxldmVscyBvZiBuZXN0aW5nLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgZGF0YQoJCSAqCgkJICogIEBkdG9wdCBPcHRpb25zCgkJICogIEBkdG9wdCBTZXJ2ZXItc2lkZQoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuYWpheERhdGFQcm9wCgkJICoKCQkgKiAgQGRlcHJlY2F0ZWQgMS4xMC4gUGxlYXNlIHVzZSBgYWpheGAgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBub3cuCgkJICovCgkJInNBamF4RGF0YVByb3AiOiAiZGF0YSIsCgkKCQoJCS8qKgoJCSAqIF9fRGVwcmVjYXRlZF9fIFRoZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoaXMgcGFyYW1ldGVyIGhhcyBub3cgYmVlbgoJCSAqIHN1cGVyc2VkZWQgYnkgdGhhdCBwcm92aWRlZCB0aHJvdWdoIGBhamF4YCwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KCQkgKgoJCSAqIFlvdSBjYW4gaW5zdHJ1Y3QgRGF0YVRhYmxlcyB0byBsb2FkIGRhdGEgZnJvbSBhbiBleHRlcm5hbAoJCSAqIHNvdXJjZSB1c2luZyB0aGlzIHBhcmFtZXRlciAodXNlIGFEYXRhIGlmIHlvdSB3YW50IHRvIHBhc3MgZGF0YSBpbiB5b3UKCQkgKiBhbHJlYWR5IGhhdmUpLiBTaW1wbHkgcHJvdmlkZSBhIHVybCBhIEpTT04gb2JqZWN0IGNhbiBiZSBvYnRhaW5lZCBmcm9tLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqCgkJICogIEBkdG9wdCBPcHRpb25zCgkJICogIEBkdG9wdCBTZXJ2ZXItc2lkZQoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuYWpheFNvdXJjZQoJCSAqCgkJICogIEBkZXByZWNhdGVkIDEuMTAuIFBsZWFzZSB1c2UgYGFqYXhgIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkgbm93LgoJCSAqLwoJCSJzQWpheFNvdXJjZSI6IG51bGwsCgkKCQoJCS8qKgoJCSAqIFRoaXMgaW5pdGlhbGlzYXRpb24gdmFyaWFibGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGV4YWN0bHkgd2hlcmUgaW4gdGhlCgkJICogRE9NIHlvdSB3YW50IERhdGFUYWJsZXMgdG8gaW5qZWN0IHRoZSB2YXJpb3VzIGNvbnRyb2xzIGl0IGFkZHMgdG8gdGhlIHBhZ2UKCQkgKiAoZm9yIGV4YW1wbGUgeW91IG1pZ2h0IHdhbnQgdGhlIHBhZ2luYXRpb24gY29udHJvbHMgYXQgdGhlIHRvcCBvZiB0aGUKCQkgKiB0YWJsZSkuIERJViBlbGVtZW50cyAod2l0aCBvciB3aXRob3V0IGEgY3VzdG9tIGNsYXNzKSBjYW4gYWxzbyBiZSBhZGRlZCB0bwoJCSAqIGFpZCBzdHlsaW5nLiBUaGUgZm9sbG93IHN5bnRheCBpcyB1c2VkOgoJCSAqICAgPHVsPgoJCSAqICAgICA8bGk+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhbGxvd2VkOgoJCSAqICAgICAgIDx1bD4KCQkgKiAgICAgICAgIDxsaT4nbCcgLSBMZW5ndGggY2hhbmdpbmc8L2xpPgoJCSAqICAgICAgICAgPGxpPidmJyAtIEZpbHRlcmluZyBpbnB1dDwvbGk+CgkJICogICAgICAgICA8bGk+J3QnIC0gVGhlIHRhYmxlITwvbGk+CgkJICogICAgICAgICA8bGk+J2knIC0gSW5mb3JtYXRpb248L2xpPgoJCSAqICAgICAgICAgPGxpPidwJyAtIFBhZ2luYXRpb248L2xpPgoJCSAqICAgICAgICAgPGxpPidyJyAtIHBSb2Nlc3Npbmc8L2xpPgoJCSAqICAgICAgIDwvdWw+CgkJICogICAgIDwvbGk+CgkJICogICAgIDxsaT5UaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgYWxsb3dlZDoKCQkgKiAgICAgICA8dWw+CgkJICogICAgICAgICA8bGk+J0gnIC0galF1ZXJ5VUkgdGhlbWUgImhlYWRlciIgY2xhc3NlcyAoJ2ZnLXRvb2xiYXIgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItdGwgdWktY29ybmVyLXRyIHVpLWhlbHBlci1jbGVhcmZpeCcpPC9saT4KCQkgKiAgICAgICAgIDxsaT4nRicgLSBqUXVlcnlVSSB0aGVtZSAiZm9vdGVyIiBjbGFzc2VzICgnZmctdG9vbGJhciB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1ibCB1aS1jb3JuZXItYnIgdWktaGVscGVyLWNsZWFyZml4Jyk8L2xpPgoJCSAqICAgICAgIDwvdWw+CgkJICogICAgIDwvbGk+CgkJICogICAgIDxsaT5UaGUgZm9sbG93aW5nIHN5bnRheCBpcyBleHBlY3RlZDoKCQkgKiAgICAgICA8dWw+CgkJICogICAgICAgICA8bGk+JyZsdDsnIGFuZCAnJmd0OycgLSBkaXYgZWxlbWVudHM8L2xpPgoJCSAqICAgICAgICAgPGxpPicmbHQ7ImNsYXNzIiBhbmQgJyZndDsnIC0gZGl2IHdpdGggYSBjbGFzczwvbGk+CgkJICogICAgICAgICA8bGk+JyZsdDsiI2lkIiBhbmQgJyZndDsnIC0gZGl2IHdpdGggYW4gSUQ8L2xpPgoJCSAqICAgICAgIDwvdWw+CgkJICogICAgIDwvbGk+CgkJICogICAgIDxsaT5FeGFtcGxlczoKCQkgKiAgICAgICA8dWw+CgkJICogICAgICAgICA8bGk+JyZsdDsid3JhcHBlciJmbGlwdCZndDsnPC9saT4KCQkgKiAgICAgICAgIDxsaT4nJmx0O2xmJmx0O3QmZ3Q7aXAmZ3Q7JzwvbGk+CgkJICogICAgICAgPC91bD4KCQkgKiAgICAgPC9saT4KCQkgKiAgIDwvdWw+CgkJICogIEB0eXBlIHN0cmluZwoJCSAqICBAZGVmYXVsdCBsZnJ0aXAgPGk+KHdoZW4gYGpRdWVyeVVJYCBpcyBmYWxzZSk8L2k+IDxiPm9yPC9iPgoJCSAqICAgIDwiSCJsZnI+dDwiRiJpcD4gPGk+KHdoZW4gYGpRdWVyeVVJYCBpcyB0cnVlKTwvaT4KCQkgKgoJCSAqICBAZHRvcHQgT3B0aW9ucwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuZG9tCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiZG9tIjogJyZsdDsidG9wImkmZ3Q7cnQmbHQ7ImJvdHRvbSJmbHAmZ3Q7Jmx0OyJjbGVhciImZ3Q7JwoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkic0RvbSI6ICJsZnJ0aXAiLAoJCgkKCQkvKioKCQkgKiBTZWFyY2ggZGVsYXkgb3B0aW9uLiBUaGlzIHdpbGwgdGhyb3R0bGUgZnVsbCB0YWJsZSBzZWFyY2hlcyB0aGF0IHVzZSB0aGUKCQkgKiBEYXRhVGFibGVzIHByb3ZpZGVkIHNlYXJjaCBpbnB1dCBlbGVtZW50IChpdCBkb2VzIG5vdCBlZmZlY3QgY2FsbHMgdG8KCQkgKiBgZHQtYXBpIHNlYXJjaCgpYCwgcHJvdmlkaW5nIGEgZGVsYXkgYmVmb3JlIHRoZSBzZWFyY2ggaXMgbWFkZS4KCQkgKiAgQHR5cGUgaW50ZWdlcgoJCSAqICBAZGVmYXVsdCAwCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbnMKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnNlYXJjaERlbGF5CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic2VhcmNoRGVsYXkiOiAyMDAKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICkKCQkgKi8KCQkic2VhcmNoRGVsYXkiOiBudWxsLAoJCgkKCQkvKioKCQkgKiBEYXRhVGFibGVzIGZlYXR1cmVzIHNpeCBkaWZmZXJlbnQgYnVpbHQtaW4gb3B0aW9ucyBmb3IgdGhlIGJ1dHRvbnMgdG8KCQkgKiBkaXNwbGF5IGZvciBwYWdpbmF0aW9uIGNvbnRyb2w6CgkJICoKCQkgKiAqIGBudW1iZXJzYCAtIFBhZ2UgbnVtYmVyIGJ1dHRvbnMgb25seQoJCSAqICogYHNpbXBsZWAgLSAnUHJldmlvdXMnIGFuZCAnTmV4dCcgYnV0dG9ucyBvbmx5CgkJICogKiAnc2ltcGxlX251bWJlcnNgIC0gJ1ByZXZpb3VzJyBhbmQgJ05leHQnIGJ1dHRvbnMsIHBsdXMgcGFnZSBudW1iZXJzCgkJICogKiBgZnVsbGAgLSAnRmlyc3QnLCAnUHJldmlvdXMnLCAnTmV4dCcgYW5kICdMYXN0JyBidXR0b25zCgkJICogKiBgZnVsbF9udW1iZXJzYCAtICdGaXJzdCcsICdQcmV2aW91cycsICdOZXh0JyBhbmQgJ0xhc3QnIGJ1dHRvbnMsIHBsdXMgcGFnZSBudW1iZXJzCgkJICogKiBgZmlyc3RfbGFzdF9udW1iZXJzYCAtICdGaXJzdCcgYW5kICdMYXN0JyBidXR0b25zLCBwbHVzIHBhZ2UgbnVtYmVycwoJCSAqICAKCQkgKiBGdXJ0aGVyIG1ldGhvZHMgY2FuIGJlIGFkZGVkIHVzaW5nIHtAbGluayBEYXRhVGFibGUuZXh0Lm9QYWdpbmF0aW9ufS4KCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IHNpbXBsZV9udW1iZXJzCgkJICoKCQkgKiAgQGR0b3B0IE9wdGlvbnMKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnBhZ2luZ1R5cGUKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJwYWdpbmdUeXBlIjogImZ1bGxfbnVtYmVycyIKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICkKCQkgKi8KCQkic1BhZ2luYXRpb25UeXBlIjogInNpbXBsZV9udW1iZXJzIiwKCQoJCgkJLyoqCgkJICogRW5hYmxlIGhvcml6b250YWwgc2Nyb2xsaW5nLiBXaGVuIGEgdGFibGUgaXMgdG9vIHdpZGUgdG8gZml0IGludG8gYQoJCSAqIGNlcnRhaW4gbGF5b3V0LCBvciB5b3UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZSwgeW91CgkJICogY2FuIGVuYWJsZSB4LXNjcm9sbGluZyB0byBzaG93IHRoZSB0YWJsZSBpbiBhIHZpZXdwb3J0LCB3aGljaCBjYW4gYmUKCQkgKiBzY3JvbGxlZC4gVGhpcyBwcm9wZXJ0eSBjYW4gYmUgYHRydWVgIHdoaWNoIHdpbGwgYWxsb3cgdGhlIHRhYmxlIHRvCgkJICogc2Nyb2xsIGhvcml6b250YWxseSB3aGVuIG5lZWRlZCwgb3IgYW55IENTUyB1bml0LCBvciBhIG51bWJlciAoaW4gd2hpY2gKCQkgKiBjYXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHBpeGVsIG1lYXN1cmVtZW50KS4gU2V0dGluZyBhcyBzaW1wbHkgYHRydWVgCgkJICogaXMgcmVjb21tZW5kZWQuCgkJICogIEB0eXBlIGJvb2xlYW58c3RyaW5nCgkJICogIEBkZWZhdWx0IDxpPmJsYW5rIHN0cmluZyAtIGkuZS4gZGlzYWJsZWQ8L2k+CgkJICoKCQkgKiAgQGR0b3B0IEZlYXR1cmVzCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5zY3JvbGxYCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic2Nyb2xsWCI6IHRydWUsCgkJICogICAgICAgICJzY3JvbGxDb2xsYXBzZSI6IHRydWUKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJInNTY3JvbGxYIjogIiIsCgkKCQoJCS8qKgoJCSAqIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBEYXRhVGFibGUgdG8gdXNlIG1vcmUgd2lkdGggdGhhbiBpdAoJCSAqIG1pZ2h0IG90aGVyd2lzZSBkbyB3aGVuIHgtc2Nyb2xsaW5nIGlzIGVuYWJsZWQuIEZvciBleGFtcGxlIGlmIHlvdSBoYXZlIGEKCQkgKiB0YWJsZSB3aGljaCByZXF1aXJlcyB0byBiZSB3ZWxsIHNwYWNlZCwgdGhpcyBwYXJhbWV0ZXIgaXMgdXNlZnVsIGZvcgoJCSAqICJvdmVyLXNpemluZyIgdGhlIHRhYmxlLCBhbmQgdGh1cyBmb3JjaW5nIHNjcm9sbGluZy4gVGhpcyBwcm9wZXJ0eSBjYW4gYnkKCQkgKiBhbnkgQ1NTIHVuaXQsIG9yIGEgbnVtYmVyIChpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHBpeGVsCgkJICogbWVhc3VyZW1lbnQpLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgPGk+Ymxhbmsgc3RyaW5nIC0gaS5lLiBkaXNhYmxlZDwvaT4KCQkgKgoJCSAqICBAZHRvcHQgT3B0aW9ucwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuc2Nyb2xsWElubmVyCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAic2Nyb2xsWCI6ICIxMDAlIiwKCQkgKiAgICAgICAgInNjcm9sbFhJbm5lciI6ICIxMTAlIgoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkic1Njcm9sbFhJbm5lciI6ICIiLAoJCgkKCQkvKioKCQkgKiBFbmFibGUgdmVydGljYWwgc2Nyb2xsaW5nLiBWZXJ0aWNhbCBzY3JvbGxpbmcgd2lsbCBjb25zdHJhaW4gdGhlIERhdGFUYWJsZQoJCSAqIHRvIHRoZSBnaXZlbiBoZWlnaHQsIGFuZCBlbmFibGUgc2Nyb2xsaW5nIGZvciBhbnkgZGF0YSB3aGljaCBvdmVyZmxvd3MgdGhlCgkJICogY3VycmVudCB2aWV3cG9ydC4gVGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBwYWdpbmcgdG8gZGlzcGxheQoJCSAqIGEgbG90IG9mIGRhdGEgaW4gYSBzbWFsbCBhcmVhIChhbHRob3VnaCBwYWdpbmcgYW5kIHNjcm9sbGluZyBjYW4gYm90aCBiZQoJCSAqIGVuYWJsZWQgYXQgdGhlIHNhbWUgdGltZSkuIFRoaXMgcHJvcGVydHkgY2FuIGJlIGFueSBDU1MgdW5pdCwgb3IgYSBudW1iZXIKCQkgKiAoaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBwaXhlbCBtZWFzdXJlbWVudCkuCgkJICogIEB0eXBlIHN0cmluZwoJCSAqICBAZGVmYXVsdCA8aT5ibGFuayBzdHJpbmcgLSBpLmUuIGRpc2FibGVkPC9pPgoJCSAqCgkJICogIEBkdG9wdCBGZWF0dXJlcwoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuc2Nyb2xsWQoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgInNjcm9sbFkiOiAiMjAwcHgiLAoJCSAqICAgICAgICAicGFnaW5hdGUiOiBmYWxzZQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkic1Njcm9sbFkiOiAiIiwKCQoJCgkJLyoqCgkJICogX19EZXByZWNhdGVkX18gVGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgdGhpcyBwYXJhbWV0ZXIgaGFzIG5vdyBiZWVuCgkJICogc3VwZXJzZWRlZCBieSB0aGF0IHByb3ZpZGVkIHRocm91Z2ggYGFqYXhgLCB3aGljaCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgoJCSAqCgkJICogU2V0IHRoZSBIVFRQIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gbWFrZSB0aGUgQWpheCBjYWxsIGZvciBzZXJ2ZXItc2lkZQoJCSAqIHByb2Nlc3Npbmcgb3IgQWpheCBzb3VyY2VkIGRhdGEuCgkJICogIEB0eXBlIHN0cmluZwoJCSAqICBAZGVmYXVsdCBHRVQKCQkgKgoJCSAqICBAZHRvcHQgT3B0aW9ucwoJCSAqICBAZHRvcHQgU2VydmVyLXNpZGUKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnNlcnZlck1ldGhvZAoJCSAqCgkJICogIEBkZXByZWNhdGVkIDEuMTAuIFBsZWFzZSB1c2UgYGFqYXhgIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkgbm93LgoJCSAqLwoJCSJzU2VydmVyTWV0aG9kIjogIkdFVCIsCgkKCQoJCS8qKgoJCSAqIERhdGFUYWJsZXMgbWFrZXMgdXNlIG9mIHJlbmRlcmVycyB3aGVuIGRpc3BsYXlpbmcgSFRNTCBlbGVtZW50cyBmb3IKCQkgKiBhIHRhYmxlLiBUaGVzZSByZW5kZXJlcnMgY2FuIGJlIGFkZGVkIG9yIG1vZGlmaWVkIGJ5IHBsdWctaW5zIHRvCgkJICogZ2VuZXJhdGUgc3VpdGFibGUgbWFyay11cCBmb3IgYSBzaXRlLiBGb3IgZXhhbXBsZSB0aGUgQm9vdHN0cmFwCgkJICogaW50ZWdyYXRpb24gcGx1Zy1pbiBmb3IgRGF0YVRhYmxlcyB1c2VzIGEgcGFnaW5nIGJ1dHRvbiByZW5kZXJlciB0bwoJCSAqIGRpc3BsYXkgcGFnaW5hdGlvbiBidXR0b25zIGluIHRoZSBtYXJrLXVwIHJlcXVpcmVkIGJ5IEJvb3RzdHJhcC4KCQkgKgoJCSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW5kZXJlcnMgYXZhaWxhYmxlIHNlZQoJCSAqIERhdGFUYWJsZS5leHQucmVuZGVyZXIKCQkgKiAgQHR5cGUgc3RyaW5nfG9iamVjdAoJCSAqICBAZGVmYXVsdCBudWxsCgkJICoKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnJlbmRlcmVyCgkJICoKCQkgKi8KCQkicmVuZGVyZXIiOiBudWxsLAoJCgkKCQkvKioKCQkgKiBTZXQgdGhlIGRhdGEgcHJvcGVydHkgbmFtZSB0aGF0IERhdGFUYWJsZXMgc2hvdWxkIHVzZSB0byBnZXQgYSByb3cncyBpZAoJCSAqIHRvIHNldCBhcyB0aGUgYGlkYCBwcm9wZXJ0eSBpbiB0aGUgbm9kZS4KCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IERUX1Jvd0lkCgkJICoKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLnJvd0lkCgkJICovCgkJInJvd0lkIjogIkRUX1Jvd0lkIgoJfTsKCQoJX2ZuSHVuZ2FyaWFuTWFwKCBEYXRhVGFibGUuZGVmYXVsdHMgKTsKCQoJCgkKCS8qCgkgKiBEZXZlbG9wZXIgbm90ZSAtIFNlZSBub3RlIGluIG1vZGVsLmRlZmF1bHRzLmpzIGFib3V0IHRoZSB1c2Ugb2YgSHVuZ2FyaWFuCgkgKiBub3RhdGlvbiBhbmQgY2FtZWwgY2FzZS4KCSAqLwoJCgkvKioKCSAqIENvbHVtbiBvcHRpb25zIHRoYXQgY2FuIGJlIGdpdmVuIHRvIERhdGFUYWJsZXMgYXQgaW5pdGlhbGlzYXRpb24gdGltZS4KCSAqICBAbmFtZXNwYWNlCgkgKi8KCURhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4gPSB7CgkJLyoqCgkJICogRGVmaW5lIHdoaWNoIGNvbHVtbihzKSBhbiBvcmRlciB3aWxsIG9jY3VyIG9uIGZvciB0aGlzIGNvbHVtbi4gVGhpcwoJCSAqIGFsbG93cyBhIGNvbHVtbidzIG9yZGVyaW5nIHRvIHRha2UgbXVsdGlwbGUgY29sdW1ucyBpbnRvIGFjY291bnQgd2hlbgoJCSAqIGRvaW5nIGEgc29ydCBvciB1c2UgdGhlIGRhdGEgZnJvbSBhIGRpZmZlcmVudCBjb2x1bW4uIEZvciBleGFtcGxlIGZpcnN0CgkJICogbmFtZSAvIGxhc3QgbmFtZSBjb2x1bW5zIG1ha2Ugc2Vuc2UgdG8gZG8gYSBtdWx0aS1jb2x1bW4gc29ydCBvdmVyIHRoZQoJCSAqIHR3byBjb2x1bW5zLgoJCSAqICBAdHlwZSBhcnJheXxpbnQKCQkgKiAgQGRlZmF1bHQgbnVsbCA8aT5UYWtlcyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBpbmRleCBhdXRvbWF0aWNhbGx5PC9pPgoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4ub3JkZXJEYXRhCgkJICogIEBkdG9wdCBDb2x1bW5zCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBVc2luZyBgY29sdW1uRGVmc2AKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY29sdW1uRGVmcyI6IFsKCQkgKiAgICAgICAgICB7ICJvcmRlckRhdGEiOiBbIDAsIDEgXSwgInRhcmdldHMiOiBbIDAgXSB9LAoJCSAqICAgICAgICAgIHsgIm9yZGVyRGF0YSI6IFsgMSwgMCBdLCAidGFyZ2V0cyI6IFsgMSBdIH0sCgkJICogICAgICAgICAgeyAib3JkZXJEYXRhIjogMiwgInRhcmdldHMiOiBbIDIgXSB9CgkJICogICAgICAgIF0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBVc2luZyBgY29sdW1uc2AKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY29sdW1ucyI6IFsKCQkgKiAgICAgICAgICB7ICJvcmRlckRhdGEiOiBbIDAsIDEgXSB9LAoJCSAqICAgICAgICAgIHsgIm9yZGVyRGF0YSI6IFsgMSwgMCBdIH0sCgkJICogICAgICAgICAgeyAib3JkZXJEYXRhIjogMiB9LAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgbnVsbAoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJhRGF0YVNvcnQiOiBudWxsLAoJCSJpRGF0YVNvcnQiOiAtMSwKCQoJCgkJLyoqCgkJICogWW91IGNhbiBjb250cm9sIHRoZSBkZWZhdWx0IG9yZGVyaW5nIGRpcmVjdGlvbiwgYW5kIGV2ZW4gYWx0ZXIgdGhlCgkJICogYmVoYXZpb3VyIG9mIHRoZSBzb3J0IGhhbmRsZXIgKGkuZS4gb25seSBhbGxvdyBhc2NlbmRpbmcgb3JkZXJpbmcgZXRjKQoJCSAqIHVzaW5nIHRoaXMgcGFyYW1ldGVyLgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbICdhc2MnLCAnZGVzYycgXQoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4ub3JkZXJTZXF1ZW5jZQoJCSAqICBAZHRvcHQgQ29sdW1ucwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbkRlZnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbkRlZnMiOiBbCgkJICogICAgICAgICAgeyAib3JkZXJTZXF1ZW5jZSI6IFsgImFzYyIgXSwgInRhcmdldHMiOiBbIDEgXSB9LAoJCSAqICAgICAgICAgIHsgIm9yZGVyU2VxdWVuY2UiOiBbICJkZXNjIiwgImFzYyIsICJhc2MiIF0sICJ0YXJnZXRzIjogWyAyIF0gfSwKCQkgKiAgICAgICAgICB7ICJvcmRlclNlcXVlbmNlIjogWyAiZGVzYyIgXSwgInRhcmdldHMiOiBbIDMgXSB9CgkJICogICAgICAgIF0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBVc2luZyBgY29sdW1uc2AKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY29sdW1ucyI6IFsKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIHsgIm9yZGVyU2VxdWVuY2UiOiBbICJhc2MiIF0gfSwKCQkgKiAgICAgICAgICB7ICJvcmRlclNlcXVlbmNlIjogWyAiZGVzYyIsICJhc2MiLCAiYXNjIiBdIH0sCgkJICogICAgICAgICAgeyAib3JkZXJTZXF1ZW5jZSI6IFsgImRlc2MiIF0gfSwKCQkgKiAgICAgICAgICBudWxsCgkJICogICAgICAgIF0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImFzU29ydGluZyI6IFsgJ2FzYycsICdkZXNjJyBdLAoJCgkKCQkvKioKCQkgKiBFbmFibGUgb3IgZGlzYWJsZSBmaWx0ZXJpbmcgb24gdGhlIGRhdGEgaW4gdGhpcyBjb2x1bW4uCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgdHJ1ZQoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4uc2VhcmNoYWJsZQoJCSAqICBAZHRvcHQgQ29sdW1ucwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbkRlZnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbkRlZnMiOiBbCgkJICogICAgICAgICAgeyAic2VhcmNoYWJsZSI6IGZhbHNlLCAidGFyZ2V0cyI6IFsgMCBdIH0KCQkgKiAgICAgICAgXSB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbnMiOiBbCgkJICogICAgICAgICAgeyAic2VhcmNoYWJsZSI6IGZhbHNlIH0sCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgbnVsbAoJCSAqICAgICAgICBdIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImJTZWFyY2hhYmxlIjogdHJ1ZSwKCQoJCgkJLyoqCgkJICogRW5hYmxlIG9yIGRpc2FibGUgb3JkZXJpbmcgb24gdGhpcyBjb2x1bW4uCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgdHJ1ZQoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4ub3JkZXJhYmxlCgkJICogIEBkdG9wdCBDb2x1bW5zCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBVc2luZyBgY29sdW1uRGVmc2AKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY29sdW1uRGVmcyI6IFsKCQkgKiAgICAgICAgICB7ICJvcmRlcmFibGUiOiBmYWxzZSwgInRhcmdldHMiOiBbIDAgXSB9CgkJICogICAgICAgIF0gfSApOwoJCSAqICAgIH0gKTsKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFVzaW5nIGBjb2x1bW5zYAoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5zIjogWwoJCSAqICAgICAgICAgIHsgIm9yZGVyYWJsZSI6IGZhbHNlIH0sCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgbnVsbAoJCSAqICAgICAgICBdIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJImJTb3J0YWJsZSI6IHRydWUsCgkKCQoJCS8qKgoJCSAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBkaXNwbGF5IG9mIHRoaXMgY29sdW1uLgoJCSAqICBAdHlwZSBib29sZWFuCgkJICogIEBkZWZhdWx0IHRydWUKCQkgKgoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuY29sdW1uLnZpc2libGUKCQkgKiAgQGR0b3B0IENvbHVtbnMKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFVzaW5nIGBjb2x1bW5EZWZzYAoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5EZWZzIjogWwoJCSAqICAgICAgICAgIHsgInZpc2libGUiOiBmYWxzZSwgInRhcmdldHMiOiBbIDAgXSB9CgkJICogICAgICAgIF0gfSApOwoJCSAqICAgIH0gKTsKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFVzaW5nIGBjb2x1bW5zYAoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5zIjogWwoJCSAqICAgICAgICAgIHsgInZpc2libGUiOiBmYWxzZSB9LAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIG51bGwKCQkgKiAgICAgICAgXSB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJiVmlzaWJsZSI6IHRydWUsCgkKCQoJCS8qKgoJCSAqIERldmVsb3BlciBkZWZpbmFibGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBjZWxsIGlzIGNyZWF0ZWQgKEFqYXggc291cmNlLAoJCSAqIGV0Yykgb3IgcHJvY2Vzc2VkIGZvciBpbnB1dCAoRE9NIHNvdXJjZSkuIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBjb21wbGltZW50IHRvIG1SZW5kZXIKCQkgKiBhbGxvd2luZyB5b3UgdG8gbW9kaWZ5IHRoZSBET00gZWxlbWVudCAoYWRkIGJhY2tncm91bmQgY29sb3VyIGZvciBleGFtcGxlKSB3aGVuIHRoZQoJCSAqIGVsZW1lbnQgaXMgYXZhaWxhYmxlLgoJCSAqICBAdHlwZSBmdW5jdGlvbgoJCSAqICBAcGFyYW0ge2VsZW1lbnR9IHRkIFRoZSBURCBub2RlIHRoYXQgaGFzIGJlZW4gY3JlYXRlZAoJCSAqICBAcGFyYW0geyp9IGNlbGxEYXRhIFRoZSBEYXRhIGZvciB0aGUgY2VsbAoJCSAqICBAcGFyYW0ge2FycmF5fG9iamVjdH0gcm93RGF0YSBUaGUgZGF0YSBmb3IgdGhlIHdob2xlIHJvdwoJCSAqICBAcGFyYW0ge2ludH0gcm93IFRoZSByb3cgaW5kZXggZm9yIHRoZSBhb0RhdGEgZGF0YSBzdG9yZQoJCSAqICBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gaW5kZXggZm9yIGFvQ29sdW1ucwoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4uY3JlYXRlZENlbGwKCQkgKiAgQGR0b3B0IENvbHVtbnMKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5EZWZzIjogWyB7CgkJICogICAgICAgICAgInRhcmdldHMiOiBbM10sCgkJICogICAgICAgICAgImNyZWF0ZWRDZWxsIjogZnVuY3Rpb24gKHRkLCBjZWxsRGF0YSwgcm93RGF0YSwgcm93LCBjb2wpIHsKCQkgKiAgICAgICAgICAgIGlmICggY2VsbERhdGEgPT0gIjEuNyIgKSB7CgkJICogICAgICAgICAgICAgICQodGQpLmNzcygnY29sb3InLCAnYmx1ZScpCgkJICogICAgICAgICAgICB9CgkJICogICAgICAgICAgfQoJCSAqICAgICAgICB9IF0KCQkgKiAgICAgIH0pOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkiZm5DcmVhdGVkQ2VsbCI6IG51bGwsCgkKCQoJCS8qKgoJCSAqIFRoaXMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGBkYXRhYCBpbiBEYXRhVGFibGVzIHRvIGVuc3VyZSBuYW1pbmcKCQkgKiBjb25zaXN0ZW5jeS4gYGRhdGFQcm9wYCBjYW4gc3RpbGwgYmUgdXNlZCwgYXMgdGhlcmUgaXMgYmFja3dhcmRzCgkJICogY29tcGF0aWJpbGl0eSBpbiBEYXRhVGFibGVzIGZvciB0aGlzIG9wdGlvbiwgYnV0IGl0IGlzIHN0cm9uZ2x5CgkJICogcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIGBkYXRhYCBpbiBwcmVmZXJlbmNlIHRvIGBkYXRhUHJvcGAuCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4uZGF0YVByb3AKCQkgKi8KCQoJCgkJLyoqCgkJICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byByZWFkIGRhdGEgZnJvbSBhbnkgZGF0YSBzb3VyY2UgcHJvcGVydHksCgkJICogaW5jbHVkaW5nIGRlZXBseSBuZXN0ZWQgb2JqZWN0cyAvIHByb3BlcnRpZXMuIGBkYXRhYCBjYW4gYmUgZ2l2ZW4gaW4gYQoJCSAqIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB3aGljaCBlZmZlY3QgaXRzIGJlaGF2aW91cjoKCQkgKgoJCSAqICogYGludGVnZXJgIC0gdHJlYXRlZCBhcyBhbiBhcnJheSBpbmRleCBmb3IgdGhlIGRhdGEgc291cmNlLiBUaGlzIGlzIHRoZQoJCSAqICAgZGVmYXVsdCB0aGF0IERhdGFUYWJsZXMgdXNlcyAoaW5jcmVtZW50YWxseSBpbmNyZWFzZWQgZm9yIGVhY2ggY29sdW1uKS4KCQkgKiAqIGBzdHJpbmdgIC0gcmVhZCBhbiBvYmplY3QgcHJvcGVydHkgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIFRoZXJlIGFyZQoJCSAqICAgdGhyZWUgJ3NwZWNpYWwnIG9wdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGFsdGVyIGhvdwoJCSAqICAgRGF0YVRhYmxlcyByZWFkcyB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0OgoJCSAqICAgICogYC5gIC0gRG90dGVkIEphdmFzY3JpcHQgbm90YXRpb24uIEp1c3QgYXMgeW91IHVzZSBhIGAuYCBpbgoJCSAqICAgICAgSmF2YXNjcmlwdCB0byByZWFkIGZyb20gbmVzdGVkIG9iamVjdHMsIHNvIHRvIGNhbiB0aGUgb3B0aW9ucwoJCSAqICAgICAgc3BlY2lmaWVkIGluIGBkYXRhYC4gRm9yIGV4YW1wbGU6IGBicm93c2VyLnZlcnNpb25gIG9yCgkJICogICAgICBgYnJvd3Nlci5uYW1lYC4gSWYgeW91ciBvYmplY3QgcGFyYW1ldGVyIG5hbWUgY29udGFpbnMgYSBwZXJpb2QsIHVzZQoJCSAqICAgICAgYFxcYCB0byBlc2NhcGUgaXQgLSBpLmUuIGBmaXJzdFxcLm5hbWVgLgoJCSAqICAgICogYFtdYCAtIEFycmF5IG5vdGF0aW9uLiBEYXRhVGFibGVzIGNhbiBhdXRvbWF0aWNhbGx5IGNvbWJpbmUgZGF0YQoJCSAqICAgICAgZnJvbSBhbmQgYXJyYXkgc291cmNlLCBqb2luaW5nIHRoZSBkYXRhIHdpdGggdGhlIGNoYXJhY3RlcnMgcHJvdmlkZWQKCQkgKiAgICAgIGJldHdlZW4gdGhlIHR3byBicmFja2V0cy4gRm9yIGV4YW1wbGU6IGBuYW1lWywgXWAgd291bGQgcHJvdmlkZSBhCgkJICogICAgICBjb21tYS1zcGFjZSBzZXBhcmF0ZWQgbGlzdCBmcm9tIHRoZSBzb3VyY2UgYXJyYXkuIElmIG5vIGNoYXJhY3RlcnMKCQkgKiAgICAgIGFyZSBwcm92aWRlZCBiZXR3ZWVuIHRoZSBicmFja2V0cywgdGhlIG9yaWdpbmFsIGFycmF5IHNvdXJjZSBpcwoJCSAqICAgICAgcmV0dXJuZWQuCgkJICogICAgKiBgKClgIC0gRnVuY3Rpb24gbm90YXRpb24uIEFkZGluZyBgKClgIHRvIHRoZSBlbmQgb2YgYSBwYXJhbWV0ZXIgd2lsbAoJCSAqICAgICAgZXhlY3V0ZSBhIGZ1bmN0aW9uIG9mIHRoZSBuYW1lIGdpdmVuLiBGb3IgZXhhbXBsZTogYGJyb3dzZXIoKWAgZm9yIGEKCQkgKiAgICAgIHNpbXBsZSBmdW5jdGlvbiBvbiB0aGUgZGF0YSBzb3VyY2UsIGBicm93c2VyLnZlcnNpb24oKWAgZm9yIGEKCQkgKiAgICAgIGZ1bmN0aW9uIGluIGEgbmVzdGVkIHByb3BlcnR5IG9yIGV2ZW4gYGJyb3dzZXIoKS52ZXJzaW9uYCB0byBnZXQgYW4KCQkgKiAgICAgIG9iamVjdCBwcm9wZXJ0eSBpZiB0aGUgZnVuY3Rpb24gY2FsbGVkIHJldHVybnMgYW4gb2JqZWN0LiBOb3RlIHRoYXQKCQkgKiAgICAgIGZ1bmN0aW9uIG5vdGF0aW9uIGlzIHJlY29tbWVuZGVkIGZvciB1c2UgaW4gYHJlbmRlcmAgcmF0aGVyIHRoYW4KCQkgKiAgICAgIGBkYXRhYCBhcyBpdCBpcyBtdWNoIHNpbXBsZXIgdG8gdXNlIGFzIGEgcmVuZGVyZXIuCgkJICogKiBgbnVsbGAgLSB1c2UgdGhlIG9yaWdpbmFsIGRhdGEgc291cmNlIGZvciB0aGUgcm93IHJhdGhlciB0aGFuIHBsdWNraW5nCgkJICogICBkYXRhIGRpcmVjdGx5IGZyb20gaXQuIFRoaXMgYWN0aW9uIGhhcyBlZmZlY3RzIG9uIHR3byBvdGhlcgoJCSAqICAgaW5pdGlhbGlzYXRpb24gb3B0aW9uczoKCQkgKiAgICAqIGBkZWZhdWx0Q29udGVudGAgLSBXaGVuIG51bGwgaXMgZ2l2ZW4gYXMgdGhlIGBkYXRhYCBvcHRpb24gYW5kCgkJICogICAgICBgZGVmYXVsdENvbnRlbnRgIGlzIHNwZWNpZmllZCBmb3IgdGhlIGNvbHVtbiwgdGhlIHZhbHVlIGRlZmluZWQgYnkKCQkgKiAgICAgIGBkZWZhdWx0Q29udGVudGAgd2lsbCBiZSB1c2VkIGZvciB0aGUgY2VsbC4KCQkgKiAgICAqIGByZW5kZXJgIC0gV2hlbiBudWxsIGlzIHVzZWQgZm9yIHRoZSBgZGF0YWAgb3B0aW9uIGFuZCB0aGUgYHJlbmRlcmAKCQkgKiAgICAgIG9wdGlvbiBpcyBzcGVjaWZpZWQgZm9yIHRoZSBjb2x1bW4sIHRoZSB3aG9sZSBkYXRhIHNvdXJjZSBmb3IgdGhlCgkJICogICAgICByb3cgaXMgdXNlZCBmb3IgdGhlIHJlbmRlcmVyLgoJCSAqICogYGZ1bmN0aW9uYCAtIHRoZSBmdW5jdGlvbiBnaXZlbiB3aWxsIGJlIGV4ZWN1dGVkIHdoZW5ldmVyIERhdGFUYWJsZXMKCQkgKiAgIG5lZWRzIHRvIHNldCBvciBnZXQgdGhlIGRhdGEgZm9yIGEgY2VsbCBpbiB0aGUgY29sdW1uLiBUaGUgZnVuY3Rpb24KCQkgKiAgIHRha2VzIHRocmVlIHBhcmFtZXRlcnM6CgkJICogICAgKiBQYXJhbWV0ZXJzOgoJCSAqICAgICAgKiBge2FycmF5fG9iamVjdH1gIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIHJvdwoJCSAqICAgICAgKiBge3N0cmluZ31gIFRoZSB0eXBlIGNhbGwgZGF0YSByZXF1ZXN0ZWQgLSB0aGlzIHdpbGwgYmUgJ3NldCcgd2hlbgoJCSAqICAgICAgICBzZXR0aW5nIGRhdGEgb3IgJ2ZpbHRlcicsICdkaXNwbGF5JywgJ3R5cGUnLCAnc29ydCcgb3IgdW5kZWZpbmVkCgkJICogICAgICAgIHdoZW4gZ2F0aGVyaW5nIGRhdGEuIE5vdGUgdGhhdCB3aGVuIGB1bmRlZmluZWRgIGlzIGdpdmVuIGZvciB0aGUKCQkgKiAgICAgICAgdHlwZSBEYXRhVGFibGVzIGV4cGVjdHMgdG8gZ2V0IHRoZSByYXcgZGF0YSBmb3IgdGhlIG9iamVjdCBiYWNrPAoJCSAqICAgICAgKiBgeyp9YCBEYXRhIHRvIHNldCB3aGVuIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzICdzZXQnLgoJCSAqICAgICogUmV0dXJuOgoJCSAqICAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCB3aGVuICdzZXQnIGlzCgkJICogICAgICAgIHRoZSB0eXBlIG9mIGNhbGwsIGJ1dCBvdGhlcndpc2UgdGhlIHJldHVybiBpcyB3aGF0IHdpbGwgYmUgdXNlZAoJCSAqICAgICAgICBmb3IgdGhlIGRhdGEgcmVxdWVzdGVkLgoJCSAqCgkJICogTm90ZSB0aGF0IGBkYXRhYCBpcyBhIGdldHRlciBhbmQgc2V0dGVyIG9wdGlvbi4gSWYgeW91IGp1c3QgcmVxdWlyZQoJCSAqIGZvcm1hdHRpbmcgb2YgZGF0YSBmb3Igb3V0cHV0LCB5b3Ugd2lsbCBsaWtlbHkgd2FudCB0byB1c2UgYHJlbmRlcmAgd2hpY2gKCQkgKiBpcyBzaW1wbHkgYSBnZXR0ZXIgYW5kIHRodXMgc2ltcGxlciB0byB1c2UuCgkJICoKCQkgKiBOb3RlIHRoYXQgcHJpb3IgdG8gRGF0YVRhYmxlcyAxLjkuMiBgZGF0YWAgd2FzIGNhbGxlZCBgbURhdGFQcm9wYC4gVGhlCgkJICogbmFtZSBjaGFuZ2UgcmVmbGVjdHMgdGhlIGZsZXhpYmlsaXR5IG9mIHRoaXMgcHJvcGVydHkgYW5kIGlzIGNvbnNpc3RlbnQKCQkgKiB3aXRoIHRoZSBuYW1pbmcgb2YgbVJlbmRlci4gSWYgJ21EYXRhUHJvcCcgaXMgZ2l2ZW4sIHRoZW4gaXQgd2lsbCBzdGlsbAoJCSAqIGJlIHVzZWQgYnkgRGF0YVRhYmxlcywgYXMgaXQgYXV0b21hdGljYWxseSBtYXBzIHRoZSBvbGQgbmFtZSB0byB0aGUgbmV3CgkJICogaWYgcmVxdWlyZWQuCgkJICoKCQkgKiAgQHR5cGUgc3RyaW5nfGludHxmdW5jdGlvbnxudWxsCgkJICogIEBkZWZhdWx0IG51bGwgPGk+VXNlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBjb2x1bW4gaW5kZXg8L2k+CgkJICoKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmNvbHVtbi5kYXRhCgkJICogIEBkdG9wdCBDb2x1bW5zCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBSZWFkIHRhYmxlIGRhdGEgZnJvbSBvYmplY3RzCgkJICogICAgLy8gSlNPTiBzdHJ1Y3R1cmUgZm9yIGVhY2ggcm93OgoJCSAqICAgIC8vICAgewoJCSAqICAgIC8vICAgICAgImVuZ2luZSI6IHt2YWx1ZX0sCgkJICogICAgLy8gICAgICAiYnJvd3NlciI6IHt2YWx1ZX0sCgkJICogICAgLy8gICAgICAicGxhdGZvcm0iOiB7dmFsdWV9LAoJCSAqICAgIC8vICAgICAgInZlcnNpb24iOiB7dmFsdWV9LAoJCSAqICAgIC8vICAgICAgImdyYWRlIjoge3ZhbHVlfQoJCSAqICAgIC8vICAgfQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJhamF4U291cmNlIjogInNvdXJjZXMvb2JqZWN0cy50eHQiLAoJCSAqICAgICAgICAiY29sdW1ucyI6IFsKCQkgKiAgICAgICAgICB7ICJkYXRhIjogImVuZ2luZSIgfSwKCQkgKiAgICAgICAgICB7ICJkYXRhIjogImJyb3dzZXIiIH0sCgkJICogICAgICAgICAgeyAiZGF0YSI6ICJwbGF0Zm9ybSIgfSwKCQkgKiAgICAgICAgICB7ICJkYXRhIjogInZlcnNpb24iIH0sCgkJICogICAgICAgICAgeyAiZGF0YSI6ICJncmFkZSIgfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gUmVhZCBpbmZvcm1hdGlvbiBmcm9tIGRlZXBseSBuZXN0ZWQgb2JqZWN0cwoJCSAqICAgIC8vIEpTT04gc3RydWN0dXJlIGZvciBlYWNoIHJvdzoKCQkgKiAgICAvLyAgIHsKCQkgKiAgICAvLyAgICAgICJlbmdpbmUiOiB7dmFsdWV9LAoJCSAqICAgIC8vICAgICAgImJyb3dzZXIiOiB7dmFsdWV9LAoJCSAqICAgIC8vICAgICAgInBsYXRmb3JtIjogewoJCSAqICAgIC8vICAgICAgICAgImlubmVyIjoge3ZhbHVlfQoJCSAqICAgIC8vICAgICAgfSwKCQkgKiAgICAvLyAgICAgICJkZXRhaWxzIjogWwoJCSAqICAgIC8vICAgICAgICAge3ZhbHVlfSwge3ZhbHVlfQoJCSAqICAgIC8vICAgICAgXQoJCSAqICAgIC8vICAgfQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJhamF4U291cmNlIjogInNvdXJjZXMvZGVlcC50eHQiLAoJCSAqICAgICAgICAiY29sdW1ucyI6IFsKCQkgKiAgICAgICAgICB7ICJkYXRhIjogImVuZ2luZSIgfSwKCQkgKiAgICAgICAgICB7ICJkYXRhIjogImJyb3dzZXIiIH0sCgkJICogICAgICAgICAgeyAiZGF0YSI6ICJwbGF0Zm9ybS5pbm5lciIgfSwKCQkgKiAgICAgICAgICB7ICJkYXRhIjogImRldGFpbHMuMCIgfSwKCQkgKiAgICAgICAgICB7ICJkYXRhIjogImRldGFpbHMuMSIgfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGRhdGFgIGFzIGEgZnVuY3Rpb24gdG8gcHJvdmlkZSBkaWZmZXJlbnQgaW5mb3JtYXRpb24gZm9yCgkJICogICAgLy8gc29ydGluZywgZmlsdGVyaW5nIGFuZCBkaXNwbGF5LiBJbiB0aGlzIGNhc2UsIGN1cnJlbmN5IChwcmljZSkKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY29sdW1uRGVmcyI6IFsgewoJCSAqICAgICAgICAgICJ0YXJnZXRzIjogWyAwIF0sCgkJICogICAgICAgICAgImRhdGEiOiBmdW5jdGlvbiAoIHNvdXJjZSwgdHlwZSwgdmFsICkgewoJCSAqICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzZXQnKSB7CgkJICogICAgICAgICAgICAgIHNvdXJjZS5wcmljZSA9IHZhbDsKCQkgKiAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGNvbXB1dGVkIGRpc3BsYXkgYW5kIGZpbHRlciB2YWx1ZXMgZm9yIGVmZmljaWVuY3kKCQkgKiAgICAgICAgICAgICAgc291cmNlLnByaWNlX2Rpc3BsYXkgPSB2YWw9PSIiID8gIiIgOiAiJCIrbnVtYmVyRm9ybWF0KHZhbCk7CgkJICogICAgICAgICAgICAgIHNvdXJjZS5wcmljZV9maWx0ZXIgID0gdmFsPT0iIiA/ICIiIDogIiQiK251bWJlckZvcm1hdCh2YWwpKyIgIit2YWw7CgkJICogICAgICAgICAgICAgIHJldHVybjsKCQkgKiAgICAgICAgICAgIH0KCQkgKiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdkaXNwbGF5JykgewoJCSAqICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnByaWNlX2Rpc3BsYXk7CgkJICogICAgICAgICAgICB9CgkJICogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnZmlsdGVyJykgewoJCSAqICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnByaWNlX2ZpbHRlcjsKCQkgKiAgICAgICAgICAgIH0KCQkgKiAgICAgICAgICAgIC8vICdzb3J0JywgJ3R5cGUnIGFuZCB1bmRlZmluZWQgYWxsIGp1c3QgdXNlIHRoZSBpbnRlZ2VyCgkJICogICAgICAgICAgICByZXR1cm4gc291cmNlLnByaWNlOwoJCSAqICAgICAgICAgIH0KCQkgKiAgICAgICAgfSBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgZGVmYXVsdCBjb250ZW50CgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbkRlZnMiOiBbIHsKCQkgKiAgICAgICAgICAidGFyZ2V0cyI6IFsgMCBdLAoJCSAqICAgICAgICAgICJkYXRhIjogbnVsbCwKCQkgKiAgICAgICAgICAiZGVmYXVsdENvbnRlbnQiOiAiQ2xpY2sgdG8gZWRpdCIKCQkgKiAgICAgICAgfSBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYXJyYXkgbm90YXRpb24gLSBvdXRwdXR0aW5nIGEgbGlzdCBmcm9tIGFuIGFycmF5CgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbkRlZnMiOiBbIHsKCQkgKiAgICAgICAgICAidGFyZ2V0cyI6IFsgMCBdLAoJCSAqICAgICAgICAgICJkYXRhIjogIm5hbWVbLCBdIgoJCSAqICAgICAgICB9IF0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICoKCQkgKi8KCQkibURhdGEiOiBudWxsLAoJCgkKCQkvKioKCQkgKiBUaGlzIHByb3BlcnR5IGlzIHRoZSByZW5kZXJpbmcgcGFydG5lciB0byBgZGF0YWAgYW5kIGl0IGlzIHN1Z2dlc3RlZCB0aGF0CgkJICogd2hlbiB5b3Ugd2FudCB0byBtYW5pcHVsYXRlIGRhdGEgZm9yIGRpc3BsYXkgKGluY2x1ZGluZyBmaWx0ZXJpbmcsCgkJICogc29ydGluZyBldGMpIHdpdGhvdXQgYWx0ZXJpbmcgdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgdGhlIHRhYmxlLCB1c2UgdGhpcwoJCSAqIHByb3BlcnR5LiBgcmVuZGVyYCBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSB0aGUgdGhlIHJlYWQgb25seSBjb21wYW5pb24gdG8KCQkgKiBgZGF0YWAgd2hpY2ggaXMgcmVhZCAvIHdyaXRlICh0aGVuIGFzIHN1Y2ggbW9yZSBjb21wbGV4KS4gTGlrZSBgZGF0YWAKCQkgKiB0aGlzIG9wdGlvbiBjYW4gYmUgZ2l2ZW4gaW4gYSBudW1iZXIgb2YgZGlmZmVyZW50IHdheXMgdG8gZWZmZWN0IGl0cwoJCSAqIGJlaGF2aW91cjoKCQkgKgoJCSAqICogYGludGVnZXJgIC0gdHJlYXRlZCBhcyBhbiBhcnJheSBpbmRleCBmb3IgdGhlIGRhdGEgc291cmNlLiBUaGlzIGlzIHRoZQoJCSAqICAgZGVmYXVsdCB0aGF0IERhdGFUYWJsZXMgdXNlcyAoaW5jcmVtZW50YWxseSBpbmNyZWFzZWQgZm9yIGVhY2ggY29sdW1uKS4KCQkgKiAqIGBzdHJpbmdgIC0gcmVhZCBhbiBvYmplY3QgcHJvcGVydHkgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIFRoZXJlIGFyZQoJCSAqICAgdGhyZWUgJ3NwZWNpYWwnIG9wdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGFsdGVyIGhvdwoJCSAqICAgRGF0YVRhYmxlcyByZWFkcyB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0OgoJCSAqICAgICogYC5gIC0gRG90dGVkIEphdmFzY3JpcHQgbm90YXRpb24uIEp1c3QgYXMgeW91IHVzZSBhIGAuYCBpbgoJCSAqICAgICAgSmF2YXNjcmlwdCB0byByZWFkIGZyb20gbmVzdGVkIG9iamVjdHMsIHNvIHRvIGNhbiB0aGUgb3B0aW9ucwoJCSAqICAgICAgc3BlY2lmaWVkIGluIGBkYXRhYC4gRm9yIGV4YW1wbGU6IGBicm93c2VyLnZlcnNpb25gIG9yCgkJICogICAgICBgYnJvd3Nlci5uYW1lYC4gSWYgeW91ciBvYmplY3QgcGFyYW1ldGVyIG5hbWUgY29udGFpbnMgYSBwZXJpb2QsIHVzZQoJCSAqICAgICAgYFxcYCB0byBlc2NhcGUgaXQgLSBpLmUuIGBmaXJzdFxcLm5hbWVgLgoJCSAqICAgICogYFtdYCAtIEFycmF5IG5vdGF0aW9uLiBEYXRhVGFibGVzIGNhbiBhdXRvbWF0aWNhbGx5IGNvbWJpbmUgZGF0YQoJCSAqICAgICAgZnJvbSBhbmQgYXJyYXkgc291cmNlLCBqb2luaW5nIHRoZSBkYXRhIHdpdGggdGhlIGNoYXJhY3RlcnMgcHJvdmlkZWQKCQkgKiAgICAgIGJldHdlZW4gdGhlIHR3byBicmFja2V0cy4gRm9yIGV4YW1wbGU6IGBuYW1lWywgXWAgd291bGQgcHJvdmlkZSBhCgkJICogICAgICBjb21tYS1zcGFjZSBzZXBhcmF0ZWQgbGlzdCBmcm9tIHRoZSBzb3VyY2UgYXJyYXkuIElmIG5vIGNoYXJhY3RlcnMKCQkgKiAgICAgIGFyZSBwcm92aWRlZCBiZXR3ZWVuIHRoZSBicmFja2V0cywgdGhlIG9yaWdpbmFsIGFycmF5IHNvdXJjZSBpcwoJCSAqICAgICAgcmV0dXJuZWQuCgkJICogICAgKiBgKClgIC0gRnVuY3Rpb24gbm90YXRpb24uIEFkZGluZyBgKClgIHRvIHRoZSBlbmQgb2YgYSBwYXJhbWV0ZXIgd2lsbAoJCSAqICAgICAgZXhlY3V0ZSBhIGZ1bmN0aW9uIG9mIHRoZSBuYW1lIGdpdmVuLiBGb3IgZXhhbXBsZTogYGJyb3dzZXIoKWAgZm9yIGEKCQkgKiAgICAgIHNpbXBsZSBmdW5jdGlvbiBvbiB0aGUgZGF0YSBzb3VyY2UsIGBicm93c2VyLnZlcnNpb24oKWAgZm9yIGEKCQkgKiAgICAgIGZ1bmN0aW9uIGluIGEgbmVzdGVkIHByb3BlcnR5IG9yIGV2ZW4gYGJyb3dzZXIoKS52ZXJzaW9uYCB0byBnZXQgYW4KCQkgKiAgICAgIG9iamVjdCBwcm9wZXJ0eSBpZiB0aGUgZnVuY3Rpb24gY2FsbGVkIHJldHVybnMgYW4gb2JqZWN0LgoJCSAqICogYG9iamVjdGAgLSB1c2UgZGlmZmVyZW50IGRhdGEgZm9yIHRoZSBkaWZmZXJlbnQgZGF0YSB0eXBlcyByZXF1ZXN0ZWQgYnkKCQkgKiAgIERhdGFUYWJsZXMgKCdmaWx0ZXInLCAnZGlzcGxheScsICd0eXBlJyBvciAnc29ydCcpLiBUaGUgcHJvcGVydHkgbmFtZXMKCQkgKiAgIG9mIHRoZSBvYmplY3QgaXMgdGhlIGRhdGEgdHlwZSB0aGUgcHJvcGVydHkgcmVmZXJzIHRvIGFuZCB0aGUgdmFsdWUgY2FuCgkJICogICBkZWZpbmVkIHVzaW5nIGFuIGludGVnZXIsIHN0cmluZyBvciBmdW5jdGlvbiB1c2luZyB0aGUgc2FtZSBydWxlcyBhcwoJCSAqICAgYHJlbmRlcmAgbm9ybWFsbHkgZG9lcy4gTm90ZSB0aGF0IGFuIGBfYCBvcHRpb24gX211c3RfIGJlIHNwZWNpZmllZC4KCQkgKiAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGlmIHlvdSBoYXZlbid0IHNwZWNpZmllZCBhIHZhbHVlIGZvcgoJCSAqICAgdGhlIGRhdGEgdHlwZSByZXF1ZXN0ZWQgYnkgRGF0YVRhYmxlcy4KCQkgKiAqIGBmdW5jdGlvbmAgLSB0aGUgZnVuY3Rpb24gZ2l2ZW4gd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciBEYXRhVGFibGVzCgkJICogICBuZWVkcyB0byBzZXQgb3IgZ2V0IHRoZSBkYXRhIGZvciBhIGNlbGwgaW4gdGhlIGNvbHVtbi4gVGhlIGZ1bmN0aW9uCgkJICogICB0YWtlcyB0aHJlZSBwYXJhbWV0ZXJzOgoJCSAqICAgICogUGFyYW1ldGVyczoKCQkgKiAgICAgICoge2FycmF5fG9iamVjdH0gVGhlIGRhdGEgc291cmNlIGZvciB0aGUgcm93IChiYXNlZCBvbiBgZGF0YWApCgkJICogICAgICAqIHtzdHJpbmd9IFRoZSB0eXBlIGNhbGwgZGF0YSByZXF1ZXN0ZWQgLSB0aGlzIHdpbGwgYmUgJ2ZpbHRlcicsCgkJICogICAgICAgICdkaXNwbGF5JywgJ3R5cGUnIG9yICdzb3J0Jy4KCQkgKiAgICAgICoge2FycmF5fG9iamVjdH0gVGhlIGZ1bGwgZGF0YSBzb3VyY2UgZm9yIHRoZSByb3cgKG5vdCBiYXNlZCBvbgoJCSAqICAgICAgICBgZGF0YWApCgkJICogICAgKiBSZXR1cm46CgkJICogICAgICAqIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gaXMgd2hhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZQoJCSAqICAgICAgICBkYXRhIHJlcXVlc3RlZC4KCQkgKgoJCSAqICBAdHlwZSBzdHJpbmd8aW50fGZ1bmN0aW9ufG9iamVjdHxudWxsCgkJICogIEBkZWZhdWx0IG51bGwgVXNlIHRoZSBkYXRhIHNvdXJjZSB2YWx1ZS4KCQkgKgoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuY29sdW1uLnJlbmRlcgoJCSAqICBAZHRvcHQgQ29sdW1ucwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gQ3JlYXRlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgZnJvbSBhbiBhcnJheSBvZiBvYmplY3RzCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImFqYXhTb3VyY2UiOiAic291cmNlcy9kZWVwLnR4dCIsCgkJICogICAgICAgICJjb2x1bW5zIjogWwoJCSAqICAgICAgICAgIHsgImRhdGEiOiAiZW5naW5lIiB9LAoJCSAqICAgICAgICAgIHsgImRhdGEiOiAiYnJvd3NlciIgfSwKCQkgKiAgICAgICAgICB7CgkJICogICAgICAgICAgICAiZGF0YSI6ICJwbGF0Zm9ybSIsCgkJICogICAgICAgICAgICAicmVuZGVyIjogIlssIF0ubmFtZSIKCQkgKiAgICAgICAgICB9CgkJICogICAgICAgIF0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBFeGVjdXRlIGEgZnVuY3Rpb24gdG8gb2J0YWluIGRhdGEKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY29sdW1uRGVmcyI6IFsgewoJCSAqICAgICAgICAgICJ0YXJnZXRzIjogWyAwIF0sCgkJICogICAgICAgICAgImRhdGEiOiBudWxsLCAvLyBVc2UgdGhlIGZ1bGwgZGF0YSBzb3VyY2Ugb2JqZWN0IGZvciB0aGUgcmVuZGVyZXIncyBzb3VyY2UKCQkgKiAgICAgICAgICAicmVuZGVyIjogImJyb3dzZXJOYW1lKCkiCgkJICogICAgICAgIH0gXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIEFzIGFuIG9iamVjdCwgZXh0cmFjdGluZyBkaWZmZXJlbnQgZGF0YSBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcwoJCSAqICAgIC8vIFRoaXMgd291bGQgYmUgdXNlZCB3aXRoIGEgZGF0YSBzb3VyY2Ugc3VjaCBhczoKCQkgKiAgICAvLyAgIHsgInBob25lIjogNTU1MjM2OCwgInBob25lX2ZpbHRlciI6ICI1NTUyMzY4IDU1NS0yMzY4IiwgInBob25lX2Rpc3BsYXkiOiAiNTU1LTIzNjgiIH0KCQkgKiAgICAvLyBIZXJlIHRoZSBgcGhvbmVgIGludGVnZXIgaXMgdXNlZCBmb3Igc29ydGluZyBhbmQgdHlwZSBkZXRlY3Rpb24sIHdoaWxlIGBwaG9uZV9maWx0ZXJgCgkJICogICAgLy8gKHdoaWNoIGhhcyBib3RoIGZvcm1zKSBpcyB1c2VkIGZvciBmaWx0ZXJpbmcgZm9yIGlmIGEgdXNlciBpbnB1dHMgZWl0aGVyIGZvcm1hdCwgd2hpbGUKCQkgKiAgICAvLyB0aGUgZm9ybWF0dGVkIHBob25lIG51bWJlciBpcyB0aGUgb25lIHRoYXQgaXMgc2hvd24gaW4gdGhlIHRhYmxlLgoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5EZWZzIjogWyB7CgkJICogICAgICAgICAgInRhcmdldHMiOiBbIDAgXSwKCQkgKiAgICAgICAgICAiZGF0YSI6IG51bGwsIC8vIFVzZSB0aGUgZnVsbCBkYXRhIHNvdXJjZSBvYmplY3QgZm9yIHRoZSByZW5kZXJlcidzIHNvdXJjZQoJCSAqICAgICAgICAgICJyZW5kZXIiOiB7CgkJICogICAgICAgICAgICAiXyI6ICJwaG9uZSIsCgkJICogICAgICAgICAgICAiZmlsdGVyIjogInBob25lX2ZpbHRlciIsCgkJICogICAgICAgICAgICAiZGlzcGxheSI6ICJwaG9uZV9kaXNwbGF5IgoJCSAqICAgICAgICAgIH0KCQkgKiAgICAgICAgfSBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNlIGFzIGEgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbGluayBmcm9tIHRoZSBkYXRhIHNvdXJjZQoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5EZWZzIjogWyB7CgkJICogICAgICAgICAgInRhcmdldHMiOiBbIDAgXSwKCQkgKiAgICAgICAgICAiZGF0YSI6ICJkb3dubG9hZF9saW5rIiwKCQkgKiAgICAgICAgICAicmVuZGVyIjogZnVuY3Rpb24gKCBkYXRhLCB0eXBlLCBmdWxsICkgewoJCSAqICAgICAgICAgICAgcmV0dXJuICc8YSBocmVmPSInK2RhdGErJyI+RG93bmxvYWQ8L2E+JzsKCQkgKiAgICAgICAgICB9CgkJICogICAgICAgIH0gXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkibVJlbmRlciI6IG51bGwsCgkKCQoJCS8qKgoJCSAqIENoYW5nZSB0aGUgY2VsbCB0eXBlIGNyZWF0ZWQgZm9yIHRoZSBjb2x1bW4gLSBlaXRoZXIgVEQgY2VsbHMgb3IgVEggY2VsbHMuIFRoaXMKCQkgKiBjYW4gYmUgdXNlZnVsIGFzIFRIIGNlbGxzIGhhdmUgc2VtYW50aWMgbWVhbmluZyBpbiB0aGUgdGFibGUgYm9keSwgYWxsb3dpbmcgdGhlbQoJCSAqIHRvIGFjdCBhcyBhIGhlYWRlciBmb3IgYSByb3cgKHlvdSBtYXkgd2lzaCB0byBhZGQgc2NvcGU9J3JvdycgdG8gdGhlIFRIIGVsZW1lbnRzKS4KCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IHRkCgkJICoKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmNvbHVtbi5jZWxsVHlwZQoJCSAqICBAZHRvcHQgQ29sdW1ucwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gTWFrZSB0aGUgZmlyc3QgY29sdW1uIHVzZSBUSCBjZWxscwoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5EZWZzIjogWyB7CgkJICogICAgICAgICAgInRhcmdldHMiOiBbIDAgXSwKCQkgKiAgICAgICAgICAiY2VsbFR5cGUiOiAidGgiCgkJICogICAgICAgIH0gXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkic0NlbGxUeXBlIjogInRkIiwKCQoJCgkJLyoqCgkJICogQ2xhc3MgdG8gZ2l2ZSB0byBlYWNoIGNlbGwgaW4gdGhpcyBjb2x1bW4uCgkJICogIEB0eXBlIHN0cmluZwoJCSAqICBAZGVmYXVsdCA8aT5FbXB0eSBzdHJpbmc8L2k+CgkJICoKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmNvbHVtbi5jbGFzcwoJCSAqICBAZHRvcHQgQ29sdW1ucwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbkRlZnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbkRlZnMiOiBbCgkJICogICAgICAgICAgeyAiY2xhc3MiOiAibXlfY2xhc3MiLCAidGFyZ2V0cyI6IFsgMCBdIH0KCQkgKiAgICAgICAgXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFVzaW5nIGBjb2x1bW5zYAoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5zIjogWwoJCSAqICAgICAgICAgIHsgImNsYXNzIjogIm15X2NsYXNzIiB9LAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIG51bGwKCQkgKiAgICAgICAgXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkic0NsYXNzIjogIiIsCgkKCQkvKioKCQkgKiBXaGVuIERhdGFUYWJsZXMgY2FsY3VsYXRlcyB0aGUgY29sdW1uIHdpZHRocyB0byBhc3NpZ24gdG8gZWFjaCBjb2x1bW4sCgkJICogaXQgZmluZHMgdGhlIGxvbmdlc3Qgc3RyaW5nIGluIGVhY2ggY29sdW1uIGFuZCB0aGVuIGNvbnN0cnVjdHMgYQoJCSAqIHRlbXBvcmFyeSB0YWJsZSBhbmQgcmVhZHMgdGhlIHdpZHRocyBmcm9tIHRoYXQuIFRoZSBwcm9ibGVtIHdpdGggdGhpcwoJCSAqIGlzIHRoYXQgIm1tbSIgaXMgbXVjaCB3aWRlciB0aGVuICJpaWlpIiwgYnV0IHRoZSBsYXR0ZXIgaXMgYSBsb25nZXIKCQkgKiBzdHJpbmcgLSB0aHVzIHRoZSBjYWxjdWxhdGlvbiBjYW4gZ28gd3JvbmcgKGRvaW5nIGl0IHByb3Blcmx5IGFuZCBwdXR0aW5nCgkJICogaXQgaW50byBhbiBET00gb2JqZWN0IGFuZCBtZWFzdXJpbmcgdGhhdCBpcyBob3JyaWJseSghKSBzbG93KS4gVGh1cyBhcwoJCSAqIGEgIndvcmsgYXJvdW5kIiB3ZSBwcm92aWRlIHRoaXMgb3B0aW9uLiBJdCB3aWxsIGFwcGVuZCBpdHMgdmFsdWUgdG8gdGhlCgkJICogdGV4dCB0aGF0IGlzIGZvdW5kIHRvIGJlIHRoZSBsb25nZXN0IHN0cmluZyBmb3IgdGhlIGNvbHVtbiAtIGkuZS4gcGFkZGluZy4KCQkgKiBHZW5lcmFsbHkgeW91IHNob3VsZG4ndCBuZWVkIHRoaXMhCgkJICogIEB0eXBlIHN0cmluZwoJCSAqICBAZGVmYXVsdCA8aT5FbXB0eSBzdHJpbmc8aT4KCQkgKgoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuY29sdW1uLmNvbnRlbnRQYWRkaW5nCgkJICogIEBkdG9wdCBDb2x1bW5zCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBVc2luZyBgY29sdW1uc2AKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY29sdW1ucyI6IFsKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICB7CgkJICogICAgICAgICAgICAiY29udGVudFBhZGRpbmciOiAibW1tIgoJCSAqICAgICAgICAgIH0KCQkgKiAgICAgICAgXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkic0NvbnRlbnRQYWRkaW5nIjogIiIsCgkKCQoJCS8qKgoJCSAqIEFsbG93cyBhIGRlZmF1bHQgdmFsdWUgdG8gYmUgZ2l2ZW4gZm9yIGEgY29sdW1uJ3MgZGF0YSwgYW5kIHdpbGwgYmUgdXNlZAoJCSAqIHdoZW5ldmVyIGEgbnVsbCBkYXRhIHNvdXJjZSBpcyBlbmNvdW50ZXJlZCAodGhpcyBjYW4gYmUgYmVjYXVzZSBgZGF0YWAKCQkgKiBpcyBzZXQgdG8gbnVsbCwgb3IgYmVjYXVzZSB0aGUgZGF0YSBzb3VyY2UgaXRzZWxmIGlzIG51bGwpLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4uZGVmYXVsdENvbnRlbnQKCQkgKiAgQGR0b3B0IENvbHVtbnMKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFVzaW5nIGBjb2x1bW5EZWZzYAoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5EZWZzIjogWwoJCSAqICAgICAgICAgIHsKCQkgKiAgICAgICAgICAgICJkYXRhIjogbnVsbCwKCQkgKiAgICAgICAgICAgICJkZWZhdWx0Q29udGVudCI6ICJFZGl0IiwKCQkgKiAgICAgICAgICAgICJ0YXJnZXRzIjogWyAtMSBdCgkJICogICAgICAgICAgfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbnMiOiBbCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgewoJCSAqICAgICAgICAgICAgImRhdGEiOiBudWxsLAoJCSAqICAgICAgICAgICAgImRlZmF1bHRDb250ZW50IjogIkVkaXQiCgkJICogICAgICAgICAgfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJzRGVmYXVsdENvbnRlbnQiOiBudWxsLAoJCgkKCQkvKioKCQkgKiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgaW4gRGF0YVRhYmxlcycgc2VydmVyLXNpZGUgcHJvY2Vzc2luZy4gSXQgY2FuCgkJICogYmUgZXhjZXB0aW9uYWxseSB1c2VmdWwgdG8ga25vdyB3aGF0IGNvbHVtbnMgYXJlIGJlaW5nIGRpc3BsYXllZCBvbiB0aGUKCQkgKiBjbGllbnQgc2lkZSwgYW5kIHRvIG1hcCB0aGVzZSB0byBkYXRhYmFzZSBmaWVsZHMuIFdoZW4gZGVmaW5lZCwgdGhlIG5hbWVzCgkJICogYWxzbyBhbGxvdyBEYXRhVGFibGVzIHRvIHJlb3JkZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmVyIGlmIGl0IGNvbWVzCgkJICogYmFjayBpbiBhbiB1bmV4cGVjdGVkIG9yZGVyIChpLmUuIGlmIHlvdSBzd2l0Y2ggeW91ciBjb2x1bW5zIGFyb3VuZCBvbiB0aGUKCQkgKiBjbGllbnQtc2lkZSwgeW91ciBzZXJ2ZXItc2lkZSBjb2RlIGRvZXMgbm90IGFsc28gbmVlZCB1cGRhdGluZykuCgkJICogIEB0eXBlIHN0cmluZwoJCSAqICBAZGVmYXVsdCA8aT5FbXB0eSBzdHJpbmc8L2k+CgkJICoKCQkgKiAgQG5hbWUgRGF0YVRhYmxlLmRlZmF1bHRzLmNvbHVtbi5uYW1lCgkJICogIEBkdG9wdCBDb2x1bW5zCgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBVc2luZyBgY29sdW1uRGVmc2AKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY29sdW1uRGVmcyI6IFsKCQkgKiAgICAgICAgICB7ICJuYW1lIjogImVuZ2luZSIsICJ0YXJnZXRzIjogWyAwIF0gfSwKCQkgKiAgICAgICAgICB7ICJuYW1lIjogImJyb3dzZXIiLCAidGFyZ2V0cyI6IFsgMSBdIH0sCgkJICogICAgICAgICAgeyAibmFtZSI6ICJwbGF0Zm9ybSIsICJ0YXJnZXRzIjogWyAyIF0gfSwKCQkgKiAgICAgICAgICB7ICJuYW1lIjogInZlcnNpb24iLCAidGFyZ2V0cyI6IFsgMyBdIH0sCgkJICogICAgICAgICAgeyAibmFtZSI6ICJncmFkZSIsICJ0YXJnZXRzIjogWyA0IF0gfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbnMiOiBbCgkJICogICAgICAgICAgeyAibmFtZSI6ICJlbmdpbmUiIH0sCgkJICogICAgICAgICAgeyAibmFtZSI6ICJicm93c2VyIiB9LAoJCSAqICAgICAgICAgIHsgIm5hbWUiOiAicGxhdGZvcm0iIH0sCgkJICogICAgICAgICAgeyAibmFtZSI6ICJ2ZXJzaW9uIiB9LAoJCSAqICAgICAgICAgIHsgIm5hbWUiOiAiZ3JhZGUiIH0KCQkgKiAgICAgICAgXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkic05hbWUiOiAiIiwKCQoJCgkJLyoqCgkJICogRGVmaW5lcyBhIGRhdGEgc291cmNlIHR5cGUgZm9yIHRoZSBvcmRlcmluZyB3aGljaCBjYW4gYmUgdXNlZCB0byByZWFkCgkJICogcmVhbC10aW1lIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhYmxlICh1cGRhdGluZyB0aGUgaW50ZXJuYWxseSBjYWNoZWQKCQkgKiB2ZXJzaW9uKSBwcmlvciB0byBvcmRlcmluZy4gVGhpcyBhbGxvd3Mgb3JkZXJpbmcgdG8gb2NjdXIgb24gdXNlcgoJCSAqIGVkaXRhYmxlIGVsZW1lbnRzIHN1Y2ggYXMgZm9ybSBpbnB1dHMuCgkJICogIEB0eXBlIHN0cmluZwoJCSAqICBAZGVmYXVsdCBzdGQKCQkgKgoJCSAqICBAbmFtZSBEYXRhVGFibGUuZGVmYXVsdHMuY29sdW1uLm9yZGVyRGF0YVR5cGUKCQkgKiAgQGR0b3B0IENvbHVtbnMKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFVzaW5nIGBjb2x1bW5EZWZzYAoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5EZWZzIjogWwoJCSAqICAgICAgICAgIHsgIm9yZGVyRGF0YVR5cGUiOiAiZG9tLXRleHQiLCAidGFyZ2V0cyI6IFsgMiwgMyBdIH0sCgkJICogICAgICAgICAgeyAidHlwZSI6ICJudW1lcmljIiwgInRhcmdldHMiOiBbIDMgXSB9LAoJCSAqICAgICAgICAgIHsgIm9yZGVyRGF0YVR5cGUiOiAiZG9tLXNlbGVjdCIsICJ0YXJnZXRzIjogWyA0IF0gfSwKCQkgKiAgICAgICAgICB7ICJvcmRlckRhdGFUeXBlIjogImRvbS1jaGVja2JveCIsICJ0YXJnZXRzIjogWyA1IF0gfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbnMiOiBbCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIHsgIm9yZGVyRGF0YVR5cGUiOiAiZG9tLXRleHQiIH0sCgkJICogICAgICAgICAgeyAib3JkZXJEYXRhVHlwZSI6ICJkb20tdGV4dCIsICJ0eXBlIjogIm51bWVyaWMiIH0sCgkJICogICAgICAgICAgeyAib3JkZXJEYXRhVHlwZSI6ICJkb20tc2VsZWN0IiB9LAoJCSAqICAgICAgICAgIHsgIm9yZGVyRGF0YVR5cGUiOiAiZG9tLWNoZWNrYm94IiB9CgkJICogICAgICAgIF0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICovCgkJInNTb3J0RGF0YVR5cGUiOiAic3RkIiwKCQoJCgkJLyoqCgkJICogVGhlIHRpdGxlIG9mIHRoaXMgY29sdW1uLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbCA8aT5EZXJpdmVkIGZyb20gdGhlICdUSCcgdmFsdWUgZm9yIHRoaXMgY29sdW1uIGluIHRoZQoJCSAqICAgIG9yaWdpbmFsIEhUTUwgdGFibGUuPC9pPgoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4udGl0bGUKCQkgKiAgQGR0b3B0IENvbHVtbnMKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFVzaW5nIGBjb2x1bW5EZWZzYAoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5EZWZzIjogWwoJCSAqICAgICAgICAgIHsgInRpdGxlIjogIk15IGNvbHVtbiB0aXRsZSIsICJ0YXJnZXRzIjogWyAwIF0gfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbnMiOiBbCgkJICogICAgICAgICAgeyAidGl0bGUiOiAiTXkgY29sdW1uIHRpdGxlIiB9LAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIG51bGwKCQkgKiAgICAgICAgXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkic1RpdGxlIjogbnVsbCwKCQoJCgkJLyoqCgkJICogVGhlIHR5cGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGhvdyB0aGUgZGF0YSBmb3IgdGhpcyBjb2x1bW4gd2lsbCBiZQoJCSAqIG9yZGVyZWQuIEZvdXIgdHlwZXMgKHN0cmluZywgbnVtZXJpYywgZGF0ZSBhbmQgaHRtbCAod2hpY2ggd2lsbCBzdHJpcAoJCSAqIEhUTUwgdGFncyBiZWZvcmUgb3JkZXJpbmcpKSBhcmUgY3VycmVudGx5IGF2YWlsYWJsZS4gTm90ZSB0aGF0IG9ubHkgZGF0ZQoJCSAqIGZvcm1hdHMgdW5kZXJzdG9vZCBieSBKYXZhc2NyaXB0J3MgRGF0ZSgpIG9iamVjdCB3aWxsIGJlIGFjY2VwdGVkIGFzIHR5cGUKCQkgKiBkYXRlLiBGb3IgZXhhbXBsZTogIk1hciAyNiwgMjAwOCA1OjAzIFBNIi4gTWF5IHRha2UgdGhlIHZhbHVlczogJ3N0cmluZycsCgkJICogJ251bWVyaWMnLCAnZGF0ZScgb3IgJ2h0bWwnIChieSBkZWZhdWx0KS4gRnVydGhlciB0eXBlcyBjYW4gYmUgYWRkaW5nCgkJICogdGhyb3VnaCBwbHVnLWlucy4KCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IG51bGwgPGk+QXV0by1kZXRlY3RlZCBmcm9tIHJhdyBkYXRhPC9pPgoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4udHlwZQoJCSAqICBAZHRvcHQgQ29sdW1ucwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbkRlZnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbkRlZnMiOiBbCgkJICogICAgICAgICAgeyAidHlwZSI6ICJodG1sIiwgInRhcmdldHMiOiBbIDAgXSB9CgkJICogICAgICAgIF0KCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9ICk7CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBVc2luZyBgY29sdW1uc2AKCQkgKiAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJICogICAgICAkKCcjZXhhbXBsZScpLmRhdGFUYWJsZSggewoJCSAqICAgICAgICAiY29sdW1ucyI6IFsKCQkgKiAgICAgICAgICB7ICJ0eXBlIjogImh0bWwiIH0sCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgbnVsbAoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqLwoJCSJzVHlwZSI6IG51bGwsCgkKCQoJCS8qKgoJCSAqIERlZmluaW5nIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uLCB0aGlzIHBhcmFtZXRlciBtYXkgdGFrZSBhbnkgQ1NTIHZhbHVlCgkJICogKDNlbSwgMjBweCBldGMpLiBEYXRhVGFibGVzIGFwcGxpZXMgJ3NtYXJ0JyB3aWR0aHMgdG8gY29sdW1ucyB3aGljaCBoYXZlIG5vdAoJCSAqIGJlZW4gZ2l2ZW4gYSBzcGVjaWZpYyB3aWR0aCB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlIGVuc3VyaW5nIHRoYXQgdGhlIHRhYmxlCgkJICogcmVtYWlucyByZWFkYWJsZS4KCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IG51bGwgPGk+QXV0b21hdGljPC9pPgoJCSAqCgkJICogIEBuYW1lIERhdGFUYWJsZS5kZWZhdWx0cy5jb2x1bW4ud2lkdGgKCQkgKiAgQGR0b3B0IENvbHVtbnMKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIFVzaW5nIGBjb2x1bW5EZWZzYAoJCSAqICAgICQoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkgKiAgICAgICQoJyNleGFtcGxlJykuZGF0YVRhYmxlKCB7CgkJICogICAgICAgICJjb2x1bW5EZWZzIjogWwoJCSAqICAgICAgICAgIHsgIndpZHRoIjogIjIwJSIsICJ0YXJnZXRzIjogWyAwIF0gfQoJCSAqICAgICAgICBdCgkJICogICAgICB9ICk7CgkJICogICAgfSApOwoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVXNpbmcgYGNvbHVtbnNgCgkJICogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgJCgnI2V4YW1wbGUnKS5kYXRhVGFibGUoIHsKCQkgKiAgICAgICAgImNvbHVtbnMiOiBbCgkJICogICAgICAgICAgeyAid2lkdGgiOiAiMjAlIiB9LAoJCSAqICAgICAgICAgIG51bGwsCgkJICogICAgICAgICAgbnVsbCwKCQkgKiAgICAgICAgICBudWxsLAoJCSAqICAgICAgICAgIG51bGwKCQkgKiAgICAgICAgXQoJCSAqICAgICAgfSApOwoJCSAqICAgIH0gKTsKCQkgKi8KCQkic1dpZHRoIjogbnVsbAoJfTsKCQoJX2ZuSHVuZ2FyaWFuTWFwKCBEYXRhVGFibGUuZGVmYXVsdHMuY29sdW1uICk7CgkKCQoJCgkvKioKCSAqIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0IC0gdGhpcyBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgYQoJICogZ2l2ZW4gdGFibGUsIGluY2x1ZGluZyBjb25maWd1cmF0aW9uLCBkYXRhIGFuZCBjdXJyZW50IGFwcGxpY2F0aW9uIG9mIHRoZQoJICogdGFibGUgb3B0aW9ucy4gRGF0YVRhYmxlcyBkb2VzIG5vdCBoYXZlIGEgc2luZ2xlIGluc3RhbmNlIGZvciBlYWNoIERhdGFUYWJsZQoJICogd2l0aCB0aGUgc2V0dGluZ3MgYXR0YWNoZWQgdG8gdGhhdCBpbnN0YW5jZSwgYnV0IHJhdGhlciBpbnN0YW5jZXMgb2YgdGhlCgkgKiBEYXRhVGFibGUgImNsYXNzIiBhcmUgY3JlYXRlZCBvbi10aGUtZmx5IGFzIG5lZWRlZCAodHlwaWNhbGx5IGJ5IGEKCSAqICQoKS5kYXRhVGFibGUoKSBjYWxsKSBhbmQgdGhlIHNldHRpbmdzIG9iamVjdCBpcyB0aGVuIGFwcGxpZWQgdG8gdGhhdAoJICogaW5zdGFuY2UuCgkgKgoJICogTm90ZSB0aGF0IHRoaXMgb2JqZWN0IGlzIHJlbGF0ZWQgdG8ge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0c30gYnV0IHRoaXMKCSAqIG9uZSBpcyB0aGUgaW50ZXJuYWwgZGF0YSBzdG9yZSBmb3IgRGF0YVRhYmxlcydzIGNhY2hlIG9mIGNvbHVtbnMuIEl0IHNob3VsZAoJICogTk9UIGJlIG1hbmlwdWxhdGVkIG91dHNpZGUgb2YgRGF0YVRhYmxlcy4gQW55IGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGRvbmUKCSAqIHRocm91Z2ggdGhlIGluaXRpYWxpc2F0aW9uIG9wdGlvbnMuCgkgKiAgQG5hbWVzcGFjZQoJICogIEB0b2RvIFJlYWxseSBzaG91bGQgYXR0YWNoIHRoZSBzZXR0aW5ncyBvYmplY3QgdG8gaW5kaXZpZHVhbCBpbnN0YW5jZXMgc28gd2UKCSAqICAgIGRvbid0IG5lZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb24gZWFjaCAkKCkuZGF0YVRhYmxlKCkgY2FsbCAoaWYgdGhlCgkgKiAgICB0YWJsZSBhbHJlYWR5IGV4aXN0cykuIEl0IHdvdWxkIGFsc28gc2F2ZSBwYXNzaW5nIG9TZXR0aW5ncyBhcm91bmQgYW5kCgkgKiAgICBpbnRvIGV2ZXJ5IHNpbmdsZSBmdW5jdGlvbi4gSG93ZXZlciwgdGhpcyBpcyBhIHZlcnkgc2lnbmlmaWNhbnQKCSAqICAgIGFyY2hpdGVjdHVyZSBjaGFuZ2UgZm9yIERhdGFUYWJsZXMgYW5kIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBicmVhawoJICogICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBpbnN0YWxsYXRpb25zLiBUaGlzIGlzIHNvbWV0aGluZyB0aGF0CgkgKiAgICB3aWxsIGJlIGRvbmUgaW4gMi4wLgoJICovCglEYXRhVGFibGUubW9kZWxzLm9TZXR0aW5ncyA9IHsKCQkvKioKCQkgKiBQcmltYXJ5IGZlYXR1cmVzIG9mIERhdGFUYWJsZXMgYW5kIHRoZWlyIGVuYWJsZW1lbnQgc3RhdGUuCgkJICogIEBuYW1lc3BhY2UKCQkgKi8KCQkib0ZlYXR1cmVzIjogewoJCgkJCS8qKgoJCQkgKiBGbGFnIHRvIHNheSBpZiBEYXRhVGFibGVzIHNob3VsZCBhdXRvbWF0aWNhbGx5IHRyeSB0byBjYWxjdWxhdGUgdGhlCgkJCSAqIG9wdGltdW0gdGFibGUgYW5kIGNvbHVtbnMgd2lkdGhzICh0cnVlKSBvciBub3QgKGZhbHNlKS4KCQkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkJICogIEB0eXBlIGJvb2xlYW4KCQkJICovCgkJCSJiQXV0b1dpZHRoIjogbnVsbCwKCQoJCQkvKioKCQkJICogRGVsYXkgdGhlIGNyZWF0aW9uIG9mIFRSIGFuZCBURCBlbGVtZW50cyB1bnRpbCB0aGV5IGFyZSBhY3R1YWxseQoJCQkgKiBuZWVkZWQgYnkgYSBkcml2ZW4gcGFnZSBkcmF3LiBUaGlzIGNhbiBnaXZlIGEgc2lnbmlmaWNhbnQgc3BlZWQKCQkJICogaW5jcmVhc2UgZm9yIEFqYXggc291cmNlIGFuZCBKYXZhc2NyaXB0IHNvdXJjZSBkYXRhLCBidXQgbWFrZXMgbm8KCQkJICogZGlmZmVyZW5jZSBhdCBhbGwgZm9yIERPTSBhbmQgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyB0YWJsZXMuCgkJCSAqIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCBieSB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gVG8KCQkJICogc2V0IGEgZGVmYXVsdCB1c2Uge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0c30uCgkJCSAqICBAdHlwZSBib29sZWFuCgkJCSAqLwoJCQkiYkRlZmVyUmVuZGVyIjogbnVsbCwKCQoJCQkvKioKCQkJICogRW5hYmxlIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgb3Igbm90LiBOb3RlIHRoYXQgaWYgdGhpcyBpcyBkaXNhYmxlZAoJCQkgKiB0aGVuIHRoZXJlIGlzIG5vIGZpbHRlcmluZyBhdCBhbGwgb24gdGhlIHRhYmxlLCBpbmNsdWRpbmcgZm5GaWx0ZXIuCgkJCSAqIFRvIGp1c3QgcmVtb3ZlIHRoZSBmaWx0ZXJpbmcgaW5wdXQgdXNlIHNEb20gYW5kIHJlbW92ZSB0aGUgJ2YnIG9wdGlvbi4KCQkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkJICogIEB0eXBlIGJvb2xlYW4KCQkJICovCgkJCSJiRmlsdGVyIjogbnVsbCwKCQoJCQkvKioKCQkJICogVGFibGUgaW5mb3JtYXRpb24gZWxlbWVudCAodGhlICdTaG93aW5nIHggb2YgeSByZWNvcmRzJyBkaXYpIGVuYWJsZQoJCQkgKiBmbGFnLgoJCQkgKiBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgYnkgdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUuIFRvCgkJCSAqIHNldCBhIGRlZmF1bHQgdXNlIHtAbGluayBEYXRhVGFibGUuZGVmYXVsdHN9LgoJCQkgKiAgQHR5cGUgYm9vbGVhbgoJCQkgKi8KCQkJImJJbmZvIjogbnVsbCwKCQoJCQkvKioKCQkJICogUHJlc2VudCBhIHVzZXIgY29udHJvbCBhbGxvd2luZyB0aGUgZW5kIHVzZXIgdG8gY2hhbmdlIHRoZSBwYWdlIHNpemUKCQkJICogd2hlbiBwYWdpbmF0aW9uIGlzIGVuYWJsZWQuCgkJCSAqIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCBieSB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gVG8KCQkJICogc2V0IGEgZGVmYXVsdCB1c2Uge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0c30uCgkJCSAqICBAdHlwZSBib29sZWFuCgkJCSAqLwoJCQkiYkxlbmd0aENoYW5nZSI6IG51bGwsCgkKCQkJLyoqCgkJCSAqIFBhZ2luYXRpb24gZW5hYmxlZCBvciBub3QuIE5vdGUgdGhhdCBpZiB0aGlzIGlzIGRpc2FibGVkIHRoZW4gbGVuZ3RoCgkJCSAqIGNoYW5naW5nIG11c3QgYWxzbyBiZSBkaXNhYmxlZC4KCQkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkJICogIEB0eXBlIGJvb2xlYW4KCQkJICovCgkJCSJiUGFnaW5hdGUiOiBudWxsLAoJCgkJCS8qKgoJCQkgKiBQcm9jZXNzaW5nIGluZGljYXRvciBlbmFibGUgZmxhZyB3aGVuZXZlciBEYXRhVGFibGVzIGlzIGVuYWN0aW5nIGEKCQkJICogdXNlciByZXF1ZXN0IC0gdHlwaWNhbGx5IGFuIEFqYXggcmVxdWVzdCBmb3Igc2VydmVyLXNpZGUgcHJvY2Vzc2luZy4KCQkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkJICogIEB0eXBlIGJvb2xlYW4KCQkJICovCgkJCSJiUHJvY2Vzc2luZyI6IG51bGwsCgkKCQkJLyoqCgkJCSAqIFNlcnZlci1zaWRlIHByb2Nlc3NpbmcgZW5hYmxlZCBmbGFnIC0gd2hlbiBlbmFibGVkIERhdGFUYWJsZXMgd2lsbAoJCQkgKiBnZXQgYWxsIGRhdGEgZnJvbSB0aGUgc2VydmVyIGZvciBldmVyeSBkcmF3IC0gdGhlcmUgaXMgbm8gZmlsdGVyaW5nLAoJCQkgKiBzb3J0aW5nIG9yIHBhZ2luZyBkb25lIG9uIHRoZSBjbGllbnQtc2lkZS4KCQkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkJICogIEB0eXBlIGJvb2xlYW4KCQkJICovCgkJCSJiU2VydmVyU2lkZSI6IG51bGwsCgkKCQkJLyoqCgkJCSAqIFNvcnRpbmcgZW5hYmxlbWVudCBmbGFnLgoJCQkgKiBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgYnkgdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUuIFRvCgkJCSAqIHNldCBhIGRlZmF1bHQgdXNlIHtAbGluayBEYXRhVGFibGUuZGVmYXVsdHN9LgoJCQkgKiAgQHR5cGUgYm9vbGVhbgoJCQkgKi8KCQkJImJTb3J0IjogbnVsbCwKCQoJCQkvKioKCQkJICogTXVsdGktY29sdW1uIHNvcnRpbmcKCQkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkJICogIEB0eXBlIGJvb2xlYW4KCQkJICovCgkJCSJiU29ydE11bHRpIjogbnVsbCwKCQoJCQkvKioKCQkJICogQXBwbHkgYSBjbGFzcyB0byB0aGUgY29sdW1ucyB3aGljaCBhcmUgYmVpbmcgc29ydGVkIHRvIHByb3ZpZGUgYQoJCQkgKiB2aXN1YWwgaGlnaGxpZ2h0IG9yIG5vdC4gVGhpcyBjYW4gc2xvdyB0aGluZ3MgZG93biB3aGVuIGVuYWJsZWQgc2luY2UKCQkJICogdGhlcmUgaXMgYSBsb3Qgb2YgRE9NIGludGVyYWN0aW9uLgoJCQkgKiBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgYnkgdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUuIFRvCgkJCSAqIHNldCBhIGRlZmF1bHQgdXNlIHtAbGluayBEYXRhVGFibGUuZGVmYXVsdHN9LgoJCQkgKiAgQHR5cGUgYm9vbGVhbgoJCQkgKi8KCQkJImJTb3J0Q2xhc3NlcyI6IG51bGwsCgkKCQkJLyoqCgkJCSAqIFN0YXRlIHNhdmluZyBlbmFibGVtZW50IGZsYWcuCgkJCSAqIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCBieSB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gVG8KCQkJICogc2V0IGEgZGVmYXVsdCB1c2Uge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0c30uCgkJCSAqICBAdHlwZSBib29sZWFuCgkJCSAqLwoJCQkiYlN0YXRlU2F2ZSI6IG51bGwKCQl9LAoJCgkKCQkvKioKCQkgKiBTY3JvbGxpbmcgc2V0dGluZ3MgZm9yIGEgdGFibGUuCgkJICogIEBuYW1lc3BhY2UKCQkgKi8KCQkib1Njcm9sbCI6IHsKCQkJLyoqCgkJCSAqIFdoZW4gdGhlIHRhYmxlIGlzIHNob3J0ZXIgaW4gaGVpZ2h0IHRoYW4gc1Njcm9sbFksIGNvbGxhcHNlIHRoZQoJCQkgKiB0YWJsZSBjb250YWluZXIgZG93biB0byB0aGUgaGVpZ2h0IG9mIHRoZSB0YWJsZSAod2hlbiB0cnVlKS4KCQkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkJICogIEB0eXBlIGJvb2xlYW4KCQkJICovCgkJCSJiQ29sbGFwc2UiOiBudWxsLAoJCgkJCS8qKgoJCQkgKiBXaWR0aCBvZiB0aGUgc2Nyb2xsYmFyIGZvciB0aGUgd2ViLWJyb3dzZXIncyBwbGF0Zm9ybS4gQ2FsY3VsYXRlZAoJCQkgKiBkdXJpbmcgdGFibGUgaW5pdGlhbGlzYXRpb24uCgkJCSAqICBAdHlwZSBpbnQKCQkJICogIEBkZWZhdWx0IDAKCQkJICovCgkJCSJpQmFyV2lkdGgiOiAwLAoJCgkJCS8qKgoJCQkgKiBWaWV3cG9ydCB3aWR0aCBmb3IgaG9yaXpvbnRhbCBzY3JvbGxpbmcuIEhvcml6b250YWwgc2Nyb2xsaW5nIGlzCgkJCSAqIGRpc2FibGVkIGlmIGFuIGVtcHR5IHN0cmluZy4KCQkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkJICogIEB0eXBlIHN0cmluZwoJCQkgKi8KCQkJInNYIjogbnVsbCwKCQoJCQkvKioKCQkJICogV2lkdGggdG8gZXhwYW5kIHRoZSB0YWJsZSB0byB3aGVuIHVzaW5nIHgtc2Nyb2xsaW5nLiBUeXBpY2FsbHkgeW91CgkJCSAqIHNob3VsZCBub3QgbmVlZCB0byB1c2UgdGhpcy4KCQkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkJICogIEB0eXBlIHN0cmluZwoJCQkgKiAgQGRlcHJlY2F0ZWQKCQkJICovCgkJCSJzWElubmVyIjogbnVsbCwKCQoJCQkvKioKCQkJICogVmlld3BvcnQgaGVpZ2h0IGZvciB2ZXJ0aWNhbCBzY3JvbGxpbmcuIFZlcnRpY2FsIHNjcm9sbGluZyBpcyBkaXNhYmxlZAoJCQkgKiBpZiBhbiBlbXB0eSBzdHJpbmcuCgkJCSAqIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCBieSB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gVG8KCQkJICogc2V0IGEgZGVmYXVsdCB1c2Uge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0c30uCgkJCSAqICBAdHlwZSBzdHJpbmcKCQkJICovCgkJCSJzWSI6IG51bGwKCQl9LAoJCgkJLyoqCgkJICogTGFuZ3VhZ2UgaW5mb3JtYXRpb24gZm9yIHRoZSB0YWJsZS4KCQkgKiAgQG5hbWVzcGFjZQoJCSAqICBAZXh0ZW5kcyBEYXRhVGFibGUuZGVmYXVsdHMub0xhbmd1YWdlCgkJICovCgkJIm9MYW5ndWFnZSI6IHsKCQkJLyoqCgkJCSAqIEluZm9ybWF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLiBTZWUKCQkJICoge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0cy5mbkluZm9DYWxsYmFja30KCQkJICogIEB0eXBlIGZ1bmN0aW9uCgkJCSAqICBAZGVmYXVsdCBudWxsCgkJCSAqLwoJCQkiZm5JbmZvQ2FsbGJhY2siOiBudWxsCgkJfSwKCQoJCS8qKgoJCSAqIEJyb3dzZXIgc3VwcG9ydCBwYXJhbWV0ZXJzCgkJICogIEBuYW1lc3BhY2UKCQkgKi8KCQkib0Jyb3dzZXIiOiB7CgkJCS8qKgoJCQkgKiBJbmRpY2F0ZSBpZiB0aGUgYnJvd3NlciBpbmNvcnJlY3RseSBjYWxjdWxhdGVzIHdpZHRoOjEwMCUgaW5zaWRlIGEKCQkJICogc2Nyb2xsaW5nIGVsZW1lbnQgKElFNi83KQoJCQkgKiAgQHR5cGUgYm9vbGVhbgoJCQkgKiAgQGRlZmF1bHQgZmFsc2UKCQkJICovCgkJCSJiU2Nyb2xsT3ZlcnNpemUiOiBmYWxzZSwKCQoJCQkvKioKCQkJICogRGV0ZXJtaW5lIGlmIHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgaXMgb24gdGhlIHJpZ2h0IG9yIGxlZnQgb2YgdGhlCgkJCSAqIHNjcm9sbGluZyBjb250YWluZXIgLSBuZWVkZWQgZm9yIHJ0bCBsYW5ndWFnZSBsYXlvdXQsIGFsdGhvdWdoIG5vdAoJCQkgKiBhbGwgYnJvd3NlcnMgbW92ZSB0aGUgc2Nyb2xsYmFyIChTYWZhcmkpLgoJCQkgKiAgQHR5cGUgYm9vbGVhbgoJCQkgKiAgQGRlZmF1bHQgZmFsc2UKCQkJICovCgkJCSJiU2Nyb2xsYmFyTGVmdCI6IGZhbHNlLAoJCgkJCS8qKgoJCQkgKiBGbGFnIGZvciBpZiBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBpcyBmdWxseSBzdXBwb3J0ZWQgb3Igbm90CgkJCSAqICBAdHlwZSBib29sZWFuCgkJCSAqICBAZGVmYXVsdCBmYWxzZQoJCQkgKi8KCQkJImJCb3VuZGluZyI6IGZhbHNlLAoJCgkJCS8qKgoJCQkgKiBCcm93c2VyIHNjcm9sbGJhciB3aWR0aAoJCQkgKiAgQHR5cGUgaW50ZWdlcgoJCQkgKiAgQGRlZmF1bHQgMAoJCQkgKi8KCQkJImJhcldpZHRoIjogMAoJCX0sCgkKCQoJCSJhamF4IjogbnVsbCwKCQoJCgkJLyoqCgkJICogQXJyYXkgcmVmZXJlbmNpbmcgdGhlIG5vZGVzIHdoaWNoIGFyZSB1c2VkIGZvciB0aGUgZmVhdHVyZXMuIFRoZQoJCSAqIHBhcmFtZXRlcnMgb2YgdGhpcyBvYmplY3QgbWF0Y2ggd2hhdCBpcyBhbGxvd2VkIGJ5IHNEb20gLSBpLmUuCgkJICogICA8dWw+CgkJICogICAgIDxsaT4nbCcgLSBMZW5ndGggY2hhbmdpbmc8L2xpPgoJCSAqICAgICA8bGk+J2YnIC0gRmlsdGVyaW5nIGlucHV0PC9saT4KCQkgKiAgICAgPGxpPid0JyAtIFRoZSB0YWJsZSE8L2xpPgoJCSAqICAgICA8bGk+J2knIC0gSW5mb3JtYXRpb248L2xpPgoJCSAqICAgICA8bGk+J3AnIC0gUGFnaW5hdGlvbjwvbGk+CgkJICogICAgIDxsaT4ncicgLSBwUm9jZXNzaW5nPC9saT4KCQkgKiAgIDwvdWw+CgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IFtdCgkJICovCgkJImFhbkZlYXR1cmVzIjogW10sCgkKCQkvKioKCQkgKiBTdG9yZSBkYXRhIGluZm9ybWF0aW9uIC0gc2VlIHtAbGluayBEYXRhVGFibGUubW9kZWxzLm9Sb3d9IGZvciBkZXRhaWxlZAoJCSAqIGluZm9ybWF0aW9uLgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqLwoJCSJhb0RhdGEiOiBbXSwKCQoJCS8qKgoJCSAqIEFycmF5IG9mIGluZGV4ZXMgd2hpY2ggYXJlIGluIHRoZSBjdXJyZW50IGRpc3BsYXkgKGFmdGVyIGZpbHRlcmluZyBldGMpCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IFtdCgkJICovCgkJImFpRGlzcGxheSI6IFtdLAoJCgkJLyoqCgkJICogQXJyYXkgb2YgaW5kZXhlcyBmb3IgZGlzcGxheSAtIG5vIGZpbHRlcmluZwoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqLwoJCSJhaURpc3BsYXlNYXN0ZXIiOiBbXSwKCQoJCS8qKgoJCSAqIE1hcCBvZiByb3cgaWRzIHRvIGRhdGEgaW5kZXhlcwoJCSAqICBAdHlwZSBvYmplY3QKCQkgKiAgQGRlZmF1bHQge30KCQkgKi8KCQkiYUlkcyI6IHt9LAoJCgkJLyoqCgkJICogU3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBjb2x1bW4gdGhhdCBpcyBpbiB1c2UKCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9Db2x1bW5zIjogW10sCgkKCQkvKioKCQkgKiBTdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFibGUncyBoZWFkZXIKCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9IZWFkZXIiOiBbXSwKCQoJCS8qKgoJCSAqIFN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWJsZSdzIGZvb3RlcgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqLwoJCSJhb0Zvb3RlciI6IFtdLAoJCgkJLyoqCgkJICogU3RvcmUgdGhlIGFwcGxpZWQgZ2xvYmFsIHNlYXJjaCBpbmZvcm1hdGlvbiBpbiBjYXNlIHdlIHdhbnQgdG8gZm9yY2UgYQoJCSAqIHJlc2VhcmNoIG9yIGNvbXBhcmUgdGhlIG9sZCBzZWFyY2ggdG8gYSBuZXcgb25lLgoJCSAqIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCBieSB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gVG8KCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkgKiAgQG5hbWVzcGFjZQoJCSAqICBAZXh0ZW5kcyBEYXRhVGFibGUubW9kZWxzLm9TZWFyY2gKCQkgKi8KCQkib1ByZXZpb3VzU2VhcmNoIjoge30sCgkKCQkvKioKCQkgKiBTdG9yZSB0aGUgYXBwbGllZCBzZWFyY2ggZm9yIGVhY2ggY29sdW1uIC0gc2VlCgkJICoge0BsaW5rIERhdGFUYWJsZS5tb2RlbHMub1NlYXJjaH0gZm9yIHRoZSBmb3JtYXQgdGhhdCBpcyB1c2VkIGZvciB0aGUKCQkgKiBmaWx0ZXJpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggY29sdW1uLgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqLwoJCSJhb1ByZVNlYXJjaENvbHMiOiBbXSwKCQoJCS8qKgoJCSAqIFNvcnRpbmcgdGhhdCBpcyBhcHBsaWVkIHRvIHRoZSB0YWJsZS4gTm90ZSB0aGF0IHRoZSBpbm5lciBhcnJheXMgYXJlCgkJICogdXNlZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoKCQkgKiA8dWw+CgkJICogICA8bGk+SW5kZXggMCAtIGNvbHVtbiBudW1iZXI8L2xpPgoJCSAqICAgPGxpPkluZGV4IDEgLSBjdXJyZW50IHNvcnRpbmcgZGlyZWN0aW9uPC9saT4KCQkgKiA8L3VsPgoJCSAqIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCBieSB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gVG8KCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQHRvZG8gVGhlc2UgaW5uZXIgYXJyYXlzIHNob3VsZCByZWFsbHkgYmUgb2JqZWN0cwoJCSAqLwoJCSJhYVNvcnRpbmciOiBudWxsLAoJCgkJLyoqCgkJICogU29ydGluZyB0aGF0IGlzIGFsd2F5cyBhcHBsaWVkIHRvIHRoZSB0YWJsZSAoaS5lLiBwcmVmaXhlZCBpbiBmcm9udCBvZgoJCSAqIGFhU29ydGluZykuCgkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCSAqIHNldCBhIGRlZmF1bHQgdXNlIHtAbGluayBEYXRhVGFibGUuZGVmYXVsdHN9LgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqLwoJCSJhYVNvcnRpbmdGaXhlZCI6IFtdLAoJCgkJLyoqCgkJICogQ2xhc3NlcyB0byB1c2UgZm9yIHRoZSBzdHJpcGluZyBvZiBhIHRhYmxlLgoJCSAqIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCBieSB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gVG8KCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYXNTdHJpcGVDbGFzc2VzIjogbnVsbCwKCQoJCS8qKgoJCSAqIElmIHJlc3RvcmluZyBhIHRhYmxlIC0gd2Ugc2hvdWxkIHJlc3RvcmUgaXRzIHN0cmlwaW5nIGNsYXNzZXMgYXMgd2VsbAoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqLwoJCSJhc0Rlc3Ryb3lTdHJpcGVzIjogW10sCgkKCQkvKioKCQkgKiBJZiByZXN0b3JpbmcgYSB0YWJsZSAtIHdlIHNob3VsZCByZXN0b3JlIGl0cyB3aWR0aAoJCSAqICBAdHlwZSBpbnQKCQkgKiAgQGRlZmF1bHQgMAoJCSAqLwoJCSJzRGVzdHJveVdpZHRoIjogMCwKCQoJCS8qKgoJCSAqIENhbGxiYWNrIGZ1bmN0aW9ucyBhcnJheSBmb3IgZXZlcnkgdGltZSBhIHJvdyBpcyBpbnNlcnRlZCAoaS5lLiBvbiBhIGRyYXcpLgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqLwoJCSJhb1Jvd0NhbGxiYWNrIjogW10sCgkKCQkvKioKCQkgKiBDYWxsYmFjayBmdW5jdGlvbnMgZm9yIHRoZSBoZWFkZXIgb24gZWFjaCBkcmF3LgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqLwoJCSJhb0hlYWRlckNhbGxiYWNrIjogW10sCgkKCQkvKioKCQkgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIGZvb3RlciBvbiBlYWNoIGRyYXcuCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IFtdCgkJICovCgkJImFvRm9vdGVyQ2FsbGJhY2siOiBbXSwKCQoJCS8qKgoJCSAqIEFycmF5IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgZHJhdyBjYWxsYmFjayBmdW5jdGlvbnMKCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9EcmF3Q2FsbGJhY2siOiBbXSwKCQoJCS8qKgoJCSAqIEFycmF5IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3Igcm93IGNyZWF0ZWQgZnVuY3Rpb24KCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9Sb3dDcmVhdGVkQ2FsbGJhY2siOiBbXSwKCQoJCS8qKgoJCSAqIENhbGxiYWNrIGZ1bmN0aW9ucyBmb3IganVzdCBiZWZvcmUgdGhlIHRhYmxlIGlzIHJlZHJhd24uIEEgcmV0dXJuIG9mCgkJICogZmFsc2Ugd2lsbCBiZSB1c2VkIHRvIGNhbmNlbCB0aGUgZHJhdy4KCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9QcmVEcmF3Q2FsbGJhY2siOiBbXSwKCQoJCS8qKgoJCSAqIENhbGxiYWNrIGZ1bmN0aW9ucyBmb3Igd2hlbiB0aGUgdGFibGUgaGFzIGJlZW4gaW5pdGlhbGlzZWQuCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IFtdCgkJICovCgkJImFvSW5pdENvbXBsZXRlIjogW10sCgkKCQoJCS8qKgoJCSAqIENhbGxiYWNrcyBmb3IgbW9kaWZ5aW5nIHRoZSBzZXR0aW5ncyB0byBiZSBzdG9yZWQgZm9yIHN0YXRlIHNhdmluZywgcHJpb3IgdG8KCQkgKiBzYXZpbmcgc3RhdGUuCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IFtdCgkJICovCgkJImFvU3RhdGVTYXZlUGFyYW1zIjogW10sCgkKCQkvKioKCQkgKiBDYWxsYmFja3MgZm9yIG1vZGlmeWluZyB0aGUgc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gc3RvcmVkIGZvciBzdGF0ZSBzYXZpbmcKCQkgKiBwcmlvciB0byB1c2luZyB0aGUgc3RvcmVkIHZhbHVlcyB0byByZXN0b3JlIHRoZSBzdGF0ZS4KCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9TdGF0ZUxvYWRQYXJhbXMiOiBbXSwKCQoJCS8qKgoJCSAqIENhbGxiYWNrcyBmb3Igb3BlcmF0aW5nIG9uIHRoZSBzZXR0aW5ncyBvYmplY3Qgb25jZSB0aGUgc2F2ZWQgc3RhdGUgaGFzIGJlZW4KCQkgKiBsb2FkZWQKCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9TdGF0ZUxvYWRlZCI6IFtdLAoJCgkJLyoqCgkJICogQ2FjaGUgdGhlIHRhYmxlIElEIGZvciBxdWljayBhY2Nlc3MKCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IDxpPkVtcHR5IHN0cmluZzwvaT4KCQkgKi8KCQkic1RhYmxlSWQiOiAiIiwKCQoJCS8qKgoJCSAqIFRoZSBUQUJMRSBub2RlIGZvciB0aGUgbWFpbiB0YWJsZQoJCSAqICBAdHlwZSBub2RlCgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkiblRhYmxlIjogbnVsbCwKCQoJCS8qKgoJCSAqIFBlcm1hbmVudCByZWYgdG8gdGhlIHRoZWFkIGVsZW1lbnQKCQkgKiAgQHR5cGUgbm9kZQoJCSAqICBAZGVmYXVsdCBudWxsCgkJICovCgkJIm5USGVhZCI6IG51bGwsCgkKCQkvKioKCQkgKiBQZXJtYW5lbnQgcmVmIHRvIHRoZSB0Zm9vdCBlbGVtZW50IC0gaWYgaXQgZXhpc3RzCgkJICogIEB0eXBlIG5vZGUKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJuVEZvb3QiOiBudWxsLAoJCgkJLyoqCgkJICogUGVybWFuZW50IHJlZiB0byB0aGUgdGJvZHkgZWxlbWVudAoJCSAqICBAdHlwZSBub2RlCgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkiblRCb2R5IjogbnVsbCwKCQoJCS8qKgoJCSAqIENhY2hlIHRoZSB3cmFwcGVyIG5vZGUgKGNvbnRhaW5zIGFsbCBEYXRhVGFibGVzIGNvbnRyb2xsZWQgZWxlbWVudHMpCgkJICogIEB0eXBlIG5vZGUKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJuVGFibGVXcmFwcGVyIjogbnVsbCwKCQoJCS8qKgoJCSAqIEluZGljYXRlIGlmIHdoZW4gdXNpbmcgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyB0aGUgbG9hZGluZyBvZiBkYXRhCgkJICogc2hvdWxkIGJlIGRlZmVycmVkIHVudGlsIHRoZSBzZWNvbmQgZHJhdy4KCQkgKiBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgYnkgdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUuIFRvCgkJICogc2V0IGEgZGVmYXVsdCB1c2Uge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0c30uCgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgZmFsc2UKCQkgKi8KCQkiYkRlZmVyTG9hZGluZyI6IGZhbHNlLAoJCgkJLyoqCgkJICogSW5kaWNhdGUgaWYgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlYWQgaW4KCQkgKiAgQHR5cGUgYm9vbGVhbgoJCSAqICBAZGVmYXVsdCBmYWxzZQoJCSAqLwoJCSJiSW5pdGlhbGlzZWQiOiBmYWxzZSwKCQoJCS8qKgoJCSAqIEluZm9ybWF0aW9uIGFib3V0IG9wZW4gcm93cy4gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5IGhhcyB0aGUgcGFyYW1ldGVycwoJCSAqICduVHInIGFuZCAnblBhcmVudCcKCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9PcGVuUm93cyI6IFtdLAoJCgkJLyoqCgkJICogRGljdGF0ZSB0aGUgcG9zaXRpb25pbmcgb2YgRGF0YVRhYmxlcycgY29udHJvbCBlbGVtZW50cyAtIHNlZQoJCSAqIHtAbGluayBEYXRhVGFibGUubW9kZWwub0luaXQuc0RvbX0uCgkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCSAqIHNldCBhIGRlZmF1bHQgdXNlIHtAbGluayBEYXRhVGFibGUuZGVmYXVsdHN9LgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJzRG9tIjogbnVsbCwKCQoJCS8qKgoJCSAqIFNlYXJjaCBkZWxheSAoaW4gbVMpCgkJICogIEB0eXBlIGludGVnZXIKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJzZWFyY2hEZWxheSI6IG51bGwsCgkKCQkvKioKCQkgKiBXaGljaCB0eXBlIG9mIHBhZ2luYXRpb24gc2hvdWxkIGJlIHVzZWQuCgkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCSAqIHNldCBhIGRlZmF1bHQgdXNlIHtAbGluayBEYXRhVGFibGUuZGVmYXVsdHN9LgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgdHdvX2J1dHRvbgoJCSAqLwoJCSJzUGFnaW5hdGlvblR5cGUiOiAidHdvX2J1dHRvbiIsCgkKCQkvKioKCQkgKiBUaGUgc3RhdGUgZHVyYXRpb24gKGZvciBgc3RhdGVTYXZlYCkgaW4gc2Vjb25kcy4KCQkgKiBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgYnkgdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUuIFRvCgkJICogc2V0IGEgZGVmYXVsdCB1c2Uge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0c30uCgkJICogIEB0eXBlIGludAoJCSAqICBAZGVmYXVsdCAwCgkJICovCgkJImlTdGF0ZUR1cmF0aW9uIjogMCwKCQoJCS8qKgoJCSAqIEFycmF5IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3Igc3RhdGUgc2F2aW5nLiBFYWNoIGFycmF5IGVsZW1lbnQgaXMgYW4KCQkgKiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CgkJICogICA8dWw+CgkJICogICAgIDxsaT5mdW5jdGlvbjpmbiAtIGZ1bmN0aW9uIHRvIGNhbGwuIFRha2VzIHR3byBwYXJhbWV0ZXJzLCBvU2V0dGluZ3MKCQkgKiAgICAgICBhbmQgdGhlIEpTT04gc3RyaW5nIHRvIHNhdmUgdGhhdCBoYXMgYmVlbiB0aHVzIGZhciBjcmVhdGVkLiBSZXR1cm5zCgkJICogICAgICAgYSBKU09OIHN0cmluZyB0byBiZSBpbnNlcnRlZCBpbnRvIGEganNvbiBvYmplY3QKCQkgKiAgICAgICAoaS5lLiAnInBhcmFtIjogWyAwLCAxLCAyXScpPC9saT4KCQkgKiAgICAgPGxpPnN0cmluZzpzTmFtZSAtIG5hbWUgb2YgY2FsbGJhY2s8L2xpPgoJCSAqICAgPC91bD4KCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9TdGF0ZVNhdmUiOiBbXSwKCQoJCS8qKgoJCSAqIEFycmF5IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3Igc3RhdGUgbG9hZGluZy4gRWFjaCBhcnJheSBlbGVtZW50IGlzIGFuCgkJICogb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgoJCSAqICAgPHVsPgoJCSAqICAgICA8bGk+ZnVuY3Rpb246Zm4gLSBmdW5jdGlvbiB0byBjYWxsLiBUYWtlcyB0d28gcGFyYW1ldGVycywgb1NldHRpbmdzCgkJICogICAgICAgYW5kIHRoZSBvYmplY3Qgc3RvcmVkLiBNYXkgcmV0dXJuIGZhbHNlIHRvIGNhbmNlbCBzdGF0ZSBsb2FkaW5nPC9saT4KCQkgKiAgICAgPGxpPnN0cmluZzpzTmFtZSAtIG5hbWUgb2YgY2FsbGJhY2s8L2xpPgoJCSAqICAgPC91bD4KCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYW9TdGF0ZUxvYWQiOiBbXSwKCQoJCS8qKgoJCSAqIFN0YXRlIHRoYXQgd2FzIHNhdmVkLiBVc2VmdWwgZm9yIGJhY2sgcmVmZXJlbmNlCgkJICogIEB0eXBlIG9iamVjdAoJCSAqICBAZGVmYXVsdCBudWxsCgkJICovCgkJIm9TYXZlZFN0YXRlIjogbnVsbCwKCQoJCS8qKgoJCSAqIFN0YXRlIHRoYXQgd2FzIGxvYWRlZC4gVXNlZnVsIGZvciBiYWNrIHJlZmVyZW5jZQoJCSAqICBAdHlwZSBvYmplY3QKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJvTG9hZGVkU3RhdGUiOiBudWxsLAoJCgkJLyoqCgkJICogU291cmNlIHVybCBmb3IgQUpBWCBkYXRhIGZvciB0aGUgdGFibGUuCgkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCSAqIHNldCBhIGRlZmF1bHQgdXNlIHtAbGluayBEYXRhVGFibGUuZGVmYXVsdHN9LgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJzQWpheFNvdXJjZSI6IG51bGwsCgkKCQkvKioKCQkgKiBQcm9wZXJ0eSBmcm9tIGEgZ2l2ZW4gb2JqZWN0IGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgdGFibGUgZGF0YSBmcm9tLiBUaGlzCgkJICogY2FuIGJlIGFuIGVtcHR5IHN0cmluZyAod2hlbiBub3Qgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyksIGluIHdoaWNoIGNhc2UKCQkgKiBpdCBpcyAgYXNzdW1lZCBhbiBhbiBhcnJheSBpcyBnaXZlbiBkaXJlY3RseS4KCQkgKiBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgYnkgdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUuIFRvCgkJICogc2V0IGEgZGVmYXVsdCB1c2Uge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0c30uCgkJICogIEB0eXBlIHN0cmluZwoJCSAqLwoJCSJzQWpheERhdGFQcm9wIjogbnVsbCwKCQoJCS8qKgoJCSAqIFRoZSBsYXN0IGpRdWVyeSBYSFIgb2JqZWN0IHRoYXQgd2FzIHVzZWQgZm9yIHNlcnZlci1zaWRlIGRhdGEgZ2F0aGVyaW5nLgoJCSAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHdvcmtpbmcgd2l0aCB0aGUgWEhSIGluZm9ybWF0aW9uIGluIG9uZSBvZiB0aGUKCQkgKiBjYWxsYmFja3MKCQkgKiAgQHR5cGUgb2JqZWN0CgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkianFYSFIiOiBudWxsLAoJCgkJLyoqCgkJICogSlNPTiByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgaW4gdGhlIGxhc3QgQWpheCByZXF1ZXN0CgkJICogIEB0eXBlIG9iamVjdAoJCSAqICBAZGVmYXVsdCB1bmRlZmluZWQKCQkgKi8KCQkianNvbiI6IHVuZGVmaW5lZCwKCQoJCS8qKgoJCSAqIERhdGEgc3VibWl0dGVkIGFzIHBhcnQgb2YgdGhlIGxhc3QgQWpheCByZXF1ZXN0CgkJICogIEB0eXBlIG9iamVjdAoJCSAqICBAZGVmYXVsdCB1bmRlZmluZWQKCQkgKi8KCQkib0FqYXhEYXRhIjogdW5kZWZpbmVkLAoJCgkJLyoqCgkJICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBzZXJ2ZXItc2lkZSBkYXRhLgoJCSAqIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCBieSB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gVG8KCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKi8KCQkiZm5TZXJ2ZXJEYXRhIjogbnVsbCwKCQoJCS8qKgoJCSAqIEZ1bmN0aW9ucyB3aGljaCBhcmUgY2FsbGVkIHByaW9yIHRvIHNlbmRpbmcgYW4gQWpheCByZXF1ZXN0IHNvIGV4dHJhCgkJICogcGFyYW1ldGVycyBjYW4gZWFzaWx5IGJlIHNlbnQgdG8gdGhlIHNlcnZlcgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqLwoJCSJhb1NlcnZlclBhcmFtcyI6IFtdLAoJCgkJLyoqCgkJICogU2VuZCB0aGUgWEhSIEhUVFAgbWV0aG9kIC0gR0VUIG9yIFBPU1QgKGNvdWxkIGJlIFBVVCBvciBERUxFVEUgaWYKCQkgKiByZXF1aXJlZCkuCgkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCSAqIHNldCBhIGRlZmF1bHQgdXNlIHtAbGluayBEYXRhVGFibGUuZGVmYXVsdHN9LgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKi8KCQkic1NlcnZlck1ldGhvZCI6IG51bGwsCgkKCQkvKioKCQkgKiBGb3JtYXQgbnVtYmVycyBmb3IgZGlzcGxheS4KCQkgKiBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgYnkgdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUuIFRvCgkJICogc2V0IGEgZGVmYXVsdCB1c2Uge0BsaW5rIERhdGFUYWJsZS5kZWZhdWx0c30uCgkJICogIEB0eXBlIGZ1bmN0aW9uCgkJICovCgkJImZuRm9ybWF0TnVtYmVyIjogbnVsbCwKCQoJCS8qKgoJCSAqIExpc3Qgb2Ygb3B0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgdXNlciBzZWxlY3RhYmxlIGxlbmd0aCBtZW51LgoJCSAqIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCBieSB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gVG8KCQkgKiBzZXQgYSBkZWZhdWx0IHVzZSB7QGxpbmsgRGF0YVRhYmxlLmRlZmF1bHRzfS4KCQkgKiAgQHR5cGUgYXJyYXkKCQkgKiAgQGRlZmF1bHQgW10KCQkgKi8KCQkiYUxlbmd0aE1lbnUiOiBudWxsLAoJCgkJLyoqCgkJICogQ291bnRlciBmb3IgdGhlIGRyYXdzIHRoYXQgdGhlIHRhYmxlIGRvZXMuIEFsc28gdXNlZCBhcyBhIHRyYWNrZXIgZm9yCgkJICogc2VydmVyLXNpZGUgcHJvY2Vzc2luZwoJCSAqICBAdHlwZSBpbnQKCQkgKiAgQGRlZmF1bHQgMAoJCSAqLwoJCSJpRHJhdyI6IDAsCgkKCQkvKioKCQkgKiBJbmRpY2F0ZSBpZiBhIHJlZHJhdyBpcyBiZWluZyBkb25lIC0gdXNlZnVsIGZvciBBamF4CgkJICogIEB0eXBlIGJvb2xlYW4KCQkgKiAgQGRlZmF1bHQgZmFsc2UKCQkgKi8KCQkiYkRyYXdpbmciOiBmYWxzZSwKCQoJCS8qKgoJCSAqIERyYXcgaW5kZXggKGlEcmF3KSBvZiB0aGUgbGFzdCBlcnJvciB3aGVuIHBhcnNpbmcgdGhlIHJldHVybmVkIGRhdGEKCQkgKiAgQHR5cGUgaW50CgkJICogIEBkZWZhdWx0IC0xCgkJICovCgkJImlEcmF3RXJyb3IiOiAtMSwKCQoJCS8qKgoJCSAqIFBhZ2luZyBkaXNwbGF5IGxlbmd0aAoJCSAqICBAdHlwZSBpbnQKCQkgKiAgQGRlZmF1bHQgMTAKCQkgKi8KCQkiX2lEaXNwbGF5TGVuZ3RoIjogMTAsCgkKCQkvKioKCQkgKiBQYWdpbmcgc3RhcnQgcG9pbnQgLSBhaURpc3BsYXkgaW5kZXgKCQkgKiAgQHR5cGUgaW50CgkJICogIEBkZWZhdWx0IDAKCQkgKi8KCQkiX2lEaXNwbGF5U3RhcnQiOiAwLAoJCgkJLyoqCgkJICogU2VydmVyLXNpZGUgcHJvY2Vzc2luZyAtIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSByZXN1bHQgc2V0CgkJICogKGkuZS4gYmVmb3JlIGZpbHRlcmluZyksIFVzZSBmblJlY29yZHNUb3RhbCByYXRoZXIgdGhhbgoJCSAqIHRoaXMgcHJvcGVydHkgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgbnVtYmVyIG9mIHJlY29yZHMsIHJlZ2FyZGxlc3Mgb2YKCQkgKiB0aGUgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyBzZXR0aW5nLgoJCSAqICBAdHlwZSBpbnQKCQkgKiAgQGRlZmF1bHQgMAoJCSAqICBAcHJpdmF0ZQoJCSAqLwoJCSJfaVJlY29yZHNUb3RhbCI6IDAsCgkKCQkvKioKCQkgKiBTZXJ2ZXItc2lkZSBwcm9jZXNzaW5nIC0gbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGN1cnJlbnQgZGlzcGxheSBzZXQKCQkgKiAoaS5lLiBhZnRlciBmaWx0ZXJpbmcpLiBVc2UgZm5SZWNvcmRzRGlzcGxheSByYXRoZXIgdGhhbgoJCSAqIHRoaXMgcHJvcGVydHkgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgbnVtYmVyIG9mIHJlY29yZHMsIHJlZ2FyZGxlc3Mgb2YKCQkgKiB0aGUgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyBzZXR0aW5nLgoJCSAqICBAdHlwZSBib29sZWFuCgkJICogIEBkZWZhdWx0IDAKCQkgKiAgQHByaXZhdGUKCQkgKi8KCQkiX2lSZWNvcmRzRGlzcGxheSI6IDAsCgkKCQkvKioKCQkgKiBUaGUgY2xhc3NlcyB0byB1c2UgZm9yIHRoZSB0YWJsZQoJCSAqICBAdHlwZSBvYmplY3QKCQkgKiAgQGRlZmF1bHQge30KCQkgKi8KCQkib0NsYXNzZXMiOiB7fSwKCQoJCS8qKgoJCSAqIEZsYWcgYXR0YWNoZWQgdG8gdGhlIHNldHRpbmdzIG9iamVjdCBzbyB5b3UgY2FuIGNoZWNrIGluIHRoZSBkcmF3CgkJICogY2FsbGJhY2sgaWYgZmlsdGVyaW5nIGhhcyBiZWVuIGRvbmUgaW4gdGhlIGRyYXcuIERlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mCgkJICogZXZlbnRzLgoJCSAqICBAdHlwZSBib29sZWFuCgkJICogIEBkZWZhdWx0IGZhbHNlCgkJICogIEBkZXByZWNhdGVkCgkJICovCgkJImJGaWx0ZXJlZCI6IGZhbHNlLAoJCgkJLyoqCgkJICogRmxhZyBhdHRhY2hlZCB0byB0aGUgc2V0dGluZ3Mgb2JqZWN0IHNvIHlvdSBjYW4gY2hlY2sgaW4gdGhlIGRyYXcKCQkgKiBjYWxsYmFjayBpZiBzb3J0aW5nIGhhcyBiZWVuIGRvbmUgaW4gdGhlIGRyYXcuIERlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mCgkJICogZXZlbnRzLgoJCSAqICBAdHlwZSBib29sZWFuCgkJICogIEBkZWZhdWx0IGZhbHNlCgkJICogIEBkZXByZWNhdGVkCgkJICovCgkJImJTb3J0ZWQiOiBmYWxzZSwKCQoJCS8qKgoJCSAqIEluZGljYXRlIHRoYXQgaWYgbXVsdGlwbGUgcm93cyBhcmUgaW4gdGhlIGhlYWRlciBhbmQgdGhlcmUgaXMgbW9yZSB0aGFuCgkJICogb25lIHVuaXF1ZSBjZWxsIHBlciBjb2x1bW4sIGlmIHRoZSB0b3Agb25lICh0cnVlKSBvciBib3R0b20gb25lIChmYWxzZSkKCQkgKiBzaG91bGQgYmUgdXNlZCBmb3Igc29ydGluZyAvIHRpdGxlIGJ5IERhdGFUYWJsZXMuCgkJICogTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGJ5IHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLiBUbwoJCSAqIHNldCBhIGRlZmF1bHQgdXNlIHtAbGluayBEYXRhVGFibGUuZGVmYXVsdHN9LgoJCSAqICBAdHlwZSBib29sZWFuCgkJICovCgkJImJTb3J0Q2VsbHNUb3AiOiBudWxsLAoJCgkJLyoqCgkJICogSW5pdGlhbGlzYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIHRhYmxlCgkJICogIEB0eXBlIG9iamVjdAoJCSAqICBAZGVmYXVsdCBudWxsCgkJICovCgkJIm9Jbml0IjogbnVsbCwKCQoJCS8qKgoJCSAqIERlc3Ryb3kgY2FsbGJhY2sgZnVuY3Rpb25zIC0gZm9yIHBsdWctaW5zIHRvIGF0dGFjaCB0aGVtc2VsdmVzIHRvIHRoZQoJCSAqIGRlc3Ryb3kgc28gdGhleSBjYW4gY2xlYW4gdXAgbWFya3VwIGFuZCBldmVudHMuCgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IFtdCgkJICovCgkJImFvRGVzdHJveUNhbGxiYWNrIjogW10sCgkKCQoJCS8qKgoJCSAqIEdldCB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGN1cnJlbnQgcmVjb3JkIHNldCwgYmVmb3JlIGZpbHRlcmluZwoJCSAqICBAdHlwZSBmdW5jdGlvbgoJCSAqLwoJCSJmblJlY29yZHNUb3RhbCI6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gX2ZuRGF0YVNvdXJjZSggdGhpcyApID09ICdzc3AnID8KCQkJCXRoaXMuX2lSZWNvcmRzVG90YWwgKiAxIDoKCQkJCXRoaXMuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aDsKCQl9LAoJCgkJLyoqCgkJICogR2V0IHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgY3VycmVudCByZWNvcmQgc2V0LCBhZnRlciBmaWx0ZXJpbmcKCQkgKiAgQHR5cGUgZnVuY3Rpb24KCQkgKi8KCQkiZm5SZWNvcmRzRGlzcGxheSI6IGZ1bmN0aW9uICgpCgkJewoJCQlyZXR1cm4gX2ZuRGF0YVNvdXJjZSggdGhpcyApID09ICdzc3AnID8KCQkJCXRoaXMuX2lSZWNvcmRzRGlzcGxheSAqIDEgOgoJCQkJdGhpcy5haURpc3BsYXkubGVuZ3RoOwoJCX0sCgkKCQkvKioKCQkgKiBHZXQgdGhlIGRpc3BsYXkgZW5kIHBvaW50IC0gYWlEaXNwbGF5IGluZGV4CgkJICogIEB0eXBlIGZ1bmN0aW9uCgkJICovCgkJImZuRGlzcGxheUVuZCI6IGZ1bmN0aW9uICgpCgkJewoJCQl2YXIKCQkJCWxlbiAgICAgID0gdGhpcy5faURpc3BsYXlMZW5ndGgsCgkJCQlzdGFydCAgICA9IHRoaXMuX2lEaXNwbGF5U3RhcnQsCgkJCQljYWxjICAgICA9IHN0YXJ0ICsgbGVuLAoJCQkJcmVjb3JkcyAgPSB0aGlzLmFpRGlzcGxheS5sZW5ndGgsCgkJCQlmZWF0dXJlcyA9IHRoaXMub0ZlYXR1cmVzLAoJCQkJcGFnaW5hdGUgPSBmZWF0dXJlcy5iUGFnaW5hdGU7CgkKCQkJaWYgKCBmZWF0dXJlcy5iU2VydmVyU2lkZSApIHsKCQkJCXJldHVybiBwYWdpbmF0ZSA9PT0gZmFsc2UgfHwgbGVuID09PSAtMSA/CgkJCQkJc3RhcnQgKyByZWNvcmRzIDoKCQkJCQlNYXRoLm1pbiggc3RhcnQrbGVuLCB0aGlzLl9pUmVjb3Jkc0Rpc3BsYXkgKTsKCQkJfQoJCQllbHNlIHsKCQkJCXJldHVybiAhIHBhZ2luYXRlIHx8IGNhbGM+cmVjb3JkcyB8fCBsZW49PT0tMSA/CgkJCQkJcmVjb3JkcyA6CgkJCQkJY2FsYzsKCQkJfQoJCX0sCgkKCQkvKioKCQkgKiBUaGUgRGF0YVRhYmxlcyBvYmplY3QgZm9yIHRoaXMgdGFibGUKCQkgKiAgQHR5cGUgb2JqZWN0CgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkib0luc3RhbmNlIjogbnVsbCwKCQoJCS8qKgoJCSAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoZSBEYXRhVGFibGVzIG9iamVjdC4gSWYgdGhlcmUKCQkgKiBpcyBhbiBJRCBvbiB0aGUgdGFibGUgbm9kZSwgdGhlbiBpdCB0YWtlcyB0aGF0IHZhbHVlLCBvdGhlcndpc2UgYW4KCQkgKiBpbmNyZW1lbnRpbmcgaW50ZXJuYWwgY291bnRlciBpcyB1c2VkLgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlZmF1bHQgbnVsbAoJCSAqLwoJCSJzSW5zdGFuY2UiOiBudWxsLAoJCgkJLyoqCgkJICogdGFiaW5kZXggYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgYWRkZWQgdG8gRGF0YVRhYmxlcyBjb250cm9sIGVsZW1lbnRzLCBhbGxvd2luZwoJCSAqIGtleWJvYXJkIG5hdmlnYXRpb24gb2YgdGhlIHRhYmxlIGFuZCBpdHMgY29udHJvbHMuCgkJICovCgkJImlUYWJJbmRleCI6IDAsCgkKCQkvKioKCQkgKiBESVYgY29udGFpbmVyIGZvciB0aGUgZm9vdGVyIHNjcm9sbGluZyB0YWJsZSBpZiBzY3JvbGxpbmcKCQkgKi8KCQkiblNjcm9sbEhlYWQiOiBudWxsLAoJCgkJLyoqCgkJICogRElWIGNvbnRhaW5lciBmb3IgdGhlIGZvb3RlciBzY3JvbGxpbmcgdGFibGUgaWYgc2Nyb2xsaW5nCgkJICovCgkJIm5TY3JvbGxGb290IjogbnVsbCwKCQoJCS8qKgoJCSAqIExhc3QgYXBwbGllZCBzb3J0CgkJICogIEB0eXBlIGFycmF5CgkJICogIEBkZWZhdWx0IFtdCgkJICovCgkJImFMYXN0U29ydCI6IFtdLAoJCgkJLyoqCgkJICogU3RvcmVkIHBsdWctaW4gaW5zdGFuY2VzCgkJICogIEB0eXBlIG9iamVjdAoJCSAqICBAZGVmYXVsdCB7fQoJCSAqLwoJCSJvUGx1Z2lucyI6IHt9LAoJCgkJLyoqCgkJICogRnVuY3Rpb24gdXNlZCB0byBnZXQgYSByb3cncyBpZCBmcm9tIHRoZSByb3cncyBkYXRhCgkJICogIEB0eXBlIGZ1bmN0aW9uCgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkicm93SWRGbiI6IG51bGwsCgkKCQkvKioKCQkgKiBEYXRhIGxvY2F0aW9uIHdoZXJlIHRvIHN0b3JlIGEgcm93J3MgaWQKCQkgKiAgQHR5cGUgc3RyaW5nCgkJICogIEBkZWZhdWx0IG51bGwKCQkgKi8KCQkicm93SWQiOiBudWxsCgl9OwoJCgkvKioKCSAqIEV4dGVuc2lvbiBvYmplY3QgZm9yIERhdGFUYWJsZXMgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgYWxsIGV4dGVuc2lvbgoJICogb3B0aW9ucy4KCSAqCgkgKiBOb3RlIHRoYXQgdGhlIGBEYXRhVGFibGUuZXh0YCBvYmplY3QgaXMgYXZhaWxhYmxlIHRocm91Z2gKCSAqIGBqUXVlcnkuZm4uZGF0YVRhYmxlLmV4dGAgd2hlcmUgaXQgbWF5IGJlIGFjY2Vzc2VkIGFuZCBtYW5pcHVsYXRlZC4gSXQgaXMKCSAqIGFsc28gYWxpYXNlZCB0byBgalF1ZXJ5LmZuLmRhdGFUYWJsZUV4dGAgZm9yIGhpc3RvcmljIHJlYXNvbnMuCgkgKiAgQG5hbWVzcGFjZQoJICogIEBleHRlbmRzIERhdGFUYWJsZS5tb2RlbHMuZXh0CgkgKi8KCQoJCgkvKioKCSAqIERhdGFUYWJsZXMgZXh0ZW5zaW9ucwoJICogCgkgKiBUaGlzIG5hbWVzcGFjZSBhY3RzIGFzIGEgY29sbGVjdGlvbiBhcmVhIGZvciBwbHVnLWlucyB0aGF0IGNhbiBiZSB1c2VkIHRvCgkgKiBleHRlbmQgRGF0YVRhYmxlcyBjYXBhYmlsaXRpZXMuIEluZGVlZCBtYW55IG9mIHRoZSBidWlsZCBpbiBtZXRob2RzCgkgKiB1c2UgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gY2FwYWJpbGl0aWVzIChzb3J0aW5nIG1ldGhvZHMgZm9yCgkgKiBleGFtcGxlKS4KCSAqCgkgKiBOb3RlIHRoYXQgdGhpcyBuYW1lc3BhY2UgaXMgYWxpYXNlZCB0byBgalF1ZXJ5LmZuLmRhdGFUYWJsZUV4dGAgZm9yIGxlZ2FjeQoJICogcmVhc29ucwoJICoKCSAqICBAbmFtZXNwYWNlCgkgKi8KCURhdGFUYWJsZS5leHQgPSBfZXh0ID0gewoJCS8qKgoJCSAqIEJ1dHRvbnMuIEZvciB1c2Ugd2l0aCB0aGUgQnV0dG9ucyBleHRlbnNpb24gZm9yIERhdGFUYWJsZXMuIFRoaXMgaXMKCQkgKiBkZWZpbmVkIGhlcmUgc28gb3RoZXIgZXh0ZW5zaW9ucyBjYW4gZGVmaW5lIGJ1dHRvbnMgcmVnYXJkbGVzcyBvZiBsb2FkCgkJICogb3JkZXIuIEl0IGlzIF9ub3RfIHVzZWQgYnkgRGF0YVRhYmxlcyBjb3JlLgoJCSAqCgkJICogIEB0eXBlIG9iamVjdAoJCSAqICBAZGVmYXVsdCB7fQoJCSAqLwoJCWJ1dHRvbnM6IHt9LAoJCgkKCQkvKioKCQkgKiBFbGVtZW50IGNsYXNzIG5hbWVzCgkJICoKCQkgKiAgQHR5cGUgb2JqZWN0CgkJICogIEBkZWZhdWx0IHt9CgkJICovCgkJY2xhc3Nlczoge30sCgkKCQoJCS8qKgoJCSAqIERhdGFUYWJsZXMgYnVpbGQgdHlwZSAoZXhwYW5kZWQgYnkgdGhlIGRvd25sb2FkIGJ1aWxkZXIpCgkJICoKCQkgKiAgQHR5cGUgc3RyaW5nCgkJICovCgkJYnVpbGRlcjogIi1zb3VyY2UtIiwKCQoJCgkJLyoqCgkJICogRXJyb3IgcmVwb3J0aW5nLgoJCSAqIAoJCSAqIEhvdyBzaG91bGQgRGF0YVRhYmxlcyByZXBvcnQgYW4gZXJyb3IuIENhbiB0YWtlIHRoZSB2YWx1ZSAnYWxlcnQnLAoJCSAqICd0aHJvdycsICdub25lJyBvciBhIGZ1bmN0aW9uLgoJCSAqCgkJICogIEB0eXBlIHN0cmluZ3xmdW5jdGlvbgoJCSAqICBAZGVmYXVsdCBhbGVydAoJCSAqLwoJCWVyck1vZGU6ICJhbGVydCIsCgkKCQoJCS8qKgoJCSAqIEZlYXR1cmUgcGx1Zy1pbnMuCgkJICogCgkJICogVGhpcyBpcyBhbiBhcnJheSBvZiBvYmplY3RzIHdoaWNoIGRlc2NyaWJlIHRoZSBmZWF0dXJlIHBsdWctaW5zIHRoYXQgYXJlCgkJICogYXZhaWxhYmxlIHRvIERhdGFUYWJsZXMuIFRoZXNlIGZlYXR1cmUgcGx1Zy1pbnMgYXJlIHRoZW4gYXZhaWxhYmxlIGZvcgoJCSAqIHVzZSB0aHJvdWdoIHRoZSBgZG9tYCBpbml0aWFsaXNhdGlvbiBvcHRpb24uCgkJICogCgkJICogRWFjaCBmZWF0dXJlIHBsdWctaW4gaXMgZGVzY3JpYmVkIGJ5IGFuIG9iamVjdCB3aGljaCBtdXN0IGhhdmUgdGhlCgkJICogZm9sbG93aW5nIHByb3BlcnRpZXM6CgkJICogCgkJICogKiBgZm5Jbml0YCAtIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBpbml0aWFsaXNlIHRoZSBwbHVnLWluLAoJCSAqICogYGNGZWF0dXJlYCAtIGEgY2hhcmFjdGVyIHNvIHRoZSBmZWF0dXJlIGNhbiBiZSBlbmFibGVkIGJ5IHRoZSBgZG9tYAoJCSAqICAgaW5zdGlsbGF0aW9uIG9wdGlvbi4gVGhpcyBpcyBjYXNlIHNlbnNpdGl2ZS4KCQkgKgoJCSAqIFRoZSBgZm5Jbml0YCBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBpbnB1dCBwYXJhbWV0ZXJzOgoJCSAqCgkJICogMS4gYHtvYmplY3R9YCBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdDogc2VlCgkJICogICAge0BsaW5rIERhdGFUYWJsZS5tb2RlbHMub1NldHRpbmdzfQoJCSAqCgkJICogQW5kIHRoZSBmb2xsb3dpbmcgcmV0dXJuIGlzIGV4cGVjdGVkOgoJCSAqIAoJCSAqICoge25vZGV8bnVsbH0gVGhlIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgeW91ciBmZWF0dXJlLiBOb3RlIHRoYXQgdGhlCgkJICogICByZXR1cm4gbWF5IGFsc28gYmUgdm9pZCBpZiB5b3VyIHBsdWctaW4gZG9lcyBub3QgcmVxdWlyZSB0byBpbmplY3QgYW55CgkJICogICBET00gZWxlbWVudHMgaW50byBEYXRhVGFibGVzIGNvbnRyb2wgKGBkb21gKSAtIGZvciBleGFtcGxlIHRoaXMgbWlnaHQKCQkgKiAgIGJlIHVzZWZ1bCB3aGVuIGRldmVsb3BpbmcgYSBwbHVnLWluIHdoaWNoIGFsbG93cyB0YWJsZSBjb250cm9sIHZpYQoJCSAqICAga2V5Ym9hcmQgZW50cnkKCQkgKgoJCSAqICBAdHlwZSBhcnJheQoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgJC5mbi5kYXRhVGFibGUuZXh0LmZlYXR1cmVzLnB1c2goIHsKCQkgKiAgICAgICJmbkluaXQiOiBmdW5jdGlvbiggb1NldHRpbmdzICkgewoJCSAqICAgICAgICByZXR1cm4gbmV3IFRhYmxlVG9vbHMoIHsgIm9EVFNldHRpbmdzIjogb1NldHRpbmdzIH0gKTsKCQkgKiAgICAgIH0sCgkJICogICAgICAiY0ZlYXR1cmUiOiAiVCIKCQkgKiAgICB9ICk7CgkJICovCgkJZmVhdHVyZTogW10sCgkKCQoJCS8qKgoJCSAqIFJvdyBzZWFyY2hpbmcuCgkJICogCgkJICogVGhpcyBtZXRob2Qgb2Ygc2VhcmNoaW5nIGlzIGNvbXBsaW1lbnRhcnkgdG8gdGhlIGRlZmF1bHQgdHlwZSBiYXNlZAoJCSAqIHNlYXJjaGluZywgYW5kIGEgbG90IG1vcmUgY29tcHJlaGVuc2l2ZSBhcyBpdCBhbGxvd3MgeW91IGNvbXBsZXRlIGNvbnRyb2wKCQkgKiBvdmVyIHRoZSBzZWFyY2hpbmcgbG9naWMuIEVhY2ggZWxlbWVudCBpbiB0aGlzIGFycmF5IGlzIGEgZnVuY3Rpb24KCQkgKiAocGFyYW1ldGVycyBkZXNjcmliZWQgYmVsb3cpIHRoYXQgaXMgY2FsbGVkIGZvciBldmVyeSByb3cgaW4gdGhlIHRhYmxlLAoJCSAqIGFuZCB5b3VyIGxvZ2ljIGRlY2lkZXMgaWYgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2hpbmcgZGF0YSBzZXQKCQkgKiBvciBub3QuCgkJICoKCQkgKiBTZWFyY2hpbmcgZnVuY3Rpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBpbnB1dCBwYXJhbWV0ZXJzOgoJCSAqCgkJICogMS4gYHtvYmplY3R9YCBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdDogc2VlCgkJICogICAge0BsaW5rIERhdGFUYWJsZS5tb2RlbHMub1NldHRpbmdzfQoJCSAqIDIuIGB7YXJyYXl8b2JqZWN0fWAgRGF0YSBmb3IgdGhlIHJvdyB0byBiZSBwcm9jZXNzZWQgKHNhbWUgYXMgdGhlCgkJICogICAgb3JpZ2luYWwgZm9ybWF0IHRoYXQgd2FzIHBhc3NlZCBpbiBhcyB0aGUgZGF0YSBzb3VyY2UsIG9yIGFuIGFycmF5CgkJICogICAgZnJvbSBhIERPTSBkYXRhIHNvdXJjZQoJCSAqIDMuIGB7aW50fWAgUm93IGluZGV4ICh7QGxpbmsgRGF0YVRhYmxlLm1vZGVscy5vU2V0dGluZ3MuYW9EYXRhfSksIHdoaWNoCgkJICogICAgY2FuIGJlIHVzZWZ1bCB0byByZXRyaWV2ZSB0aGUgYFRSYCBlbGVtZW50IGlmIHlvdSBuZWVkIERPTSBpbnRlcmFjdGlvbi4KCQkgKgoJCSAqIEFuZCB0aGUgZm9sbG93aW5nIHJldHVybiBpcyBleHBlY3RlZDoKCQkgKgoJCSAqICoge2Jvb2xlYW59IEluY2x1ZGUgdGhlIHJvdyBpbiB0aGUgc2VhcmNoZWQgcmVzdWx0IHNldCAodHJ1ZSkgb3Igbm90CgkJICogICAoZmFsc2UpCgkJICoKCQkgKiBOb3RlIHRoYXQgYXMgd2l0aCB0aGUgbWFpbiBzZWFyY2ggYWJpbGl0eSBpbiBEYXRhVGFibGVzLCB0ZWNobmljYWxseSB0aGlzCgkJICogaXMgImZpbHRlcmluZyIsIHNpbmNlIGl0IGlzIHN1YnRyYWN0aXZlLiBIb3dldmVyLCBmb3IgY29uc2lzdGVuY3kgaW4KCQkgKiBuYW1pbmcgd2UgY2FsbCBpdCBzZWFyY2hpbmcgaGVyZS4KCQkgKgoJCSAqICBAdHlwZSBhcnJheQoJCSAqICBAZGVmYXVsdCBbXQoJCSAqCgkJICogIEBleGFtcGxlCgkJICogICAgLy8gVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGN1c3RvbSBzZWFyY2ggYmVpbmcgYXBwbGllZCB0byB0aGUKCQkgKiAgICAvLyBmb3VydGggY29sdW1uIChpLmUuIHRoZSBkYXRhWzNdIGluZGV4KSBiYXNlZCBvbiB0d28gaW5wdXQgdmFsdWVzCgkJICogICAgLy8gZnJvbSB0aGUgZW5kLXVzZXIsIG1hdGNoaW5nIHRoZSBkYXRhIGluIGEgY2VydGFpbiByYW5nZS4KCQkgKiAgICAkLmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLnB1c2goCgkJICogICAgICBmdW5jdGlvbiggc2V0dGluZ3MsIGRhdGEsIGRhdGFJbmRleCApIHsKCQkgKiAgICAgICAgdmFyIG1pbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtaW4nKS52YWx1ZSAqIDE7CgkJICogICAgICAgIHZhciBtYXggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWF4JykudmFsdWUgKiAxOwoJCSAqICAgICAgICB2YXIgdmVyc2lvbiA9IGRhdGFbM10gPT0gIi0iID8gMCA6IGRhdGFbM10qMTsKCQkgKgoJCSAqICAgICAgICBpZiAoIG1pbiA9PSAiIiAmJiBtYXggPT0gIiIgKSB7CgkJICogICAgICAgICAgcmV0dXJuIHRydWU7CgkJICogICAgICAgIH0KCQkgKiAgICAgICAgZWxzZSBpZiAoIG1pbiA9PSAiIiAmJiB2ZXJzaW9uIDwgbWF4ICkgewoJCSAqICAgICAgICAgIHJldHVybiB0cnVlOwoJCSAqICAgICAgICB9CgkJICogICAgICAgIGVsc2UgaWYgKCBtaW4gPCB2ZXJzaW9uICYmICIiID09IG1heCApIHsKCQkgKiAgICAgICAgICByZXR1cm4gdHJ1ZTsKCQkgKiAgICAgICAgfQoJCSAqICAgICAgICBlbHNlIGlmICggbWluIDwgdmVyc2lvbiAmJiB2ZXJzaW9uIDwgbWF4ICkgewoJCSAqICAgICAgICAgIHJldHVybiB0cnVlOwoJCSAqICAgICAgICB9CgkJICogICAgICAgIHJldHVybiBmYWxzZTsKCQkgKiAgICAgIH0KCQkgKiAgICApOwoJCSAqLwoJCXNlYXJjaDogW10sCgkKCQoJCS8qKgoJCSAqIFNlbGVjdG9yIGV4dGVuc2lvbnMKCQkgKgoJCSAqIFRoZSBgc2VsZWN0b3JgIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBleHRlbmQgdGhlIG9wdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUKCQkgKiBzZWxlY3RvciBtb2RpZmllciBvcHRpb25zIChgc2VsZWN0b3ItbW9kaWZpZXJgIG9iamVjdCBkYXRhIHR5cGUpIHRoYXQKCQkgKiBlYWNoIG9mIHRoZSB0aHJlZSBidWlsdCBpbiBzZWxlY3RvciB0eXBlcyBvZmZlciAocm93LCBjb2x1bW4gYW5kIGNlbGwgKwoJCSAqIHRoZWlyIHBsdXJhbCBjb3VudGVycGFydHMpLiBGb3IgZXhhbXBsZSB0aGUgU2VsZWN0IGV4dGVuc2lvbiB1c2VzIHRoaXMKCQkgKiBtZWNoYW5pc20gdG8gcHJvdmlkZSBhbiBvcHRpb24gdG8gc2VsZWN0IG9ubHkgcm93cywgY29sdW1ucyBhbmQgY2VsbHMKCQkgKiB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgYXMgc2VsZWN0ZWQgYnkgdGhlIGVuZCB1c2VyIChge3NlbGVjdGVkOiB0cnVlfWApLAoJCSAqIHdoaWNoIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGV4aXN0aW5nIGJ1aWx0IGluIHNlbGVjdG9yCgkJICogb3B0aW9ucy4KCQkgKgoJCSAqIEVhY2ggcHJvcGVydHkgaXMgYW4gYXJyYXkgdG8gd2hpY2ggZnVuY3Rpb25zIGNhbiBiZSBwdXNoZWQuIFRoZSBmdW5jdGlvbnMKCQkgKiB0YWtlIHRocmVlIGF0dHJpYnV0ZXM6CgkJICoKCQkgKiAqIFNldHRpbmdzIG9iamVjdCBmb3IgdGhlIGhvc3QgdGFibGUKCQkgKiAqIE9wdGlvbnMgb2JqZWN0IChgc2VsZWN0b3ItbW9kaWZpZXJgIG9iamVjdCB0eXBlKQoJCSAqICogQXJyYXkgb2Ygc2VsZWN0ZWQgaXRlbSBpbmRleGVzCgkJICoKCQkgKiBUaGUgcmV0dXJuIGlzIGFuIGFycmF5IG9mIHRoZSByZXN1bHRpbmcgaXRlbSBpbmRleGVzIGFmdGVyIHRoZSBjdXN0b20KCQkgKiBzZWxlY3RvciBoYXMgYmVlbiBhcHBsaWVkLgoJCSAqCgkJICogIEB0eXBlIG9iamVjdAoJCSAqLwoJCXNlbGVjdG9yOiB7CgkJCWNlbGw6IFtdLAoJCQljb2x1bW46IFtdLAoJCQlyb3c6IFtdCgkJfSwKCQoJCgkJLyoqCgkJICogSW50ZXJuYWwgZnVuY3Rpb25zLCBleHBvc2VkIGZvciB1c2VkIGluIHBsdWctaW5zLgoJCSAqIAoJCSAqIFBsZWFzZSBub3RlIHRoYXQgeW91IHNob3VsZCBub3QgbmVlZCB0byB1c2UgdGhlIGludGVybmFsIG1ldGhvZHMgZm9yCgkJICogYW55dGhpbmcgb3RoZXIgdGhhbiBhIHBsdWctaW4gKGFuZCBldmVuIHRoZW4sIHRyeSB0byBhdm9pZCBpZiBwb3NzaWJsZSkuCgkJICogVGhlIGludGVybmFsIGZ1bmN0aW9uIG1heSBjaGFuZ2UgYmV0d2VlbiByZWxlYXNlcy4KCQkgKgoJCSAqICBAdHlwZSBvYmplY3QKCQkgKiAgQGRlZmF1bHQge30KCQkgKi8KCQlpbnRlcm5hbDoge30sCgkKCQoJCS8qKgoJCSAqIExlZ2FjeSBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEVuYWJsZSBhbmQgZGlzYWJsZSBsZWdhY3kgb3B0aW9ucyB0aGF0CgkJICogYXJlIGF2YWlsYWJsZSBpbiBEYXRhVGFibGVzLgoJCSAqCgkJICogIEB0eXBlIG9iamVjdAoJCSAqLwoJCWxlZ2FjeTogewoJCQkvKioKCQkJICogRW5hYmxlIC8gZGlzYWJsZSBEYXRhVGFibGVzIDEuOSBjb21wYXRpYmxlIHNlcnZlci1zaWRlIHByb2Nlc3NpbmcKCQkJICogcmVxdWVzdHMKCQkJICoKCQkJICogIEB0eXBlIGJvb2xlYW4KCQkJICogIEBkZWZhdWx0IG51bGwKCQkJICovCgkJCWFqYXg6IG51bGwKCQl9LAoJCgkKCQkvKioKCQkgKiBQYWdpbmF0aW9uIHBsdWctaW4gbWV0aG9kcy4KCQkgKiAKCQkgKiBFYWNoIGVudHJ5IGluIHRoaXMgb2JqZWN0IGlzIGEgZnVuY3Rpb24gYW5kIGRlZmluZXMgd2hpY2ggYnV0dG9ucyBzaG91bGQKCQkgKiBiZSBzaG93biBieSB0aGUgcGFnaW5hdGlvbiByZW5kZXJpbmcgbWV0aG9kIHRoYXQgaXMgdXNlZCBmb3IgdGhlIHRhYmxlOgoJCSAqIHtAbGluayBEYXRhVGFibGUuZXh0LnJlbmRlcmVyLnBhZ2VCdXR0b259LiBUaGUgcmVuZGVyZXIgYWRkcmVzc2VzIGhvdyB0aGUKCQkgKiBidXR0b25zIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGRvY3VtZW50LCB3aGlsZSB0aGUgZnVuY3Rpb25zIGhlcmUgdGVsbCBpdAoJCSAqIHdoYXQgYnV0dG9ucyB0byBkaXNwbGF5LiBUaGlzIGlzIGRvbmUgYnkgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGJ1dHRvbgoJCSAqIGRlc2NyaXB0aW9ucyAod2hhdCBlYWNoIGJ1dHRvbiB3aWxsIGRvKS4KCQkgKgoJCSAqIFBhZ2luYXRpb24gdHlwZXMgKHRoZSBmb3VyIGJ1aWx0IGluIG9wdGlvbnMgYW5kIGFueSBhZGRpdGlvbmFsIHBsdWctaW4KCQkgKiBvcHRpb25zIGRlZmluZWQgaGVyZSkgY2FuIGJlIHVzZWQgdGhyb3VnaCB0aGUgYHBhZ2luYXRpb25UeXBlYAoJCSAqIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlci4KCQkgKgoJCSAqIFRoZSBmdW5jdGlvbnMgZGVmaW5lZCB0YWtlIHR3byBwYXJhbWV0ZXJzOgoJCSAqCgkJICogMS4gYHtpbnR9IHBhZ2VgIFRoZSBjdXJyZW50IHBhZ2UgaW5kZXgKCQkgKiAyLiBge2ludH0gcGFnZXNgIFRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIHRhYmxlCgkJICoKCQkgKiBFYWNoIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbiBhcnJheSB3aGVyZSBlYWNoIGVsZW1lbnQgb2YgdGhlCgkJICogYXJyYXkgY2FuIGJlIG9uZSBvZjoKCQkgKgoJCSAqICogYGZpcnN0YCAtIEp1bXAgdG8gZmlyc3QgcGFnZSB3aGVuIGFjdGl2YXRlZAoJCSAqICogYGxhc3RgIC0gSnVtcCB0byBsYXN0IHBhZ2Ugd2hlbiBhY3RpdmF0ZWQKCQkgKiAqIGBwcmV2aW91c2AgLSBTaG93IHByZXZpb3VzIHBhZ2Ugd2hlbiBhY3RpdmF0ZWQKCQkgKiAqIGBuZXh0YCAtIFNob3cgbmV4dCBwYWdlIHdoZW4gYWN0aXZhdGVkCgkJICogKiBge2ludH1gIC0gU2hvdyBwYWdlIG9mIHRoZSBpbmRleCBnaXZlbgoJCSAqICogYHthcnJheX1gIC0gQSBuZXN0ZWQgYXJyYXkgY29udGFpbmluZyB0aGUgYWJvdmUgZWxlbWVudHMgdG8gYWRkIGEKCQkgKiAgIGNvbnRhaW5pbmcgJ0RJVicgZWxlbWVudCAobWlnaHQgYmUgdXNlZnVsIGZvciBzdHlsaW5nKS4KCQkgKgoJCSAqIE5vdGUgdGhhdCBEYXRhVGFibGVzIHYxLjktIHVzZWQgdGhpcyBvYmplY3Qgc2xpZ2h0bHkgZGlmZmVyZW50bHkgd2hlcmVieQoJCSAqIGFuIG9iamVjdCB3aXRoIHR3byBmdW5jdGlvbnMgd291bGQgYmUgZGVmaW5lZCBmb3IgZWFjaCBwbHVnLWluLiBUaGF0CgkJICogYWJpbGl0eSBpcyBzdGlsbCBzdXBwb3J0ZWQgYnkgRGF0YVRhYmxlcyAxLjEwKyB0byBwcm92aWRlIGJhY2t3YXJkcwoJCSAqIGNvbXBhdGliaWxpdHksIGJ1dCB0aGlzIG9wdGlvbiBvZiB1c2UgaXMgbm93IGRlY3JlbWVudGVkIGFuZCBubyBsb25nZXIKCQkgKiBkb2N1bWVudGVkIGluIERhdGFUYWJsZXMgMS4xMCsuCgkJICoKCQkgKiAgQHR5cGUgb2JqZWN0CgkJICogIEBkZWZhdWx0IHt9CgkJICoKCQkgKiAgQGV4YW1wbGUKCQkgKiAgICAvLyBTaG93IHByZXZpb3VzLCBuZXh0IGFuZCBjdXJyZW50IHBhZ2UgYnV0dG9ucyBvbmx5CgkJICogICAgJC5mbi5kYXRhVGFibGVFeHQub1BhZ2luYXRpb24uY3VycmVudCA9IGZ1bmN0aW9uICggcGFnZSwgcGFnZXMgKSB7CgkJICogICAgICByZXR1cm4gWyAncHJldmlvdXMnLCBwYWdlLCAnbmV4dCcgXTsKCQkgKiAgICB9OwoJCSAqLwoJCXBhZ2VyOiB7fSwKCQoJCgkJcmVuZGVyZXI6IHsKCQkJcGFnZUJ1dHRvbjoge30sCgkJCWhlYWRlcjoge30KCQl9LAoJCgkKCQkvKioKCQkgKiBPcmRlcmluZyBwbHVnLWlucyAtIGN1c3RvbSBkYXRhIHNvdXJjZQoJCSAqIAoJCSAqIFRoZSBleHRlbnNpb24gb3B0aW9ucyBmb3Igb3JkZXJpbmcgb2YgZGF0YSBhdmFpbGFibGUgaGVyZSBpcyBjb21wbGltZW50YXJ5CgkJICogdG8gdGhlIGRlZmF1bHQgdHlwZSBiYXNlZCBvcmRlcmluZyB0aGF0IERhdGFUYWJsZXMgdHlwaWNhbGx5IHVzZXMuIEl0CgkJICogYWxsb3dzIG11Y2ggZ3JlYXRlciBjb250cm9sIG92ZXIgdGhlIHRoZSBkYXRhIHRoYXQgaXMgYmVpbmcgdXNlZCB0bwoJCSAqIG9yZGVyIGEgY29sdW1uLCBidXQgaXMgbmVjZXNzYXJpbHkgdGhlcmVmb3JlIG1vcmUgY29tcGxleC4KCQkgKiAKCQkgKiBUaGlzIHR5cGUgb2Ygb3JkZXJpbmcgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGRvIG9yZGVyaW5nIGJhc2VkIG9uIGRhdGEKCQkgKiBsaXZlIGZyb20gdGhlIERPTSAoZm9yIGV4YW1wbGUgdGhlIGNvbnRlbnRzIG9mIGFuICdpbnB1dCcgZWxlbWVudCkgcmF0aGVyCgkJICogdGhhbiBqdXN0IHRoZSBzdGF0aWMgc3RyaW5nIHRoYXQgRGF0YVRhYmxlcyBrbm93cyBvZi4KCQkgKiAKCQkgKiBUaGUgd2F5IHRoZXNlIHBsdWctaW5zIHdvcmsgaXMgdGhhdCB5b3UgY3JlYXRlIGFuIGFycmF5IG9mIHRoZSB2YWx1ZXMgeW91CgkJICogd2lzaCB0byBiZSBvcmRlcmluZyBmb3IgdGhlIGNvbHVtbiBpbiBxdWVzdGlvbiBhbmQgdGhlbiByZXR1cm4gdGhhdAoJCSAqIGFycmF5LiBUaGUgZGF0YSBpbiB0aGUgYXJyYXkgbXVjaCBiZSBpbiB0aGUgaW5kZXggb3JkZXIgb2YgdGhlIHJvd3MgaW4KCQkgKiB0aGUgdGFibGUgKG5vdCB0aGUgY3VycmVudGx5IG9yZGVyaW5nIG9yZGVyISkuIFdoaWNoIG9yZGVyIGRhdGEgZ2F0aGVyaW5nCgkJICogZnVuY3Rpb24gaXMgcnVuIGhlcmUgZGVwZW5kcyBvbiB0aGUgYGR0LWluaXQgY29sdW1ucy5vcmRlckRhdGFUeXBlYAoJCSAqIHBhcmFtZXRlciB0aGF0IGlzIHVzZWQgZm9yIHRoZSBjb2x1bW4gKGlmIGFueSkuCgkJICoKCQkgKiBUaGUgZnVuY3Rpb25zIGRlZmluZWQgdGFrZSB0d28gcGFyYW1ldGVyczoKCQkgKgoJCSAqIDEuIGB7b2JqZWN0fWAgRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3Q6IHNlZQoJCSAqICAgIHtAbGluayBEYXRhVGFibGUubW9kZWxzLm9TZXR0aW5nc30KCQkgKiAyLiBge2ludH1gIFRhcmdldCBjb2x1bW4gaW5kZXgKCQkgKgoJCSAqIEVhY2ggZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGFuIGFycmF5OgoJCSAqCgkJICogKiBge2FycmF5fWAgRGF0YSBmb3IgdGhlIGNvbHVtbiB0byBiZSBvcmRlcmluZyB1cG9uCgkJICoKCQkgKiAgQHR5cGUgYXJyYXkKCQkgKgoJCSAqICBAZXhhbXBsZQoJCSAqICAgIC8vIE9yZGVyaW5nIHVzaW5nIGBpbnB1dGAgbm9kZSB2YWx1ZXMKCQkgKiAgICAkLmZuLmRhdGFUYWJsZS5leHQub3JkZXJbJ2RvbS10ZXh0J10gPSBmdW5jdGlvbiAgKCBzZXR0aW5ncywgY29sICkKCQkgKiAgICB7CgkJICogICAgICByZXR1cm4gdGhpcy5hcGkoKS5jb2x1bW4oIGNvbCwge29yZGVyOidpbmRleCd9ICkubm9kZXMoKS5tYXAoIGZ1bmN0aW9uICggdGQsIGkgKSB7CgkJICogICAgICAgIHJldHVybiAkKCdpbnB1dCcsIHRkKS52YWwoKTsKCQkgKiAgICAgIH0gKTsKCQkgKiAgICB9CgkJICovCgkJb3JkZXI6IHt9LAoJCgkKCQkvKioKCQkgKiBUeXBlIGJhc2VkIHBsdWctaW5zLgoJCSAqCgkJICogRWFjaCBjb2x1bW4gaW4gRGF0YVRhYmxlcyBoYXMgYSB0eXBlIGFzc2lnbmVkIHRvIGl0LCBlaXRoZXIgYnkgYXV0b21hdGljCgkJICogZGV0ZWN0aW9uIG9yIGJ5IGRpcmVjdCBhc3NpZ25tZW50IHVzaW5nIHRoZSBgdHlwZWAgb3B0aW9uIGZvciB0aGUgY29sdW1uLgoJCSAqIFRoZSB0eXBlIG9mIGEgY29sdW1uIHdpbGwgZWZmZWN0IGhvdyBpdCBpcyBvcmRlcmluZyBhbmQgc2VhcmNoIChwbHVnLWlucwoJCSAqIGNhbiBhbHNvIG1ha2UgdXNlIG9mIHRoZSBjb2x1bW4gdHlwZSBpZiByZXF1aXJlZCkuCgkJICoKCQkgKiBAbmFtZXNwYWNlCgkJICovCgkJdHlwZTogewoJCQkvKioKCQkJICogVHlwZSBkZXRlY3Rpb24gZnVuY3Rpb25zLgoJCQkgKgoJCQkgKiBUaGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBvYmplY3QgYXJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBkZXRlY3QKCQkJICogYSBjb2x1bW4ncyB0eXBlLCBtYWtpbmcgaW5pdGlhbGlzYXRpb24gb2YgRGF0YVRhYmxlcyBzdXBlciBlYXN5LCBldmVuCgkJCSAqIHdoZW4gY29tcGxleCBkYXRhIGlzIGluIHRoZSB0YWJsZS4KCQkJICoKCQkJICogVGhlIGZ1bmN0aW9ucyBkZWZpbmVkIHRha2UgdHdvIHBhcmFtZXRlcnM6CgkJCSAqCgkJICAgICAqICAxLiBgeyp9YCBEYXRhIGZyb20gdGhlIGNvbHVtbiBjZWxsIHRvIGJlIGFuYWx5c2VkCgkJICAgICAqICAyLiBge3NldHRpbmdzfWAgRGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWQgdG8KCQkgICAgICogICAgIHBlcmZvcm0gY29udGV4dCBzcGVjaWZpYyB0eXBlIGRldGVjdGlvbiAtIGZvciBleGFtcGxlIGRldGVjdGlvbgoJCSAgICAgKiAgICAgYmFzZWQgb24gbGFuZ3VhZ2Ugc2V0dGluZ3Mgc3VjaCBhcyB1c2luZyBhIGNvbW1hIGZvciBhIGRlY2ltYWwKCQkgICAgICogICAgIHBsYWNlLiBHZW5lcmFsbHkgc3BlYWtpbmcgdGhlIG9wdGlvbnMgZnJvbSB0aGUgc2V0dGluZ3Mgd2lsbCBub3QKCQkgICAgICogICAgIGJlIHJlcXVpcmVkCgkJCSAqCgkJCSAqIEVhY2ggZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuOgoJCQkgKgoJCQkgKiAqIGB7c3RyaW5nfG51bGx9YCBEYXRhIHR5cGUgZGV0ZWN0ZWQsIG9yIG51bGwgaWYgdW5rbm93biAoYW5kIHRodXMKCQkJICogICBwYXNzIGl0IG9uIHRvIHRoZSBvdGhlciB0eXBlIGRldGVjdGlvbiBmdW5jdGlvbnMuCgkJCSAqCgkJCSAqICBAdHlwZSBhcnJheQoJCQkgKgoJCQkgKiAgQGV4YW1wbGUKCQkJICogICAgLy8gQ3VycmVuY3kgdHlwZSBkZXRlY3Rpb24gcGx1Zy1pbjoKCQkJICogICAgJC5mbi5kYXRhVGFibGUuZXh0LnR5cGUuZGV0ZWN0LnB1c2goCgkJCSAqICAgICAgZnVuY3Rpb24gKCBkYXRhLCBzZXR0aW5ncyApIHsKCQkJICogICAgICAgIC8vIENoZWNrIHRoZSBudW1lcmljIHBhcnQKCQkJICogICAgICAgIGlmICggISBkYXRhLnN1YnN0cmluZygxKS5tYXRjaCgvWzAtOV0vKSApIHsKCQkJICogICAgICAgICAgcmV0dXJuIG51bGw7CgkJCSAqICAgICAgICB9CgkJCSAqCgkJCSAqICAgICAgICAvLyBDaGVjayBwcmVmaXhlZCBieSBjdXJyZW5jeQoJCQkgKiAgICAgICAgaWYgKCBkYXRhLmNoYXJBdCgwKSA9PSAnJCcgfHwgZGF0YS5jaGFyQXQoMCkgPT0gJyZwb3VuZDsnICkgewoJCQkgKiAgICAgICAgICByZXR1cm4gJ2N1cnJlbmN5JzsKCQkJICogICAgICAgIH0KCQkJICogICAgICAgIHJldHVybiBudWxsOwoJCQkgKiAgICAgIH0KCQkJICogICAgKTsKCQkJICovCgkJCWRldGVjdDogW10sCgkKCQoJCQkvKioKCQkJICogVHlwZSBiYXNlZCBzZWFyY2ggZm9ybWF0dGluZy4KCQkJICoKCQkJICogVGhlIHR5cGUgYmFzZWQgc2VhcmNoaW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBwcmUtZm9ybWF0IHRoZQoJCQkgKiBkYXRhIHRvIGJlIHNlYXJjaCBvbi4gRm9yIGV4YW1wbGUsIGl0IGNhbiBiZSB1c2VkIHRvIHN0cmlwIEhUTUwKCQkJICogdGFncyBvciB0byBkZS1mb3JtYXQgdGVsZXBob25lIG51bWJlcnMgZm9yIG51bWVyaWMgb25seSBzZWFyY2hpbmcuCgkJCSAqCgkJCSAqIE5vdGUgdGhhdCBpcyBhIHNlYXJjaCBpcyBub3QgZGVmaW5lZCBmb3IgYSBjb2x1bW4gb2YgYSBnaXZlbiB0eXBlLAoJCQkgKiBubyBzZWFyY2ggZm9ybWF0dGluZyB3aWxsIGJlIHBlcmZvcm1lZC4KCQkJICogCgkJCSAqIFByZS1wcm9jZXNzaW5nIG9mIHNlYXJjaGluZyBkYXRhIHBsdWctaW5zIC0gV2hlbiB5b3UgYXNzaWduIHRoZSBzVHlwZQoJCQkgKiBmb3IgYSBjb2x1bW4gKG9yIGhhdmUgaXQgYXV0b21hdGljYWxseSBkZXRlY3RlZCBmb3IgeW91IGJ5IERhdGFUYWJsZXMKCQkJICogb3IgYSB0eXBlIGRldGVjdGlvbiBwbHVnLWluKSwgeW91IHdpbGwgdHlwaWNhbGx5IGJlIHVzaW5nIHRoaXMgZm9yCgkJCSAqIGN1c3RvbSBzb3J0aW5nLCBidXQgaXQgY2FuIGFsc28gYmUgdXNlZCB0byBwcm92aWRlIGN1c3RvbSBzZWFyY2hpbmcKCQkJICogYnkgYWxsb3dpbmcgeW91IHRvIHByZS1wcm9jZXNzaW5nIHRoZSBkYXRhIGFuZCByZXR1cm5pbmcgdGhlIGRhdGEgaW4KCQkJICogdGhlIGZvcm1hdCB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCB1cG9uLiBUaGlzIGlzIGRvbmUgYnkgYWRkaW5nCgkJCSAqIGZ1bmN0aW9ucyB0aGlzIG9iamVjdCB3aXRoIGEgcGFyYW1ldGVyIG5hbWUgd2hpY2ggbWF0Y2hlcyB0aGUgc1R5cGUKCQkJICogZm9yIHRoYXQgdGFyZ2V0IGNvbHVtbi4gVGhpcyBpcyB0aGUgY29yb2xsYXJ5IG9mIDxpPmFmblNvcnREYXRhPC9pPgoJCQkgKiBmb3Igc2VhcmNoaW5nIGRhdGEuCgkJCSAqCgkJCSAqIFRoZSBmdW5jdGlvbnMgZGVmaW5lZCB0YWtlIGEgc2luZ2xlIHBhcmFtZXRlcjoKCQkJICoKCQkgICAgICogIDEuIGB7Kn1gIERhdGEgZnJvbSB0aGUgY29sdW1uIGNlbGwgdG8gYmUgcHJlcGFyZWQgZm9yIHNlYXJjaGluZwoJCQkgKgoJCQkgKiBFYWNoIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybjoKCQkJICoKCQkJICogKiBge3N0cmluZ3xudWxsfWAgRm9ybWF0dGVkIHN0cmluZyB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIHNlYXJjaGluZy4KCQkJICoKCQkJICogIEB0eXBlIG9iamVjdAoJCQkgKiAgQGRlZmF1bHQge30KCQkJICoKCQkJICogIEBleGFtcGxlCgkJCSAqICAgICQuZm4uZGF0YVRhYmxlLmV4dC50eXBlLnNlYXJjaFsndGl0bGUtbnVtZXJpYyddID0gZnVuY3Rpb24gKCBkICkgewoJCQkgKiAgICAgIHJldHVybiBkLnJlcGxhY2UoL1xuL2csIiAiKS5yZXBsYWNlKCAvPC4qPz4vZywgIiIgKTsKCQkJICogICAgfQoJCQkgKi8KCQkJc2VhcmNoOiB7fSwKCQoJCgkJCS8qKgoJCQkgKiBUeXBlIGJhc2VkIG9yZGVyaW5nLgoJCQkgKgoJCQkgKiBUaGUgY29sdW1uIHR5cGUgdGVsbHMgRGF0YVRhYmxlcyB3aGF0IG9yZGVyaW5nIHRvIGFwcGx5IHRvIHRoZSB0YWJsZQoJCQkgKiB3aGVuIGEgY29sdW1uIGlzIHNvcnRlZCB1cG9uLiBUaGUgb3JkZXIgZm9yIGVhY2ggdHlwZSB0aGF0IGlzIGRlZmluZWQsCgkJCSAqIGlzIGRlZmluZWQgYnkgdGhlIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gdGhpcyBvYmplY3QuCgkJCSAqCgkJCSAqIEVhY2ggb3JkZXJpbmcgb3B0aW9uIGNhbiBiZSBkZXNjcmliZWQgYnkgdGhyZWUgcHJvcGVydGllcyBhZGRlZCB0bwoJCQkgKiB0aGlzIG9iamVjdDoKCQkJICoKCQkJICogKiBge3R5cGV9LXByZWAgLSBQcmUtZm9ybWF0dGluZyBmdW5jdGlvbgoJCQkgKiAqIGB7dHlwZX0tYXNjYCAtIEFzY2VuZGluZyBvcmRlciBmdW5jdGlvbgoJCQkgKiAqIGB7dHlwZX0tZGVzY2AgLSBEZXNjZW5kaW5nIG9yZGVyIGZ1bmN0aW9uCgkJCSAqCgkJCSAqIEFsbCB0aHJlZSBjYW4gYmUgdXNlZCB0b2dldGhlciwgb25seSBge3R5cGV9LXByZWAgb3Igb25seQoJCQkgKiBge3R5cGV9LWFzY2AgYW5kIGB7dHlwZX0tZGVzY2AgdG9nZXRoZXIuIEl0IGlzIGdlbmVyYWxseSByZWNvbW1lbmRlZAoJCQkgKiB0aGF0IG9ubHkgYHt0eXBlfS1wcmVgIGlzIHVzZWQsIGFzIHRoaXMgcHJvdmlkZXMgdGhlIG9wdGltYWwKCQkJICogaW1wbGVtZW50YXRpb24gaW4gdGVybXMgb2Ygc3BlZWQsIGFsdGhvdWdoIHRoZSBvdGhlcnMgYXJlIHByb3ZpZGVkCgkJCSAqIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgSmF2YXNjcmlwdCBzb3J0IGZ1bmN0aW9ucy4KCQkJICoKCQkJICogYHt0eXBlfS1wcmVgOiBGdW5jdGlvbnMgZGVmaW5lZCB0YWtlIGEgc2luZ2xlIHBhcmFtZXRlcjoKCQkJICoKCQkgICAgICogIDEuIGB7Kn1gIERhdGEgZnJvbSB0aGUgY29sdW1uIGNlbGwgdG8gYmUgcHJlcGFyZWQgZm9yIG9yZGVyaW5nCgkJCSAqCgkJCSAqIEFuZCByZXR1cm46CgkJCSAqCgkJCSAqICogYHsqfWAgRGF0YSB0byBiZSBzb3J0ZWQgdXBvbgoJCQkgKgoJCQkgKiBge3R5cGV9LWFzY2AgYW5kIGB7dHlwZX0tZGVzY2A6IEZ1bmN0aW9ucyBhcmUgdHlwaWNhbCBKYXZhc2NyaXB0IHNvcnQKCQkJICogZnVuY3Rpb25zLCB0YWtpbmcgdHdvIHBhcmFtZXRlcnM6CgkJCSAqCgkJICAgICAqICAxLiBgeyp9YCBEYXRhIHRvIGNvbXBhcmUgdG8gdGhlIHNlY29uZCBwYXJhbWV0ZXIKCQkgICAgICogIDIuIGB7Kn1gIERhdGEgdG8gY29tcGFyZSB0byB0aGUgZmlyc3QgcGFyYW1ldGVyCgkJCSAqCgkJCSAqIEFuZCByZXR1cm5pbmc6CgkJCSAqCgkJCSAqICogYHsqfWAgT3JkZXJpbmcgbWF0Y2g6IDwwIGlmIGZpcnN0IHBhcmFtZXRlciBzaG91bGQgYmUgc29ydGVkIGxvd2VyCgkJCSAqICAgdGhhbiB0aGUgc2Vjb25kIHBhcmFtZXRlciwgPT09MCBpZiB0aGUgdHdvIHBhcmFtZXRlcnMgYXJlIGVxdWFsIGFuZAoJCQkgKiAgID4wIGlmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHNvcnRlZCBoZWlnaHQgdGhhbiB0aGUgc2Vjb25kCgkJCSAqICAgcGFyYW1ldGVyLgoJCQkgKiAKCQkJICogIEB0eXBlIG9iamVjdAoJCQkgKiAgQGRlZmF1bHQge30KCQkJICoKCQkJICogIEBleGFtcGxlCgkJCSAqICAgIC8vIE51bWVyaWMgb3JkZXJpbmcgb2YgZm9ybWF0dGVkIG51bWJlcnMgd2l0aCBhIHByZS1mb3JtYXR0ZXIKCQkJICogICAgJC5leHRlbmQoICQuZm4uZGF0YVRhYmxlLmV4dC50eXBlLm9yZGVyLCB7CgkJCSAqICAgICAgInN0cmluZy1wcmUiOiBmdW5jdGlvbih4KSB7CgkJCSAqICAgICAgICBhID0gKGEgPT09ICItIiB8fCBhID09PSAiIikgPyAwIDogYS5yZXBsYWNlKCAvW15cZFwtXC5dL2csICIiICk7CgkJCSAqICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCggYSApOwoJCQkgKiAgICAgIH0KCQkJICogICAgfSApOwoJCQkgKgoJCQkgKiAgQGV4YW1wbGUKCQkJICogICAgLy8gQ2FzZS1zZW5zaXRpdmUgc3RyaW5nIG9yZGVyaW5nLCB3aXRoIG5vIHByZS1mb3JtYXR0aW5nIG1ldGhvZAoJCQkgKiAgICAkLmV4dGVuZCggJC5mbi5kYXRhVGFibGUuZXh0Lm9yZGVyLCB7CgkJCSAqICAgICAgInN0cmluZy1jYXNlLWFzYyI6IGZ1bmN0aW9uKHgseSkgewoJCQkgKiAgICAgICAgcmV0dXJuICgoeCA8IHkpID8gLTEgOiAoKHggPiB5KSA/IDEgOiAwKSk7CgkJCSAqICAgICAgfSwKCQkJICogICAgICAic3RyaW5nLWNhc2UtZGVzYyI6IGZ1bmN0aW9uKHgseSkgewoJCQkgKiAgICAgICAgcmV0dXJuICgoeCA8IHkpID8gMSA6ICgoeCA+IHkpID8gLTEgOiAwKSk7CgkJCSAqICAgICAgfQoJCQkgKiAgICB9ICk7CgkJCSAqLwoJCQlvcmRlcjoge30KCQl9LAoJCgkJLyoqCgkJICogVW5pcXVlIERhdGFUYWJsZXMgaW5zdGFuY2UgY291bnRlcgoJCSAqCgkJICogQHR5cGUgaW50CgkJICogQHByaXZhdGUKCQkgKi8KCQlfdW5pcXVlOiAwLAoJCgkKCQkvLwoJCS8vIERlcHJlY2lhdGVkCgkJLy8gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seS4KCQkvLyBUaGUgc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBwcm9qZWN0cyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlCgkJLy8gdmVyc2lvbgoJCS8vCgkKCQkvKioKCQkgKiBWZXJzaW9uIGNoZWNrIGZ1bmN0aW9uLgoJCSAqICBAdHlwZSBmdW5jdGlvbgoJCSAqICBAZGVwcmVjaWF0ZWQgU2luY2UgMS4xMAoJCSAqLwoJCWZuVmVyc2lvbkNoZWNrOiBEYXRhVGFibGUuZm5WZXJzaW9uQ2hlY2ssCgkKCQoJCS8qKgoJCSAqIEluZGV4IGZvciB3aGF0ICd0aGlzJyBpbmRleCBBUEkgZnVuY3Rpb25zIHNob3VsZCB1c2UKCQkgKiAgQHR5cGUgaW50CgkJICogIEBkZXByZWNhdGVkIFNpbmNlIHYxLjEwCgkJICovCgkJaUFwaUluZGV4OiAwLAoJCgkKCQkvKioKCQkgKiBqUXVlcnkgVUkgY2xhc3MgY29udGFpbmVyCgkJICogIEB0eXBlIG9iamVjdAoJCSAqICBAZGVwcmVjYXRlZCBTaW5jZSB2MS4xMAoJCSAqLwoJCW9KVUlDbGFzc2VzOiB7fSwKCQoJCgkJLyoqCgkJICogU29mdHdhcmUgdmVyc2lvbgoJCSAqICBAdHlwZSBzdHJpbmcKCQkgKiAgQGRlcHJlY2F0ZWQgU2luY2UgdjEuMTAKCQkgKi8KCQlzVmVyc2lvbjogRGF0YVRhYmxlLnZlcnNpb24KCX07CgkKCQoJLy8KCS8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBBbGlhcyB0byBwcmUgMS4xMCBIdW5nYXJpYW4gbm90YXRpb24gY291bnRlciBwYXJ0cwoJLy8KCSQuZXh0ZW5kKCBfZXh0LCB7CgkJYWZuRmlsdGVyaW5nOiBfZXh0LnNlYXJjaCwKCQlhVHlwZXM6ICAgICAgIF9leHQudHlwZS5kZXRlY3QsCgkJb2ZuU2VhcmNoOiAgICBfZXh0LnR5cGUuc2VhcmNoLAoJCW9Tb3J0OiAgICAgICAgX2V4dC50eXBlLm9yZGVyLAoJCWFmblNvcnREYXRhOiAgX2V4dC5vcmRlciwKCQlhb0ZlYXR1cmVzOiAgIF9leHQuZmVhdHVyZSwKCQlvQXBpOiAgICAgICAgIF9leHQuaW50ZXJuYWwsCgkJb1N0ZENsYXNzZXM6ICBfZXh0LmNsYXNzZXMsCgkJb1BhZ2luYXRpb246ICBfZXh0LnBhZ2VyCgl9ICk7CgkKCQoJJC5leHRlbmQoIERhdGFUYWJsZS5leHQuY2xhc3NlcywgewoJCSJzVGFibGUiOiAiZGF0YVRhYmxlIiwKCQkic05vRm9vdGVyIjogIm5vLWZvb3RlciIsCgkKCQkvKiBQYWdpbmcgYnV0dG9ucyAqLwoJCSJzUGFnZUJ1dHRvbiI6ICJwYWdpbmF0ZV9idXR0b24iLAoJCSJzUGFnZUJ1dHRvbkFjdGl2ZSI6ICJjdXJyZW50IiwKCQkic1BhZ2VCdXR0b25EaXNhYmxlZCI6ICJkaXNhYmxlZCIsCgkKCQkvKiBTdHJpcGluZyBjbGFzc2VzICovCgkJInNTdHJpcGVPZGQiOiAib2RkIiwKCQkic1N0cmlwZUV2ZW4iOiAiZXZlbiIsCgkKCQkvKiBFbXB0eSByb3cgKi8KCQkic1Jvd0VtcHR5IjogImRhdGFUYWJsZXNfZW1wdHkiLAoJCgkJLyogRmVhdHVyZXMgKi8KCQkic1dyYXBwZXIiOiAiZGF0YVRhYmxlc193cmFwcGVyIiwKCQkic0ZpbHRlciI6ICJkYXRhVGFibGVzX2ZpbHRlciIsCgkJInNJbmZvIjogImRhdGFUYWJsZXNfaW5mbyIsCgkJInNQYWdpbmciOiAiZGF0YVRhYmxlc19wYWdpbmF0ZSBwYWdpbmdfIiwgLyogTm90ZSB0aGF0IHRoZSB0eXBlIGlzIHBvc3RmaXhlZCAqLwoJCSJzTGVuZ3RoIjogImRhdGFUYWJsZXNfbGVuZ3RoIiwKCQkic1Byb2Nlc3NpbmciOiAiZGF0YVRhYmxlc19wcm9jZXNzaW5nIiwKCQoJCS8qIFNvcnRpbmcgKi8KCQkic1NvcnRBc2MiOiAic29ydGluZ19hc2MiLAoJCSJzU29ydERlc2MiOiAic29ydGluZ19kZXNjIiwKCQkic1NvcnRhYmxlIjogInNvcnRpbmciLCAvKiBTb3J0YWJsZSBpbiBib3RoIGRpcmVjdGlvbnMgKi8KCQkic1NvcnRhYmxlQXNjIjogInNvcnRpbmdfZGVzY19kaXNhYmxlZCIsCgkJInNTb3J0YWJsZURlc2MiOiAic29ydGluZ19hc2NfZGlzYWJsZWQiLAoJCSJzU29ydGFibGVOb25lIjogInNvcnRpbmdfZGlzYWJsZWQiLAoJCSJzU29ydENvbHVtbiI6ICJzb3J0aW5nXyIsIC8qIE5vdGUgdGhhdCBhbiBpbnQgaXMgcG9zdGZpeGVkIGZvciB0aGUgc29ydGluZyBvcmRlciAqLwoJCgkJLyogRmlsdGVyaW5nICovCgkJInNGaWx0ZXJJbnB1dCI6ICIiLAoJCgkJLyogUGFnZSBsZW5ndGggKi8KCQkic0xlbmd0aFNlbGVjdCI6ICIiLAoJCgkJLyogU2Nyb2xsaW5nICovCgkJInNTY3JvbGxXcmFwcGVyIjogImRhdGFUYWJsZXNfc2Nyb2xsIiwKCQkic1Njcm9sbEhlYWQiOiAiZGF0YVRhYmxlc19zY3JvbGxIZWFkIiwKCQkic1Njcm9sbEhlYWRJbm5lciI6ICJkYXRhVGFibGVzX3Njcm9sbEhlYWRJbm5lciIsCgkJInNTY3JvbGxCb2R5IjogImRhdGFUYWJsZXNfc2Nyb2xsQm9keSIsCgkJInNTY3JvbGxGb290IjogImRhdGFUYWJsZXNfc2Nyb2xsRm9vdCIsCgkJInNTY3JvbGxGb290SW5uZXIiOiAiZGF0YVRhYmxlc19zY3JvbGxGb290SW5uZXIiLAoJCgkJLyogTWlzYyAqLwoJCSJzSGVhZGVyVEgiOiAiIiwKCQkic0Zvb3RlclRIIjogIiIsCgkKCQkvLyBEZXByZWNhdGVkCgkJInNTb3J0SlVJQXNjIjogIiIsCgkJInNTb3J0SlVJRGVzYyI6ICIiLAoJCSJzU29ydEpVSSI6ICIiLAoJCSJzU29ydEpVSUFzY0FsbG93ZWQiOiAiIiwKCQkic1NvcnRKVUlEZXNjQWxsb3dlZCI6ICIiLAoJCSJzU29ydEpVSVdyYXBwZXIiOiAiIiwKCQkic1NvcnRJY29uIjogIiIsCgkJInNKVUlIZWFkZXIiOiAiIiwKCQkic0pVSUZvb3RlciI6ICIiCgl9ICk7CgkKCQoJdmFyIGV4dFBhZ2luYXRpb24gPSBEYXRhVGFibGUuZXh0LnBhZ2VyOwoJCglmdW5jdGlvbiBfbnVtYmVycyAoIHBhZ2UsIHBhZ2VzICkgewoJCXZhcgoJCQludW1iZXJzID0gW10sCgkJCWJ1dHRvbnMgPSBleHRQYWdpbmF0aW9uLm51bWJlcnNfbGVuZ3RoLAoJCQloYWxmID0gTWF0aC5mbG9vciggYnV0dG9ucyAvIDIgKSwKCQkJaSA9IDE7CgkKCQlpZiAoIHBhZ2VzIDw9IGJ1dHRvbnMgKSB7CgkJCW51bWJlcnMgPSBfcmFuZ2UoIDAsIHBhZ2VzICk7CgkJfQoJCWVsc2UgaWYgKCBwYWdlIDw9IGhhbGYgKSB7CgkJCW51bWJlcnMgPSBfcmFuZ2UoIDAsIGJ1dHRvbnMtMiApOwoJCQludW1iZXJzLnB1c2goICdlbGxpcHNpcycgKTsKCQkJbnVtYmVycy5wdXNoKCBwYWdlcy0xICk7CgkJfQoJCWVsc2UgaWYgKCBwYWdlID49IHBhZ2VzIC0gMSAtIGhhbGYgKSB7CgkJCW51bWJlcnMgPSBfcmFuZ2UoIHBhZ2VzLShidXR0b25zLTIpLCBwYWdlcyApOwoJCQludW1iZXJzLnNwbGljZSggMCwgMCwgJ2VsbGlwc2lzJyApOyAvLyBubyB1bnNoaWZ0IGluIGllNgoJCQludW1iZXJzLnNwbGljZSggMCwgMCwgMCApOwoJCX0KCQllbHNlIHsKCQkJbnVtYmVycyA9IF9yYW5nZSggcGFnZS1oYWxmKzIsIHBhZ2UraGFsZi0xICk7CgkJCW51bWJlcnMucHVzaCggJ2VsbGlwc2lzJyApOwoJCQludW1iZXJzLnB1c2goIHBhZ2VzLTEgKTsKCQkJbnVtYmVycy5zcGxpY2UoIDAsIDAsICdlbGxpcHNpcycgKTsKCQkJbnVtYmVycy5zcGxpY2UoIDAsIDAsIDAgKTsKCQl9CgkKCQludW1iZXJzLkRUX2VsID0gJ3NwYW4nOwoJCXJldHVybiBudW1iZXJzOwoJfQoJCgkKCSQuZXh0ZW5kKCBleHRQYWdpbmF0aW9uLCB7CgkJc2ltcGxlOiBmdW5jdGlvbiAoIHBhZ2UsIHBhZ2VzICkgewoJCQlyZXR1cm4gWyAncHJldmlvdXMnLCAnbmV4dCcgXTsKCQl9LAoJCgkJZnVsbDogZnVuY3Rpb24gKCBwYWdlLCBwYWdlcyApIHsKCQkJcmV0dXJuIFsgICdmaXJzdCcsICdwcmV2aW91cycsICduZXh0JywgJ2xhc3QnIF07CgkJfSwKCQoJCW51bWJlcnM6IGZ1bmN0aW9uICggcGFnZSwgcGFnZXMgKSB7CgkJCXJldHVybiBbIF9udW1iZXJzKHBhZ2UsIHBhZ2VzKSBdOwoJCX0sCgkKCQlzaW1wbGVfbnVtYmVyczogZnVuY3Rpb24gKCBwYWdlLCBwYWdlcyApIHsKCQkJcmV0dXJuIFsgJ3ByZXZpb3VzJywgX251bWJlcnMocGFnZSwgcGFnZXMpLCAnbmV4dCcgXTsKCQl9LAoJCgkJZnVsbF9udW1iZXJzOiBmdW5jdGlvbiAoIHBhZ2UsIHBhZ2VzICkgewoJCQlyZXR1cm4gWyAnZmlyc3QnLCAncHJldmlvdXMnLCBfbnVtYmVycyhwYWdlLCBwYWdlcyksICduZXh0JywgJ2xhc3QnIF07CgkJfSwKCQkKCQlmaXJzdF9sYXN0X251bWJlcnM6IGZ1bmN0aW9uIChwYWdlLCBwYWdlcykgewoJIAkJcmV0dXJuIFsnZmlyc3QnLCBfbnVtYmVycyhwYWdlLCBwYWdlcyksICdsYXN0J107CgkgCX0sCgkKCQkvLyBGb3IgdGVzdGluZyBhbmQgcGx1Zy1pbnMgdG8gdXNlCgkJX251bWJlcnM6IF9udW1iZXJzLAoJCgkJLy8gTnVtYmVyIG9mIG51bWJlciBidXR0b25zIChpbmNsdWRpbmcgZWxsaXBzaXMpIHRvIHNob3cuIF9NdXN0IGJlIG9kZCFfCgkJbnVtYmVyc19sZW5ndGg6IDcKCX0gKTsKCQoJCgkkLmV4dGVuZCggdHJ1ZSwgRGF0YVRhYmxlLmV4dC5yZW5kZXJlciwgewoJCXBhZ2VCdXR0b246IHsKCQkJXzogZnVuY3Rpb24gKCBzZXR0aW5ncywgaG9zdCwgaWR4LCBidXR0b25zLCBwYWdlLCBwYWdlcyApIHsKCQkJCXZhciBjbGFzc2VzID0gc2V0dGluZ3Mub0NsYXNzZXM7CgkJCQl2YXIgbGFuZyA9IHNldHRpbmdzLm9MYW5ndWFnZS5vUGFnaW5hdGU7CgkJCQl2YXIgYXJpYSA9IHNldHRpbmdzLm9MYW5ndWFnZS5vQXJpYS5wYWdpbmF0ZSB8fCB7fTsKCQkJCXZhciBidG5EaXNwbGF5LCBidG5DbGFzcywgY291bnRlcj0wOwoJCgkJCQl2YXIgYXR0YWNoID0gZnVuY3Rpb24oIGNvbnRhaW5lciwgYnV0dG9ucyApIHsKCQkJCQl2YXIgaSwgaWVuLCBub2RlLCBidXR0b24sIHRhYkluZGV4OwoJCQkJCXZhciBkaXNhYmxlZENsYXNzID0gY2xhc3Nlcy5zUGFnZUJ1dHRvbkRpc2FibGVkOwoJCQkJCXZhciBjbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoIGUgKSB7CgkJCQkJCV9mblBhZ2VDaGFuZ2UoIHNldHRpbmdzLCBlLmRhdGEuYWN0aW9uLCB0cnVlICk7CgkJCQkJfTsKCQoJCQkJCWZvciAoIGk9MCwgaWVuPWJ1dHRvbnMubGVuZ3RoIDsgaTxpZW4gOyBpKysgKSB7CgkJCQkJCWJ1dHRvbiA9IGJ1dHRvbnNbaV07CgkKCQkJCQkJaWYgKCBBcnJheS5pc0FycmF5KCBidXR0b24gKSApIHsKCQkJCQkJCXZhciBpbm5lciA9ICQoICc8JysoYnV0dG9uLkRUX2VsIHx8ICdkaXYnKSsnLz4nICkKCQkJCQkJCQkuYXBwZW5kVG8oIGNvbnRhaW5lciApOwoJCQkJCQkJYXR0YWNoKCBpbm5lciwgYnV0dG9uICk7CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQlidG5EaXNwbGF5ID0gbnVsbDsKCQkJCQkJCWJ0bkNsYXNzID0gYnV0dG9uOwoJCQkJCQkJdGFiSW5kZXggPSBzZXR0aW5ncy5pVGFiSW5kZXg7CgkKCQkJCQkJCXN3aXRjaCAoIGJ1dHRvbiApIHsKCQkJCQkJCQljYXNlICdlbGxpcHNpcyc6CgkJCQkJCQkJCWNvbnRhaW5lci5hcHBlbmQoJzxzcGFuIGNsYXNzPSJlbGxpcHNpcyI+JiN4MjAyNjs8L3NwYW4+Jyk7CgkJCQkJCQkJCWJyZWFrOwoJCgkJCQkJCQkJY2FzZSAnZmlyc3QnOgoJCQkJCQkJCQlidG5EaXNwbGF5ID0gbGFuZy5zRmlyc3Q7CgkKCQkJCQkJCQkJaWYgKCBwYWdlID09PSAwICkgewoJCQkJCQkJCQkJdGFiSW5kZXggPSAtMTsKCQkJCQkJCQkJCWJ0bkNsYXNzICs9ICcgJyArIGRpc2FibGVkQ2xhc3M7CgkJCQkJCQkJCX0KCQkJCQkJCQkJYnJlYWs7CgkKCQkJCQkJCQljYXNlICdwcmV2aW91cyc6CgkJCQkJCQkJCWJ0bkRpc3BsYXkgPSBsYW5nLnNQcmV2aW91czsKCQoJCQkJCQkJCQlpZiAoIHBhZ2UgPT09IDAgKSB7CgkJCQkJCQkJCQl0YWJJbmRleCA9IC0xOwoJCQkJCQkJCQkJYnRuQ2xhc3MgKz0gJyAnICsgZGlzYWJsZWRDbGFzczsKCQkJCQkJCQkJfQoJCQkJCQkJCQlicmVhazsKCQoJCQkJCQkJCWNhc2UgJ25leHQnOgoJCQkJCQkJCQlidG5EaXNwbGF5ID0gbGFuZy5zTmV4dDsKCQoJCQkJCQkJCQlpZiAoIHBhZ2VzID09PSAwIHx8IHBhZ2UgPT09IHBhZ2VzLTEgKSB7CgkJCQkJCQkJCQl0YWJJbmRleCA9IC0xOwoJCQkJCQkJCQkJYnRuQ2xhc3MgKz0gJyAnICsgZGlzYWJsZWRDbGFzczsKCQkJCQkJCQkJfQoJCQkJCQkJCQlicmVhazsKCQoJCQkJCQkJCWNhc2UgJ2xhc3QnOgoJCQkJCQkJCQlidG5EaXNwbGF5ID0gbGFuZy5zTGFzdDsKCQoJCQkJCQkJCQlpZiAoIHBhZ2VzID09PSAwIHx8IHBhZ2UgPT09IHBhZ2VzLTEgKSB7CgkJCQkJCQkJCQl0YWJJbmRleCA9IC0xOwoJCQkJCQkJCQkJYnRuQ2xhc3MgKz0gJyAnICsgZGlzYWJsZWRDbGFzczsKCQkJCQkJCQkJfQoJCQkJCQkJCQlicmVhazsKCQoJCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJCWJ0bkRpc3BsYXkgPSBzZXR0aW5ncy5mbkZvcm1hdE51bWJlciggYnV0dG9uICsgMSApOwoJCQkJCQkJCQlidG5DbGFzcyA9IHBhZ2UgPT09IGJ1dHRvbiA/CgkJCQkJCQkJCQljbGFzc2VzLnNQYWdlQnV0dG9uQWN0aXZlIDogJyc7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCgkJCQkJCQlpZiAoIGJ0bkRpc3BsYXkgIT09IG51bGwgKSB7CgkJCQkJCQkJbm9kZSA9ICQoJzxhPicsIHsKCQkJCQkJCQkJCSdjbGFzcyc6IGNsYXNzZXMuc1BhZ2VCdXR0b24rJyAnK2J0bkNsYXNzLAoJCQkJCQkJCQkJJ2FyaWEtY29udHJvbHMnOiBzZXR0aW5ncy5zVGFibGVJZCwKCQkJCQkJCQkJCSdhcmlhLWxhYmVsJzogYXJpYVsgYnV0dG9uIF0sCgkJCQkJCQkJCQknZGF0YS1kdC1pZHgnOiBjb3VudGVyLAoJCQkJCQkJCQkJJ3RhYmluZGV4JzogdGFiSW5kZXgsCgkJCQkJCQkJCQknaWQnOiBpZHggPT09IDAgJiYgdHlwZW9mIGJ1dHRvbiA9PT0gJ3N0cmluZycgPwoJCQkJCQkJCQkJCXNldHRpbmdzLnNUYWJsZUlkICsnXycrIGJ1dHRvbiA6CgkJCQkJCQkJCQkJbnVsbAoJCQkJCQkJCQl9ICkKCQkJCQkJCQkJLmh0bWwoIGJ0bkRpc3BsYXkgKQoJCQkJCQkJCQkuYXBwZW5kVG8oIGNvbnRhaW5lciApOwoJCgkJCQkJCQkJX2ZuQmluZEFjdGlvbigKCQkJCQkJCQkJbm9kZSwge2FjdGlvbjogYnV0dG9ufSwgY2xpY2tIYW5kbGVyCgkJCQkJCQkJKTsKCQoJCQkJCQkJCWNvdW50ZXIrKzsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX07CgkKCQkJCS8vIElFOSB0aHJvd3MgYW4gJ3Vua25vd24gZXJyb3InIGlmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaXMgdXNlZAoJCQkJLy8gaW5zaWRlIGFuIGlmcmFtZSBvciBmcmFtZS4gVHJ5IC8gY2F0Y2ggdGhlIGVycm9yLiBOb3QgZ29vZCBmb3IKCQkJCS8vIGFjY2Vzc2liaWxpdHksIGJ1dCBuZWl0aGVyIGFyZSBmcmFtZXMuCgkJCQl2YXIgYWN0aXZlRWw7CgkKCQkJCXRyeSB7CgkJCQkJLy8gQmVjYXVzZSB0aGlzIGFwcHJvYWNoIGlzIGRlc3Ryb3lpbmcgYW5kIHJlY3JlYXRpbmcgdGhlIHBhZ2luZwoJCQkJCS8vIGVsZW1lbnRzLCBmb2N1cyBpcyBsb3N0IG9uIHRoZSBzZWxlY3QgYnV0dG9uIHdoaWNoIGlzIGJhZCBmb3IKCQkJCQkvLyBhY2Nlc3NpYmlsaXR5LiBTbyB3ZSB3YW50IHRvIHJlc3RvcmUgZm9jdXMgb25jZSB0aGUgZHJhdyBoYXMKCQkJCQkvLyBjb21wbGV0ZWQKCQkJCQlhY3RpdmVFbCA9ICQoaG9zdCkuZmluZChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5kYXRhKCdkdC1pZHgnKTsKCQkJCX0KCQkJCWNhdGNoIChlKSB7fQoJCgkJCQlhdHRhY2goICQoaG9zdCkuZW1wdHkoKSwgYnV0dG9ucyApOwoJCgkJCQlpZiAoIGFjdGl2ZUVsICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJJChob3N0KS5maW5kKCAnW2RhdGEtZHQtaWR4PScrYWN0aXZlRWwrJ10nICkudHJpZ2dlcignZm9jdXMnKTsKCQkJCX0KCQkJfQoJCX0KCX0gKTsKCQoJCgkKCS8vIEJ1aWx0IGluIHR5cGUgZGV0ZWN0aW9uLiBTZWUgbW9kZWwuZXh0LmFUeXBlcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQKCS8vIHdoYXQgaXMgcmVxdWlyZWQgZnJvbSB0aGlzIG1ldGhvZHMuCgkkLmV4dGVuZCggRGF0YVRhYmxlLmV4dC50eXBlLmRldGVjdCwgWwoJCS8vIFBsYWluIG51bWJlcnMgLSBmaXJzdCBzaW5jZSBWOCBkZXRlY3RzIHNvbWUgcGxhaW4gbnVtYmVycyBhcyBkYXRlcwoJCS8vIGUuZy4gRGF0ZS5wYXJzZSgnNTUnKSAoYnV0IG5vdCBhbGwsIGUuZy4gRGF0ZS5wYXJzZSgnMjInKS4uLikuCgkJZnVuY3Rpb24gKCBkLCBzZXR0aW5ncyApCgkJewoJCQl2YXIgZGVjaW1hbCA9IHNldHRpbmdzLm9MYW5ndWFnZS5zRGVjaW1hbDsKCQkJcmV0dXJuIF9pc051bWJlciggZCwgZGVjaW1hbCApID8gJ251bScrZGVjaW1hbCA6IG51bGw7CgkJfSwKCQoJCS8vIERhdGVzIChvbmx5IHRob3NlIHJlY29nbmlzZWQgYnkgdGhlIGJyb3dzZXIncyBEYXRlLnBhcnNlKQoJCWZ1bmN0aW9uICggZCwgc2V0dGluZ3MgKQoJCXsKCQkJLy8gVjggdHJpZXMgX3ZlcnlfIGhhcmQgdG8gbWFrZSBhIHN0cmluZyBwYXNzZWQgaW50byBgRGF0ZS5wYXJzZSgpYAoJCQkvLyB2YWxpZCwgc28gd2UgbmVlZCB0byB1c2UgYSByZWdleCB0byByZXN0cmljdCBkYXRlIGZvcm1hdHMuIFVzZSBhCgkJCS8vIHBsdWctaW4gZm9yIGFueXRoaW5nIG90aGVyIHRoYW4gSVNPODYwMSBzdHlsZSBzdHJpbmdzCgkJCWlmICggZCAmJiAhKGQgaW5zdGFuY2VvZiBEYXRlKSAmJiAhIF9yZV9kYXRlLnRlc3QoZCkgKSB7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoJCQl2YXIgcGFyc2VkID0gRGF0ZS5wYXJzZShkKTsKCQkJcmV0dXJuIChwYXJzZWQgIT09IG51bGwgJiYgIWlzTmFOKHBhcnNlZCkpIHx8IF9lbXB0eShkKSA/ICdkYXRlJyA6IG51bGw7CgkJfSwKCQoJCS8vIEZvcm1hdHRlZCBudW1iZXJzCgkJZnVuY3Rpb24gKCBkLCBzZXR0aW5ncyApCgkJewoJCQl2YXIgZGVjaW1hbCA9IHNldHRpbmdzLm9MYW5ndWFnZS5zRGVjaW1hbDsKCQkJcmV0dXJuIF9pc051bWJlciggZCwgZGVjaW1hbCwgdHJ1ZSApID8gJ251bS1mbXQnK2RlY2ltYWwgOiBudWxsOwoJCX0sCgkKCQkvLyBIVE1MIG51bWVyaWMKCQlmdW5jdGlvbiAoIGQsIHNldHRpbmdzICkKCQl7CgkJCXZhciBkZWNpbWFsID0gc2V0dGluZ3Mub0xhbmd1YWdlLnNEZWNpbWFsOwoJCQlyZXR1cm4gX2h0bWxOdW1lcmljKCBkLCBkZWNpbWFsICkgPyAnaHRtbC1udW0nK2RlY2ltYWwgOiBudWxsOwoJCX0sCgkKCQkvLyBIVE1MIG51bWVyaWMsIGZvcm1hdHRlZAoJCWZ1bmN0aW9uICggZCwgc2V0dGluZ3MgKQoJCXsKCQkJdmFyIGRlY2ltYWwgPSBzZXR0aW5ncy5vTGFuZ3VhZ2Uuc0RlY2ltYWw7CgkJCXJldHVybiBfaHRtbE51bWVyaWMoIGQsIGRlY2ltYWwsIHRydWUgKSA/ICdodG1sLW51bS1mbXQnK2RlY2ltYWwgOiBudWxsOwoJCX0sCgkKCQkvLyBIVE1MICh0aGlzIGlzIHN0cmljdCBjaGVja2luZyAtIHRoZXJlIG11c3QgYmUgaHRtbCkKCQlmdW5jdGlvbiAoIGQsIHNldHRpbmdzICkKCQl7CgkJCXJldHVybiBfZW1wdHkoIGQgKSB8fCAodHlwZW9mIGQgPT09ICdzdHJpbmcnICYmIGQuaW5kZXhPZignPCcpICE9PSAtMSkgPwoJCQkJJ2h0bWwnIDogbnVsbDsKCQl9CgldICk7CgkKCQoJCgkvLyBGaWx0ZXIgZm9ybWF0dGluZyBmdW5jdGlvbnMuIFNlZSBtb2RlbC5leHQub2ZuU2VhcmNoIGZvciBpbmZvcm1hdGlvbiBhYm91dAoJLy8gd2hhdCBpcyByZXF1aXJlZCBmcm9tIHRoZXNlIG1ldGhvZHMuCgkvLyAKCS8vIE5vdGUgdGhhdCBhZGRpdGlvbmFsIHNlYXJjaCBtZXRob2RzIGFyZSBhZGRlZCBmb3IgdGhlIGh0bWwgbnVtYmVycyBhbmQKCS8vIGh0bWwgZm9ybWF0dGVkIG51bWJlcnMgYnkgYF9hZGROdW1lcmljU29ydCgpYCB3aGVuIHdlIGtub3cgd2hhdCB0aGUgZGVjaW1hbAoJLy8gcGxhY2UgaXMKCQoJCgkkLmV4dGVuZCggRGF0YVRhYmxlLmV4dC50eXBlLnNlYXJjaCwgewoJCWh0bWw6IGZ1bmN0aW9uICggZGF0YSApIHsKCQkJcmV0dXJuIF9lbXB0eShkYXRhKSA/CgkJCQlkYXRhIDoKCQkJCXR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/CgkJCQkJZGF0YQoJCQkJCQkucmVwbGFjZSggX3JlX25ld19saW5lcywgIiAiICkKCQkJCQkJLnJlcGxhY2UoIF9yZV9odG1sLCAiIiApIDoKCQkJCQknJzsKCQl9LAoJCgkJc3RyaW5nOiBmdW5jdGlvbiAoIGRhdGEgKSB7CgkJCXJldHVybiBfZW1wdHkoZGF0YSkgPwoJCQkJZGF0YSA6CgkJCQl0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPwoJCQkJCWRhdGEucmVwbGFjZSggX3JlX25ld19saW5lcywgIiAiICkgOgoJCQkJCWRhdGE7CgkJfQoJfSApOwoJCgkKCQoJdmFyIF9fbnVtZXJpY1JlcGxhY2UgPSBmdW5jdGlvbiAoIGQsIGRlY2ltYWxQbGFjZSwgcmUxLCByZTIgKSB7CgkJaWYgKCBkICE9PSAwICYmICghZCB8fCBkID09PSAnLScpICkgewoJCQlyZXR1cm4gLUluZmluaXR5OwoJCX0KCQoJCS8vIElmIGEgZGVjaW1hbCBwbGFjZSBvdGhlciB0aGFuIGAuYCBpcyB1c2VkLCBpdCBuZWVkcyB0byBiZSBnaXZlbiB0byB0aGUKCQkvLyBmdW5jdGlvbiBzbyB3ZSBjYW4gZGV0ZWN0IGl0IGFuZCByZXBsYWNlIHdpdGggYSBgLmAgd2hpY2ggaXMgdGhlIG9ubHkKCQkvLyBkZWNpbWFsIHBsYWNlIEphdmFzY3JpcHQgcmVjb2duaXNlcyAtIGl0IGlzIG5vdCBsb2NhbGUgYXdhcmUuCgkJaWYgKCBkZWNpbWFsUGxhY2UgKSB7CgkJCWQgPSBfbnVtVG9EZWNpbWFsKCBkLCBkZWNpbWFsUGxhY2UgKTsKCQl9CgkKCQlpZiAoIGQucmVwbGFjZSApIHsKCQkJaWYgKCByZTEgKSB7CgkJCQlkID0gZC5yZXBsYWNlKCByZTEsICcnICk7CgkJCX0KCQoJCQlpZiAoIHJlMiApIHsKCQkJCWQgPSBkLnJlcGxhY2UoIHJlMiwgJycgKTsKCQkJfQoJCX0KCQoJCXJldHVybiBkICogMTsKCX07CgkKCQoJLy8gQWRkIHRoZSBudW1lcmljICdkZWZvcm1hdHRpbmcnIGZ1bmN0aW9ucyBmb3Igc29ydGluZyBhbmQgc2VhcmNoLiBUaGlzIGlzIGRvbmUKCS8vIGluIGEgZnVuY3Rpb24gdG8gcHJvdmlkZSBhbiBlYXN5IGFiaWxpdHkgZm9yIHRoZSBsYW5ndWFnZSBvcHRpb25zIHRvIGFkZAoJLy8gYWRkaXRpb25hbCBtZXRob2RzIGlmIGEgbm9uLXBlcmlvZCBkZWNpbWFsIHBsYWNlIGlzIHVzZWQuCglmdW5jdGlvbiBfYWRkTnVtZXJpY1NvcnQgKCBkZWNpbWFsUGxhY2UgKSB7CgkJJC5lYWNoKAoJCQl7CgkJCQkvLyBQbGFpbiBudW1iZXJzCgkJCQkibnVtIjogZnVuY3Rpb24gKCBkICkgewoJCQkJCXJldHVybiBfX251bWVyaWNSZXBsYWNlKCBkLCBkZWNpbWFsUGxhY2UgKTsKCQkJCX0sCgkKCQkJCS8vIEZvcm1hdHRlZCBudW1iZXJzCgkJCQkibnVtLWZtdCI6IGZ1bmN0aW9uICggZCApIHsKCQkJCQlyZXR1cm4gX19udW1lcmljUmVwbGFjZSggZCwgZGVjaW1hbFBsYWNlLCBfcmVfZm9ybWF0dGVkX251bWVyaWMgKTsKCQkJCX0sCgkKCQkJCS8vIEhUTUwgbnVtZXJpYwoJCQkJImh0bWwtbnVtIjogZnVuY3Rpb24gKCBkICkgewoJCQkJCXJldHVybiBfX251bWVyaWNSZXBsYWNlKCBkLCBkZWNpbWFsUGxhY2UsIF9yZV9odG1sICk7CgkJCQl9LAoJCgkJCQkvLyBIVE1MIG51bWVyaWMsIGZvcm1hdHRlZAoJCQkJImh0bWwtbnVtLWZtdCI6IGZ1bmN0aW9uICggZCApIHsKCQkJCQlyZXR1cm4gX19udW1lcmljUmVwbGFjZSggZCwgZGVjaW1hbFBsYWNlLCBfcmVfaHRtbCwgX3JlX2Zvcm1hdHRlZF9udW1lcmljICk7CgkJCQl9CgkJCX0sCgkJCWZ1bmN0aW9uICgga2V5LCBmbiApIHsKCQkJCS8vIEFkZCB0aGUgb3JkZXJpbmcgbWV0aG9kCgkJCQlfZXh0LnR5cGUub3JkZXJbIGtleStkZWNpbWFsUGxhY2UrJy1wcmUnIF0gPSBmbjsKCQoJCQkJLy8gRm9yIEhUTUwgdHlwZXMgYWRkIGEgc2VhcmNoIGZvcm1hdHRlciB0aGF0IHdpbGwgc3RyaXAgdGhlIEhUTUwKCQkJCWlmICgga2V5Lm1hdGNoKC9eaHRtbFwtLykgKSB7CgkJCQkJX2V4dC50eXBlLnNlYXJjaFsga2V5K2RlY2ltYWxQbGFjZSBdID0gX2V4dC50eXBlLnNlYXJjaC5odG1sOwoJCQkJfQoJCQl9CgkJKTsKCX0KCQoJCgkvLyBEZWZhdWx0IHNvcnQgbWV0aG9kcwoJJC5leHRlbmQoIF9leHQudHlwZS5vcmRlciwgewoJCS8vIERhdGVzCgkJImRhdGUtcHJlIjogZnVuY3Rpb24gKCBkICkgewoJCQl2YXIgdHMgPSBEYXRlLnBhcnNlKCBkICk7CgkJCXJldHVybiBpc05hTih0cykgPyAtSW5maW5pdHkgOiB0czsKCQl9LAoJCgkJLy8gaHRtbAoJCSJodG1sLXByZSI6IGZ1bmN0aW9uICggYSApIHsKCQkJcmV0dXJuIF9lbXB0eShhKSA/CgkJCQknJyA6CgkJCQlhLnJlcGxhY2UgPwoJCQkJCWEucmVwbGFjZSggLzwuKj8+L2csICIiICkudG9Mb3dlckNhc2UoKSA6CgkJCQkJYSsnJzsKCQl9LAoJCgkJLy8gc3RyaW5nCgkJInN0cmluZy1wcmUiOiBmdW5jdGlvbiAoIGEgKSB7CgkJCS8vIFRoaXMgaXMgYSBsaXR0bGUgY29tcGxleCwgYnV0IGZhc3RlciB0aGFuIGFsd2F5cyBjYWxsaW5nIHRvU3RyaW5nLAoJCQkvLyBodHRwOi8vanNwZXJmLmNvbS90b3N0cmluZy12LWNoZWNrCgkJCXJldHVybiBfZW1wdHkoYSkgPwoJCQkJJycgOgoJCQkJdHlwZW9mIGEgPT09ICdzdHJpbmcnID8KCQkJCQlhLnRvTG93ZXJDYXNlKCkgOgoJCQkJCSEgYS50b1N0cmluZyA/CgkJCQkJCScnIDoKCQkJCQkJYS50b1N0cmluZygpOwoJCX0sCgkKCQkvLyBzdHJpbmctYXNjIGFuZCAtZGVzYyBhcmUgcmV0YWluZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQKCQkvLyBzb3J0IG1ldGhvZHMKCQkic3RyaW5nLWFzYyI6IGZ1bmN0aW9uICggeCwgeSApIHsKCQkJcmV0dXJuICgoeCA8IHkpID8gLTEgOiAoKHggPiB5KSA/IDEgOiAwKSk7CgkJfSwKCQoJCSJzdHJpbmctZGVzYyI6IGZ1bmN0aW9uICggeCwgeSApIHsKCQkJcmV0dXJuICgoeCA8IHkpID8gMSA6ICgoeCA+IHkpID8gLTEgOiAwKSk7CgkJfQoJfSApOwoJCgkKCS8vIE51bWVyaWMgc29ydGluZyB0eXBlcyAtIG9yZGVyIGRvZXNuJ3QgbWF0dGVyIGhlcmUKCV9hZGROdW1lcmljU29ydCggJycgKTsKCQoJCgkkLmV4dGVuZCggdHJ1ZSwgRGF0YVRhYmxlLmV4dC5yZW5kZXJlciwgewoJCWhlYWRlcjogewoJCQlfOiBmdW5jdGlvbiAoIHNldHRpbmdzLCBjZWxsLCBjb2x1bW4sIGNsYXNzZXMgKSB7CgkJCQkvLyBObyBhZGRpdGlvbmFsIG1hcmstdXAgcmVxdWlyZWQKCQkJCS8vIEF0dGFjaCBhIHNvcnQgbGlzdGVuZXIgdG8gdXBkYXRlIG9uIHNvcnQgLSBub3RlIHRoYXQgdXNpbmcgdGhlCgkJCQkvLyBgRFRgIG5hbWVzcGFjZSB3aWxsIGFsbG93IHRoZSBldmVudCB0byBiZSByZW1vdmVkIGF1dG9tYXRpY2FsbHkKCQkJCS8vIG9uIGRlc3Ryb3ksIHdoaWxlIHRoZSBgZHRgIG5hbWVzcGFjZWQgZXZlbnQgaXMgdGhlIG9uZSB3ZSBhcmUKCQkJCS8vIGxpc3RlbmluZyBmb3IKCQkJCSQoc2V0dGluZ3MublRhYmxlKS5vbiggJ29yZGVyLmR0LkRUJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgkJCQkJaWYgKCBzZXR0aW5ncyAhPT0gY3R4ICkgeyAvLyBuZWVkIHRvIGNoZWNrIHRoaXMgdGhpcyBpcyB0aGUgaG9zdAoJCQkJCQlyZXR1cm47ICAgICAgICAgICAgICAgLy8gdGFibGUsIG5vdCBhIG5lc3RlZCBvbmUKCQkJCQl9CgkKCQkJCQl2YXIgY29sSWR4ID0gY29sdW1uLmlkeDsKCQoJCQkJCWNlbGwKCQkJCQkJLnJlbW92ZUNsYXNzKAoJCQkJCQkJY2xhc3Nlcy5zU29ydEFzYyArJyAnKwoJCQkJCQkJY2xhc3Nlcy5zU29ydERlc2MKCQkJCQkJKQoJCQkJCQkuYWRkQ2xhc3MoIGNvbHVtbnNbIGNvbElkeCBdID09ICdhc2MnID8KCQkJCQkJCWNsYXNzZXMuc1NvcnRBc2MgOiBjb2x1bW5zWyBjb2xJZHggXSA9PSAnZGVzYycgPwoJCQkJCQkJCWNsYXNzZXMuc1NvcnREZXNjIDoKCQkJCQkJCQljb2x1bW4uc1NvcnRpbmdDbGFzcwoJCQkJCQkpOwoJCQkJfSApOwoJCQl9LAoJCgkJCWpxdWVyeXVpOiBmdW5jdGlvbiAoIHNldHRpbmdzLCBjZWxsLCBjb2x1bW4sIGNsYXNzZXMgKSB7CgkJCQkkKCc8ZGl2Lz4nKQoJCQkJCS5hZGRDbGFzcyggY2xhc3Nlcy5zU29ydEpVSVdyYXBwZXIgKQoJCQkJCS5hcHBlbmQoIGNlbGwuY29udGVudHMoKSApCgkJCQkJLmFwcGVuZCggJCgnPHNwYW4vPicpCgkJCQkJCS5hZGRDbGFzcyggY2xhc3Nlcy5zU29ydEljb24rJyAnK2NvbHVtbi5zU29ydGluZ0NsYXNzSlVJICkKCQkJCQkpCgkJCQkJLmFwcGVuZFRvKCBjZWxsICk7CgkKCQkJCS8vIEF0dGFjaCBhIHNvcnQgbGlzdGVuZXIgdG8gdXBkYXRlIG9uIHNvcnQKCQkJCSQoc2V0dGluZ3MublRhYmxlKS5vbiggJ29yZGVyLmR0LkRUJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgkJCQkJaWYgKCBzZXR0aW5ncyAhPT0gY3R4ICkgewoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCgkJCQkJdmFyIGNvbElkeCA9IGNvbHVtbi5pZHg7CgkKCQkJCQljZWxsCgkJCQkJCS5yZW1vdmVDbGFzcyggY2xhc3Nlcy5zU29ydEFzYyArIiAiK2NsYXNzZXMuc1NvcnREZXNjICkKCQkJCQkJLmFkZENsYXNzKCBjb2x1bW5zWyBjb2xJZHggXSA9PSAnYXNjJyA/CgkJCQkJCQljbGFzc2VzLnNTb3J0QXNjIDogY29sdW1uc1sgY29sSWR4IF0gPT0gJ2Rlc2MnID8KCQkJCQkJCQljbGFzc2VzLnNTb3J0RGVzYyA6CgkJCQkJCQkJY29sdW1uLnNTb3J0aW5nQ2xhc3MKCQkJCQkJKTsKCQoJCQkJCWNlbGwKCQkJCQkJLmZpbmQoICdzcGFuLicrY2xhc3Nlcy5zU29ydEljb24gKQoJCQkJCQkucmVtb3ZlQ2xhc3MoCgkJCQkJCQljbGFzc2VzLnNTb3J0SlVJQXNjICsiICIrCgkJCQkJCQljbGFzc2VzLnNTb3J0SlVJRGVzYyArIiAiKwoJCQkJCQkJY2xhc3Nlcy5zU29ydEpVSSArIiAiKwoJCQkJCQkJY2xhc3Nlcy5zU29ydEpVSUFzY0FsbG93ZWQgKyIgIisKCQkJCQkJCWNsYXNzZXMuc1NvcnRKVUlEZXNjQWxsb3dlZAoJCQkJCQkpCgkJCQkJCS5hZGRDbGFzcyggY29sdW1uc1sgY29sSWR4IF0gPT0gJ2FzYycgPwoJCQkJCQkJY2xhc3Nlcy5zU29ydEpVSUFzYyA6IGNvbHVtbnNbIGNvbElkeCBdID09ICdkZXNjJyA/CgkJCQkJCQkJY2xhc3Nlcy5zU29ydEpVSURlc2MgOgoJCQkJCQkJCWNvbHVtbi5zU29ydGluZ0NsYXNzSlVJCgkJCQkJCSk7CgkJCQl9ICk7CgkJCX0KCQl9Cgl9ICk7CgkKCS8qCgkgKiBQdWJsaWMgaGVscGVyIGZ1bmN0aW9ucy4gVGhlc2UgYXJlbid0IHVzZWQgaW50ZXJuYWxseSBieSBEYXRhVGFibGVzLCBvcgoJICogY2FsbGVkIGJ5IGFueSBvZiB0aGUgb3B0aW9ucyBwYXNzZWQgaW50byBEYXRhVGFibGVzLCBidXQgdGhleSBjYW4gYmUgdXNlZAoJICogZXh0ZXJuYWxseSBieSBkZXZlbG9wZXJzIHdvcmtpbmcgd2l0aCBEYXRhVGFibGVzLiBUaGV5IGFyZSBoZWxwZXIgZnVuY3Rpb25zCgkgKiB0byBtYWtlIHdvcmtpbmcgd2l0aCBEYXRhVGFibGVzIGEgbGl0dGxlIGJpdCBlYXNpZXIuCgkgKi8KCQoJdmFyIF9faHRtbEVzY2FwZUVudGl0aWVzID0gZnVuY3Rpb24gKCBkICkgewoJCWlmIChBcnJheS5pc0FycmF5KGQpKSB7CgkJCWQgPSBkLmpvaW4oJywnKTsKCQl9CgkKCQlyZXR1cm4gdHlwZW9mIGQgPT09ICdzdHJpbmcnID8KCQkJZAoJCQkJLnJlcGxhY2UoLyYvZywgJyZhbXA7JykKCQkJCS5yZXBsYWNlKC88L2csICcmbHQ7JykKCQkJCS5yZXBsYWNlKC8+L2csICcmZ3Q7JykKCQkJCS5yZXBsYWNlKC8iL2csICcmcXVvdDsnKSA6CgkJCWQ7Cgl9OwoJCgkvLyBDb21tb24gbG9naWMgZm9yIG1vbWVudCwgbHV4b24gb3IgYSBkYXRlIGFjdGlvbgoJZnVuY3Rpb24gX19tbGQoIGR0LCBtb21lbnRGbiwgbHV4b25GbiwgZGF0ZUZuLCBhcmcxICkgewoJCWlmICh3aW5kb3cubW9tZW50KSB7CgkJCXJldHVybiBkdFttb21lbnRGbl0oIGFyZzEgKTsKCQl9CgkJZWxzZSBpZiAod2luZG93Lmx1eG9uKSB7CgkJCXJldHVybiBkdFtsdXhvbkZuXSggYXJnMSApOwoJCX0KCQkKCQlyZXR1cm4gZGF0ZUZuID8gZHRbZGF0ZUZuXSggYXJnMSApIDogZHQ7Cgl9CgkKCQoJdmFyIF9fbWxXYXJuaW5nID0gZmFsc2U7CglmdW5jdGlvbiBfX21sZE9iaiAoZCwgZm9ybWF0LCBsb2NhbGUpIHsKCQl2YXIgZHQ7CgkKCQlpZiAod2luZG93Lm1vbWVudCkgewoJCQlkdCA9IHdpbmRvdy5tb21lbnQudXRjKCBkLCBmb3JtYXQsIGxvY2FsZSwgdHJ1ZSApOwoJCgkJCWlmICghIGR0LmlzVmFsaWQoKSkgewoJCQkJcmV0dXJuIG51bGw7CgkJCX0KCQl9CgkJZWxzZSBpZiAod2luZG93Lmx1eG9uKSB7CgkJCWR0ID0gZm9ybWF0CgkJCQk/IHdpbmRvdy5sdXhvbi5EYXRlVGltZS5mcm9tRm9ybWF0KCBkLCBmb3JtYXQgKQoJCQkJOiB3aW5kb3cubHV4b24uRGF0ZVRpbWUuZnJvbUlTTyggZCApOwoJCgkJCWlmICghIGR0LmlzVmFsaWQpIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgkKCQkJZHQuc2V0TG9jYWxlKGxvY2FsZSk7CgkJfQoJCWVsc2UgaWYgKCEgZm9ybWF0KSB7CgkJCS8vIE5vIGZvcm1hdCBnaXZlbiwgbXVzdCBiZSBJU08KCQkJZHQgPSBuZXcgRGF0ZShkKTsKCQl9CgkJZWxzZSB7CgkJCWlmICghIF9fbWxXYXJuaW5nKSB7CgkJCQlhbGVydCgnRGF0YVRhYmxlcyB3YXJuaW5nOiBGb3JtYXR0ZWQgZGF0ZSB3aXRob3V0IE1vbWVudC5qcyBvciBMdXhvbiAtIGh0dHBzOi8vZGF0YXRhYmxlcy5uZXQvdG4vMTcnKTsKCQkJfQoJCgkJCV9fbWxXYXJuaW5nID0gdHJ1ZTsKCQl9CgkKCQlyZXR1cm4gZHQ7Cgl9CgkKCS8vIFdyYXBwZXIgZm9yIGRhdGUsIGRhdGV0aW1lIGFuZCB0aW1lIHdoaWNoIGFsbCBvcGVyYXRlIHRoZSBzYW1lIHdheSB3aXRoIHRoZSBleGNlcHRpb24gb2YKCS8vIHRoZSBvdXRwdXQgc3RyaW5nIGZvciBhdXRvIGxvY2FsZSBzdXBwb3J0CglmdW5jdGlvbiBfX21sSGVscGVyIChsb2NhbGVTdHJpbmcpIHsKCQlyZXR1cm4gZnVuY3Rpb24gKCBmcm9tLCB0bywgbG9jYWxlLCBkZWYgKSB7CgkJCS8vIEx1eG9uIGFuZCBNb21lbnQgc3VwcG9ydAoJCQkvLyBBcmd1bWVudCBzaGlmdGluZwoJCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDAgKSB7CgkJCQlsb2NhbGUgPSAnZW4nOwoJCQkJdG8gPSBudWxsOyAvLyBtZWFucyB0b0xvY2FsZVN0cmluZwoJCQkJZnJvbSA9IG51bGw7IC8vIG1lYW5zIGlzbzg2MDEKCQkJfQoJCQllbHNlIGlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCWxvY2FsZSA9ICdlbic7CgkJCQl0byA9IGZyb207CgkJCQlmcm9tID0gbnVsbDsKCQkJfQoJCQllbHNlIGlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMiApIHsKCQkJCWxvY2FsZSA9IHRvOwoJCQkJdG8gPSBmcm9tOwoJCQkJZnJvbSA9IG51bGw7CgkJCX0KCQoJCQl2YXIgdHlwZU5hbWUgPSAnZGF0ZXRpbWUtJyArIHRvOwoJCgkJCS8vIEFkZCB0eXBlIGRldGVjdGlvbiBhbmQgc29ydGluZyBzcGVjaWZpYyB0byB0aGlzIGRhdGUgZm9ybWF0IC0gd2UgbmVlZCB0byBiZSBhYmxlIHRvIGlkZW50aWZ5CgkJCS8vIGRhdGUgdHlwZSBjb2x1bW5zIGFzIHN1Y2gsIHJhdGhlciB0aGFuIGFzIG51bWJlcnMgaW4gZXh0ZW5zaW9ucy4gSGVuY2UgdGhlIG5lZWQgZm9yIHRoaXMuCgkJCWlmICghIERhdGFUYWJsZS5leHQudHlwZS5vcmRlclt0eXBlTmFtZV0pIHsKCQkJCS8vIFRoZSByZW5kZXJlciB3aWxsIGdpdmUgdGhlIHZhbHVlIHRvIHR5cGUgZGV0ZWN0IGFzIHRoZSB0eXBlIQoJCQkJRGF0YVRhYmxlLmV4dC50eXBlLmRldGVjdC51bnNoaWZ0KGZ1bmN0aW9uIChkKSB7CgkJCQkJcmV0dXJuIGQgPT09IHR5cGVOYW1lID8gdHlwZU5hbWUgOiBmYWxzZTsKCQkJCX0pOwoJCgkJCQkvLyBUaGUgcmVuZGVyZXIgZ2l2ZXMgdXMgTW9tZW50LCBMdXhvbiBvciBEYXRlIG9iZWN0cyBmb3IgdGhlIHNvcnRpbmcsIGFsbCBvZiB3aGljaCBoYXZlIGEKCQkJCS8vIGB2YWx1ZU9mYCB3aGljaCBnaXZlcyBtaWxsaXNlY29uZHMgZXBvY2gKCQkJCURhdGFUYWJsZS5leHQudHlwZS5vcmRlclt0eXBlTmFtZSArICctYXNjJ10gPSBmdW5jdGlvbiAoYSwgYikgewoJCQkJCXZhciB4ID0gYS52YWx1ZU9mKCk7CgkJCQkJdmFyIHkgPSBiLnZhbHVlT2YoKTsKCQoJCQkJCXJldHVybiB4ID09PSB5CgkJCQkJCT8gMAoJCQkJCQk6IHggPCB5CgkJCQkJCQk/IC0xCgkJCQkJCQk6IDE7CgkJCQl9CgkKCQkJCURhdGFUYWJsZS5leHQudHlwZS5vcmRlclt0eXBlTmFtZSArICctZGVzYyddID0gZnVuY3Rpb24gKGEsIGIpIHsKCQkJCQl2YXIgeCA9IGEudmFsdWVPZigpOwoJCQkJCXZhciB5ID0gYi52YWx1ZU9mKCk7CgkKCQkJCQlyZXR1cm4geCA9PT0geQoJCQkJCQk/IDAKCQkJCQkJOiB4ID4geQoJCQkJCQkJPyAtMQoJCQkJCQkJOiAxOwoJCQkJfQoJCQl9CgkJCgkJCXJldHVybiBmdW5jdGlvbiAoIGQsIHR5cGUgKSB7CgkJCQkvLyBBbGxvdyBmb3IgYSBkZWZhdWx0IHZhbHVlCgkJCQlpZiAoZCA9PT0gbnVsbCB8fCBkID09PSB1bmRlZmluZWQpIHsKCQkJCQlpZiAoZGVmID09PSAnLS1ub3cnKSB7CgkJCQkJCS8vIFdlIHRyZWF0IGV2ZXJ5dGhpbmcgYXMgVVRDIGZ1cnRoZXIgZG93biwgc28gbm8gY2hhbmdlcyBhcmUKCQkJCQkJLy8gbWFkZSwgYXMgc3VjaCBuZWVkIHRvIGdldCB0aGUgbG9jYWwgZGF0ZSAvIHRpbWUgYXMgaWYgaXQgd2VyZQoJCQkJCQkvLyBVVEMKCQkJCQkJdmFyIGxvY2FsID0gbmV3IERhdGUoKTsKCQkJCQkJZCA9IG5ldyBEYXRlKCBEYXRlLlVUQygKCQkJCQkJCWxvY2FsLmdldEZ1bGxZZWFyKCksIGxvY2FsLmdldE1vbnRoKCksIGxvY2FsLmdldERhdGUoKSwKCQkJCQkJCWxvY2FsLmdldEhvdXJzKCksIGxvY2FsLmdldE1pbnV0ZXMoKSwgbG9jYWwuZ2V0U2Vjb25kcygpCgkJCQkJCSkgKTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCWQgPSAnJzsKCQkJCQl9CgkJCQl9CgkKCQkJCWlmICh0eXBlID09PSAndHlwZScpIHsKCQkJCQkvLyBUeXBpbmcgdXNlcyB0aGUgdHlwZSBuYW1lIGZvciBmYXN0IG1hdGNoaW5nCgkJCQkJcmV0dXJuIHR5cGVOYW1lOwoJCQkJfQoJCgkJCQlpZiAoZCA9PT0gJycpIHsKCQkJCQlyZXR1cm4gdHlwZSAhPT0gJ3NvcnQnCgkJCQkJCT8gJycKCQkJCQkJOiBfX21sZE9iaignMDAwMC0wMS0wMSAwMDowMDowMCcsIG51bGwsIGxvY2FsZSk7CgkJCQl9CgkKCQkJCS8vIFNob3J0Y3V0LiBJZiBgZnJvbWAgYW5kIGB0b2AgYXJlIHRoZSBzYW1lLCB3ZSBhcmUgdXNpbmcgdGhlIHJlbmRlcmVyIHRvCgkJCQkvLyBmb3JtYXQgZm9yIG9yZGVyaW5nLCBub3QgZGlzcGxheSAtIGl0cyBhbHJlYWR5IGluIHRoZSBkaXNwbGF5IGZvcm1hdC4KCQkJCWlmICggdG8gIT09IG51bGwgJiYgZnJvbSA9PT0gdG8gJiYgdHlwZSAhPT0gJ3NvcnQnICYmIHR5cGUgIT09ICd0eXBlJyAmJiAhIChkIGluc3RhbmNlb2YgRGF0ZSkgKSB7CgkJCQkJcmV0dXJuIGQ7CgkJCQl9CgkKCQkJCXZhciBkdCA9IF9fbWxkT2JqKGQsIGZyb20sIGxvY2FsZSk7CgkKCQkJCWlmIChkdCA9PT0gbnVsbCkgewoJCQkJCXJldHVybiBkOwoJCQkJfQoJCgkJCQlpZiAodHlwZSA9PT0gJ3NvcnQnKSB7CgkJCQkJcmV0dXJuIGR0OwoJCQkJfQoJCQkJCgkJCQl2YXIgZm9ybWF0dGVkID0gdG8gPT09IG51bGwKCQkJCQk/IF9fbWxkKGR0LCAndG9EYXRlJywgJ3RvSlNEYXRlJywgJycpW2xvY2FsZVN0cmluZ10oKQoJCQkJCTogX19tbGQoZHQsICdmb3JtYXQnLCAndG9Gb3JtYXQnLCAndG9JU09TdHJpbmcnLCB0byk7CgkKCQkJCS8vIFhTUyBwcm90ZWN0aW9uCgkJCQlyZXR1cm4gdHlwZSA9PT0gJ2Rpc3BsYXknID8KCQkJCQlfX2h0bWxFc2NhcGVFbnRpdGllcyggZm9ybWF0dGVkICkgOgoJCQkJCWZvcm1hdHRlZDsKCQkJfTsKCQl9Cgl9CgkKCS8vIEJhc2VkIG9uIGxvY2FsZSwgZGV0ZXJtaW5lIHN0YW5kYXJkIG51bWJlciBmb3JtYXR0aW5nCgkvLyBGYWxsYmFjayBmb3IgbGVnYWN5IGJyb3dzZXJzIGlzIFVTIEVuZ2xpc2gKCXZhciBfX3Rob3VzYW5kcyA9ICcsJzsKCXZhciBfX2RlY2ltYWwgPSAnLic7CgkKCWlmIChJbnRsKSB7CgkJdHJ5IHsKCQkJdmFyIG51bSA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdFRvUGFydHMoMTAwMDAwLjEpOwoJCQoJCQlmb3IgKHZhciBpPTAgOyBpPG51bS5sZW5ndGggOyBpKyspIHsKCQkJCWlmIChudW1baV0udHlwZSA9PT0gJ2dyb3VwJykgewoJCQkJCV9fdGhvdXNhbmRzID0gbnVtW2ldLnZhbHVlOwoJCQkJfQoJCQkJZWxzZSBpZiAobnVtW2ldLnR5cGUgPT09ICdkZWNpbWFsJykgewoJCQkJCV9fZGVjaW1hbCA9IG51bVtpXS52YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCQljYXRjaCAoZSkgewoJCQkvLyBub29wCgkJfQoJfQoJCgkvLyBGb3JtYXR0ZWQgZGF0ZSB0aW1lIGRldGVjdGlvbiAtIHVzZSBieSBkZWNsYXJpbmcgdGhlIGZvcm1hdHMgeW91IGFyZSBnb2luZyB0byB1c2UKCURhdGFUYWJsZS5kYXRldGltZSA9IGZ1bmN0aW9uICggZm9ybWF0LCBsb2NhbGUgKSB7CgkJdmFyIHR5cGVOYW1lID0gJ2RhdGV0aW1lLWRldGVjdC0nICsgZm9ybWF0OwoJCgkJaWYgKCEgbG9jYWxlKSB7CgkJCWxvY2FsZSA9ICdlbic7CgkJfQoJCgkJaWYgKCEgRGF0YVRhYmxlLmV4dC50eXBlLm9yZGVyW3R5cGVOYW1lXSkgewoJCQlEYXRhVGFibGUuZXh0LnR5cGUuZGV0ZWN0LnVuc2hpZnQoZnVuY3Rpb24gKGQpIHsKCQkJCXZhciBkdCA9IF9fbWxkT2JqKGQsIGZvcm1hdCwgbG9jYWxlKTsKCQkJCXJldHVybiBkID09PSAnJyB8fCBkdCA/IHR5cGVOYW1lIDogZmFsc2U7CgkJCX0pOwoJCgkJCURhdGFUYWJsZS5leHQudHlwZS5vcmRlclt0eXBlTmFtZSArICctcHJlJ10gPSBmdW5jdGlvbiAoZCkgewoJCQkJcmV0dXJuIF9fbWxkT2JqKGQsIGZvcm1hdCwgbG9jYWxlKSB8fCAwOwoJCQl9CgkJfQoJfQoJCgkvKioKCSAqIEhlbHBlcnMgZm9yIGBjb2x1bW5zLnJlbmRlcmAuCgkgKgoJICogVGhlIG9wdGlvbnMgZGVmaW5lZCBoZXJlIGNhbiBiZSB1c2VkIHdpdGggdGhlIGBjb2x1bW5zLnJlbmRlcmAgaW5pdGlhbGlzYXRpb24KCSAqIG9wdGlvbiB0byBwcm92aWRlIGEgZGlzcGxheSByZW5kZXJlci4gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGRlZmluZWQ6CgkgKgoJICogKiBgbnVtYmVyYCAtIFdpbGwgZm9ybWF0IG51bWVyaWMgZGF0YSAoZGVmaW5lZCBieSBgY29sdW1ucy5kYXRhYCkgZm9yCgkgKiAgIGRpc3BsYXksIHJldGFpbmluZyB0aGUgb3JpZ2luYWwgdW5mb3JtYXR0ZWQgZGF0YSBmb3Igc29ydGluZyBhbmQgZmlsdGVyaW5nLgoJICogICBJdCB0YWtlcyA1IHBhcmFtZXRlcnM6CgkgKiAgICogYHN0cmluZ2AgLSBUaG91c2FuZHMgZ3JvdXBpbmcgc2VwYXJhdG9yCgkgKiAgICogYHN0cmluZ2AgLSBEZWNpbWFsIHBvaW50IGluZGljYXRvcgoJICogICAqIGBpbnRlZ2VyYCAtIE51bWJlciBvZiBkZWNpbWFsIHBvaW50cyB0byBzaG93CgkgKiAgICogYHN0cmluZ2AgKG9wdGlvbmFsKSAtIFByZWZpeC4KCSAqICAgKiBgc3RyaW5nYCAob3B0aW9uYWwpIC0gUG9zdGZpeCAoL3N1ZmZpeCkuCgkgKiAqIGB0ZXh0YCAtIEVzY2FwZSBIVE1MIHRvIGhlbHAgcHJldmVudCBYU1MgYXR0YWNrcy4gSXQgaGFzIG5vIG9wdGlvbmFsCgkgKiAgIHBhcmFtZXRlcnMuCgkgKgoJICogQGV4YW1wbGUKCSAqICAgLy8gQ29sdW1uIGRlZmluaXRpb24gdXNpbmcgdGhlIG51bWJlciByZW5kZXJlcgoJICogICB7CgkgKiAgICAgZGF0YTogInNhbGFyeSIsCgkgKiAgICAgcmVuZGVyOiAkLmZuLmRhdGFUYWJsZS5yZW5kZXIubnVtYmVyKCAnXCcnLCAnLicsIDAsICckJyApCgkgKiAgIH0KCSAqCgkgKiBAbmFtZXNwYWNlCgkgKi8KCURhdGFUYWJsZS5yZW5kZXIgPSB7CgkJZGF0ZTogX19tbEhlbHBlcigndG9Mb2NhbGVEYXRlU3RyaW5nJyksCgkJZGF0ZXRpbWU6IF9fbWxIZWxwZXIoJ3RvTG9jYWxlU3RyaW5nJyksCgkJdGltZTogX19tbEhlbHBlcigndG9Mb2NhbGVUaW1lU3RyaW5nJyksCgkJbnVtYmVyOiBmdW5jdGlvbiAoIHRob3VzYW5kcywgZGVjaW1hbCwgcHJlY2lzaW9uLCBwcmVmaXgsIHBvc3RmaXggKSB7CgkJCS8vIEF1dG8gbG9jYWxlIGRldGVjdGlvbgoJCQlpZiAodGhvdXNhbmRzID09PSBudWxsIHx8IHRob3VzYW5kcyA9PT0gdW5kZWZpbmVkKSB7CgkJCQl0aG91c2FuZHMgPSBfX3Rob3VzYW5kczsKCQkJfQoJCgkJCWlmIChkZWNpbWFsID09PSBudWxsIHx8IGRlY2ltYWwgPT09IHVuZGVmaW5lZCkgewoJCQkJZGVjaW1hbCA9IF9fZGVjaW1hbDsKCQkJfQoJCgkJCXJldHVybiB7CgkJCQlkaXNwbGF5OiBmdW5jdGlvbiAoIGQgKSB7CgkJCQkJaWYgKCB0eXBlb2YgZCAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGQgIT09ICdzdHJpbmcnICkgewoJCQkJCQlyZXR1cm4gZDsKCQkJCQl9CgkKCQkJCQlpZiAoZCA9PT0gJycgfHwgZCA9PT0gbnVsbCkgewoJCQkJCQlyZXR1cm4gZDsKCQkJCQl9CgkKCQkJCQl2YXIgbmVnYXRpdmUgPSBkIDwgMCA/ICctJyA6ICcnOwoJCQkJCXZhciBmbG8gPSBwYXJzZUZsb2F0KCBkICk7CgkKCQkJCQkvLyBJZiBOYU4gdGhlbiB0aGVyZSBpc24ndCBtdWNoIGZvcm1hdHRpbmcgdGhhdCB3ZSBjYW4gZG8gLSBqdXN0CgkJCQkJLy8gcmV0dXJuIGltbWVkaWF0ZWx5LCBlc2NhcGluZyBhbnkgSFRNTCAodGhpcyB3YXMgc3VwcG9zZWQgdG8KCQkJCQkvLyBiZSBhIG51bWJlciBhZnRlciBhbGwpCgkJCQkJaWYgKCBpc05hTiggZmxvICkgKSB7CgkJCQkJCXJldHVybiBfX2h0bWxFc2NhcGVFbnRpdGllcyggZCApOwoJCQkJCX0KCQoJCQkJCWZsbyA9IGZsby50b0ZpeGVkKCBwcmVjaXNpb24gKTsKCQkJCQlkID0gTWF0aC5hYnMoIGZsbyApOwoJCgkJCQkJdmFyIGludFBhcnQgPSBwYXJzZUludCggZCwgMTAgKTsKCQkJCQl2YXIgZmxvYXRQYXJ0ID0gcHJlY2lzaW9uID8KCQkJCQkJZGVjaW1hbCsoZCAtIGludFBhcnQpLnRvRml4ZWQoIHByZWNpc2lvbiApLnN1YnN0cmluZyggMiApOgoJCQkJCQknJzsKCQoJCQkJCS8vIElmIHplcm8sIHRoZW4gY2FuJ3QgaGF2ZSBhIG5lZ2F0aXZlIHByZWZpeAoJCQkJCWlmIChpbnRQYXJ0ID09PSAwICYmIHBhcnNlRmxvYXQoZmxvYXRQYXJ0KSA9PT0gMCkgewoJCQkJCQluZWdhdGl2ZSA9ICcnOwoJCQkJCX0KCQoJCQkJCXJldHVybiBuZWdhdGl2ZSArIChwcmVmaXh8fCcnKSArCgkJCQkJCWludFBhcnQudG9TdHJpbmcoKS5yZXBsYWNlKAoJCQkJCQkJL1xCKD89KFxkezN9KSsoPyFcZCkpL2csIHRob3VzYW5kcwoJCQkJCQkpICsKCQkJCQkJZmxvYXRQYXJ0ICsKCQkJCQkJKHBvc3RmaXh8fCcnKTsKCQkJCX0KCQkJfTsKCQl9LAoJCgkJdGV4dDogZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gewoJCQkJZGlzcGxheTogX19odG1sRXNjYXBlRW50aXRpZXMsCgkJCQlmaWx0ZXI6IF9faHRtbEVzY2FwZUVudGl0aWVzCgkJCX07CgkJfQoJfTsKCQoJCgkvKgoJICogVGhpcyBpcyByZWFsbHkgYSBnb29kIGJpdCBydWJiaXNoIHRoaXMgbWV0aG9kIG9mIGV4cG9zaW5nIHRoZSBpbnRlcm5hbCBtZXRob2RzCgkgKiBwdWJsaWNseS4uLiAtIFRvIGJlIGZpeGVkIGluIDIuMCB1c2luZyBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUKCSAqLwoJCgkKCS8qKgoJICogQ3JlYXRlIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgZXhwb3J0aW5nIGFuIGludGVybmFsIGZ1bmN0aW9ucyB0byBhbiBleHRlcm5hbCBBUEkuCgkgKiAgQHBhcmFtIHtzdHJpbmd9IGZuIEFQSSBmdW5jdGlvbiBuYW1lCgkgKiAgQHJldHVybnMge2Z1bmN0aW9ufSB3cmFwcGVkIGZ1bmN0aW9uCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNpbnRlcm5hbAoJICovCglmdW5jdGlvbiBfZm5FeHRlcm5BcGlGdW5jIChmbikKCXsKCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCXZhciBhcmdzID0gW19mblNldHRpbmdzRnJvbU5vZGUoIHRoaXNbRGF0YVRhYmxlLmV4dC5pQXBpSW5kZXhdICldLmNvbmNhdCgKCQkJCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykKCQkJKTsKCQkJcmV0dXJuIERhdGFUYWJsZS5leHQuaW50ZXJuYWxbZm5dLmFwcGx5KCB0aGlzLCBhcmdzICk7CgkJfTsKCX0KCQoJCgkvKioKCSAqIFJlZmVyZW5jZSB0byBpbnRlcm5hbCBmdW5jdGlvbnMgZm9yIHVzZSBieSBwbHVnLWluIGRldmVsb3BlcnMuIE5vdGUgdGhhdAoJICogdGhlc2UgbWV0aG9kcyBhcmUgcmVmZXJlbmNlcyB0byBpbnRlcm5hbCBmdW5jdGlvbnMgYW5kIGFyZSBjb25zaWRlcmVkIHRvIGJlCgkgKiBwcml2YXRlLiBJZiB5b3UgdXNlIHRoZXNlIG1ldGhvZHMsIGJlIGF3YXJlIHRoYXQgdGhleSBhcmUgbGlhYmxlIHRvIGNoYW5nZQoJICogYmV0d2VlbiB2ZXJzaW9ucy4KCSAqICBAbmFtZXNwYWNlCgkgKi8KCSQuZXh0ZW5kKCBEYXRhVGFibGUuZXh0LmludGVybmFsLCB7CgkJX2ZuRXh0ZXJuQXBpRnVuYzogX2ZuRXh0ZXJuQXBpRnVuYywKCQlfZm5CdWlsZEFqYXg6IF9mbkJ1aWxkQWpheCwKCQlfZm5BamF4VXBkYXRlOiBfZm5BamF4VXBkYXRlLAoJCV9mbkFqYXhQYXJhbWV0ZXJzOiBfZm5BamF4UGFyYW1ldGVycywKCQlfZm5BamF4VXBkYXRlRHJhdzogX2ZuQWpheFVwZGF0ZURyYXcsCgkJX2ZuQWpheERhdGFTcmM6IF9mbkFqYXhEYXRhU3JjLAoJCV9mbkFkZENvbHVtbjogX2ZuQWRkQ29sdW1uLAoJCV9mbkNvbHVtbk9wdGlvbnM6IF9mbkNvbHVtbk9wdGlvbnMsCgkJX2ZuQWRqdXN0Q29sdW1uU2l6aW5nOiBfZm5BZGp1c3RDb2x1bW5TaXppbmcsCgkJX2ZuVmlzaWJsZVRvQ29sdW1uSW5kZXg6IF9mblZpc2libGVUb0NvbHVtbkluZGV4LAoJCV9mbkNvbHVtbkluZGV4VG9WaXNpYmxlOiBfZm5Db2x1bW5JbmRleFRvVmlzaWJsZSwKCQlfZm5WaXNibGVDb2x1bW5zOiBfZm5WaXNibGVDb2x1bW5zLAoJCV9mbkdldENvbHVtbnM6IF9mbkdldENvbHVtbnMsCgkJX2ZuQ29sdW1uVHlwZXM6IF9mbkNvbHVtblR5cGVzLAoJCV9mbkFwcGx5Q29sdW1uRGVmczogX2ZuQXBwbHlDb2x1bW5EZWZzLAoJCV9mbkh1bmdhcmlhbk1hcDogX2ZuSHVuZ2FyaWFuTWFwLAoJCV9mbkNhbWVsVG9IdW5nYXJpYW46IF9mbkNhbWVsVG9IdW5nYXJpYW4sCgkJX2ZuTGFuZ3VhZ2VDb21wYXQ6IF9mbkxhbmd1YWdlQ29tcGF0LAoJCV9mbkJyb3dzZXJEZXRlY3Q6IF9mbkJyb3dzZXJEZXRlY3QsCgkJX2ZuQWRkRGF0YTogX2ZuQWRkRGF0YSwKCQlfZm5BZGRUcjogX2ZuQWRkVHIsCgkJX2ZuTm9kZVRvRGF0YUluZGV4OiBfZm5Ob2RlVG9EYXRhSW5kZXgsCgkJX2ZuTm9kZVRvQ29sdW1uSW5kZXg6IF9mbk5vZGVUb0NvbHVtbkluZGV4LAoJCV9mbkdldENlbGxEYXRhOiBfZm5HZXRDZWxsRGF0YSwKCQlfZm5TZXRDZWxsRGF0YTogX2ZuU2V0Q2VsbERhdGEsCgkJX2ZuU3BsaXRPYmpOb3RhdGlvbjogX2ZuU3BsaXRPYmpOb3RhdGlvbiwKCQlfZm5HZXRPYmplY3REYXRhRm46IF9mbkdldE9iamVjdERhdGFGbiwKCQlfZm5TZXRPYmplY3REYXRhRm46IF9mblNldE9iamVjdERhdGFGbiwKCQlfZm5HZXREYXRhTWFzdGVyOiBfZm5HZXREYXRhTWFzdGVyLAoJCV9mbkNsZWFyVGFibGU6IF9mbkNsZWFyVGFibGUsCgkJX2ZuRGVsZXRlSW5kZXg6IF9mbkRlbGV0ZUluZGV4LAoJCV9mbkludmFsaWRhdGU6IF9mbkludmFsaWRhdGUsCgkJX2ZuR2V0Um93RWxlbWVudHM6IF9mbkdldFJvd0VsZW1lbnRzLAoJCV9mbkNyZWF0ZVRyOiBfZm5DcmVhdGVUciwKCQlfZm5CdWlsZEhlYWQ6IF9mbkJ1aWxkSGVhZCwKCQlfZm5EcmF3SGVhZDogX2ZuRHJhd0hlYWQsCgkJX2ZuRHJhdzogX2ZuRHJhdywKCQlfZm5SZURyYXc6IF9mblJlRHJhdywKCQlfZm5BZGRPcHRpb25zSHRtbDogX2ZuQWRkT3B0aW9uc0h0bWwsCgkJX2ZuRGV0ZWN0SGVhZGVyOiBfZm5EZXRlY3RIZWFkZXIsCgkJX2ZuR2V0VW5pcXVlVGhzOiBfZm5HZXRVbmlxdWVUaHMsCgkJX2ZuRmVhdHVyZUh0bWxGaWx0ZXI6IF9mbkZlYXR1cmVIdG1sRmlsdGVyLAoJCV9mbkZpbHRlckNvbXBsZXRlOiBfZm5GaWx0ZXJDb21wbGV0ZSwKCQlfZm5GaWx0ZXJDdXN0b206IF9mbkZpbHRlckN1c3RvbSwKCQlfZm5GaWx0ZXJDb2x1bW46IF9mbkZpbHRlckNvbHVtbiwKCQlfZm5GaWx0ZXI6IF9mbkZpbHRlciwKCQlfZm5GaWx0ZXJDcmVhdGVTZWFyY2g6IF9mbkZpbHRlckNyZWF0ZVNlYXJjaCwKCQlfZm5Fc2NhcGVSZWdleDogX2ZuRXNjYXBlUmVnZXgsCgkJX2ZuRmlsdGVyRGF0YTogX2ZuRmlsdGVyRGF0YSwKCQlfZm5GZWF0dXJlSHRtbEluZm86IF9mbkZlYXR1cmVIdG1sSW5mbywKCQlfZm5VcGRhdGVJbmZvOiBfZm5VcGRhdGVJbmZvLAoJCV9mbkluZm9NYWNyb3M6IF9mbkluZm9NYWNyb3MsCgkJX2ZuSW5pdGlhbGlzZTogX2ZuSW5pdGlhbGlzZSwKCQlfZm5Jbml0Q29tcGxldGU6IF9mbkluaXRDb21wbGV0ZSwKCQlfZm5MZW5ndGhDaGFuZ2U6IF9mbkxlbmd0aENoYW5nZSwKCQlfZm5GZWF0dXJlSHRtbExlbmd0aDogX2ZuRmVhdHVyZUh0bWxMZW5ndGgsCgkJX2ZuRmVhdHVyZUh0bWxQYWdpbmF0ZTogX2ZuRmVhdHVyZUh0bWxQYWdpbmF0ZSwKCQlfZm5QYWdlQ2hhbmdlOiBfZm5QYWdlQ2hhbmdlLAoJCV9mbkZlYXR1cmVIdG1sUHJvY2Vzc2luZzogX2ZuRmVhdHVyZUh0bWxQcm9jZXNzaW5nLAoJCV9mblByb2Nlc3NpbmdEaXNwbGF5OiBfZm5Qcm9jZXNzaW5nRGlzcGxheSwKCQlfZm5GZWF0dXJlSHRtbFRhYmxlOiBfZm5GZWF0dXJlSHRtbFRhYmxlLAoJCV9mblNjcm9sbERyYXc6IF9mblNjcm9sbERyYXcsCgkJX2ZuQXBwbHlUb0NoaWxkcmVuOiBfZm5BcHBseVRvQ2hpbGRyZW4sCgkJX2ZuQ2FsY3VsYXRlQ29sdW1uV2lkdGhzOiBfZm5DYWxjdWxhdGVDb2x1bW5XaWR0aHMsCgkJX2ZuVGhyb3R0bGU6IF9mblRocm90dGxlLAoJCV9mbkNvbnZlcnRUb1dpZHRoOiBfZm5Db252ZXJ0VG9XaWR0aCwKCQlfZm5HZXRXaWRlc3ROb2RlOiBfZm5HZXRXaWRlc3ROb2RlLAoJCV9mbkdldE1heExlblN0cmluZzogX2ZuR2V0TWF4TGVuU3RyaW5nLAoJCV9mblN0cmluZ1RvQ3NzOiBfZm5TdHJpbmdUb0NzcywKCQlfZm5Tb3J0RmxhdHRlbjogX2ZuU29ydEZsYXR0ZW4sCgkJX2ZuU29ydDogX2ZuU29ydCwKCQlfZm5Tb3J0QXJpYTogX2ZuU29ydEFyaWEsCgkJX2ZuU29ydExpc3RlbmVyOiBfZm5Tb3J0TGlzdGVuZXIsCgkJX2ZuU29ydEF0dGFjaExpc3RlbmVyOiBfZm5Tb3J0QXR0YWNoTGlzdGVuZXIsCgkJX2ZuU29ydGluZ0NsYXNzZXM6IF9mblNvcnRpbmdDbGFzc2VzLAoJCV9mblNvcnREYXRhOiBfZm5Tb3J0RGF0YSwKCQlfZm5TYXZlU3RhdGU6IF9mblNhdmVTdGF0ZSwKCQlfZm5Mb2FkU3RhdGU6IF9mbkxvYWRTdGF0ZSwKCQlfZm5JbXBsZW1lbnRTdGF0ZTogX2ZuSW1wbGVtZW50U3RhdGUsCgkJX2ZuU2V0dGluZ3NGcm9tTm9kZTogX2ZuU2V0dGluZ3NGcm9tTm9kZSwKCQlfZm5Mb2c6IF9mbkxvZywKCQlfZm5NYXA6IF9mbk1hcCwKCQlfZm5CaW5kQWN0aW9uOiBfZm5CaW5kQWN0aW9uLAoJCV9mbkNhbGxiYWNrUmVnOiBfZm5DYWxsYmFja1JlZywKCQlfZm5DYWxsYmFja0ZpcmU6IF9mbkNhbGxiYWNrRmlyZSwKCQlfZm5MZW5ndGhPdmVyZmxvdzogX2ZuTGVuZ3RoT3ZlcmZsb3csCgkJX2ZuUmVuZGVyZXI6IF9mblJlbmRlcmVyLAoJCV9mbkRhdGFTb3VyY2U6IF9mbkRhdGFTb3VyY2UsCgkJX2ZuUm93QXR0cmlidXRlczogX2ZuUm93QXR0cmlidXRlcywKCQlfZm5FeHRlbmQ6IF9mbkV4dGVuZCwKCQlfZm5DYWxjdWxhdGVFbmQ6IGZ1bmN0aW9uICgpIHt9IC8vIFVzZWQgYnkgYSBsb3Qgb2YgcGx1Zy1pbnMsIGJ1dCByZWR1bmRhbnQKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIDEuMTAsIHNvIHRoaXMgZGVhZC1lbmQgZnVuY3Rpb24gaXMKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGVkIHRvIHByZXZlbnQgZXJyb3JzCgl9ICk7CgkKCQoJLy8galF1ZXJ5IGFjY2VzcwoJJC5mbi5kYXRhVGFibGUgPSBEYXRhVGFibGU7CgkKCS8vIFByb3ZpZGUgYWNjZXNzIHRvIHRoZSBob3N0IGpRdWVyeSBvYmplY3QgKGNpcmN1bGFyIHJlZmVyZW5jZSkKCURhdGFUYWJsZS4kID0gJDsKCQoJLy8gTGVnYWN5IGFsaWFzZXMKCSQuZm4uZGF0YVRhYmxlU2V0dGluZ3MgPSBEYXRhVGFibGUuc2V0dGluZ3M7CgkkLmZuLmRhdGFUYWJsZUV4dCA9IERhdGFUYWJsZS5leHQ7CgkKCS8vIFdpdGggYSBjYXBpdGFsIGBEYCB3ZSByZXR1cm4gYSBEYXRhVGFibGVzIEFQSSBpbnN0YW5jZSByYXRoZXIgdGhhbiBhCgkvLyBqUXVlcnkgb2JqZWN0CgkkLmZuLkRhdGFUYWJsZSA9IGZ1bmN0aW9uICggb3B0cyApIHsKCQlyZXR1cm4gJCh0aGlzKS5kYXRhVGFibGUoIG9wdHMgKS5hcGkoKTsKCX07CgkKCS8vIEFsbCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byAkLmZuLmRhdGFUYWJsZSBzaG91bGQgYWxzbyBiZQoJLy8gYXZhaWxhYmxlIG9uICQuZm4uRGF0YVRhYmxlCgkkLmVhY2goIERhdGFUYWJsZSwgZnVuY3Rpb24gKCBwcm9wLCB2YWwgKSB7CgkJJC5mbi5EYXRhVGFibGVbIHByb3AgXSA9IHZhbDsKCX0gKTsKCQoJcmV0dXJuIERhdGFUYWJsZTsKfQo=\")).default;\n",
       "    dt(window.$);\n",
       "  }\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<style>table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:\"Courier New\",Courier,monospace;line-height:1em;content:\"+\";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:\"-\";background-color:#d33333}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.9em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:\"▴\"}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:\"▾\"}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody table.dataTable thead>tr>th:before,div.dataTables_scrollBody table.dataTable thead>tr>th:after,div.dataTables_scrollBody table.dataTable thead>tr>td:before,div.dataTables_scrollBody table.dataTable thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgba(13, 110, 253, 0.9);animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);color:white}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.935)}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919)}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954)}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947)}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962)}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(230, 230, 230, 0.1);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.1)), color-stop(100%, rgba(0, 0, 0, 0.1)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:\"\";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}\n",
       "</style>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2022.10</span>.<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">24</span>\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1;36m2022.10\u001b[0m.\u001b[1;36m24\u001b[0m\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from cdapython import Q, columns, unique_terms, query\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from itables import init_notebook_mode, show\n",
    "init_notebook_mode(all_interactive=True)\n",
    "import itables.options as opt\n",
    "opt.maxBytes=0\n",
    "opt.scrollX=\"200px\"\n",
    "opt.scrollCollapse=True\n",
    "opt.paging=True\n",
    "opt.maxColumns=0\n",
    "print(Q.get_version())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d538da92",
   "metadata": {},
   "source": [
    "<div class=\"cdanote\" style=\"background-color:#b3e5d5;color:black;padding:20px;\">\n",
    "    \n",
    "CDA data comes from three sources:\n",
    "<ul>\n",
    "<li><b>The <a href=\"https://proteomic.datacommons.cancer.gov/pdc/\"> Proteomic Data Commons</a> (PDC)</b></li>\n",
    "<li><b>The <a href=\"https://gdc.cancer.gov/\">Genomic Data Commons</a> (GDC)</b></li>\n",
    "<li><b>The <a href=\"https://datacommons.cancer.gov/repository/imaging-data-commons\">Imaging Data Commons</a> (IDC)</b></li>\n",
    "</ul> \n",
    "    \n",
    "The CDA makes this data searchable in four main endpoints:\n",
    "\n",
    "<ul>\n",
    "<li><b>subject:</b> A patient entity captures the study-independent metadata for research subjects. Human research subjects are usually not traceable to a particular person to protect the subjects privacy.</li>\n",
    "<li><b>researchsubject:</b> A research subject is the entity of interest in a specific research study or project, typically a human being or an animal, but can also be a device, group of humans or animals, or a tissue sample. Human research subjects are usually not traceable to a particular person to protect the subjects privacy. This entity plays the role of the case_id in existing data. A subject who participates in 3 studies will have 3 researchsubject IDs.</li>\n",
    "<li><b>specimen:</b> Any material taken as a sample from a biological entity (living or dead), or from a physical object or the environment. Specimens are usually collected as an example of their kind, often for use in some investigation.</li>\n",
    "<li><b>mutation:</b> Molecular data about specific mutations, currently limited to the TCGA-READ project from GDC.</li>\n",
    "</ul>\n",
    "one endpoint that can be added to the subject, researchsubject, or specimen to get the relevant files:    \n",
    "<ul>\n",
    "<li><b>file:</b> A unit of data about subjects, researchsubjects, specimens, or their associated information.</li>\n",
    "</ul>\n",
    "and two endpoints that offer deeper information about data in the researchsubject endpoint:\n",
    "<ul>\n",
    "<li><b>diagnosis:</b> A collection of characteristics that describe an abnormal condition of the body as assessed at a point in time. May be used to capture information about neoplastic and non-neoplastic conditions.</li>\n",
    "<li><b>treatment:</b> Represent medication administration or other treatment types.</li>\n",
    "</ul>\n",
    "</div>\n",
    "\n",
    "\n",
    "If you are looking to build a cohort of distinct individuals who meet some criteria, search by `subject`. If you want to build a cohort, but are particularly interested in studies rather than the participates per se, search by `researchsubject`. If you are looking for biosamples that can be ordered or a specific format of information (for e.g. histological slides) start with `specimen`. If you are primarily looking for files you can reuse for your own analysis, add `.file` to your call.\n",
    "\n",
    "In the subject, researchsubject, or specimen tables, all of the rows will have one or more files associated with them that can be directly found by chaining, as in `specimen.files`. Diagnosis and treatment do not have files directly associated with them, so a query statemet of `diagnosis.files` or `treatment.file` will not work. The mutation table does have files associated with it, but currently they cannot be accessed with `mutation.file`. Look for this feature in a later release.\n",
    "\n",
    "Any metadata field can be searched from any endpoint, the only difference between search types is what type of data is returned by default. This means that you can think of the CDA as a really, really enormous spreadsheet full of data. To search this enormous spreadsheet, you'd want select columns, and then filter rows.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f76026a3",
   "metadata": {},
   "source": [
    "## Basic search with endpoints\n",
    "\n",
    "Let's try a broad search of the CDA to see what information exists about cancers that were first diagnosed in the brain. To run this simple search, we would first construct a query in `Q` where the syntax is `Q('<name_of_column> = \"<unique_term>\"'` and save it to a variable `myquery`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c92a98ba",
   "metadata": {},
   "outputs": [],
   "source": [
    "myquery = Q('primary_diagnosis_site = \"brain\"')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e855573",
   "metadata": {
    "tags": [
     "Help!"
    ]
   },
   "source": [
    "\n",
    "<div class=\"cdawarn\" style=\"background-color:#f9cfbf;color:black;padding:20px;\">\n",
    "    \n",
    "<h3>Where did those terms come from?</h3>\n",
    "    \n",
    "If you aren't sure how we knew what terms to put in our search, please refer back to the <a href=\"../SearchTerms\">What search terms are available?</a> notebook. \n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d483e944",
   "metadata": {},
   "source": [
    "### subject\n",
    "Now we can use that query to search any of information types. Let's start by looking at what subjects meet our criteria. To do that, we will send our query to the subject endpoint, then ask for it to run:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6d9137aa",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4.349</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4349</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m4.349\u001b[0m sec \u001b[1;36m4349\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "subjectresults = myquery.subject.run()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fdf7fb60",
   "metadata": {},
   "source": [
    "We saved the output in a variable `subjectresults`, so we don't get much visible output. To see what our results are, we need to look into the variable. The simplest way is to call `subjectresults` directly:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "cff572d7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\n",
       "            \n",
       "            Offset: 0\n",
       "            Count: 100\n",
       "            Total Row Count: 3015\n",
       "            More pages: True\n",
       "            "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "subjectresults"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5186036c",
   "metadata": {},
   "source": [
    "This tells us four parameters that describe our results:\n",
    "\n",
    "---\n",
    "\n",
    "- **Offset:** This is how many rows of information we've told the query to skip in the data, here we didn't tell it to skip anything, so the offset is zero\n",
    "- **Count:** This is how many rows the current page of our results table has. To keep searches fast, we default to pages with 100 rows.\n",
    "- **Total Row Count:** This is how many rows are in the full results table\n",
    "- **More pages:** This is always a True or False. False means that our current page has all the available results. True means that we will see only the first 100 results in this table, and will need to page through for more.\n",
    "\n",
    "---\n",
    "\n",
    "In any results variable, you can also use `print()` to display a 'pretty print' version of the results. This color codes the display in a way that can make it easier to find the information you care about:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "53cba279",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "            \n",
       "            Offset: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "            Count: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">100</span>\n",
       "            Total Row Count: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3015</span>\n",
       "            More pages: <span style=\"color: #00ff00; text-decoration-color: #00ff00; font-style: italic\">True</span>\n",
       "            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "            \n",
       "            Offset: \u001b[1;36m0\u001b[0m\n",
       "            Count: \u001b[1;36m100\u001b[0m\n",
       "            Total Row Count: \u001b[1;36m3015\u001b[0m\n",
       "            More pages: \u001b[3;92mTrue\u001b[0m\n",
       "            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(subjectresults)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9f9d4361",
   "metadata": {},
   "source": [
    "We have 2384 subject matches, let's look at the actual table. The easiest way to do this is by using the python function `.to_dataframe()` on our `subjectresults` variable:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e97e19f4",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"249eb569-7c8a-43b1-9d0a-b1564e0bb2cb\" class=\"display\"style=\"max-width:100%\"><thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>subject_id</th>\n",
       "      <th>subject_identifier</th>\n",
       "      <th>species</th>\n",
       "      <th>sex</th>\n",
       "      <th>race</th>\n",
       "      <th>ethnicity</th>\n",
       "      <th>days_to_birth</th>\n",
       "      <th>subject_associated_project</th>\n",
       "      <th>vital_status</th>\n",
       "      <th>days_to_death</th>\n",
       "      <th>cause_of_death</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr><td>Loading... (need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td></tr></tbody></table>\n",
       "<style>\n",
       "table td {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "table th {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "thead input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "tfoot input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "</style>\n",
       "<script>\n",
       "    // We use a namespace per table (= the next curly bracket)\n",
       "    // to avoid conflicts between the various tables' data & dt_args\n",
       "    {\n",
       "        // Define the table data\n",
       "        const data = [[\"C177366\", \"[{'system': 'PDC', 'value': 'C177366'}]\", \"homo sapiens\", \"male\", \"american indian or alaska native\", \"not hispanic or latino\", NaN, \"['Proteogenomic Analysis of Pediatric Brain Cancer Tumors Pilot Study']\", \"Dead\", NaN, \"Not Reported\"], [\"C3N-03003\", \"[{'system': 'IDC', 'value': 'C3N-03003'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['cptac_gbm']\", \"None\", NaN, \"None\"], [\"C48216\", \"[{'system': 'PDC', 'value': 'C48216'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['Proteogenomic Analysis of Pediatric Brain Cancer Tumors Pilot Study']\", \"Alive\", NaN, \"Not Reported\"], [\"C794457\", \"[{'system': 'PDC', 'value': 'C794457'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['Proteogenomic Analysis of Pediatric Brain Cancer Tumors Pilot Study']\", \"Alive\", NaN, \"Not Reported\"], [\"C82041\", \"[{'system': 'PDC', 'value': 'C82041'}]\", \"homo sapiens\", \"male\", \"not reported\", \"not hispanic or latino\", NaN, \"['Proteogenomic Analysis of Pediatric Brain Cancer Tumors Pilot Study']\", \"Alive\", NaN, \"Not Reported\"], [\"GENIE-DFCI-003566\", \"[{'system': 'GDC', 'value': 'GENIE-DFCI-003566'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['GENIE-DFCI']\", \"Not Reported\", NaN, \"None\"], [\"GENIE-GRCC-26e041c1\", \"[{'system': 'GDC', 'value': 'GENIE-GRCC-26e041c1'}]\", \"homo sapiens\", \"female\", \"not allowed to collect\", \"not allowed to collect\", NaN, \"['GENIE-GRCC']\", \"Not Reported\", NaN, \"None\"], [\"GENIE-NKI-S0VB\", \"[{'system': 'GDC', 'value': 'GENIE-NKI-S0VB'}]\", \"homo sapiens\", \"male\", \"Unknown\", \"Unknown\", NaN, \"['GENIE-NKI']\", \"Not Reported\", NaN, \"None\"], [\"HCM-BROD-0103-C71\", \"[{'system': 'GDC', 'value': 'HCM-BROD-0103-C71'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['HCMI-CMDC']\", \"Dead\", NaN, \"None\"], [\"LGG-537\", \"[{'system': 'IDC', 'value': 'LGG-537'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['lgg_1p19qdeletion']\", \"None\", NaN, \"None\"], [\"PGBM-010\", \"[{'system': 'IDC', 'value': 'PGBM-010'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['brain_tumor_progression']\", \"None\", NaN, \"None\"], [\"TCGA-06-0208\", \"[{'system': 'GDC', 'value': 'TCGA-06-0208'}, {'system': 'IDC', 'value': 'TCGA-06-0208'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-06-0209\", \"[{'system': 'GDC', 'value': 'TCGA-06-0209'}, {'system': 'IDC', 'value': 'TCGA-06-0209'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-06-5408\", \"[{'system': 'GDC', 'value': 'TCGA-06-5408'}, {'system': 'IDC', 'value': 'TCGA-06-5408'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-06-A5U0\", \"[{'system': 'GDC', 'value': 'TCGA-06-A5U0'}, {'system': 'IDC', 'value': 'TCGA-06-A5U0'}]\", \"homo sapiens\", \"female\", \"black or african american\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Alive\", NaN, \"None\"], [\"TCGA-08-0517\", \"[{'system': 'GDC', 'value': 'TCGA-08-0517'}, {'system': 'IDC', 'value': 'TCGA-08-0517'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-12-0618\", \"[{'system': 'GDC', 'value': 'TCGA-12-0618'}, {'system': 'IDC', 'value': 'TCGA-12-0618'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-14-0865\", \"[{'system': 'GDC', 'value': 'TCGA-14-0865'}, {'system': 'IDC', 'value': 'TCGA-14-0865'}]\", \"homo sapiens\", \"male\", \"white\", \"not reported\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-14-1034\", \"[{'system': 'GDC', 'value': 'TCGA-14-1034'}, {'system': 'IDC', 'value': 'TCGA-14-1034'}]\", \"homo sapiens\", \"female\", \"not reported\", \"not reported\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-DB-A64W\", \"[{'system': 'GDC', 'value': 'TCGA-DB-A64W'}, {'system': 'IDC', 'value': 'TCGA-DB-A64W'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Dead\", NaN, \"None\"], [\"TCGA-FG-A4MT\", \"[{'system': 'GDC', 'value': 'TCGA-FG-A4MT'}, {'system': 'IDC', 'value': 'TCGA-FG-A4MT'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"TCGA-TM-A84I\", \"[{'system': 'GDC', 'value': 'TCGA-TM-A84I'}, {'system': 'IDC', 'value': 'TCGA-TM-A84I'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"UPENN-GBM-00283\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00283'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"UPENN-GBM-00597\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00597'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"900-00-5381\", \"[{'system': 'IDC', 'value': '900-00-5381'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rembrandt']\", \"None\", NaN, \"None\"], [\"ACRIN-DSC-MR-Brain-063\", \"[{'system': 'IDC', 'value': 'ACRIN-DSC-MR-Brain-063'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['acrin_dsc_mr_brain']\", \"None\", NaN, \"None\"], [\"ACRIN-DSC-MR-Brain-100\", \"[{'system': 'IDC', 'value': 'ACRIN-DSC-MR-Brain-100'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['acrin_dsc_mr_brain']\", \"None\", NaN, \"None\"], [\"ACRIN-FMISO-Brain-009\", \"[{'system': 'IDC', 'value': 'ACRIN-FMISO-Brain-009'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['acrin_fmiso_brain']\", \"None\", NaN, \"None\"], [\"C27798\", \"[{'system': 'PDC', 'value': 'C27798'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['Proteogenomic Analysis of Pediatric Brain Cancer Tumors Pilot Study']\", \"Alive\", NaN, \"Not Reported\"], [\"C3L-04362\", \"[{'system': 'IDC', 'value': 'C3L-04362'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['cptac_gbm']\", \"None\", NaN, \"None\"], [\"C3N-01369\", \"[{'system': 'GDC', 'value': 'C3N-01369'}, {'system': 'PDC', 'value': 'C3N-01369'}, {'system': 'IDC', 'value': 'C3N-01369'}]\", \"homo sapiens\", \"female\", \"not reported\", \"not reported\", -21015.0, \"['cptac_gbm', 'CPTAC-3', 'CPTAC3-Discovery']\", \"Not Reported\", NaN, \"None\"], [\"C3N-02783\", \"[{'system': 'GDC', 'value': 'C3N-02783'}, {'system': 'PDC', 'value': 'C3N-02783'}, {'system': 'IDC', 'value': 'C3N-02783'}]\", \"homo sapiens\", \"female\", \"not reported\", \"not reported\", -8889.0, \"['cptac_gbm', 'CPTAC-3', 'CPTAC3-Discovery']\", \"Alive\", NaN, \"None\"], [\"GENIE-MSK-P-0002457\", \"[{'system': 'GDC', 'value': 'GENIE-MSK-P-0002457'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['GENIE-MSK']\", \"Not Reported\", NaN, \"None\"], [\"HF0855\", \"[{'system': 'IDC', 'value': 'HF0855'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rembrandt']\", \"None\", NaN, \"None\"], [\"HF1000\", \"[{'system': 'IDC', 'value': 'HF1000'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rembrandt']\", \"None\", NaN, \"None\"], [\"HF1381\", \"[{'system': 'IDC', 'value': 'HF1381'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rembrandt']\", \"None\", NaN, \"None\"], [\"QIN-BRAIN-DSC-01-21\", \"[{'system': 'IDC', 'value': 'QIN-BRAIN-DSC-01-21'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['qin_brain_dsc_mri']\", \"None\", NaN, \"None\"], [\"RIDER Neuro MRI-1863082306\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-1863082306'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rider_neuro_mri']\", \"None\", NaN, \"None\"], [\"TCGA-02-0023\", \"[{'system': 'GDC', 'value': 'TCGA-02-0023'}, {'system': 'IDC', 'value': 'TCGA-02-0023'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-02-0068\", \"[{'system': 'GDC', 'value': 'TCGA-02-0068'}, {'system': 'IDC', 'value': 'TCGA-02-0068'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-06-0166\", \"[{'system': 'GDC', 'value': 'TCGA-06-0166'}, {'system': 'IDC', 'value': 'TCGA-06-0166'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-06-0876\", \"[{'system': 'GDC', 'value': 'TCGA-06-0876'}, {'system': 'IDC', 'value': 'TCGA-06-0876'}]\", \"homo sapiens\", \"female\", \"black or african american\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Alive\", NaN, \"None\"], [\"TCGA-06-6694\", \"[{'system': 'GDC', 'value': 'TCGA-06-6694'}, {'system': 'IDC', 'value': 'TCGA-06-6694'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-08-0353\", \"[{'system': 'GDC', 'value': 'TCGA-08-0353'}, {'system': 'IDC', 'value': 'TCGA-08-0353'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-19-5958\", \"[{'system': 'GDC', 'value': 'TCGA-19-5958'}, {'system': 'IDC', 'value': 'TCGA-19-5958'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-76-6657\", \"[{'system': 'GDC', 'value': 'TCGA-76-6657'}, {'system': 'IDC', 'value': 'TCGA-76-6657'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-DB-5278\", \"[{'system': 'GDC', 'value': 'TCGA-DB-5278'}, {'system': 'IDC', 'value': 'TCGA-DB-5278'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"TCGA-E1-A7YN\", \"[{'system': 'GDC', 'value': 'TCGA-E1-A7YN'}, {'system': 'IDC', 'value': 'TCGA-E1-A7YN'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Dead\", NaN, \"None\"], [\"TCGA-FG-7637\", \"[{'system': 'GDC', 'value': 'TCGA-FG-7637'}, {'system': 'IDC', 'value': 'TCGA-FG-7637'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"TCGA-HT-7687\", \"[{'system': 'GDC', 'value': 'TCGA-HT-7687'}, {'system': 'IDC', 'value': 'TCGA-HT-7687'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"TCGA-HW-7493\", \"[{'system': 'GDC', 'value': 'TCGA-HW-7493'}, {'system': 'IDC', 'value': 'TCGA-HW-7493'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"TCGA-QH-A65R\", \"[{'system': 'GDC', 'value': 'TCGA-QH-A65R'}, {'system': 'IDC', 'value': 'TCGA-QH-A65R'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"TCGA-W9-A837\", \"[{'system': 'GDC', 'value': 'TCGA-W9-A837'}, {'system': 'IDC', 'value': 'TCGA-W9-A837'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"UPENN-GBM-00048\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00048'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"UPENN-GBM-00123\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00123'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"UPENN-GBM-00479\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00479'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"W50\", \"[{'system': 'IDC', 'value': 'W50'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['ivygap']\", \"None\", NaN, \"None\"], [\"900-00-5316\", \"[{'system': 'IDC', 'value': '900-00-5316'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rembrandt']\", \"None\", NaN, \"None\"], [\"900-00-5459\", \"[{'system': 'IDC', 'value': '900-00-5459'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rembrandt']\", \"None\", NaN, \"None\"], [\"ACRIN-DSC-MR-Brain-046\", \"[{'system': 'IDC', 'value': 'ACRIN-DSC-MR-Brain-046'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['acrin_dsc_mr_brain']\", \"None\", NaN, \"None\"], [\"ACRIN-FMISO-Brain-038\", \"[{'system': 'IDC', 'value': 'ACRIN-FMISO-Brain-038'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['acrin_fmiso_brain']\", \"None\", NaN, \"None\"], [\"C3L-03559\", \"[{'system': 'IDC', 'value': 'C3L-03559'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['cptac_gbm']\", \"None\", NaN, \"None\"], [\"C3N-03800\", \"[{'system': 'IDC', 'value': 'C3N-03800'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['cptac_gbm']\", \"None\", NaN, \"None\"], [\"C84747\", \"[{'system': 'PDC', 'value': 'C84747'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['Proteogenomic Analysis of Pediatric Brain Cancer Tumors Pilot Study']\", \"Alive\", NaN, \"Not Reported\"], [\"HF1071\", \"[{'system': 'IDC', 'value': 'HF1071'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rembrandt']\", \"None\", NaN, \"None\"], [\"HF1097\", \"[{'system': 'IDC', 'value': 'HF1097'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rembrandt']\", \"None\", NaN, \"None\"], [\"LGG-344\", \"[{'system': 'IDC', 'value': 'LGG-344'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['lgg_1p19qdeletion']\", \"None\", NaN, \"None\"], [\"LGG-355\", \"[{'system': 'IDC', 'value': 'LGG-355'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['lgg_1p19qdeletion']\", \"None\", NaN, \"None\"], [\"RIDER Neuro MRI-2777879824\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-2777879824'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['rider_neuro_mri']\", \"None\", NaN, \"None\"], [\"TCGA-02-0014\", \"[{'system': 'GDC', 'value': 'TCGA-02-0014'}, {'system': 'IDC', 'value': 'TCGA-02-0014'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-02-0456\", \"[{'system': 'GDC', 'value': 'TCGA-02-0456'}, {'system': 'IDC', 'value': 'TCGA-02-0456'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-06-0649\", \"[{'system': 'GDC', 'value': 'TCGA-06-0649'}, {'system': 'IDC', 'value': 'TCGA-06-0649'}]\", \"homo sapiens\", \"female\", \"black or african american\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-12-3648\", \"[{'system': 'GDC', 'value': 'TCGA-12-3648'}, {'system': 'IDC', 'value': 'TCGA-12-3648'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [\"TCGA-4W-AA9S\", \"[{'system': 'GDC', 'value': 'TCGA-4W-AA9S'}, {'system': 'IDC', 'value': 'TCGA-4W-AA9S'}]\", \"homo sapiens\", \"male\", \"black or african american\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Alive\", NaN, \"None\"], [\"TCGA-CS-6670\", \"[{'system': 'GDC', 'value': 'TCGA-CS-6670'}, {'system': 'IDC', 'value': 'TCGA-CS-6670'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"TCGA-DB-A75P\", \"[{'system': 'GDC', 'value': 'TCGA-DB-A75P'}, {'system': 'IDC', 'value': 'TCGA-DB-A75P'}]\", \"homo sapiens\", \"female\", \"not reported\", \"not reported\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"TCGA-DU-6400\", \"[{'system': 'GDC', 'value': 'TCGA-DU-6400'}, {'system': 'IDC', 'value': 'TCGA-DU-6400'}]\", \"homo sapiens\", \"female\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Dead\", NaN, \"None\"], [\"TCGA-DU-A7TG\", \"[{'system': 'GDC', 'value': 'TCGA-DU-A7TG'}, {'system': 'IDC', 'value': 'TCGA-DU-A7TG'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Dead\", NaN, \"None\"], [\"TCGA-HT-A74O\", \"[{'system': 'GDC', 'value': 'TCGA-HT-A74O'}, {'system': 'IDC', 'value': 'TCGA-HT-A74O'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"TCGA-VM-A8CF\", \"[{'system': 'GDC', 'value': 'TCGA-VM-A8CF'}, {'system': 'IDC', 'value': 'TCGA-VM-A8CF'}]\", \"homo sapiens\", \"female\", \"white\", \"not reported\", NaN, \"['tcga_lgg', 'TCGA-LGG']\", \"Alive\", NaN, \"None\"], [\"UPENN-GBM-00147\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00147'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"UPENN-GBM-00156\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00156'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"UPENN-GBM-00275\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00275'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"UPENN-GBM-00374\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00374'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"UPENN-GBM-00423\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00423'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"UPENN-GBM-00583\", \"[{'system': 'IDC', 'value': 'UPENN-GBM-00583'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['upenn_gbm']\", \"None\", NaN, \"None\"], [\"ACRIN-DSC-MR-Brain-061\", \"[{'system': 'IDC', 'value': 'ACRIN-DSC-MR-Brain-061'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['acrin_dsc_mr_brain']\", \"None\", NaN, \"None\"], [\"ACRIN-DSC-MR-Brain-074\", \"[{'system': 'IDC', 'value': 'ACRIN-DSC-MR-Brain-074'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['acrin_dsc_mr_brain']\", \"None\", NaN, \"None\"], [\"ACRIN-DSC-MR-Brain-083\", \"[{'system': 'IDC', 'value': 'ACRIN-DSC-MR-Brain-083'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['acrin_dsc_mr_brain']\", \"None\", NaN, \"None\"], [\"C127182\", \"[{'system': 'PDC', 'value': 'C127182'}]\", \"homo sapiens\", \"female\", \"not reported\", \"hispanic or latino\", NaN, \"['Proteogenomic Analysis of Pediatric Brain Cancer Tumors Pilot Study']\", \"Alive\", NaN, \"Not Reported\"], [\"C3L-03387\", \"[{'system': 'GDC', 'value': 'C3L-03387'}, {'system': 'PDC', 'value': 'C3L-03387'}, {'system': 'IDC', 'value': 'C3L-03387'}]\", \"homo sapiens\", \"male\", \"not reported\", \"not reported\", -25839.0, \"['cptac_gbm', 'CPTAC-3', 'CPTAC3-Discovery']\", \"Dead\", 403.0, \"None\"], [\"C3N-01852\", \"[{'system': 'GDC', 'value': 'C3N-01852'}, {'system': 'PDC', 'value': 'C3N-01852'}, {'system': 'IDC', 'value': 'C3N-01852'}]\", \"homo sapiens\", \"male\", \"not reported\", \"not reported\", -21869.0, \"['cptac_gbm', 'CPTAC-3', 'CPTAC3-Discovery']\", \"Alive\", NaN, \"None\"], [\"C3N-02683\", \"[{'system': 'IDC', 'value': 'C3N-02683'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['cptac_gbm']\", \"None\", NaN, \"None\"], [\"C3N-04097\", \"[{'system': 'IDC', 'value': 'C3N-04097'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['cptac_gbm']\", \"None\", NaN, \"None\"], [\"C77367\", \"[{'system': 'PDC', 'value': 'C77367'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['Proteogenomic Analysis of Pediatric Brain Cancer Tumors Pilot Study']\", \"Alive\", NaN, \"Not Reported\"], [\"C881049\", \"[{'system': 'PDC', 'value': 'C881049'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['Proteogenomic Analysis of Pediatric Brain Cancer Tumors Pilot Study']\", \"Alive\", NaN, \"Not Reported\"], [\"GENIE-GRCC-159a16b7\", \"[{'system': 'GDC', 'value': 'GENIE-GRCC-159a16b7'}]\", \"homo sapiens\", \"female\", \"not allowed to collect\", \"not allowed to collect\", NaN, \"['GENIE-GRCC']\", \"Not Reported\", NaN, \"None\"], [\"GENIE-MSK-P-0005515\", \"[{'system': 'GDC', 'value': 'GENIE-MSK-P-0005515'}]\", \"homo sapiens\", \"male\", \"white\", \"not hispanic or latino\", NaN, \"['GENIE-MSK']\", \"Not Reported\", NaN, \"None\"], [\"QIN-BRAIN-DSC-01-33\", \"[{'system': 'IDC', 'value': 'QIN-BRAIN-DSC-01-33'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['qin_brain_dsc_mri']\", \"None\", NaN, \"None\"], [\"QIN-GBM-TR-13\", \"[{'system': 'IDC', 'value': 'QIN-GBM-TR-13'}]\", \"homo sapiens\", \"None\", \"None\", \"None\", NaN, \"['qin_gbm_treatment_response']\", \"None\", NaN, \"None\"]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"paging\": true, \"scrollCollapse\": true, \"scrollX\": \"200px\"};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        // Display the table\n",
       "        $(document).ready(function () {\n",
       "            \n",
       "            window.__itables_render('#249eb569-7c8a-43b1-9d0a-b1564e0bb2cb', dt_args);\n",
       "        });\n",
       "    }\n",
       "</script>\n"
      ],
      "text/plain": [
       "             subject_id                                 subject_identifier  \\\n",
       "0               C177366            [{'system': 'PDC', 'value': 'C177366'}]   \n",
       "1             C3N-03003          [{'system': 'IDC', 'value': 'C3N-03003'}]   \n",
       "2                C48216             [{'system': 'PDC', 'value': 'C48216'}]   \n",
       "3               C794457            [{'system': 'PDC', 'value': 'C794457'}]   \n",
       "4                C82041             [{'system': 'PDC', 'value': 'C82041'}]   \n",
       "..                  ...                                                ...   \n",
       "95              C881049            [{'system': 'PDC', 'value': 'C881049'}]   \n",
       "96  GENIE-GRCC-159a16b7  [{'system': 'GDC', 'value': 'GENIE-GRCC-159a16...   \n",
       "97  GENIE-MSK-P-0005515  [{'system': 'GDC', 'value': 'GENIE-MSK-P-00055...   \n",
       "98  QIN-BRAIN-DSC-01-33  [{'system': 'IDC', 'value': 'QIN-BRAIN-DSC-01-...   \n",
       "99        QIN-GBM-TR-13      [{'system': 'IDC', 'value': 'QIN-GBM-TR-13'}]   \n",
       "\n",
       "         species     sex                              race  \\\n",
       "0   homo sapiens    male  american indian or alaska native   \n",
       "1   homo sapiens    None                              None   \n",
       "2   homo sapiens  female                             white   \n",
       "3   homo sapiens    male                             white   \n",
       "4   homo sapiens    male                      not reported   \n",
       "..           ...     ...                               ...   \n",
       "95  homo sapiens    male                             white   \n",
       "96  homo sapiens  female            not allowed to collect   \n",
       "97  homo sapiens    male                             white   \n",
       "98  homo sapiens    None                              None   \n",
       "99  homo sapiens    None                              None   \n",
       "\n",
       "                 ethnicity  days_to_birth  \\\n",
       "0   not hispanic or latino            NaN   \n",
       "1                     None            NaN   \n",
       "2   not hispanic or latino            NaN   \n",
       "3   not hispanic or latino            NaN   \n",
       "4   not hispanic or latino            NaN   \n",
       "..                     ...            ...   \n",
       "95  not hispanic or latino            NaN   \n",
       "96  not allowed to collect            NaN   \n",
       "97  not hispanic or latino            NaN   \n",
       "98                    None            NaN   \n",
       "99                    None            NaN   \n",
       "\n",
       "                           subject_associated_project  vital_status  \\\n",
       "0   [Proteogenomic Analysis of Pediatric Brain Can...          Dead   \n",
       "1                                         [cptac_gbm]          None   \n",
       "2   [Proteogenomic Analysis of Pediatric Brain Can...         Alive   \n",
       "3   [Proteogenomic Analysis of Pediatric Brain Can...         Alive   \n",
       "4   [Proteogenomic Analysis of Pediatric Brain Can...         Alive   \n",
       "..                                                ...           ...   \n",
       "95  [Proteogenomic Analysis of Pediatric Brain Can...         Alive   \n",
       "96                                       [GENIE-GRCC]  Not Reported   \n",
       "97                                        [GENIE-MSK]  Not Reported   \n",
       "98                                [qin_brain_dsc_mri]          None   \n",
       "99                       [qin_gbm_treatment_response]          None   \n",
       "\n",
       "    days_to_death cause_of_death  \n",
       "0             NaN   Not Reported  \n",
       "1             NaN           None  \n",
       "2             NaN   Not Reported  \n",
       "3             NaN   Not Reported  \n",
       "4             NaN   Not Reported  \n",
       "..            ...            ...  \n",
       "95            NaN   Not Reported  \n",
       "96            NaN           None  \n",
       "97            NaN           None  \n",
       "98            NaN           None  \n",
       "99            NaN           None  \n",
       "\n",
       "[100 rows x 11 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "subjectresults.to_dataframe()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e44a65df",
   "metadata": {},
   "source": [
    "By default `to_dataframe()` shows us the first and last five rows for the first page of our results, so we can easily preview our data.\n",
    "\n",
    "Since we queried the Subject endpoint, our default results tell us Subject level information, that is, information about unique individuals: their sex, race, age, species, etc. The `id` column tells us the unique identifier for each individual. The identifier column has nested information about what study or studies a Subject participated in, and will list all of their researchsubject identifiers. \n",
    "\n",
    "The `to_dataframe()` function converts the results to a pandas dataframe. So if we save the dataframe to a variable, we can use any [pandas dataframe functions](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) to explore it. For example, lets see whether any of the Subjects in our first 100 results are black or african american. First we'll save the results to a dataframe, then subset that dataframe to only show rows where the word \"black\" appears in the \"race\" column. \"NAs\" which are shown as \"None\" in these tables, so for our filter to work, we'll need to specifically tell it to ignore NAs:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "4975c1e5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"2c5d5ef8-2ae1-43f3-a571-4b52eb857e43\" class=\"display\"style=\"max-width:100%\"><thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>subject_id</th>\n",
       "      <th>subject_identifier</th>\n",
       "      <th>species</th>\n",
       "      <th>sex</th>\n",
       "      <th>race</th>\n",
       "      <th>ethnicity</th>\n",
       "      <th>days_to_birth</th>\n",
       "      <th>subject_associated_project</th>\n",
       "      <th>vital_status</th>\n",
       "      <th>days_to_death</th>\n",
       "      <th>cause_of_death</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr><td>Loading... (need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td></tr></tbody></table>\n",
       "<style>\n",
       "table td {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "table th {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "thead input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "tfoot input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "</style>\n",
       "<script>\n",
       "    // We use a namespace per table (= the next curly bracket)\n",
       "    // to avoid conflicts between the various tables' data & dt_args\n",
       "    {\n",
       "        // Define the table data\n",
       "        const data = [[14, \"TCGA-06-A5U0\", \"[{'system': 'GDC', 'value': 'TCGA-06-A5U0'}, {'system': 'IDC', 'value': 'TCGA-06-A5U0'}]\", \"homo sapiens\", \"female\", \"black or african american\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Alive\", NaN, \"None\"], [41, \"TCGA-06-0876\", \"[{'system': 'GDC', 'value': 'TCGA-06-0876'}, {'system': 'IDC', 'value': 'TCGA-06-0876'}]\", \"homo sapiens\", \"female\", \"black or african american\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Alive\", NaN, \"None\"], [71, \"TCGA-06-0649\", \"[{'system': 'GDC', 'value': 'TCGA-06-0649'}, {'system': 'IDC', 'value': 'TCGA-06-0649'}]\", \"homo sapiens\", \"female\", \"black or african american\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Dead\", NaN, \"None\"], [73, \"TCGA-4W-AA9S\", \"[{'system': 'GDC', 'value': 'TCGA-4W-AA9S'}, {'system': 'IDC', 'value': 'TCGA-4W-AA9S'}]\", \"homo sapiens\", \"male\", \"black or african american\", \"not hispanic or latino\", NaN, \"['TCGA-GBM', 'tcga_gbm']\", \"Alive\", NaN, \"None\"]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"paging\": true, \"scrollCollapse\": true, \"scrollX\": \"200px\"};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        // Display the table\n",
       "        $(document).ready(function () {\n",
       "            \n",
       "            window.__itables_render('#2c5d5ef8-2ae1-43f3-a571-4b52eb857e43', dt_args);\n",
       "        });\n",
       "    }\n",
       "</script>\n"
      ],
      "text/plain": [
       "      subject_id                                 subject_identifier  \\\n",
       "14  TCGA-06-A5U0  [{'system': 'GDC', 'value': 'TCGA-06-A5U0'}, {...   \n",
       "41  TCGA-06-0876  [{'system': 'GDC', 'value': 'TCGA-06-0876'}, {...   \n",
       "71  TCGA-06-0649  [{'system': 'GDC', 'value': 'TCGA-06-0649'}, {...   \n",
       "73  TCGA-4W-AA9S  [{'system': 'GDC', 'value': 'TCGA-4W-AA9S'}, {...   \n",
       "\n",
       "         species     sex                       race               ethnicity  \\\n",
       "14  homo sapiens  female  black or african american  not hispanic or latino   \n",
       "41  homo sapiens  female  black or african american  not hispanic or latino   \n",
       "71  homo sapiens  female  black or african american  not hispanic or latino   \n",
       "73  homo sapiens    male  black or african american  not hispanic or latino   \n",
       "\n",
       "    days_to_birth subject_associated_project vital_status  days_to_death  \\\n",
       "14            NaN       [TCGA-GBM, tcga_gbm]        Alive            NaN   \n",
       "41            NaN       [TCGA-GBM, tcga_gbm]        Alive            NaN   \n",
       "71            NaN       [TCGA-GBM, tcga_gbm]         Dead            NaN   \n",
       "73            NaN       [TCGA-GBM, tcga_gbm]        Alive            NaN   \n",
       "\n",
       "   cause_of_death  \n",
       "14           None  \n",
       "41           None  \n",
       "71           None  \n",
       "73           None  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "subjectdata = subjectresults.to_dataframe()\n",
    "subjectdata[subjectdata['race'].str.contains(\"black\", na=False)]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8750617",
   "metadata": {},
   "source": [
    "There are subjects in our first hundred results that meet the criteria. If we just want to be sure that the data contains some value, this might be good enough. But often we want to search the entire set of results and not just the first page. \n",
    "\n",
    "We'll cover how to work with large results dataframes in the <a href=\"../Pagination\">Pagination</a> notebook. Or, learn how to get summary information from search results in the <a href=\"../DataSummaries\">Data Summaries</a> notebook."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05e52f3f",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "<div class=\"cdadefine\" style=\"background-color:#add9e5;color:black;padding:20px;\">\n",
    "\n",
    "<h3>Subject Field Definitions</h3>\n",
    "\n",
    "<i>A patient entity captures the study-independent metadata for research subjects. Human research subjects are usually not traceable to a particular person to protect the subjects privacy.</i>\n",
    "\n",
    "    \n",
    "<ul>\n",
    "<li><b>id:</b> The 'logical' identifier of the entity in the system of record, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system.\"</li>\n",
    "<li><b>identifier:</b> A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.</li>\n",
    "<li><b>identifier.system:</b> The system or namespace that defines the identifier.</li>\n",
    "<li><b>identifier.value:</b> The value of the identifier, as defined by the system.</li>\n",
    "<li><b>species:</b> The taxonomic group (e.g. species) of the subject.</li>\n",
    "<li><b>sex:</b> The biologic character or quality that distinguishes male and female from one another as expressed by analysis of the person's gonadal, morphologic (internal and external), chromosomal, and hormonal characteristics.</li>\n",
    "<li><b>race:</b> An arbitrary classification of a taxonomic group that is a division of a species. It usually arises as a consequence of geographical isolation within a species and is characterized by shared heredity, physical attributes and behavior, and in the case of humans, by common history, nationality, or geographic distribution. The provided values are based on the categories defined by the U.S. Office of Management and Business and used by the U.S. Census Bureau.</li>\n",
    "<li><b>ethnicity:</b> An individual's self-described social and cultural grouping, specifically whether an individual describes themselves as Hispanic or Latino. The provided values are based on the categories defined by the U.S. Office of Management and Business and used by the U.S. Census Bureau.</li>\n",
    "<li><b>days_to_birth:</b> Number of days between the date used for index and the date from a person's date of birth represented as a calculated negative number of days.</li>\n",
    "<li><b>subject_associated_project:</b> The list of Projects associated with the Subject.</li>\n",
    "<li><b>vital_status:</b> Coded value indicating the state or condition of being living or deceased; also includes the case where the vital status is unknown.</li>\n",
    "<li><b>days_to_death:</b> Number of days between the date used for index and the date from a person's date of death represented as a calculated number of days.</li>\n",
    "<li><b>cause_of_death:</b> Coded value indicating the circumstance or condition that results in the death of the subject.</li>\n",
    "</ul>  \n",
    "\n",
    "</div>\n",
    "    \n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "73745aa6",
   "metadata": {},
   "source": [
    "### researchsubject\n",
    "\n",
    "If we're interested in what researchsubjects meet our criteria, we can run our query against the researchsubject endpoint:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a2d8c874",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">7.779</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">7779</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m7.779\u001b[0m sec \u001b[1;36m7779\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "            \n",
       "            Offset: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "            Count: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">100</span>\n",
       "            Total Row Count: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4347</span>\n",
       "            More pages: <span style=\"color: #00ff00; text-decoration-color: #00ff00; font-style: italic\">True</span>\n",
       "            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "            \n",
       "            Offset: \u001b[1;36m0\u001b[0m\n",
       "            Count: \u001b[1;36m100\u001b[0m\n",
       "            Total Row Count: \u001b[1;36m4347\u001b[0m\n",
       "            More pages: \u001b[3;92mTrue\u001b[0m\n",
       "            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "researchsubjectresults = myquery.researchsubject.run()\n",
    "print(researchsubjectresults)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "977f36fe",
   "metadata": {},
   "source": [
    "Now we see that our 2384 subjects have 3716 researchsubjects between them, that means that some, but not all, of our subjects were participants in more than one study. Let's peek at the data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "a20f7e62",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"e340dfd6-3cc9-4029-9716-d1acc5601cdc\" class=\"display\"style=\"max-width:100%\"><thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>researchsubject_id</th>\n",
       "      <th>researchsubject_identifier</th>\n",
       "      <th>member_of_research_project</th>\n",
       "      <th>primary_diagnosis_condition</th>\n",
       "      <th>primary_diagnosis_site</th>\n",
       "      <th>subject_id</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr><td>Loading... (need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td></tr></tbody></table>\n",
       "<style>\n",
       "table td {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "table th {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "thead input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "tfoot input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "</style>\n",
       "<script>\n",
       "    // We use a namespace per table (= the next curly bracket)\n",
       "    // to avoid conflicts between the various tables' data & dt_args\n",
       "    {\n",
       "        // Define the table data\n",
       "        const data = [[\"RIDER Neuro MRI-1205970977__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-1205970977__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-1205970977\"], [\"PGBM-019__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-019__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-019\"], [\"PGBM-002__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-002__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-002\"], [\"RIDER Neuro MRI-1596825834__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-1596825834__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-1596825834\"], [\"4dd86ebd-ef16-4b2b-9ea0-5d1d7afef257\", \"[{'system': 'GDC', 'value': '4dd86ebd-ef16-4b2b-9ea0-5d1d7afef257'}]\", \"TCGA-DLBC\", \"Mature B-Cell Lymphomas\", \"Brain\", \"TCGA-RQ-AAAT\"], [\"RIDER Neuro MRI-5244517593__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-5244517593__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-5244517593\"], [\"cde1d14f-d067-4419-aa03-eb785dec8235\", \"[{'system': 'GDC', 'value': 'cde1d14f-d067-4419-aa03-eb785dec8235'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-03818\"], [\"f55673be-5796-49bb-aa0b-fed26281c36f\", \"[{'system': 'GDC', 'value': 'f55673be-5796-49bb-aa0b-fed26281c36f'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-01988\"], [\"PGBM-008__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-008__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-008\"], [\"RIDER Neuro MRI-1725028639__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-1725028639__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-1725028639\"], [\"675b233a-f411-4812-9772-9b6ce0d9f480\", \"[{'system': 'GDC', 'value': '675b233a-f411-4812-9772-9b6ce0d9f480'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-02514\"], [\"RIDER Neuro MRI-2777879824__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-2777879824__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-2777879824\"], [\"RIDER Neuro MRI-3369019796__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-3369019796__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-3369019796\"], [\"bb068d3d-e1f3-42e2-9805-b9278308e683\", \"[{'system': 'GDC', 'value': 'bb068d3d-e1f3-42e2-9805-b9278308e683'}]\", \"GENIE-NKI\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-NKI-S0VB\"], [\"0f72c194-c923-4779-818a-fadc9e400d69\", \"[{'system': 'GDC', 'value': '0f72c194-c923-4779-818a-fadc9e400d69'}]\", \"EXCEPTIONAL_RESPONDERS-ER\", \"Gliomas\", \"Brain\", \"ER-ACXF\"], [\"RIDER Neuro MRI-3115670549__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-3115670549__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-3115670549\"], [\"RIDER Neuro MRI-1380393408__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-1380393408__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-1380393408\"], [\"RIDER Neuro MRI-2783961675__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-2783961675__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-2783961675\"], [\"PGBM-007__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-007__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-007\"], [\"b9dd36c7-1188-49d8-be58-f3ef1c395771\", \"[{'system': 'GDC', 'value': 'b9dd36c7-1188-49d8-be58-f3ef1c395771'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-03864\"], [\"PGBM-015__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-015__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-015\"], [\"c5d1eb03-8b47-4e72-a604-9bf61155f95c\", \"[{'system': 'GDC', 'value': 'c5d1eb03-8b47-4e72-a604-9bf61155f95c'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-03582\"], [\"PGBM-014__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-014__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-014\"], [\"5b9fa46b-36c5-4711-b276-6e86ab8aab29\", \"[{'system': 'GDC', 'value': '5b9fa46b-36c5-4711-b276-6e86ab8aab29'}]\", \"EXCEPTIONAL_RESPONDERS-ER\", \"Neoplasms, NOS\", \"Brain\", \"ER-B0GH\"], [\"RIDER Neuro MRI-1023805636__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-1023805636__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-1023805636\"], [\"RIDER Neuro MRI-3183286461__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-3183286461__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-3183286461\"], [\"PGBM-006__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-006__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-006\"], [\"PGBM-020__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-020__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-020\"], [\"9bfb5ec7-6fe1-443a-9eb2-75321b0da84a\", \"[{'system': 'GDC', 'value': '9bfb5ec7-6fe1-443a-9eb2-75321b0da84a'}]\", \"EXCEPTIONAL_RESPONDERS-ER\", \"Neoplasms, NOS\", \"Brain\", \"ER-B1HR\"], [\"PGBM-010__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-010__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-010\"], [\"RIDER Neuro MRI-2363725125__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-2363725125__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-2363725125\"], [\"99b34e59-a5d0-4a8b-b777-3a592c5bea1b\", \"[{'system': 'GDC', 'value': '99b34e59-a5d0-4a8b-b777-3a592c5bea1b'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-02402\"], [\"d2b1569a-5129-485a-ad79-a63661818f78\", \"[{'system': 'GDC', 'value': 'd2b1569a-5129-485a-ad79-a63661818f78'}]\", \"EXCEPTIONAL_RESPONDERS-ER\", \"Gliomas\", \"Brain\", \"ER-ABXP\"], [\"51343e16-05b6-4314-8169-59ff765bda0a\", \"[{'system': 'GDC', 'value': '51343e16-05b6-4314-8169-59ff765bda0a'}]\", \"EXCEPTIONAL_RESPONDERS-ER\", \"Neoplasms, NOS\", \"Brain\", \"ER-B0DO\"], [\"PGBM-018__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-018__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-018\"], [\"RIDER Neuro MRI-1863082306__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-1863082306__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-1863082306\"], [\"be68cfb0-c47f-49a1-9e39-b0b3e57372fc\", \"[{'system': 'GDC', 'value': 'be68cfb0-c47f-49a1-9e39-b0b3e57372fc'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-02615\"], [\"PGBM-017__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-017__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-017\"], [\"9c32418f-ce23-4259-86f8-0b3b46fcfe33\", \"[{'system': 'GDC', 'value': '9c32418f-ce23-4259-86f8-0b3b46fcfe33'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-03295\"], [\"PGBM-012__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-012__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-012\"], [\"b6e6624f-5776-4d7e-a2c1-595b2b539f46\", \"[{'system': 'GDC', 'value': 'b6e6624f-5776-4d7e-a2c1-595b2b539f46'}]\", \"GENIE-JHU\", \"Malignant Lymphomas, NOS or Diffuse\", \"Brain\", \"GENIE-JHU-02253\"], [\"RIDER Neuro MRI-2455183034__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-2455183034__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-2455183034\"], [\"25ff86af-beb4-480c-b706-f3fe0306f7cf\", \"[{'system': 'GDC', 'value': '25ff86af-beb4-480c-b706-f3fe0306f7cf'}]\", \"TCGA-DLBC\", \"Mature B-Cell Lymphomas\", \"Brain\", \"TCGA-RQ-A68N\"], [\"PGBM-004__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-004__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-004\"], [\"PGBM-009__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-009__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-009\"], [\"RIDER Neuro MRI-2288950761__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-2288950761__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-2288950761\"], [\"54ada9c7-e8f7-4ecc-b829-903be7e3ad82\", \"[{'system': 'GDC', 'value': '54ada9c7-e8f7-4ecc-b829-903be7e3ad82'}]\", \"GENIE-NKI\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-NKI-8IN3\"], [\"PGBM-001__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-001__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-001\"], [\"8232489b-f2dc-44a1-b6dc-38b94bda584b\", \"[{'system': 'GDC', 'value': '8232489b-f2dc-44a1-b6dc-38b94bda584b'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-01660\"], [\"RIDER Neuro MRI-2187931648__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-2187931648__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-2187931648\"], [\"b936c96e-70ab-46eb-a87f-73290c43f288\", \"[{'system': 'GDC', 'value': 'b936c96e-70ab-46eb-a87f-73290c43f288'}]\", \"GENIE-NKI\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-NKI-U4QV\"], [\"PGBM-003__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-003__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-003\"], [\"PGBM-011__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-011__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-011\"], [\"RIDER Neuro MRI-1086100996__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-1086100996__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-1086100996\"], [\"15bc9ed5-5f54-4c13-9554-230609b02729\", \"[{'system': 'GDC', 'value': '15bc9ed5-5f54-4c13-9554-230609b02729'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-02173\"], [\"RIDER Neuro MRI-2579032163__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-2579032163__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-2579032163\"], [\"2a32b049-395b-4a6b-8121-c3e6a5bcb531\", \"[{'system': 'GDC', 'value': '2a32b049-395b-4a6b-8121-c3e6a5bcb531'}]\", \"GENIE-JHU\", \"Neoplasms, NOS\", \"Brain\", \"GENIE-JHU-03873\"], [\"PGBM-005__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-005__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-005\"], [\"PGBM-016__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-016__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-016\"], [\"RIDER Neuro MRI-2408442290__rider_neuro_mri\", \"[{'system': 'IDC', 'value': 'RIDER Neuro MRI-2408442290__rider_neuro_mri'}]\", \"rider_neuro_mri\", \"None\", \"Brain\", \"RIDER Neuro MRI-2408442290\"], [\"PGBM-013__brain_tumor_progression\", \"[{'system': 'IDC', 'value': 'PGBM-013__brain_tumor_progression'}]\", \"brain_tumor_progression\", \"None\", \"Brain\", \"PGBM-013\"], [\"W35__ivygap\", \"[{'system': 'IDC', 'value': 'W35__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W35\"], [\"W8__ivygap\", \"[{'system': 'IDC', 'value': 'W8__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W8\"], [\"W20__ivygap\", \"[{'system': 'IDC', 'value': 'W20__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W20\"], [\"W22__ivygap\", \"[{'system': 'IDC', 'value': 'W22__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W22\"], [\"W31__ivygap\", \"[{'system': 'IDC', 'value': 'W31__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W31\"], [\"W7__ivygap\", \"[{'system': 'IDC', 'value': 'W7__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W7\"], [\"W34__ivygap\", \"[{'system': 'IDC', 'value': 'W34__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W34\"], [\"W40__ivygap\", \"[{'system': 'IDC', 'value': 'W40__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W40\"], [\"W6__ivygap\", \"[{'system': 'IDC', 'value': 'W6__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W6\"], [\"W43__ivygap\", \"[{'system': 'IDC', 'value': 'W43__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W43\"], [\"W45__ivygap\", \"[{'system': 'IDC', 'value': 'W45__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W45\"], [\"W48__ivygap\", \"[{'system': 'IDC', 'value': 'W48__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W48\"], [\"W10__ivygap\", \"[{'system': 'IDC', 'value': 'W10__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W10\"], [\"W39__ivygap\", \"[{'system': 'IDC', 'value': 'W39__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W39\"], [\"W18__ivygap\", \"[{'system': 'IDC', 'value': 'W18__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W18\"], [\"W50__ivygap\", \"[{'system': 'IDC', 'value': 'W50__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W50\"], [\"W4__ivygap\", \"[{'system': 'IDC', 'value': 'W4__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W4\"], [\"W9__ivygap\", \"[{'system': 'IDC', 'value': 'W9__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W9\"], [\"W26__ivygap\", \"[{'system': 'IDC', 'value': 'W26__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W26\"], [\"W33__ivygap\", \"[{'system': 'IDC', 'value': 'W33__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W33\"], [\"W29__ivygap\", \"[{'system': 'IDC', 'value': 'W29__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W29\"], [\"W54__ivygap\", \"[{'system': 'IDC', 'value': 'W54__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W54\"], [\"W55__ivygap\", \"[{'system': 'IDC', 'value': 'W55__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W55\"], [\"W1__ivygap\", \"[{'system': 'IDC', 'value': 'W1__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W1\"], [\"W12__ivygap\", \"[{'system': 'IDC', 'value': 'W12__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W12\"], [\"W42__ivygap\", \"[{'system': 'IDC', 'value': 'W42__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W42\"], [\"W32__ivygap\", \"[{'system': 'IDC', 'value': 'W32__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W32\"], [\"W5__ivygap\", \"[{'system': 'IDC', 'value': 'W5__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W5\"], [\"W30__ivygap\", \"[{'system': 'IDC', 'value': 'W30__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W30\"], [\"W36__ivygap\", \"[{'system': 'IDC', 'value': 'W36__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W36\"], [\"W13__ivygap\", \"[{'system': 'IDC', 'value': 'W13__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W13\"], [\"W11__ivygap\", \"[{'system': 'IDC', 'value': 'W11__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W11\"], [\"W21__ivygap\", \"[{'system': 'IDC', 'value': 'W21__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W21\"], [\"W38__ivygap\", \"[{'system': 'IDC', 'value': 'W38__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W38\"], [\"W19__ivygap\", \"[{'system': 'IDC', 'value': 'W19__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W19\"], [\"W2__ivygap\", \"[{'system': 'IDC', 'value': 'W2__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W2\"], [\"W3__ivygap\", \"[{'system': 'IDC', 'value': 'W3__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W3\"], [\"W53__ivygap\", \"[{'system': 'IDC', 'value': 'W53__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W53\"], [\"W16__ivygap\", \"[{'system': 'IDC', 'value': 'W16__ivygap'}]\", \"ivygap\", \"None\", \"Brain\", \"W16\"]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"paging\": true, \"scrollCollapse\": true, \"scrollX\": \"200px\"};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        // Display the table\n",
       "        $(document).ready(function () {\n",
       "            \n",
       "            window.__itables_render('#e340dfd6-3cc9-4029-9716-d1acc5601cdc', dt_args);\n",
       "        });\n",
       "    }\n",
       "</script>\n"
      ],
      "text/plain": [
       "                             researchsubject_id  \\\n",
       "0   RIDER Neuro MRI-1205970977__rider_neuro_mri   \n",
       "1             PGBM-019__brain_tumor_progression   \n",
       "2             PGBM-002__brain_tumor_progression   \n",
       "3   RIDER Neuro MRI-1596825834__rider_neuro_mri   \n",
       "4          4dd86ebd-ef16-4b2b-9ea0-5d1d7afef257   \n",
       "..                                          ...   \n",
       "95                                  W19__ivygap   \n",
       "96                                   W2__ivygap   \n",
       "97                                   W3__ivygap   \n",
       "98                                  W53__ivygap   \n",
       "99                                  W16__ivygap   \n",
       "\n",
       "                           researchsubject_identifier  \\\n",
       "0   [{'system': 'IDC', 'value': 'RIDER Neuro MRI-1...   \n",
       "1   [{'system': 'IDC', 'value': 'PGBM-019__brain_t...   \n",
       "2   [{'system': 'IDC', 'value': 'PGBM-002__brain_t...   \n",
       "3   [{'system': 'IDC', 'value': 'RIDER Neuro MRI-1...   \n",
       "4   [{'system': 'GDC', 'value': '4dd86ebd-ef16-4b2...   \n",
       "..                                                ...   \n",
       "95        [{'system': 'IDC', 'value': 'W19__ivygap'}]   \n",
       "96         [{'system': 'IDC', 'value': 'W2__ivygap'}]   \n",
       "97         [{'system': 'IDC', 'value': 'W3__ivygap'}]   \n",
       "98        [{'system': 'IDC', 'value': 'W53__ivygap'}]   \n",
       "99        [{'system': 'IDC', 'value': 'W16__ivygap'}]   \n",
       "\n",
       "   member_of_research_project primary_diagnosis_condition  \\\n",
       "0             rider_neuro_mri                        None   \n",
       "1     brain_tumor_progression                        None   \n",
       "2     brain_tumor_progression                        None   \n",
       "3             rider_neuro_mri                        None   \n",
       "4                   TCGA-DLBC     Mature B-Cell Lymphomas   \n",
       "..                        ...                         ...   \n",
       "95                     ivygap                        None   \n",
       "96                     ivygap                        None   \n",
       "97                     ivygap                        None   \n",
       "98                     ivygap                        None   \n",
       "99                     ivygap                        None   \n",
       "\n",
       "   primary_diagnosis_site                  subject_id  \n",
       "0                   Brain  RIDER Neuro MRI-1205970977  \n",
       "1                   Brain                    PGBM-019  \n",
       "2                   Brain                    PGBM-002  \n",
       "3                   Brain  RIDER Neuro MRI-1596825834  \n",
       "4                   Brain                TCGA-RQ-AAAT  \n",
       "..                    ...                         ...  \n",
       "95                  Brain                         W19  \n",
       "96                  Brain                          W2  \n",
       "97                  Brain                          W3  \n",
       "98                  Brain                         W53  \n",
       "99                  Brain                         W16  \n",
       "\n",
       "[100 rows x 6 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "researchsubjectresults.to_dataframe()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4564beee",
   "metadata": {},
   "source": [
    "Each row from the researchsubject endpoint results tells us about a subject in a given study. Using this endpoint we can find out information like what studies fit our search criteria, and also get data that we can filter to have only subjects from multiple studies, or only subjects from single studies.\n",
    "\n",
    "Any given subject will have one row per study they participated in. The subject_id in the last column of this view is the same as the `id` in the first column of the Subjects endpoint results. You can use this to combine information across endpoints, which is covered near the end of the <a href=\"../BuildingACohort/#merging-results-across-endpoints\">Cohort Building workflow</a> notebook.\n",
    "\n",
    "---\n",
    "\n",
    "<div class=\"cdadefine\" style=\"background-color:#add9e5;color:black;padding:20px;\">\n",
    "\n",
    "<h3>ResearchSubject Field Definitions</h3>\n",
    "\n",
    "<i>A research subject is the entity of interest in a specific research study or project, typically a human being or an animal, but can also be a device, group of humans or animals, or a tissue sample. Human research subjects are usually not traceable to a particular person to protect the subjects privacy. This entity plays the role of the case_id in existing data. A subject who participates in 3 studies will have 3 researchsubject IDs</i>\n",
    "    \n",
    "<ul>\n",
    "<li><b>id:</b> The 'logical' identifier of the entity in the system of record, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system. For CDA, this is case_id.</li>\n",
    "<li><b>identifier:</b> A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.</li>\n",
    "<li><b>identifier.system:</b> The system or namespace that defines the identifier.</li>\n",
    "<li><b>identifier.value:</b> The value of the identifier, as defined by the system.</li>\n",
    "<li><b>member_of_research_project:</b> A reference to the Project(s) of which this ResearchSubject is a member.</li>\n",
    "<li><b>primary_diagnosis_condition:</b> The text term used to describe the type of malignant disease, as categorized by the World Health Organization's (WHO) <a href=\"https://www.who.int/standards/classifications/other-classifications/international-classification-of-diseases-for-oncology\">International Classification of Diseases for Oncology</a> (ICD-O). This attribute represents the disease that qualified the subject for inclusion on the ResearchProject.</li>\n",
    "<li><b>primary_diagnosis_site:</b> The text term used to describe the primary site of disease, as categorized by the World Health Organization's (WHO) <a href=\"https://www.who.int/standards/classifications/other-classifications/international-classification-of-diseases-for-oncology\">International Classification of Diseases for Oncology</a> (ICD-O). This categorization groups cases into general categories. This attribute represents the primary site of disease that qualified the subject for inclusion on the ResearchProject.</li>\n",
    "<li><b>subject_id:</b> The 'logical' identifier of the entity in the system of record, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system. Can be joined to the `id` field from subject results</li>\n",
    "</ul>  \n",
    "\n",
    "</div>\n",
    "    \n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47372646",
   "metadata": {},
   "source": [
    "### diagnosis\n",
    "\n",
    "The diagnosis endpoint is an extension of the researchsubject endpoint, and returns information about researchsubjects that have a diagnosis that meets our search criteria:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "2f80fa21",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4.519</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4519</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m4.519\u001b[0m sec \u001b[1;36m4519\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table id=\"fa3318af-e9a0-48a8-8310-38e30195d402\" class=\"display\"style=\"max-width:100%\"><thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>diagnosis_id</th>\n",
       "      <th>diagnosis_identifier</th>\n",
       "      <th>primary_diagnosis</th>\n",
       "      <th>age_at_diagnosis</th>\n",
       "      <th>morphology</th>\n",
       "      <th>stage</th>\n",
       "      <th>grade</th>\n",
       "      <th>method_of_diagnosis</th>\n",
       "      <th>subject_id</th>\n",
       "      <th>researchsubject_id</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr><td>Loading... (need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td></tr></tbody></table>\n",
       "<style>\n",
       "table td {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "table th {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "thead input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "tfoot input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "</style>\n",
       "<script>\n",
       "    // We use a namespace per table (= the next curly bracket)\n",
       "    // to avoid conflicts between the various tables' data & dt_args\n",
       "    {\n",
       "        // Define the table data\n",
       "        const data = [[\"021e5e64-6bb8-5d40-b61d-0eb41612fdf6\", \"[{'system': 'GDC', 'value': '021e5e64-6bb8-5d40-b61d-0eb41612fdf6'}]\", \"Astrocytoma, anaplastic\", 18977.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-CS-6665\", \"c16d9f69-26f9-4ec7-b2d5-ff9f7dacfe0f\"], [\"15d04341-d00e-5a4d-a4c5-3688adca5bba\", \"[{'system': 'GDC', 'value': '15d04341-d00e-5a4d-a4c5-3688adca5bba'}]\", \"Oligodendroglioma, NOS\", 11595.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-DU-6401\", \"97cb8701-7d63-4142-b404-006fbb3ecb0b\"], [\"17ad0147-433a-5d06-be6c-847ee8ed59d7\", \"[{'system': 'GDC', 'value': '17ad0147-433a-5d06-be6c-847ee8ed59d7'}]\", \"Glioblastoma\", 24319.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-76-4934\", \"d1fcd53b-6c55-42b0-9b24-492f8286f5bc\"], [\"2704dc4b-32e9-5043-8d37-8106fc8dffc1\", \"[{'system': 'GDC', 'value': '2704dc4b-32e9-5043-8d37-8106fc8dffc1'}]\", \"Glioblastoma\", 31267.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-76-4928\", \"dfa3ef71-7006-4c6d-81c4-e0c0c7b75c26\"], [\"3b8fc610-2848-11ec-b712-0a4e2186f121\", \"[{'system': 'PDC', 'value': '3b8fc610-2848-11ec-b712-0a4e2186f121'}]\", \"Glioblastoma\", 17038.0, \"9440/3\", \"Not Reported\", \"Not Reported\", \"\", \"C3L-01049\", \"104c11d9-2139-11ea-aee1-0e1aae319e49\"], [\"5eabb6c4-7c0b-4edc-91b1-81c7ad4ce123\", \"[{'system': 'GDC', 'value': '5eabb6c4-7c0b-4edc-91b1-81c7ad4ce123'}]\", \"Germinoma\", NaN, \"9064/3\", \"None\", \"Not Reported\", \"None\", \"GENIE-DFCI-008366\", \"01ae1ba0-1111-4f7f-9c2d-58cb98ede40c\"], [\"60e94d36-29b4-4f90-9eb1-4275b46671b0\", \"[{'system': 'GDC', 'value': '60e94d36-29b4-4f90-9eb1-4275b46671b0'}]\", \"Malignant lymphoma, NOS\", NaN, \"9590/3\", \"None\", \"Not Reported\", \"None\", \"GENIE-DFCI-004985\", \"bc5f57df-f541-4901-acc8-c92da842ef79\"], [\"6daddcb8-496d-5f26-a60f-f8a115b0371c\", \"[{'system': 'GDC', 'value': '6daddcb8-496d-5f26-a60f-f8a115b0371c'}]\", \"Astrocytoma, anaplastic\", 19866.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-CS-5397\", \"bdfade49-9059-4665-beea-c55117ba6564\"], [\"723aedfd-d152-5eb7-8c40-c89f95735d3c\", \"[{'system': 'GDC', 'value': '723aedfd-d152-5eb7-8c40-c89f95735d3c'}]\", \"Glioblastoma\", 24101.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-06-0241\", \"6d4ab866-ca0b-4455-898e-df8a6ac3e924\"], [\"728c9c04-c344-55c5-beee-deaaacf218e4\", \"[{'system': 'GDC', 'value': '728c9c04-c344-55c5-beee-deaaacf218e4'}]\", \"Glioblastoma\", 18659.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-19-1389\", \"309005a2-93a8-4566-b8d3-6b9310144266\"], [\"81da9c68-9d3f-5bcd-8571-ec3f2dc09961\", \"[{'system': 'GDC', 'value': '81da9c68-9d3f-5bcd-8571-ec3f2dc09961'}]\", \"Glioblastoma\", 19130.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-27-2518\", \"d3d27286-73e1-4cdd-914a-34c210fd6398\"], [\"b59e6236-22b4-529d-a4c9-60e91bbb1077\", \"[{'system': 'GDC', 'value': 'b59e6236-22b4-529d-a4c9-60e91bbb1077'}]\", \"Mixed glioma\", 14524.0, \"9382/3\", \"None\", \"not reported\", \"None\", \"TCGA-TQ-A7RH\", \"6ef2d9ab-f72e-48cf-92b8-f3159d28160c\"], [\"d0921bb7-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd0921bb7-ff5e-11e9-9a07-0a80fada099c'}]\", \"Atypical teratoid/rhabdoid tumor\", 1038.0, \"9508/3\", \"Unknown\", \"G4\", \"Not Reported\", \"C406761\", \"d08d99ca-ff5e-11e9-9a07-0a80fada099c\"], [\"d09287d9-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd09287d9-ff5e-11e9-9a07-0a80fada099c'}]\", \"Glioma, malignant\", 2869.0, \"9380/3\", \"Unknown\", \"High Grade\", \"Not Reported\", \"C714384\", \"d08dd498-ff5e-11e9-9a07-0a80fada099c\"], [\"d5301d3a-b057-5cc2-a370-5aadad7a9b55\", \"[{'system': 'GDC', 'value': 'd5301d3a-b057-5cc2-a370-5aadad7a9b55'}]\", \"Oligodendroglioma, NOS\", 12972.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-FG-8182\", \"6a0bcf0c-fa4c-4119-99d2-f722b781d20f\"], [\"db7099d6-acbe-5cfa-9c04-f6e25e309285\", \"[{'system': 'GDC', 'value': 'db7099d6-acbe-5cfa-9c04-f6e25e309285'}]\", \"Glioblastoma\", 21560.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-26-5133\", \"a28b256e-e085-467d-bdba-5c39718012d7\"], [\"f216443a-99e9-5f83-8d9c-e95d9e8c4708\", \"[{'system': 'GDC', 'value': 'f216443a-99e9-5f83-8d9c-e95d9e8c4708'}]\", \"Oligodendroglioma, NOS\", 16911.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-RY-A83X\", \"739cc9f1-71be-4f81-a5d1-eda673903e45\"], [\"f39223c8-1901-49d0-b909-f4cf77e4dc09\", \"[{'system': 'GDC', 'value': 'f39223c8-1901-49d0-b909-f4cf77e4dc09'}]\", \"Teratoma, malignant, NOS\", NaN, \"9080/3\", \"None\", \"Not Reported\", \"None\", \"GENIE-MDA-3558\", \"457f6e8d-ee6b-4301-a1af-2e1a87f313c7\"], [\"030802cc-6775-551f-b388-680b89793c83\", \"[{'system': 'GDC', 'value': '030802cc-6775-551f-b388-680b89793c83'}]\", \"Oligodendroglioma, anaplastic\", 11528.0, \"9451/3\", \"None\", \"not reported\", \"None\", \"TCGA-FG-7638\", \"1f54d21e-752f-496d-8453-4b9b8738cbce\"], [\"12bcca94-ee52-5d03-900c-d775855a3775\", \"[{'system': 'GDC', 'value': '12bcca94-ee52-5d03-900c-d775855a3775'}]\", \"Oligodendroglioma, NOS\", 18494.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-VM-A8C8\", \"a66a3847-7570-4486-8845-86b6125104a2\"], [\"22629218-d3b5-52b1-9a9c-f8db0feac530\", \"[{'system': 'GDC', 'value': '22629218-d3b5-52b1-9a9c-f8db0feac530'}]\", \"Oligodendroglioma, NOS\", 24122.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-DU-6400\", \"178ab87c-0582-4b02-bf6b-3a4c59a5ee1b\"], [\"3bae4729-2848-11ec-b712-0a4e2186f121\", \"[{'system': 'PDC', 'value': '3bae4729-2848-11ec-b712-0a4e2186f121'}]\", \"Glioblastoma\", 15483.0, \"9440/3\", \"Not Reported\", \"Not Reported\", \"\", \"C3L-01142\", \"104c14b2-2139-11ea-aee1-0e1aae319e49\"], [\"3de321de-cd02-5183-b73f-f6ee62290d4c\", \"[{'system': 'GDC', 'value': '3de321de-cd02-5183-b73f-f6ee62290d4c'}]\", \"Glioblastoma\", 20813.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-02-0111\", \"09ddf661-25fd-4baa-a1e8-bf90b2bb1d31\"], [\"4ec9d363-f23e-5cfc-92a7-53dc08762435\", \"[{'system': 'GDC', 'value': '4ec9d363-f23e-5cfc-92a7-53dc08762435'}]\", \"Glioblastoma\", 21628.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-14-1794\", \"eb9c8e66-6710-4141-ae28-1e5c88eaee47\"], [\"621f8adb-470e-5586-aa0a-3845262bbfca\", \"[{'system': 'GDC', 'value': '621f8adb-470e-5586-aa0a-3845262bbfca'}]\", \"Glioblastoma\", 20568.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-27-1834\", \"7340f325-579f-4b90-96aa-3a7b362129ca\"], [\"65111d80-4498-4c1b-88ee-0cc4c92c0ef9\", \"[{'system': 'GDC', 'value': '65111d80-4498-4c1b-88ee-0cc4c92c0ef9'}]\", \"Glioblastoma\", 18038.0, \"9440/3\", \"None\", \"Not Reported\", \"None\", \"C3N-00661\", \"d3936bbd-6aa7-4525-bd74-9d9d11cbb98a\"], [\"725b40d4-a9dd-51be-ba35-1bdc308f4b34\", \"[{'system': 'GDC', 'value': '725b40d4-a9dd-51be-ba35-1bdc308f4b34'}]\", \"Mixed glioma\", 11637.0, \"9382/3\", \"None\", \"not reported\", \"None\", \"TCGA-DB-A64Q\", \"887def39-e212-490d-8849-2bc932fceff0\"], [\"8825b4b7-3b99-5ae9-8f86-5ee0309ae4b3\", \"[{'system': 'GDC', 'value': '8825b4b7-3b99-5ae9-8f86-5ee0309ae4b3'}]\", \"Astrocytoma, anaplastic\", 11083.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-RY-A843\", \"1f2f3bf6-acdd-4a72-8c33-230de40910eb\"], [\"a9bc6391-9bf6-5ab5-bcd2-3d94483f0151\", \"[{'system': 'GDC', 'value': 'a9bc6391-9bf6-5ab5-bcd2-3d94483f0151'}]\", \"Oligodendroglioma, NOS\", 9667.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-HT-7676\", \"9ee268a7-fa71-4f3f-919f-cf4ee1de2658\"], [\"d09272c7-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd09272c7-ff5e-11e9-9a07-0a80fada099c'}]\", \"Craniopharyngioma\", 2800.0, \"9350/1\", \"Unknown\", \"G1\", \"Not Reported\", \"C65559\", \"d08dc646-ff5e-11e9-9a07-0a80fada099c\"], [\"d092a644-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd092a644-ff5e-11e9-9a07-0a80fada099c'}]\", \"Glioma, NOS\", 3765.0, \"9400/3\", \"Unknown\", \"G1\", \"Not Reported\", \"C808110\", \"d08debdf-ff5e-11e9-9a07-0a80fada099c\"], [\"d092b6ff-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd092b6ff-ff5e-11e9-9a07-0a80fada099c'}]\", \"Glioma, NOS\", 4087.0, \"9400/3\", \"Unknown\", \"G1\", \"Not Reported\", \"C86100\", \"d08df8cf-ff5e-11e9-9a07-0a80fada099c\"], [\"d092b992-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd092b992-ff5e-11e9-9a07-0a80fada099c'}]\", \"Craniopharyngioma\", 2241.0, \"9350/1\", \"Unknown\", \"G1\", \"Not Reported\", \"C88314\", \"d08dfa48-ff5e-11e9-9a07-0a80fada099c\"], [\"fdb5dd51-de3d-53ad-b186-f5eedb26c1cd\", \"[{'system': 'GDC', 'value': 'fdb5dd51-de3d-53ad-b186-f5eedb26c1cd'}]\", \"Glioblastoma\", 13263.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-02-0084\", \"5a9f6f8d-44c0-4cc7-891c-db0f8758f236\"], [\"09b465df-8d8e-5883-8bc7-6580b35b5f64\", \"[{'system': 'GDC', 'value': '09b465df-8d8e-5883-8bc7-6580b35b5f64'}]\", \"Glioblastoma\", 28477.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-06-0648\", \"ef6f6553-2575-457e-bc07-401215e54759\"], [\"1cff0532-8a32-4749-9c78-35192355e464\", \"[{'system': 'GDC', 'value': '1cff0532-8a32-4749-9c78-35192355e464'}]\", \"Yolk sac tumor\", NaN, \"9071/3\", \"None\", \"Not Reported\", \"None\", \"GENIE-MSK-P-0004002\", \"83a43a0c-4cbb-4e47-b170-5c6d1486fa92\"], [\"1e08a9c8-b422-4820-9c39-1136d44479d3\", \"[{'system': 'GDC', 'value': '1e08a9c8-b422-4820-9c39-1136d44479d3'}]\", \"Mixed germ cell tumor\", NaN, \"9085/3\", \"None\", \"Not Reported\", \"None\", \"GENIE-MSK-P-0001922\", \"67521326-3e11-4db1-956d-3703289f0616\"], [\"211f3f36-59e2-5e29-95e1-fe9c28e3c9bb\", \"[{'system': 'GDC', 'value': '211f3f36-59e2-5e29-95e1-fe9c28e3c9bb'}]\", \"Glioblastoma\", 24050.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-15-0742\", \"f19850cb-50c4-4f3a-ba80-b1464958ffa8\"], [\"25a8127b-675f-5005-a797-86e5e784e05e\", \"[{'system': 'GDC', 'value': '25a8127b-675f-5005-a797-86e5e784e05e'}]\", \"Oligodendroglioma, NOS\", 15629.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-TQ-A8XE\", \"135a149a-d153-465e-aa58-06d47bb18e00\"], [\"318736a2-76ae-5881-a940-59b002fda9b9\", \"[{'system': 'GDC', 'value': '318736a2-76ae-5881-a940-59b002fda9b9'}]\", \"Astrocytoma, anaplastic\", 19234.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-S9-A6WL\", \"d62d871b-4612-4bf4-b53c-9dd431e507a0\"], [\"3263551a-7fe0-483f-8094-3af1d74f251f\", \"[{'system': 'GDC', 'value': '3263551a-7fe0-483f-8094-3af1d74f251f'}]\", \"Glioblastoma\", 23761.0, \"9440/3\", \"None\", \"Not Reported\", \"None\", \"C3N-02256\", \"d8319145-589b-4ec3-9618-7c17f3081457\"], [\"3beb8bc7-2848-11ec-b712-0a4e2186f121\", \"[{'system': 'PDC', 'value': '3beb8bc7-2848-11ec-b712-0a4e2186f121'}]\", \"Glioblastoma\", 18992.0, \"9440/3\", \"Not Reported\", \"Not Reported\", \"\", \"C3L-01154\", \"104c1862-2139-11ea-aee1-0e1aae319e49\"], [\"3e54ef30-2848-11ec-b712-0a4e2186f121\", \"[{'system': 'PDC', 'value': '3e54ef30-2848-11ec-b712-0a4e2186f121'}]\", \"Glioblastoma\", 25973.0, \"9440/3\", \"Not Reported\", \"Not Reported\", \"\", \"C3N-01815\", \"104c5e6c-2139-11ea-aee1-0e1aae319e49\"], [\"3f6e9759-ae88-5e33-9598-445d8304ecf4\", \"[{'system': 'GDC', 'value': '3f6e9759-ae88-5e33-9598-445d8304ecf4'}]\", \"Glioblastoma\", 17715.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-27-2519\", \"6ff96a7e-1b96-4530-b8a8-7f2e9e541955\"], [\"3fe9bab5-2848-11ec-b712-0a4e2186f121\", \"[{'system': 'PDC', 'value': '3fe9bab5-2848-11ec-b712-0a4e2186f121'}]\", \"Not Reported\", 20440.0, \"Not Reported\", \"Not Reported\", \"Not Reported\", \"\", \"GTEX-RN5K-0011-R10A-SM-HAKXU\", \"104c8d61-2139-11ea-aee1-0e1aae319e49\"], [\"4894d7f4-3c09-5a68-a2d3-670ea1dfb9bb\", \"[{'system': 'GDC', 'value': '4894d7f4-3c09-5a68-a2d3-670ea1dfb9bb'}]\", \"Mixed glioma\", 22348.0, \"9382/3\", \"None\", \"not reported\", \"None\", \"TCGA-DU-5852\", \"9ed5af0e-c87f-46ff-81e7-9d3041b4034e\"], [\"62f86760-df1c-5925-8b1a-e13d623a0183\", \"[{'system': 'GDC', 'value': '62f86760-df1c-5925-8b1a-e13d623a0183'}]\", \"Glioblastoma\", 27730.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-12-1598\", \"2b90648c-c99e-4d4d-8d9b-67ff2c4e6115\"], [\"8b24cb25-76af-5155-ac3a-4107f5f9465f\", \"[{'system': 'GDC', 'value': '8b24cb25-76af-5155-ac3a-4107f5f9465f'}]\", \"Oligodendroglioma, anaplastic\", 19823.0, \"9451/3\", \"None\", \"not reported\", \"None\", \"TCGA-DU-A76L\", \"395798c5-3136-4a30-8557-a67a3abdecaf\"], [\"93a4b78d-276b-560f-82aa-4189c66bba15\", \"[{'system': 'GDC', 'value': '93a4b78d-276b-560f-82aa-4189c66bba15'}]\", \"Glioblastoma\", 22835.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-06-0190\", \"74139255-a635-4c87-814d-3dd04ed630a8\"], [\"9daebe95-88a5-5e3f-9327-6f3d9c9cac8e\", \"[{'system': 'GDC', 'value': '9daebe95-88a5-5e3f-9327-6f3d9c9cac8e'}]\", \"Oligodendroglioma, NOS\", 20836.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-CS-6668\", \"a5d3f3fb-6541-419d-b47e-720d438f1bff\"], [\"abc23687-57e7-502f-a3c1-5c23681b821d\", \"[{'system': 'GDC', 'value': 'abc23687-57e7-502f-a3c1-5c23681b821d'}]\", \"Glioblastoma\", 13116.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-02-0024\", \"0553e60e-3510-417d-af8a-75947ebe8ab6\"], [\"ac6b1182-ddb1-5989-9d5a-31d69c13fb66\", \"[{'system': 'GDC', 'value': 'ac6b1182-ddb1-5989-9d5a-31d69c13fb66'}]\", \"Glioblastoma\", 30580.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-06-2559\", \"ca893d12-3d6c-4e6f-b0e7-7f4eb8bb724b\"], [\"b6b0a47f-508e-510a-8f53-3c89cda9e060\", \"[{'system': 'GDC', 'value': 'b6b0a47f-508e-510a-8f53-3c89cda9e060'}]\", \"Oligodendroglioma, NOS\", 13799.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-TQ-A7RI\", \"7989b7fb-b9d9-4d3f-9352-cd0c1f28d828\"], [\"c9e98471-dff6-4604-849b-3019ad57bbf4\", \"[{'system': 'GDC', 'value': 'c9e98471-dff6-4604-849b-3019ad57bbf4'}]\", \"Glioblastoma\", 17725.0, \"9440/3\", \"None\", \"Not Reported\", \"None\", \"C3L-01149\", \"9163a2fc-913d-4fab-b988-5955bee93843\"], [\"d092841e-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd092841e-ff5e-11e9-9a07-0a80fada099c'}]\", \"Glioma, malignant\", 4808.0, \"9380/3\", \"Unknown\", \"High Grade\", \"Not Reported\", \"C70848\", \"d08dd1a3-ff5e-11e9-9a07-0a80fada099c\"], [\"e4f3968f-9143-58e3-9d06-659cd6bbaa06\", \"[{'system': 'GDC', 'value': 'e4f3968f-9143-58e3-9d06-659cd6bbaa06'}]\", \"Glioblastoma\", 23835.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-19-2623\", \"c01ae0ee-fa58-45d2-ac33-d7f64d053bbb\"], [\"ef4ab0d9-fcd8-43e4-89bf-cdc9a4e1ed53\", \"[{'system': 'GDC', 'value': 'ef4ab0d9-fcd8-43e4-89bf-cdc9a4e1ed53'}]\", \"Germinoma\", NaN, \"9064/3\", \"None\", \"Not Reported\", \"None\", \"GENIE-DFCI-008015\", \"5456dedb-70ef-47af-b3ff-769795aaa089\"], [\"fc84ad87-1c53-5f55-a66c-f84d312b990f\", \"[{'system': 'GDC', 'value': 'fc84ad87-1c53-5f55-a66c-f84d312b990f'}]\", \"Glioblastoma\", 17880.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-41-3915\", \"43d98306-8b1f-4840-a1a0-146ba0c36400\"], [\"02ce9b1f-18f4-45ec-a487-63f9c74bb422\", \"[{'system': 'GDC', 'value': '02ce9b1f-18f4-45ec-a487-63f9c74bb422'}]\", \"Mixed germ cell tumor\", NaN, \"9085/3\", \"None\", \"Not Reported\", \"None\", \"GENIE-MSK-P-0002849\", \"3ecb27b2-75cc-44d0-879e-035e19f39193\"], [\"0f7bb10c-a17e-4a98-b559-461edbf840c8\", \"[{'system': 'GDC', 'value': '0f7bb10c-a17e-4a98-b559-461edbf840c8'}]\", \"Glioblastoma\", 23121.0, \"9440/3\", \"None\", \"Not Reported\", \"None\", \"C3N-01366\", \"a1da2f64-5a24-4e6b-abc1-e70aae23082c\"], [\"13c464b8-bd62-5d47-91ff-4b2c9183c48b\", \"[{'system': 'GDC', 'value': '13c464b8-bd62-5d47-91ff-4b2c9183c48b'}]\", \"Oligodendroglioma, NOS\", 12764.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-DU-5870\", \"eb42625e-fbbb-4bee-bbe9-315b3ca2138a\"], [\"195c5853-a955-551b-8601-6f0d8a08cea8\", \"[{'system': 'GDC', 'value': '195c5853-a955-551b-8601-6f0d8a08cea8'}]\", \"Glioblastoma\", 14838.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-08-0351\", \"91063e7e-60db-47a5-aeca-af7c37b1074e\"], [\"2faa8b42-f38e-50f2-9920-cafeafc989ae\", \"[{'system': 'GDC', 'value': '2faa8b42-f38e-50f2-9920-cafeafc989ae'}]\", \"Glioblastoma\", 28696.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-02-0281\", \"42fbe95f-9068-45a8-a8a2-c24db757eae6\"], [\"2fe9b6df-3cd8-5afd-9292-a0469623fc1d\", \"[{'system': 'GDC', 'value': '2fe9b6df-3cd8-5afd-9292-a0469623fc1d'}]\", \"Glioblastoma\", 25300.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-08-0511\", \"13480f06-32ee-48b5-a729-a963a7979b90\"], [\"3f8e5f0a-2848-11ec-b712-0a4e2186f121\", \"[{'system': 'PDC', 'value': '3f8e5f0a-2848-11ec-b712-0a4e2186f121'}]\", \"Glioblastoma\", 19856.0, \"9440/3\", \"Not Reported\", \"Not Reported\", \"\", \"C3N-03188\", \"104c8344-2139-11ea-aee1-0e1aae319e49\"], [\"48c83b72-1b53-57c8-969b-269c596d1059\", \"[{'system': 'GDC', 'value': '48c83b72-1b53-57c8-969b-269c596d1059'}]\", \"Oligodendroglioma, NOS\", 19944.0, \"9450/3\", \"None\", \"not reported\", \"None\", \"TCGA-HT-7467\", \"f4a1fc14-0d32-4e77-a8a3-fd8fea82188a\"], [\"557973d8-30a4-5770-a417-a2013974c05c\", \"[{'system': 'GDC', 'value': '557973d8-30a4-5770-a417-a2013974c05c'}]\", \"Glioblastoma\", 26549.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-06-0173\", \"68720179-d07f-44d8-8771-edcee5fecfea\"], [\"63f4a4f0-e079-5fdd-87d9-4c8f14a8c7dc\", \"[{'system': 'GDC', 'value': '63f4a4f0-e079-5fdd-87d9-4c8f14a8c7dc'}]\", \"Glioblastoma\", 24085.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-14-0812\", \"eff7f13b-ed32-4e85-a8d0-831b655d773f\"], [\"719033c0-6e8a-5644-965f-2b583c75192b\", \"[{'system': 'GDC', 'value': '719033c0-6e8a-5644-965f-2b583c75192b'}]\", \"Glioblastoma\", 21706.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-27-1838\", \"6fc6b9ca-84d8-4647-bbc8-c5ab472b1c02\"], [\"71b37b70-c4f3-509c-98ca-8a3cd581af85\", \"[{'system': 'GDC', 'value': '71b37b70-c4f3-509c-98ca-8a3cd581af85'}]\", \"Glioblastoma\", 23096.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-28-5218\", \"d558203d-3f70-42d4-accb-008ace280f48\"], [\"8ad83a6d-b1da-5b0f-9690-fc33e235a3f8\", \"[{'system': 'GDC', 'value': '8ad83a6d-b1da-5b0f-9690-fc33e235a3f8'}]\", \"Glioblastoma\", 14560.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-06-0650\", \"522808a2-f19d-4fab-b67e-0c31ec54b757\"], [\"8fbc0870-d899-54f1-b826-23fe2f2292c2\", \"[{'system': 'GDC', 'value': '8fbc0870-d899-54f1-b826-23fe2f2292c2'}]\", \"Astrocytoma, anaplastic\", 12725.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-DB-5277\", \"d05079f2-9883-46e6-ad06-9e561f08d819\"], [\"98f73fdd-adeb-5b5d-bbfb-1748f076589d\", \"[{'system': 'GDC', 'value': '98f73fdd-adeb-5b5d-bbfb-1748f076589d'}]\", \"Astrocytoma, NOS\", 18443.0, \"9400/3\", \"None\", \"not reported\", \"None\", \"TCGA-HT-7604\", \"019c5de9-74fd-48b7-95a3-227532e16c5a\"], [\"99dbe291-7b6d-5add-ba0e-a1eff1feebd7\", \"[{'system': 'GDC', 'value': '99dbe291-7b6d-5add-ba0e-a1eff1feebd7'}]\", \"Glioblastoma\", 28977.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-27-2526\", \"69d0a566-5fbf-45f6-a240-649b06868e27\"], [\"ac0b1caf-54a0-5d33-8eba-acfacf485f32\", \"[{'system': 'GDC', 'value': 'ac0b1caf-54a0-5d33-8eba-acfacf485f32'}]\", \"Glioblastoma\", 24134.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-32-5222\", \"e876dd29-68b0-4bf1-83d1-488c40068a35\"], [\"b0fa09d3-3d8d-519a-b235-10b1d6729329\", \"[{'system': 'GDC', 'value': 'b0fa09d3-3d8d-519a-b235-10b1d6729329'}]\", \"Astrocytoma, anaplastic\", 22565.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-FG-A87Q\", \"7e17e6fd-ed83-471f-91e3-5934885c8e87\"], [\"b193289e-e790-4c81-9b8d-0f21e8ab974b\", \"[{'system': 'GDC', 'value': 'b193289e-e790-4c81-9b8d-0f21e8ab974b'}]\", \"Papillary glioneuronal tumor\", NaN, \"9509/1\", \"None\", \"Not Reported\", \"None\", \"GENIE-MSK-P-0002900\", \"33d2884a-388f-4755-bf3b-a794ca5f14a4\"], [\"b52d1b5a-348c-4db6-910d-3348819fd7bb\", \"[{'system': 'GDC', 'value': 'b52d1b5a-348c-4db6-910d-3348819fd7bb'}]\", \"Glioblastoma\", 24242.0, \"9440/3\", \"None\", \"Not Reported\", \"None\", \"C3N-01856\", \"1eec8bfd-1ab9-4569-b635-c47bce7702f1\"], [\"bd4b0948-9d79-5092-9f36-41a4a09cd3f8\", \"[{'system': 'GDC', 'value': 'bd4b0948-9d79-5092-9f36-41a4a09cd3f8'}]\", \"Astrocytoma, anaplastic\", 12460.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-HT-A74O\", \"723cad09-aa2d-4492-b19d-661b310e1c58\"], [\"bf87b833-e161-5936-8cef-5c3adc698794\", \"[{'system': 'GDC', 'value': 'bf87b833-e161-5936-8cef-5c3adc698794'}]\", \"Glioblastoma\", 21920.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-12-0619\", \"0389b35b-651b-4776-b12a-d315a100f47c\"], [\"cee6d83c-dbb4-5167-b124-ae8c7474e5c9\", \"[{'system': 'GDC', 'value': 'cee6d83c-dbb4-5167-b124-ae8c7474e5c9'}]\", \"Astrocytoma, anaplastic\", 15092.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-QH-A6CS\", \"6d17c327-435a-4cba-9626-3b5b7b7375bb\"], [\"cfb87f27-ab69-5104-9b12-a803ef87c260\", \"[{'system': 'GDC', 'value': 'cfb87f27-ab69-5104-9b12-a803ef87c260'}]\", \"Astrocytoma, anaplastic\", 14375.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-P5-A5EZ\", \"82ff7a48-ea97-476e-9f4e-aacdeb6659bd\"], [\"d091c61d-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd091c61d-ff5e-11e9-9a07-0a80fada099c'}]\", \"Medulloblastoma, NOS\", 4234.0, \"9470/3\", \"Unknown\", \"G4\", \"Not Reported\", \"C28905\", \"d08d71f0-ff5e-11e9-9a07-0a80fada099c\"], [\"d09223c7-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd09223c7-ff5e-11e9-9a07-0a80fada099c'}]\", \"Glioma, NOS\", 6236.0, \"9400/3\", \"Unknown\", \"G1\", \"Not Reported\", \"C440832\", \"d08d9e76-ff5e-11e9-9a07-0a80fada099c\"], [\"d0928fb3-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd0928fb3-ff5e-11e9-9a07-0a80fada099c'}]\", \"Glioma, NOS\", 2478.0, \"9400/3\", \"Unknown\", \"G1\", \"Not Reported\", \"C72324\", \"d08ddb5b-ff5e-11e9-9a07-0a80fada099c\"], [\"d092bd9b-ff5e-11e9-9a07-0a80fada099c\", \"[{'system': 'PDC', 'value': 'd092bd9b-ff5e-11e9-9a07-0a80fada099c'}]\", \"Glioma, NOS\", 1982.0, \"9400/3\", \"Unknown\", \"G1\", \"Not Reported\", \"C883632\", \"d08dfca4-ff5e-11e9-9a07-0a80fada099c\"], [\"fbfccfb1-989d-4de5-a691-33d30cd90fd7\", \"[{'system': 'GDC', 'value': 'fbfccfb1-989d-4de5-a691-33d30cd90fd7'}]\", \"Glioblastoma multiforme\", 18581.0, \"9440/3\", \"None\", \"None\", \"None\", \"ER-B0GH\", \"5b9fa46b-36c5-4711-b276-6e86ab8aab29\"], [\"03603c65-d92c-5d36-bcd2-7e58bf7b43a4\", \"[{'system': 'GDC', 'value': '03603c65-d92c-5d36-bcd2-7e58bf7b43a4'}]\", \"Glioblastoma\", 21838.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-28-2499\", \"d88b35a3-a291-457a-b15b-a314859b25c5\"], [\"0b3a155a-3f67-402c-a05d-add39adffcd2\", \"[{'system': 'GDC', 'value': '0b3a155a-3f67-402c-a05d-add39adffcd2'}]\", \"Mixed germ cell tumor\", NaN, \"9085/3\", \"None\", \"Not Reported\", \"None\", \"GENIE-MSK-P-0003994\", \"85d7695b-eefc-483a-844b-14efaaff6066\"], [\"1acc1167-4fa0-5940-8de0-88686f0160b0\", \"[{'system': 'GDC', 'value': '1acc1167-4fa0-5940-8de0-88686f0160b0'}]\", \"Astrocytoma, anaplastic\", 21824.0, \"9401/3\", \"None\", \"not reported\", \"None\", \"TCGA-DU-7013\", \"d61b5d20-4d6d-4fdc-afe8-4b100b686eda\"], [\"3314363b-c85e-5b33-9013-da6f7d1e79ae\", \"[{'system': 'GDC', 'value': '3314363b-c85e-5b33-9013-da6f7d1e79ae'}]\", \"Oligodendroglioma, anaplastic\", 19185.0, \"9451/3\", \"None\", \"not reported\", \"None\", \"TCGA-R8-A6ML\", \"5119aceb-ad95-4904-b6c0-a0a4b42c17d0\"], [\"57d175a7-f78e-5e30-a35c-92ce31bb3de4\", \"[{'system': 'GDC', 'value': '57d175a7-f78e-5e30-a35c-92ce31bb3de4'}]\", \"Glioblastoma\", 11956.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-06-0151\", \"c57d6674-08d1-4eda-9ec1-ae439923d7cf\"], [\"6ead4fb2-efee-4cc7-9bd9-7df8909d8f1f\", \"[{'system': 'GDC', 'value': '6ead4fb2-efee-4cc7-9bd9-7df8909d8f1f'}]\", \"Embryonal carcinoma, NOS\", NaN, \"9070/3\", \"None\", \"Not Reported\", \"None\", \"GENIE-MSK-P-0002169\", \"19166ff3-ae32-4e95-88da-32cdd15032a1\"], [\"91cab5d0-9f51-5294-bca6-51076785baf8\", \"[{'system': 'GDC', 'value': '91cab5d0-9f51-5294-bca6-51076785baf8'}]\", \"Glioblastoma\", 27726.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-12-1098\", \"a05c4aca-5b7c-452a-a92c-f252539f9e9a\"], [\"925aa767-393c-5739-b0f9-f2b99cfc72f5\", \"[{'system': 'GDC', 'value': '925aa767-393c-5739-b0f9-f2b99cfc72f5'}]\", \"Glioblastoma\", 21232.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-06-5856\", \"f4fe7c02-be19-4929-8638-960e5776494c\"], [\"986cc414-2545-495c-bad3-95df6c5bf505\", \"[{'system': 'GDC', 'value': '986cc414-2545-495c-bad3-95df6c5bf505'}]\", \"Teratoma, benign\", NaN, \"9080/0\", \"None\", \"Not Reported\", \"None\", \"GENIE-DFCI-008091\", \"863f6e34-ebce-4133-87e0-108c5dc58221\"], [\"9b60596a-d804-4243-a24b-e94a8bb94189\", \"[{'system': 'GDC', 'value': '9b60596a-d804-4243-a24b-e94a8bb94189'}]\", \"Glioblastoma\", 23267.0, \"9440/3\", \"None\", \"Not Reported\", \"None\", \"C3L-04084\", \"0345c668-0597-49a9-80b6-17cc9cc9cae7\"], [\"ae659079-fc5b-50a0-af51-1a52f60e9de4\", \"[{'system': 'GDC', 'value': 'ae659079-fc5b-50a0-af51-1a52f60e9de4'}]\", \"Glioblastoma\", 23567.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-81-5910\", \"a63ce9ac-24a4-484e-8bcc-717cd7aa92df\"], [\"b07e96c3-742f-5f5a-9b64-558ee2f14ec4\", \"[{'system': 'GDC', 'value': 'b07e96c3-742f-5f5a-9b64-558ee2f14ec4'}]\", \"Mixed glioma\", 10790.0, \"9382/3\", \"None\", \"not reported\", \"None\", \"TCGA-HT-7681\", \"fbe32b94-b3ba-4a56-aeba-4cffe8de2da4\"], [\"c97e5bdd-8495-5426-bcbf-f8780e4f39cf\", \"[{'system': 'GDC', 'value': 'c97e5bdd-8495-5426-bcbf-f8780e4f39cf'}]\", \"Glioblastoma\", 21748.0, \"9440/3\", \"None\", \"not reported\", \"None\", \"TCGA-08-0359\", \"0aa5b68f-2b99-44d2-b17f-f4eb17fe891e\"]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"paging\": true, \"scrollCollapse\": true, \"scrollX\": \"200px\"};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        // Display the table\n",
       "        $(document).ready(function () {\n",
       "            \n",
       "            window.__itables_render('#fa3318af-e9a0-48a8-8310-38e30195d402', dt_args);\n",
       "        });\n",
       "    }\n",
       "</script>\n"
      ],
      "text/plain": [
       "                            diagnosis_id  \\\n",
       "0   021e5e64-6bb8-5d40-b61d-0eb41612fdf6   \n",
       "1   15d04341-d00e-5a4d-a4c5-3688adca5bba   \n",
       "2   17ad0147-433a-5d06-be6c-847ee8ed59d7   \n",
       "3   2704dc4b-32e9-5043-8d37-8106fc8dffc1   \n",
       "4   3b8fc610-2848-11ec-b712-0a4e2186f121   \n",
       "..                                   ...   \n",
       "95  986cc414-2545-495c-bad3-95df6c5bf505   \n",
       "96  9b60596a-d804-4243-a24b-e94a8bb94189   \n",
       "97  ae659079-fc5b-50a0-af51-1a52f60e9de4   \n",
       "98  b07e96c3-742f-5f5a-9b64-558ee2f14ec4   \n",
       "99  c97e5bdd-8495-5426-bcbf-f8780e4f39cf   \n",
       "\n",
       "                                 diagnosis_identifier  \\\n",
       "0   [{'system': 'GDC', 'value': '021e5e64-6bb8-5d4...   \n",
       "1   [{'system': 'GDC', 'value': '15d04341-d00e-5a4...   \n",
       "2   [{'system': 'GDC', 'value': '17ad0147-433a-5d0...   \n",
       "3   [{'system': 'GDC', 'value': '2704dc4b-32e9-504...   \n",
       "4   [{'system': 'PDC', 'value': '3b8fc610-2848-11e...   \n",
       "..                                                ...   \n",
       "95  [{'system': 'GDC', 'value': '986cc414-2545-495...   \n",
       "96  [{'system': 'GDC', 'value': '9b60596a-d804-424...   \n",
       "97  [{'system': 'GDC', 'value': 'ae659079-fc5b-50a...   \n",
       "98  [{'system': 'GDC', 'value': 'b07e96c3-742f-5f5...   \n",
       "99  [{'system': 'GDC', 'value': 'c97e5bdd-8495-542...   \n",
       "\n",
       "          primary_diagnosis  age_at_diagnosis morphology         stage  \\\n",
       "0   Astrocytoma, anaplastic           18977.0     9401/3          None   \n",
       "1    Oligodendroglioma, NOS           11595.0     9450/3          None   \n",
       "2              Glioblastoma           24319.0     9440/3          None   \n",
       "3              Glioblastoma           31267.0     9440/3          None   \n",
       "4              Glioblastoma           17038.0     9440/3  Not Reported   \n",
       "..                      ...               ...        ...           ...   \n",
       "95         Teratoma, benign               NaN     9080/0          None   \n",
       "96             Glioblastoma           23267.0     9440/3          None   \n",
       "97             Glioblastoma           23567.0     9440/3          None   \n",
       "98             Mixed glioma           10790.0     9382/3          None   \n",
       "99             Glioblastoma           21748.0     9440/3          None   \n",
       "\n",
       "           grade method_of_diagnosis         subject_id  \\\n",
       "0   not reported                None       TCGA-CS-6665   \n",
       "1   not reported                None       TCGA-DU-6401   \n",
       "2   not reported                None       TCGA-76-4934   \n",
       "3   not reported                None       TCGA-76-4928   \n",
       "4   Not Reported                              C3L-01049   \n",
       "..           ...                 ...                ...   \n",
       "95  Not Reported                None  GENIE-DFCI-008091   \n",
       "96  Not Reported                None          C3L-04084   \n",
       "97  not reported                None       TCGA-81-5910   \n",
       "98  not reported                None       TCGA-HT-7681   \n",
       "99  not reported                None       TCGA-08-0359   \n",
       "\n",
       "                      researchsubject_id  \n",
       "0   c16d9f69-26f9-4ec7-b2d5-ff9f7dacfe0f  \n",
       "1   97cb8701-7d63-4142-b404-006fbb3ecb0b  \n",
       "2   d1fcd53b-6c55-42b0-9b24-492f8286f5bc  \n",
       "3   dfa3ef71-7006-4c6d-81c4-e0c0c7b75c26  \n",
       "4   104c11d9-2139-11ea-aee1-0e1aae319e49  \n",
       "..                                   ...  \n",
       "95  863f6e34-ebce-4133-87e0-108c5dc58221  \n",
       "96  0345c668-0597-49a9-80b6-17cc9cc9cae7  \n",
       "97  a63ce9ac-24a4-484e-8bcc-717cd7aa92df  \n",
       "98  fbe32b94-b3ba-4a56-aeba-4cffe8de2da4  \n",
       "99  0aa5b68f-2b99-44d2-b17f-f4eb17fe891e  \n",
       "\n",
       "[100 rows x 10 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diagnosisresults = myquery.diagnosis.run()\n",
    "diagnosisresults.to_dataframe()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c6008331",
   "metadata": {},
   "source": [
    "\n",
    "---\n",
    "\n",
    "<div class=\"cdadefine\" style=\"background-color:#add9e5;color:black;padding:20px;\">\n",
    "\n",
    "<h3>Diagnosis Field Definitions</h3>\n",
    "\n",
    "<i>A collection of characteristics that describe an abnormal condition of the body as assessed at a point in time. May be used to capture information about neoplastic and non-neoplastic conditions.</i>\n",
    "\n",
    "    \n",
    "<ul>\n",
    "  <li><b>id:</b> The 'logical' identifier of the entity in the repository, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system.</li>\n",
    "<li><b>identifier:</b> A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.</li>\n",
    "<li><b>identifier.system:</b> The system or namespace that defines the identifier.</li>\n",
    "<li><b>identifier.value:</b> The value of the identifier, as defined by the system.</li>\n",
    "  <li><b>primary_diagnosis:</b> The diagnosis instance that qualified a subject for inclusion on a ResearchProject.</li>\n",
    "  <li><b>age_at_diagnosis:</b> The age in days of the individual at the time of diagnosis.</li>\n",
    "  <li><b>morphology:</b> Code that represents the histology of the disease using the third edition of the <a href=\"https://www.who.int/standards/classifications/other-classifications/international-classification-of-diseases-for-oncology\">International Classification of Diseases for Oncology</a>, published in 2000, used principally in tumor and cancer registries for coding the site (topography) and the histology (morphology) of neoplasms.</li>\n",
    "  <li><b>stage:</b> The extent of a cancer in the body. Staging is usually based on the size of the tumor, whether lymph nodes contain cancer, and whether the cancer has spread from the original site to other parts of the body. Different diseases may use different staging criteria, please refer to the originating data source to see what staging system is reported</li>\n",
    "  <li><b>grade:</b> The degree of abnormality of cancer cells, a measure of differentiation, the extent to which cancer cells are similar in appearance and function to healthy cells of the same tissue type. The degree of differentiation often relates to the clinical behavior of the particular tumor. Based on the microscopic findings, tumor grade is commonly described by one of four degrees of severity. Histopathologic grade of a tumor may be used to plan treatment and estimate the future course, outcome, and overall prognosis of disease. Certain types of cancers, such as soft tissue sarcoma, primary brain tumors, lymphomas, and breast have special grading systems.</li>\n",
    "  <li><b>method_of_diagnosis:</b> The method used to confirm the patients malignant diagnosis.</li>\n",
    "  <li><b>subject_id:</b> An identifier for the subject. Can be joined to the `id` field from subject results</li>\n",
    "  <li><b>researchsubject_id:</b> An identifier for the researchsubject. Can be joined to the `id` field from researchsubject results</li>\n",
    "</ul>  \n",
    "\n",
    "</div>\n",
    "    \n",
    "---\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5855d4dd",
   "metadata": {},
   "source": [
    "### treatment\n",
    "\n",
    "The treatment endpoint is an extension of diagnosis and returns information about treatments undertaken on researchsubjects that have a given diagnosis that meets our search criteria:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d81bdba0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4.61</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4610</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m4.61\u001b[0m sec \u001b[1;36m4610\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table id=\"1f0e9f2e-3cbc-43ba-bf4a-eff2fb2fb5ec\" class=\"display\"style=\"max-width:100%\"><thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>treatment_id</th>\n",
       "      <th>treatment_identifier</th>\n",
       "      <th>treatment_type</th>\n",
       "      <th>treatment_outcome</th>\n",
       "      <th>days_to_treatment_start</th>\n",
       "      <th>days_to_treatment_end</th>\n",
       "      <th>therapeutic_agent</th>\n",
       "      <th>treatment_anatomic_site</th>\n",
       "      <th>treatment_effect</th>\n",
       "      <th>treatment_end_reason</th>\n",
       "      <th>number_of_cycles</th>\n",
       "      <th>subject_id</th>\n",
       "      <th>researchsubject_id</th>\n",
       "      <th>diagnosis_id</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr><td>Loading... (need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td></tr></tbody></table>\n",
       "<style>\n",
       "table td {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "table th {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "thead input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "tfoot input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "</style>\n",
       "<script>\n",
       "    // We use a namespace per table (= the next curly bracket)\n",
       "    // to avoid conflicts between the various tables' data & dt_args\n",
       "    {\n",
       "        // Define the table data\n",
       "        const data = [[\"07c67ae3-8ece-5da4-be0f-e25a60f0f283\", \"[{'system': 'GDC', 'value': '07c67ae3-8ece-5da4-be0f-e25a60f0f283'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-08-0518\", \"64fa7f09-724a-45ee-a802-09e4affe077e\", \"85441794-e4dd-54a4-88f9-16e8c3a0a585\"], [\"0df1d067-698c-54e8-8d31-3fce30bc50a7\", \"[{'system': 'GDC', 'value': '0df1d067-698c-54e8-8d31-3fce30bc50a7'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-12-0827\", \"b75845ed-a19a-4caa-b362-e62b1e538152\", \"65ef1c26-0098-511e-b1ce-2e5df9d62f87\"], [\"1815e689-66a8-5eb2-932a-ff3c7fc9a083\", \"[{'system': 'GDC', 'value': '1815e689-66a8-5eb2-932a-ff3c7fc9a083'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-76-6656\", \"770aa1ee-aed9-4219-900e-63523cdf312f\", \"d41e67e8-4e18-5821-ae66-9a5b14da0f7c\"], [\"22952a1a-208e-44f2-8bc6-93c3049a0ca8\", \"[{'system': 'GDC', 'value': '22952a1a-208e-44f2-8bc6-93c3049a0ca8'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HCM-BROD-0106-C71\", \"afa149e0-edb7-4f8e-9f56-6e1c0ac78287\", \"2610ed82-d82d-4d6b-8de9-5cf01e30606a\"], [\"273281ca-ba99-519d-bfa2-b94efac4a2c2\", \"[{'system': 'GDC', 'value': '273281ca-ba99-519d-bfa2-b94efac4a2c2'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-02-0325\", \"f49b3e5a-6d40-4018-86ae-8396455d8878\", \"3d599cc2-4212-5a2c-b612-c15d7ad1f86f\"], [\"2a24cf1e-eb79-5a82-a392-6bddc5705b99\", \"[{'system': 'GDC', 'value': '2a24cf1e-eb79-5a82-a392-6bddc5705b99'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-5412\", \"e6e2d4c3-d37c-4de3-ac68-b301800770f0\", \"498c71e3-4275-5d89-b3df-380279f59c57\"], [\"311ecee0-9a40-53f6-96c8-d65c62e51d90\", \"[{'system': 'GDC', 'value': '311ecee0-9a40-53f6-96c8-d65c62e51d90'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-27-1836\", \"4d18f820-6396-46ae-b5d6-4ba446279be8\", \"02769a66-7a47-5b55-88f7-d3f34e2a9313\"], [\"33dd9436-bf5e-54dc-9ba9-b88ecfdb442f\", \"[{'system': 'GDC', 'value': '33dd9436-bf5e-54dc-9ba9-b88ecfdb442f'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-0154\", \"24ae6f30-eec8-49a7-abde-246b3873679e\", \"005f911c-2fd5-5d29-80b0-25ea4a1c07e5\"], [\"4d50656e-6dc3-577e-977f-ee70b2c447a4\", \"[{'system': 'GDC', 'value': '4d50656e-6dc3-577e-977f-ee70b2c447a4'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DU-6397\", \"e695b780-17f4-4e71-9120-7c6bcafaa3a7\", \"41ed343b-e060-540e-8f2c-4a93d4ff05f7\"], [\"4e961ebc-672a-5d72-939f-cdfea13f3c5e\", \"[{'system': 'GDC', 'value': '4e961ebc-672a-5d72-939f-cdfea13f3c5e'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-19-4065\", \"a262928c-e20a-4c02-8114-1227e05c43e1\", \"cdaceb60-cc09-5f83-9ff1-2ab04178ca82\"], [\"5228fe0a-17af-5de5-9410-ac751707dd32\", \"[{'system': 'GDC', 'value': '5228fe0a-17af-5de5-9410-ac751707dd32'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-S9-A7IQ\", \"cc451e2a-fa85-42d7-b7af-9fc0166945fa\", \"0a548a15-676c-54ef-916b-876f91b4b70e\"], [\"53a72796-feb4-54ad-82f7-623004a20102\", \"[{'system': 'GDC', 'value': '53a72796-feb4-54ad-82f7-623004a20102'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-E1-5319\", \"84569c1a-6baa-4380-ae3c-707df1be4618\", \"b7082500-5291-5e0e-b05b-fb1d06e46e09\"], [\"59aba3ad-0706-5440-8347-03373f7a25a8\", \"[{'system': 'GDC', 'value': '59aba3ad-0706-5440-8347-03373f7a25a8'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DB-A64X\", \"9922de10-9280-44c0-b86f-6d1ca7e55bf2\", \"a6a653db-22e9-502d-b1bf-00b38204be46\"], [\"5c37ced3-c6d6-5f50-9592-f66ed239378f\", \"[{'system': 'GDC', 'value': '5c37ced3-c6d6-5f50-9592-f66ed239378f'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-19-1389\", \"309005a2-93a8-4566-b8d3-6b9310144266\", \"728c9c04-c344-55c5-beee-deaaacf218e4\"], [\"5d5703ca-341d-5afb-96f1-067532ec760d\", \"[{'system': 'GDC', 'value': '5d5703ca-341d-5afb-96f1-067532ec760d'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-02-0333\", \"107335ed-03d3-47ab-b70d-df40e66102ac\", \"492ae30e-ca24-529e-a9d3-8d490269ca3c\"], [\"67147926-75b7-5e4b-8632-fdf0a78c5384\", \"[{'system': 'GDC', 'value': '67147926-75b7-5e4b-8632-fdf0a78c5384'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-1801\", \"bdc75722-1076-49f3-8dc7-f2b91e5a15eb\", \"30ca0d58-7734-5e80-9f70-2bd0b4550fdd\"], [\"748dea4d-d5f7-5549-a3ba-38bd63e46920\", \"[{'system': 'GDC', 'value': '748dea4d-d5f7-5549-a3ba-38bd63e46920'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-FG-A4MY\", \"febe2ce5-737b-43b8-bc70-4194fe3ed5fb\", \"432c4ff0-2855-5198-b82a-ba18149c5abc\"], [\"75bd7786-60be-5eff-a604-c474ad38d3b3\", \"[{'system': 'GDC', 'value': '75bd7786-60be-5eff-a604-c474ad38d3b3'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-CS-6665\", \"c16d9f69-26f9-4ec7-b2d5-ff9f7dacfe0f\", \"021e5e64-6bb8-5d40-b61d-0eb41612fdf6\"], [\"78f833eb-22b9-5d5e-bd8b-81869ecf2a54\", \"[{'system': 'GDC', 'value': '78f833eb-22b9-5d5e-bd8b-81869ecf2a54'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-S9-A6U0\", \"a343fbe3-147a-4656-9e90-5408298ca12c\", \"7a3e1af7-22d0-533d-9075-d7b4233acac8\"], [\"7f032f19-ff0a-5680-a285-c8697020948d\", \"[{'system': 'GDC', 'value': '7f032f19-ff0a-5680-a285-c8697020948d'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-19-1385\", \"a79b97df-d7f7-4df4-861b-936f94a1ab30\", \"44e41836-b8ff-57e6-9385-0b7241b17635\"], [\"88aead04-13b5-537b-be6c-b30c4b1bb07d\", \"[{'system': 'GDC', 'value': '88aead04-13b5-537b-be6c-b30c4b1bb07d'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-0410\", \"510f1760-932d-48a3-955b-8dd9c70800b3\", \"bf10db70-4cf8-5353-a4ad-bbcfdf039046\"], [\"8e26fb0e-0207-54e1-afb4-4ecd20ba12a6\", \"[{'system': 'GDC', 'value': '8e26fb0e-0207-54e1-afb4-4ecd20ba12a6'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-74-6577\", \"9888bf87-d0d1-474b-960d-d76b13352e7c\", \"ddd4cc52-0c30-5c21-bb50-65a6694b3961\"], [\"9752e6cb-3ecd-5d1d-a39b-d4e5e900d64d\", \"[{'system': 'GDC', 'value': '9752e6cb-3ecd-5d1d-a39b-d4e5e900d64d'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-FG-7638\", \"1f54d21e-752f-496d-8453-4b9b8738cbce\", \"030802cc-6775-551f-b388-680b89793c83\"], [\"9f3f0cff-b024-527c-b771-1f1d2ac5d653\", \"[{'system': 'GDC', 'value': '9f3f0cff-b024-527c-b771-1f1d2ac5d653'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-0211\", \"5c984433-33cf-42fc-b3ba-511efcdcab19\", \"cec1bfa2-94cf-5bf5-ad44-d1aad1c78586\"], [\"ba92d4af-bfc6-52b3-a76c-12d14dc124f8\", \"[{'system': 'GDC', 'value': 'ba92d4af-bfc6-52b3-a76c-12d14dc124f8'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DU-5872\", \"48607130-c09a-491d-882f-7d2591d13182\", \"66d7d6e6-b406-5ce8-b499-4d2840b532cc\"], [\"cf3f6345-d211-5008-8dd2-6327cdea9d9d\", \"[{'system': 'GDC', 'value': 'cf3f6345-d211-5008-8dd2-6327cdea9d9d'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-QH-A65V\", \"ad72e61e-51e3-4992-ac77-65e895935736\", \"df6387b2-3360-5fe1-b302-52839909c1c8\"], [\"e13816e1-9f9d-5373-9a55-7424ae8227f0\", \"[{'system': 'GDC', 'value': 'e13816e1-9f9d-5373-9a55-7424ae8227f0'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-12-0775\", \"7751fc13-ec33-4057-965d-3b2ac6183344\", \"39ba127f-b2e9-5a89-8dc2-4e8071abd6b2\"], [\"ffe58f11-ebe0-566a-81b8-5114716611c7\", \"[{'system': 'GDC', 'value': 'ffe58f11-ebe0-566a-81b8-5114716611c7'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-0882\", \"2188c194-dfe4-4471-9b8b-050db1a1062c\", \"6ae64e35-2c8f-5aea-aba2-58f534ab51d8\"], [\"059ec320-7b62-54ad-849d-35d228ccfbd3\", \"[{'system': 'GDC', 'value': '059ec320-7b62-54ad-849d-35d228ccfbd3'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-14-1453\", \"a9597785-a1d3-4788-a431-d25d69025690\", \"7c93752e-1375-56d3-8b4d-1260f8d2e9db\"], [\"0af85500-9d6c-5f35-aa00-aace47003158\", \"[{'system': 'GDC', 'value': '0af85500-9d6c-5f35-aa00-aace47003158'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-HT-7474\", \"72aa812d-5daa-4bd7-9028-ec541b1f25bd\", \"cb15fe31-75b0-5515-8e61-b1efd44309e0\"], [\"1187e947-2bcb-5cf8-89cf-7bcacfc6f32d\", \"[{'system': 'GDC', 'value': '1187e947-2bcb-5cf8-89cf-7bcacfc6f32d'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-28-1756\", \"0c0333c9-60dc-4487-baa2-7ec27acced27\", \"d483fa22-eeb6-5587-8289-c4dde7573e8a\"], [\"2b268b4d-b9d8-50d2-8c03-4620a3ec1aa9\", \"[{'system': 'GDC', 'value': '2b268b4d-b9d8-50d2-8c03-4620a3ec1aa9'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-RY-A83Z\", \"145c3685-f6de-4669-8ec4-6c3431a90532\", \"170b8efb-8750-530d-bc04-971f91cd479d\"], [\"3542f77a-9dc7-50ae-8d5b-25799387e975\", \"[{'system': 'GDC', 'value': '3542f77a-9dc7-50ae-8d5b-25799387e975'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-32-1977\", \"4294ae28-445b-4f4f-823a-dac4cecfaaf0\", \"c78273b7-8ce9-55a9-8cd7-54edfca60c25\"], [\"3ff9c771-bdd9-5513-97b6-485f22d7050f\", \"[{'system': 'GDC', 'value': '3ff9c771-bdd9-5513-97b6-485f22d7050f'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-32-2498\", \"0d5e5a6b-5113-43f2-836c-776207b21b56\", \"4798aafb-1844-5377-a342-f8775724d53e\"], [\"7f4207ac-1a7d-592d-bd2f-6f0ca583b90a\", \"[{'system': 'GDC', 'value': '7f4207ac-1a7d-592d-bd2f-6f0ca583b90a'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-08-0514\", \"bd114e05-5a97-41e2-a0d5-5d39a1e9d461\", \"005fbab3-9244-5aa7-8f5a-38180877bb52\"], [\"946378e1-c4e7-594c-b249-c18f73fe1c63\", \"[{'system': 'GDC', 'value': '946378e1-c4e7-594c-b249-c18f73fe1c63'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-HT-A74J\", \"1a20f675-d9bb-48b0-a49f-d52270bd8973\", \"cde6edea-c05e-5916-a15c-6589dc205283\"], [\"b5071e68-4f9d-5cb9-8c76-afa0531dae8e\", \"[{'system': 'GDC', 'value': 'b5071e68-4f9d-5cb9-8c76-afa0531dae8e'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-P5-A5F4\", \"0557b788-5aed-4919-85eb-a503ad893d75\", \"4cc53630-e7af-5380-9622-aed579082717\"], [\"b71671c4-3f4d-5d0b-aee4-be087a12126f\", \"[{'system': 'GDC', 'value': 'b71671c4-3f4d-5d0b-aee4-be087a12126f'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-HT-7616\", \"ab24cdc3-74a1-443f-831f-b7fb3821de6a\", \"e6b0cd58-7f08-5e52-91b3-aad4aa5519bb\"], [\"c02768db-87f9-5533-844c-caf75cd89f88\", \"[{'system': 'GDC', 'value': 'c02768db-87f9-5533-844c-caf75cd89f88'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-0213\", \"196ce35a-2d36-479e-aab9-91d2082d7e7c\", \"b38a2563-6cb2-5741-8e3b-02eaa874c5a5\"], [\"ee50b3b6-453a-5804-adeb-07c41a1a8069\", \"[{'system': 'GDC', 'value': 'ee50b3b6-453a-5804-adeb-07c41a1a8069'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-32-4719\", \"71bb1ef7-2bda-4478-b5b8-318f2e1bf5ac\", \"8087c928-f68f-59bc-bdb7-320179813718\"], [\"0d167298-0b5b-4039-be6b-12b1af520a76\", \"[{'system': 'GDC', 'value': '0d167298-0b5b-4039-be6b-12b1af520a76'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HCM-BROD-0416-C71\", \"aa17554b-2291-4947-9858-eadb82704f9b\", \"de976004-e763-4759-9a7a-5b24a7f4aafe\"], [\"0d22a5ff-7d93-5b79-9002-7c689a4a4719\", \"[{'system': 'GDC', 'value': '0d22a5ff-7d93-5b79-9002-7c689a4a4719'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-02-0033\", \"fc5ad666-d67a-4a5c-8e4e-1c8d099e9f85\", \"f7895b28-7936-53a6-bbd8-98dff83bbf38\"], [\"0edd1ce2-54b8-5709-a357-0b513ce4f573\", \"[{'system': 'GDC', 'value': '0edd1ce2-54b8-5709-a357-0b513ce4f573'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-2569\", \"620282f9-f932-4335-9c7d-ece53dcaf7a1\", \"fc7c38d3-8066-52c0-8a64-76ba9cbbb4ef\"], [\"1855993a-951d-43f1-a794-ed89db21debd\", \"[{'system': 'GDC', 'value': '1855993a-951d-43f1-a794-ed89db21debd'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HCM-BROD-0415-C71\", \"a42da11c-f1c5-4641-98f4-535c675d43d5\", \"20ebb213-ae8d-4b68-ac38-9bf33c452af9\"], [\"1994c6f9-9fef-509f-97bf-d85dca25cf4c\", \"[{'system': 'GDC', 'value': '1994c6f9-9fef-509f-97bf-d85dca25cf4c'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-12-0615\", \"141a1ef1-9be6-46d1-b445-305b222727d2\", \"78cacf8c-d55b-585d-b592-d28b64223411\"], [\"1b6265b9-4b00-54de-ae60-2f1a3845da23\", \"[{'system': 'GDC', 'value': '1b6265b9-4b00-54de-ae60-2f1a3845da23'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-S9-A7QX\", \"427f4d23-2b76-4a2a-a498-0c3473f57169\", \"227d5949-4382-59fa-908b-6290f74d4e33\"], [\"1d8867db-17a1-5553-8e50-0acfdbb13e33\", \"[{'system': 'GDC', 'value': '1d8867db-17a1-5553-8e50-0acfdbb13e33'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-0141\", \"4b43da9d-60ee-4269-b44d-d92c034b844c\", \"a3136969-edb5-5beb-bdbc-37dea5eace81\"], [\"26929d96-dd87-5a21-8d09-3ca0e704b52d\", \"[{'system': 'GDC', 'value': '26929d96-dd87-5a21-8d09-3ca0e704b52d'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-5412\", \"e6e2d4c3-d37c-4de3-ac68-b301800770f0\", \"498c71e3-4275-5d89-b3df-380279f59c57\"], [\"351cde63-8677-53d4-9531-69e50addb157\", \"[{'system': 'GDC', 'value': '351cde63-8677-53d4-9531-69e50addb157'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-CS-4943\", \"952dfd5d-e65a-4307-b6a9-2ed2b0d2d9ce\", \"f5f19e06-db25-5136-8a68-e5691046801f\"], [\"4439da8a-f1a6-50fd-8a08-51ab4dd74613\", \"[{'system': 'GDC', 'value': '4439da8a-f1a6-50fd-8a08-51ab4dd74613'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-02-2486\", \"79a68b32-29a3-47bf-9b2b-643ec7323d73\", \"563846e1-687f-55dd-8fac-c43032db8a3f\"], [\"46f09240-156a-5bee-a8c6-a0d80b6c61d0\", \"[{'system': 'GDC', 'value': '46f09240-156a-5bee-a8c6-a0d80b6c61d0'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-5411\", \"3f960d3b-a58c-43d0-a8a4-f3555b399c9d\", \"a305e41d-427d-5d76-b71b-a44c06296e62\"], [\"4b315605-297a-549a-8645-274470eba5bc\", \"[{'system': 'GDC', 'value': '4b315605-297a-549a-8645-274470eba5bc'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-P5-A5EZ\", \"82ff7a48-ea97-476e-9f4e-aacdeb6659bd\", \"cfb87f27-ab69-5104-9b12-a803ef87c260\"], [\"52e259b4-9dea-5685-a953-17800ccced79\", \"[{'system': 'GDC', 'value': '52e259b4-9dea-5685-a953-17800ccced79'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-16-1047\", \"8e8688f7-bf69-432b-a5ac-4f5f4d5c10ba\", \"15e95924-fe35-5fba-bb02-c4d7523be506\"], [\"6282304c-56d9-5a45-a159-94f87db8d7b4\", \"[{'system': 'GDC', 'value': '6282304c-56d9-5a45-a159-94f87db8d7b4'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-12-0703\", \"0a85c7b4-f07d-4727-b9d2-7b14c52edabb\", \"ae94d731-201b-56c5-b81b-85de42bada4c\"], [\"661f3d6d-7417-5dfc-8078-1a0076e7abf3\", \"[{'system': 'GDC', 'value': '661f3d6d-7417-5dfc-8078-1a0076e7abf3'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-28-1747\", \"35a7e49e-747b-45ce-9a07-3a5faba0ca94\", \"b6d50cb3-6104-5cd7-a485-e1825e05aed9\"], [\"69f41539-259f-5fe6-b0d3-9e74cfb1c000\", \"[{'system': 'GDC', 'value': '69f41539-259f-5fe6-b0d3-9e74cfb1c000'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DU-A7T6\", \"a0672f6f-6406-4d49-96d0-6afd571bbd00\", \"8f12e363-9856-56b4-bbd9-4f378ecb8e32\"], [\"6c7e2fc6-9e2d-5a65-9525-2a70bd20f106\", \"[{'system': 'GDC', 'value': '6c7e2fc6-9e2d-5a65-9525-2a70bd20f106'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-27-1835\", \"987cb702-057b-4198-8ef3-9cf6a9c51989\", \"49511a41-bb53-52ca-87a4-dfd538c619a6\"], [\"714eb88f-b063-5876-91c5-311650774244\", \"[{'system': 'GDC', 'value': '714eb88f-b063-5876-91c5-311650774244'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-E1-A7YN\", \"bcc17e9a-6fe3-44ff-963c-d2d850a431f1\", \"8d0e7691-72b3-5c07-81ba-0e044c947073\"], [\"7b9a4ce0-186d-585e-939e-c73aa7c216f2\", \"[{'system': 'GDC', 'value': '7b9a4ce0-186d-585e-939e-c73aa7c216f2'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-HT-7856\", \"c2c16878-b615-496c-8fcb-d49c97e15551\", \"fbc82525-6b46-5ff1-8028-a45c1ebf2e45\"], [\"7d4bfdf7-ef30-51dd-8d46-5dee543d9423\", \"[{'system': 'GDC', 'value': '7d4bfdf7-ef30-51dd-8d46-5dee543d9423'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-12-0707\", \"97279d35-8db4-49a9-8b63-468443a9b959\", \"00fd189f-5918-5655-bc0f-5dc4b6fa7b2b\"], [\"9aec79ed-a923-5832-bd7c-5f4aafa31042\", \"[{'system': 'GDC', 'value': '9aec79ed-a923-5832-bd7c-5f4aafa31042'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-P5-A72Z\", \"141f0546-f6f2-408f-ac86-07ca4aadf3d0\", \"ff61fa80-46fa-5f55-875b-74cd8e6629fa\"], [\"a11f80f9-61ab-57cd-ac97-6721c7d4d0ff\", \"[{'system': 'GDC', 'value': 'a11f80f9-61ab-57cd-ac97-6721c7d4d0ff'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-19-0962\", \"20a83eb1-466d-4f85-921a-cb8beea8eabe\", \"5edd8def-6431-5916-b9ac-ca16c71ca012\"], [\"a33f3201-4a39-5bf7-b184-cf21abeabaf9\", \"[{'system': 'GDC', 'value': 'a33f3201-4a39-5bf7-b184-cf21abeabaf9'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-P5-A781\", \"3c6dc0eb-e94b-4293-b665-f3cba04fc8de\", \"083506e3-2d9c-54be-a069-460b172de1ce\"], [\"ad5e74ce-62f7-5406-a392-5d63b49d2a74\", \"[{'system': 'GDC', 'value': 'ad5e74ce-62f7-5406-a392-5d63b49d2a74'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-19-2621\", \"035b09b7-add1-456d-ae80-20e8a03f6d7b\", \"6be33846-933c-516d-a137-84cb835a4f61\"], [\"b4902fde-a6cd-4676-9e17-421b6e097d33\", \"[{'system': 'GDC', 'value': 'b4902fde-a6cd-4676-9e17-421b6e097d33'}]\", \"None\", \"None\", \"None\", \"None\", \"Temozolomide\", \"None\", \"None\", \"None\", \"None\", \"HCM-BROD-0213-C71\", \"08b22310-e8dd-4638-8c5b-dea48328450e\", \"d45af56c-a54d-4c45-a783-3f1422fad837\"], [\"b4faa13c-0cff-468b-a214-7b6a77117155\", \"[{'system': 'GDC', 'value': 'b4faa13c-0cff-468b-a214-7b6a77117155'}]\", \"None\", \"None\", \"None\", \"None\", \"Temozolomide\", \"None\", \"None\", \"None\", \"None\", \"ER-B0GH\", \"5b9fa46b-36c5-4711-b276-6e86ab8aab29\", \"fbfccfb1-989d-4de5-a691-33d30cd90fd7\"], [\"bb3603cb-68dc-46b8-a97b-20b578cbaece\", \"[{'system': 'GDC', 'value': 'bb3603cb-68dc-46b8-a97b-20b578cbaece'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HCM-BROD-0210-C71\", \"d420e653-3fb2-432b-9e81-81232a80264d\", \"75ba645e-7756-4208-825b-67cff507ac69\"], [\"cfb1765a-0a58-50a8-aaf2-de2133496bdc\", \"[{'system': 'GDC', 'value': 'cfb1765a-0a58-50a8-aaf2-de2133496bdc'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DU-6394\", \"42cc9620-98fb-4164-a3b2-28d084ca5a03\", \"b03af995-e9d5-51b2-bcb9-d13207595b30\"], [\"dbd8bcc6-3b9f-5920-9437-e46548d09652\", \"[{'system': 'GDC', 'value': 'dbd8bcc6-3b9f-5920-9437-e46548d09652'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-32-4213\", \"22e0c3ea-9f6d-4d73-9282-17ee4553f436\", \"8be79ed6-67c2-503a-8979-2bc0ed57defe\"], [\"dd1d9508-dfe7-5eb5-b675-4a2c3d6def0f\", \"[{'system': 'GDC', 'value': 'dd1d9508-dfe7-5eb5-b675-4a2c3d6def0f'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-32-4210\", \"e710230d-16c7-4789-8ef0-dbdf56bb36d7\", \"cf88dee8-4b3a-56fd-90dc-f4819e7d928e\"], [\"ef53df13-f984-5b88-a921-8de4a492a122\", \"[{'system': 'GDC', 'value': 'ef53df13-f984-5b88-a921-8de4a492a122'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DU-6395\", \"6355cade-7b3a-43a8-9f1f-8e7bc45755a8\", \"c59505b0-f818-555e-a3e0-8a204285b64d\"], [\"fee67a97-f4bf-5137-a517-b64987d2bb23\", \"[{'system': 'GDC', 'value': 'fee67a97-f4bf-5137-a517-b64987d2bb23'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-02-0451\", \"a5d3714d-1b1b-480e-8ec6-f01317cdbf14\", \"218b433c-2b8d-5428-aa27-67bdd93ac3be\"], [\"082ea60c-2f27-5655-a16e-40a9e39c1165\", \"[{'system': 'GDC', 'value': '082ea60c-2f27-5655-a16e-40a9e39c1165'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DU-7019\", \"1b43ff0c-cf13-4620-b5c7-7abd9129612f\", \"5e617d8e-cc21-5055-b71e-1ab53c20bb4e\"], [\"246e6d85-64a0-500b-a0ea-45046324643b\", \"[{'system': 'GDC', 'value': '246e6d85-64a0-500b-a0ea-45046324643b'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-S9-A6TV\", \"048056cd-39dd-4134-a58b-70bebb3dd2ff\", \"0faa8664-023b-5eb5-900c-08b7b4b101f5\"], [\"2de2ad8d-82c5-5747-90b2-34cfc14c619b\", \"[{'system': 'GDC', 'value': '2de2ad8d-82c5-5747-90b2-34cfc14c619b'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DU-5853\", \"2d42dd0e-be3a-46ae-a635-c6f9c52f9fa2\", \"a8680b1f-bb36-51ce-a082-71a7384cc103\"], [\"4b7edde0-c549-5869-9b8f-f0c6a041f60d\", \"[{'system': 'GDC', 'value': '4b7edde0-c549-5869-9b8f-f0c6a041f60d'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-08-0351\", \"91063e7e-60db-47a5-aeca-af7c37b1074e\", \"195c5853-a955-551b-8601-6f0d8a08cea8\"], [\"5823266e-9430-586c-9333-67be23b74a08\", \"[{'system': 'GDC', 'value': '5823266e-9430-586c-9333-67be23b74a08'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-0745\", \"386b629e-fab1-4033-b088-45d6eeb4a13e\", \"75ed0ded-48b1-5b33-9bb8-806a04447214\"], [\"5caf0316-e104-4ae6-ae37-8420c1407a10\", \"[{'system': 'GDC', 'value': '5caf0316-e104-4ae6-ae37-8420c1407a10'}]\", \"None\", \"None\", \"None\", \"None\", \"Temozolomide\", \"None\", \"None\", \"None\", \"None\", \"HCM-BROD-0048-C71\", \"4b9b3130-2483-4e5d-8c4d-e225590a5cd2\", \"7f7968f0-e608-441d-b7a6-61c30361d16d\"], [\"71e5777d-788d-5a83-9b63-977b115f74df\", \"[{'system': 'GDC', 'value': '71e5777d-788d-5a83-9b63-977b115f74df'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-16-1060\", \"1101faa1-a713-489b-8593-960a9d6bda42\", \"89d02f46-8123-5107-a8d5-9ea5cd33381d\"], [\"838826f8-1bac-581d-bccc-53bcac13b93b\", \"[{'system': 'GDC', 'value': '838826f8-1bac-581d-bccc-53bcac13b93b'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-19-2620\", \"352768f9-3ce1-419c-beef-6515c78f5d7a\", \"b6ce5b13-2f57-57d8-b41f-003af77c9373\"], [\"874efde1-63a2-5a09-baa3-ba1c3dfa10b6\", \"[{'system': 'GDC', 'value': '874efde1-63a2-5a09-baa3-ba1c3dfa10b6'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-HT-8012\", \"9351b1ae-89e6-4091-934f-d50da06cd01d\", \"7cd353f6-1938-5fcb-8cc1-34f5ef946b19\"], [\"879d7dde-ee8f-5a3c-afaf-013f5f28f9cc\", \"[{'system': 'GDC', 'value': '879d7dde-ee8f-5a3c-afaf-013f5f28f9cc'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-2564\", \"8ff9f921-f9e9-41c1-a5d4-891fd4cfe979\", \"07086aa2-4d60-55e4-a284-e4b519ae6363\"], [\"a4b0c011-4fb6-5a5d-a159-1b92b18ce942\", \"[{'system': 'GDC', 'value': 'a4b0c011-4fb6-5a5d-a159-1b92b18ce942'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-16-1045\", \"cd73f38a-f6ff-4e7b-bd43-ec7b82dbe7df\", \"8f220292-c163-5f71-886d-202c571d52b5\"], [\"c0c88bbf-3a51-51a1-961d-4611fe687798\", \"[{'system': 'GDC', 'value': 'c0c88bbf-3a51-51a1-961d-4611fe687798'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-HT-7601\", \"e7fdf164-a85d-4ff5-9676-d2215ca35403\", \"e7914526-4035-56bc-9d16-24bc93dd33ee\"], [\"c7178555-05b3-504b-9ac9-e462817e7ac3\", \"[{'system': 'GDC', 'value': 'c7178555-05b3-504b-9ac9-e462817e7ac3'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-4W-AA9R\", \"f55a023c-84b8-4f7d-87db-7a9939733c59\", \"6513e572-0cb6-57fb-b44f-2587015ef6f4\"], [\"cacce449-f07d-4ca5-acad-fc9b64aa5af9\", \"[{'system': 'GDC', 'value': 'cacce449-f07d-4ca5-acad-fc9b64aa5af9'}]\", \"None\", \"None\", \"None\", \"None\", \"Temozolomide\", \"None\", \"None\", \"None\", \"None\", \"ER-B0DO\", \"51343e16-05b6-4314-8169-59ff765bda0a\", \"81edc3da-046f-4275-9dda-b8e92d5d8341\"], [\"cc862b2c-6872-53f4-9ae2-ac5661e5761f\", \"[{'system': 'GDC', 'value': 'cc862b2c-6872-53f4-9ae2-ac5661e5761f'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-HW-8321\", \"36cf458b-3c8e-48e7-92ab-aea1c698e417\", \"45ff6725-e157-560f-8ca7-197092fefd01\"], [\"e4d6d478-309d-567a-9332-c14aae7d5afc\", \"[{'system': 'GDC', 'value': 'e4d6d478-309d-567a-9332-c14aae7d5afc'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-R8-A6MO\", \"1ebdabea-8931-47af-a1cf-de1bd1de2a5b\", \"5a109f90-f3e6-53d3-a4e3-3e81bbb89de7\"], [\"1e55709a-abb4-508b-bff6-c9b7ecc9e382\", \"[{'system': 'GDC', 'value': '1e55709a-abb4-508b-bff6-c9b7ecc9e382'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DB-A4XB\", \"fb6437f9-ade8-4c33-a0d0-ceacb2bf784d\", \"c4ba02cf-341d-51e8-8a1a-a6aeccea4397\"], [\"2aab0550-36ff-5904-908a-34477a7cd5e0\", \"[{'system': 'GDC', 'value': '2aab0550-36ff-5904-908a-34477a7cd5e0'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-DH-A66F\", \"cfcd3835-bb09-400e-b7eb-55ac139d01f8\", \"1d497e09-8d45-557e-abaa-3f1f0582b6a5\"], [\"307c2986-043e-504d-b072-55a0e37a9651\", \"[{'system': 'GDC', 'value': '307c2986-043e-504d-b072-55a0e37a9651'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-S9-A6WM\", \"f79420ca-b0ae-417c-95f7-d28c35760202\", \"c7a7a135-a3c0-52eb-8d39-cf7fa5eea183\"], [\"36f79c38-4002-519d-94d4-86565e475221\", \"[{'system': 'GDC', 'value': '36f79c38-4002-519d-94d4-86565e475221'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-02-0024\", \"0553e60e-3510-417d-af8a-75947ebe8ab6\", \"abc23687-57e7-502f-a3c1-5c23681b821d\"], [\"3ee29e84-92e9-581d-9afd-bbc8ceede124\", \"[{'system': 'GDC', 'value': '3ee29e84-92e9-581d-9afd-bbc8ceede124'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-HT-7604\", \"019c5de9-74fd-48b7-95a3-227532e16c5a\", \"98f73fdd-adeb-5b5d-bbfb-1748f076589d\"], [\"4cc0094b-4f76-5c06-94d9-054d668a2baf\", \"[{'system': 'GDC', 'value': '4cc0094b-4f76-5c06-94d9-054d668a2baf'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-32-2498\", \"0d5e5a6b-5113-43f2-836c-776207b21b56\", \"4798aafb-1844-5377-a342-f8775724d53e\"], [\"58277ad9-47c6-543f-89e3-d3aded754379\", \"[{'system': 'GDC', 'value': '58277ad9-47c6-543f-89e3-d3aded754379'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-28-2513\", \"30256f61-7be9-4d47-8afd-afafa7a079c0\", \"453d2fe4-7176-5466-a465-3ba26d437069\"], [\"65181048-74e8-5421-8572-c3af40cc413d\", \"[{'system': 'GDC', 'value': '65181048-74e8-5421-8572-c3af40cc413d'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-6694\", \"863d58e7-91c2-4602-98ed-c6c6e0859566\", \"2b30dbb2-0099-508a-94b8-ee6147c5635f\"], [\"7b93fd57-4573-410d-998a-898648696489\", \"[{'system': 'GDC', 'value': '7b93fd57-4573-410d-998a-898648696489'}]\", \"None\", \"None\", \"None\", \"None\", \"Irinotecan\", \"None\", \"None\", \"None\", \"None\", \"ER-ACXF\", \"0f72c194-c923-4779-818a-fadc9e400d69\", \"4c6ef299-f1d5-48a1-8a72-2e6b04b2eb7b\"], [\"81d84a22-1038-5707-8f3f-451fb6461527\", \"[{'system': 'GDC', 'value': '81d84a22-1038-5707-8f3f-451fb6461527'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-02-0258\", \"70fc222d-7423-4921-9007-cdf27c7f1ff7\", \"99f94667-035a-514a-b0fd-416946347617\"], [\"88f67a62-7030-5448-be4e-cde8a420b2b1\", \"[{'system': 'GDC', 'value': '88f67a62-7030-5448-be4e-cde8a420b2b1'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-06-1802\", \"13d12179-3182-4f41-85a2-90fd50e51480\", \"f76fe9e8-12c5-5109-8f9c-41479b1c3378\"], [\"89839070-3421-503b-87c6-81d12161d991\", \"[{'system': 'GDC', 'value': '89839070-3421-503b-87c6-81d12161d991'}]\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"TCGA-RY-A83Y\", \"172701cf-709b-4e8f-b2fa-e2690a9e272d\", \"f1256f3e-2f3f-5ea6-805f-6fc9be900397\"]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"paging\": true, \"scrollCollapse\": true, \"scrollX\": \"200px\"};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        // Display the table\n",
       "        $(document).ready(function () {\n",
       "            \n",
       "            window.__itables_render('#1f0e9f2e-3cbc-43ba-bf4a-eff2fb2fb5ec', dt_args);\n",
       "        });\n",
       "    }\n",
       "</script>\n"
      ],
      "text/plain": [
       "                            treatment_id  \\\n",
       "0   07c67ae3-8ece-5da4-be0f-e25a60f0f283   \n",
       "1   0df1d067-698c-54e8-8d31-3fce30bc50a7   \n",
       "2   1815e689-66a8-5eb2-932a-ff3c7fc9a083   \n",
       "3   22952a1a-208e-44f2-8bc6-93c3049a0ca8   \n",
       "4   273281ca-ba99-519d-bfa2-b94efac4a2c2   \n",
       "..                                   ...   \n",
       "95  65181048-74e8-5421-8572-c3af40cc413d   \n",
       "96  7b93fd57-4573-410d-998a-898648696489   \n",
       "97  81d84a22-1038-5707-8f3f-451fb6461527   \n",
       "98  88f67a62-7030-5448-be4e-cde8a420b2b1   \n",
       "99  89839070-3421-503b-87c6-81d12161d991   \n",
       "\n",
       "                                 treatment_identifier treatment_type  \\\n",
       "0   [{'system': 'GDC', 'value': '07c67ae3-8ece-5da...           None   \n",
       "1   [{'system': 'GDC', 'value': '0df1d067-698c-54e...           None   \n",
       "2   [{'system': 'GDC', 'value': '1815e689-66a8-5eb...           None   \n",
       "3   [{'system': 'GDC', 'value': '22952a1a-208e-44f...           None   \n",
       "4   [{'system': 'GDC', 'value': '273281ca-ba99-519...           None   \n",
       "..                                                ...            ...   \n",
       "95  [{'system': 'GDC', 'value': '65181048-74e8-542...           None   \n",
       "96  [{'system': 'GDC', 'value': '7b93fd57-4573-410...           None   \n",
       "97  [{'system': 'GDC', 'value': '81d84a22-1038-570...           None   \n",
       "98  [{'system': 'GDC', 'value': '88f67a62-7030-544...           None   \n",
       "99  [{'system': 'GDC', 'value': '89839070-3421-503...           None   \n",
       "\n",
       "   treatment_outcome days_to_treatment_start days_to_treatment_end  \\\n",
       "0               None                    None                  None   \n",
       "1               None                    None                  None   \n",
       "2               None                    None                  None   \n",
       "3               None                    None                  None   \n",
       "4               None                    None                  None   \n",
       "..               ...                     ...                   ...   \n",
       "95              None                    None                  None   \n",
       "96              None                    None                  None   \n",
       "97              None                    None                  None   \n",
       "98              None                    None                  None   \n",
       "99              None                    None                  None   \n",
       "\n",
       "   therapeutic_agent treatment_anatomic_site treatment_effect  \\\n",
       "0               None                    None             None   \n",
       "1               None                    None             None   \n",
       "2               None                    None             None   \n",
       "3               None                    None             None   \n",
       "4               None                    None             None   \n",
       "..               ...                     ...              ...   \n",
       "95              None                    None             None   \n",
       "96        Irinotecan                    None             None   \n",
       "97              None                    None             None   \n",
       "98              None                    None             None   \n",
       "99              None                    None             None   \n",
       "\n",
       "   treatment_end_reason number_of_cycles         subject_id  \\\n",
       "0                  None             None       TCGA-08-0518   \n",
       "1                  None             None       TCGA-12-0827   \n",
       "2                  None             None       TCGA-76-6656   \n",
       "3                  None             None  HCM-BROD-0106-C71   \n",
       "4                  None             None       TCGA-02-0325   \n",
       "..                  ...              ...                ...   \n",
       "95                 None             None       TCGA-06-6694   \n",
       "96                 None             None            ER-ACXF   \n",
       "97                 None             None       TCGA-02-0258   \n",
       "98                 None             None       TCGA-06-1802   \n",
       "99                 None             None       TCGA-RY-A83Y   \n",
       "\n",
       "                      researchsubject_id                          diagnosis_id  \n",
       "0   64fa7f09-724a-45ee-a802-09e4affe077e  85441794-e4dd-54a4-88f9-16e8c3a0a585  \n",
       "1   b75845ed-a19a-4caa-b362-e62b1e538152  65ef1c26-0098-511e-b1ce-2e5df9d62f87  \n",
       "2   770aa1ee-aed9-4219-900e-63523cdf312f  d41e67e8-4e18-5821-ae66-9a5b14da0f7c  \n",
       "3   afa149e0-edb7-4f8e-9f56-6e1c0ac78287  2610ed82-d82d-4d6b-8de9-5cf01e30606a  \n",
       "4   f49b3e5a-6d40-4018-86ae-8396455d8878  3d599cc2-4212-5a2c-b612-c15d7ad1f86f  \n",
       "..                                   ...                                   ...  \n",
       "95  863d58e7-91c2-4602-98ed-c6c6e0859566  2b30dbb2-0099-508a-94b8-ee6147c5635f  \n",
       "96  0f72c194-c923-4779-818a-fadc9e400d69  4c6ef299-f1d5-48a1-8a72-2e6b04b2eb7b  \n",
       "97  70fc222d-7423-4921-9007-cdf27c7f1ff7  99f94667-035a-514a-b0fd-416946347617  \n",
       "98  13d12179-3182-4f41-85a2-90fd50e51480  f76fe9e8-12c5-5109-8f9c-41479b1c3378  \n",
       "99  172701cf-709b-4e8f-b2fa-e2690a9e272d  f1256f3e-2f3f-5ea6-805f-6fc9be900397  \n",
       "\n",
       "[100 rows x 14 columns]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "treatmentresults = myquery.treatment.run()\n",
    "treatmentresults.to_dataframe()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30804682",
   "metadata": {},
   "source": [
    "\n",
    "---\n",
    "\n",
    "<div class=\"cdadefine\" style=\"background-color:#add9e5;color:black;padding:20px;\">\n",
    "\n",
    "<h3>Treatment Field Definitions</h3>\n",
    "\n",
    "<i><i> Medication administration or other treatment types. A single research subject may have multiple treatments for a single diagnosis, and/or different diagnoses, and different treatments, across different studies</i></i>\n",
    "\n",
    "    \n",
    "<ul>\n",
    "  <li><b>id:</b> The 'logical' identifier of the entity in the repository, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system.</li>\n",
    "<li><b>identifier:</b> A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.</li>\n",
    "<li><b>identifier.system:</b> The system or namespace that defines the identifier.</li>\n",
    "<li><b>identifier.value:</b> The value of the identifier, as defined by the system.</li>\n",
    "  <li><b>treatment_type:</b> The treatment type including medication/therapeutics or other procedures.</li>\n",
    "  <li><b>treatment_outcome:</b> The final outcome of the treatment.</li>\n",
    "  <li><b>days_to_treatment_start:</b> The timepoint at which the treatment started.</li>\n",
    "  <li><b>days_to_treatment_end:</b>The timepoint at which the treatment ended. </li>\n",
    "  <li><b>therapeutic_agent:</b> One or more therapeutic agents as part of this treatment.</li>\n",
    "  <li><b>treatment_anatomic_site:</b> The anatomical site that the treatment targets.</li>\n",
    "  <li><b>treatment_effect:</b>The effect of a treatment on the diagnosis or tumor. </li>\n",
    "  <li><b>treatment_end_reason:</b>The reason the treatment ended. </li>\n",
    "  <li><b>number_of_cycles:</b>The number of treatment cycles the subject received. </li>\n",
    "  <li><b>subject_id:</b> An identifier for the subject. Can be joined to the `id` field from subject results</li>\n",
    "  <li><b>researchsubject_id:</b> An identifier for the researchsubject. Can be joined to the `id` field from researchsubject results</li>\n",
    "  <li><b>researchsubject_diagnosis_id:</b> An identifier for the diagnosis. Can be joined to the `id` field from diagnosis results</li>\n",
    "</ul>  \n",
    "\n",
    "</div>\n",
    "    \n",
    "---\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c00bec8",
   "metadata": {},
   "source": [
    "### specimen\n",
    "\n",
    "We can use this same query to see what specimens are available for brain tissue at the CDA:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "51960eed",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">7.896</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">7896</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m7.896\u001b[0m sec \u001b[1;36m7896\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\n",
       "            \n",
       "            Offset: 0\n",
       "            Count: 100\n",
       "            Total Row Count: 39220\n",
       "            More pages: True\n",
       "            "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "specimenresults =  myquery.specimen.run()\n",
    "specimenresults"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f254547",
   "metadata": {},
   "source": [
    "Nearly 40,000 specimens meet our search criteria! We would typically expect this number to be much larger than our number of subjects or researchsubjects. First because studies will often take more than one sample per subject, and second because any given specimen might be aliquoted out to be used in multiple tests. Since we didn't specify any further filters, our results will return all of these as separate speciments. Let's look at a few:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c55b0128",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"8ae12187-3d1b-452f-82da-f08005dd4962\" class=\"display\"style=\"max-width:100%\"><thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>specimen_id</th>\n",
       "      <th>specimen_identifier</th>\n",
       "      <th>specimen_associated_project</th>\n",
       "      <th>days_to_collection</th>\n",
       "      <th>primary_disease_type</th>\n",
       "      <th>anatomical_site</th>\n",
       "      <th>source_material_type</th>\n",
       "      <th>specimen_type</th>\n",
       "      <th>derived_from_specimen</th>\n",
       "      <th>derived_from_subject</th>\n",
       "      <th>subject_id</th>\n",
       "      <th>researchsubject_id</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr><td>Loading... (need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td></tr></tbody></table>\n",
       "<style>\n",
       "table td {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "table th {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "thead input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "tfoot input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "</style>\n",
       "<script>\n",
       "    // We use a namespace per table (= the next curly bracket)\n",
       "    // to avoid conflicts between the various tables' data & dt_args\n",
       "    {\n",
       "        // Define the table data\n",
       "        const data = [[\"0024bf91-4ba7-4e0d-9e23-cb37188324c7\", \"[{'system': 'GDC', 'value': '0024bf91-4ba7-4e0d-9e23-cb37188324c7'}]\", \"TCGA-LGG\", 78.0, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"portion\", \"3407f4e4-02ef-49aa-bea0-f7c496ad7371\", \"TCGA-S9-A7QW\", \"TCGA-S9-A7QW\", \"765588aa-075f-477f-9c18-099d018d3a1b\"], [\"01b98b0e-bbfc-4e0f-934a-3a6ac9486342\", \"[{'system': 'GDC', 'value': '01b98b0e-bbfc-4e0f-934a-3a6ac9486342'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"portion\", \"ae23f336-e901-4e45-b139-5e105060d3af\", \"TCGA-HT-7609\", \"TCGA-HT-7609\", \"bfbc0d1e-2a0b-4c60-8a37-91e3ce4b79ee\"], [\"01ec04df-91c8-4c46-a71d-fe1abe06a221\", \"[{'system': 'GDC', 'value': '01ec04df-91c8-4c46-a71d-fe1abe06a221'}]\", \"TCGA-LGG\", 219.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"183243f7-1294-490c-a5b8-af6bd8740e01\", \"TCGA-HW-A5KL\", \"TCGA-HW-A5KL\", \"0639b753-4099-4ca4-adb9-763069a614ef\"], [\"0242c021-1602-420e-a245-8ee1052fdcef\", \"[{'system': 'GDC', 'value': '0242c021-1602-420e-a245-8ee1052fdcef'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"b44d1202-4b05-545c-8f00-fdad812c28ef\", \"TCGA-HT-7689\", \"TCGA-HT-7689\", \"d58b535a-6c95-43bb-ad88-0600e6447537\"], [\"031453eb-67ac-416e-8350-2e35f55c7773\", \"[{'system': 'GDC', 'value': '031453eb-67ac-416e-8350-2e35f55c7773'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"analyte\", \"0efe9cfc-89f2-4096-8c3e-c300a8efa1ee\", \"TCGA-02-2486\", \"TCGA-02-2486\", \"79a68b32-29a3-47bf-9b2b-643ec7323d73\"], [\"03f86eaa-264d-43f6-bb20-6d0a0f5646a2\", \"[{'system': 'GDC', 'value': '03f86eaa-264d-43f6-bb20-6d0a0f5646a2'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"portion\", \"3ffef4b7-94b1-4999-b49e-38b7ae2c404a\", \"TCGA-32-1976\", \"TCGA-32-1976\", \"397ddfb9-288b-48ce-be18-853409d8ae51\"], [\"045e3c27-15f4-4785-8258-86d754920559\", \"[{'system': 'GDC', 'value': '045e3c27-15f4-4785-8258-86d754920559'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"4c2b0b29-4d64-499c-972d-af5dd7d06d93\", \"TCGA-02-0266\", \"TCGA-02-0266\", \"ca9ad9d3-0ac6-403a-98a2-f679d0ee009e\"], [\"04d15c1b-9d8f-4f80-83aa-cd0f41543145\", \"[{'system': 'GDC', 'value': '04d15c1b-9d8f-4f80-83aa-cd0f41543145'}]\", \"TCGA-LGG\", 486.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"2a47f513-5749-44aa-a066-5355180b074b\", \"TCGA-RY-A83X\", \"TCGA-RY-A83X\", \"739cc9f1-71be-4f81-a5d1-eda673903e45\"], [\"054ea7b7-e714-4163-8003-3802b4bb7a3b\", \"[{'system': 'GDC', 'value': '054ea7b7-e714-4163-8003-3802b4bb7a3b'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"aba55c4f-7b09-49c0-a0ef-20cb5f8a3345\", \"TCGA-12-0662\", \"TCGA-12-0662\", \"a3cc2845-8a44-4b50-8a3e-17a3c2c3e077\"], [\"05f11061-e005-4602-834f-d71a77e163ed\", \"[{'system': 'GDC', 'value': '05f11061-e005-4602-834f-d71a77e163ed'}]\", \"TCGA-LGG\", 2402.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"879bd2ca-5473-4b35-abe9-1b0cfea6004d\", \"TCGA-S9-A6TS\", \"TCGA-S9-A6TS\", \"41e4dc71-7767-44c2-9d38-110dcd37b451\"], [\"0621f5be-f531-4c7a-87d7-1b87dec49ec2\", \"[{'system': 'GDC', 'value': '0621f5be-f531-4c7a-87d7-1b87dec49ec2'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"0615fa2a-2f03-478a-a444-ecb5a9854234\", \"TCGA-12-3650\", \"TCGA-12-3650\", \"5ef9486a-aeff-421d-b620-03ef119d85a5\"], [\"06953b13-c4d9-43ff-a5a4-7acc130962f8\", \"[{'system': 'GDC', 'value': '06953b13-c4d9-43ff-a5a4-7acc130962f8'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"160aa230-eb8d-40f2-84d3-11bb615f1d76\", \"TCGA-02-0037\", \"TCGA-02-0037\", \"d16ef9d7-9e9f-4dbb-9fb4-f8ceaf699e22\"], [\"07775931-ddb3-4fb4-a287-cb94b89fd149\", \"[{'system': 'GDC', 'value': '07775931-ddb3-4fb4-a287-cb94b89fd149'}]\", \"TCGA-GBM\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"85ac9019-9688-5ffe-adac-2011dcd3e32b\", \"TCGA-02-0070\", \"TCGA-02-0070\", \"863c285c-5b87-42b9-b8b3-1ae832a6ded3\"], [\"089fdeb8-a6dd-443d-9723-9a192de13e40\", \"[{'system': 'GDC', 'value': '089fdeb8-a6dd-443d-9723-9a192de13e40'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"f535e42f-e525-4753-a66a-a3c00c717184\", \"TCGA-06-0143\", \"TCGA-06-0143\", \"357e2b63-6876-4c69-9728-c52fada81970\"], [\"08b3ffb6-38e5-4765-9c92-10a00243fd7a\", \"[{'system': 'GDC', 'value': '08b3ffb6-38e5-4765-9c92-10a00243fd7a'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"814a7cfe-a5c8-481e-9076-9666659bd90b\", \"TCGA-FG-5964\", \"TCGA-FG-5964\", \"648252da-dd86-48d1-ae75-4257e3142b0b\"], [\"09d94397-2303-4844-9353-ac10d393bedc\", \"[{'system': 'GDC', 'value': '09d94397-2303-4844-9353-ac10d393bedc'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"7d2d495e-3657-481f-b2e6-cf7f90555a20\", \"TCGA-06-0127\", \"TCGA-06-0127\", \"f66d92ff-85ad-4c83-b127-ce34c8488040\"], [\"09f1dd55-2e3c-4905-9526-72c5a706ab00\", \"[{'system': 'GDC', 'value': '09f1dd55-2e3c-4905-9526-72c5a706ab00'}]\", \"TCGA-LGG\", 113.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"portion\", \"5dd79dbd-72f5-4da1-952c-ceedef212259\", \"TCGA-FG-A87N\", \"TCGA-FG-A87N\", \"872a12b4-8cbd-49d2-ac98-d846587f5794\"], [\"0abd2fe3-aa79-4560-9704-112114868ce3\", \"[{'system': 'GDC', 'value': '0abd2fe3-aa79-4560-9704-112114868ce3'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"portion\", \"0ee1d81a-3a3c-47f0-9e8b-f3e9caec3dc9\", \"TCGA-02-0025\", \"TCGA-02-0025\", \"6630e547-2596-4fb7-a657-c19497ff13b2\"], [\"0adf8843-6727-4e97-9e1f-a4d63ed2450a\", \"[{'system': 'GDC', 'value': '0adf8843-6727-4e97-9e1f-a4d63ed2450a'}]\", \"TCGA-LGG\", 111.0, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"analyte\", \"1b11c7e0-aaa8-4b66-a3f6-41c9d810f8a8\", \"TCGA-S9-A6WP\", \"TCGA-S9-A6WP\", \"081b6532-0ed4-445a-becb-cb2290f4854d\"], [\"0b2fadd2-77df-4009-a2fc-1b1e7d0f16cd\", \"[{'system': 'GDC', 'value': '0b2fadd2-77df-4009-a2fc-1b1e7d0f16cd'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"16958de9-afd2-42aa-b280-c3790270f420\", \"TCGA-27-1832\", \"TCGA-27-1832\", \"dd76930a-1678-4b70-9864-730534174d41\"], [\"0b38c4da-016a-499c-8bd2-2a22c912b74c\", \"[{'system': 'GDC', 'value': '0b38c4da-016a-499c-8bd2-2a22c912b74c'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"sample\", \"initial specimen\", \"TCGA-06-0125\", \"TCGA-06-0125\", \"8da3103e-3e6c-4176-a583-d5fe5e60601e\"], [\"0b3a52d1-906c-423a-8098-11a31d57e209\", \"[{'system': 'GDC', 'value': '0b3a52d1-906c-423a-8098-11a31d57e209'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"portion\", \"6a95270a-3455-4667-b6e3-4bb3ebe147e7\", \"TCGA-06-0143\", \"TCGA-06-0143\", \"357e2b63-6876-4c69-9728-c52fada81970\"], [\"0c179490-c0fc-4ac1-abdb-f5256abf1ef6\", \"[{'system': 'GDC', 'value': '0c179490-c0fc-4ac1-abdb-f5256abf1ef6'}]\", \"TCGA-LGG\", 4796.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"b5ad331b-4bf3-45c7-b9e7-260fd1d33370\", \"TCGA-E1-A7YQ\", \"TCGA-E1-A7YQ\", \"75dbc8fb-4db8-4764-824c-eccf3a223884\"], [\"0c7ff144-1ffd-42bc-a587-ce232b53b991\", \"[{'system': 'GDC', 'value': '0c7ff144-1ffd-42bc-a587-ce232b53b991'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"sample\", \"initial specimen\", \"TCGA-06-0158\", \"TCGA-06-0158\", \"bc316a17-9d73-4ef3-97e9-c4ac5516b75a\"], [\"0d3b1724-906d-49c1-8923-45fcdea4ceae\", \"[{'system': 'GDC', 'value': '0d3b1724-906d-49c1-8923-45fcdea4ceae'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"sample\", \"initial specimen\", \"TCGA-DB-A4XC\", \"TCGA-DB-A4XC\", \"33615113-791b-4286-a23a-ad3d1f8d4b09\"], [\"0d909ce2-1610-4eb6-8fd6-2bbbd3ff404c\", \"[{'system': 'GDC', 'value': '0d909ce2-1610-4eb6-8fd6-2bbbd3ff404c'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"analyte\", \"bc2d13bc-9349-4571-8341-2479516daec9\", \"TCGA-12-0618\", \"TCGA-12-0618\", \"f7ba48c8-46cf-40a9-8826-7e1f67d57171\"], [\"0f36cad2-9ab2-4fa7-bad6-fc96e343b7d1\", \"[{'system': 'GDC', 'value': '0f36cad2-9ab2-4fa7-bad6-fc96e343b7d1'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"bfa7fba3-f31c-437d-b880-e3143cdfd308\", \"TCGA-06-0145\", \"TCGA-06-0145\", \"3258cb3b-f63b-463c-b2e4-d638149157c5\"], [\"0f4beb18-2f8f-48da-8375-f7b4e725abd6\", \"[{'system': 'GDC', 'value': '0f4beb18-2f8f-48da-8375-f7b4e725abd6'}]\", \"GENIE-MDA\", NaN, \"Germ Cell Neoplasms\", \"None\", \"Primary Tumor\", \"aliquot\", \"7723eec1-2278-5963-9b7f-77db6daa8852\", \"GENIE-MDA-8345\", \"GENIE-MDA-8345\", \"4ba68c82-8f5e-4eda-9066-c497b93cfbfa\"], [\"0f5d2f65-2e75-405e-88a6-7ac7fb87d144\", \"[{'system': 'GDC', 'value': '0f5d2f65-2e75-405e-88a6-7ac7fb87d144'}]\", \"TCGA-LGG\", 5621.0, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"analyte\", \"d8677482-4ada-4c0a-a1ac-bf1cf427a1fc\", \"TCGA-E1-A7YY\", \"TCGA-E1-A7YY\", \"722c172f-46e6-47a1-82e5-3207278df89b\"], [\"0fc6cfb9-d58e-45da-b3a9-e0b977f859d7\", \"[{'system': 'GDC', 'value': '0fc6cfb9-d58e-45da-b3a9-e0b977f859d7'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"analyte\", \"a500acc6-7a39-4734-b6ee-7d692739fc2f\", \"TCGA-32-2498\", \"TCGA-32-2498\", \"0d5e5a6b-5113-43f2-836c-776207b21b56\"], [\"104d009a-2139-11ea-aee1-0e1aae319e49\", \"[{'system': 'PDC', 'value': '104d009a-2139-11ea-aee1-0e1aae319e49'}]\", \"CPTAC3-Discovery\", NaN, \"Glioblastoma\", \"\", \"Primary Tumor\", \"sample\", \"initial specimen\", \"C3N-01798\", \"C3N-01798\", \"104c5b6d-2139-11ea-aee1-0e1aae319e49\"], [\"104d055c-2139-11ea-aee1-0e1aae319e49\", \"[{'system': 'PDC', 'value': '104d055c-2139-11ea-aee1-0e1aae319e49'}]\", \"CPTAC3-Discovery\", NaN, \"Glioblastoma\", \"\", \"Primary Tumor\", \"sample\", \"initial specimen\", \"C3N-01816\", \"C3N-01816\", \"104c5f4b-2139-11ea-aee1-0e1aae319e49\"], [\"104d2b32-2139-11ea-aee1-0e1aae319e49\", \"[{'system': 'PDC', 'value': '104d2b32-2139-11ea-aee1-0e1aae319e49'}]\", \"CPTAC3-Discovery\", NaN, \"Glioblastoma\", \"\", \"Primary Tumor\", \"sample\", \"initial specimen\", \"C3N-03088\", \"C3N-03088\", \"104c7c51-2139-11ea-aee1-0e1aae319e49\"], [\"104dbb9a-2139-11ea-aee1-0e1aae319e49\", \"[{'system': 'PDC', 'value': '104dbb9a-2139-11ea-aee1-0e1aae319e49'}]\", \"CPTAC3-Discovery\", NaN, \"Glioblastoma\", \"\", \"Primary Tumor\", \"aliquot\", \"104d2257-2139-11ea-aee1-0e1aae319e49\", \"C3N-02783\", \"C3N-02783\", \"104c757a-2139-11ea-aee1-0e1aae319e49\"], [\"105482e0-6bb4-477b-8a4a-be887ae29782\", \"[{'system': 'GDC', 'value': '105482e0-6bb4-477b-8a4a-be887ae29782'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"analyte\", \"24f29a7f-7ed0-4d22-bf97-c5672ff2dd92\", \"TCGA-06-0168\", \"TCGA-06-0168\", \"224235c1-5b6e-48d5-a5d1-777dfede0f1e\"], [\"10c473f5-8e65-47ae-a747-3d8b18c573fd\", \"[{'system': 'GDC', 'value': '10c473f5-8e65-47ae-a747-3d8b18c573fd'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"c89ea779-09fc-4cd5-becc-58c26d0ac48e\", \"TCGA-12-1600\", \"TCGA-12-1600\", \"12b67dc2-5e4c-48eb-92ba-8d91d2eadfe2\"], [\"10ecbdd3-248f-4308-a86a-8c7be0d1748f\", \"[{'system': 'GDC', 'value': '10ecbdd3-248f-4308-a86a-8c7be0d1748f'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Recurrent Tumor\", \"aliquot\", \"0b0ce338-9e5f-4e8e-890d-71c31a28d8af\", \"TCGA-06-0221\", \"TCGA-06-0221\", \"054f472f-98cb-4559-b2e2-b5f800fc8eef\"], [\"1114f3b8-223b-4952-8a5e-8633032293b5\", \"[{'system': 'GDC', 'value': '1114f3b8-223b-4952-8a5e-8633032293b5'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"97081c2c-fb68-5928-9faf-ba883d354b83\", \"TCGA-S9-A7IX\", \"TCGA-S9-A7IX\", \"a80b0fab-6189-497f-997f-77234b69179c\"], [\"1130bc1c-61f8-4243-9f4d-0188cfeccd89\", \"[{'system': 'GDC', 'value': '1130bc1c-61f8-4243-9f4d-0188cfeccd89'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"8a5ba1ec-e893-5c9c-b95f-aa9b60cfac92\", \"TCGA-FG-8189\", \"TCGA-FG-8189\", \"5469c0e8-0c58-4870-b897-8fa0704599a7\"], [\"11ddec6c-ffc8-4e2e-af5d-8ba12737dd66\", \"[{'system': 'GDC', 'value': '11ddec6c-ffc8-4e2e-af5d-8ba12737dd66'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"analyte\", \"fb3f77d5-cd5e-43e9-bd3e-d12739e4dca4\", \"TCGA-06-2570\", \"TCGA-06-2570\", \"b37d944c-c65c-46d6-bb8b-3eb37cb85b68\"], [\"14237e28-0d03-44c6-8fbb-56448642d180\", \"[{'system': 'GDC', 'value': '14237e28-0d03-44c6-8fbb-56448642d180'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"6c8b0a82-8ea7-4f9a-b333-35327459b846\", \"TCGA-28-2512\", \"TCGA-28-2512\", \"4ca9c0f2-1be9-4376-aa27-d9db948d3f68\"], [\"143e54ae-a4f2-4bc2-987d-5c5ec01ecaf2\", \"[{'system': 'GDC', 'value': '143e54ae-a4f2-4bc2-987d-5c5ec01ecaf2'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"sample\", \"initial specimen\", \"TCGA-16-1460\", \"TCGA-16-1460\", \"827453a9-7388-4336-9ac5-4defcb904607\"], [\"15453f10-46d7-40ac-9b5e-5fb44e05fce5\", \"[{'system': 'GDC', 'value': '15453f10-46d7-40ac-9b5e-5fb44e05fce5'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"b363fd43-146b-4c74-a3e9-303ebf40a111\", \"TCGA-DH-5143\", \"TCGA-DH-5143\", \"dcd0856d-423a-40d7-8070-4c0988d61416\"], [\"179f3c3c-60d6-4902-b460-60cc5731ce39\", \"[{'system': 'GDC', 'value': '179f3c3c-60d6-4902-b460-60cc5731ce39'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"analyte\", \"9721806a-1a0c-4140-ba39-50c8cd4d2788\", \"TCGA-12-0773\", \"TCGA-12-0773\", \"df4168bd-9f94-4323-9c33-a446a9fae999\"], [\"17f8b6e5-dcea-4ff6-95e6-c77af87acabe\", \"[{'system': 'GDC', 'value': '17f8b6e5-dcea-4ff6-95e6-c77af87acabe'}]\", \"TCGA-LGG\", 3705.0, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"analyte\", \"5776eb95-7fea-4564-81fa-040c35b13643\", \"TCGA-DU-A7T8\", \"TCGA-DU-A7T8\", \"04e6e843-7f31-43da-b111-280ce2bd1949\"], [\"1814e722-eeae-4196-a671-4c90289d51aa\", \"[{'system': 'GDC', 'value': '1814e722-eeae-4196-a671-4c90289d51aa'}]\", \"TCGA-LGG\", 111.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"portion\", \"79d46283-7d50-4f9a-a2c3-a9a42f2d5103\", \"TCGA-P5-A77X\", \"TCGA-P5-A77X\", \"878ced76-3144-4141-896f-50e3e863df36\"], [\"18791be3-b8ca-40a9-8e33-013af249b395\", \"[{'system': 'GDC', 'value': '18791be3-b8ca-40a9-8e33-013af249b395'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"sample\", \"initial specimen\", \"TCGA-DU-8167\", \"TCGA-DU-8167\", \"58c82c76-9198-4c95-80f8-c043d1cea5eb\"], [\"18d4dfe7-a7ee-49b2-be1d-84f7d20dc909\", \"[{'system': 'GDC', 'value': '18d4dfe7-a7ee-49b2-be1d-84f7d20dc909'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"823a97ea-2282-4b4a-9eea-5a6b0240f4c2\", \"TCGA-14-1034\", \"TCGA-14-1034\", \"0078b0c4-68a9-483b-9aab-61156d263213\"], [\"18d83948-cd2e-4179-ab0f-c7545478a18d\", \"[{'system': 'GDC', 'value': '18d83948-cd2e-4179-ab0f-c7545478a18d'}]\", \"TCGA-LGG\", 181.0, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"portion\", \"b48a5548-25a2-4ea6-8486-5071c8871b74\", \"TCGA-S9-A6WN\", \"TCGA-S9-A6WN\", \"a418fe65-dfdd-4c84-b27c-b4567b50f457\"], [\"1991675a-6d73-4374-904a-d8bdee3ae8fa\", \"[{'system': 'GDC', 'value': '1991675a-6d73-4374-904a-d8bdee3ae8fa'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"445c887a-549b-419c-a762-2156480c8369\", \"TCGA-28-1746\", \"TCGA-28-1746\", \"c5718c27-cef6-4612-a7cc-42d0e0c51a1a\"], [\"19b2fd18-5727-48b7-95fd-7fb6d56b2ffd\", \"[{'system': 'GDC', 'value': '19b2fd18-5727-48b7-95fd-7fb6d56b2ffd'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"bf3e3123-0673-4dd9-9096-8111647c3ea0\", \"TCGA-06-0167\", \"TCGA-06-0167\", \"afd3a4dc-a2e5-4545-92b8-a18e72fc9e94\"], [\"19e49677-b6e1-4fc2-9b44-1f064f8c2596\", \"[{'system': 'GDC', 'value': '19e49677-b6e1-4fc2-9b44-1f064f8c2596'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"analyte\", \"66258208-b4a3-4c43-aec9-3a2acb96d561\", \"TCGA-FG-5965\", \"TCGA-FG-5965\", \"2cfc07f3-a31c-41a2-a9e3-b708d2421a78\"], [\"1a0046f9-1a74-4932-be55-498af81f8bdc\", \"[{'system': 'GDC', 'value': '1a0046f9-1a74-4932-be55-498af81f8bdc'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"sample\", \"initial specimen\", \"TCGA-HT-A4DS\", \"TCGA-HT-A4DS\", \"6d020185-bdde-4c43-9e38-71c6ed0c13d1\"], [\"1a4cb76d-7c77-4a5e-808d-04a7856a4e8a\", \"[{'system': 'GDC', 'value': '1a4cb76d-7c77-4a5e-808d-04a7856a4e8a'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"eacdfa7f-dbd3-460d-ab3b-34762718fe9a\", \"TCGA-08-0385\", \"TCGA-08-0385\", \"2b2002aa-8ac9-404b-ad08-b6c60658e976\"], [\"1ba8735b-a277-423a-8007-d27fa4b042d2\", \"[{'system': 'GDC', 'value': '1ba8735b-a277-423a-8007-d27fa4b042d2'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"b9b28604-dd77-4b45-94c3-f60d45b60709\", \"TCGA-HT-8106\", \"TCGA-HT-8106\", \"bae316e3-1fa4-4fa7-8ad6-a458857a85d4\"], [\"1be0dfa9-cf4c-453d-8994-b6e809d3c6ba\", \"[{'system': 'GDC', 'value': '1be0dfa9-cf4c-453d-8994-b6e809d3c6ba'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"analyte\", \"1cd63c84-d51e-4943-9711-29f648825192\", \"TCGA-12-3648\", \"TCGA-12-3648\", \"407849a8-8447-4ede-a9d1-c1dfb535222e\"], [\"1cc296be-c54a-4c75-9e98-12f4fc0892e7\", \"[{'system': 'GDC', 'value': '1cc296be-c54a-4c75-9e98-12f4fc0892e7'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"0f46cda7-c42f-5b91-aa9b-3f5e54a32548\", \"TCGA-DB-5275\", \"TCGA-DB-5275\", \"bbfb5399-8d43-4b75-bf90-23ec142697d7\"], [\"1e2788ec-1b02-4414-89df-fe9eb35aaa41\", \"[{'system': 'GDC', 'value': '1e2788ec-1b02-4414-89df-fe9eb35aaa41'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"468f6241-785e-4ba0-9439-84feeeb2800d\", \"TCGA-28-2502\", \"TCGA-28-2502\", \"8db520cf-79b3-4a1b-872e-8f5f76117405\"], [\"1e8760a7-f7f6-40d2-9224-a96fd53b61cb\", \"[{'system': 'GDC', 'value': '1e8760a7-f7f6-40d2-9224-a96fd53b61cb'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"7ef16d25-a2c3-40e0-b632-b29c9cf29423\", \"TCGA-12-3650\", \"TCGA-12-3650\", \"5ef9486a-aeff-421d-b620-03ef119d85a5\"], [\"1f5a0c14-d1c1-4e88-bc19-abfafff97445\", \"[{'system': 'GDC', 'value': '1f5a0c14-d1c1-4e88-bc19-abfafff97445'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"sample\", \"initial specimen\", \"TCGA-DU-6404\", \"TCGA-DU-6404\", \"c0d47e0f-4918-4e06-9db6-201671b1259c\"], [\"201c348c-76e6-4210-a184-a91f7bee36f6\", \"[{'system': 'GDC', 'value': '201c348c-76e6-4210-a184-a91f7bee36f6'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"analyte\", \"4678bd5f-6236-447e-8953-108a2bd4b850\", \"TCGA-DU-8166\", \"TCGA-DU-8166\", \"e488f613-f155-4e11-87d4-8c789ea81691\"], [\"208093a5-2961-4f2b-a3af-d40af21401d6\", \"[{'system': 'GDC', 'value': '208093a5-2961-4f2b-a3af-d40af21401d6'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"7c33db1b-5ff0-42bb-be29-f9c638cacdbf\", \"TCGA-06-0214\", \"TCGA-06-0214\", \"9853c6bb-a42c-4698-abe5-f3c897ebc8f6\"], [\"229556ca-4085-46f5-9a4c-e9abccb8fa61\", \"[{'system': 'GDC', 'value': '229556ca-4085-46f5-9a4c-e9abccb8fa61'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"6e45d3ca-737c-4469-a4a1-6113cbb1768e\", \"TCGA-16-0849\", \"TCGA-16-0849\", \"a210407e-b7de-4e27-84b2-9dcc5f9e6e63\"], [\"22e9e783-6361-49b0-890a-17e0a599db3d\", \"[{'system': 'GDC', 'value': '22e9e783-6361-49b0-890a-17e0a599db3d'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"7a38e662-9d1d-4e05-9ee7-82af9992f754\", \"TCGA-02-0009\", \"TCGA-02-0009\", \"c1f590eb-21ed-4939-adc5-0f7e6f485b56\"], [\"24654746-1ea4-4fdb-83b8-5096f86c5509\", \"[{'system': 'GDC', 'value': '24654746-1ea4-4fdb-83b8-5096f86c5509'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"sample\", \"initial specimen\", \"TCGA-DU-6392\", \"TCGA-DU-6392\", \"fcd9e1c4-bddb-4856-844c-03df48fba499\"], [\"256aefa5-de9e-4b82-927a-7bf0b74eae6b\", \"[{'system': 'GDC', 'value': '256aefa5-de9e-4b82-927a-7bf0b74eae6b'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"analyte\", \"1d0f8eb6-b1e8-4654-a105-4687bdb19f19\", \"TCGA-R8-A6YH\", \"TCGA-R8-A6YH\", \"bc66f21c-7ae6-4312-b6c1-ea3e19f90485\"], [\"2626958a-13a5-4b18-ab40-5efb5243839d\", \"[{'system': 'GDC', 'value': '2626958a-13a5-4b18-ab40-5efb5243839d'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"sample\", \"initial specimen\", \"TCGA-12-0620\", \"TCGA-12-0620\", \"1dbfbff7-d048-4770-ae02-e6a287256210\"], [\"266c8671-ee15-4903-bd92-d9be8da2eddc\", \"[{'system': 'GDC', 'value': '266c8671-ee15-4903-bd92-d9be8da2eddc'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"4c348d1a-009e-5844-a41b-99b7531753f3\", \"TCGA-HT-7857\", \"TCGA-HT-7857\", \"4e1606e5-f4c1-41a2-9f2c-ad0d02650070\"], [\"28fad1e7-d33d-4b57-a53c-08001a5d9cac\", \"[{'system': 'GDC', 'value': '28fad1e7-d33d-4b57-a53c-08001a5d9cac'}]\", \"TCGA-LGG\", 181.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"8a8e9e44-142b-4e35-a49b-2586f378af9d\", \"TCGA-S9-A6WN\", \"TCGA-S9-A6WN\", \"a418fe65-dfdd-4c84-b27c-b4567b50f457\"], [\"2914e9de-528e-4f64-b9d5-f5f2c11789a3\", \"[{'system': 'GDC', 'value': '2914e9de-528e-4f64-b9d5-f5f2c11789a3'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"a3414fed-cdfc-4a0b-b639-8b0cdb616d54\", \"TCGA-DU-7290\", \"TCGA-DU-7290\", \"e00a9855-c15e-46ef-988f-25ca64ec4717\"], [\"29c55a80-cd55-4297-b433-00d0e2b1e08d\", \"[{'system': 'GDC', 'value': '29c55a80-cd55-4297-b433-00d0e2b1e08d'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"0fe8c65f-e982-426d-b9f1-24a6d988c0e5\", \"TCGA-DU-7018\", \"TCGA-DU-7018\", \"f18dab99-26b0-4727-89a9-7f16bd382356\"], [\"2a142057-20dd-4eeb-876a-d55fd0c075a1\", \"[{'system': 'GDC', 'value': '2a142057-20dd-4eeb-876a-d55fd0c075a1'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"0d31b782-839a-4e24-9df5-59d22a9bf105\", \"TCGA-74-6581\", \"TCGA-74-6581\", \"28629bf9-f447-4650-8fc2-53f1e938ab71\"], [\"2a62b3bb-ce6a-4aae-976f-632179152a9c\", \"[{'system': 'GDC', 'value': '2a62b3bb-ce6a-4aae-976f-632179152a9c'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"35947fba-c433-49f1-b859-c143525c0936\", \"TCGA-19-2620\", \"TCGA-19-2620\", \"352768f9-3ce1-419c-beef-6515c78f5d7a\"], [\"2ba256a8-f504-42c6-8a99-5709d6b77b7a\", \"[{'system': 'GDC', 'value': '2ba256a8-f504-42c6-8a99-5709d6b77b7a'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"91d1a361-321b-4fb6-be82-42d2e8b304bf\", \"TCGA-06-0132\", \"TCGA-06-0132\", \"9ad6c241-ccc5-4532-a6ac-098271b13b5f\"], [\"2ca5d033-f9ae-4877-b03b-7a9b3e8412d6\", \"[{'system': 'GDC', 'value': '2ca5d033-f9ae-4877-b03b-7a9b3e8412d6'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"d4c354e2-1f99-5cff-aced-d00094f12079\", \"TCGA-HT-7874\", \"TCGA-HT-7874\", \"775c04e6-a02d-44a4-86f7-496056edd249\"], [\"2d6e64f8-47cf-4282-84f1-5c1fbb60d1f1\", \"[{'system': 'GDC', 'value': '2d6e64f8-47cf-4282-84f1-5c1fbb60d1f1'}]\", \"TCGA-LGG\", 41.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"analyte\", \"16b013c8-b49f-4fc4-8438-281a1bd3d8ad\", \"TCGA-HT-A61A\", \"TCGA-HT-A61A\", \"effb5839-24a2-4b8c-8b6d-08cb66503d16\"], [\"2db601fd-b055-4eb1-8e5b-086224904d3d\", \"[{'system': 'GDC', 'value': '2db601fd-b055-4eb1-8e5b-086224904d3d'}]\", \"TCGA-LGG\", 65.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"cde0dfb9-3f20-4ca0-a853-4ca427095060\", \"TCGA-P5-A5EX\", \"TCGA-P5-A5EX\", \"1f13065a-40f7-455d-b8eb-f9a128722eac\"], [\"2deda23e-2d3f-47b0-965e-f74ae2c0fb59\", \"[{'system': 'GDC', 'value': '2deda23e-2d3f-47b0-965e-f74ae2c0fb59'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"aaea50b0-58d8-5845-b1df-6065e8082838\", \"TCGA-DU-7010\", \"TCGA-DU-7010\", \"834e560a-a506-456d-baf2-a206ca058153\"], [\"2ef95ddc-bda4-44d6-ace2-26289842f963\", \"[{'system': 'GDC', 'value': '2ef95ddc-bda4-44d6-ace2-26289842f963'}]\", \"TCGA-LGG\", 1280.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"dbc04f0a-8861-4630-8e0d-4dcf23de85e2\", \"TCGA-E1-A7YM\", \"TCGA-E1-A7YM\", \"4250ac3c-c8b0-46ce-b9c8-7963bc386041\"], [\"313d16da-50dd-4306-9b73-549e63e40333\", \"[{'system': 'GDC', 'value': '313d16da-50dd-4306-9b73-549e63e40333'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"portion\", \"5b43372b-75bb-49a7-863c-5ac853d0b120\", \"TCGA-HT-7881\", \"TCGA-HT-7881\", \"275cb949-2f61-48c9-84f0-ba8ae4fa35c4\"], [\"314334e0-ee80-41de-a334-28aaa4ee3ca0\", \"[{'system': 'GDC', 'value': '314334e0-ee80-41de-a334-28aaa4ee3ca0'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"portion\", \"31ae7ffc-24f7-46c0-8581-6ff90d942f58\", \"TCGA-06-1800\", \"TCGA-06-1800\", \"b1ce95bf-7441-4aac-8131-19a177d2b8ac\"], [\"31704187-1302-4afc-a496-96924c7036db\", \"[{'system': 'GDC', 'value': '31704187-1302-4afc-a496-96924c7036db'}]\", \"TCGA-GBM\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"slide\", \"0c41b92e-086d-5ba1-9132-418737556800\", \"TCGA-14-1795\", \"TCGA-14-1795\", \"7db115ea-082b-45bb-97d2-4254270b8bb6\"], [\"3189bd5c-ac35-4564-bbd1-744e17faf46d\", \"[{'system': 'GDC', 'value': '3189bd5c-ac35-4564-bbd1-744e17faf46d'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"716474f2-8ee8-444f-ab68-bf23b935c0ff\", \"TCGA-DU-6395\", \"TCGA-DU-6395\", \"6355cade-7b3a-43a8-9f1f-8e7bc45755a8\"], [\"318f5081-445d-49a6-b3ce-9302d19c1687\", \"[{'system': 'GDC', 'value': '318f5081-445d-49a6-b3ce-9302d19c1687'}]\", \"TCGA-LGG\", 0.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"sample\", \"initial specimen\", \"TCGA-DH-5143\", \"TCGA-DH-5143\", \"dcd0856d-423a-40d7-8070-4c0988d61416\"], [\"329cf5be-2d8c-4863-924b-48ea7f91a1f5\", \"[{'system': 'GDC', 'value': '329cf5be-2d8c-4863-924b-48ea7f91a1f5'}]\", \"TCGA-LGG\", 714.0, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"008456d6-3c57-4023-80a4-3ee289af32c1\", \"TCGA-TQ-A7RN\", \"TCGA-TQ-A7RN\", \"c05f9e21-b8fa-4537-9ae7-39d6fc9d7933\"], [\"32ad607d-b070-45b0-a5d1-3b401ec16a13\", \"[{'system': 'GDC', 'value': '32ad607d-b070-45b0-a5d1-3b401ec16a13'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"b2f13ece-394a-46de-bdb3-e71c89fb9f86\", \"TCGA-12-0827\", \"TCGA-12-0827\", \"b75845ed-a19a-4caa-b362-e62b1e538152\"], [\"33f423ee-40ec-47ee-ac5c-195beae41d3a\", \"[{'system': 'GDC', 'value': '33f423ee-40ec-47ee-ac5c-195beae41d3a'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Recurrent Tumor\", \"analyte\", \"6d11db1d-9dd6-4ac5-a421-4b79d0fa3e88\", \"TCGA-19-0957\", \"TCGA-19-0957\", \"a589e2dc-7649-492c-9569-592698acaa6f\"], [\"3470b05f-208d-40c5-99db-62ca107332ee\", \"[{'system': 'GDC', 'value': '3470b05f-208d-40c5-99db-62ca107332ee'}]\", \"TCGA-LGG\", 472.0, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"065b26d1-de3d-4c96-93db-69dc6b481cb2\", \"TCGA-S9-A89V\", \"TCGA-S9-A89V\", \"c4f522c9-bff5-4899-8d27-c105dab795a9\"], [\"34f94a21-69e4-4ca6-9d3f-08d5a52622a1\", \"[{'system': 'GDC', 'value': '34f94a21-69e4-4ca6-9d3f-08d5a52622a1'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"00f842aa-a509-45b2-a14b-12f5298201de\", \"TCGA-08-0518\", \"TCGA-08-0518\", \"64fa7f09-724a-45ee-a802-09e4affe077e\"], [\"35dd0672-be91-41ae-9390-474285c1e749\", \"[{'system': 'GDC', 'value': '35dd0672-be91-41ae-9390-474285c1e749'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"56525e60-e6c8-44be-bb57-fb137da6cbdd\", \"TCGA-32-2498\", \"TCGA-32-2498\", \"0d5e5a6b-5113-43f2-836c-776207b21b56\"], [\"3735c117-90e7-4690-9c2a-17d77d37514c\", \"[{'system': 'GDC', 'value': '3735c117-90e7-4690-9c2a-17d77d37514c'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"6f0a91d5-0c64-451a-9988-6bbc1f1cf03f\", \"TCGA-DU-8161\", \"TCGA-DU-8161\", \"b9a3b647-61b3-4d98-90ca-e307ab50984a\"], [\"38f37485-2ac5-56d6-95e8-38357ce536ca\", \"[{'system': 'GDC', 'value': '38f37485-2ac5-56d6-95e8-38357ce536ca'}]\", \"CPTAC-3\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"portion\", \"8d1883cb-c137-4786-aa62-cfce5758303e\", \"C3L-03728\", \"C3L-03728\", \"4447a969-e5c8-4291-b83c-53a0f7e77cbc\"], [\"3980f5f5-ef8b-4887-8fe9-4063dd5a5001\", \"[{'system': 'GDC', 'value': '3980f5f5-ef8b-4887-8fe9-4063dd5a5001'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"analyte\", \"6337846d-1bd6-464e-8f59-ade540c328b7\", \"TCGA-HT-7607\", \"TCGA-HT-7607\", \"24ebd152-f8d7-44eb-af7f-8ee7f2e458e4\"], [\"39a61b0d-7356-4e40-8ea5-a3c01103e868\", \"[{'system': 'GDC', 'value': '39a61b0d-7356-4e40-8ea5-a3c01103e868'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"analyte\", \"6e45c216-df73-4db4-8f49-8fdfa84ded4b\", \"TCGA-HT-7610\", \"TCGA-HT-7610\", \"4839a058-fbca-44c7-bd61-81943b4d45d5\"], [\"39f42f29-d669-446a-83c1-79591c3e11ab\", \"[{'system': 'GDC', 'value': '39f42f29-d669-446a-83c1-79591c3e11ab'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"sample\", \"initial specimen\", \"TCGA-14-1034\", \"TCGA-14-1034\", \"0078b0c4-68a9-483b-9aab-61156d263213\"], [\"3abeff8e-5bc2-4cb9-aa06-55bd17d41f82\", \"[{'system': 'GDC', 'value': '3abeff8e-5bc2-4cb9-aa06-55bd17d41f82'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"aliquot\", \"0ed7f9eb-ac18-45a7-8b0c-f4912d2d1e2d\", \"TCGA-32-1970\", \"TCGA-32-1970\", \"6c5154d2-af36-492f-b520-d925528824e4\"], [\"3b60125e-2eed-4a75-9811-b7749dbe7977\", \"[{'system': 'GDC', 'value': '3b60125e-2eed-4a75-9811-b7749dbe7977'}]\", \"TCGA-LGG\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"aliquot\", \"05b422cc-7cc1-4691-a337-ed5f751b7c10\", \"TCGA-DU-8167\", \"TCGA-DU-8167\", \"58c82c76-9198-4c95-80f8-c043d1cea5eb\"], [\"3b9c4291-4b37-413e-877e-0b557e960c64\", \"[{'system': 'GDC', 'value': '3b9c4291-4b37-413e-877e-0b557e960c64'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"portion\", \"aa3459f6-b50c-4205-8e73-d07fc50ec0ac\", \"TCGA-27-2526\", \"TCGA-27-2526\", \"69d0a566-5fbf-45f6-a240-649b06868e27\"], [\"3bc3a6ac-de5e-4a7b-8fea-a9cf6f4bfd18\", \"[{'system': 'GDC', 'value': '3bc3a6ac-de5e-4a7b-8fea-a9cf6f4bfd18'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Blood Derived Normal\", \"portion\", \"ea567da7-cbca-4657-9762-918c513c768c\", \"TCGA-19-1791\", \"TCGA-19-1791\", \"6633f338-34a9-44f6-8039-0b9408d6213d\"], [\"3c83ded3-3515-4071-8788-6e8bf2c2a173\", \"[{'system': 'GDC', 'value': '3c83ded3-3515-4071-8788-6e8bf2c2a173'}]\", \"TCGA-GBM\", NaN, \"Gliomas\", \"None\", \"Primary Tumor\", \"sample\", \"initial specimen\", \"TCGA-19-4065\", \"TCGA-19-4065\", \"a262928c-e20a-4c02-8114-1227e05c43e1\"]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"paging\": true, \"scrollCollapse\": true, \"scrollX\": \"200px\"};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        // Display the table\n",
       "        $(document).ready(function () {\n",
       "            \n",
       "            window.__itables_render('#8ae12187-3d1b-452f-82da-f08005dd4962', dt_args);\n",
       "        });\n",
       "    }\n",
       "</script>\n"
      ],
      "text/plain": [
       "                             specimen_id  \\\n",
       "0   0024bf91-4ba7-4e0d-9e23-cb37188324c7   \n",
       "1   01b98b0e-bbfc-4e0f-934a-3a6ac9486342   \n",
       "2   01ec04df-91c8-4c46-a71d-fe1abe06a221   \n",
       "3   0242c021-1602-420e-a245-8ee1052fdcef   \n",
       "4   031453eb-67ac-416e-8350-2e35f55c7773   \n",
       "..                                   ...   \n",
       "95  3abeff8e-5bc2-4cb9-aa06-55bd17d41f82   \n",
       "96  3b60125e-2eed-4a75-9811-b7749dbe7977   \n",
       "97  3b9c4291-4b37-413e-877e-0b557e960c64   \n",
       "98  3bc3a6ac-de5e-4a7b-8fea-a9cf6f4bfd18   \n",
       "99  3c83ded3-3515-4071-8788-6e8bf2c2a173   \n",
       "\n",
       "                                  specimen_identifier  \\\n",
       "0   [{'system': 'GDC', 'value': '0024bf91-4ba7-4e0...   \n",
       "1   [{'system': 'GDC', 'value': '01b98b0e-bbfc-4e0...   \n",
       "2   [{'system': 'GDC', 'value': '01ec04df-91c8-4c4...   \n",
       "3   [{'system': 'GDC', 'value': '0242c021-1602-420...   \n",
       "4   [{'system': 'GDC', 'value': '031453eb-67ac-416...   \n",
       "..                                                ...   \n",
       "95  [{'system': 'GDC', 'value': '3abeff8e-5bc2-4cb...   \n",
       "96  [{'system': 'GDC', 'value': '3b60125e-2eed-4a7...   \n",
       "97  [{'system': 'GDC', 'value': '3b9c4291-4b37-413...   \n",
       "98  [{'system': 'GDC', 'value': '3bc3a6ac-de5e-4a7...   \n",
       "99  [{'system': 'GDC', 'value': '3c83ded3-3515-407...   \n",
       "\n",
       "   specimen_associated_project  days_to_collection primary_disease_type  \\\n",
       "0                     TCGA-LGG                78.0              Gliomas   \n",
       "1                     TCGA-LGG                 NaN              Gliomas   \n",
       "2                     TCGA-LGG               219.0              Gliomas   \n",
       "3                     TCGA-LGG                 0.0              Gliomas   \n",
       "4                     TCGA-GBM                 NaN              Gliomas   \n",
       "..                         ...                 ...                  ...   \n",
       "95                    TCGA-GBM                 NaN              Gliomas   \n",
       "96                    TCGA-LGG                 NaN              Gliomas   \n",
       "97                    TCGA-GBM                 NaN              Gliomas   \n",
       "98                    TCGA-GBM                 NaN              Gliomas   \n",
       "99                    TCGA-GBM                 NaN              Gliomas   \n",
       "\n",
       "   anatomical_site  source_material_type specimen_type  \\\n",
       "0             None  Blood Derived Normal       portion   \n",
       "1             None         Primary Tumor       portion   \n",
       "2             None         Primary Tumor       aliquot   \n",
       "3             None         Primary Tumor         slide   \n",
       "4             None         Primary Tumor       analyte   \n",
       "..             ...                   ...           ...   \n",
       "95            None         Primary Tumor       aliquot   \n",
       "96            None  Blood Derived Normal       aliquot   \n",
       "97            None  Blood Derived Normal       portion   \n",
       "98            None  Blood Derived Normal       portion   \n",
       "99            None         Primary Tumor        sample   \n",
       "\n",
       "                   derived_from_specimen derived_from_subject    subject_id  \\\n",
       "0   3407f4e4-02ef-49aa-bea0-f7c496ad7371         TCGA-S9-A7QW  TCGA-S9-A7QW   \n",
       "1   ae23f336-e901-4e45-b139-5e105060d3af         TCGA-HT-7609  TCGA-HT-7609   \n",
       "2   183243f7-1294-490c-a5b8-af6bd8740e01         TCGA-HW-A5KL  TCGA-HW-A5KL   \n",
       "3   b44d1202-4b05-545c-8f00-fdad812c28ef         TCGA-HT-7689  TCGA-HT-7689   \n",
       "4   0efe9cfc-89f2-4096-8c3e-c300a8efa1ee         TCGA-02-2486  TCGA-02-2486   \n",
       "..                                   ...                  ...           ...   \n",
       "95  0ed7f9eb-ac18-45a7-8b0c-f4912d2d1e2d         TCGA-32-1970  TCGA-32-1970   \n",
       "96  05b422cc-7cc1-4691-a337-ed5f751b7c10         TCGA-DU-8167  TCGA-DU-8167   \n",
       "97  aa3459f6-b50c-4205-8e73-d07fc50ec0ac         TCGA-27-2526  TCGA-27-2526   \n",
       "98  ea567da7-cbca-4657-9762-918c513c768c         TCGA-19-1791  TCGA-19-1791   \n",
       "99                      initial specimen         TCGA-19-4065  TCGA-19-4065   \n",
       "\n",
       "                      researchsubject_id  \n",
       "0   765588aa-075f-477f-9c18-099d018d3a1b  \n",
       "1   bfbc0d1e-2a0b-4c60-8a37-91e3ce4b79ee  \n",
       "2   0639b753-4099-4ca4-adb9-763069a614ef  \n",
       "3   d58b535a-6c95-43bb-ad88-0600e6447537  \n",
       "4   79a68b32-29a3-47bf-9b2b-643ec7323d73  \n",
       "..                                   ...  \n",
       "95  6c5154d2-af36-492f-b520-d925528824e4  \n",
       "96  58c82c76-9198-4c95-80f8-c043d1cea5eb  \n",
       "97  69d0a566-5fbf-45f6-a240-649b06868e27  \n",
       "98  6633f338-34a9-44f6-8039-0b9408d6213d  \n",
       "99  a262928c-e20a-4c02-8114-1227e05c43e1  \n",
       "\n",
       "[100 rows x 12 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "specimenresults.to_dataframe()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ccb0f1c",
   "metadata": {},
   "source": [
    "\n",
    "---\n",
    "\n",
    "<div class=\"cdadefine\" style=\"background-color:#add9e5;color:black;padding:20px;\">\n",
    "\n",
    "<h3>Specimen Field Definitions</h3>\n",
    "\n",
    "<i><i>Any material taken as a sample from a biological entity (living or dead), or from a physical object or the environment. Specimens are usually collected as an example of their kind, often for use in some investigation.</i>\n",
    " A given specimen will have only a single subject ID and a single researchsubject ID</i>\n",
    "    \n",
    "<ul>\n",
    "  <li><b>id:</b> The 'logical' identifier of the entity in the repository, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system.</li>\n",
    "<li><b>identifier:</b> A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.</li>\n",
    "<li><b>identifier.system:</b> The system or namespace that defines the identifier.</li>\n",
    "<li><b>identifier.value:</b> The value of the identifier, as defined by the system.</li>\n",
    "  <li><b>associated_project:</b> The Project associated with the specimen.</li>\n",
    "  <li><b>days_to_collection:</b> The number of days from the index date to either the date a sample was collected for a specific study or project, or the date a patient underwent a procedure (e.g. surgical resection) yielding a sample that was eventually used for research.</li>\n",
    "  <li><b>primary_disease_type:</b> The text term used to describe the type of malignant disease, as categorized by the World Health Organization's (WHO) International Classification of Diseases for Oncology (ICD-O). This attribute represents the disease that qualified the subject for inclusion on the ResearchProject.</li>\n",
    "  <li><b>anatomical_site:</b> Per GDC Dictionary, the text term that represents the name of the primary disease site of the submitted tumor sample; recommend dropping tumor; biospecimen_anatomic_site.</li>\n",
    "  <li><b>source_material_type:</b> The general kind of material from which the specimen was derived, indicating the physical nature of the source material.</li>\n",
    "  <li><b>specimen_type:</b> The high-level type of the specimen, based on its how it has been derived from the original extracted sample. One of: analyte, aliquot, portion, sample, or slide.</li>\n",
    "  <li><b>derived_from_specimen:</b> A source/parent specimen from which this one was directly derived.</li>\n",
    "  <li><b>subject_id:</b> An identifier for the subject. Can be joined to the `id` field from subject results</li>\n",
    "  <li><b>researchsubject_id:</b> An identifier for the researchsubject. Can be joined to the `id` field from researchsubject results</li>\n",
    "</ul>  \n",
    "\n",
    "</div>\n",
    "    \n",
    "---\n",
    "\n",
    "\n",
    "### file\n",
    "\n",
    "The file endpoint returns information about files that meet our search criteria, and that belong to subjects, researchsubjects, or specimens. You can think of three of these endpoints as being nested: \n",
    "\n",
    "`subject.file` is the broadest search. It will give you all files that have the parameters of your query\n",
    "`researchsubject.file` will give you all the files that match your query, and that are attached to specific studies and/or specimens. It will not return subject level files.\n",
    "`specimen.file` will return all the files directly attached to specimen, but not those attached to the researchsubject or subject those specimens came from.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "94a0361f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">22.472</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">22472</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m22.472\u001b[0m sec \u001b[1;36m22472\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\n",
       "            \n",
       "            Offset: 0\n",
       "            Count: 100\n",
       "            Total Row Count: 4969686\n",
       "            More pages: True\n",
       "            "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "myquery.subject.file.run()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f184595e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">24.53</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">24530</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m24.53\u001b[0m sec \u001b[1;36m24530\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\n",
       "            \n",
       "            Offset: 0\n",
       "            Count: 100\n",
       "            Total Row Count: 4969666\n",
       "            More pages: True\n",
       "            "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "myquery.researchsubject.file.run()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "86c5b3ec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10.649</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10649</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m10.649\u001b[0m sec \u001b[1;36m10649\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\n",
       "            \n",
       "            Offset: 0\n",
       "            Count: 100\n",
       "            Total Row Count: 771260\n",
       "            More pages: True\n",
       "            "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "myquery.specimen.file.run()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46fcb3e4",
   "metadata": {},
   "source": [
    "As you might expect, searching file gives us a huge number of results. This is great if you are surveying what kind of data is available, but is less useful for getting a coherent cohort. \n",
    "\n",
    "A better way to get files for a specific cohort is to build a more complex query using <a href=\"../Operators\">Operators</a>. \n",
    "\n",
    "Another useful way to look at high level information is to use our counts feature which returns summary information rather than the full search results. Check out the <a href=\"../DataSummaries\">Data Summaries tutorial</a> to try it.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "549257b1",
   "metadata": {},
   "source": [
    "\n",
    "---\n",
    "\n",
    "<div class=\"cdadefine\" style=\"background-color:#add9e5;color:black;padding:20px;\">\n",
    "\n",
    "<h3>File Field Definitions</h3>\n",
    "\n",
    "<i>A file is an information-bearing electronic object that contains a physical embodiment of some information using a particular character encoding.</i>\n",
    "\n",
    "    \n",
    "<ul>\n",
    "  <li><b>id:</b> The 'logical' identifier of the entity in the system of record, e.g. a UUID. This 'id' is unique within a given system. The identified entity may have a different 'id' in a different system.</li>\n",
    "<li><b>identifier:</b> A 'business' identifier for the entity, typically as provided by an external system or authority, that persists across implementing systems (i.e. a 'logical' identifier). Uses a specialized, complex 'Identifier' data type to capture information about the source of the business identifier - or a URI expressed as a string to an existing entity.</li>\n",
    "<li><b>identifier.system:</b> The system or namespace that defines the identifier.</li>\n",
    "<li><b>identifier.value:</b> The value of the identifier, as defined by the system.</li>\n",
    "  <li><b>label:</b> Short name or abbreviation for dataset. Maps to rdfs:label.</li>\n",
    "  <li><b>data_catagory:</b> Broad categorization of the contents of the data file.</li>\n",
    "  <li><b>data_type:</b> Specific content type of the data file.</li>\n",
    "  <li><b>file_format:</b> Format of the data files.</li>\n",
    "  <li><b>associated_project:</b> A reference to the Project(s) of which this ResearchSubject is a member. The associated_project may be embedded using the ref definition or may be a reference to the id for the Project - or a URI expressed as a string to an existing entity.</li>\n",
    "  <li><b>drs_uri:</b> A string of characters used to identify a resource on the Data Repo Service(DRS). Can be used to retrieve this specific file from a server.</li>\n",
    "  <li><b>byte_size:</b> Size of the file in bytes. Maps to dcat:byteSize.</li>\n",
    "  <li><b>checksum:</b> The md5 value for the file. A digit representing the sum of the correct digits in a piece of stored or transmitted digital data, against which later comparisons can be made to detect errors in the data.</li>\n",
    "  <li><b>data_modality:</b> Data modality describes the biological nature of the information gathered as the result of an activity, independent of the technology or methods used to produce the information. Always one of \"Genomic\", \"Proteomic\", or \"Imaging\".</li>\n",
    "  <li><b>imaging_modality:</b> An imaging modality describes the imaging equipment and/or method used to acquire certain structural or functional information about the body. These include but are not limited to computed tomography (CT) and magnetic resonance imaging (MRI). Taken from the DICOM standard.</li>\n",
    "  <li><b>dbgap_accession_number:</b> The dbgap accession number for the project.</li>\n",
    "</ul>  \n",
    "\n",
    "</div>\n",
    "    \n",
    "---\n",
    "\n",
    "### mutation\n",
    "\n",
    "The file endpoint returns molecular data about specific mutations that meet our search criteria. Search is currently limited to the TCGA-READ project from GDC:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "1e4d7e15",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">16.393</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">16393</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m16.393\u001b[0m sec \u001b[1;36m16393\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\n",
       "            \n",
       "            Offset: 0\n",
       "            Count: 100\n",
       "            Total Row Count: 904\n",
       "            More pages: True\n",
       "            "
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "myquery.mutation.run()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "6ce81214",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Getting results from database\n",
       "\n",
       "</pre>\n"
      ],
      "text/plain": [
       "Getting results from database\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
       "                        Total execution time: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>\n",
       "                        min <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4.067</span> sec <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4067</span> ms\n",
       "                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\n",
       "                        Total execution time: \u001b[1;36m0\u001b[0m\n",
       "                        min \u001b[1;36m4.067\u001b[0m sec \u001b[1;36m4067\u001b[0m ms\n",
       "                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table id=\"c44d1e3e-ac89-4c84-9565-ca0939740efd\" class=\"display\"style=\"max-width:100%\"><thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>project_short_name</th>\n",
       "      <th>case_barcode</th>\n",
       "      <th>sample_barcode_tumor</th>\n",
       "      <th>sample_barcode_normal</th>\n",
       "      <th>aliquot_barcode_tumor</th>\n",
       "      <th>aliquot_barcode_normal</th>\n",
       "      <th>Hugo_Symbol</th>\n",
       "      <th>Entrez_Gene_Id</th>\n",
       "      <th>Center</th>\n",
       "      <th>NCBI_Build</th>\n",
       "      <th>Chromosome</th>\n",
       "      <th>Start_Position</th>\n",
       "      <th>End_Position</th>\n",
       "      <th>Strand</th>\n",
       "      <th>Variant_Classification</th>\n",
       "      <th>Variant_Type</th>\n",
       "      <th>Reference_Allele</th>\n",
       "      <th>Tumor_Seq_Allele1</th>\n",
       "      <th>Tumor_Seq_Allele2</th>\n",
       "      <th>dbSNP_RS</th>\n",
       "      <th>dbSNP_Val_Status</th>\n",
       "      <th>Tumor_Validation_Allele1</th>\n",
       "      <th>Tumor_Validation_Allele2</th>\n",
       "      <th>Mutation_Status</th>\n",
       "      <th>Validation_Method</th>\n",
       "      <th>Sequencer</th>\n",
       "      <th>Tumor_Sample_UUID</th>\n",
       "      <th>Matched_Norm_Sample_UUID</th>\n",
       "      <th>HGVSc</th>\n",
       "      <th>HGVSp</th>\n",
       "      <th>HGVSp_Short</th>\n",
       "      <th>Transcript_ID</th>\n",
       "      <th>Exon_Number</th>\n",
       "      <th>t_depth</th>\n",
       "      <th>t_ref_count</th>\n",
       "      <th>t_alt_count</th>\n",
       "      <th>n_depth</th>\n",
       "      <th>all_effects</th>\n",
       "      <th>Allele</th>\n",
       "      <th>Gene</th>\n",
       "      <th>Feature</th>\n",
       "      <th>Feature_type</th>\n",
       "      <th>One_Consequence</th>\n",
       "      <th>Consequence</th>\n",
       "      <th>cDNA_position</th>\n",
       "      <th>CDS_position</th>\n",
       "      <th>Protein_position</th>\n",
       "      <th>Amino_acids</th>\n",
       "      <th>Codons</th>\n",
       "      <th>Existing_variation</th>\n",
       "      <th>ALLELE_NUM</th>\n",
       "      <th>DISTANCE</th>\n",
       "      <th>TRANSCRIPT_STRAND</th>\n",
       "      <th>SYMBOL</th>\n",
       "      <th>SYMBOL_SOURCE</th>\n",
       "      <th>HGNC_ID</th>\n",
       "      <th>BIOTYPE</th>\n",
       "      <th>CANONICAL</th>\n",
       "      <th>CCDS</th>\n",
       "      <th>ENSP</th>\n",
       "      <th>SWISSPROT</th>\n",
       "      <th>TREMBL</th>\n",
       "      <th>UNIPARC</th>\n",
       "      <th>RefSeq</th>\n",
       "      <th>SIFT</th>\n",
       "      <th>PolyPhen</th>\n",
       "      <th>EXON</th>\n",
       "      <th>INTRON</th>\n",
       "      <th>DOMAINS</th>\n",
       "      <th>GMAF</th>\n",
       "      <th>AFR_MAF</th>\n",
       "      <th>AMR_MAF</th>\n",
       "      <th>EAS_MAF</th>\n",
       "      <th>EUR_MAF</th>\n",
       "      <th>SAS_MAF</th>\n",
       "      <th>AA_MAF</th>\n",
       "      <th>EA_MAF</th>\n",
       "      <th>CLIN_SIG</th>\n",
       "      <th>SOMATIC</th>\n",
       "      <th>PUBMED</th>\n",
       "      <th>IMPACT</th>\n",
       "      <th>PICK</th>\n",
       "      <th>VARIANT_CLASS</th>\n",
       "      <th>TSL</th>\n",
       "      <th>HGVS_OFFSET</th>\n",
       "      <th>PHENO</th>\n",
       "      <th>MINIMISED</th>\n",
       "      <th>ExAC_AF</th>\n",
       "      <th>ExAC_AF_Adj</th>\n",
       "      <th>ExAC_AF_AFR</th>\n",
       "      <th>ExAC_AF_AMR</th>\n",
       "      <th>ExAC_AF_EAS</th>\n",
       "      <th>ExAC_AF_FIN</th>\n",
       "      <th>ExAC_AF_NFE</th>\n",
       "      <th>ExAC_AF_OTH</th>\n",
       "      <th>ExAC_AF_SAS</th>\n",
       "      <th>FILTER</th>\n",
       "      <th>CONTEXT</th>\n",
       "      <th>src_vcf_id</th>\n",
       "      <th>tumor_bam_uuid</th>\n",
       "      <th>normal_bam_uuid</th>\n",
       "      <th>case_id</th>\n",
       "      <th>GDC_FILTER</th>\n",
       "      <th>COSMIC</th>\n",
       "      <th>MC3_Overlap</th>\n",
       "      <th>GDC_Validation_Status</th>\n",
       "      <th>callerName</th>\n",
       "      <th>fileUUID</th>\n",
       "      <th>fileName</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr><td>Loading... (need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td></tr></tbody></table>\n",
       "<style>\n",
       "table td {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "table th {\n",
       "    text-overflow: ellipsis;\n",
       "    overflow: hidden;\n",
       "}\n",
       "\n",
       "thead input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "tfoot input {\n",
       "    width: 100%;\n",
       "    padding: 3px;\n",
       "    box-sizing: border-box;\n",
       "}\n",
       "\n",
       "</style>\n",
       "<script>\n",
       "    // We use a namespace per table (= the next curly bracket)\n",
       "    // to avoid conflicts between the various tables' data & dt_args\n",
       "    {\n",
       "        // Define the table data\n",
       "        const data = [[\"TCGA-GBM\", \"TCGA-06-5415\", \"TCGA-06-5415-01A\", \"TCGA-06-5415-10A\", \"TCGA-06-5415-01A-01D-1486-08\", \"TCGA-06-5415-10A-01D-1486-08\", \"RASA1\", 5921, \"BI\", \"GRCh38\", \"chr5\", 87363403, 87363403, \"+\", \"Silent\", \"SNP\", \"A\", \"A\", \"G\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"fca08ee9-b480-4dc7-be56-f1eb03b56f7c\", \"e09e94f5-bd10-4523-bc83-d441a285c37c\", \"c.1509A>G\", \"p.=\", \"p.Q503Q\", \"ENST00000274376\", \"11/25\", \"123|123|123|118\", \"76|76|76|73\", \"47|47|47|45\", \"206|205|207|188\", \"RASA1,synonymous_variant,p.Q326Q,ENST00000456692,NM_022650.2,c.978A>G,LOW,,,,1;RASA1,synonymous_variant,p.Q503Q,ENST00000274376,NM_002890.2,c.1509A>G,LOW,YES,,,1;RASA1,synonymous_variant,p.Q336Q,ENST00000512763,,c.1008A>G,LOW,,,,1;RASA1,synonymous_variant,p.Q337Q,ENST00000506290,,c.1011A>G,LOW,,,,1;RASA1,synonymous_variant,p.Q503Q,ENST00000515800,,c.1509A>G,LOW,,,,1;RASA1,non_coding_transcript_exon_variant,,ENST00000509953,,n.612A>G,MODIFIER,,,,1\", \"G\", \"ENSG00000145715\", \"ENST00000274376\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"2073/3752\", \"1509/3144\", \"503/1047\", \"Q\", \"caA/caG\", \"None\", \"1\", \"None\", 1, \"RASA1\", \"HGNC\", \"HGNC:9871\", \"protein_coding\", \"YES\", \"CCDS34200.1\", \"ENSP00000274376\", \"P20936\", \"None\", \"UPI00001351F3\", \"NM_002890.2\", \"None\", \"None\", \"11/25\", \"None\", \"Pfam_domain:PF00169;PROSITE_profiles:PS50003;SMART_domains:SM00233;Superfamily_domains:SSF50729\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GCCCAACTTAT\", \"db749986-15c2-4fcb-bb87-b2c4eddca9ba|1cd8c7bc-4f3c-4c2f-8d26-2025db4b8fd6|de571491-3a8c-421f-8f94-af4f80c31d59|63cc0427-8915-48b5-a04a-e9c18ab016df\", \"b49524b5-c615-4893-895d-bc2a24688ffa\", \"0a26c1a1-5900-4dac-b5ee-bf7b94fbafb2\", \"713190ed-c6c1-4695-814b-85ca9b95e6a0\", \"None\", \"COSM2153241;COSM2153242\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-32-5222\", \"TCGA-32-5222-01A\", \"TCGA-32-5222-10A\", \"TCGA-32-5222-01A-01D-1486-08\", \"TCGA-32-5222-10A-01D-1486-08\", \"HECW1\", 23072, \"BI\", \"GRCh38\", \"chr7\", 43444804, 43444804, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"f48abf4d-f1fb-48bf-97a1-0c38435b6af7\", \"fd30b963-9361-4b8d-a80a-37958b0a40d5\", \"c.1632G>A\", \"p.=\", \"p.T544T\", \"ENST00000395891\", \"11/30\", \"193|166|163\", \"158|135|133\", \"35|31|30\", \"120|104|91\", \"HECW1,synonymous_variant,p.T544T,ENST00000395891,NM_015052.4,c.1632G>A,LOW,YES,,,1;HECW1,synonymous_variant,p.T544T,ENST00000453890,NM_001287059.1,c.1632G>A,LOW,,,,1;HECW1,downstream_gene_variant,,ENST00000471043,,,MODIFIER,,,,1\", \"A\", \"ENSG00000002746\", \"ENST00000395891\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"2237/9501\", \"1632/4821\", \"544/1606\", \"T\", \"acG/acA\", \"None\", \"1\", \"None\", 1, \"HECW1\", \"HGNC\", \"HGNC:22195\", \"protein_coding\", \"YES\", \"CCDS5469.2\", \"ENSP00000379228\", \"Q76N89\", \"None\", \"UPI0000D74C41\", \"NM_015052.4\", \"None\", \"None\", \"11/30\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GAGACGGTGAT\", \"1bfa0768-8c79-40e4-a028-a1e17a65c821|fafeed8d-626e-40d7-a4db-706403a9a293|f5f2a039-ace2-46ed-94f4-f638f6ea7088\", \"44e42588-b00e-4282-9f57-74c15b5aee1a\", \"41a523dd-b452-4c4c-b46b-6461cf478fcc\", \"e876dd29-68b0-4bf1-83d1-488c40068a35\", \"None\", \"COSM3412060;COSM3412061\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-41-5651\", \"TCGA-41-5651-01A\", \"TCGA-41-5651-10A\", \"TCGA-41-5651-01A-01D-1696-08\", \"TCGA-41-5651-10A-01D-1696-08\", \"CDC42EP3\", 10602, \"BI\", \"GRCh38\", \"chr2\", 37646720, 37646720, \"+\", \"5'UTR\", \"SNP\", \"G\", \"G\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"5fd77ba9-5015-4d8b-86a0-582e5c76bdd6\", \"54c65bdd-ac2e-466a-80cb-6f534095f56b\", \"c.-133C>T\", \"None\", \"None\", \"ENST00000295324\", \"2/2\", \"32\", \"17\", \"15\", \"30\", \"CDC42EP3,5_prime_UTR_variant,,ENST00000295324,NM_001270438.1&NM_001270437.1&NM_006449.4,c.-133C>T,MODIFIER,YES,,,-1;CDC42EP3,5_prime_UTR_variant,,ENST00000611976,NM_001270436.1,c.-133C>T,MODIFIER,,,,-1;CDC42EP3,5_prime_UTR_variant,,ENST00000457889,,c.-133C>T,MODIFIER,,,,-1;CDC42EP3,5_prime_UTR_variant,,ENST00000453555,,c.-133C>T,MODIFIER,,,,-1;CDC42EP3,5_prime_UTR_variant,,ENST00000422687,,c.-133C>T,MODIFIER,,,,-1;AC006369.2,downstream_gene_variant,,ENST00000419425,,,MODIFIER,YES,,,1\", \"A\", \"ENSG00000163171\", \"ENST00000295324\", \"Transcript\", \"5_prime_UTR_variant\", \"5_prime_UTR_variant\", \"869/5700\", \"-/765\", \"-/254\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"CDC42EP3\", \"HGNC\", \"HGNC:16943\", \"protein_coding\", \"YES\", \"CCDS1791.1\", \"ENSP00000295324\", \"Q9UKI2\", \"None\", \"UPI0000073D2A\", \"NM_001270438.1;NM_001270437.1;NM_006449.4\", \"None\", \"None\", \"2/2\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GCTTCGAAATG\", \"6c43af16-03c4-4d67-8605-8601f940e29f|da7bc3a8-a7f3-418e-ab50-f6fe31053239\", \"06526eec-5632-4c24-a035-274bd3118661\", \"950aea08-5e79-4aa6-b015-0f9cb6836211\", \"c184c3ca-7ad3-4202-b108-cb9fd5f5d947\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect|somaticsniper\", \"da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936\", \"TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-8109\", \"TCGA-HT-8109-01A\", \"TCGA-HT-8109-10A\", \"TCGA-HT-8109-01A-11D-2395-08\", \"TCGA-HT-8109-10A-01D-2396-08\", \"LOXL4\", 84171, \"BI\", \"GRCh38\", \"chr10\", 98253732, 98253732, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"rs376068066\", \"by1000G;byCluster\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"61523043-c989-4ebc-8d20-80f1c578aa38\", \"a2939a7a-eec5-4cf0-821a-f0bb89ad36e7\", \"c.1656G>A\", \"p.=\", \"p.P552P\", \"ENST00000260702\", \"11/15\", \"81|80|81|72\", \"53|53|53|48\", \"28|27|28|24\", \"83|81|83|75\", \"LOXL4,synonymous_variant,p.P552P,ENST00000260702,NM_032211.6,c.1656G>A,LOW,YES,,,-1;RP11-34A14.3,intron_variant,,ENST00000433374,,n.180+1530C>T,MODIFIER,YES,,,1\", \"T\", \"ENSG00000138131\", \"ENST00000260702\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"1807/3653\", \"1656/2271\", \"552/756\", \"P\", \"ccG/ccA\", \"rs376068066\", \"1\", \"None\", -1, \"LOXL4\", \"HGNC\", \"HGNC:17171\", \"protein_coding\", \"YES\", \"CCDS7473.1\", \"ENSP00000260702\", \"Q96JB6\", \"None\", \"UPI0000046706\", \"NM_032211.6\", \"None\", \"None\", \"11/15\", \"None\", \"Pfam_domain:PF01186;Prints_domain:PR00074\", \"0.0002\", \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"0.001\", \"0\", \"0.0001\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"5.765e-05\", \"5.782e-05\", \"0\", \"0\", \"0.0002312\", \"0\", \"0\", \"0\", \"0.0003028\", \"PASS\", \"CTGAGCGGGCG\", \"f18c3cc5-4f29-4471-9857-f4aea5588c72|c007e593-4f65-4e67-b859-fefd62678104|0868c7e4-5220-46c1-b848-404ec35a0dab|a575f2c1-d37d-44d2-a69b-d24c129df394\", \"d25043dd-2196-496a-aeeb-5adadf1adb84\", \"0e6b0fb2-46ff-4901-be54-926f4bed5f73\", \"c7b2833a-9fe8-49f6-b888-2d27b0516f5c\", \"None\", \"COSM3966822\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HW-A5KL\", \"TCGA-HW-A5KL-01A\", \"TCGA-HW-A5KL-10A\", \"TCGA-HW-A5KL-01A-11D-A27K-08\", \"TCGA-HW-A5KL-10A-01D-A27N-08\", \"UBXN1\", 51035, \"BI\", \"GRCh38\", \"chr11\", 62678141, 62678141, \"+\", \"Intron\", \"SNP\", \"T\", \"T\", \"C\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina MiSeq\", \"c6e34202-c506-416d-bc41-de772c33295e\", \"31928eee-d7e5-4671-950d-0defa8244100\", \"c.291-23A>G\", \"None\", \"None\", \"ENST00000301935\", \"None\", \"73|70|73|64\", \"55|52|55|47\", \"18|18|18|17\", \"99|97|99|87\", \"UBXN1,intron_variant,,ENST00000294119,NM_015853.4,c.291-23A>G,MODIFIER,YES,,,-1;UBXN1,intron_variant,,ENST00000301935,NM_001286077.1,c.291-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000529640,,c.291-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000616865,NM_001286078.1,c.114-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000534176,,c.291-23A>G,MODIFIER,,,,-1;UQCC3,downstream_gene_variant,,ENST00000531323,,,MODIFIER,YES,,,1;UQCC3,downstream_gene_variant,,ENST00000377953,NM_001085372.2,,MODIFIER,,,,1;UBXN1,upstream_gene_variant,,ENST00000533000,,,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000524762,,n.448-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000525004,,n.114-23A>G,MODIFIER,,,,-1;UBXN1,non_coding_transcript_exon_variant,,ENST00000528907,,n.638A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000532904,,n.547-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000533476,,n.562-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000525717,,n.435-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000527421,,n.554-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000526919,,n.378-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000533908,,n.426-23A>G,MODIFIER,,,,-1;UBXN1,intron_variant,,ENST00000531056,,n.531-23A>G,MODIFIER,,,,-1;UBXN1,downstream_gene_variant,,ENST00000436354,,,MODIFIER,,,,-1;UBXN1,downstream_gene_variant,,ENST00000531625,,,MODIFIER,,,,-1\", \"C\", \"ENSG00000162191\", \"ENST00000301935\", \"Transcript\", \"intron_variant\", \"intron_variant\", \"-/1153\", \"-/894\", \"-/297\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"UBXN1\", \"HGNC\", \"HGNC:18402\", \"protein_coding\", \"None\", \"CCDS66105.1\", \"ENSP00000303991\", \"Q04323\", \"A0A024R598\", \"UPI0000073CEA\", \"NM_001286077.1\", \"None\", \"None\", \"None\", \"4/8\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AACAGTTCAAG\", \"c9f70be5-032b-4d63-8d2b-bfecb9cab927|5f1c55b1-e76c-4122-924f-fb113b31f966|b964b028-a3b5-42ec-b1d7-f19d225ee73e|4ad9be40-d8c2-4bd7-9d8c-8f6faa4289c8\", \"3ad19e57-5d90-4624-9320-9320d1535086\", \"a377e4b9-2de0-457c-87bc-1253f14a42ca\", \"0639b753-4099-4ca4-adb9-763069a614ef\", \"None\", \"None\", \"False\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HW-A5KM\", \"TCGA-HW-A5KM-01A\", \"TCGA-HW-A5KM-10A\", \"TCGA-HW-A5KM-01A-11D-A27K-08\", \"TCGA-HW-A5KM-10A-01D-A27N-08\", \"ATRX\", 546, \"BI\", \"GRCh38\", \"chrX\", 77682172, 77682205, \"+\", \"Frame_Shift_Del\", \"DEL\", \"AAAATGACAAATTTCTTCTCGCTCAGGTAACTTT\", \"AAAATGACAAATTTCTTCTCGCTCAGGTAACTTT\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina MiSeq\", \"326e0c99-d749-4f8f-8edd-1d0a5c82e07e\", \"c9aec61a-d7df-402c-9734-1e35cd5f6c43\", \"c.3051_3084delAAAGTTACCTGAGCGAGAAGAAATTTGTCATTTT\", \"p.Glu1017AspfsTer5\", \"p.E1017Dfs*5\", \"ENST00000373344\", \"9/35\", \"52\", \"14\", \"38\", \"52\", \"ATRX,frameshift_variant,p.E1017Dfs*5,ENST00000373344,NM_000489.4,c.3051_3084delAAAGTTACCTGAGCGAGAAGAAATTTGTCATTTT,HIGH,YES,,,-1;ATRX,frameshift_variant,p.E979Dfs*5,ENST00000395603,NM_138270.3,c.2937_2970delAAAGTTACCTGAGCGAGAAGAAATTTGTCATTTT,HIGH,,,,-1;ATRX,frameshift_variant,p.E949Dfs*5,ENST00000624166,,c.2847_2880delAAAGTTACCTGAGCGAGAAGAAATTTGTCATTTT,HIGH,,,,-1;ATRX,downstream_gene_variant,,ENST00000624032,,,MODIFIER,,,,-1;ATRX,upstream_gene_variant,,ENST00000493470,,,MODIFIER,,,,-1;ATRX,downstream_gene_variant,,ENST00000623321,,,MODIFIER,,,,-1;ATRX,downstream_gene_variant,,ENST00000625063,,,MODIFIER,,,,-1;ATRX,downstream_gene_variant,,ENST00000624668,,,MODIFIER,,,,-1;ATRX,3_prime_UTR_variant,,ENST00000480283,,c.*2679_*2712delAAAGTTACCTGAGCGAGAAGAAATTTGTCATTTT,MODIFIER,,,,-1\", \"-\", \"ENSG00000085224\", \"ENST00000373344\", \"Transcript\", \"frameshift_variant\", \"frameshift_variant\", \"3319-3352/11220\", \"3051-3084/7479\", \"1017-1028/2492\", \"EKLPEREEICHF/X\", \"gaAAAGTTACCTGAGCGAGAAGAAATTTGTCATTTT/ga\", \"None\", \"1\", \"None\", -1, \"ATRX\", \"HGNC\", \"HGNC:886\", \"protein_coding\", \"YES\", \"CCDS14434.1\", \"ENSP00000362441\", \"P46100\", \"A4LAA3\", \"UPI00001B644E\", \"NM_000489.4\", \"None\", \"None\", \"9/35\", \"None\", \"PROSITE_profiles:PS50318\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HIGH\", \"1\", \"deletion\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CTTAGGAAAATGACAAATTTCTTCTCGCTCAGGTAACTTTTCAGT\", \"99061e20-54a4-4982-b605-6b12670289bd\", \"47c2a52e-7a52-4714-81de-fe2a24039c3b\", \"534d30c7-4860-4ff3-ab11-26328558ec3a\", \"0db80dff-5586-4d9f-b253-df82e6fd6901\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-S9-A7J1\", \"TCGA-S9-A7J1-01A\", \"TCGA-S9-A7J1-10A\", \"TCGA-S9-A7J1-01A-21D-A34J-08\", \"TCGA-S9-A7J1-10A-01D-A34M-08\", \"SLITRK5\", 26050, \"BI\", \"GRCh38\", \"chr13\", 87675724, 87675724, \"+\", \"Silent\", \"SNP\", \"A\", \"A\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"62d732f2-263a-4721-966c-18984791f8f2\", \"789b7dd2-8169-4519-839d-8f7b66213675\", \"c.336A>T\", \"p.=\", \"p.L112L\", \"ENST00000325089\", \"2/2\", \"226|218|226|204\", \"145|139|145|130\", \"81|79|81|74\", \"215|210|215|203\", \"SLITRK5,synonymous_variant,p.L112L,ENST00000325089,NM_015567.1,c.336A>T,LOW,YES,,,1;MIR4500HG,upstream_gene_variant,,ENST00000436290,,,MODIFIER,YES,,,-1;MIR4500HG,upstream_gene_variant,,ENST00000441617,,,MODIFIER,,,,-1;MIR4500HG,upstream_gene_variant,,ENST00000453832,,,MODIFIER,,,,-1;MIR4500HG,upstream_gene_variant,,ENST00000606590,,,MODIFIER,,,,-1\", \"T\", \"ENSG00000165300\", \"ENST00000325089\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"555/21103\", \"336/2877\", \"112/958\", \"L\", \"ctA/ctT\", \"None\", \"1\", \"None\", 1, \"SLITRK5\", \"HGNC\", \"HGNC:20295\", \"protein_coding\", \"YES\", \"CCDS9465.1\", \"ENSP00000366283\", \"O94991\", \"None\", \"UPI000015F6F7\", \"NM_015567.1\", \"None\", \"None\", \"2/2\", \"None\", \"SMART_domains:SM00369;Superfamily_domains:SSF52058\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CATCTAGGTAG\", \"bd185509-b9b0-4ed8-a0f2-fd462fa460c3|f27e114a-1a7a-4fc1-905e-e76af9ef1a49|9b2a9218-63f5-4b04-a12b-f92dc261405f|e381cfbd-0294-4dc8-8992-50a7f78f99e1\", \"1e3672cd-8bf0-4379-8249-f6f1bcf63ce1\", \"c72f4b6f-2c0b-4d23-8f6e-7bf98d7e2580\", \"33bedfb7-33fb-479d-b997-50c3284c0ac9\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-6403\", \"TCGA-DU-6403-01A\", \"TCGA-DU-6403-10A\", \"TCGA-DU-6403-01A-11D-1705-08\", \"TCGA-DU-6403-10A-01D-1705-08\", \"COL6A2\", 1292, \"BI\", \"GRCh38\", \"chr21\", 46129116, 46129116, \"+\", \"Intron\", \"SNP\", \"G\", \"G\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"5d48a626-5f15-4f2d-8ca9-947b7d39146a\", \"1ae82b76-b781-4d6e-a0da-ba341056fe11\", \"c.2461+2575G>A\", \"None\", \"None\", \"ENST00000300527\", \"None\", \"32|25|32|28\", \"21|16|21|18\", \"11|9|11|9\", \"45|38|45|42\", \"COL6A2,3_prime_UTR_variant,,ENST00000310645,NM_058175.2,c.*188G>A,MODIFIER,,,,1;COL6A2,3_prime_UTR_variant,,ENST00000409416,,c.*188G>A,MODIFIER,,,,1;COL6A2,intron_variant,,ENST00000300527,NM_001849.3,c.2461+2575G>A,MODIFIER,YES,,,1;COL6A2,intron_variant,,ENST00000397763,NM_058174.2,c.2462-80G>A,MODIFIER,,,,1;COL6A2,downstream_gene_variant,,ENST00000413758,,,MODIFIER,,,,1\", \"A\", \"ENSG00000142173\", \"ENST00000300527\", \"Transcript\", \"intron_variant\", \"intron_variant\", \"-/3461\", \"-/3060\", \"-/1019\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"COL6A2\", \"HGNC\", \"HGNC:2212\", \"protein_coding\", \"YES\", \"CCDS13728.1\", \"ENSP00000300527\", \"P12110\", \"None\", \"UPI00001AECE0\", \"NM_001849.3\", \"None\", \"None\", \"None\", \"27/27\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GCCTCGCTGAG\", \"8db2477d-55fe-40dd-9168-82142c16f9d7|799525ed-3712-44d0-b8a7-29b990420702|03cd463d-bd95-4925-8a1e-fc3162d06317|d8d8aaca-26c6-49ac-b808-ace668277d08\", \"3e251c8b-51bf-472e-9b25-bef3d278370a\", \"91563c63-5dd0-4043-8ec0-0a0bc7bac0da\", \"8daa29c0-f652-4130-a004-5183bbe30c63\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-7018\", \"TCGA-DU-7018-01A\", \"TCGA-DU-7018-10A\", \"TCGA-DU-7018-01A-11D-2024-08\", \"TCGA-DU-7018-10A-01D-2024-08\", \"MIR509-1\", 574514, \"BI\", \"GRCh38\", \"chrX\", 147260612, 147260612, \"+\", \"RNA\", \"SNP\", \"C\", \"C\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"29c55a80-cd55-4297-b433-00d0e2b1e08d\", \"453998d9-d9f9-479d-86c0-d889a58b836d\", \"n.14G>T\", \"None\", \"None\", \"ENST00000385265\", \"1/1\", \"292|187|189\", \"258|160|162\", \"34|27|27\", \"273|273|182\", \"MIR509-1,non_coding_transcript_exon_variant,,ENST00000385265,,n.14G>T,MODIFIER,YES,,,-1;MIR509-2,upstream_gene_variant,,ENST00000390724,,,MODIFIER,YES,,,-1;MIR509-3,upstream_gene_variant,,ENST00000390725,,,MODIFIER,YES,,,-1\", \"A\", \"ENSG00000208000\", \"ENST00000385265\", \"Transcript\", \"non_coding_transcript_exon_variant\", \"non_coding_transcript_exon_variant;non_coding_transcript_variant\", \"14/94\", \"None\", \"None\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"MIR509-1\", \"HGNC\", \"HGNC:32146\", \"miRNA\", \"YES\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"1/1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", NaN, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GGGTACCACAC\", \"c7e0a3ae-a08b-40cc-99c5-2f442c5b36ac|e8acd91f-4fd6-4df8-8c8b-f95731dc99c5|3d62c780-aa7d-43f6-85cf-23cee831d843\", \"05681a1e-5ba9-4cfd-a1f3-8a765e1d6b3a\", \"c22a3a9f-0e1c-45dc-8219-6234eb387859\", \"f18dab99-26b0-4727-89a9-7f16bd382356\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-7476\", \"TCGA-HT-7476-01A\", \"TCGA-HT-7476-10A\", \"TCGA-HT-7476-01A-11D-2024-08\", \"TCGA-HT-7476-10A-01D-2024-08\", \"SCAPER\", 49855, \"BI\", \"GRCh38\", \"chr15\", 76574157, 76574157, \"+\", \"Splice_Site\", \"SNP\", \"C\", \"C\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"c9627781-e55f-45ac-9c49-bdd3b0bcdc86\", \"6dff219a-04da-4385-bcdb-17871c41e822\", \"c.2838+1G>A\", \"None\", \"p.X946_splice\", \"ENST00000324767\", \"None\", \"14\", \"10\", \"4\", \"11\", \"SCAPER,splice_donor_variant,p.X946_splice,ENST00000563290,,c.2838+1G>A,HIGH,YES,,,-1;SCAPER,splice_donor_variant,p.X700_splice,ENST00000538941,NM_001145923.1,c.2100+1G>A,HIGH,,,,-1;SCAPER,splice_donor_variant,p.X946_splice,ENST00000324767,NM_020843.2,c.2838+1G>A,HIGH,,,,-1;SCAPER,splice_donor_variant,,ENST00000568428,,n.220+1G>A,HIGH,,,,-1;SCAPER,splice_donor_variant,,ENST00000569784,,n.254+1G>A,HIGH,,,,-1;SCAPER,splice_donor_variant,,ENST00000303521,,n.2902+1G>A,HIGH,,,,-1;SCAPER,splice_donor_variant,p.X67_splice,ENST00000564757,,c.199+1G>A,HIGH,,,,-1;SCAPER,splice_donor_variant,,ENST00000563688,,n.193+1G>A,HIGH,,,,-1\", \"T\", \"ENSG00000140386\", \"ENST00000324767\", \"Transcript\", \"splice_donor_variant\", \"splice_donor_variant\", \"-/4707\", \"2838/4203\", \"946/1400\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"SCAPER\", \"HGNC\", \"HGNC:13081\", \"protein_coding\", \"None\", \"CCDS53962.1\", \"ENSP00000326924\", \"Q9BY12\", \"None\", \"UPI0000E59CC3\", \"NM_020843.2\", \"None\", \"None\", \"None\", \"22/30\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HIGH\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"ACACACCTCTT\", \"df72830b-2b2c-4101-be93-ae52caf6e98f\", \"c5ad9887-bcfc-47dc-96bc-0a82a4b79282\", \"54b74471-4d1c-4a29-9a8f-1edc425dd288\", \"27d0d3cb-16c0-4ba8-9662-95917f665004\", \"NonExonic\", \"None\", \"True\", \"Unknown\", \"somaticsniper\", \"76313658-c6df-4f73-8e04-affdbb0013bd\", \"TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-7620\", \"TCGA-HT-7620-01A\", \"TCGA-HT-7620-10A\", \"TCGA-HT-7620-01A-11D-2253-08\", \"TCGA-HT-7620-10A-01D-2253-08\", \"ATP6AP1L\", 92270, \"BI\", \"GRCh38\", \"chr5\", 82305324, 82305324, \"+\", \"5'UTR\", \"DEL\", \"A\", \"A\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"3e2dba25-2fc2-4f3b-90f0-663e1576a6bf\", \"1f1dbf44-a66f-478b-9efa-9e76ca91f4bc\", \"c.-67delA\", \"None\", \"None\", \"ENST00000380167\", \"7/10\", \"11\", \"7\", \"4\", \"17\", \"ATP6AP1L,5_prime_UTR_variant,,ENST00000380167,,c.-67delA,MODIFIER,YES,,,1;ATP6AP1L,upstream_gene_variant,,ENST00000439350,NM_001017971.1,,MODIFIER,,,,1;ATP6AP1L,upstream_gene_variant,,ENST00000508366,,,MODIFIER,,,,1;ATP6AP1L,upstream_gene_variant,,ENST00000514672,,,MODIFIER,,,,1\", \"-\", \"ENSG00000205464\", \"ENST00000380167\", \"Transcript\", \"5_prime_UTR_variant\", \"5_prime_UTR_variant\", \"1248/2503\", \"-/675\", \"-/224\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"ATP6AP1L\", \"HGNC\", \"HGNC:28091\", \"protein_coding\", \"YES\", \"CCDS34196.1\", \"ENSP00000369513\", \"Q52LC2\", \"A0A024RAQ7\", \"UPI000015F4B3\", \"None\", \"None\", \"None\", \"7/10\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"deletion\", 2.0, 11.0, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CATCTCAAAAAA\", \"89c80324-0511-46b8-9c9f-3d99882f4edb\", \"2a5ba823-0e26-48fa-91a9-55d47cfaee52\", \"d07e055e-f07a-487c-be95-f7effc4c26f2\", \"0d61bdbd-24b1-4885-a099-9e42ca7eedcd\", \"None\", \"None\", \"False\", \"Unknown\", \"varscan\", \"7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-P5-A77W\", \"TCGA-P5-A77W-01A\", \"TCGA-P5-A77W-10A\", \"TCGA-P5-A77W-01A-11D-A32B-08\", \"TCGA-P5-A77W-10A-01D-A329-08\", \"EIF5B\", 9669, \"BI\", \"GRCh38\", \"chr2\", 99363679, 99363700, \"+\", \"Frame_Shift_Del\", \"DEL\", \"GAAGAAAAAGAAAGGAGAAAAG\", \"GAAGAAAAAGAAAGGAGAAAAG\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"f0d366d4-b18f-44b3-9e4e-fc49e38c5601\", \"5e92215f-5cb4-459d-91fa-0b0026d14be5\", \"c.965_986delAAGGAGAAAAGGAAGAAAAAGA\", \"p.Lys322ArgfsTer38\", \"p.K322Rfs*38\", \"ENST00000289371\", \"5/24\", \"42\", \"37\", \"5\", \"45\", \"EIF5B,frameshift_variant,p.K322Rfs*38,ENST00000289371,NM_015904.3,c.965_986delAAGGAGAAAAGGAAGAAAAAGA,HIGH,YES,,,1;EIF5B,frameshift_variant,p.K322Rfs*38,ENST00000617677,,c.965_986delAAGGAGAAAAGGAAGAAAAAGA,HIGH,,,,1\", \"-\", \"ENSG00000158417\", \"ENST00000289371\", \"Transcript\", \"frameshift_variant\", \"frameshift_variant\", \"1156-1177/5777\", \"954-975/3663\", \"318-325/1220\", \"KKKKKGEK/X\", \"aaGAAGAAAAAGAAAGGAGAAAAG/aa\", \"None\", \"1\", \"None\", 1, \"EIF5B\", \"HGNC\", \"HGNC:30793\", \"protein_coding\", \"YES\", \"CCDS42721.1\", \"ENSP00000289371\", \"O60841\", \"None\", \"UPI0000207EC7\", \"NM_015904.3\", \"None\", \"None\", \"5/24\", \"None\", \"Low_complexity_(Seg):Seg;Coiled-coils_(Ncoils):ncoils;PROSITE_profiles:PS50313;PROSITE_profiles:PS50318\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HIGH\", \"1\", \"deletion\", 1.0, 11.0, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AGATAAGAAGAAAAAGAAAGGAGAAAAGGAAGA\", \"2e94aa3c-0698-488b-bbe7-cb0f4dab1f8e\", \"f40eb688-370f-4fdb-a861-c6d1a581cfc7\", \"f1e0ea90-5d90-414c-b2df-359356bb642a\", \"eef15b5c-5fbe-482a-b3b0-dd091888a6a2\", \"None\", \"None\", \"False\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-RY-A83Y\", \"TCGA-RY-A83Y-01A\", \"TCGA-RY-A83Y-10A\", \"TCGA-RY-A83Y-01A-11D-A36O-08\", \"TCGA-RY-A83Y-10A-01D-A367-08\", \"FERMT1\", 55612, \"BI\", \"GRCh38\", \"chr20\", 6097576, 6097576, \"+\", \"Frame_Shift_Del\", \"DEL\", \"A\", \"A\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"ccd64d5e-ef83-4d59-afee-255bf044af2e\", \"4a4dbfc4-a72d-4c24-ba49-b7ceb25c9b18\", \"c.905delT\", \"p.Leu302Ter\", \"p.L302*\", \"ENST00000217289\", \"7/15\", \"95|81\", \"52|46\", \"43|35\", \"120|104\", \"FERMT1,frameshift_variant,p.L302*,ENST00000217289,NM_017671.4,c.905delT,HIGH,YES,,,-1;FERMT1,frameshift_variant,p.L45*,ENST00000536936,,c.134delT,HIGH,,,,-1;FERMT1,upstream_gene_variant,,ENST00000478194,,,MODIFIER,,,,-1\", \"-\", \"ENSG00000101311\", \"ENST00000217289\", \"Transcript\", \"frameshift_variant\", \"frameshift_variant\", \"1694/5151\", \"905/2034\", \"302/677\", \"L/X\", \"tTa/ta\", \"None\", \"1\", \"None\", -1, \"FERMT1\", \"HGNC\", \"HGNC:15889\", \"protein_coding\", \"YES\", \"CCDS13098.1\", \"ENSP00000217289\", \"Q9BQL6\", \"None\", \"UPI00001285DD\", \"NM_017671.4\", \"None\", \"None\", \"7/15\", \"None\", \"Pfam_domain:PF00373;SMART_domains:SM00295;Superfamily_domains:SSF47031\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HIGH\", \"1\", \"deletion\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TCTTCTAAGAGA\", \"05bd1217-463e-448a-8ed6-cdc1bb66da93|66ce38cb-ea12-4612-9fb4-14a431323810\", \"a1b6dfc1-f448-4585-a959-35f16aed00ec\", \"c42a8bc5-5417-45fb-a407-7ed8c88ce1c8\", \"172701cf-709b-4e8f-b2fa-e2690a9e272d\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect|varscan\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-WY-A85C\", \"TCGA-WY-A85C-01A\", \"TCGA-WY-A85C-10A\", \"TCGA-WY-A85C-01A-11D-A36O-08\", \"TCGA-WY-A85C-10A-01D-A367-08\", \"MTUS2\", 23281, \"BI\", \"GRCh38\", \"chr13\", 29026588, 29026588, \"+\", \"Missense_Mutation\", \"SNP\", \"G\", \"G\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"b0a54624-8f3c-4b1b-86d5-61ba2b23301e\", \"6b10639c-71dc-4e9e-9b88-65335e63c029\", \"c.1920G>T\", \"p.Lys640Asn\", \"p.K640N\", \"ENST00000612955\", \"3/16\", \"43|42|43|40\", \"28|27|28|27\", \"15|15|15|13\", \"34|34|34|32\", \"MTUS2,missense_variant,p.K640N,ENST00000612955,,c.1920G>T,MODERATE,YES,deleterious(0.03),possibly_damaging(0.787),1;MTUS2,missense_variant,p.K640N,ENST00000431530,NM_001033602.2,c.1920G>T,MODERATE,,deleterious(0.03),possibly_damaging(0.787),1\", \"T\", \"ENSG00000132938\", \"ENST00000612955\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"2469/7430\", \"1920/4140\", \"640/1379\", \"K/N\", \"aaG/aaT\", \"None\", \"1\", \"None\", 1, \"MTUS2\", \"HGNC\", \"HGNC:20595\", \"protein_coding\", \"YES\", \"CCDS45022.1\", \"ENSP00000483729\", \"None\", \"J3KQA9\", \"UPI0000F734AC\", \"None\", \"deleterious(0.03)\", \"possibly_damaging(0.787)\", \"3/16\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 5.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"ACTAAGCCCAT\", \"65d963e5-385a-4f65-8b17-f73e95326ed2|236b97d5-56ff-4f69-b914-68f02827567a|50717885-b247-4d33-b069-a283dfaa4bf0|91212816-bd1e-413e-a869-85cba120dea6\", \"7046758a-d694-46cd-a8a5-788989e38b10\", \"cd500e1e-1059-4515-a6ad-2fedb71ee090\", \"f62be2b8-88c4-4a7e-8c80-8176fb5f6c56\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-14-1829\", \"TCGA-14-1829-01A\", \"TCGA-14-1829-10A\", \"TCGA-14-1829-01A-01D-1494-08\", \"TCGA-14-1829-10A-01D-1494-08\", \"OR52B2\", 255725, \"BI\", \"GRCh38\", \"chr11\", 6170119, 6170119, \"+\", \"Missense_Mutation\", \"SNP\", \"C\", \"C\", \"T\", \"rs143192617\", \"by1000G;byCluster;byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"3e44b3bd-667e-4e4d-b218-ad6a1515d4e8\", \"44a340e6-6884-4868-9a8a-54c2d8de19af\", \"c.208G>A\", \"p.Val70Ile\", \"p.V70I\", \"ENST00000530810\", \"1/1\", \"221|204|221|198\", \"159|145|159|142\", \"62|59|62|55\", \"288|277|291|245\", \"OR52B2,missense_variant,p.V70I,ENST00000530810,NM_001004052.1,c.208G>A,MODERATE,YES,tolerated(0.81),benign(0),-1;RP11-290F24.3,intron_variant,,ENST00000529961,,n.286+15172G>A,MODIFIER,YES,,,-1\", \"T\", \"ENSG00000255307\", \"ENST00000530810\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"290/1079\", \"208/972\", \"70/323\", \"V/I\", \"Gtc/Atc\", \"rs143192617\", \"1\", \"None\", -1, \"OR52B2\", \"HGNC\", \"HGNC:15207\", \"protein_coding\", \"YES\", \"CCDS53598.1\", \"ENSP00000432011\", \"Q96RD2\", \"None\", \"UPI000004B212\", \"NM_001004052.1\", \"tolerated(0.81)\", \"benign(0)\", \"1/1\", \"None\", \"Transmembrane_helices:Tmhmm;Pfam_domain:PF00001;Pfam_domain:PF10320;Prints_domain:PR00237;PROSITE_profiles:PS50262;Superfamily_domains:SSF81321\", \"0.0004\", \"0.0\", \"0.0014\", \"0.001\", \"0.0\", \"0.0\", \"0.0002\", \"0\", \"None\", \"None\", \"None\", \"MODERATE\", \"None\", \"SNV\", NaN, NaN, \"None\", \"1\", \"1.156e-04\", \"0.000116\", \"0\", \"8.673e-05\", \"0.001044\", \"0\", \"2.997e-05\", \"0\", \"0.0001211\", \"PASS\", \"CATGACGGCCA\", \"76fdf29c-b49b-43a9-a9e3-2a1b5a781ef1|a6926b81-e892-4aeb-a22e-1ada93d1f846|2ff5f44b-7b21-4b54-bdd5-068bea780154|76718f17-463d-4e5a-8c93-4a7cfe9fe7d3\", \"eaa0efb1-a9c4-4c81-bc88-b41aea86d3f4\", \"15418ae9-c3b8-43ab-abcd-6dfe165afca8\", \"47a4161c-9c61-48f5-b9bc-a6d1acad4e5a\", \"common_in_exac\", \"COSM5189517\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-16-0849\", \"TCGA-16-0849-01A\", \"TCGA-16-0849-10A\", \"TCGA-16-0849-01A-01W-0424-08\", \"TCGA-16-0849-10A-01W-0424-08\", \"GCNT3\", 9245, \"BI\", \"GRCh38\", \"chr15\", 59619619, 59619619, \"+\", \"3'UTR\", \"SNP\", \"C\", \"C\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina Genome Analyzer II\", \"c7d9ea47-6f80-4c24-a8f3-43c10987c5e7\", \"e4432b56-1bb2-4008-929c-267312f59f13\", \"c.*64C>T\", \"None\", \"None\", \"ENST00000396065\", \"3/3\", \"59\", \"55\", \"4\", \"35\", \"GCNT3,3_prime_UTR_variant,,ENST00000396065,,c.*64C>T,MODIFIER,YES,,,1;GCNT3,3_prime_UTR_variant,,ENST00000560585,NM_004751.2,c.*64C>T,MODIFIER,,,,1;GCNT3,downstream_gene_variant,,ENST00000559189,,,MODIFIER,,,,1;GCNT3,downstream_gene_variant,,ENST00000559626,,,MODIFIER,,,,1;GCNT3,downstream_gene_variant,,ENST00000559200,,,MODIFIER,,,,1;GCNT3,intron_variant,,ENST00000560210,,n.351+2738C>T,MODIFIER,,,,1;GCNT3,downstream_gene_variant,,ENST00000560580,,,MODIFIER,,,,1;GCNT3,downstream_gene_variant,,ENST00000560874,,,MODIFIER,,,,1;GCNT3,downstream_gene_variant,,ENST00000558721,,,MODIFIER,,,,1\", \"T\", \"ENSG00000140297\", \"ENST00000396065\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"1829/4933\", \"-/1317\", \"-/438\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"GCNT3\", \"HGNC\", \"HGNC:4205\", \"protein_coding\", \"YES\", \"CCDS10172.1\", \"ENSP00000379377\", \"O95395\", \"A0A024R5T9\", \"UPI0000034962\", \"None\", \"None\", \"None\", \"3/3\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"ACTTGCTGGGA\", \"6947ca69-f161-4c1a-a895-88e6633868e2\", \"e392a2f2-4505-4d6b-971b-fc1c9f80f16c\", \"66d1d54e-c182-4c9a-a938-299925f98c92\", \"a210407e-b7de-4e27-84b2-9dcc5f9e6e63\", \"wga_pair\", \"None\", \"False\", \"Unknown\", \"mutect\", \"da904cd3-79d7-4ae3-b6c0-e7127998b3e6\", \"TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-27-1838\", \"TCGA-27-1838-01A\", \"TCGA-27-1838-10A\", \"TCGA-27-1838-01A-01D-1494-08\", \"TCGA-27-1838-10A-01D-1494-08\", \"STYX\", 6815, \"BI\", \"GRCh38\", \"chr14\", 52771120, 52771120, \"+\", \"3'UTR\", \"SNP\", \"A\", \"A\", \"G\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"881af1d2-3fbc-44dd-8362-e6c386345cf6\", \"d3e925a1-2c02-4722-a862-78d17ef59052\", \"c.*14A>G\", \"None\", \"None\", \"ENST00000354586\", \"11/11\", \"101|98|101|88\", \"58|56|58|48\", \"43|42|43|40\", \"87|84|87|78\", \"STYX,3_prime_UTR_variant,,ENST00000354586,NM_145251.3,c.*14A>G,MODIFIER,YES,,,1;STYX,3_prime_UTR_variant,,ENST00000442123,NM_001130701.1,c.*14A>G,MODIFIER,,,,1;GNPNAT1,downstream_gene_variant,,ENST00000216410,NM_198066.3,,MODIFIER,YES,,,-1;RP11-589M4.1,upstream_gene_variant,,ENST00000555969,,,MODIFIER,YES,,,1;STYX,intron_variant,,ENST00000556861,,n.120-2496A>G,MODIFIER,,,,1;GNPNAT1,downstream_gene_variant,,ENST00000554421,,,MODIFIER,,,,-1\", \"G\", \"ENSG00000198252\", \"ENST00000354586\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"979/4857\", \"-/672\", \"-/223\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"STYX\", \"HGNC\", \"HGNC:11447\", \"protein_coding\", \"YES\", \"CCDS9711.1\", \"ENSP00000346599\", \"Q8WUJ0\", \"A0A024R641\", \"UPI00000434EF\", \"NM_145251.3\", \"None\", \"None\", \"11/11\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GCAACATCATA\", \"faf83fe0-9fdf-4aa3-8587-e783e305d98a|08bd6c6f-7484-46d0-a9e3-bf5ea5925914|4c5b9de5-c207-4895-aca3-18d077c399c5|b1070dca-cf87-4cca-af2a-12c33a8301d9\", \"78d42fe3-c289-4595-bade-48910bb8ea1c\", \"25276c06-de11-4c56-ba58-3f01d797db6b\", \"6fc6b9ca-84d8-4647-bbc8-c5ab472b1c02\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-6542\", \"TCGA-DU-6542-01A\", \"TCGA-DU-6542-10A\", \"TCGA-DU-6542-01A-11D-1893-08\", \"TCGA-DU-6542-10A-01D-1893-08\", \"UGT1A6\", 54578, \"BI\", \"GRCh38\", \"chr2\", 233693700, 233693700, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"rs536034017\", \"byCluster\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"96dd5230-96ed-40d9-a861-339fdb8a9842\", \"d6e9d687-e7e6-475b-8290-ddea4d015a92\", \"c.696C>T\", \"p.=\", \"p.L232L\", \"ENST00000305139\", \"1/5\", \"188\", \"175\", \"13\", \"296\", \"UGT1A6,synonymous_variant,p.L232L,ENST00000305139,NM_001072.3,c.696C>T,LOW,YES,,,1;UGT1A6,5_prime_UTR_variant,,ENST00000406651,,c.-106C>T,MODIFIER,,,,1;UGT1A9,intron_variant,,ENST00000354728,NM_021027.2,c.855+20911C>T,MODIFIER,YES,,,1;UGT1A10,intron_variant,,ENST00000344644,NM_019075.2,c.855+56323C>T,MODIFIER,YES,,,1;UGT1A8,intron_variant,,ENST00000373450,NM_019076.4,c.856-73334C>T,MODIFIER,YES,,,1;UGT1A7,intron_variant,,ENST00000373426,NM_019077.2,c.855+10908C>T,MODIFIER,YES,,,1;UGT1A10,intron_variant,,ENST00000373445,,c.855+56323C>T,MODIFIER,,,,1;UGT1A6,intron_variant,,ENST00000373424,NM_205862.1,c.-7-99C>T,MODIFIER,,,,1;UGT1A7,downstream_gene_variant,,ENST00000485022,,,MODIFIER,,,,1;UGT1A6,downstream_gene_variant,,ENST00000441351,,,MODIFIER,,,,1;AC114812.8,non_coding_transcript_exon_variant,,ENST00000439336,,n.397G>A,MODIFIER,YES,,,-1;UGT1A6,non_coding_transcript_exon_variant,,ENST00000478062,,n.16C>T,MODIFIER,,,,1;UGT1A6,intron_variant,,ENST00000480628,,n.120-99C>T,MODIFIER,,,,1;UGT1A6,synonymous_variant,p.L12L,ENST00000484784,,c.36C>T,LOW,,,,1;UGT1A6,intron_variant,,ENST00000446481,,c.-7-99C>T,MODIFIER,,,,1\", \"T\", \"ENSG00000167165\", \"ENST00000305139\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"835/2479\", \"696/1599\", \"232/532\", \"L\", \"ctC/ctT\", \"rs536034017\", \"1\", \"None\", 1, \"UGT1A6\", \"HGNC\", \"HGNC:12538\", \"protein_coding\", \"YES\", \"CCDS2507.1\", \"ENSP00000303174\", \"P19224\", \"Q5DSZ8\", \"UPI000007021F\", \"NM_001072.3\", \"None\", \"None\", \"1/5\", \"None\", \"Pfam_domain:PF00201;Superfamily_domains:SSF53756\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"8.236e-06\", \"8.237e-06\", \"0\", \"0\", \"0\", \"0\", \"1.498e-05\", \"0\", \"0\", \"PASS\", \"GAACTCGCATC\", \"944aed61-5f60-47e0-b8fb-d8497ace5108\", \"3d94bd04-c878-47a4-a48d-accd9e1525c1\", \"a0597eb6-6e2b-4159-9b69-2d2392dd4ade\", \"cd69d509-a652-4257-a8d3-767296bbb4ec\", \"None\", \"COSM3050276\", \"True\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-FG-A711\", \"TCGA-FG-A711-01A\", \"TCGA-FG-A711-10A\", \"TCGA-FG-A711-01A-21D-A33T-08\", \"TCGA-FG-A711-10A-01D-A33W-08\", \"ZBTB43\", 23099, \"BI\", \"GRCh38\", \"chr9\", 126834019, 126834019, \"+\", \"3'UTR\", \"DEL\", \"A\", \"A\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"68a96a9b-dc21-4670-9138-97406a67574a\", \"1d9303e4-6cac-40b9-a4e0-6aaf1eb9217c\", \"c.*116delA\", \"None\", \"None\", \"ENST00000373457\", \"1/1\", \"33\", \"26\", \"6\", \"21\", \"ZBTB43,3_prime_UTR_variant,,ENST00000373464,NM_014007.3,c.*116delA,MODIFIER,YES,,,1;ZBTB43,3_prime_UTR_variant,,ENST00000449886,NM_001135776.1,c.*116delA,MODIFIER,,,,1;ZBTB43,3_prime_UTR_variant,,ENST00000373457,,c.*116delA,MODIFIER,,,,1;ZBTB43,downstream_gene_variant,,ENST00000450858,,,MODIFIER,,,,1;ZBTB43,upstream_gene_variant,,ENST00000497064,,,MODIFIER,,,,1\", \"-\", \"ENSG00000169155\", \"ENST00000373457\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"2611/5695\", \"-/1404\", \"-/467\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"ZBTB43\", \"HGNC\", \"HGNC:17908\", \"protein_coding\", \"None\", \"CCDS6867.1\", \"ENSP00000362556\", \"O43298\", \"None\", \"UPI000013C34F\", \"None\", \"None\", \"None\", \"1/1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"None\", \"deletion\", NaN, 10.0, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AAGCTTAAAAAA\", \"01602be5-0421-4cfd-853e-d27aebba2844\", \"6bd2f0f6-df8f-4b4e-804b-328923ec382b\", \"6003d52e-8299-4028-b0e7-75ec925e4088\", \"1f5b6b07-45f5-4da4-932a-df9665f6c538\", \"None\", \"None\", \"False\", \"Unknown\", \"varscan\", \"7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-7609\", \"TCGA-HT-7609-01A\", \"TCGA-HT-7609-10A\", \"TCGA-HT-7609-01A-11D-2086-08\", \"TCGA-HT-7609-10A-01D-2086-08\", \"POU2F2\", 5452, \"BI\", \"GRCh38\", \"chr19\", 42096235, 42096235, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"2d5f5c7e-e359-4788-8718-f7fc5164a30d\", \"8f0035fe-017d-4cf6-81b8-79b90a6214c5\", \"c.510C>T\", \"p.=\", \"p.T170T\", \"ENST00000526816\", \"8/14\", \"16|15\", \"13|12\", \"3\", \"16\", \"POU2F2,synonymous_variant,p.T170T,ENST00000526816,NM_001207025.2,c.510C>T,LOW,YES,,,-1;POU2F2,synonymous_variant,p.T170T,ENST00000529952,NM_001207026.1,c.510C>T,LOW,,,,-1;POU2F2,synonymous_variant,p.T164T,ENST00000528894,,c.490C>T,LOW,,,,-1;POU2F2,synonymous_variant,p.T129T,ENST00000526831,,c.386C>T,LOW,,,,-1;POU2F2,intron_variant,,ENST00000389341,NM_002698.4,c.502-40C>T,MODIFIER,,,,-1;POU2F2,intron_variant,,ENST00000342301,,c.502-40C>T,MODIFIER,,,,-1;POU2F2,intron_variant,,ENST00000560558,,c.385-40C>T,MODIFIER,,,,-1;POU2F2,intron_variant,,ENST00000529067,NM_001247994.1,c.502-40C>T,MODIFIER,,,,-1;POU2F2,intron_variant,,ENST00000560804,,c.556-40C>T,MODIFIER,,,,-1;POU2F2,intron_variant,,ENST00000560398,,c.568-40C>T,MODIFIER,,,,-1;POU2F2,upstream_gene_variant,,ENST00000533548,,,MODIFIER,,,,-1;POU2F2,upstream_gene_variant,,ENST00000598842,,,MODIFIER,,,,-1;POU2F2,downstream_gene_variant,,ENST00000531773,,,MODIFIER,,,,-1;POU2F2,3_prime_UTR_variant,,ENST00000534559,,c.*271C>T,MODIFIER,,,,-1;POU2F2,downstream_gene_variant,,ENST00000530982,,,MODIFIER,,,,-1\", \"A\", \"ENSG00000028277\", \"ENST00000526816\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"526/3218\", \"510/1440\", \"170/479\", \"T\", \"acC/acT\", \"None\", \"1\", \"None\", -1, \"POU2F2\", \"HGNC\", \"HGNC:9213\", \"protein_coding\", \"YES\", \"CCDS56095.1\", \"ENSP00000431603\", \"P09086\", \"None\", \"UPI0000186851\", \"NM_001207025.2\", \"None\", \"None\", \"8/14\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GGGCGGGTCAC\", \"770b16cd-c9b8-41f8-89ae-915f6a1855a5|87b61d18-2336-43c3-a8e3-dcc7146390fe\", \"be0f76c1-f077-4b18-a7ae-fc6a13e40e3c\", \"5a33554f-c8cd-4e8b-b6a1-48069500bb47\", \"bfbc0d1e-2a0b-4c60-8a37-91e3ce4b79ee\", \"None\", \"COSM3971019\", \"True\", \"Unknown\", \"muse|mutect\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-A616\", \"TCGA-HT-A616-01A\", \"TCGA-HT-A616-10A\", \"TCGA-HT-A616-01A-11D-A29Q-08\", \"TCGA-HT-A616-10A-01D-A29Q-08\", \"AVPR1A\", 552, \"BI\", \"GRCh38\", \"chr12\", 63150081, 63150081, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000;Illumina MiSeq\", \"5e41fcb0-82bf-4e09-99ba-ff6f56d6f18c\", \"eb5310fc-1426-4b59-b41b-47302c259a6a\", \"c.756G>A\", \"p.=\", \"p.A252A\", \"ENST00000299178\", \"1/2\", \"225\", \"217\", \"8\", \"167\", \"AVPR1A,synonymous_variant,p.A252A,ENST00000299178,NM_000706.4,c.756G>A,LOW,YES,,,-1;AVPR1A,synonymous_variant,p.A33A,ENST00000550940,,c.99G>A,LOW,,,,-1;RP11-715H19.2,upstream_gene_variant,,ENST00000624438,,,MODIFIER,YES,,,1\", \"T\", \"ENSG00000166148\", \"ENST00000299178\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"862/5963\", \"756/1257\", \"252/418\", \"A\", \"gcG/gcA\", \"None\", \"1\", \"None\", -1, \"AVPR1A\", \"HGNC\", \"HGNC:895\", \"protein_coding\", \"YES\", \"CCDS8965.1\", \"ENSP00000299178\", \"P37288\", \"X5D2B0\", \"UPI0000050439\", \"NM_000706.4\", \"None\", \"None\", \"1/2\", \"None\", \"Pfam_domain:PF00001;Pfam_domain:PF10320;Pfam_domain:PF10323;PROSITE_profiles:PS50262;Superfamily_domains:SSF81321\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CGCGACGCCGT\", \"a4149fb3-0ea0-4e61-bade-25a38d5904d9\", \"3c1e80fd-59a8-4823-8cdc-34879dd6fa0e\", \"8b16e52a-62cc-4e49-9701-749e74267317\", \"d43581a5-3d49-4263-862b-ca99d15ec03d\", \"None\", \"COSM3968374\", \"True\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-14-0789\", \"TCGA-14-0789-01A\", \"TCGA-14-0789-10A\", \"TCGA-14-0789-01A-01D-1492-08\", \"TCGA-14-0789-10A-01D-1492-08\", \"MPI\", 4351, \"BI\", \"GRCh38\", \"chr15\", 74896952, 74896952, \"+\", \"Intron\", \"SNP\", \"C\", \"C\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"cbba45d9-2bd8-40aa-b566-3d3273021ec0\", \"186d3e24-eaa7-48f6-93bb-7070d488ca90\", \"c.845-59C>T\", \"None\", \"None\", \"ENST00000352410\", \"None\", \"106|102|104\", \"83|79|81\", \"23\", \"65|63|61\", \"MPI,3_prime_UTR_variant,,ENST00000564003,,c.*451C>T,MODIFIER,,,,1;MPI,intron_variant,,ENST00000352410,NM_002435.2,c.845-59C>T,MODIFIER,YES,,,1;MPI,intron_variant,,ENST00000566377,NM_001289155.1,c.845-560C>T,MODIFIER,,,,1;MPI,intron_variant,,ENST00000563786,,c.785-59C>T,MODIFIER,,,,1;MPI,intron_variant,,ENST00000323744,NM_001289157.1,c.662-59C>T,MODIFIER,,,,1;MPI,intron_variant,,ENST00000535694,NM_001289156.1,c.695-59C>T,MODIFIER,,,,1;MPI,intron_variant,,ENST00000567177,,c.623-560C>T,MODIFIER,,,,1;MPI,intron_variant,,ENST00000569931,,c.785-59C>T,MODIFIER,,,,1;MPI,intron_variant,,ENST00000562800,,c.256-587C>T,MODIFIER,,,,1;FAM219B,downstream_gene_variant,,ENST00000357635,NM_020447.3,,MODIFIER,YES,,,-1;FAM219B,downstream_gene_variant,,ENST00000563119,,,MODIFIER,,,,-1;MPI,downstream_gene_variant,,ENST00000563422,,,MODIFIER,,,,1;MPI,downstream_gene_variant,,ENST00000565576,,,MODIFIER,,,,1;MPI,downstream_gene_variant,,ENST00000562606,,,MODIFIER,,,,1;MPI,downstream_gene_variant,,ENST00000567570,,,MODIFIER,,,,1;MPI,downstream_gene_variant,,ENST00000564633,,,MODIFIER,,,,1;MPI,downstream_gene_variant,,ENST00000568828,,,MODIFIER,,,,1;MPI,downstream_gene_variant,,ENST00000567132,,,MODIFIER,,,,1;MPI,downstream_gene_variant,,ENST00000569233,,,MODIFIER,,,,1;MPI,downstream_gene_variant,,ENST00000568907,,,MODIFIER,,,,1;MPI,upstream_gene_variant,,ENST00000564692,,,MODIFIER,,,,1;FAM219B,downstream_gene_variant,,ENST00000564723,,,MODIFIER,,,,-1;MPI,non_coding_transcript_exon_variant,,ENST00000566556,,n.1519C>T,MODIFIER,,,,1;FAM219B,downstream_gene_variant,,ENST00000566894,,,MODIFIER,,,,-1;FAM219B,downstream_gene_variant,,ENST00000569524,,,MODIFIER,,,,-1;FAM219B,downstream_gene_variant,,ENST00000563069,,,MODIFIER,,,,-1;MPI,downstream_gene_variant,,ENST00000568840,,,MODIFIER,,,,1;FAM219B,downstream_gene_variant,,ENST00000563671,,,MODIFIER,,,,-1;MPI,downstream_gene_variant,,ENST00000561470,,,MODIFIER,,,,1;FAM219B,downstream_gene_variant,,ENST00000563413,,,MODIFIER,,,,-1;FAM219B,downstream_gene_variant,,ENST00000566132,,,MODIFIER,,,,-1;MPI,downstream_gene_variant,,ENST00000567116,,,MODIFIER,,,,1\", \"T\", \"ENSG00000178802\", \"ENST00000352410\", \"Transcript\", \"intron_variant\", \"intron_variant\", \"-/5828\", \"-/1272\", \"-/423\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"MPI\", \"HGNC\", \"HGNC:7216\", \"protein_coding\", \"YES\", \"CCDS10272.1\", \"ENSP00000318318\", \"P34949\", \"None\", \"UPI000000DB74\", \"NM_002435.2\", \"None\", \"None\", \"None\", \"6/7\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AGGCCCAGAAC\", \"05752e6c-5f5a-4c1a-8804-026ccfc1908c|fb380be6-6cee-418b-b929-263f1529ec13|c831789f-cf35-4ab1-b852-e4cce8e96501\", \"aea0f854-dd32-42f7-b5f3-1407eaf6bfd9\", \"3dc04831-269b-43b2-add8-7f5b292928cf\", \"7cbabf1d-ec38-4048-ae1c-7d0f3001691b\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-19-2620\", \"TCGA-19-2620-01A\", \"TCGA-19-2620-10A\", \"TCGA-19-2620-01A-01D-1495-08\", \"TCGA-19-2620-10A-01D-1495-08\", \"TFPI\", 7035, \"BI\", \"GRCh38\", \"chr2\", 187478766, 187478766, \"+\", \"Intron\", \"SNP\", \"C\", \"C\", \"T\", \"rs149480203\", \"by1000G;byCluster\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"6de41ac1-229b-40b9-a494-5588c284351d\", \"ede6d42c-895a-46f7-a0e3-11b152970581\", \"c.628+5358G>A\", \"None\", \"None\", \"ENST00000233156\", \"None\", \"46|46|46|43\", \"30|30|30|27\", \"16\", \"109|109|109|96\", \"TFPI,synonymous_variant,p.A222A,ENST00000409676,,c.666G>A,LOW,,,,-1;TFPI,synonymous_variant,p.A222A,ENST00000339091,NM_001032281.2,c.666G>A,LOW,,,,-1;TFPI,intron_variant,,ENST00000233156,NM_006287.4,c.628+5358G>A,MODIFIER,YES,,,-1;TFPI,intron_variant,,ENST00000392365,,c.628+5358G>A,MODIFIER,,,,-1;TFPI,intron_variant,,ENST00000426055,,c.628+5358G>A,MODIFIER,,,,-1;TFPI,intron_variant,,ENST00000435414,,c.589+5358G>A,MODIFIER,,,,-1;AC007319.1,intron_variant,,ENST00000412276,,n.190-20740C>T,MODIFIER,YES,,,1;AC007319.1,intron_variant,,ENST00000453517,,n.244-20740C>T,MODIFIER,,,,1;TFPI,intron_variant,,ENST00000481132,,n.7469+5358G>A,MODIFIER,,,,-1\", \"T\", \"ENSG00000003436\", \"ENST00000233156\", \"Transcript\", \"intron_variant\", \"intron_variant\", \"-/3913\", \"-/915\", \"-/304\", \"None\", \"None\", \"rs149480203\", \"1\", \"None\", -1, \"TFPI\", \"HGNC\", \"HGNC:11760\", \"protein_coding\", \"YES\", \"CCDS2294.1\", \"ENSP00000233156\", \"P10646\", \"None\", \"UPI0000136C8F\", \"NM_006287.4\", \"None\", \"None\", \"None\", \"6/7\", \"None\", \"0.0002\", \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"0.001\", \"0\", \"0.0002\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"4.118e-05\", \"4.138e-05\", \"0\", \"0\", \"0\", \"0\", \"4.516e-05\", \"0.001111\", \"6.075e-05\", \"PASS\", \"TGAGCCGCATT\", \"a9be9544-3d1b-43a0-ae53-a3b0aae0b7fb|1a7f9e8c-e84a-4ea4-b7b9-b409ddfe19b4|1818b4f6-b47c-4d0a-9e59-6a3eff4e905e|5cd320c1-0706-4031-b870-4f3a8f82e0f3\", \"051d1d06-15f2-412f-a3e9-67c16a9eace5\", \"910bb4a7-08f5-4f78-b7b3-3c0dca9f2ff1\", \"352768f9-3ce1-419c-beef-6515c78f5d7a\", \"common_in_exac\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-27-1836\", \"TCGA-27-1836-01A\", \"TCGA-27-1836-10A\", \"TCGA-27-1836-01A-01D-1494-08\", \"TCGA-27-1836-10A-01D-1494-08\", \"SLC22A10\", 387775, \"BI\", \"GRCh38\", \"chr11\", 63304123, 63304123, \"+\", \"Missense_Mutation\", \"SNP\", \"G\", \"G\", \"A\", \"rs112720090\", \"by1000G;byCluster;byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"8c58f090-31a3-4b2f-93e7-1ae6f6d73350\", \"563efbbc-5c03-4e2c-b085-4cad0e1e43bf\", \"c.1301G>A\", \"p.Arg434His\", \"p.R434H\", \"ENST00000332793\", \"8/10\", \"413|321|413|361\", \"287|221|287|247\", \"125|100|125|114\", \"420|316|420|367\", \"SLC22A10,missense_variant,p.R434H,ENST00000332793,NM_001039752.3,c.1301G>A,MODERATE,YES,deleterious(0.04),benign(0.262),1;SLC22A10,intron_variant,,ENST00000526800,,c.590+4494G>A,MODIFIER,,,,1;SLC22A10,intron_variant,,ENST00000525620,,n.985+4494G>A,MODIFIER,,,,1;SLC22A10,missense_variant,p.V336M,ENST00000533483,,c.1006G>A,MODERATE,,tolerated_low_confidence(0.12),possibly_damaging(0.623),1;SLC22A10,missense_variant,p.V228M,ENST00000532724,,c.682G>A,MODERATE,,deleterious_low_confidence(0.02),benign(0.044),1\", \"A\", \"ENSG00000184999\", \"ENST00000332793\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"1303/2026\", \"1301/1626\", \"434/541\", \"R/H\", \"cGt/cAt\", \"rs112720090\", \"1\", \"None\", 1, \"SLC22A10\", \"HGNC\", \"HGNC:18057\", \"protein_coding\", \"YES\", \"CCDS41661.1\", \"ENSP00000327569\", \"Q63ZE4\", \"None\", \"UPI0000D62620\", \"NM_001039752.3\", \"deleterious(0.04)\", \"benign(0.262)\", \"8/10\", \"None\", \"Pfam_domain:PF00083;PROSITE_profiles:PS50850;Superfamily_domains:SSF103473\", \"0.0012\", \"0.0045\", \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"0.0057\", \"0.0002\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 2.0, NaN, \"None\", \"1\", \"6.520e-04\", \"0.0006551\", \"0.005\", \"0.0003475\", \"0\", \"0\", \"0.0003901\", \"0\", \"0\", \"PASS|panel_of_normals|PASS|PASS\", \"CCTGCGTGTGG\", \"58d8dcf2-269c-4ff7-8fe9-14141b915c1b|1a8f7e04-ac9b-433b-bd9b-0ffbb0744b10|cbb4d93a-fe04-4d3f-b520-d8ec599d338f|5d0f867b-10f1-41e1-b7fe-1be13b131d62\", \"c30fe362-da30-4b25-b5c6-940c8f2cda9a\", \"3296bed7-b0e2-489b-95b6-6435005d2672\", \"4d18f820-6396-46ae-b5d6-4ba446279be8\", \"common_in_exac;gdc_pon\", \"COSM3398007\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-28-1753\", \"TCGA-28-1753-01A\", \"TCGA-28-1753-10B\", \"TCGA-28-1753-01A-01D-1494-08\", \"TCGA-28-1753-10B-01D-1494-08\", \"RFX6\", 222546, \"BI\", \"GRCh38\", \"chr6\", 116910958, 116910958, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"c7143f1e-458c-4129-aa91-61b8e4b90e53\", \"d9fdefb1-7ff6-435d-8319-2c99e82383e6\", \"c.696G>A\", \"p.=\", \"p.S232S\", \"ENST00000332958\", \"7/19\", \"226|222|226|188\", \"151|147|151|124\", \"75|75|75|64\", \"241|236|241|200\", \"RFX6,synonymous_variant,p.S232S,ENST00000332958,NM_173560.3,c.696G>A,LOW,YES,,,1;RFX6,non_coding_transcript_exon_variant,,ENST00000471966,,n.387G>A,MODIFIER,,,,1;RFX6,non_coding_transcript_exon_variant,,ENST00000487683,,n.760G>A,MODIFIER,,,,1\", \"A\", \"ENSG00000185002\", \"ENST00000332958\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"712/3460\", \"696/2787\", \"232/928\", \"S\", \"tcG/tcA\", \"None\", \"1\", \"None\", 1, \"RFX6\", \"HGNC\", \"HGNC:21478\", \"protein_coding\", \"YES\", \"CCDS5113.1\", \"ENSP00000332208\", \"Q8HWS3\", \"None\", \"UPI00001609BE\", \"NM_173560.3\", \"None\", \"None\", \"7/19\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TATTCGCTTAG\", \"629a8cd2-e1d1-4de2-bcd9-533e4089888e|01286df5-a02d-44ba-8cec-38e13cf5d595|749d348e-8f33-47ec-bf45-fbb30019e455|cf4bcef9-1d6a-46ba-b327-7c58c8cbda48\", \"56be735f-4407-47ed-8c39-a244f97a4f04\", \"4739ec28-25f0-4606-92eb-dbef738cb8b6\", \"b98184b9-6190-4e95-a1cf-8cffb44b9963\", \"None\", \"COSM3410548\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-81-5911\", \"TCGA-81-5911-01A\", \"TCGA-81-5911-10A\", \"TCGA-81-5911-01A-12D-1845-08\", \"TCGA-81-5911-10A-01D-1845-08\", \"FADS2\", 9415, \"BI\", \"GRCh38\", \"chr11\", 61848227, 61848227, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"a501e01b-249c-43cb-aee2-f355c3c697dd\", \"c391bf4d-b3e8-4447-9654-50004779a2d6\", \"c.687G>A\", \"p.=\", \"p.K229K\", \"ENST00000278840\", \"5/12\", \"91|88|91|83\", \"59|56|59|54\", \"32|32|32|29\", \"139|131|139|123\", \"FADS2,synonymous_variant,p.K229K,ENST00000278840,NM_004265.3,c.687G>A,LOW,YES,,,1;FADS2,synonymous_variant,p.K207K,ENST00000257261,NM_001281501.1,c.621G>A,LOW,,,,1;FADS2,synonymous_variant,p.K229K,ENST00000521849,,c.687G>A,LOW,,,,1;FADS2,synonymous_variant,p.K198K,ENST00000522056,NM_001281502.1,c.594G>A,LOW,,,,1;FADS2,5_prime_UTR_variant,,ENST00000355484,,c.-16G>A,MODIFIER,,,,1;FADS2,5_prime_UTR_variant,,ENST00000521571,,c.-16G>A,MODIFIER,,,,1;FADS2,downstream_gene_variant,,ENST00000517312,,,MODIFIER,,,,1;FADS2,downstream_gene_variant,,ENST00000518606,,,MODIFIER,,,,1;FADS2,non_coding_transcript_exon_variant,,ENST00000543584,,n.64G>A,MODIFIER,,,,1;FADS2,downstream_gene_variant,,ENST00000520145,,,MODIFIER,,,,1\", \"A\", \"ENSG00000134824\", \"ENST00000278840\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"1317/3630\", \"687/1335\", \"229/444\", \"K\", \"aaG/aaA\", \"None\", \"1\", \"None\", 1, \"FADS2\", \"HGNC\", \"HGNC:3575\", \"protein_coding\", \"YES\", \"CCDS8012.1\", \"ENSP00000278840\", \"O95864\", \"None\", \"UPI000003405E\", \"NM_004265.3\", \"None\", \"None\", \"5/12\", \"None\", \"Pfam_domain:PF00487;PIRSF_domain:PIRSF015921\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CACAAGGATCC\", \"91178312-515e-48e9-a2fa-83410db9f4b4|97101923-d409-4881-a407-4a01c16c341c|f0970f08-08df-489f-a9da-7e11370fd93e|c2f8ea84-4b49-4b2b-8260-dad08953afd2\", \"b5b77872-7588-4e81-add0-91ddc8715288\", \"f0ecb3d8-eb75-4cf2-b9af-e4f73cd23c2d\", \"05944575-8473-4ed0-9de8-8091018001c2\", \"None\", \"COSM3397975;COSM3397976\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DH-A66B\", \"TCGA-DH-A66B-01A\", \"TCGA-DH-A66B-10A\", \"TCGA-DH-A66B-01A-11D-A29Q-08\", \"TCGA-DH-A66B-10A-01D-A29Q-08\", \"USP9Y\", 8287, \"BI\", \"GRCh38\", \"chrY\", 12843126, 12843126, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000;Illumina MiSeq\", \"d02d1ca6-f972-4084-be98-3b722f923bc3\", \"622c34d2-eb7d-4cf0-b262-4ce463976d18\", \"c.6501G>A\", \"p.=\", \"p.R2167R\", \"ENST00000338981\", \"39/46\", \"15\", \"12\", \"3\", \"14\", \"USP9Y,synonymous_variant,p.R2167R,ENST00000338981,NM_004654.3,c.6501G>A,LOW,YES,,,1;USP9Y,upstream_gene_variant,,ENST00000453031,,,MODIFIER,,,,1;USP9Y,non_coding_transcript_exon_variant,,ENST00000426564,,n.6528G>A,MODIFIER,,,,1\", \"A\", \"ENSG00000114374\", \"ENST00000338981\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"7446/10036\", \"6501/7668\", \"2167/2555\", \"R\", \"agG/agA\", \"None\", \"1\", \"None\", 1, \"USP9Y\", \"HGNC\", \"HGNC:12633\", \"protein_coding\", \"YES\", \"CCDS14781.1\", \"ENSP00000342812\", \"O00507\", \"None\", \"UPI00001AE67D\", \"NM_004654.3\", \"None\", \"None\", \"39/46\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AGAAGGGAAGT\", \"c9117bc1-a18f-471b-9b92-9120fda6cf67\", \"eba54db3-98cd-4505-be2a-08c24749ff25\", \"9e455877-2432-4750-a2bc-80608df7b922\", \"cb1e9916-c03f-405a-a797-15823df09c8e\", \"None\", \"None\", \"False\", \"Unknown\", \"muse\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-7292\", \"TCGA-DU-7292-01A\", \"TCGA-DU-7292-10A\", \"TCGA-DU-7292-01A-11D-2024-08\", \"TCGA-DU-7292-10A-01D-2024-08\", \"SOX7\", 83595, \"BI\", \"GRCh38\", \"chr8\", 10730362, 10730362, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"8a5ba698-330f-45de-9f1f-aee1235775b7\", \"4debfd4f-275c-41f6-a4f7-ed2917dc1a3f\", \"c.72G>A\", \"p.=\", \"p.S24S\", \"ENST00000304501\", \"1/2\", \"16\", \"12\", \"4\", \"29\", \"SOX7,synonymous_variant,p.S24S,ENST00000304501,NM_031439.3,c.72G>A,LOW,YES,,,-1;CTD-2135J3.4,intron_variant,,ENST00000554914,,c.395-3696G>A,MODIFIER,YES,,,-1;CTD-2135J3.3,intron_variant,,ENST00000506149,,n.317+732C>T,MODIFIER,YES,,,1;CTD-2135J3.3,intron_variant,,ENST00000519568,,n.53+732C>T,MODIFIER,,,,1\", \"T\", \"ENSG00000171056\", \"ENST00000304501\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"151/3216\", \"72/1167\", \"24/388\", \"S\", \"tcG/tcA\", \"None\", \"1\", \"None\", -1, \"SOX7\", \"HGNC\", \"HGNC:18196\", \"protein_coding\", \"YES\", \"CCDS5977.1\", \"ENSP00000301921\", \"Q9BT81\", \"None\", \"UPI0000135D0A\", \"NM_031439.3\", \"None\", \"None\", \"1/2\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CCATCCGACAG\", \"40c2dc94-5300-4826-9e83-070f1d9faf70\", \"5a76229b-d66d-4db7-b420-b520d19eb882\", \"bd130a49-0fad-4a84-9221-8b888365e259\", \"145f87a3-5e86-4a87-8e49-b166a2271d02\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-FG-6688\", \"TCGA-FG-6688-01A\", \"TCGA-FG-6688-10A\", \"TCGA-FG-6688-01A-11D-1893-08\", \"TCGA-FG-6688-10A-01D-1893-08\", \"PRLR\", 5618, \"BI\", \"GRCh38\", \"chr5\", 35065488, 35065488, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"2f93c396-7e42-4ae7-b954-028d5214671d\", \"3a55f162-2e11-46f9-8c0a-4a1f473997ff\", \"c.1470G>A\", \"p.=\", \"p.T490T\", \"ENST00000618457\", \"10/10\", \"173|168|144\", \"144|140|118\", \"28|28|25\", \"157|153|144\", \"PRLR,synonymous_variant,p.T490T,ENST00000618457,NM_000949.5,c.1470G>A,LOW,YES,,,-1;PRLR,synonymous_variant,p.T389T,ENST00000620785,NM_001204314.1,c.1167G>A,LOW,,,,-1;PRLR,synonymous_variant,p.T389T,ENST00000511486,,c.1167G>A,LOW,,,,-1;PRLR,intron_variant,,ENST00000542609,NM_001204316.1,c.1009+461G>A,MODIFIER,,,,-1;PRLR,intron_variant,,ENST00000231423,,c.1009+461G>A,MODIFIER,,,,-1;PRLR,intron_variant,,ENST00000509140,NM_001204317.1,c.855+2728G>A,MODIFIER,,,,-1;PRLR,intron_variant,,ENST00000513753,,c.855+2728G>A,MODIFIER,,,,-1;PRLR,intron_variant,,ENST00000514088,NM_001204318.1,c.685+4636G>A,MODIFIER,,,,-1;PRLR,intron_variant,,ENST00000619676,NM_001204315.1,c.1010-112G>A,MODIFIER,,,,-1;PRLR,intron_variant,,ENST00000348262,,c.685+4636G>A,MODIFIER,,,,-1;PRLR,intron_variant,,ENST00000310101,,c.1010-112G>A,MODIFIER,,,,-1;PRLR,downstream_gene_variant,,ENST00000509934,,,MODIFIER,,,,-1;PRLR,3_prime_UTR_variant,,ENST00000508107,,c.*895G>A,MODIFIER,,,,-1;PRLR,intron_variant,,ENST00000618625,,c.*617+2728G>A,MODIFIER,,,,-1;PRLR,intron_variant,,ENST00000397391,,c.*447+4636G>A,MODIFIER,,,,-1\", \"T\", \"ENSG00000113494\", \"ENST00000618457\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"1897/11688\", \"1470/1869\", \"490/622\", \"T\", \"acG/acA\", \"None\", \"1\", \"None\", -1, \"PRLR\", \"HGNC\", \"HGNC:9446\", \"protein_coding\", \"YES\", \"CCDS3909.1\", \"ENSP00000482954\", \"P16471\", \"None\", \"UPI0000132234\", \"NM_000949.5\", \"None\", \"None\", \"10/10\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CAGGGCGTATC\", \"8df5870a-9438-4808-9145-6d8ab5669f9b|7c8f7f44-d4dc-4f01-aa61-4be8194cadf7|6a34786c-9ef9-4430-a693-7d4857c29934\", \"874ce37f-533a-4601-b2ba-93ac5fd0245b\", \"02a2aa70-7bfe-41a9-b528-1f78b033e470\", \"dadd7428-9e4d-4652-9469-ab521b88d529\", \"None\", \"COSM3975506\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-TQ-A7RG\", \"TCGA-TQ-A7RG-01A\", \"TCGA-TQ-A7RG-10A\", \"TCGA-TQ-A7RG-01A-11D-A33T-08\", \"TCGA-TQ-A7RG-10A-01D-A33W-08\", \"NXPH3\", 11248, \"BI\", \"GRCh38\", \"chr17\", 49579363, 49579363, \"+\", \"3'UTR\", \"SNP\", \"C\", \"C\", \"G\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"e7ef8640-7181-4ac4-baa3-549e613bda9c\", \"0403a5cd-541a-466c-a7f4-ee68bfd60a19\", \"c.*63C>G\", \"None\", \"None\", \"ENST00000328741\", \"2/2\", \"42|40|42\", \"25\", \"17|15|17\", \"31\", \"NXPH3,3_prime_UTR_variant,,ENST00000328741,NM_007225.2,c.*63C>G,MODIFIER,YES,,,1;NXPH3,intron_variant,,ENST00000513748,,c.705+117C>G,MODIFIER,,,,1;RP5-1029K10.4,upstream_gene_variant,,ENST00000503624,,,MODIFIER,YES,,,-1;NXPH3,non_coding_transcript_exon_variant,,ENST00000570453,,n.730C>G,MODIFIER,,,,1\", \"G\", \"ENSG00000182575\", \"ENST00000328741\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"1184/2179\", \"-/759\", \"-/252\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"NXPH3\", \"HGNC\", \"HGNC:8077\", \"protein_coding\", \"YES\", \"CCDS11550.1\", \"ENSP00000329295\", \"O95157\", \"None\", \"UPI00000389F1\", \"NM_007225.2\", \"None\", \"None\", \"2/2\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GAGACCATCTG\", \"e3ee55c0-6d32-4d59-9e93-721342d7af2d|1ce4522f-5604-49b9-bcf1-98c755a265db|d0c1d27b-944d-41ff-a31e-d784f4b10040\", \"5de82077-8540-474f-a569-c4b3b951f81c\", \"c34bdfdf-96f9-4d97-b827-dc8f83ca9d67\", \"619e18c1-09b9-468c-816d-6789c0bef0a8\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-VM-A8CD\", \"TCGA-VM-A8CD-01A\", \"TCGA-VM-A8CD-10A\", \"TCGA-VM-A8CD-01A-11D-A36O-08\", \"TCGA-VM-A8CD-10A-01D-A367-08\", \"NCR3\", 259197, \"BI\", \"GRCh38\", \"chr6\", 31589142, 31589142, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"rs775013182\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"7928b2cc-7548-4b85-9107-a5462d1858db\", \"18237653-5da7-42cf-8d0d-a2ba91a7e5ec\", \"c.531G>A\", \"p.=\", \"p.P177P\", \"ENST00000340027\", \"4/4\", \"12\", \"8\", \"4\", \"36|36|30\", \"NCR3,synonymous_variant,p.P177P,ENST00000340027,NM_147130.2,c.531G>A,LOW,YES,,,-1;NCR3,3_prime_UTR_variant,,ENST00000376073,NM_001145466.1,c.*52G>A,MODIFIER,,,,-1;NCR3,downstream_gene_variant,,ENST00000376072,NM_001145467.1,,MODIFIER,,,,-1;LST1,downstream_gene_variant,,ENST00000438075,NM_205839.2,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000418507,NM_205838.2,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000376090,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000376089,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000376093,NM_007161.3,,MODIFIER,YES,,,1;LST1,downstream_gene_variant,,ENST00000339530,NM_205837.2,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000376099,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000303757,NM_205840.2,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000376096,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000376086,NM_001166538.1,,MODIFIER,,,,1;NCR3,downstream_gene_variant,,ENST00000376071,,,MODIFIER,,,,-1;LST1,downstream_gene_variant,,ENST00000211921,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000396101,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000376110,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000396112,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000376092,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000464044,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000490742,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000433492,,,MODIFIER,,,,1;NCR3,non_coding_transcript_exon_variant,,ENST00000491161,,n.646G>A,MODIFIER,,,,-1;NCR3,non_coding_transcript_exon_variant,,ENST00000495600,,n.338G>A,MODIFIER,,,,-1;LST1,downstream_gene_variant,,ENST00000419073,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000464526,,,MODIFIER,,,,1;LST1,downstream_gene_variant,,ENST00000460834,,,MODIFIER,,,,1\", \"T\", \"ENSG00000204475\", \"ENST00000340027\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"795/1042\", \"531/606\", \"177/201\", \"P\", \"ccG/ccA\", \"rs775013182\", \"1\", \"None\", -1, \"NCR3\", \"HGNC\", \"HGNC:19077\", \"protein_coding\", \"YES\", \"CCDS34397.1\", \"ENSP00000342156\", \"O14931\", \"None\", \"UPI0000073DEE\", \"NM_147130.2\", \"None\", \"None\", \"4/4\", \"None\", \"Low_complexity_(Seg):Seg\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"8.236e-06\", \"8.584e-06\", \"0\", \"8.967e-05\", \"0\", \"0\", \"0\", \"0\", \"0\", \"PASS\", \"ACAGCCGGCAG\", \"0c8087ba-5ead-40a1-93e3-99b39cd44533|593f9fb8-a0a2-4051-ac28-ef8de1f84306|b821b074-3621-4c86-aa11-e3dc10be28b3\", \"e96356ce-1e6c-494c-8fd0-a9610d2ca4cf\", \"6266c37d-9153-4898-b017-33fe7991eee1\", \"b3f0dece-94e8-4eaf-91bc-4b3f4dae12d2\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect|somaticsniper|varscan\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-12-5295\", \"TCGA-12-5295-01A\", \"TCGA-12-5295-10A\", \"TCGA-12-5295-01A-01D-1486-08\", \"TCGA-12-5295-10A-01D-1486-08\", \"CYP2A13\", 1553, \"BI\", \"GRCh38\", \"chr19\", 41094992, 41094992, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"796f5741-3b2d-46e5-b74f-e5a76604a401\", \"acb44b8b-11f0-4e02-bc40-f96205ac66f9\", \"c.1195C>T\", \"p.=\", \"p.L399L\", \"ENST00000330436\", \"8/9\", \"249|243|249|211\", \"149|146|149|130\", \"100|97|100|81\", \"368|357|368|321\", \"CYP2A13,synonymous_variant,p.L399L,ENST00000330436,NM_000766.4,c.1195C>T,LOW,YES,,,1\", \"T\", \"ENSG00000197838\", \"ENST00000330436\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"1195/1739\", \"1195/1485\", \"399/494\", \"L\", \"Ctg/Ttg\", \"None\", \"1\", \"None\", 1, \"CYP2A13\", \"HGNC\", \"HGNC:2608\", \"protein_coding\", \"YES\", \"CCDS12571.1\", \"ENSP00000332679\", \"Q16696\", \"None\", \"UPI000013E07A\", \"NM_000766.4\", \"None\", \"None\", \"8/9\", \"None\", \"Pfam_domain:PF00067;Prints_domain:PR00463;Prints_domain:PR01684;Prints_domain:PR00465;Superfamily_domains:SSF48264\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CCGTGCTGAGA\", \"f0bf176f-af02-4101-9ebb-9c5835353eb2|009ea3f3-222e-489e-b3c6-086bdfeb1ef7|e99e0a52-8b55-4a57-8d5f-98a4af360341|f32de72c-14db-4510-9706-7f8d04ecc1f8\", \"3b46e22c-d400-4a07-85f2-62f037045b9f\", \"233739d8-053c-40fb-9bce-4ae9f5ae7286\", \"c970240f-03e2-4395-85be-5eb81a69b710\", \"None\", \"COSM3404260\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-14-3477\", \"TCGA-14-3477-01A\", \"TCGA-14-3477-10A\", \"TCGA-14-3477-01A-01W-0922-08\", \"TCGA-14-3477-10A-01W-0922-08\", \"MED14\", 9282, \"BI\", \"GRCh38\", \"chrX\", 40675299, 40675299, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"0ba286ae-86e5-432b-aabf-9890def55e19\", \"ec646f48-cb89-4ed4-96f7-c098433ea79b\", \"c.2943C>T\", \"p.=\", \"p.D981D\", \"ENST00000324817\", \"22/31\", \"118|113|118|95\", \"91|87|91|75\", \"27|26|27|20\", \"168|165|168|146\", \"MED14,synonymous_variant,p.D981D,ENST00000324817,NM_004229.3,c.2943C>T,LOW,YES,,,-1;MED14,non_coding_transcript_exon_variant,,ENST00000496531,,n.537C>T,MODIFIER,,,,-1\", \"A\", \"ENSG00000180182\", \"ENST00000324817\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"3062/7984\", \"2943/4365\", \"981/1454\", \"D\", \"gaC/gaT\", \"None\", \"1\", \"None\", -1, \"MED14\", \"HGNC\", \"HGNC:2370\", \"protein_coding\", \"YES\", \"CCDS14254.1\", \"ENSP00000323720\", \"O60244\", \"None\", \"UPI00001414B1\", \"NM_004229.3\", \"None\", \"None\", \"22/31\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TTATCGTCCTC\", \"35f0fac5-16c3-48aa-b4a1-af647fdf479d|e7204740-02c3-4b96-ae71-04f3d07283e9|acd1379c-770b-4ec9-a454-c8daeb598c59|7e47cd9a-7ecc-4452-874a-b6b9f4b3f120\", \"87254824-eaf6-40cc-b7d2-26a84fbb2237\", \"588424a5-333c-4df4-beec-dee5ee4975cb\", \"60e47b7d-c664-46c0-ac13-db688d4b8a58\", \"wga_pair\", \"COSM2155650\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-19-1789\", \"TCGA-19-1789-01A\", \"TCGA-19-1789-10A\", \"TCGA-19-1789-01A-01W-0643-08\", \"TCGA-19-1789-10A-01W-0643-08\", \"PLEKHA1\", 59338, \"BI\", \"GRCh38\", \"chr10\", 122393232, 122393232, \"+\", \"Missense_Mutation\", \"SNP\", \"G\", \"A\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina Genome Analyzer II\", \"5575da73-abd8-49f6-97b2-1a577890017f\", \"cd56adbc-3572-41f3-acd4-12911e191ae7\", \"c.32G>A\", \"p.Cys11Tyr\", \"p.C11Y\", \"ENST00000368990\", \"2/12\", \"50\", \"10\", \"40\", \"125\", \"PLEKHA1,missense_variant,p.C11Y,ENST00000368990,,c.32G>A,MODERATE,YES,deleterious(0),probably_damaging(0.999),1;PLEKHA1,missense_variant,p.C11Y,ENST00000368988,NM_001195608.1,c.32G>A,MODERATE,,deleterious(0),probably_damaging(0.985),1;PLEKHA1,missense_variant,p.C11Y,ENST00000368989,,c.32G>A,MODERATE,,deleterious(0),probably_damaging(0.996),1;PLEKHA1,missense_variant,p.C11Y,ENST00000433307,NM_021622.4&NM_001001974.2,c.32G>A,MODERATE,,deleterious(0),probably_damaging(0.999),1;PLEKHA1,missense_variant,p.C11Y,ENST00000392799,,c.32G>A,MODERATE,,deleterious(0),probably_damaging(0.999),1;PLEKHA1,missense_variant,p.C11Y,ENST00000463663,,c.32G>A,MODERATE,,deleterious(0),probably_damaging(0.999),1;PLEKHA1,non_coding_transcript_exon_variant,,ENST00000494222,,n.163G>A,MODIFIER,,,,1\", \"A\", \"ENSG00000107679\", \"ENST00000368990\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"163/14010\", \"32/1215\", \"11/404\", \"C/Y\", \"tGt/tAt\", \"None\", \"1\", \"None\", 1, \"PLEKHA1\", \"HGNC\", \"HGNC:14335\", \"protein_coding\", \"YES\", \"CCDS7629.1\", \"ENSP00000357986\", \"Q9HB21\", \"None\", \"UPI000000D9DC\", \"None\", \"deleterious(0)\", \"probably_damaging(0.999)\", \"2/12\", \"None\", \"Pfam_domain:PF00169;PROSITE_profiles:PS50003;SMART_domains:SM00233;Superfamily_domains:SSF50729\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CATTTGTGGTT\", \"b686f9d8-86a6-4228-9eb2-901f53f38a14\", \"20783843-6f4d-4588-bb77-8dccd04a11b6\", \"dd2505a5-9e47-42e3-a547-f3e0ff5fea7c\", \"3a56ef5c-9259-4cdc-905e-5fcf21dac09b\", \"wga_pair\", \"COSM2155913\", \"True\", \"Unknown\", \"varscan\", \"8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-41-6646\", \"TCGA-41-6646-01A\", \"TCGA-41-6646-10A\", \"TCGA-41-6646-01A-11D-1845-08\", \"TCGA-41-6646-10A-01D-1845-08\", \"TVP23B\", 51030, \"BI\", \"GRCh38\", \"chr17\", 18805579, 18805579, \"+\", \"3'UTR\", \"SNP\", \"T\", \"T\", \"G\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"6272bb0c-c47b-4cd2-9f59-398f1a75f020\", \"2f6c3ea0-2797-4863-9a77-a6b67964b3a4\", \"c.*12T>G\", \"None\", \"None\", \"ENST00000307767\", \"7/7\", \"88|69|80|67\", \"56|43|50|41\", \"31|26|30|26\", \"122|110|108|81\", \"TVP23B,3_prime_UTR_variant,,ENST00000476139,,c.*12T>G,MODIFIER,,,,1;TVP23B,3_prime_UTR_variant,,ENST00000307767,NM_016078.4,c.*12T>G,MODIFIER,YES,,,1;TVP23B,3_prime_UTR_variant,,ENST00000581733,,c.*12T>G,MODIFIER,,,,1;TVP23B,downstream_gene_variant,,ENST00000574226,,,MODIFIER,,,,1;TVP23B,downstream_gene_variant,,ENST00000575261,,,MODIFIER,,,,1;CTD-2145A24.5,upstream_gene_variant,,ENST00000584957,,,MODIFIER,YES,,,1;TVP23B,3_prime_UTR_variant,,ENST00000574294,,c.*388T>G,MODIFIER,,,,1;TVP23B,3_prime_UTR_variant,,ENST00000571018,,c.*371T>G,MODIFIER,,,,1;TVP23B,non_coding_transcript_exon_variant,,ENST00000482741,,n.2163T>G,MODIFIER,,,,1\", \"G\", \"ENSG00000171928\", \"ENST00000307767\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"929/2064\", \"-/618\", \"-/205\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"TVP23B\", \"HGNC\", \"HGNC:20399\", \"protein_coding\", \"YES\", \"CCDS42274.1\", \"ENSP00000305654\", \"Q9NYZ1\", \"None\", \"UPI00000713C4\", \"NM_016078.4\", \"None\", \"None\", \"7/7\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AAAGCTTATGT\", \"0b905f33-5c4f-42fb-80b2-58772e83cc76|3152399c-d34a-41e5-9dd1-6f92bbd49016|5f821b6c-7db0-49c5-937b-fbb175d0b8e7|3659670f-7508-4843-8705-bd4fd092d252\", \"e69d5f2b-092b-4b2f-83b6-eea406bddefd\", \"14028ea6-e6c5-4ce1-b724-ccd8b05c7bfd\", \"a8d708ab-6388-4d42-bc6e-05a8a718ecff\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-CS-5394\", \"TCGA-CS-5394-01A\", \"TCGA-CS-5394-10A\", \"TCGA-CS-5394-01A-01D-1468-08\", \"TCGA-CS-5394-10A-01D-1468-08\", \"TAF1B\", 9014, \"BI\", \"GRCh38\", \"chr2\", 9875936, 9875936, \"+\", \"Missense_Mutation\", \"SNP\", \"A\", \"A\", \"G\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"2e67f766-3799-4ce1-8c9c-d966d96302bf\", \"ed3dfb55-5905-4bb2-a497-276c2d8b43d2\", \"c.625A>G\", \"p.Met209Val\", \"p.M209V\", \"ENST00000263663\", \"7/15\", \"129|126|129|119\", \"71|70|71|67\", \"57|56|57|52\", \"309|304|309|259\", \"TAF1B,missense_variant,p.M209V,ENST00000263663,NM_005680.2,c.625A>G,MODERATE,YES,deleterious(0),benign(0.138),1;TAF1B,upstream_gene_variant,,ENST00000492648,,,MODIFIER,,,,1;TAF1B,intron_variant,,ENST00000434858,,c.554-6770A>G,MODIFIER,,,,1\", \"G\", \"ENSG00000115750\", \"ENST00000263663\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"813/2387\", \"625/1767\", \"209/588\", \"M/V\", \"Atg/Gtg\", \"None\", \"1\", \"None\", 1, \"TAF1B\", \"HGNC\", \"HGNC:11533\", \"protein_coding\", \"YES\", \"CCDS33143.1\", \"ENSP00000263663\", \"Q53T94\", \"None\", \"UPI0000208E44\", \"NM_005680.2\", \"deleterious(0)\", \"benign(0.138)\", \"7/15\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TGAAGATGACC\", \"56f580bc-6d19-4be4-b5f0-8497c3d5a359|7deac6a9-f10a-44cc-83eb-1ddcacd8c399|8fe74f23-1570-4e0b-8ede-3320ff09d9cb|29b33d0c-9dcd-4066-a9f4-d945b84a6946\", \"c5fb82ba-4d05-48ae-80fa-aeb70e5084ea\", \"85a51345-e45c-463a-8f1c-31790b854daf\", \"97bf8065-3e7d-4702-a426-24908f4d66a4\", \"None\", \"COSM3971453\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-CS-6669\", \"TCGA-CS-6669-01A\", \"TCGA-CS-6669-10A\", \"TCGA-CS-6669-01A-11D-1893-08\", \"TCGA-CS-6669-10A-01D-1893-08\", \"ZSCAN30\", 100101467, \"BI\", \"GRCh38\", \"chr18\", 35258031, 35258031, \"+\", \"Intron\", \"SNP\", \"A\", \"A\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"218a9531-9264-43bc-8535-858d4cb0919e\", \"4bc99b08-8b67-443e-88a4-03edef39d433\", \"c.554-3650T>A\", \"None\", \"None\", \"ENST00000420878\", \"None\", \"34\", \"31\", \"3\", \"55\", \"ZNF397,3_prime_UTR_variant,,ENST00000355632,,c.*93A>T,MODIFIER,,,,1;ZNF397,3_prime_UTR_variant,,ENST00000261333,NM_032347.2,c.*93A>T,MODIFIER,,,,1;ZNF397,3_prime_UTR_variant,,ENST00000592264,,c.*93A>T,MODIFIER,,,,1;ZSCAN30,intron_variant,,ENST00000420878,NM_001166012.2,c.554-3650T>A,MODIFIER,YES,,,-1;ZSCAN30,intron_variant,,ENST00000333206,NM_001112734.3,c.554-3650T>A,MODIFIER,,,,-1;ZSCAN30,intron_variant,,ENST00000610712,NM_001288711.1,c.-8-3650T>A,MODIFIER,,,,-1;ZSCAN30,downstream_gene_variant,,ENST00000589178,,,MODIFIER,,,,-1;ZNF397,non_coding_transcript_exon_variant,,ENST00000589420,,n.566A>T,MODIFIER,,,,1;RP11-158H5.2,downstream_gene_variant,,ENST00000624194,,,MODIFIER,YES,,,1;ZNF397,non_coding_transcript_exon_variant,,ENST00000591505,,n.310A>T,MODIFIER,,,,1;ZSCAN30,upstream_gene_variant,,ENST00000590777,,,MODIFIER,,,,-1\", \"T\", \"ENSG00000186814\", \"ENST00000420878\", \"Transcript\", \"intron_variant\", \"intron_variant\", \"-/4323\", \"-/1485\", \"-/494\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"ZSCAN30\", \"HGNC\", \"HGNC:33517\", \"protein_coding\", \"YES\", \"CCDS42427.1\", \"ENSP00000392371\", \"Q86W11\", \"None\", \"UPI00001867D6\", \"NM_001166012.2\", \"None\", \"None\", \"None\", \"4/4\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 2.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CCTACAAGAAA\", \"929a45ac-70f3-453e-b979-7fb252846b64\", \"9f8a7899-c454-4d5b-b8a6-dfc7778591b7\", \"34ffd535-ec19-459f-876b-31f0b03bde1f\", \"dc5bdd21-b23f-400e-bbe2-4c98a517fc9e\", \"None\", \"None\", \"False\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-6396\", \"TCGA-DU-6396-01A\", \"TCGA-DU-6396-10A\", \"TCGA-DU-6396-01A-11D-1705-08\", \"TCGA-DU-6396-10A-01D-1705-08\", \"LRFN1\", 57622, \"BI\", \"GRCh38\", \"chr19\", 39308275, 39308275, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"C\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"cb4a697c-3444-49ed-9085-cec75607f61d\", \"2c1dd78a-2e86-4815-b003-63d5cfc62e38\", \"c.1674C>G\", \"p.=\", \"p.R558R\", \"ENST00000248668\", \"2/2\", \"28|27|28|23\", \"20|19|20|18\", \"8|8|8|5\", \"36|35|36|32\", \"LRFN1,synonymous_variant,p.R558R,ENST00000248668,NM_020862.1,c.1674C>G,LOW,YES,,,-1\", \"C\", \"ENSG00000128011\", \"ENST00000248668\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"1674/3381\", \"1674/2316\", \"558/771\", \"R\", \"cgC/cgG\", \"None\", \"1\", \"None\", -1, \"LRFN1\", \"HGNC\", \"HGNC:29290\", \"protein_coding\", \"YES\", \"CCDS46071.1\", \"ENSP00000248668\", \"Q9P244\", \"None\", \"UPI00001A5C55\", \"NM_020862.1\", \"None\", \"None\", \"2/2\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TTATAGCGGAT\", \"94d5cbeb-cadc-4c49-802b-7e97d96aa1ea|30ddaa86-839b-4890-8623-3b410cafb832|89ed3f52-e76f-4e49-8026-2379b5f1ba5f|ac0a4962-94e0-405d-87a4-9325f2109781\", \"55b2b307-91c1-4d63-9474-ec7022514784\", \"c70d138a-aab1-49f9-a5d6-60460a80fb1d\", \"152eaa99-05f5-4d30-bfb1-494a9a900e49\", \"None\", \"COSM3970979;COSM3970980\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HW-7487\", \"TCGA-HW-7487-01A\", \"TCGA-HW-7487-10A\", \"TCGA-HW-7487-01A-11D-2024-08\", \"TCGA-HW-7487-10A-01D-2024-08\", \"ZNF845\", 91664, \"BI\", \"GRCh38\", \"chr19\", 53353772, 53353772, \"+\", \"3'UTR\", \"SNP\", \"G\", \"G\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"c1abb741-4fcd-4161-b057-c7efd619cc99\", \"eadcce99-923f-4b79-8c99-3656d412ea5a\", \"c.*184G>A\", \"None\", \"None\", \"ENST00000458035\", \"4/4\", \"42\", \"39\", \"3\", \"48\", \"ZNF845,3_prime_UTR_variant,,ENST00000458035,NM_138374.1,c.*184G>A,MODIFIER,YES,,,1;ZNF845,3_prime_UTR_variant,,ENST00000595091,,c.*184G>A,MODIFIER,,,,1;ZNF525,intron_variant,,ENST00000624073,,c.12+23086G>A,MODIFIER,,,,1;ZNF845,downstream_gene_variant,,ENST00000601857,,,MODIFIER,,,,1\", \"A\", \"ENSG00000213799\", \"ENST00000458035\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"3214/4311\", \"-/2913\", \"-/970\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"ZNF845\", \"HGNC\", \"HGNC:25112\", \"protein_coding\", \"YES\", \"CCDS46170.1\", \"ENSP00000388311\", \"Q96IR2\", \"None\", \"UPI0001662BAC\", \"NM_138374.1\", \"None\", \"None\", \"4/4\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 4.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GTGTGGCAAAG\", \"8860d60f-844f-4b8e-8750-463a8f23a8c2\", \"5f3fc034-ee4d-42aa-a893-bf4915fd4513\", \"a91531b3-a07a-4dd0-82d6-fba662a9f0e6\", \"42251e02-b687-4bf1-a1b6-e3dd978542e4\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-06-0165\", \"TCGA-06-0165-01A\", \"TCGA-06-0165-10A\", \"TCGA-06-0165-01A-01D-1491-08\", \"TCGA-06-0165-10A-01D-1491-08\", \"FFAR4\", 338557, \"BI\", \"GRCh38\", \"chr10\", 93566681, 93566681, \"+\", \"5'UTR\", \"SNP\", \"A\", \"A\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"1728988e-0877-4194-92c5-92c1ee6c5f5b\", \"e27b2def-4e82-4c29-bbf1-51d4fffda600\", \"c.-40A>T\", \"None\", \"None\", \"ENST00000371483\", \"1/4\", \"10\", \"8\", \"2\", \"9\", \"FFAR4,5_prime_UTR_variant,,ENST00000371483,NM_181745.3,c.-40A>T,MODIFIER,YES,,,1;FFAR4,5_prime_UTR_variant,,ENST00000371481,NM_001195755.1,c.-40A>T,MODIFIER,,,,1;FFAR4,upstream_gene_variant,,ENST00000604414,,,MODIFIER,,,,1\", \"T\", \"ENSG00000186188\", \"ENST00000371483\", \"Transcript\", \"5_prime_UTR_variant\", \"5_prime_UTR_variant\", \"17/3653\", \"-/1134\", \"-/377\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"FFAR4\", \"HGNC\", \"HGNC:19061\", \"protein_coding\", \"YES\", \"CCDS31248.1\", \"ENSP00000360538\", \"Q5NUL3\", \"None\", \"UPI00001C1EE5\", \"NM_181745.3\", \"None\", \"None\", \"1/4\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AGATGAGCACT\", \"644c55be-81eb-4cd6-a488-98c11f4c36ec\", \"4121caed-1fa6-412c-bc1f-903460b6fc7d\", \"a9083610-ed83-438b-ad6d-766a1d7a235d\", \"88fcfd59-294a-4166-b703-e698a72b1a53\", \"None\", \"None\", \"False\", \"Unknown\", \"mutect\", \"da904cd3-79d7-4ae3-b6c0-e7127998b3e6\", \"TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-06-0171\", \"TCGA-06-0171-01A\", \"TCGA-06-0171-10A\", \"TCGA-06-0171-01A-02D-1491-08\", \"TCGA-06-0171-10A-01D-1491-08\", \"TMEM184A\", 202915, \"BI\", \"GRCh38\", \"chr7\", 1548625, 1548625, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"rs532306357\", \"by1000G\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"a1fcbf3f-00e9-41d2-8f75-82452564c3db\", \"9ef6f1c1-8137-4539-ac6a-9d76608dfc57\", \"c.708C>T\", \"p.=\", \"p.Y236Y\", \"ENST00000297477\", \"7/9\", \"217|199|193\", \"164|148|144\", \"53|51|49\", \"162|148|141\", \"TMEM184A,synonymous_variant,p.Y236Y,ENST00000297477,NM_001097620.1,c.708C>T,LOW,YES,,,-1;TMEM184A,downstream_gene_variant,,ENST00000319010,,,MODIFIER,,,,-1;TMEM184A,downstream_gene_variant,,ENST00000441933,,,MODIFIER,,,,-1;TMEM184A,downstream_gene_variant,,ENST00000431208,,,MODIFIER,,,,-1;TMEM184A,downstream_gene_variant,,ENST00000414730,,,MODIFIER,,,,-1;TMEM184A,upstream_gene_variant,,ENST00000449955,,,MODIFIER,,,,-1;TMEM184A,upstream_gene_variant,,ENST00000421996,,,MODIFIER,,,,-1;TMEM184A,3_prime_UTR_variant,,ENST00000319018,,c.*131C>T,MODIFIER,,,,-1;TMEM184A,non_coding_transcript_exon_variant,,ENST00000468535,,n.1586C>T,MODIFIER,,,,-1;TMEM184A,downstream_gene_variant,,ENST00000474813,,,MODIFIER,,,,-1;TMEM184A,downstream_gene_variant,,ENST00000421923,,,MODIFIER,,,,-1\", \"A\", \"ENSG00000164855\", \"ENST00000297477\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"1025/6276\", \"708/1242\", \"236/413\", \"Y\", \"taC/taT\", \"rs532306357\", \"1\", \"None\", -1, \"TMEM184A\", \"HGNC\", \"HGNC:28797\", \"protein_coding\", \"YES\", \"CCDS43537.1\", \"ENSP00000297477\", \"Q6ZMB5\", \"None\", \"UPI000013E413\", \"NM_001097620.1\", \"None\", \"None\", \"7/9\", \"None\", \"Low_complexity_(Seg):Seg;Transmembrane_helices:Tmhmm;Pfam_domain:PF03619\", \"0.0002\", \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"0.001\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"4.450e-04\", \"0.0004482\", \"0\", \"0.0001731\", \"0\", \"0\", \"0.0001361\", \"0.002227\", \"0.002484\", \"PASS\", \"AGGGCGTAGAG\", \"5d891a7c-3d50-47b3-8920-3faab1a680ff|bf021e94-fbfc-4cc7-b6d7-22b8b6d9f029|dd00bad2-9b9c-4ec0-945f-5cc6ef87f1b5\", \"d538da42-b07f-4fa1-837e-105468a674ca\", \"ec1e490e-ed02-466c-852d-86c6223e37eb\", \"01a92062-967a-4900-8dc7-a5ecd3b3f8e2\", \"common_in_exac\", \"COSM2150354\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-06-0650\", \"TCGA-06-0650-01A\", \"TCGA-06-0650-10A\", \"TCGA-06-0650-01A-02D-1696-08\", \"TCGA-06-0650-10A-01D-1696-08\", \"PLIN4\", 729359, \"BI\", \"GRCh38\", \"chr19\", 4512529, 4512529, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"rs139885054\", \"by1000G;byCluster;byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"89af56db-b7f9-41d2-af62-c9b2ee7b540f\", \"ed56d74a-781d-4408-9adc-9bfcfbe34585\", \"c.1389G>A\", \"p.=\", \"p.A463A\", \"ENST00000301286\", \"3/6\", \"233|217|206\", \"205|192|181\", \"28|25|24\", \"186|178|160\", \"PLIN4,synonymous_variant,p.A463A,ENST00000301286,NM_001080400.1,c.1389G>A,LOW,YES,,,-1\", \"T\", \"ENSG00000167676\", \"ENST00000301286\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"1389/6341\", \"1389/4074\", \"463/1357\", \"A\", \"gcG/gcA\", \"rs139885054\", \"1\", \"None\", -1, \"PLIN4\", \"HGNC\", \"HGNC:29393\", \"protein_coding\", \"YES\", \"CCDS45927.1\", \"ENSP00000301286\", \"Q96Q06\", \"None\", \"UPI00001D822A\", \"NM_001080400.1\", \"None\", \"None\", \"3/6\", \"None\", \"PROSITE_profiles:PS50325;Superfamily_domains:SSF48403\", \"0.0026\", \"0.0\", \"0.0\", \"0.0129\", \"0.0\", \"0.0\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 5.0, NaN, \"None\", \"1\", \"9.015e-04\", \"0.0009028\", \"0.000102\", \"8.639e-05\", \"0.01218\", \"0\", \"1.499e-05\", \"0\", \"6.057e-05\", \"PASS|panel_of_normals|PASS\", \"ACATTCGCAGC\", \"4b5f5562-6947-4c5e-aa37-5e4585fa5e30|1d15cf1c-d388-4fc6-9fed-1f1f7f2eb0a6|54644dfa-ddc4-4a05-96d8-6298fc45e87a\", \"6eccc80f-4d8f-48ea-a382-26d64624b8d9\", \"e7121726-b3f0-445e-acec-8ddf47aab1c2\", \"522808a2-f19d-4fab-b67e-0c31ec54b757\", \"common_in_exac;gdc_pon\", \"COSM3404368;COSM3404369\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-12-0656\", \"TCGA-12-0656-01A\", \"TCGA-12-0656-10A\", \"TCGA-12-0656-01A-03W-0348-08\", \"TCGA-12-0656-10A-01W-0348-08\", \"CIRBP\", 1153, \"BI\", \"GRCh38\", \"chr19\", 1270966, 1270966, \"+\", \"Silent\", \"SNP\", \"A\", \"A\", \"G\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina Genome Analyzer II\", \"0bc02928-29ea-415c-9a93-b1999c40d134\", \"8cf92705-fcef-4eef-9bd4-5419ca896d7d\", \"c.33A>G\", \"p.=\", \"p.G11G\", \"ENST00000320936\", \"2/7\", \"41\", \"29\", \"12\", \"12\", \"CIRBP,synonymous_variant,p.G11G,ENST00000589710,,c.33A>G,LOW,YES,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000586548,NM_001300829.1,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000413636,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000588030,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000588090,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000320936,NM_001280.2,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000586472,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000587323,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000587896,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000589235,NM_001300815.1,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000628979,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000588230,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000586773,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000585630,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000591935,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000588411,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000589266,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000591659,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000592051,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000589686,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G8G,ENST00000588344,,c.24A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000592815,,c.33A>G,LOW,,,,1;C19orf24,upstream_gene_variant,,ENST00000409293,NM_017914.3,,MODIFIER,YES,,,1;CIRBP-AS1,upstream_gene_variant,,ENST00000585832,,,MODIFIER,YES,,,-1;CIRBP,upstream_gene_variant,,ENST00000590188,,,MODIFIER,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000590347,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000587169,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000591097,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000585914,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000586636,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000591055,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000590171,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000585913,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000591376,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000593048,,c.33A>G,LOW,,,,1;CIRBP,synonymous_variant,p.G11G,ENST00000592412,,c.33A>G,LOW,,,,1;CIRBP,non_coding_transcript_exon_variant,,ENST00000593093,,n.118A>G,MODIFIER,,,,1;CIRBP,non_coding_transcript_exon_variant,,ENST00000590704,,n.179A>G,MODIFIER,,,,1;CIRBP,non_coding_transcript_exon_variant,,ENST00000593128,,n.119A>G,MODIFIER,,,,1;CIRBP,non_coding_transcript_exon_variant,,ENST00000593283,,n.118A>G,MODIFIER,,,,1;CIRBP,upstream_gene_variant,,ENST00000588917,,,MODIFIER,,,,1;CIRBP,upstream_gene_variant,,ENST00000621399,,,MODIFIER,,,,1;CIRBP,upstream_gene_variant,,ENST00000586555,,,MODIFIER,,,,1;CIRBP,upstream_gene_variant,,ENST00000444172,,,MODIFIER,,,,1;CIRBP,upstream_gene_variant,,ENST00000592234,,,MODIFIER,,,,1\", \"G\", \"ENSG00000099622\", \"ENST00000320936\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"113/1328\", \"33/519\", \"11/172\", \"G\", \"ggA/ggG\", \"None\", \"1\", \"None\", 1, \"CIRBP\", \"HGNC\", \"HGNC:1982\", \"protein_coding\", \"None\", \"CCDS12059.1\", \"ENSP00000322887\", \"Q14011\", \"Q53XX5\", \"None\", \"NM_001280.2\", \"None\", \"None\", \"2/7\", \"None\", \"Pfam_domain:PF00076;PROSITE_profiles:PS50102;SMART_domains:SM00361;SMART_domains:SM00360;Superfamily_domains:SSF54928\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GTTGGAGGGCT\", \"55763898-df75-42cb-9478-d5ad8058ec4e\", \"18ad920b-1f6e-47e2-971e-73f38d296ae6\", \"1fc75d0e-c3ee-4f79-83c9-0dbf96a5933d\", \"c4ff28e5-9de7-43df-89a2-6832b8a0c00b\", \"wga_pair\", \"None\", \"True\", \"Unknown\", \"somaticsniper\", \"61b82eef-f454-434f-a1ca-e9928fd4b936\", \"TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-12-0662\", \"TCGA-12-0662-01A\", \"TCGA-12-0662-10A\", \"TCGA-12-0662-01A-01W-0348-08\", \"TCGA-12-0662-10A-01W-0348-08\", \"PRKAR2A\", 5576, \"BI\", \"GRCh38\", \"chr3\", 48790562, 48790562, \"+\", \"Silent\", \"SNP\", \"A\", \"A\", \"G\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina Genome Analyzer II\", \"e8376006-f9d2-4f6f-8653-8116e977f056\", \"9639a5ce-853b-41a2-add4-1d5d85c0675e\", \"c.417T>C\", \"p.=\", \"p.L139L\", \"ENST00000265563\", \"4/11\", \"169\", \"155\", \"14\", \"56\", \"PRKAR2A,synonymous_variant,p.L139L,ENST00000265563,NM_004157.2,c.417T>C,LOW,YES,,,-1;PRKAR2A,synonymous_variant,p.L139L,ENST00000296446,,c.417T>C,LOW,,,,-1;PRKAR2A,synonymous_variant,p.L139L,ENST00000454963,,c.417T>C,LOW,,,,-1;PRKAR2A,synonymous_variant,p.L28L,ENST00000437821,,c.83T>C,LOW,,,,-1;PRKAR2A,downstream_gene_variant,,ENST00000419216,,,MODIFIER,,,,-1\", \"G\", \"ENSG00000114302\", \"ENST00000265563\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"667/6471\", \"417/1215\", \"139/404\", \"L\", \"ctT/ctC\", \"None\", \"1\", \"None\", -1, \"PRKAR2A\", \"HGNC\", \"HGNC:9391\", \"protein_coding\", \"YES\", \"CCDS2778.1\", \"ENSP00000265563\", \"P13861\", \"A0A024R2W3\", \"UPI0000161B64\", \"NM_004157.2\", \"None\", \"None\", \"4/11\", \"None\", \"PROSITE_profiles:PS50042;SMART_domains:SM00100;Superfamily_domains:SSF51206;PIRSF_domain:PIRSF000548\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TTGAAAAGGAG\", \"29dc0048-c16a-4c86-8f2c-d0e6f7e0a419\", \"6f2ac4c8-d99d-4ed3-b76e-f61cddb49779\", \"c6db6981-0fbb-46b9-ac77-a92cc1883e9f\", \"a3cc2845-8a44-4b50-8a3e-17a3c2c3e077\", \"wga_pair\", \"None\", \"False\", \"Unknown\", \"mutect\", \"da904cd3-79d7-4ae3-b6c0-e7127998b3e6\", \"TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-7483\", \"TCGA-HT-7483-01A\", \"TCGA-HT-7483-10A\", \"TCGA-HT-7483-01A-11D-2024-08\", \"TCGA-HT-7483-10A-01D-2024-08\", \"C17orf47\", 284083, \"BI\", \"GRCh38\", \"chr17\", 58542923, 58542923, \"+\", \"Missense_Mutation\", \"SNP\", \"C\", \"C\", \"T\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"fd066a89-fa93-434b-b631-9859aa8e4184\", \"a9641072-aa3c-485d-9c1f-0fd571795e54\", \"c.1264G>A\", \"p.Gly422Arg\", \"p.G422R\", \"ENST00000321691\", \"1/2\", \"112|111|112|101\", \"71|70|71|64\", \"41|41|41|37\", \"128|125|128|116\", \"C17orf47,missense_variant,p.G422R,ENST00000321691,NM_001038704.2,c.1264G>A,MODERATE,YES,deleterious(0),possibly_damaging(0.595),-1;SEPT4,upstream_gene_variant,,ENST00000457347,NM_001256782.1,,MODIFIER,YES,,,-1;SEPT4,upstream_gene_variant,,ENST00000412945,NM_001198713.1,,MODIFIER,,,,-1;SEPT4-AS1,intron_variant,,ENST00000580769,,n.150-534C>T,MODIFIER,YES,,,1;SEPT4-AS1,intron_variant,,ENST00000578022,,n.279-534C>T,MODIFIER,,,,1;SEPT4-AS1,intron_variant,,ENST00000580589,,n.259-534C>T,MODIFIER,,,,1;SEPT4,upstream_gene_variant,,ENST00000581921,,,MODIFIER,,,,-1\", \"T\", \"ENSG00000181013\", \"ENST00000321691\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"1446/2123\", \"1264/1713\", \"422/570\", \"G/R\", \"Gga/Aga\", \"None\", \"1\", \"None\", -1, \"C17orf47\", \"HGNC\", \"HGNC:26844\", \"protein_coding\", \"YES\", \"CCDS32691.1\", \"ENSP00000354874\", \"Q8NEP4\", \"None\", \"UPI0000140BFA\", \"NM_001038704.2\", \"deleterious(0)\", \"possibly_damaging(0.595)\", \"1/2\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS|panel_of_normals|PASS|PASS\", \"AGGTCCGTACC\", \"ecd4fea7-6cd7-4260-a03b-f8bc1a840f41|d3810299-2255-475f-b771-dbd1290ee9f3|aba02383-215d-4d65-bbf0-d0556223a3dc|c981024b-6a79-446a-9b4b-d66ac659db61\", \"087982fb-d6d0-4342-86aa-bf2cbea39afd\", \"416ea829-d283-421b-9872-3628f71c7b10\", \"183dd089-e932-4be2-b252-0e8572e7da4e\", \"gdc_pon\", \"COSM3970197\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-8563\", \"TCGA-HT-8563-01A\", \"TCGA-HT-8563-10A\", \"TCGA-HT-8563-01A-11D-2395-08\", \"TCGA-HT-8563-10A-01D-2396-08\", \"ATRX\", 546, \"BI\", \"GRCh38\", \"chrX\", 77634704, 77634704, \"+\", \"Splice_Site\", \"SNP\", \"C\", \"C\", \"G\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"3c1bab17-40da-40e8-9739-c360d082f6bd\", \"fde28c63-fec0-4e41-a02d-54bbb121fbc9\", \"c.4700-1G>C\", \"None\", \"p.X1567_splice\", \"ENST00000373344\", \"None\", \"173|172|163\", \"134|134|128\", \"39|38|35\", \"165|165|153\", \"ATRX,splice_acceptor_variant,p.X1567_splice,ENST00000373344,NM_000489.4,c.4700-1G>C,HIGH,YES,,,-1;ATRX,splice_acceptor_variant,p.X1529_splice,ENST00000395603,NM_138270.3,c.4586-1G>C,HIGH,,,,-1;ATRX,upstream_gene_variant,,ENST00000400866,,,MODIFIER,,,,-1;ATRX,splice_acceptor_variant,,ENST00000480283,,c.*4328-1G>C,HIGH,,,,-1;ATRX,splice_acceptor_variant,,ENST00000623242,,c.*238-1G>C,HIGH,,,,-1;ATRX,splice_acceptor_variant,,ENST00000460639,,n.180-1G>C,HIGH,,,,-1;ATRX,upstream_gene_variant,,ENST00000624403,,,MODIFIER,,,,-1\", \"G\", \"ENSG00000085224\", \"ENST00000373344\", \"Transcript\", \"splice_acceptor_variant\", \"splice_acceptor_variant\", \"-/11220\", \"4700/7479\", \"1567/2492\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"ATRX\", \"HGNC\", \"HGNC:886\", \"protein_coding\", \"YES\", \"CCDS14434.1\", \"ENSP00000362441\", \"P46100\", \"A4LAA3\", \"UPI00001B644E\", \"NM_000489.4\", \"None\", \"None\", \"None\", \"16/34\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HIGH\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AACACCTAAAA\", \"b3b2198d-57da-4a6f-83d5-3cd470710c32|9727af9d-eb82-4886-850d-14a59ab8ec3b|c21028bd-7145-4f0a-8c5e-bca26afeaf1e\", \"50df16ed-f108-4919-82e1-77d8db809573\", \"1bc71040-5137-4238-a5d7-a889f0be8401\", \"dd7b23a7-b41b-4670-9fc8-78895fb00cff\", \"NonExonic\", \"COSM3973918;COSM3973919\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HW-8319\", \"TCGA-HW-8319-01A\", \"TCGA-HW-8319-10A\", \"TCGA-HW-8319-01A-11D-2395-08\", \"TCGA-HW-8319-10A-01D-2396-08\", \"DGCR2\", 9993, \"BI\", \"GRCh38\", \"chr22\", 19039120, 19039120, \"+\", \"Splice_Region\", \"SNP\", \"G\", \"G\", \"A\", \"rs146027196\", \"byCluster\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"fb65935e-13c0-445a-aa77-e8dde888957e\", \"cc240084-66ac-4c53-a3ee-12444b168db2\", \"c.1398C>T\", \"p.=\", \"p.D466D\", \"ENST00000263196\", \"10/10\", \"48|47\", \"34|33\", \"14\", \"68\", \"DGCR2,splice_region_variant,p.D466D,ENST00000545799,,c.1398C>T,LOW,,,,-1;DGCR2,splice_region_variant,p.D466D,ENST00000263196,NM_005137.2&NM_001184781.1,c.1398C>T,LOW,YES,,,-1;DGCR2,splice_region_variant,p.D425D,ENST00000537045,NM_001173534.1&NM_001173533.1,c.1275C>T,LOW,,,,-1;DGCR2,splice_region_variant,p.D242D,ENST00000389262,,c.726C>T,LOW,,,,-1;DGCR2,splice_region_variant,,ENST00000467659,,n.1176C>T,LOW,,,,-1;CA15P1,upstream_gene_variant,,ENST00000481698,,,MODIFIER,YES,,,-1\", \"A\", \"ENSG00000070413\", \"ENST00000263196\", \"Transcript\", \"splice_region_variant\", \"splice_region_variant;synonymous_variant\", \"1646/4480\", \"1398/1653\", \"466/550\", \"D\", \"gaC/gaT\", \"rs146027196\", \"1\", \"None\", -1, \"DGCR2\", \"HGNC\", \"HGNC:2845\", \"protein_coding\", \"YES\", \"CCDS33598.1\", \"ENSP00000263196\", \"P98153\", \"None\", \"UPI0000001613\", \"NM_005137.2;NM_001184781.1\", \"None\", \"None\", \"10/10\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"0.0002\", \"0\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"8.239e-06\", \"8.464e-06\", \"0\", \"0\", \"0\", \"0\", \"1.552e-05\", \"0\", \"0\", \"PASS\", \"TCATCGTCTGC\", \"ded4d68d-1b95-4511-8df1-853fe8967507|c1bd5b18-df00-475e-98fa-00c08ebb6ce7\", \"04bcde50-e7d8-4714-98d4-94298d90daa5\", \"40ae6871-502d-459b-a971-cc4419410a0f\", \"bc3b4816-df1d-44ed-a8c6-f32c8e011a1f\", \"None\", \"COSM50995\", \"True\", \"Unknown\", \"muse|mutect\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-TM-A84L\", \"TCGA-TM-A84L-01A\", \"TCGA-TM-A84L-10A\", \"TCGA-TM-A84L-01A-11D-A36O-08\", \"TCGA-TM-A84L-10A-01D-A367-08\", \"OR1L4\", 254973, \"BI\", \"GRCh38\", \"chr9\", 122724354, 122724354, \"+\", \"Missense_Mutation\", \"SNP\", \"A\", \"A\", \"G\", \"rs776896250\", \"byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"24a012b9-073b-4885-ad00-da8d4ea47ab9\", \"29f12a90-ffa1-4e84-b0a5-e4f88ca43a02\", \"c.365A>G\", \"p.Asp122Gly\", \"p.D122G\", \"ENST00000259466\", \"1/1\", \"196|168|152\", \"129|105|95\", \"66|62|57\", \"146|127|115\", \"OR1L4,missense_variant,p.D122G,ENST00000259466,NM_001005235.1,c.365A>G,MODERATE,YES,deleterious(0),probably_damaging(0.999),1\", \"G\", \"ENSG00000136939\", \"ENST00000259466\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"365/936\", \"365/936\", \"122/311\", \"D/G\", \"gAc/gGc\", \"rs776896250\", \"1\", \"None\", 1, \"OR1L4\", \"HGNC\", \"HGNC:8216\", \"protein_coding\", \"YES\", \"CCDS35129.1\", \"ENSP00000259466\", \"Q8NGR5\", \"None\", \"UPI0000061E7A\", \"NM_001005235.1\", \"deleterious(0)\", \"probably_damaging(0.999)\", \"1/1\", \"None\", \"Pfam_domain:PF00001;Pfam_domain:PF10320;Prints_domain:PR00237;PROSITE_profiles:PS50262;Superfamily_domains:SSF81321\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", NaN, NaN, \"None\", \"1\", \"2.471e-05\", \"2.472e-05\", \"0\", \"0\", \"0\", \"0\", \"0\", \"0\", \"0.0001817\", \"PASS\", \"CATCGACCGGC\", \"b68e694d-03c2-445a-b62a-41f07021c5ba|ee54c4b4-b851-48c1-b38d-ae21dd000155|9b243f7e-9cfb-450c-88ea-ffe0798fca2a\", \"8f6e0abf-7c67-47b0-926a-08564100238e\", \"16db9378-cf84-4201-8c1b-9d3ad5be3bc7\", \"9b161c41-4f76-4ed1-b60f-2b093bc70edb\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-12-0670\", \"TCGA-12-0670-01B\", \"TCGA-12-0670-10B\", \"TCGA-12-0670-01B-01W-0424-08\", \"TCGA-12-0670-10B-01W-0424-08\", \"DKK2\", 27123, \"BI\", \"GRCh38\", \"chr4\", 106923843, 106923843, \"+\", \"3'UTR\", \"SNP\", \"C\", \"C\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina Genome Analyzer II\", \"7ef9f1f9-eaa6-4262-9a3e-91ab2341540d\", \"2c668b2d-d706-4703-8679-53b64a47ede0\", \"c.*111G>A\", \"None\", \"None\", \"ENST00000285311\", \"4/4\", \"36\", \"3\", \"33\", \"80\", \"DKK2,3_prime_UTR_variant,,ENST00000285311,NM_014421.2,c.*111G>A,MODIFIER,YES,,,-1;DKK2,3_prime_UTR_variant,,ENST00000513208,,c.*111G>A,MODIFIER,,,,-1;DKK2,downstream_gene_variant,,ENST00000510463,,,MODIFIER,,,,-1;DKK2,non_coding_transcript_exon_variant,,ENST00000510534,,n.1452G>A,MODIFIER,,,,-1\", \"T\", \"ENSG00000155011\", \"ENST00000285311\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"1597/3638\", \"-/780\", \"-/259\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"DKK2\", \"HGNC\", \"HGNC:2892\", \"protein_coding\", \"YES\", \"CCDS3675.1\", \"ENSP00000285311\", \"Q9UBU2\", \"None\", \"UPI0000048EF2\", \"NM_014421.2\", \"None\", \"None\", \"4/4\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TATCACGTTTC\", \"1f09141b-e454-44a9-a78f-315c717b1145\", \"1a867b5d-2e07-4d99-97ee-33c2e8874817\", \"ba6ed401-19a6-4678-8c31-86b0bc67f150\", \"f7dd387f-eca9-4028-b296-2ca6d56d3bde\", \"wga_pair\", \"None\", \"True\", \"Unknown\", \"mutect\", \"da904cd3-79d7-4ae3-b6c0-e7127998b3e6\", \"TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-26-5133\", \"TCGA-26-5133-01A\", \"TCGA-26-5133-10A\", \"TCGA-26-5133-01A-01D-1486-08\", \"TCGA-26-5133-10A-01D-1486-08\", \"CITED1\", 4435, \"BI\", \"GRCh38\", \"chrX\", 72302858, 72302858, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"rs146201846\", \"byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"533051f3-5ea5-41a4-8727-11dc6d786607\", \"c47b3f6f-5f47-4588-afe6-0249eaefe1b5\", \"c.12G>A\", \"p.=\", \"p.T4T\", \"ENST00000246139\", \"2/3\", \"40|40|34\", \"31|31|28\", \"9|9|6\", \"30|31|23\", \"CITED1,synonymous_variant,p.T4T,ENST00000246139,NM_004143.3,c.12G>A,LOW,,,,-1;CITED1,synonymous_variant,p.T30T,ENST00000453707,,c.90G>A,LOW,YES,,,-1;CITED1,synonymous_variant,p.T30T,ENST00000431381,NM_001144885.1,c.90G>A,LOW,,,,-1;CITED1,synonymous_variant,p.T4T,ENST00000373619,NM_001144886.1,c.12G>A,LOW,,,,-1;CITED1,synonymous_variant,p.T4T,ENST00000445983,NM_001144887.1,c.12G>A,LOW,,,,-1;CITED1,synonymous_variant,p.T30T,ENST00000454225,,c.90G>A,LOW,,,,-1;CITED1,synonymous_variant,p.T30T,ENST00000427412,,c.90G>A,LOW,,,,-1;CITED1,synonymous_variant,p.T4T,ENST00000417400,,c.12G>A,LOW,,,,-1;CITED1,synonymous_variant,p.T30T,ENST00000450875,,c.90G>A,LOW,,,,-1;CITED1,synonymous_variant,p.T4T,ENST00000429794,,c.11G>A,LOW,,,,-1;PIN4,3_prime_UTR_variant,,ENST00000439980,,c.*233C>T,MODIFIER,,,,1\", \"T\", \"ENSG00000125931\", \"ENST00000246139\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"588/1231\", \"12/582\", \"4/193\", \"T\", \"acG/acA\", \"rs146201846\", \"1\", \"None\", -1, \"CITED1\", \"HGNC\", \"HGNC:1986\", \"protein_coding\", \"None\", \"CCDS14419.1\", \"ENSP00000246139\", \"Q99966\", \"None\", \"UPI000013CBD9\", \"NM_004143.3\", \"None\", \"None\", \"2/3\", \"None\", \"Pfam_domain:PF04487\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"0.0008\", \"0\", \"None\", \"None\", \"None\", \"LOW\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CTCGACGTTGT\", \"7418d672-5794-410d-bf9a-d2d18a8f7e40|8a31ef41-e68e-40f4-939a-9e939e8dd037|49281647-0bd8-4229-9074-2cbeb1353995\", \"720d6635-4a6b-4806-8e7d-9b9453df1448\", \"e6553174-17b5-4016-9409-540d981b35a1\", \"a28b256e-e085-467d-bdba-5c39718012d7\", \"None\", \"COSM2156974;COSM3406581\", \"True\", \"Unknown\", \"mutect|somaticsniper|varscan\", \"da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-74-6573\", \"TCGA-74-6573-01A\", \"TCGA-74-6573-11A\", \"TCGA-74-6573-01A-12D-1845-08\", \"TCGA-74-6573-11A-02D-1845-08\", \"SERPINB3\", 6317, \"BI\", \"GRCh38\", \"chr18\", 63655533, 63655533, \"+\", \"3'UTR\", \"SNP\", \"C\", \"C\", \"T\", \"rs184290994\", \"by1000G;byCluster;byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"0941e50e-1205-49ed-8735-1f86eaf87718\", \"32086039-510b-4cae-908d-4a3b4cbf7eba\", \"c.*124G>A\", \"None\", \"None\", \"ENST00000283752\", \"8/8\", \"24|24|23\", \"12|12|11\", \"12\", \"15|15|14\", \"SERPINB3,3_prime_UTR_variant,,ENST00000283752,NM_006919.2,c.*124G>A,MODIFIER,YES,,,-1;SERPINB3,3_prime_UTR_variant,,ENST00000332821,,c.*124G>A,MODIFIER,,,,-1;SERPINB11,5_prime_UTR_variant,,ENST00000489748,,c.-459C>T,MODIFIER,,,,1;SERPINB3,intron_variant,,ENST00000356424,,c.768+1298G>A,MODIFIER,,,,-1\", \"T\", \"ENSG00000057149\", \"ENST00000283752\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"1441/1777\", \"-/1173\", \"-/390\", \"None\", \"None\", \"rs184290994\", \"1\", \"None\", -1, \"SERPINB3\", \"HGNC\", \"HGNC:10569\", \"protein_coding\", \"YES\", \"CCDS11987.1\", \"ENSP00000283752\", \"P29508\", \"None\", \"UPI0000038A19\", \"NM_006919.2\", \"None\", \"None\", \"8/8\", \"None\", \"None\", \"0.0054\", \"0.0008\", \"0.0\", \"0.0258\", \"0.0\", \"0.0\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GATGACGATCA\", \"1e5c8706-dd69-4dce-9336-09703a8b1f4c|a3d25c4a-afca-4c63-a014-9a88c5451be2|bec0027d-0f79-4626-bf7b-ce0ff36a60a6\", \"9144f58f-ec12-4108-9eff-9ac7470c3ce3\", \"203b9a2f-f700-411c-a1ff-580b65978ce3\", \"8d0d7a7e-8fae-437d-9b39-f2f17d0f5e4f\", \"gdc_pon\", \"None\", \"True\", \"Unknown\", \"muse|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-VV-A829\", \"TCGA-VV-A829-01A\", \"TCGA-VV-A829-10A\", \"TCGA-VV-A829-01A-21D-A36O-08\", \"TCGA-VV-A829-10A-01D-A367-08\", \"ARID1B\", 57492, \"BI\", \"GRCh38\", \"chr6\", 157167115, 157167195, \"+\", \"Splice_Site\", \"DEL\", \"CAGCTCTAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGG\", \"CAGCTCTAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGG\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"2412e01f-41e2-48c7-849c-ecc2851b08d4\", \"32471810-2274-4b01-b96f-37db7286333f\", \"c.2923_2986+17delAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGGCAGCTCT\", \"None\", \"p.X975_splice\", \"ENST00000350026\", \"9/19\", \"160\", \"127\", \"33\", \"197\", \"ARID1B,splice_donor_variant,p.X988_splice,ENST00000346085,NM_020732.3,c.2962_3025+17delAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGGCAGCTCT,HIGH,YES,,,1;ARID1B,splice_donor_variant,p.X975_splice,ENST00000350026,NM_017519.2,c.2923_2986+17delAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGGCAGCTCT,HIGH,,,,1;ARID1B,splice_donor_variant,p.X444_splice,ENST00000414678,,c.1330_1393+17delAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGGCAGCTCT,HIGH,,,,1;ARID1B,splice_donor_variant,p.X42_splice,ENST00000400790,,c.124_187+17delAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGGCAGCTCT,HIGH,,,,1;ARID1B,splice_donor_variant,p.X397_splice,ENST00000319584,,c.1189_1252+17delAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGGCAGCTCT,HIGH,,,,1;ARID1B,splice_donor_variant,,ENST00000478761,,n.374_437+17delAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGGCAGCTCT,HIGH,,,,1\", \"-\", \"ENSG00000049618\", \"ENST00000350026\", \"Transcript\", \"splice_donor_variant\", \"splice_donor_variant;coding_sequence_variant;intron_variant\", \"2917-?/7971\", \"2916-?/6711\", \"972-?/2236\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"ARID1B\", \"HGNC\", \"HGNC:18040\", \"protein_coding\", \"None\", \"CCDS5251.2\", \"ENSP00000055163\", \"Q8NFD5\", \"None\", \"UPI000058E2EA\", \"NM_017519.2\", \"None\", \"None\", \"9/19\", \"9/18\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HIGH\", \"None\", \"deletion\", 1.0, 7.0, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GAACAACAGCTCTAGCCTGATGAACACGCAGGCGCCGCCCTACAGCATGGCGCCCGCCATGGTGAACAGCTCGGCAGGTAACCTTGGCAGCT\", \"d1a67f33-1643-4650-a08c-6ada954bc2cb\", \"36acfec0-ad6a-466c-8c8c-1fff0a580895\", \"62d58c23-bfc9-4321-b356-7ebd8da30880\", \"10887e42-444d-49fc-aee5-dd0e9fc4ea54\", \"None\", \"None\", \"False\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-WY-A858\", \"TCGA-WY-A858-01A\", \"TCGA-WY-A858-10A\", \"TCGA-WY-A858-01A-11D-A36O-08\", \"TCGA-WY-A858-10A-01D-A367-08\", \"GABPA\", 2551, \"BI\", \"GRCh38\", \"chr21\", 25764253, 25764253, \"+\", \"Silent\", \"SNP\", \"T\", \"T\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"be4899f0-5237-4a0e-bdcc-8b88c02e4972\", \"8d29a469-4eb5-4bf3-9577-3a8508544daf\", \"c.846T>A\", \"p.=\", \"p.T282T\", \"ENST00000354828\", \"8/10\", \"96\", \"91\", \"5\", \"80\", \"GABPA,synonymous_variant,p.T282T,ENST00000354828,NM_001197297.1,c.846T>A,LOW,YES,,,1;GABPA,synonymous_variant,p.T282T,ENST00000400075,NM_002040.3,c.846T>A,LOW,,,,1;LLPHP2,upstream_gene_variant,,ENST00000436405,,,MODIFIER,YES,,,-1\", \"A\", \"ENSG00000154727\", \"ENST00000354828\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"1373/5120\", \"846/1365\", \"282/454\", \"T\", \"acT/acA\", \"None\", \"1\", \"None\", 1, \"GABPA\", \"HGNC\", \"HGNC:4071\", \"protein_coding\", \"YES\", \"CCDS13575.1\", \"ENSP00000346886\", \"Q06546\", \"A8IE48\", \"UPI000012AFB2\", \"NM_001197297.1\", \"None\", \"None\", \"8/10\", \"None\", \"PIRSF_domain:PIRSF001703\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CCTACTACCAT\", \"29ca7adb-c7ea-4e75-b646-3d81f5df4063\", \"da4f0524-e494-4d0b-96eb-a42a35ebc65d\", \"39e1ce89-ff51-48cb-8aa3-369c5303646d\", \"c8700ca3-8c0b-4b2a-9e87-79d244a0f892\", \"None\", \"None\", \"False\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-14-0781\", \"TCGA-14-0781-01B\", \"TCGA-14-0781-10A\", \"TCGA-14-0781-01B-01D-1696-08\", \"TCGA-14-0781-10A-01D-1696-08\", \"EPHB4\", 2050, \"BI\", \"GRCh38\", \"chr7\", 100813657, 100813657, \"+\", \"Missense_Mutation\", \"SNP\", \"C\", \"C\", \"T\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"13878ec6-fce7-423e-b545-6656145e9d2c\", \"59932204-ddef-439f-8b64-e40f5605827c\", \"c.1751G>A\", \"p.Gly584Glu\", \"p.G584E\", \"ENST00000358173\", \"10/17\", \"902|868\", \"832|792\", \"69|76\", \"675|647\", \"EPHB4,missense_variant,p.G584E,ENST00000358173,NM_004444.4,c.1751G>A,MODERATE,YES,tolerated(0.12),probably_damaging(0.953),-1;EPHB4,missense_variant,p.G584E,ENST00000360620,,c.1751G>A,MODERATE,,tolerated(0.09),probably_damaging(0.929),-1;EPHB4,3_prime_UTR_variant,,ENST00000616502,,c.*216G>A,MODIFIER,,,,-1;EPHB4,downstream_gene_variant,,ENST00000477446,,,MODIFIER,,,,-1;EPHB4,downstream_gene_variant,,ENST00000489808,,,MODIFIER,,,,-1;EPHB4,non_coding_transcript_exon_variant,,ENST00000487222,,n.2952G>A,MODIFIER,,,,-1;EPHB4,non_coding_transcript_exon_variant,,ENST00000478459,,n.230G>A,MODIFIER,,,,-1;EPHB4,downstream_gene_variant,,ENST00000492878,,,MODIFIER,,,,-1;EPHB4,upstream_gene_variant,,ENST00000467515,,,MODIFIER,,,,-1\", \"T\", \"ENSG00000196411\", \"ENST00000358173\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"2220/4329\", \"1751/2964\", \"584/987\", \"G/E\", \"gGa/gAa\", \"None\", \"1\", \"None\", -1, \"EPHB4\", \"HGNC\", \"HGNC:3395\", \"protein_coding\", \"YES\", \"CCDS5706.1\", \"ENSP00000350896\", \"P54760\", \"Q541P7\", \"UPI0000000DBB\", \"NM_004444.4\", \"tolerated(0.12)\", \"probably_damaging(0.953)\", \"10/17\", \"None\", \"PIRSF_domain:PIRSF000666\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CATGTCCGATG\", \"2a81ae62-0624-4fb1-a48d-d4551f3d2b5b|e45fdae3-c05d-438e-9e42-827b956ee308\", \"765f2368-e6c0-47e7-9f40-bae54e98c7fe\", \"362442f3-8d40-420c-936e-f995504bbeb9\", \"9b9654c9-5a64-4a8e-b1f0-987437e6012e\", \"None\", \"COSM3411385\", \"True\", \"Unknown\", \"muse|mutect\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-27-1833\", \"TCGA-27-1833-01A\", \"TCGA-27-1833-10A\", \"TCGA-27-1833-01A-01D-1494-08\", \"TCGA-27-1833-10A-01D-1494-08\", \"MROH5\", 389690, \"BI\", \"GRCh38\", \"chr8\", 141466486, 141466486, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"4bbd9a36-d6dd-4e19-bc2f-4f618de2510c\", \"7d8595d6-4afb-4555-83dc-cf8c1206ad4e\", \"c.2400C>T\", \"p.=\", \"p.H800H\", \"ENST00000621837\", \"19/31\", \"53|43|53|42\", \"32|27|32|27\", \"21|16|21|15\", \"61|50|61|48\", \"MROH5,synonymous_variant,p.H800H,ENST00000621837,NM_207414.2,c.2400C>T,LOW,YES,,,-1;MROH5,3_prime_UTR_variant,,ENST00000521053,,c.*1943C>T,MODIFIER,,,,-1;MROH5,3_prime_UTR_variant,,ENST00000523857,,c.*2211C>T,MODIFIER,,,,-1;MROH5,synonymous_variant,p.H800H,ENST00000430863,,c.2400C>T,LOW,,,,-1\", \"A\", \"ENSG00000226807\", \"ENST00000621837\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"2481/4164\", \"2400/3954\", \"800/1317\", \"H\", \"caC/caT\", \"None\", \"1\", \"None\", -1, \"MROH5\", \"HGNC\", \"HGNC:42976\", \"protein_coding\", \"YES\", \"None\", \"ENSP00000481783\", \"None\", \"A0A087WYG4\", \"UPI0004E4CC08\", \"NM_207414.2\", \"None\", \"None\", \"19/31\", \"None\", \"Superfamily_domains:SSF48371\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 5.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"ATGGCGTGCAG\", \"ab84c047-be82-43a5-8f3a-b3a53753c3c8|599b36ef-37d0-4b24-bb96-04af2c88726e|dec9ca67-1571-4cae-8489-e593aebf6875|f49ed833-4610-445c-a70e-fc31ea5b1dc3\", \"ca61c7af-348b-4891-b8ac-baaf2250e55f\", \"d3aed80f-8974-4224-9148-32996e82658e\", \"f40e45c8-2042-4844-99b5-b629f20afd58\", \"None\", \"COSM3412788;COSM3412789\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-27-2524\", \"TCGA-27-2524-01A\", \"TCGA-27-2524-10A\", \"TCGA-27-2524-01A-01D-1494-08\", \"TCGA-27-2524-10A-01D-1494-08\", \"GZMK\", 3003, \"BI\", \"GRCh38\", \"chr5\", 55033978, 55033978, \"+\", \"3'UTR\", \"SNP\", \"G\", \"G\", \"A\", \"rs770372154\", \"byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"ce679bfd-fbf9-4c78-822e-37d2322d544b\", \"30a97718-a630-4552-89c0-e2fe8af1d1a2\", \"c.*52G>A\", \"None\", \"None\", \"ENST00000231009\", \"5/5\", \"77|75|77|75\", \"41|41|41|40\", \"36|34|36|35\", \"55|54|55|54\", \"GZMK,3_prime_UTR_variant,,ENST00000231009,NM_002104.2,c.*52G>A,MODIFIER,YES,,,1;CTD-2313F11.1,non_coding_transcript_exon_variant,,ENST00000595218,,n.293C>T,MODIFIER,,,,-1;CTD-2313F11.1,intron_variant,,ENST00000609699,,n.1038-115C>T,MODIFIER,YES,,,-1;CTD-2313F11.1,upstream_gene_variant,,ENST00000596137,,,MODIFIER,,,,-1;CTD-2313F11.1,upstream_gene_variant,,ENST00000609792,,,MODIFIER,,,,-1;CTD-2313F11.1,upstream_gene_variant,,ENST00000611148,,,MODIFIER,,,,-1;GZMK,downstream_gene_variant,,ENST00000512089,,,MODIFIER,,,,1\", \"A\", \"ENSG00000113088\", \"ENST00000231009\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"917/1509\", \"-/795\", \"-/264\", \"None\", \"None\", \"rs770372154\", \"1\", \"None\", 1, \"GZMK\", \"HGNC\", \"HGNC:4711\", \"protein_coding\", \"YES\", \"CCDS3964.1\", \"ENSP00000231009\", \"P49863\", \"None\", \"UPI0000001C46\", \"NM_002104.2\", \"None\", \"None\", \"5/5\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"3.297e-05\", \"2.724e-05\", \"0\", \"0\", \"0\", \"0\", \"1.586e-05\", \"0\", \"0.0001916\", \"PASS\", \"TGCTCGCAGGT\", \"8bd6622c-4243-4a4b-8e86-cafc134e83f7|397e0eef-2db4-4400-b759-69644cb4f2c4|e86946da-1d4f-49f6-90ee-c3b3336f0337|69c7cefd-f7b3-449a-90a8-d8ef703ff7dc\", \"f5c146d0-e51f-44f1-9925-40e70e550cb0\", \"d7a5b3f4-7407-4d6b-be63-267fb08cf9d3\", \"a597bfa8-8c4d-4f8e-9d85-8a9fdc2c56ff\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-28-2510\", \"TCGA-28-2510-01A\", \"TCGA-28-2510-10A\", \"TCGA-28-2510-01A-01D-1696-08\", \"TCGA-28-2510-10A-01D-1696-08\", \"SPTBN4\", 57731, \"BI\", \"GRCh38\", \"chr19\", 40554585, 40554585, \"+\", \"Missense_Mutation\", \"SNP\", \"G\", \"G\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"5f2dc303-9859-4b63-8aab-c387da4b2cc1\", \"1ac0c79f-5de9-404e-88fd-a3533e56ea51\", \"c.5023G>A\", \"p.Glu1675Lys\", \"p.E1675K\", \"ENST00000352632\", \"24/36\", \"10\", \"7\", \"3\", \"13\", \"SPTBN4,missense_variant,p.E1675K,ENST00000338932,,c.5023G>A,MODERATE,,tolerated(0.18),possibly_damaging(0.581),1;SPTBN4,missense_variant,p.E1675K,ENST00000352632,,c.5023G>A,MODERATE,YES,tolerated(0.16),probably_damaging(0.991),1;SPTBN4,missense_variant,p.E1675K,ENST00000392025,,c.5023G>A,MODERATE,,tolerated(0.18),possibly_damaging(0.581),1;SPTBN4,missense_variant,p.E1675K,ENST00000598249,NM_020971.2,c.5023G>A,MODERATE,,tolerated(0.16),probably_damaging(0.991),1;SPTBN4,missense_variant,p.E1675K,ENST00000595535,,c.5023G>A,MODERATE,,tolerated(0.19),probably_damaging(0.984),1;SPTBN4,missense_variant,p.E351K,ENST00000392023,NM_025213.2,c.1051G>A,MODERATE,,tolerated(0.15),possibly_damaging(0.779),1;SPTBN4,3_prime_UTR_variant,,ENST00000597389,,c.*1179G>A,MODIFIER,,,,1;SPTBN4,non_coding_transcript_exon_variant,,ENST00000596900,,n.1140G>A,MODIFIER,,,,1\", \"A\", \"ENSG00000160460\", \"ENST00000352632\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"5109/8676\", \"5023/7695\", \"1675/2564\", \"E/K\", \"Gaa/Aaa\", \"None\", \"1\", \"None\", 1, \"SPTBN4\", \"HGNC\", \"HGNC:14896\", \"protein_coding\", \"YES\", \"CCDS12559.1\", \"ENSP00000263373\", \"Q9H254\", \"None\", \"UPI0000135DBB\", \"None\", \"tolerated(0.16)\", \"probably_damaging(0.991)\", \"24/36\", \"None\", \"Coiled-coils_(Ncoils):ncoils;Pfam_domain:PF00435;SMART_domains:SM00150;Superfamily_domains:SSF46966;PIRSF_domain:PIRSF002297\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 5.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"ACGAGGAAAGC\", \"62ad3bc9-4f73-4cd0-8ae8-db10009ad5d6|43d6727d-a38c-4a1a-96df-e35b49ffc188\", \"9e1485eb-cf08-4b87-b076-c7c0121fdb4c\", \"c6b226d0-e252-41ca-84de-ce2e8b7a0cbd\", \"6ccd57e5-9215-46fa-b3be-e408a0f424dc\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-7692\", \"TCGA-HT-7692-01A\", \"TCGA-HT-7692-10A\", \"TCGA-HT-7692-01A-12D-2253-08\", \"TCGA-HT-7692-10A-01D-2253-08\", \"SUV420H1\", 51111, \"BI\", \"GRCh38\", \"chr11\", 68173825, 68173825, \"+\", \"Missense_Mutation\", \"SNP\", \"T\", \"T\", \"C\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"eaa6dbfa-6641-4162-a34d-6718781793bc\", \"4a5299fe-a61f-4e0d-9e89-bc7874cff10e\", \"c.632A>G\", \"p.Lys211Arg\", \"p.K211R\", \"ENST00000304363\", \"6/11\", \"93|89\", \"87|83\", \"6\", \"121|117\", \"SUV420H1,missense_variant,p.K211R,ENST00000304363,NM_017635.3,c.632A>G,MODERATE,YES,deleterious(0.04),benign(0.069),-1;SUV420H1,missense_variant,p.K211R,ENST00000615954,,c.632A>G,MODERATE,,deleterious(0.04),benign(0.069),-1;SUV420H1,missense_variant,p.K211R,ENST00000405515,,c.632A>G,MODERATE,,tolerated(0.05),probably_damaging(0.997),-1;SUV420H1,missense_variant,p.K211R,ENST00000401547,NM_016028.4,c.632A>G,MODERATE,,tolerated(0.05),probably_damaging(0.997),-1;SUV420H1,missense_variant,p.K188R,ENST00000402185,,c.563A>G,MODERATE,,tolerated(0.06),probably_damaging(0.992),-1;SUV420H1,missense_variant,p.K211R,ENST00000402789,,c.632A>G,MODERATE,,tolerated(0.06),probably_damaging(0.996),-1;SUV420H1,downstream_gene_variant,,ENST00000453170,,,MODIFIER,,,,-1;SUV420H1,downstream_gene_variant,,ENST00000458496,,,MODIFIER,,,,-1;SUV420H1,non_coding_transcript_exon_variant,,ENST00000533271,,n.444A>G,MODIFIER,,,,-1;SUV420H1,missense_variant,p.K211R,ENST00000441488,,c.632A>G,MODERATE,,tolerated(0.06),benign(0.105),-1;SUV420H1,3_prime_UTR_variant,,ENST00000427752,,c.*220A>G,MODIFIER,,,,-1;SUV420H1,3_prime_UTR_variant,,ENST00000323599,,c.*101A>G,MODIFIER,,,,-1;SUV420H1,non_coding_transcript_exon_variant,,ENST00000524672,,n.608A>G,MODIFIER,,,,-1\", \"C\", \"ENSG00000110066\", \"ENST00000304363\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"986/5837\", \"632/2658\", \"211/885\", \"K/R\", \"aAa/aGa\", \"None\", \"1\", \"None\", -1, \"SUV420H1\", \"HGNC\", \"HGNC:24283\", \"protein_coding\", \"YES\", \"CCDS31623.1\", \"ENSP00000305899\", \"Q4FZB7\", \"None\", \"UPI00003FF22C\", \"NM_017635.3\", \"deleterious(0.04)\", \"benign(0.069)\", \"6/11\", \"None\", \"SMART_domains:SM00317;Superfamily_domains:SSF82199\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 5.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CTATTTTGGCT\", \"b6fd30d9-d5b3-4876-8b50-0064c27a142d|4bb0af14-654c-44f7-aadc-475e8f3f3312\", \"6ca1c1ed-d6d6-4a19-8c8b-fb812b1146f7\", \"a29f5545-e6f4-40fe-aadb-f41719b742ef\", \"6a0b306b-f73d-45b2-93a6-b9bd625644a3\", \"None\", \"COSM3967791;COSM4908694\", \"True\", \"Unknown\", \"muse|mutect\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-A61B\", \"TCGA-HT-A61B-01A\", \"TCGA-HT-A61B-10A\", \"TCGA-HT-A61B-01A-11D-A29Q-08\", \"TCGA-HT-A61B-10A-01D-A29Q-08\", \"TG\", 7038, \"BI\", \"GRCh38\", \"chr8\", 133133586, 133133586, \"+\", \"Missense_Mutation\", \"SNP\", \"C\", \"C\", \"G\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000;Illumina MiSeq\", \"97a07589-3dd1-4724-8458-343a8b54d8db\", \"b32d8211-d6fb-4fbd-9727-536b1e77a69d\", \"c.8114C>G\", \"p.Pro2705Arg\", \"p.P2705R\", \"ENST00000220616\", \"47/48\", \"65\", \"53\", \"12\", \"82\", \"TG,missense_variant,p.P2705R,ENST00000220616,NM_003235.4,c.8114C>G,MODERATE,YES,tolerated(0.05),benign(0.055),1;TG,missense_variant,p.P1161R,ENST00000519178,,c.3480C>G,MODERATE,,deleterious(0.04),probably_damaging(0.984),1;TG,missense_variant,p.P838R,ENST00000519543,,c.2513C>G,MODERATE,,deleterious(0.04),probably_damaging(0.939),1;TG,missense_variant,p.P109R,ENST00000521107,,c.326C>G,MODERATE,,deleterious(0.04),probably_damaging(0.984),1;TG,3_prime_UTR_variant,,ENST00000523756,,c.*4327C>G,MODIFIER,,,,1;TG,non_coding_transcript_exon_variant,,ENST00000522691,,n.200C>G,MODIFIER,,,,1\", \"G\", \"ENSG00000042832\", \"ENST00000220616\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"8154/8450\", \"8114/8307\", \"2705/2768\", \"P/R\", \"cCc/cGc\", \"None\", \"1\", \"None\", 1, \"TG\", \"HGNC\", \"HGNC:11764\", \"protein_coding\", \"YES\", \"CCDS34944.1\", \"ENSP00000220616\", \"P01266\", \"None\", \"UPI000013C79F\", \"NM_003235.4\", \"tolerated(0.05)\", \"benign(0.055)\", \"47/48\", \"None\", \"Pfam_domain:PF00135;Superfamily_domains:SSF53474;PIRSF_domain:PIRSF001831\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GCTCCCCAATC\", \"b78823c5-7acb-42d1-9103-aead55e160b4\", \"1c776a46-5f6c-438c-b682-7d5ed2f86749\", \"f9a2b377-a7c8-4b13-bf42-eea80cd46a8f\", \"cf2a1b98-5693-4c04-9167-f85e69a88a4a\", \"None\", \"None\", \"True\", \"Unknown\", \"muse\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-12-0619\", \"TCGA-12-0619-01A\", \"TCGA-12-0619-10A\", \"TCGA-12-0619-01A-01D-1492-08\", \"TCGA-12-0619-10A-01D-1492-08\", \"RSPH6A\", 81492, \"BI\", \"GRCh38\", \"chr19\", 45815069, 45815069, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"79c65ab5-1924-4710-96e4-31e9a615a53e\", \"3eae6dd0-7740-4b61-918a-5d7ba6eb042e\", \"c.108G>A\", \"p.=\", \"p.L36L\", \"ENST00000221538\", \"1/6\", \"121|104|123|98\", \"63|52|65|50\", \"58|52|58|48\", \"146|120|147|107\", \"RSPH6A,synonymous_variant,p.L36L,ENST00000221538,NM_030785.3,c.108G>A,LOW,YES,,,-1;RSPH6A,synonymous_variant,p.L36L,ENST00000597055,,c.108G>A,LOW,,,,-1;SYMPK,downstream_gene_variant,,ENST00000599814,,,MODIFIER,,,,-1;SYMPK,downstream_gene_variant,,ENST00000599460,,,MODIFIER,,,,-1;SYMPK,downstream_gene_variant,,ENST00000245934,NM_004819.2,,MODIFIER,YES,,,-1;RSPH6A,upstream_gene_variant,,ENST00000600188,,,MODIFIER,,,,-1;SYMPK,downstream_gene_variant,,ENST00000598155,,,MODIFIER,,,,-1;SYMPK,downstream_gene_variant,,ENST00000600237,,,MODIFIER,,,,-1;SYMPK,downstream_gene_variant,,ENST00000593504,,,MODIFIER,,,,-1;SYMPK,downstream_gene_variant,,ENST00000598329,,,MODIFIER,,,,-1;SYMPK,downstream_gene_variant,,ENST00000598364,,,MODIFIER,,,,-1;SYMPK,downstream_gene_variant,,ENST00000596824,,,MODIFIER,,,,-1\", \"T\", \"ENSG00000104941\", \"ENST00000221538\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"251/2456\", \"108/2154\", \"36/717\", \"L\", \"ctG/ctA\", \"None\", \"1\", \"None\", -1, \"RSPH6A\", \"HGNC\", \"HGNC:14241\", \"protein_coding\", \"YES\", \"CCDS12675.1\", \"ENSP00000221538\", \"Q9H0K4\", \"None\", \"UPI0000037C58\", \"NM_030785.3\", \"None\", \"None\", \"1/6\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GCTGCCAGGGC\", \"423a43cb-f03c-4303-8462-6e558bda25e4|946356e6-7016-433f-a5b9-7c0f1f560c5a|50f8695d-79b2-4e81-8d11-aad1d6620e2a|3b11e6cc-c339-459d-9b95-b9c9cfd1711d\", \"004f9cd4-922a-4506-ad0e-78b3f6fe412d\", \"7095ef87-ce31-4371-9a8f-80645228adc3\", \"0389b35b-651b-4776-b12a-d315a100f47c\", \"None\", \"COSM2153640\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-19-5952\", \"TCGA-19-5952-01A\", \"TCGA-19-5952-10A\", \"TCGA-19-5952-01A-11D-1696-08\", \"TCGA-19-5952-10A-01D-1696-08\", \"FBXO38\", 81545, \"BI\", \"GRCh38\", \"chr5\", 148427733, 148427733, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"483cad63-ca73-4b31-b4c7-9d73f2cb4186\", \"1ed4b4f1-5d98-4490-87ee-303f7699f8f6\", \"c.2439C>T\", \"p.=\", \"p.S813S\", \"ENST00000340253\", \"15/22\", \"66|57|66|60\", \"53|46|53|48\", \"12|11|12|12\", \"49|47|49|43\", \"FBXO38,synonymous_variant,p.S813S,ENST00000340253,,c.2439C>T,LOW,,,,1;FBXO38,intron_variant,,ENST00000394370,NM_030793.4,c.2428+11C>T,MODIFIER,YES,,,1;FBXO38,intron_variant,,ENST00000296701,NM_001271723.1,c.1918+2032C>T,MODIFIER,,,,1;FBXO38,intron_variant,,ENST00000513826,,c.1918+2032C>T,MODIFIER,,,,1;CTD-2283N19.1,downstream_gene_variant,,ENST00000520980,,,MODIFIER,YES,,,-1;FBXO38,intron_variant,,ENST00000505399,,n.100+11C>T,MODIFIER,,,,1;FBXO38,downstream_gene_variant,,ENST00000514832,,,MODIFIER,,,,1\", \"T\", \"ENSG00000145868\", \"ENST00000340253\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"2607/4424\", \"2439/3567\", \"813/1188\", \"S\", \"tcC/tcT\", \"None\", \"1\", \"None\", 1, \"FBXO38\", \"HGNC\", \"HGNC:28844\", \"protein_coding\", \"None\", \"None\", \"ENSP00000342023\", \"Q6PIJ6\", \"None\", \"UPI000020CF2A\", \"None\", \"None\", \"None\", \"15/22\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"None\", \"SNV\", 5.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AGATCCGCCTT\", \"7c0562ce-c172-4944-a28a-c75718dbef47|ff60966a-4a30-4472-b169-689a256f111f|028602b1-24e0-4760-b336-beee0a2ea059|121f72af-1847-437f-8675-da3500792aa1\", \"0d2d220c-108b-49ba-964a-57420e439b64\", \"33964ceb-986b-439a-89f8-041fbb219673\", \"ef36cbd1-5d7d-4756-a628-b5339d41e228\", \"None\", \"COSM3409978\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-CS-4942\", \"TCGA-CS-4942-01A\", \"TCGA-CS-4942-10A\", \"TCGA-CS-4942-01A-01D-1468-08\", \"TCGA-CS-4942-10A-01D-1468-08\", \"IDH1\", 3417, \"BI\", \"GRCh38\", \"chr2\", 208248388, 208248388, \"+\", \"Missense_Mutation\", \"SNP\", \"C\", \"C\", \"T\", \"rs121913500\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"ee5832e7-577c-4507-a4fd-a70646fabc24\", \"f2b83686-8044-4e74-9554-8b4d3c40b2b2\", \"c.395G>A\", \"p.Arg132His\", \"p.R132H\", \"ENST00000345146\", \"4/10\", \"135|127|135|104\", \"97|88|97|71\", \"38|39|38|33\", \"176|168|176|138\", \"IDH1,missense_variant,p.R132H,ENST00000415913,NM_001282387.1,c.395G>A,MODERATE,YES,deleterious_low_confidence(0.01),possibly_damaging(0.813),-1;IDH1,missense_variant,p.R132H,ENST00000345146,NM_005896.3,c.395G>A,MODERATE,,deleterious_low_confidence(0.01),possibly_damaging(0.813),-1;IDH1,missense_variant,p.R132H,ENST00000446179,NM_001282386.1,c.395G>A,MODERATE,,deleterious_low_confidence(0.01),possibly_damaging(0.813),-1;IDH1,missense_variant,p.R132H,ENST00000415282,,c.395G>A,MODERATE,,deleterious_low_confidence(0.02),possibly_damaging(0.813),-1;IDH1,downstream_gene_variant,,ENST00000417583,,,MODIFIER,,,,-1;IDH1,downstream_gene_variant,,ENST00000451391,,,MODIFIER,,,,-1;IDH1,non_coding_transcript_exon_variant,,ENST00000462386,,n.608G>A,MODIFIER,,,,-1;IDH1,downstream_gene_variant,,ENST00000481557,,,MODIFIER,,,,-1\", \"T\", \"ENSG00000138413\", \"ENST00000345146\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"680/2382\", \"395/1245\", \"132/414\", \"R/H\", \"cGt/cAt\", \"rs121913500\", \"1\", \"None\", -1, \"IDH1\", \"HGNC\", \"HGNC:5382\", \"protein_coding\", \"None\", \"CCDS2381.1\", \"ENSP00000260985\", \"O75874\", \"V9HWJ2\", \"UPI000012D1B4\", \"NM_005896.3\", \"deleterious_low_confidence(0.01)\", \"possibly_damaging(0.813)\", \"4/10\", \"None\", \"Pfam_domain:PF00180;TIGRFAM_domain:TIGR00127;Superfamily_domains:SSF53659;PIRSF_domain:PIRSF000108\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"pathogenic\", \"None\", \"None\", \"MODERATE\", \"None\", \"SNV\", 1.0, NaN, \"1\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CATGACGACCT\", \"19fa9076-55ed-4824-be2a-254c805f0750|cc2c6ed5-9f2a-4832-8148-3b2297406496|94eea079-f4ad-4f3d-bc34-fd28e5e3ba61|1a266d21-8be2-43fc-a84b-a67c3132572b\", \"889a30d3-143e-44da-bf87-bcc4d0680583\", \"9a50b841-c10d-45c4-8be8-36b73ccbdd6f\", \"230f5fa7-aa36-41ea-b40b-08f520767bd5\", \"None\", \"COSM28746\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DH-A7UR\", \"TCGA-DH-A7UR-01A\", \"TCGA-DH-A7UR-10A\", \"TCGA-DH-A7UR-01A-11D-A33T-08\", \"TCGA-DH-A7UR-10A-01D-A33W-08\", \"GLRA3\", 8001, \"BI\", \"GRCh38\", \"chr4\", 174643641, 174643641, \"+\", \"3'UTR\", \"SNP\", \"T\", \"T\", \"C\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"f04342d6-2f32-40ec-a731-3e7bd18ffffe\", \"bfcd7244-5a98-40a6-9328-e7fe970754e9\", \"c.*145A>G\", \"None\", \"None\", \"ENST00000274093\", \"10/10\", \"42\", \"25\", \"17\", \"52|51|52|51\", \"GLRA3,3_prime_UTR_variant,,ENST00000274093,NM_006529.3,c.*145A>G,MODIFIER,YES,,,-1;GLRA3,3_prime_UTR_variant,,ENST00000340217,NM_001042543.2,c.*145A>G,MODIFIER,,,,-1\", \"C\", \"ENSG00000145451\", \"ENST00000274093\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"2043/8770\", \"-/1395\", \"-/464\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"GLRA3\", \"HGNC\", \"HGNC:4328\", \"protein_coding\", \"YES\", \"CCDS3822.1\", \"ENSP00000274093\", \"O75311\", \"None\", \"UPI0000001C50\", \"NM_006529.3\", \"None\", \"None\", \"10/10\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"ATAGCTAACCA\", \"fdd5a580-bebc-4ff8-a4e2-0e874b8f6997|f89fe50e-bb83-4635-984b-fc3d02215fb8|cd5d55b2-e823-414a-86c3-3a71b2027fc8|45622ffb-bc4f-4738-819b-eb0a2824c908\", \"93a5574f-8183-4263-a549-82a16aec2928\", \"9f621360-b07a-4648-9e99-a41e4665c9a7\", \"b37abdc8-b9e3-4f1a-b16d-2e59442db335\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-5874\", \"TCGA-DU-5874-01A\", \"TCGA-DU-5874-10A\", \"TCGA-DU-5874-01A-11D-1705-08\", \"TCGA-DU-5874-10A-01D-1705-08\", \"ZNF197\", 10168, \"BI\", \"GRCh38\", \"chr3\", 44641931, 44641931, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"85d915b8-0184-4ec7-93ad-e9ffa2f5743b\", \"0b75be09-bdd0-435e-84ad-0624c781a430\", \"c.801G>A\", \"p.=\", \"p.V267V\", \"ENST00000344387\", \"6/6\", \"21\", \"15\", \"6\", \"27\", \"ZNF197,synonymous_variant,p.V267V,ENST00000396058,,c.801G>A,LOW,YES,,,1;ZNF197,synonymous_variant,p.V267V,ENST00000344387,NM_006991.3,c.801G>A,LOW,,,,1;ZNF197,intron_variant,,ENST00000383745,NM_001024855.1,c.770-4560G>A,MODIFIER,,,,1;ZNF197,intron_variant,,ENST00000383744,,c.770-4560G>A,MODIFIER,,,,1;RP11-944L7.4,intron_variant,,ENST00000457331,,n.220+19331C>T,MODIFIER,YES,,,-1;ZNF197,intron_variant,,ENST00000334075,,c.*381-4560G>A,MODIFIER,,,,1\", \"A\", \"ENSG00000186448\", \"ENST00000344387\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"986/3275\", \"801/3090\", \"267/1029\", \"V\", \"gtG/gtA\", \"None\", \"1\", \"None\", 1, \"ZNF197\", \"HGNC\", \"HGNC:12988\", \"protein_coding\", \"None\", \"CCDS2717.1\", \"ENSP00000345809\", \"O14709\", \"None\", \"UPI000013C317\", \"NM_006991.3\", \"None\", \"None\", \"6/6\", \"None\", \"PROSITE_profiles:PS50805;SMART_domains:SM00349;Superfamily_domains:SSF109640\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GAGGTGACATC\", \"b4490ee6-c591-44f1-8467-846894460191\", \"423d595f-df78-4e2b-a3c3-13647aee6127\", \"fcd2470c-2372-44bb-9a27-e22455b8b1e0\", \"1cc53ade-73c0-492b-a7dc-328269fd0e66\", \"None\", \"COSM3974424\", \"True\", \"Unknown\", \"muse\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-FG-8187\", \"TCGA-FG-8187-01A\", \"TCGA-FG-8187-10A\", \"TCGA-FG-8187-01A-11D-2253-08\", \"TCGA-FG-8187-10A-01D-2253-08\", \"CUBN\", 8029, \"BI\", \"GRCh38\", \"chr10\", 16950026, 16950026, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"rs565623595\", \"by1000G\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"03ef1338-e963-4cc2-a596-27334a685da3\", \"ae886eb1-4d03-4bb3-b9b4-ad379272ab7a\", \"c.5055C>T\", \"p.=\", \"p.G1685G\", \"ENST00000377833\", \"34/67\", \"60|55|60|43\", \"42|40|42|31\", \"18|15|18|12\", \"55|50|55|41\", \"CUBN,synonymous_variant,p.G1685G,ENST00000377833,NM_001081.3,c.5055C>T,LOW,YES,,,-1\", \"A\", \"ENSG00000107611\", \"ENST00000377833\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"5121/11949\", \"5055/10872\", \"1685/3623\", \"G\", \"ggC/ggT\", \"rs565623595\", \"1\", \"None\", -1, \"CUBN\", \"HGNC\", \"HGNC:2548\", \"protein_coding\", \"YES\", \"CCDS7113.1\", \"ENSP00000367064\", \"O60494\", \"None\", \"UPI00001AE8F4\", \"NM_001081.3\", \"None\", \"None\", \"34/67\", \"None\", \"Pfam_domain:PF00431;PROSITE_profiles:PS01180;SMART_domains:SM00042;Superfamily_domains:SSF49854\", \"0.0002\", \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"0.001\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"9.884e-05\", \"9.355e-05\", \"0\", \"0\", \"0\", \"0\", \"4.611e-05\", \"0.001157\", \"0.0004435\", \"PASS\", \"TGGCCGCCATC\", \"d24e9f4c-a95b-403f-b67a-ba86a4b5c46b|b29ec9e7-f585-40ee-ae8d-addebc33ccbf|266c5a6b-bcc9-4c86-81b6-bfc076330f61|1c63cfa7-ff33-48c9-9db1-00bf12d6c7bb\", \"ee52aacd-658d-42bc-9ff2-d6bd95b06751\", \"9f659f8e-9ce8-4c59-b1a3-7e35457416ad\", \"0df37550-9421-4571-9844-51b457d7cb2b\", \"common_in_exac\", \"COSM288166\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-7858\", \"TCGA-HT-7858-01A\", \"TCGA-HT-7858-10A\", \"TCGA-HT-7858-01A-11D-2395-08\", \"TCGA-HT-7858-10A-01D-2396-08\", \"MTMR3\", 8897, \"BI\", \"GRCh38\", \"chr22\", 30020533, 30020533, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"rs147400483\", \"byCluster;byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"59cdcd9b-04e6-43cb-9f34-562105029994\", \"10322624-d067-43ec-8617-7c45e71c9c3f\", \"c.2874C>T\", \"p.=\", \"p.C958C\", \"ENST00000401950\", \"17/20\", \"88|83|88|78\", \"60|59|60|55\", \"27|24|27|22\", \"94|94|94|89\", \"MTMR3,synonymous_variant,p.C958C,ENST00000333027,NM_153050.2,c.2874C>T,LOW,,,,1;MTMR3,synonymous_variant,p.C958C,ENST00000401950,NM_021090.3,c.2874C>T,LOW,YES,,,1;MTMR3,synonymous_variant,p.C822C,ENST00000323630,,c.2466C>T,LOW,,,,1;MTMR3,synonymous_variant,p.C958C,ENST00000351488,NM_153051.2,c.2874C>T,LOW,,,,1;MTMR3,synonymous_variant,p.C958C,ENST00000406629,,c.2874C>T,LOW,,,,1;RP3-394A18.1,non_coding_transcript_exon_variant,,ENST00000624945,,n.7704G>A,MODIFIER,YES,,,-1;HORMAD2-AS1,intron_variant,,ENST00000429350,,n.335-1804G>A,MODIFIER,YES,,,-1;HORMAD2-AS1,intron_variant,,ENST00000453743,,n.483-1804G>A,MODIFIER,,,,-1;MTMR3,upstream_gene_variant,,ENST00000491251,,,MODIFIER,,,,1;MTMR3,downstream_gene_variant,,ENST00000492087,,,MODIFIER,,,,1\", \"T\", \"ENSG00000100330\", \"ENST00000401950\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"3216/6018\", \"2874/3597\", \"958/1198\", \"C\", \"tgC/tgT\", \"rs147400483\", \"1\", \"None\", 1, \"MTMR3\", \"HGNC\", \"HGNC:7451\", \"protein_coding\", \"YES\", \"CCDS13870.1\", \"ENSP00000384651\", \"Q13615\", \"None\", \"UPI0000073EF2\", \"NM_021090.3\", \"None\", \"None\", \"17/20\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"0.0007\", \"0.0001\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"4.942e-05\", \"4.944e-05\", \"0.0003846\", \"0\", \"0\", \"0\", \"2.999e-05\", \"0\", \"0\", \"PASS\", \"CATTGCGCCAA\", \"49c999e7-2fa9-413b-a23d-d14b3aec40cd|32f2e4e4-2cb4-4956-8ee8-9ed7c4d01f5e|8d06519f-2f33-4d11-a780-08ced1592536|ca56efcd-f65d-4c03-bc11-e0c99c06ef5b\", \"eecbb138-b717-4e5b-babc-090553b1f017\", \"2da53b8b-ed81-4baa-b543-aa9eb3cda11a\", \"b6951c37-377e-49b9-862c-968082e8682f\", \"None\", \"COSM3972908;COSM82248;COSM82249\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-P5-A5EU\", \"TCGA-P5-A5EU-01A\", \"TCGA-P5-A5EU-10A\", \"TCGA-P5-A5EU-01A-11D-A27K-08\", \"TCGA-P5-A5EU-10A-01D-A27N-08\", \"MFNG\", 4242, \"BI\", \"GRCh38\", \"chr22\", 37486274, 37486274, \"+\", \"5'UTR\", \"SNP\", \"C\", \"C\", \"G\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina MiSeq\", \"090094cb-6e22-4409-938a-11d3107c33ef\", \"f66ea56c-7053-4147-bb40-9cab955d5957\", \"c.-97G>C\", \"None\", \"None\", \"ENST00000356998\", \"1/8\", \"9\", \"5\", \"4\", \"9|8|8\", \"MFNG,5_prime_UTR_variant,,ENST00000356998,NM_002405.3,c.-97G>C,MODIFIER,YES,,,-1;MFNG,5_prime_UTR_variant,,ENST00000416983,NM_001166343.1,c.-97G>C,MODIFIER,,,,-1;MFNG,5_prime_UTR_variant,,ENST00000424765,,c.-97G>C,MODIFIER,,,,-1;CARD10,downstream_gene_variant,,ENST00000403299,,,MODIFIER,YES,,,-1;CARD10,downstream_gene_variant,,ENST00000251973,NM_014550.3,,MODIFIER,,,,-1;CARD10,downstream_gene_variant,,ENST00000406271,,,MODIFIER,,,,-1;MFNG,upstream_gene_variant,,ENST00000436341,,,MODIFIER,,,,-1;MFNG,upstream_gene_variant,,ENST00000442496,,,MODIFIER,,,,-1;MFNG,5_prime_UTR_variant,,ENST00000438891,,c.-97G>C,MODIFIER,,,,-1;MFNG,5_prime_UTR_variant,,ENST00000430411,,c.-97G>C,MODIFIER,,,,-1;CARD10,downstream_gene_variant,,ENST00000488141,,,MODIFIER,,,,-1;CARD10,downstream_gene_variant,,ENST00000467812,,,MODIFIER,,,,-1\", \"G\", \"ENSG00000100060\", \"ENST00000356998\", \"Transcript\", \"5_prime_UTR_variant\", \"5_prime_UTR_variant\", \"128/2088\", \"-/966\", \"-/321\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"MFNG\", \"HGNC\", \"HGNC:7038\", \"protein_coding\", \"YES\", \"CCDS13947.1\", \"ENSP00000349490\", \"O00587\", \"None\", \"UPI000012F045\", \"NM_002405.3\", \"None\", \"None\", \"1/8\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AAAGTCTGGCA\", \"c5178e15-544f-49f3-8fc5-b3354bd9eaec|89659244-8d61-44c8-8f91-a8f34a9dae96|83f1b3d5-527e-4574-a552-fd1cd73d60b1\", \"c3315804-09ac-4c5e-88c0-6da4aa198b1d\", \"01cbf738-2dce-4122-a7fa-1d963e217d3c\", \"1aa6b9ff-7c97-47d9-923f-2bd83f20e531\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-P5-A72Z\", \"TCGA-P5-A72Z-01A\", \"TCGA-P5-A72Z-10A\", \"TCGA-P5-A72Z-01A-11D-A32B-08\", \"TCGA-P5-A72Z-10A-01D-A329-08\", \"USHBP1\", 83878, \"BI\", \"GRCh38\", \"chr19\", 17251670, 17251670, \"+\", \"Missense_Mutation\", \"SNP\", \"G\", \"G\", \"A\", \"rs139642055\", \"by1000G;byCluster\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"24e35407-c89c-4456-ae75-ac1a5c654d4e\", \"2cb82482-08eb-45d5-9002-c0470f357383\", \"c.1834C>T\", \"p.Arg612Cys\", \"p.R612C\", \"ENST00000252597\", \"12/13\", \"83|78|83|71\", \"38|36|38|32\", \"45|42|45|39\", \"93|93|93|83\", \"USHBP1,missense_variant,p.R612C,ENST00000252597,NM_031941.3,c.1834C>T,MODERATE,YES,deleterious(0.04),possibly_damaging(0.732),-1;USHBP1,missense_variant,p.R548C,ENST00000431146,NM_001297703.1,c.1642C>T,MODERATE,,deleterious(0.05),probably_damaging(0.931),-1;AC010646.3,5_prime_UTR_variant,,ENST00000594059,,c.-171C>T,MODIFIER,YES,,,-1;USHBP1,3_prime_UTR_variant,,ENST00000597928,,c.*2954C>T,MODIFIER,,,,-1;USHBP1,3_prime_UTR_variant,,ENST00000324554,,c.*800C>T,MODIFIER,,,,-1\", \"A\", \"ENSG00000130307\", \"ENST00000252597\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"2008/3335\", \"1834/2112\", \"612/703\", \"R/C\", \"Cgc/Tgc\", \"rs139642055\", \"1\", \"None\", -1, \"USHBP1\", \"HGNC\", \"HGNC:24058\", \"protein_coding\", \"YES\", \"CCDS12353.1\", \"ENSP00000252597\", \"Q8N6Y0\", \"A0A024R7H3\", \"UPI000006F7A8\", \"NM_031941.3\", \"deleterious(0.04)\", \"possibly_damaging(0.732)\", \"12/13\", \"None\", \"Coiled-coils_(Ncoils):ncoils;Low_complexity_(Seg):Seg\", \"0.0002\", \"0.0\", \"0.0\", \"0.001\", \"0.0\", \"0.0\", \"0.0011\", \"0.0001\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"2.636e-04\", \"0.0002642\", \"0.00135\", \"0.0002592\", \"0.0004638\", \"0\", \"0.0001353\", \"0.001109\", \"6.057e-05\", \"PASS|panel_of_normals|PASS|PASS\", \"CCTGCGCAGAG\", \"17d4b720-88f6-4ed5-951b-cad8f315dd54|f9a8f7d9-dfa4-428b-9445-32491eeb2106|9626a3f7-07f6-493e-9bc6-8d624263715f|4be787be-629d-4615-bff8-21bac190e0dd\", \"8f420fb3-60c6-45cb-ade9-0c0211981958\", \"49822c04-72bc-4da4-8a4d-e4a156e95cdb\", \"141f0546-f6f2-408f-ac86-07ca4aadf3d0\", \"common_in_exac;gdc_pon\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-QH-A6CS\", \"TCGA-QH-A6CS-01A\", \"TCGA-QH-A6CS-10A\", \"TCGA-QH-A6CS-01A-11D-A31L-08\", \"TCGA-QH-A6CS-10A-01D-A31J-08\", \"CCDC53\", 51019, \"BI\", \"GRCh38\", \"chr12\", 102039967, 102039967, \"+\", \"Silent\", \"SNP\", \"T\", \"T\", \"C\", \"rs748691290\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"bb6e8162-12a8-4f26-9d2e-46bbe8eac3f2\", \"e7b41454-99a5-4bbc-9ac4-ca4940c19eeb\", \"c.336A>G\", \"p.=\", \"p.T112T\", \"ENST00000240079\", \"5/7\", \"85|78\", \"73|66\", \"12\", \"107|95\", \"CCDC53,synonymous_variant,p.T112T,ENST00000240079,NM_016053.2,c.336A>G,LOW,YES,,,-1;CCDC53,synonymous_variant,p.T111T,ENST00000545679,NM_001301107.1,c.333A>G,LOW,,,,-1;CCDC53,intron_variant,,ENST00000542923,,c.174+4138A>G,MODIFIER,,,,-1;CCDC53,non_coding_transcript_exon_variant,,ENST00000539515,,n.429A>G,MODIFIER,,,,-1;CCDC53,synonymous_variant,p.T111T,ENST00000544341,,c.333A>G,LOW,,,,-1;CCDC53,synonymous_variant,p.T112T,ENST00000540536,,c.336A>G,LOW,,,,-1;CCDC53,3_prime_UTR_variant,,ENST00000535501,,c.*250A>G,MODIFIER,,,,-1;CCDC53,3_prime_UTR_variant,,ENST00000538761,,c.*291A>G,MODIFIER,,,,-1;CCDC53,3_prime_UTR_variant,,ENST00000500685,,c.*221A>G,MODIFIER,,,,-1;CCDC53,non_coding_transcript_exon_variant,,ENST00000536197,,n.468A>G,MODIFIER,,,,-1;CCDC53,non_coding_transcript_exon_variant,,ENST00000541569,,n.352A>G,MODIFIER,,,,-1;CCDC53,downstream_gene_variant,,ENST00000326351,,,MODIFIER,,,,-1\", \"C\", \"ENSG00000120860\", \"ENST00000240079\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"498/916\", \"336/585\", \"112/194\", \"T\", \"acA/acG\", \"rs748691290\", \"1\", \"None\", -1, \"CCDC53\", \"HGNC\", \"HGNC:24256\", \"protein_coding\", \"YES\", \"CCDS44959.1\", \"ENSP00000240079\", \"Q9Y3C0\", \"None\", \"UPI00001254D2\", \"NM_016053.2\", \"None\", \"None\", \"5/7\", \"None\", \"Pfam_domain:PF10152\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"8.278e-06\", \"8.286e-06\", \"0\", \"0\", \"0.0001159\", \"0\", \"0\", \"0\", \"0\", \"PASS\", \"TCTTGTGTACT\", \"3d55898f-cc0b-446b-a2bf-2d815f01739a|1a57f46d-b770-44d4-9940-485cf517c33b\", \"b25ca973-2738-454b-bfd4-cea37089f3fb\", \"7ef1940b-29c8-46ef-bef6-5847bea82a32\", \"6d17c327-435a-4cba-9626-3b5b7b7375bb\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect|varscan\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-S9-A6TZ\", \"TCGA-S9-A6TZ-01A\", \"TCGA-S9-A6TZ-10A\", \"TCGA-S9-A6TZ-01A-21D-A32B-08\", \"TCGA-S9-A6TZ-10A-01D-A329-08\", \"TCF12\", 6938, \"BI\", \"GRCh38\", \"chr15\", 57231199, 57231199, \"+\", \"Silent\", \"SNP\", \"T\", \"T\", \"G\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"b34ce7c2-7592-4123-8c4e-50c80b01c9dd\", \"18964457-ef9a-436c-8d75-b11c6c918e6e\", \"c.627T>G\", \"p.=\", \"p.P209P\", \"ENST00000267811\", \"9/20\", \"137|113\", \"99|78\", \"38|35\", \"165|136\", \"TCF12,missense_variant,p.L20R,ENST00000537840,,c.59T>G,MODERATE,,deleterious_low_confidence(0.05),unknown(0),1;TCF12,synonymous_variant,p.P209P,ENST00000267811,NM_207038.1&NM_003205.3,c.627T>G,LOW,,,,1;TCF12,synonymous_variant,p.P209P,ENST00000438423,NM_207036.1&NM_207037.1,c.627T>G,LOW,YES,,,1;TCF12,synonymous_variant,p.P209P,ENST00000333725,,c.627T>G,LOW,,,,1;TCF12,synonymous_variant,p.P209P,ENST00000557843,,c.627T>G,LOW,,,,1;TCF12,synonymous_variant,p.P39P,ENST00000343827,NM_207040.1,c.117T>G,LOW,,,,1;TCF12,synonymous_variant,p.P205P,ENST00000559609,,c.615T>G,LOW,,,,1;TCF12,synonymous_variant,p.P39P,ENST00000543579,,c.117T>G,LOW,,,,1;TCF12,non_coding_transcript_exon_variant,,ENST00000560764,,n.602T>G,MODIFIER,,,,1;TCF12,non_coding_transcript_exon_variant,,ENST00000561346,,n.362T>G,MODIFIER,,,,1;TCF12,non_coding_transcript_exon_variant,,ENST00000561235,,n.366T>G,MODIFIER,,,,1;TCF12,non_coding_transcript_exon_variant,,ENST00000560887,,n.487T>G,MODIFIER,,,,1;TCF12,intron_variant,,ENST00000560190,,n.403-41831T>G,MODIFIER,,,,1\", \"G\", \"ENSG00000140262\", \"ENST00000267811\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"931/6061\", \"627/2049\", \"209/682\", \"P\", \"ccT/ccG\", \"None\", \"1\", \"None\", 1, \"TCF12\", \"HGNC\", \"HGNC:11623\", \"protein_coding\", \"None\", \"CCDS10159.1\", \"ENSP00000267811\", \"Q99081\", \"A0A024R5T1\", \"None\", \"NM_207038.1;NM_003205.3\", \"None\", \"None\", \"9/20\", \"None\", \"Low_complexity_(Seg):Seg;PROSITE_profiles:PS50324\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TCTCCTAGTTA\", \"c7c95c74-7755-47e5-90f2-a7469dd2f9cd|88cb9799-878e-4e7d-b1cb-efe9c57d369e\", \"ee8fdc21-65e4-4c56-800d-2b83949de319\", \"05e8124f-fc37-42b9-a113-a40c6359e253\", \"b297c4dc-ec58-4392-908a-586e81d57ef0\", \"None\", \"None\", \"True\", \"Unknown\", \"somaticsniper|varscan\", \"76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-06-A7TL\", \"TCGA-06-A7TL-01A\", \"TCGA-06-A7TL-10A\", \"TCGA-06-A7TL-01A-11D-A391-08\", \"TCGA-06-A7TL-10A-01D-A394-08\", \"SPTBN2\", 6712, \"BI\", \"GRCh38\", \"chr11\", 66714123, 66714123, \"+\", \"Silent\", \"SNP\", \"T\", \"T\", \"C\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"6eb4ee61-001b-403e-8e0e-c197e85cb8fb\", \"11748ab9-5af5-4116-bd2b-ed9308573a20\", \"c.624A>G\", \"p.=\", \"p.G208G\", \"ENST00000309996\", \"6/37\", \"95|93|95|84\", \"53|51|53|44\", \"42|42|42|40\", \"103|103|103|81\", \"SPTBN2,synonymous_variant,p.G208G,ENST00000533211,,c.624A>G,LOW,YES,,,-1;SPTBN2,synonymous_variant,p.G208G,ENST00000529997,,c.624A>G,LOW,,,,-1;SPTBN2,synonymous_variant,p.G208G,ENST00000309996,NM_006946.2,c.624A>G,LOW,,,,-1;SPTBN2,synonymous_variant,p.G208G,ENST00000617502,,c.624A>G,LOW,,,,-1;SPTBN2,synonymous_variant,p.G208G,ENST00000611817,,c.624A>G,LOW,,,,-1;SPTBN2,downstream_gene_variant,,ENST00000527010,,,MODIFIER,,,,-1;RN7SL12P,upstream_gene_variant,,ENST00000473849,,,MODIFIER,YES,,,-1\", \"C\", \"ENSG00000173898\", \"ENST00000309996\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"696/7866\", \"624/7173\", \"208/2390\", \"G\", \"ggA/ggG\", \"None\", \"1\", \"None\", -1, \"SPTBN2\", \"HGNC\", \"HGNC:11276\", \"protein_coding\", \"None\", \"CCDS8150.1\", \"ENSP00000311489\", \"O15020\", \"None\", \"UPI000013EF83\", \"NM_006946.2\", \"None\", \"None\", \"6/37\", \"None\", \"Pfam_domain:PF00307;Pfam_domain:PF11971;SMART_domains:SM00033;PROSITE_profiles:PS50021;Superfamily_domains:SSF47576;PIRSF_domain:PIRSF002297\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GCTAGTCCATC\", \"57ba1f13-a4cc-4bf4-81b6-e5c510392815|0cb297eb-9e78-4c88-b828-ec1a7ff1c7c5|edd926b8-1d6c-4979-9a4f-f4df7a5d69e1|5800c015-38ad-4a25-a569-1a2b468fa04f\", \"49278925-4b6e-4246-bd28-33ccb6dfee46\", \"d9c35e06-690c-498d-b726-d2b05edb371c\", \"0ca72ebd-ff33-45b8-a97c-3f1435603d71\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DB-5275\", \"TCGA-DB-5275-01A\", \"TCGA-DB-5275-10A\", \"TCGA-DB-5275-01A-01D-1468-08\", \"TCGA-DB-5275-10A-01D-1468-08\", \"MAGEL2\", 54551, \"BI\", \"GRCh38\", \"chr15\", 23645331, 23645331, \"+\", \"Silent\", \"SNP\", \"A\", \"A\", \"G\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"cc50e0af-23d9-4528-b5ac-3974449bc1aa\", \"12ee7643-7bc5-4051-baa7-d1f9a6245fa1\", \"c.2412T>C\", \"p.=\", \"p.F804F\", \"ENST00000532292\", \"1/1\", \"163\", \"155\", \"8\", \"95\", \"MAGEL2,synonymous_variant,p.F804F,ENST00000532292,NM_019066.4,c.2412T>C,LOW,YES,,,-1\", \"G\", \"ENSG00000254585\", \"ENST00000532292\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"2511/4298\", \"2412/3750\", \"804/1249\", \"F\", \"ttT/ttC\", \"None\", \"1\", \"None\", -1, \"MAGEL2\", \"HGNC\", \"HGNC:6814\", \"protein_coding\", \"YES\", \"CCDS73700.1\", \"ENSP00000433433\", \"None\", \"H0YDD5\", \"UPI0001B3CB28\", \"NM_019066.4\", \"None\", \"None\", \"1/1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", NaN, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CCTTTAAAGGC\", \"404490f1-8ef6-4f82-813f-2a42be20349a\", \"aafd6d73-01f1-4f47-bbb5-e06b4d6e554c\", \"ecf9a37e-65ab-4162-93b6-5df50b40a20b\", \"bbfb5399-8d43-4b75-bf90-23ec142697d7\", \"None\", \"COSM3969030;COSM3969031\", \"True\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DB-A64P\", \"TCGA-DB-A64P-01A\", \"TCGA-DB-A64P-10A\", \"TCGA-DB-A64P-01A-11D-A29Q-08\", \"TCGA-DB-A64P-10A-01D-A29Q-08\", \"FUBP1\", 8880, \"BI\", \"GRCh38\", \"chr1\", 77968164, 77968167, \"+\", \"Splice_Site\", \"DEL\", \"CAGT\", \"CAGT\", \"-\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina MiSeq\", \"5864a37b-dfec-475c-95f4-2426c8e2772c\", \"0bb265d4-0ce6-4374-890c-3f9e096dab5e\", \"c.248_250+1delACTG\", \"None\", \"p.X83_splice\", \"ENST00000370768\", \"3/20\", \"18\", \"14\", \"4\", \"33\", \"FUBP1,splice_donor_variant,p.X83_splice,ENST00000370767,,c.248_250+1delACTG,HIGH,,,,-1;FUBP1,splice_donor_variant,p.X83_splice,ENST00000370768,NM_003902.3,c.248_250+1delACTG,HIGH,YES,,,-1;FUBP1,splice_donor_variant,p.X104_splice,ENST00000421641,,c.311_313+1delACTG,HIGH,,,,-1;FUBP1,splice_donor_variant,p.X83_splice,ENST00000294623,,c.248_250+1delACTG,HIGH,,,,-1\", \"-\", \"ENSG00000162613\", \"ENST00000370768\", \"Transcript\", \"splice_donor_variant\", \"splice_donor_variant;coding_sequence_variant\", \"330-?/2378\", \"248-?/1935\", \"83-?/644\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"FUBP1\", \"HGNC\", \"HGNC:4004\", \"protein_coding\", \"YES\", \"CCDS683.1\", \"ENSP00000359804\", \"Q96AE4\", \"None\", \"UPI0000070218\", \"NM_003902.3\", \"None\", \"None\", \"3/20\", \"3/19\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HIGH\", \"1\", \"deletion\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TACTTACAGTCATTT\", \"0b1e21d8-55c5-4a15-8cea-a1db4bdec0c8\", \"bde311b5-3fc4-455c-b085-0402b96ec91c\", \"a2abd386-dae0-49e2-b353-fcb4219e007e\", \"12f02422-585d-4068-bbde-bc279c6a89ab\", \"None\", \"COSM132837;COSM1716755;COSM5731340;COSM5731341\", \"False\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-6394\", \"TCGA-DU-6394-01A\", \"TCGA-DU-6394-10A\", \"TCGA-DU-6394-01A-11D-1705-08\", \"TCGA-DU-6394-10A-01D-1705-08\", \"GADD45B\", 4616, \"BI\", \"GRCh38\", \"chr19\", 2476507, 2476507, \"+\", \"Intron\", \"SNP\", \"G\", \"G\", \"C\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"611b0bd5-fb3a-4c10-999c-e4b3f6980d0b\", \"d7371b5d-ee62-450e-bc22-082b1de3911b\", \"c.45-22G>C\", \"None\", \"None\", \"ENST00000215631\", \"None\", \"45|41|45|43\", \"31|29|31|30\", \"13|12|13|12\", \"46|42|46|40\", \"GADD45B,5_prime_UTR_variant,,ENST00000593043,,c.-23G>C,MODIFIER,,,,1;GADD45B,intron_variant,,ENST00000215631,NM_015675.3,c.45-22G>C,MODIFIER,YES,,,1;GADD45B,intron_variant,,ENST00000587345,,c.45-22G>C,MODIFIER,,,,1;GADD45B,intron_variant,,ENST00000587887,,c.-1-22G>C,MODIFIER,,,,1;GADD45B,non_coding_transcript_exon_variant,,ENST00000586759,,n.386G>C,MODIFIER,,,,1;GADD45B,intron_variant,,ENST00000592937,,n.277-22G>C,MODIFIER,,,,1;GADD45B,intron_variant,,ENST00000585359,,c.45-22G>C,MODIFIER,,,,1\", \"C\", \"ENSG00000099860\", \"ENST00000215631\", \"Transcript\", \"intron_variant\", \"intron_variant\", \"-/1373\", \"-/483\", \"-/160\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"GADD45B\", \"HGNC\", \"HGNC:4096\", \"protein_coding\", \"YES\", \"CCDS32868.1\", \"ENSP00000215631\", \"O75293\", \"None\", \"UPI000012AEF0\", \"NM_015675.3\", \"None\", \"None\", \"None\", \"1/3\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TCACTGATCCC\", \"82ce9849-e501-4774-b8b9-6a470f10f714|17601ced-e953-4bf1-8aea-0892509bfe52|78712c11-9c00-4bb6-a06a-d5612a783eb3|5a86d611-b256-4c41-9c12-e022dfdd3341\", \"3d53f1da-be57-4768-b9f4-96cfb196295e\", \"fcc48248-23f2-42ec-a542-a9ba69733d9c\", \"42cc9620-98fb-4164-a3b2-28d084ca5a03\", \"None\", \"None\", \"False\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-7300\", \"TCGA-DU-7300-01A\", \"TCGA-DU-7300-10A\", \"TCGA-DU-7300-01A-21D-2086-08\", \"TCGA-DU-7300-10A-01D-2086-08\", \"SVILP1\", 645954, \"BI\", \"GRCh38\", \"chr10\", 30709372, 30709372, \"+\", \"RNA\", \"SNP\", \"T\", \"T\", \"C\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"41bb7bd2-c24e-41ae-881d-25b44ae287ad\", \"2de73131-9a0c-46fc-aa61-6d35f76f75d2\", \"n.2004T>C\", \"None\", \"None\", \"ENST00000422642\", \"14/18\", \"105|95|79\", \"88|80|66\", \"16|15|13\", \"108|94|77\", \"SVILP1,non_coding_transcript_exon_variant,,ENST00000422642,,n.2004T>C,MODIFIER,YES,,,1\", \"C\", \"ENSG00000234814\", \"ENST00000422642\", \"Transcript\", \"non_coding_transcript_exon_variant\", \"non_coding_transcript_exon_variant;non_coding_transcript_variant\", \"2004/2592\", \"None\", \"None\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"SVILP1\", \"HGNC\", \"HGNC:44959\", \"transcribed_unprocessed_pseudogene\", \"YES\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"14/18\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", NaN, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CGGAGTTCGTG\", \"c3251242-655d-4b8f-b7af-eb3d45d53a20|f3fd1d9d-e22d-441a-910a-6503008c708d|40ccee10-1688-4f1b-bdc9-86e7e864c5f2\", \"f8e99fbc-3dcd-4da5-9939-f2bb08c6415a\", \"4cf6afc4-48e1-46c0-bf43-96fde34cd12f\", \"a144e4e4-2877-4340-a2bf-524adbde8bc8\", \"None\", \"COSN8634558\", \"False\", \"Unknown\", \"muse|mutect|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-7855\", \"TCGA-HT-7855-01A\", \"TCGA-HT-7855-10A\", \"TCGA-HT-7855-01A-11D-2395-08\", \"TCGA-HT-7855-10A-01D-2396-08\", \"YTHDC1\", 91746, \"BI\", \"GRCh38\", \"chr4\", 68337590, 68337592, \"+\", \"In_Frame_Del\", \"DEL\", \"AGG\", \"AGG\", \"-\", \"rs751051650\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"1bc9fea0-cb11-47c4-bfe6-a813ee66a3eb\", \"0ba77c15-05f7-4769-8070-6a2a63a9f466\", \"c.439_441delCCT\", \"p.Pro147del\", \"p.P147del\", \"ENST00000344157\", \"3/17\", \"61|55\", \"35\", \"26|20\", \"35|31\", \"YTHDC1,inframe_deletion,p.P147del,ENST00000344157,NM_001031732.2,c.439_441delCCT,MODERATE,YES,,,-1;YTHDC1,inframe_deletion,p.P147del,ENST00000355665,NM_133370.2,c.439_441delCCT,MODERATE,,,,-1;YTHDC1,inframe_deletion,p.P147del,ENST00000579690,,c.439_441delCCT,MODERATE,,,,-1;YTHDC1,downstream_gene_variant,,ENST00000510746,,,MODIFIER,,,,-1;YTHDC1,downstream_gene_variant,,ENST00000505251,,,MODIFIER,,,,-1\", \"-\", \"ENSG00000083896\", \"ENST00000344157\", \"Transcript\", \"inframe_deletion\", \"inframe_deletion\", \"775-777/6232\", \"439-441/2184\", \"147/727\", \"P/-\", \"CCT/-\", \"rs751051650\", \"1\", \"None\", -1, \"YTHDC1\", \"HGNC\", \"HGNC:30626\", \"protein_coding\", \"YES\", \"CCDS33992.1\", \"ENSP00000339245\", \"Q96MU7\", \"None\", \"UPI000020B86D\", \"NM_001031732.2\", \"None\", \"None\", \"3/17\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"deletion\", 1.0, NaN, \"None\", \"1\", \"8.237e-06\", \"8.377e-06\", \"0\", \"8.711e-05\", \"0\", \"0\", \"0\", \"0\", \"0\", \"PASS\", \"TGGCGTAGGAGATT\", \"82151d21-20b9-42cb-8ad1-461114124796|7e85537a-1edb-4dee-bc9d-49911bff1918\", \"caa756ea-b892-4b96-a631-7f2665f266ae\", \"fce7bebc-677d-4232-b2df-467958d22b17\", \"40343ebd-0d62-401e-83a4-6cdb57662ec0\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect|varscan\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-8558\", \"TCGA-HT-8558-01A\", \"TCGA-HT-8558-10A\", \"TCGA-HT-8558-01A-21D-2395-08\", \"TCGA-HT-8558-10A-01D-2396-08\", \"LAMB4\", 22798, \"BI\", \"GRCh38\", \"chr7\", 108049518, 108049519, \"+\", \"Frame_Shift_Ins\", \"INS\", \"-\", \"-\", \"GTAAGGTCAAAGCA\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"39730eb2-7516-40fe-9d21-c44df7ac4c82\", \"2c877cd5-7754-43f2-9b8e-d7179110ee18\", \"c.3929_3930insTGCTTTGACCTTAC\", \"p.Ile1311AlafsTer41\", \"p.I1311Afs*41\", \"ENST00000205386\", \"27/34\", \"17\", \"15\", \"2\", \"22\", \"LAMB4,frameshift_variant,p.I1311Afs*41,ENST00000388781,NM_007356.2,c.3929_3930insTGCTTTGACCTTAC,HIGH,YES,,,-1;LAMB4,frameshift_variant,p.I1311Afs*41,ENST00000205386,,c.3929_3930insTGCTTTGACCTTAC,HIGH,,,,-1;LAMB4,frameshift_variant,p.I337Afs*41,ENST00000422975,,c.1007_1008insTGCTTTGACCTTAC,HIGH,,,,-1\", \"GTAAGGTCAAAGCA\", \"ENSG00000091128\", \"ENST00000205386\", \"Transcript\", \"frameshift_variant\", \"frameshift_variant\", \"4009-4010/5857\", \"3929-3930/5286\", \"1310/1761\", \"N/NALTLX\", \"aac/aaTGCTTTGACCTTACc\", \"None\", \"1\", \"None\", -1, \"LAMB4\", \"HGNC\", \"HGNC:6491\", \"protein_coding\", \"None\", \"CCDS34732.1\", \"ENSP00000205386\", \"A4D0S4\", \"None\", \"UPI0000198CD5\", \"None\", \"None\", \"None\", \"27/34\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HIGH\", \"None\", \"insertion\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TTGATGTTTTC\", \"e5305a91-5cdf-4860-bafb-60ef5b0e2af9\", \"632a1999-d438-4338-8e6c-009decaede30\", \"7fd70779-154e-43d1-bca6-c7504b104981\", \"9b288f0e-5155-4736-bc22-e0e801d8b738\", \"None\", \"None\", \"False\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-TM-A84J\", \"TCGA-TM-A84J-01A\", \"TCGA-TM-A84J-10A\", \"TCGA-TM-A84J-01A-11D-A36O-08\", \"TCGA-TM-A84J-10A-01D-A367-08\", \"ASH1L\", 55870, \"BI\", \"GRCh38\", \"chr1\", 155337602, 155337602, \"+\", \"3'UTR\", \"DEL\", \"G\", \"G\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"d4929553-67d7-45f4-ab30-e8218b0fe697\", \"7a11066b-492d-4df1-8136-7bd2739786ba\", \"c.*58delC\", \"None\", \"None\", \"ENST00000368346\", \"28/28\", \"80|75\", \"42|41\", \"38|34\", \"129|123\", \"ASH1L,3_prime_UTR_variant,,ENST00000368346,,c.*58delC,MODIFIER,,,,-1;ASH1L,3_prime_UTR_variant,,ENST00000392403,NM_018489.2,c.*58delC,MODIFIER,YES,,,-1\", \"-\", \"ENSG00000116539\", \"ENST00000368346\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"9608/11942\", \"-/8910\", \"-/2969\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"ASH1L\", \"HGNC\", \"HGNC:19088\", \"protein_coding\", \"None\", \"None\", \"ENSP00000357330\", \"Q9NR48\", \"None\", \"UPI000013D5D2\", \"None\", \"None\", \"None\", \"28/28\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"None\", \"deletion\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GCAGGAGGCAGG\", \"89d0d3c4-28b0-48d0-9927-89111b849fe0|b74cffce-9fe8-44a8-b354-e7adc3dbda0e\", \"5fb7b1ff-a351-48f7-8022-3adc20c96a2a\", \"17f4e8e1-107a-4e62-9af9-b7b6dd2b43ff\", \"b3720405-ce3f-49c7-a5d9-bbffd06f6aef\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect|varscan\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-TQ-A7RM\", \"TCGA-TQ-A7RM-01A\", \"TCGA-TQ-A7RM-10A\", \"TCGA-TQ-A7RM-01A-11D-A33T-08\", \"TCGA-TQ-A7RM-10A-01D-A33W-08\", \"RS1\", 6247, \"BI\", \"GRCh38\", \"chrX\", 18642139, 18642139, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"rs767660711\", \"byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"a2582eaf-86b7-466a-a917-c3ad6e2ee5c2\", \"38f796fb-0896-4893-a7e4-9f2ac6290a42\", \"c.540G>A\", \"p.=\", \"p.S180S\", \"ENST00000379984\", \"6/6\", \"216|211|216|188\", \"166|162|166|145\", \"50|49|50|43\", \"134|132|134|113\", \"RS1,synonymous_variant,p.S180S,ENST00000379984,NM_000330.3,c.540G>A,LOW,YES,,,-1;CDKL5,intron_variant,,ENST00000379989,NM_001037343.1,c.2714-3868C>T,MODIFIER,YES,,,1;CDKL5,intron_variant,,ENST00000379996,NM_003159.2,c.2714-3868C>T,MODIFIER,,,,1;CDKL5,downstream_gene_variant,,ENST00000623535,,,MODIFIER,,,,1;RS1,non_coding_transcript_exon_variant,,ENST00000476595,,n.1031G>A,MODIFIER,,,,-1\", \"T\", \"ENSG00000102104\", \"ENST00000379984\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"581/2810\", \"540/675\", \"180/224\", \"S\", \"tcG/tcA\", \"rs767660711\", \"1\", \"None\", -1, \"RS1\", \"HGNC\", \"HGNC:10457\", \"protein_coding\", \"YES\", \"CCDS14187.1\", \"ENSP00000369320\", \"O15537\", \"None\", \"UPI0000139001\", \"NM_000330.3\", \"None\", \"None\", \"6/6\", \"None\", \"Pfam_domain:PF00754;PROSITE_profiles:PS50022;SMART_domains:SM00231;Superfamily_domains:SSF49785\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"2.471e-05\", \"2.283e-05\", \"0\", \"0\", \"0.0001509\", \"0\", \"2.089e-05\", \"0\", \"0\", \"PASS\", \"CGGTCCGAGTT\", \"d88edd1e-246b-4c7a-8e49-f029ffca7769|08483afa-5d99-44c4-9e7c-d90298361740|45b34ae1-218e-407b-9dcc-54b9a209d49a|182ad89a-025b-491d-9094-da73ca4886a8\", \"e81ecc22-c399-4d35-b4b0-abcec7f895d5\", \"c295e211-1e1a-4369-8889-a51442cba979\", \"3431a71c-fabf-440c-b11c-8acfee04724f\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-06-A6S0\", \"TCGA-06-A6S0-01A\", \"TCGA-06-A6S0-10A\", \"TCGA-06-A6S0-01A-11D-A33T-08\", \"TCGA-06-A6S0-10A-01D-A33W-08\", \"NEB\", 4703, \"BI\", \"GRCh38\", \"chr2\", 151614315, 151614315, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"rs376268872\", \"byCluster;byFrequency\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"2a88e419-bf11-49f7-8e77-5c3658d91f63\", \"d32d4697-46bd-4715-9e86-9460df18ee78\", \"c.10833C>T\", \"p.=\", \"p.D3611D\", \"ENST00000172853\", \"73/149\", \"89|89|89|83\", \"44|44|44|41\", \"45|45|45|42\", \"93|90|93|87\", \"NEB,synonymous_variant,p.D3854D,ENST00000618972,NM_001271208.1,c.11562C>T,LOW,YES,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000427231,NM_001164507.1,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000397345,NM_001164508.1,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000603639,,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000604864,,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3611D,ENST00000409198,NM_004543.4,c.10833C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3611D,ENST00000172853,,c.10833C>T,LOW,,,,-1;NEB,downstream_gene_variant,,ENST00000486320,,,MODIFIER,,,,-1|NEB,synonymous_variant,p.D3854D,ENST00000618972,NM_001271208.1,c.11562C>T,LOW,YES,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000397345,NM_001164508.1,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000427231,NM_001164507.1,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000604864,,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000603639,,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3611D,ENST00000409198,NM_004543.4,c.10833C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3611D,ENST00000172853,,c.10833C>T,LOW,,,,-1;NEB,downstream_gene_variant,,ENST00000486320,,,MODIFIER,,,,-1|NEB,synonymous_variant,p.D3854D,ENST00000618972,NM_001271208.1,c.11562C>T,LOW,YES,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000427231,NM_001164507.1,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000397345,NM_001164508.1,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000603639,,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000604864,,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3611D,ENST00000409198,NM_004543.4,c.10833C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3611D,ENST00000172853,,c.10833C>T,LOW,,,,-1;NEB,downstream_gene_variant,,ENST00000486320,,,MODIFIER,,,,-1|NEB,synonymous_variant,p.D3854D,ENST00000618972,NM_001271208.1,c.11562C>T,LOW,YES,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000427231,NM_001164507.1,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000397345,NM_001164508.1,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000603639,,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3854D,ENST00000604864,,c.11562C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3611D,ENST00000409198,NM_004543.4,c.10833C>T,LOW,,,,-1;NEB,synonymous_variant,p.D3611D,ENST00000172853,,c.10833C>T,LOW,,,,-1;NEB,downstream_gene_variant,,ENST00000486320,,,MODIFIER,,,,-1\", \"A\", \"ENSG00000183091\", \"ENST00000172853\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"11036/20634\", \"10833/20010\", \"3611/6669\", \"D\", \"gaC/gaT\", \"rs376268872\", \"1\", \"None\", -1, \"NEB\", \"HGNC\", \"HGNC:7720\", \"protein_coding\", \"None\", \"None\", \"ENSP00000172853\", \"P20929\", \"None\", \"UPI0000212787\", \"None\", \"None\", \"None\", \"73/149\", \"None\", \"PROSITE_profiles:PS51216;SMART_domains:SM00227\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"0.0005\", \"0\", \"None\", \"None\", \"None\", \"LOW\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"6.613e-05\", \"6.631e-05\", \"0.000306\", \"0\", \"0.0001166\", \"0\", \"2.998e-05\", \"0\", \"0.0001212\", \"PASS\", \"ATGACGTCATT\", \"92b166cc-f4fb-48d4-8482-b8a93b806486|e9c91ac1-b0af-4892-9e3e-355a43d75573|2607ffcd-4357-420d-893e-d39e2ee89f98|4f97bed3-2d08-4e71-8e52-1c45df549d0f\", \"a43429d4-50dc-4d04-9e21-e9033b6d91aa\", \"7ee846d2-3caf-40af-b0ea-467c59734c0f\", \"820aea32-8f1c-478b-ab56-8171425cd76b\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-32-2634\", \"TCGA-32-2634-01A\", \"TCGA-32-2634-10A\", \"TCGA-32-2634-01A-01D-1495-08\", \"TCGA-32-2634-10A-01D-1495-08\", \"LRRC16B\", 90668, \"BI\", \"GRCh38\", \"chr14\", 24062324, 24062324, \"+\", \"Intron\", \"SNP\", \"G\", \"G\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"52b2a114-4f8c-4e02-af9d-24c4a05d4ca0\", \"9157adef-f3b4-43a8-bf98-ee22bfc4631f\", \"c.2481-156G>A\", \"None\", \"None\", \"ENST00000342740\", \"None\", \"19|17|19|17\", \"5\", \"14|12|14|12\", \"16|14|16|12\", \"LRRC16B,intron_variant,,ENST00000342740,NM_138360.3,c.2481-156G>A,MODIFIER,YES,,,1;LRRC16B,non_coding_transcript_exon_variant,,ENST00000560349,,n.406G>A,MODIFIER,,,,1;LRRC16B,intron_variant,,ENST00000559694,,n.2011-156G>A,MODIFIER,,,,1;LRRC16B,downstream_gene_variant,,ENST00000561354,,,MODIFIER,,,,1\", \"A\", \"ENSG00000186648\", \"ENST00000342740\", \"Transcript\", \"intron_variant\", \"intron_variant\", \"-/4597\", \"-/4119\", \"-/1372\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"LRRC16B\", \"HGNC\", \"HGNC:20272\", \"protein_coding\", \"YES\", \"CCDS32054.1\", \"ENSP00000340467\", \"Q8ND23\", \"None\", \"UPI0000DBEF11\", \"NM_138360.3\", \"None\", \"None\", \"None\", \"27/39\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 5.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TCAAGGGCTAG\", \"a2893f53-3a75-43a0-966f-40367eb3c85c|b31e12e7-fdf6-486a-9bb6-08ad5074cb21|f56e7d3a-5698-4791-b3e8-bf7d9a237863|fd5491df-0d83-41cc-9dff-fff3f7274f9a\", \"49213b1d-e589-481f-b631-3f63d7c7b97e\", \"0c5c668b-ad96-4f35-ae01-108a44f38099\", \"1030a6b9-0df8-4d60-b69f-2a36e630a6ad\", \"None\", \"None\", \"False\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-A6S2\", \"TCGA-DU-A6S2-01A\", \"TCGA-DU-A6S2-10A\", \"TCGA-DU-A6S2-01A-21D-A32B-08\", \"TCGA-DU-A6S2-10A-01D-A329-08\", \"THEG\", 51298, \"BI\", \"GRCh38\", \"chr19\", 375793, 375793, \"+\", \"Missense_Mutation\", \"SNP\", \"G\", \"G\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"d5d3cef6-c768-44ae-934f-fd728808a0e0\", \"7ef54b90-9886-4974-9edf-81deb8bc2af2\", \"c.178C>T\", \"p.Pro60Ser\", \"p.P60S\", \"ENST00000342640\", \"1/8\", \"61|58|61|56\", \"38|37|38|37\", \"22|21|22|19\", \"77|72|77|64\", \"THEG,missense_variant,p.P60S,ENST00000342640,NM_016585.4,c.178C>T,MODERATE,YES,tolerated(0.24),benign(0.083),-1;THEG,missense_variant,p.P60S,ENST00000346878,NM_199202.2,c.178C>T,MODERATE,,tolerated(0.31),benign(0.083),-1;THEG,upstream_gene_variant,,ENST00000530711,,,MODIFIER,,,,-1;THEG,upstream_gene_variant,,ENST00000528213,,,MODIFIER,,,,-1\", \"A\", \"ENSG00000105549\", \"ENST00000342640\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"221/1326\", \"178/1140\", \"60/379\", \"P/S\", \"Cca/Tca\", \"None\", \"1\", \"None\", -1, \"THEG\", \"HGNC\", \"HGNC:13706\", \"protein_coding\", \"YES\", \"CCDS12025.1\", \"ENSP00000340088\", \"Q9P2T0\", \"None\", \"UPI000006E5C6\", \"NM_016585.4\", \"tolerated(0.24)\", \"benign(0.083)\", \"1/8\", \"None\", \"Low_complexity_(Seg):Seg\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TTCTGGGTCTT\", \"995a7ef6-8c7e-4a90-a4c3-b9641a349b80|de04365e-5ddf-4d8a-998e-3d584919e59c|6ee3bb7c-ac75-4d96-b0cd-60116e718f80|dc9c0bdf-86d9-4cfc-aa6c-169a8e26862b\", \"25650a4b-775b-485b-92c2-3f8f30ba4169\", \"aa491783-47ec-46ff-ad1e-5e1c66fb67bd\", \"baaddd76-277f-4c90-9cc2-0fece30c9735\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-FG-A4MU\", \"TCGA-FG-A4MU-01B\", \"TCGA-FG-A4MU-10A\", \"TCGA-FG-A4MU-01B-11D-A289-08\", \"TCGA-FG-A4MU-10A-01D-A289-08\", \"CSNK1A1P1\", 161635, \"BI\", \"GRCh38\", \"chr15\", 36817782, 36817782, \"+\", \"RNA\", \"SNP\", \"G\", \"G\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina MiSeq\", \"17bade4e-8b65-42e3-932f-d50716d0d833\", \"fa64db97-5a09-43a5-8ef3-4671ca970e4b\", \"n.678C>T\", \"None\", \"None\", \"ENST00000430593\", \"1/4\", \"32|30|32|30\", \"21|20|21|20\", \"11|10|11|10\", \"35|35|35|34\", \"CSNK1A1P1,non_coding_transcript_exon_variant,,ENST00000430593,,n.678C>T,MODIFIER,YES,,,-1;CSNK1A1P1,intron_variant,,ENST00000569828,,n.178+154C>T,MODIFIER,,,,-1;CSNK1A1P1,non_coding_transcript_exon_variant,,ENST00000563423,,n.332C>T,MODIFIER,,,,-1\", \"A\", \"ENSG00000223518\", \"ENST00000430593\", \"Transcript\", \"non_coding_transcript_exon_variant\", \"non_coding_transcript_exon_variant;non_coding_transcript_variant\", \"678/2147\", \"None\", \"None\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"CSNK1A1P1\", \"HGNC\", \"HGNC:30446\", \"processed_transcript\", \"YES\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"1/4\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CTACTGATCAT\", \"fe48c215-903c-418f-83d2-abc86ff6ae90|f02f607d-ebcb-45e7-b566-edf83c9f07f1|bb92f4dd-84d7-4e40-bbdd-57b70de97b3e|fb8651af-5b9b-4822-909a-5ee930da8823\", \"2a07a2b5-1c79-4093-b82a-26f2e387c960\", \"5d079395-5a9b-40f2-bf55-e020533c6207\", \"7662940a-22de-44d8-b59a-2f2b090ea6d5\", \"None\", \"COSN8634782\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-7606\", \"TCGA-HT-7606-01A\", \"TCGA-HT-7606-10A\", \"TCGA-HT-7606-01A-11D-2086-08\", \"TCGA-HT-7606-10A-01D-2086-08\", \"OR2AG2\", 338755, \"BI\", \"GRCh38\", \"chr11\", 6768358, 6768358, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"A\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"9734311d-3183-459b-8200-7104fba3bf64\", \"7c7214f7-036a-4ac9-9883-1a93d9eb6f10\", \"c.600C>T\", \"p.=\", \"p.Y200Y\", \"ENST00000338569\", \"1/1\", \"29|27|29|24\", \"18|16|18|14\", \"11|11|11|9\", \"12|10|12|9\", \"OR2AG2,synonymous_variant,p.Y200Y,ENST00000338569,NM_001004490.1,c.600C>T,LOW,YES,,,-1\", \"A\", \"ENSG00000188124\", \"ENST00000338569\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"698/1069\", \"600/951\", \"200/316\", \"Y\", \"taC/taT\", \"None\", \"1\", \"None\", -1, \"OR2AG2\", \"HGNC\", \"HGNC:15143\", \"protein_coding\", \"YES\", \"CCDS31413.1\", \"ENSP00000342697\", \"A6NM03\", \"None\", \"UPI0000041C10\", \"NM_001004490.1\", \"None\", \"None\", \"1/1\", \"None\", \"Pfam_domain:PF00001;Pfam_domain:PF10320;Prints_domain:PR00237;PROSITE_profiles:PS50262;Superfamily_domains:SSF81321\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", NaN, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GTCACGTATAT\", \"cdc94120-ac42-46d5-b149-ed2f4f150d62|41907ba5-5eeb-4009-b660-dcc2462c9840|d8a66094-12ab-48ec-a64e-b00a297be5fc|fdd5253d-b5b2-4146-a31c-115d167fa494\", \"5a841ce7-d73e-4a01-95d8-7626584af59e\", \"d9d8e657-d608-4651-9935-be93432f67cf\", \"ffcec8e5-9fd3-4b42-a7cb-74761f713cf4\", \"None\", \"COSM1475827\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-A614\", \"TCGA-HT-A614-01A\", \"TCGA-HT-A614-10A\", \"TCGA-HT-A614-01A-11D-A29Q-08\", \"TCGA-HT-A614-10A-01D-A29Q-08\", \"AC024560.3\", 220729, \"BI\", \"GRCh38\", \"chr3\", 197622320, 197622320, \"+\", \"RNA\", \"SNP\", \"T\", \"T\", \"C\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000;Illumina MiSeq\", \"a8c8f66c-25bc-4dea-9ac2-6cafdd75a489\", \"f812a450-4c23-4684-bb9d-b2db9a185156\", \"n.387A>G\", \"None\", \"None\", \"ENST00000418868\", \"4/8\", \"29\", \"26\", \"3\", \"63\", \"AC024560.3,non_coding_transcript_exon_variant,,ENST00000418868,,n.387A>G,MODIFIER,YES,,,-1;AC024560.3,non_coding_transcript_exon_variant,,ENST00000414207,,n.572A>G,MODIFIER,,,,-1;AC024560.3,intron_variant,,ENST00000440535,,n.365+900A>G,MODIFIER,,,,-1;AC024560.3,intron_variant,,ENST00000437008,,n.525-452A>G,MODIFIER,,,,-1;AC024560.3,non_coding_transcript_exon_variant,,ENST00000449003,,n.352A>G,MODIFIER,,,,-1;AC024560.3,non_coding_transcript_exon_variant,,ENST00000454517,,n.323A>G,MODIFIER,,,,-1\", \"C\", \"ENSG00000214135\", \"ENST00000418868\", \"Transcript\", \"non_coding_transcript_exon_variant\", \"non_coding_transcript_exon_variant;non_coding_transcript_variant\", \"387/1552\", \"None\", \"None\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"AC024560.3\", \"Clone_based_vega_gene\", \"None\", \"processed_transcript\", \"YES\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"4/8\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CAGCATTGATT\", \"cbea374c-f644-4304-8a6f-a529b5a3c793\", \"6ae778e4-facb-4f55-add7-7a2c39932338\", \"b47fc9ec-08c4-4056-84be-9086a35e8c01\", \"001ad307-4ad3-4f1d-b2fc-efc032871c7e\", \"None\", \"None\", \"False\", \"Unknown\", \"varscan\", \"7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-QH-A65S\", \"TCGA-QH-A65S-01A\", \"TCGA-QH-A65S-10A\", \"TCGA-QH-A65S-01A-11D-A29Q-08\", \"TCGA-QH-A65S-10A-01D-A29Q-08\", \"SETMAR\", 6419, \"BI\", \"GRCh38\", \"chr3\", 4313488, 4313488, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"G\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000;Illumina MiSeq\", \"05be7524-29b3-47c4-95bd-eecb53e97770\", \"f3762aaf-0169-420b-93dd-2ebd5afe4412\", \"c.747C>G\", \"p.=\", \"p.A249A\", \"ENST00000358065\", \"2/3\", \"41|41|37\", \"34|34|30\", \"7\", \"70|70|60\", \"SETMAR,synonymous_variant,p.A249A,ENST00000358065,NM_006515.3,c.747C>G,LOW,YES,,,1;SETMAR,synonymous_variant,p.A249A,ENST00000430981,NM_001276325.1,c.747C>G,LOW,,,,1;SETMAR,intron_variant,,ENST00000425863,NM_001243723.1,c.489-159C>G,MODIFIER,,,,1;SETMAR,intron_variant,,ENST00000358950,,c.198-159C>G,MODIFIER,,,,1;SETMAR,intron_variant,,ENST00000490691,,n.257-2724C>G,MODIFIER,,,,1;SETMAR,downstream_gene_variant,,ENST00000462115,,,MODIFIER,,,,1;SUMF1,intron_variant,,ENST00000448413,,c.1014+62842G>C,MODIFIER,,,,-1;SETMAR,intron_variant,,ENST00000413809,,c.489-179C>G,MODIFIER,,,,1;SETMAR,intron_variant,,ENST00000425046,,c.157-159C>G,MODIFIER,,,,1\", \"G\", \"ENSG00000170364\", \"ENST00000358065\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"814/2443\", \"747/2055\", \"249/684\", \"A\", \"gcC/gcG\", \"None\", \"1\", \"None\", 1, \"SETMAR\", \"HGNC\", \"HGNC:10762\", \"protein_coding\", \"YES\", \"CCDS2563.2\", \"ENSP00000373354\", \"Q53H47\", \"None\", \"None\", \"NM_006515.3\", \"None\", \"None\", \"2/3\", \"None\", \"Pfam_domain:PF00856;PROSITE_profiles:PS50280;SMART_domains:SM00317;Superfamily_domains:SSF82199\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GCAGCCAAAGA\", \"ee1b8419-dc45-4f4c-97d4-a036e37316b6|78756149-bf3b-4639-8d0a-7e30955e3eaa|0dd695ce-f9a4-489c-8cbe-63c61784d009\", \"785db53a-134b-46f0-bac7-ed6c6d872907\", \"004b9b00-4751-4741-a4b0-2ac619c0c860\", \"92ebe72e-508d-4547-b14b-b8e02e6233ca\", \"None\", \"COSM4420522;COSM4420523\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-TM-A84S\", \"TCGA-TM-A84S-01A\", \"TCGA-TM-A84S-10A\", \"TCGA-TM-A84S-01A-11D-A36O-08\", \"TCGA-TM-A84S-10A-01D-A367-08\", \"IDH1\", 3417, \"BI\", \"GRCh38\", \"chr2\", 208248388, 208248388, \"+\", \"Missense_Mutation\", \"SNP\", \"C\", \"C\", \"T\", \"rs121913500\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"04900639-99a7-4c20-944b-77fab59a174a\", \"59753c32-0a08-46aa-94cc-cc88d0455862\", \"c.395G>A\", \"p.Arg132His\", \"p.R132H\", \"ENST00000345146\", \"4/10\", \"93|92|93|80\", \"58|57|58|49\", \"35|35|35|30\", \"89|86|89|74\", \"IDH1,missense_variant,p.R132H,ENST00000415913,NM_001282387.1,c.395G>A,MODERATE,YES,deleterious_low_confidence(0.01),possibly_damaging(0.813),-1;IDH1,missense_variant,p.R132H,ENST00000345146,NM_005896.3,c.395G>A,MODERATE,,deleterious_low_confidence(0.01),possibly_damaging(0.813),-1;IDH1,missense_variant,p.R132H,ENST00000446179,NM_001282386.1,c.395G>A,MODERATE,,deleterious_low_confidence(0.01),possibly_damaging(0.813),-1;IDH1,missense_variant,p.R132H,ENST00000415282,,c.395G>A,MODERATE,,deleterious_low_confidence(0.02),possibly_damaging(0.813),-1;IDH1,downstream_gene_variant,,ENST00000417583,,,MODIFIER,,,,-1;IDH1,downstream_gene_variant,,ENST00000451391,,,MODIFIER,,,,-1;IDH1,non_coding_transcript_exon_variant,,ENST00000462386,,n.608G>A,MODIFIER,,,,-1;IDH1,downstream_gene_variant,,ENST00000481557,,,MODIFIER,,,,-1\", \"T\", \"ENSG00000138413\", \"ENST00000345146\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"680/2382\", \"395/1245\", \"132/414\", \"R/H\", \"cGt/cAt\", \"rs121913500\", \"1\", \"None\", -1, \"IDH1\", \"HGNC\", \"HGNC:5382\", \"protein_coding\", \"None\", \"CCDS2381.1\", \"ENSP00000260985\", \"O75874\", \"V9HWJ2\", \"UPI000012D1B4\", \"NM_005896.3\", \"deleterious_low_confidence(0.01)\", \"possibly_damaging(0.813)\", \"4/10\", \"None\", \"Pfam_domain:PF00180;TIGRFAM_domain:TIGR00127;Superfamily_domains:SSF53659;PIRSF_domain:PIRSF000108\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"pathogenic\", \"None\", \"None\", \"MODERATE\", \"None\", \"SNV\", 1.0, NaN, \"1\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CATGACGACCT\", \"c74b6cca-cc9d-4ed4-bdb4-06bd2751af12|ec3aa86c-1738-4bc4-bedb-5667485d9693|ac69ae08-b61f-4ae0-ba56-e8230e5f6b4f|673f478a-8b7e-4065-945f-8dae4815460c\", \"9f010f6b-878a-4c9e-b01f-311c62b28bb6\", \"0d1b008a-896d-4ce9-adbd-c81cbc67ee19\", \"cd50aea8-a5db-48d3-ad28-cbe9f9e75ae3\", \"None\", \"COSM28746\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-12-0691\", \"TCGA-12-0691-01A\", \"TCGA-12-0691-10A\", \"TCGA-12-0691-01A-01W-0348-08\", \"TCGA-12-0691-10A-01W-0348-08\", \"PPP6R3\", 55291, \"BI\", \"GRCh38\", \"chr11\", 68564417, 68564417, \"+\", \"Silent\", \"SNP\", \"G\", \"G\", \"T\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina Genome Analyzer II\", \"692f7137-d047-4420-a1b1-e07a0c1350d9\", \"cdc3322b-296a-4f8d-a308-dddcc819298d\", \"c.960G>T\", \"p.=\", \"p.L320L\", \"ENST00000393800\", \"9/24\", \"110|90|110|76\", \"64|54|64|44\", \"45|36|45|31\", \"89|89|89|71\", \"PPP6R3,synonymous_variant,p.L320L,ENST00000393800,NM_001164161.1,c.960G>T,LOW,,,,1;PPP6R3,synonymous_variant,p.L320L,ENST00000393801,NM_001164160.1,c.960G>T,LOW,YES,,,1;PPP6R3,synonymous_variant,p.L320L,ENST00000527403,,c.960G>T,LOW,,,,1;PPP6R3,synonymous_variant,p.L320L,ENST00000265636,NM_018312.4,c.960G>T,LOW,,,,1;PPP6R3,synonymous_variant,p.L320L,ENST00000265637,,c.960G>T,LOW,,,,1;PPP6R3,synonymous_variant,p.L320L,ENST00000524904,NM_001164162.1,c.960G>T,LOW,,,,1;PPP6R3,synonymous_variant,p.L320L,ENST00000529710,NM_001164164.1,c.960G>T,LOW,,,,1;PPP6R3,synonymous_variant,p.L320L,ENST00000524845,NM_001164163.1,c.960G>T,LOW,,,,1;PPP6R3,synonymous_variant,p.L51L,ENST00000534190,,c.153G>T,LOW,,,,1;PPP6R3,intron_variant,,ENST00000534534,,c.280-2597G>T,MODIFIER,,,,1;PPP6R3,downstream_gene_variant,,ENST00000531432,,,MODIFIER,,,,1;PPP6R3,upstream_gene_variant,,ENST00000526574,,,MODIFIER,,,,1\", \"T\", \"ENSG00000110075\", \"ENST00000393800\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"1214/5093\", \"960/2622\", \"320/873\", \"L\", \"ctG/ctT\", \"None\", \"1\", \"None\", 1, \"PPP6R3\", \"HGNC\", \"HGNC:1173\", \"protein_coding\", \"None\", \"CCDS53672.1\", \"ENSP00000377389\", \"Q5H9R7\", \"None\", \"None\", \"NM_001164161.1\", \"None\", \"None\", \"9/24\", \"None\", \"Pfam_domain:PF04499;Superfamily_domains:SSF48371\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CTCCTGCTGGA\", \"77e45045-451b-4ece-b7cc-6da4a7474b91|91195e99-df9e-4167-aceb-a8990ecedd22|ea171a43-b804-4096-a7d2-90268b28ad3f|08da11ac-a53e-44d6-9feb-77ff556fb8b5\", \"6b3ed94d-9fcb-414e-84ae-858ebaf27afe\", \"dae1068f-9ebb-4296-9288-e41e7a73de53\", \"bb0aca6b-55ab-4b24-8e64-29e0c96a9862\", \"wga_pair\", \"COSM2154088;COSM2154089;COSM2154090\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff9374.DR-10.0.somatic.maf|TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e7127998b3e6.DR-10.0.somatic.maf|TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-5849\", \"TCGA-DU-5849-01A\", \"TCGA-DU-5849-10A\", \"TCGA-DU-5849-01A-11D-1705-08\", \"TCGA-DU-5849-10A-01D-1705-08\", \"IDH2\", 3418, \"BI\", \"GRCh38\", \"chr15\", 90088606, 90088606, \"+\", \"Missense_Mutation\", \"SNP\", \"C\", \"C\", \"T\", \"rs121913503\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"bcde1486-c728-4841-ab69-c8cb16706fc2\", \"189c09ae-f5aa-4b68-89d8-65eb6bc57683\", \"c.515G>A\", \"p.Arg172Lys\", \"p.R172K\", \"ENST00000330062\", \"4/11\", \"65|62|65|61\", \"42|39|42|39\", \"23|23|23|22\", \"40|37|40|32\", \"IDH2,missense_variant,p.R172K,ENST00000330062,NM_002168.2,c.515G>A,MODERATE,YES,deleterious_low_confidence(0),probably_damaging(1),-1;IDH2,missense_variant,p.R120K,ENST00000540499,,c.359G>A,MODERATE,,deleterious_low_confidence(0),probably_damaging(1),-1;IDH2,intron_variant,,ENST00000559482,,c.208-104G>A,MODIFIER,,,,-1;IDH2,3_prime_UTR_variant,,ENST00000560061,NM_001290114.1,c.*140G>A,MODIFIER,,,,-1\", \"T\", \"ENSG00000182054\", \"ENST00000330062\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"629/2694\", \"515/1359\", \"172/452\", \"R/K\", \"aGg/aAg\", \"rs121913503\", \"1\", \"None\", -1, \"IDH2\", \"HGNC\", \"HGNC:5383\", \"protein_coding\", \"YES\", \"CCDS10359.1\", \"ENSP00000331897\", \"P48735\", \"None\", \"UPI000012D1C3\", \"NM_002168.2\", \"deleterious_low_confidence(0)\", \"probably_damaging(1)\", \"4/11\", \"None\", \"Pfam_domain:PF00180;TIGRFAM_domain:TIGR00127;Superfamily_domains:SSF53659;PIRSF_domain:PIRSF000108\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CGTGCCTGCCA\", \"294eebcc-30c8-4a7c-be0e-6fe4e6665af2|3906d2c8-b13a-41bd-8b6a-35a43f7aba6a|a52b9ebd-72a0-47ca-b243-483d47ae2fb3|ed8df9f3-c578-4d36-86ae-b774084d9948\", \"17cd3685-a9f0-4c3e-b2e9-6ac133c94bbc\", \"7f6b4c30-1a7b-4616-9cac-223cc25d0b38\", \"5af8ada5-86b5-4832-8a8e-e975ecca5515\", \"None\", \"COSM33733\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-QH-A6CX\", \"TCGA-QH-A6CX-01A\", \"TCGA-QH-A6CX-10A\", \"TCGA-QH-A6CX-01A-11D-A32B-08\", \"TCGA-QH-A6CX-10A-01D-A329-08\", \"GABRA1\", 2554, \"BI\", \"GRCh38\", \"chr5\", 161897483, 161897483, \"+\", \"3'UTR\", \"SNP\", \"C\", \"C\", \"T\", \"rs574105922\", \"by1000G;byCluster\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"c54e640a-a02a-4687-9325-d6485c4fb4bb\", \"91d4fca0-37c3-45ef-b4c9-487046bcca69\", \"c.*61C>T\", \"None\", \"None\", \"ENST00000023897\", \"11/11\", \"32|34|33\", \"25|27|24\", \"7\", \"41\", \"GABRA1,3_prime_UTR_variant,,ENST00000428797,NM_001127643.1,c.*61C>T,MODIFIER,YES,,,1;GABRA1,3_prime_UTR_variant,,ENST00000437025,NM_001127648.1&NM_001127645.1,c.*61C>T,MODIFIER,,,,1;GABRA1,3_prime_UTR_variant,,ENST00000393943,NM_001127644.1,c.*61C>T,MODIFIER,,,,1;GABRA1,3_prime_UTR_variant,,ENST00000023897,NM_000806.5,c.*61C>T,MODIFIER,,,,1\", \"T\", \"ENSG00000022355\", \"ENST00000023897\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"1900/2083\", \"-/1371\", \"-/456\", \"None\", \"None\", \"rs574105922\", \"1\", \"None\", 1, \"GABRA1\", \"HGNC\", \"HGNC:4075\", \"protein_coding\", \"None\", \"CCDS4357.1\", \"ENSP00000023897\", \"P14867\", \"None\", \"UPI000012AF95\", \"NM_000806.5\", \"None\", \"None\", \"11/11\", \"None\", \"None\", \"None\", \"0.0008\", \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CTCAACGCAGT\", \"abdef3e4-6642-4119-847c-8ebbe64bfe07|9ce6caa1-56cc-47ba-a9ba-b32ff1bb7c3a|ca71d19b-8599-46ac-9eb5-fccff51cdca6\", \"4b92d740-80f7-4e82-866e-0fcb8f256f56\", \"3a5369d9-2a1f-463c-98dc-46e0e35f989a\", \"cf29547a-305b-4e6e-8342-36aac0850065\", \"None\", \"COSN7905580\", \"True\", \"Unknown\", \"mutect|somaticsniper|varscan\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-QH-A6X9\", \"TCGA-QH-A6X9-01A\", \"TCGA-QH-A6X9-10B\", \"TCGA-QH-A6X9-01A-12D-A32B-08\", \"TCGA-QH-A6X9-10B-01D-A329-08\", \"RP11-1166P10.6\", 0, \"BI\", \"GRCh38\", \"chr16\", 32059270, 32059270, \"+\", \"Intron\", \"SNP\", \"G\", \"G\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"06e076ce-a099-496a-a118-34a496ecf085\", \"2cf52792-dfc5-4836-b7e4-f695939350bb\", \"n.499+25017C>T\", \"None\", \"None\", \"ENST00000566806\", \"None\", \"79|65|69|57\", \"57|47|48|40\", \"22|18|21|17\", \"81|75|75|62\", \"RP11-1166P10.6,intron_variant,,ENST00000566806,,n.499+25017C>T,MODIFIER,YES,,,-1;IGHV1OR16-3,non_coding_transcript_exon_variant,,ENST00000568138,,n.103G>A,MODIFIER,YES,,,1\", \"A\", \"ENSG00000261727\", \"ENST00000566806\", \"Transcript\", \"intron_variant\", \"intron_variant;non_coding_transcript_variant\", \"-/702\", \"None\", \"None\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"RP11-1166P10.6\", \"Clone_based_vega_gene\", \"None\", \"processed_transcript\", \"YES\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"1/2\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 3.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CTGGGGCCTCA\", \"1bcaa313-4610-4108-aa3d-5760d01370b5|855e6cc1-c22a-4ad7-b9f3-215ef79cb261|6ff5e003-b083-4820-8ec1-ccf5c072cd75|c0fb3d0b-2855-4453-816f-e85e0efd69b1\", \"23c33149-0739-44c5-80ac-4dc3d21946d4\", \"1f773ee3-4fbb-4801-808d-9798280c3082\", \"1ca2e1b3-e3eb-4740-a69a-800e3eb60787\", \"None\", \"None\", \"False\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-S9-A6WP\", \"TCGA-S9-A6WP-01A\", \"TCGA-S9-A6WP-10A\", \"TCGA-S9-A6WP-01A-12D-A34A-08\", \"TCGA-S9-A6WP-10A-01D-A34A-08\", \"C4orf36\", 132989, \"BI\", \"GRCh38\", \"chr4\", 86876325, 86876325, \"+\", \"3'UTR\", \"SNP\", \"C\", \"C\", \"T\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"b4196c33-5da9-426e-ada5-67f9aee88b70\", \"af25316b-1bef-4cc6-8f82-ffa3065bc7f3\", \"c.*121G>A\", \"None\", \"None\", \"ENST00000295898\", \"5/5\", \"5\", \"1\", \"4\", \"13\", \"C4orf36,3_prime_UTR_variant,,ENST00000295898,NM_144645.3,c.*121G>A,MODIFIER,,,,-1;RP11-397E7.1,downstream_gene_variant,,ENST00000480094,,,MODIFIER,YES,,,1;RP11-397E7.2,upstream_gene_variant,,ENST00000512654,,,MODIFIER,YES,,,1\", \"T\", \"ENSG00000163633\", \"ENST00000295898\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"761/881\", \"-/354\", \"-/117\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"C4orf36\", \"HGNC\", \"HGNC:28386\", \"protein_coding\", \"None\", \"CCDS3615.1\", \"ENSP00000295898\", \"Q96KX1\", \"None\", \"UPI000013E2CB\", \"NM_144645.3\", \"None\", \"None\", \"5/5\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GGGGCCGGGCC\", \"7c4e952a-6f17-4ceb-81d6-0c2d96466085\", \"e4e3b37e-97f8-4b0b-8b38-4ab2a149bb81\", \"aac5c478-45f3-45c5-a4ba-d85aaaf85184\", \"081b6532-0ed4-445a-becb-cb2290f4854d\", \"None\", \"None\", \"False\", \"Unknown\", \"mutect\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-CS-6668\", \"TCGA-CS-6668-01A\", \"TCGA-CS-6668-10A\", \"TCGA-CS-6668-01A-11D-1893-08\", \"TCGA-CS-6668-10A-01D-1893-08\", \"DUSP22\", 56940, \"BI\", \"GRCh38\", \"chr6\", 292483, 292483, \"+\", \"5'UTR\", \"SNP\", \"T\", \"T\", \"C\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"d414e076-dcb6-4edf-adef-0abdc57354ea\", \"7154a36b-c503-43f5-b291-89bd5ce2875f\", \"c.-57T>C\", \"None\", \"None\", \"ENST00000344450\", \"1/8\", \"28|29\", \"23|22\", \"5|7\", \"24|22\", \"DUSP22,5_prime_UTR_variant,,ENST00000419235,NM_001286555.1,c.-57T>C,MODIFIER,YES,,,1;DUSP22,5_prime_UTR_variant,,ENST00000344450,NM_020185.4,c.-57T>C,MODIFIER,,,,1;DUSP22,5_prime_UTR_variant,,ENST00000605035,,c.-316T>C,MODIFIER,,,,1;DUSP22,5_prime_UTR_variant,,ENST00000605315,,c.-199T>C,MODIFIER,,,,1;DUSP22,5_prime_UTR_variant,,ENST00000603453,,c.-283T>C,MODIFIER,,,,1;DUSP22,5_prime_UTR_variant,,ENST00000605863,,c.-199T>C,MODIFIER,,,,1;DUSP22,5_prime_UTR_variant,,ENST00000603881,,c.-310T>C,MODIFIER,,,,1;DUSP22,intron_variant,,ENST00000603296,,c.-109+783T>C,MODIFIER,,,,1;DUSP22,upstream_gene_variant,,ENST00000603005,,,MODIFIER,,,,1;DUSP22,5_prime_UTR_variant,,ENST00000603795,,c.-57T>C,MODIFIER,,,,1;DUSP22,upstream_gene_variant,,ENST00000603726,,,MODIFIER,,,,1\", \"C\", \"ENSG00000112679\", \"ENST00000344450\", \"Transcript\", \"5_prime_UTR_variant\", \"5_prime_UTR_variant\", \"387/1485\", \"-/555\", \"-/184\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"DUSP22\", \"HGNC\", \"HGNC:16077\", \"protein_coding\", \"None\", \"CCDS4468.1\", \"ENSP00000345281\", \"Q9NRW4\", \"None\", \"UPI0000036A3C\", \"NM_020185.4\", \"None\", \"None\", \"1/8\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"None\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TAACATGCCAT\", \"bc2d37af-3918-444b-bddd-8784c07499f3|12ca5143-e39f-4361-a7e9-abdb10c9632a\", \"ca0ebbcd-1406-41d1-ad25-2a6fa7a60a29\", \"fe65ff0b-0665-4259-9581-9bf05aa81676\", \"a5d3f3fb-6541-419d-b47e-720d438f1bff\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DB-A64X\", \"TCGA-DB-A64X-01A\", \"TCGA-DB-A64X-10A\", \"TCGA-DB-A64X-01A-11D-A29Q-08\", \"TCGA-DB-A64X-10A-01D-A29Q-08\", \"ANGPT1\", 284, \"BI\", \"GRCh38\", \"chr8\", 107251744, 107251744, \"+\", \"3'UTR\", \"SNP\", \"T\", \"T\", \"C\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000;Illumina MiSeq\", \"cc434402-b13e-4f3a-ace5-ccb1d3924f4f\", \"96550f20-a2c9-44cc-b049-b725483fdfce\", \"c.*111A>G\", \"None\", \"None\", \"ENST00000517746\", \"9/9\", \"12|12|11\", \"8|8|7\", \"4\", \"10\", \"ANGPT1,3_prime_UTR_variant,,ENST00000297450,NM_001199859.1,c.*111A>G,MODIFIER,,,,-1;ANGPT1,3_prime_UTR_variant,,ENST00000517746,NM_001146.3,c.*111A>G,MODIFIER,YES,,,-1;ANGPT1,3_prime_UTR_variant,,ENST00000520734,,c.*111A>G,MODIFIER,,,,-1;ANGPT1,3_prime_UTR_variant,,ENST00000520052,,c.*111A>G,MODIFIER,,,,-1;AP000428.1,downstream_gene_variant,,ENST00000390706,,,MODIFIER,YES,,,-1;ANGPT1,non_coding_transcript_exon_variant,,ENST00000518386,,n.596A>G,MODIFIER,,,,-1\", \"C\", \"ENSG00000154188\", \"ENST00000517746\", \"Transcript\", \"3_prime_UTR_variant\", \"3_prime_UTR_variant\", \"2060/4322\", \"-/1497\", \"-/498\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"ANGPT1\", \"HGNC\", \"HGNC:484\", \"protein_coding\", \"YES\", \"CCDS6306.1\", \"ENSP00000428340\", \"Q15389\", \"None\", \"UPI0000034766\", \"NM_001146.3\", \"None\", \"None\", \"9/9\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CTTATTGCTGG\", \"8b318858-2b95-4e1d-837c-5885b46dab0e|3e593591-ff00-49aa-8f85-da9a5876710c|c9282736-3b3a-4209-b190-c9d411193df1\", \"9b0bf325-a988-45f4-939c-5526f7d8fcfe\", \"cc142811-018a-463c-a397-7914fa0b2d33\", \"9922de10-9280-44c0-b86f-6d1ca7e55bf2\", \"None\", \"None\", \"True\", \"Unknown\", \"muse|mutect|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-E1-A7YY\", \"TCGA-E1-A7YY-01A\", \"TCGA-E1-A7YY-10A\", \"TCGA-E1-A7YY-01A-11D-A34J-08\", \"TCGA-E1-A7YY-10A-01D-A34M-08\", \"WDR44\", 54521, \"BI\", \"GRCh38\", \"chrX\", 118448920, 118448922, \"+\", \"In_Frame_Del\", \"DEL\", \"TTC\", \"TTC\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"c2415587-d4b6-4b6b-983f-8c3017ba2f09\", \"ac126c0b-e17f-481c-8331-dc355f8ae993\", \"c.2679_2681delTCT\", \"p.Leu894del\", \"p.L894del\", \"ENST00000254029\", \"20/20\", \"57\", \"50\", \"6\", \"47\", \"WDR44,inframe_deletion,p.L894del,ENST00000254029,NM_019045.4,c.2679_2681delTCT,MODERATE,YES,,,1;WDR44,inframe_deletion,p.L886del,ENST00000371825,NM_001184965.1,c.2655_2657delTCT,MODERATE,,,,1;WDR44,inframe_deletion,p.L805del,ENST00000371822,NM_001184966.1,c.2412_2414delTCT,MODERATE,,,,1;WDR44,3_prime_UTR_variant,,ENST00000371848,,c.*13_*15delTCT,MODIFIER,,,,1\", \"-\", \"ENSG00000131725\", \"ENST00000254029\", \"Transcript\", \"inframe_deletion\", \"inframe_deletion\", \"3070-3072/4111\", \"2675-2677/2742\", \"892-893/913\", \"VL/V\", \"gTTCtt/gtt\", \"None\", \"1\", \"None\", 1, \"WDR44\", \"HGNC\", \"HGNC:30512\", \"protein_coding\", \"YES\", \"CCDS14572.1\", \"ENSP00000254029\", \"Q5JSH3\", \"None\", \"UPI000013CE0C\", \"NM_019045.4\", \"None\", \"None\", \"20/20\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"deletion\", 1.0, 4.0, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CAGAAGTTCTTCTC\", \"f50b2aa5-2639-4eb5-b233-6a04e66561a4\", \"2aeeb199-cb59-419a-a077-85b5807f8b1e\", \"da024623-5cc4-4d4c-a074-fa7e595aef40\", \"722c172f-46e6-47a1-82e5-3207278df89b\", \"None\", \"None\", \"True\", \"Unknown\", \"varscan\", \"7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-HT-7677\", \"TCGA-HT-7677-01A\", \"TCGA-HT-7677-10A\", \"TCGA-HT-7677-01A-11D-2253-08\", \"TCGA-HT-7677-10A-01D-2253-08\", \"ARID1B\", 57492, \"BI\", \"GRCh38\", \"chr6\", 157148865, 157148865, \"+\", \"Frame_Shift_Del\", \"DEL\", \"G\", \"G\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"7a4bfd9a-4a16-41c9-91cb-97351c76ab0e\", \"d27dc741-a306-47c4-a333-155ac43c9484\", \"c.2757delG\", \"p.Pro920ArgfsTer6\", \"p.P920Rfs*6\", \"ENST00000350026\", \"8/19\", \"75|77\", \"45|52\", \"30|25\", \"76\", \"ARID1B,frameshift_variant,p.P933Rfs*6,ENST00000346085,NM_020732.3,c.2796delG,HIGH,YES,,,1;ARID1B,frameshift_variant,p.P920Rfs*6,ENST00000350026,NM_017519.2,c.2757delG,HIGH,,,,1;ARID1B,frameshift_variant,p.P389Rfs*6,ENST00000414678,,c.1164delG,HIGH,,,,1;ARID1B,frameshift_variant,p.P342Rfs*6,ENST00000319584,,c.1023delG,HIGH,,,,1;ARID1B,upstream_gene_variant,,ENST00000400790,,,MODIFIER,,,,1;ARID1B,non_coding_transcript_exon_variant,,ENST00000478761,,n.79delG,MODIFIER,,,,1;ARID1B,non_coding_transcript_exon_variant,,ENST00000452544,,n.853delG,MODIFIER,,,,1\", \"-\", \"ENSG00000049618\", \"ENST00000350026\", \"Transcript\", \"frameshift_variant\", \"frameshift_variant\", \"2755/7971\", \"2754/6711\", \"918/2236\", \"M/X\", \"atG/at\", \"None\", \"1\", \"None\", 1, \"ARID1B\", \"HGNC\", \"HGNC:18040\", \"protein_coding\", \"None\", \"CCDS5251.2\", \"ENSP00000055163\", \"Q8NFD5\", \"None\", \"UPI000058E2EA\", \"NM_017519.2\", \"None\", \"None\", \"8/19\", \"None\", \"Low_complexity_(Seg):Seg\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"HIGH\", \"None\", \"deletion\", 1.0, 3.0, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"AGGAATGGGGCC\", \"7a9633e2-afea-44b0-8cb8-c76e00ed3b97|8fe8ea6c-7d2f-4880-a48a-300f77e28122\", \"359da179-14d2-4e7c-901e-864f03cdad8d\", \"f29abb60-b6a6-4742-a4e8-9656c501f4b8\", \"00b18ad6-ff70-41fe-8f4d-0763ac8f28b9\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect|varscan\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-14-0787\", \"TCGA-14-0787-01A\", \"TCGA-14-0787-10A\", \"TCGA-14-0787-01A-01D-1492-08\", \"TCGA-14-0787-10A-01D-1492-08\", \"NOP56\", 10528, \"BI\", \"GRCh38\", \"chr20\", 2657709, 2657709, \"+\", \"Intron\", \"DEL\", \"T\", \"T\", \"-\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"741c611f-a447-47a5-9f21-63602de0aa37\", \"c08c8d65-61ac-4424-9b00-6b3e99ff0fc3\", \"c.1420-210delT\", \"None\", \"None\", \"ENST00000329276\", \"None\", \"34\", \"27\", \"6\", \"23\", \"NOP56,3_prime_UTR_variant,,ENST00000415272,,c.*329delT,MODIFIER,,,,1;NOP56,intron_variant,,ENST00000329276,NM_006392.3,c.1420-210delT,MODIFIER,YES,,,1;IDH3B,downstream_gene_variant,,ENST00000380843,NM_006899.3,,MODIFIER,YES,,,-1;IDH3B,downstream_gene_variant,,ENST00000613370,NM_001258384.1,,MODIFIER,,,,-1;IDH3B,downstream_gene_variant,,ENST00000474315,,,MODIFIER,,,,-1;IDH3B,downstream_gene_variant,,ENST00000380851,NM_174855.2,,MODIFIER,,,,-1;NOP56,downstream_gene_variant,,ENST00000445139,,,MODIFIER,,,,1;SNORA51,downstream_gene_variant,,ENST00000606420,,,MODIFIER,YES,,,1;SNORD86,downstream_gene_variant,,ENST00000391196,,,MODIFIER,YES,,,1;SNORD110,downstream_gene_variant,,ENST00000408189,,,MODIFIER,YES,,,1;SNORD57,downstream_gene_variant,,ENST00000448188,,,MODIFIER,YES,,,1;SNORD56,downstream_gene_variant,,ENST00000413522,,,MODIFIER,YES,,,1;MIR1292,downstream_gene_variant,,ENST00000408135,,,MODIFIER,YES,,,1;NOP56,intron_variant,,ENST00000492135,,n.679-210delT,MODIFIER,,,,1;NOP56,intron_variant,,ENST00000466447,,n.630-210delT,MODIFIER,,,,1;NOP56,intron_variant,,ENST00000462630,,n.395-210delT,MODIFIER,,,,1;NOP56,intron_variant,,ENST00000467857,,n.271-210delT,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000484998,,,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000469588,,,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000480992,,,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000494697,,,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000460258,,,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000496775,,,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000470143,,,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000480447,,,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000490753,,,MODIFIER,,,,1;NOP56,downstream_gene_variant,,ENST00000471023,,,MODIFIER,,,,1;NOP56,non_coding_transcript_exon_variant,,ENST00000612233,,n.2307delT,MODIFIER,,,,1;NOP56,non_coding_transcript_exon_variant,,ENST00000616692,,n.1988delT,MODIFIER,,,,1;NOP56,intron_variant,,ENST00000467196,,c.*99-210delT,MODIFIER,,,,1;IDH3B,downstream_gene_variant,,ENST00000488299,,,MODIFIER,,,,-1;IDH3B,downstream_gene_variant,,ENST00000492240,,,MODIFIER,,,,-1;IDH3B,downstream_gene_variant,,ENST00000462967,,,MODIFIER,,,,-1;IDH3B,downstream_gene_variant,,ENST00000491065,,,MODIFIER,,,,-1;IDH3B,downstream_gene_variant,,ENST00000466494,,,MODIFIER,,,,-1;IDH3B,downstream_gene_variant,,ENST00000477689,,,MODIFIER,,,,-1;IDH3B,downstream_gene_variant,,ENST00000466999,,,MODIFIER,,,,-1;IDH3B,downstream_gene_variant,,ENST00000479376,,,MODIFIER,,,,-1\", \"-\", \"ENSG00000101361\", \"ENST00000329276\", \"Transcript\", \"intron_variant\", \"intron_variant\", \"-/2400\", \"-/1785\", \"-/594\", \"None\", \"None\", \"None\", \"1\", \"None\", 1, \"NOP56\", \"HGNC\", \"HGNC:15911\", \"protein_coding\", \"YES\", \"CCDS13030.1\", \"ENSP00000370589\", \"O00567\", \"None\", \"UPI000016A81D\", \"NM_006392.3\", \"None\", \"None\", \"None\", \"11/11\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"deletion\", 1.0, 10.0, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"TTTAGGTTTTTT\", \"2f17652c-91b5-4990-9cd4-f67e3845791c\", \"211cf8f0-d56b-447e-9fd8-f2622b75e94b\", \"b2250dde-b989-4e6b-a075-ea96326bd3aa\", \"a2338b30-f511-4163-af3b-1e4a40ff00e1\", \"None\", \"None\", \"False\", \"Unknown\", \"varscan\", \"8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-GBM\", \"TCGA-14-1821\", \"TCGA-14-1821-01A\", \"TCGA-14-1821-10A\", \"TCGA-14-1821-01A-01W-0643-08\", \"TCGA-14-1821-10A-01W-0644-08\", \"TP53\", 7157, \"BI\", \"GRCh38\", \"chr17\", 7674890, 7674890, \"+\", \"Missense_Mutation\", \"SNP\", \"T\", \"C\", \"C\", \"None\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina Genome Analyzer II\", \"fb228832-3344-4fca-921e-a7bf4acd17b2\", \"0cc92844-cc1f-4eb5-9b3d-e4ca8753cdcd\", \"c.641A>G\", \"p.His214Arg\", \"p.H214R\", \"ENST00000269305\", \"6/11\", \"205|172\", \"16|15\", \"189|156\", \"174|138\", \"TP53,missense_variant,p.H214R,ENST00000617185,NM_001126114.2,c.641A>G,MODERATE,,deleterious(0.04),probably_damaging(0.91),-1;TP53,missense_variant,p.H175R,ENST00000622645,NM_001276696.1,c.524A>G,MODERATE,,deleterious(0.02),probably_damaging(0.91),-1;TP53,missense_variant,p.H214R,ENST00000420246,,c.641A>G,MODERATE,,deleterious(0.04),probably_damaging(0.91),-1;TP53,missense_variant,p.H175R,ENST00000610292,NM_001126118.1,c.524A>G,MODERATE,,deleterious(0.03),probably_damaging(0.922),-1;TP53,missense_variant,p.H175R,ENST00000610538,NM_001276695.1,c.524A>G,MODERATE,,deleterious(0.02),probably_damaging(0.938),-1;TP53,missense_variant,p.H214R,ENST00000455263,NM_001126113.2,c.641A>G,MODERATE,,deleterious(0.04),probably_damaging(0.938),-1;TP53,missense_variant,p.H214R,ENST00000269305,NM_000546.5&NM_001126112.2,c.641A>G,MODERATE,YES,deleterious(0.02),probably_damaging(0.922),-1;TP53,missense_variant,p.H175R,ENST00000620739,NM_001276761.1&NM_001276760.1,c.524A>G,MODERATE,,deleterious(0.03),probably_damaging(0.922),-1;TP53,missense_variant,p.H214R,ENST00000445888,,c.641A>G,MODERATE,,deleterious(0.02),probably_damaging(0.922),-1;TP53,missense_variant,p.H175R,ENST00000619485,,c.524A>G,MODERATE,,deleterious(0.03),probably_damaging(0.922),-1;TP53,missense_variant,p.H55R,ENST00000618944,NM_001276698.1,c.164A>G,MODERATE,,deleterious(0.01),probably_damaging(0.91),-1;TP53,missense_variant,p.H82R,ENST00000510385,NM_001126116.1,c.245A>G,MODERATE,,deleterious(0.01),probably_damaging(0.91),-1;TP53,missense_variant,p.H82R,ENST00000504290,NM_001126117.1,c.245A>G,MODERATE,,deleterious(0.02),probably_damaging(0.938),-1;TP53,missense_variant,p.H55R,ENST00000610623,NM_001276699.1,c.164A>G,MODERATE,,deleterious(0.02),probably_damaging(0.938),-1;TP53,missense_variant,p.H55R,ENST00000619186,NM_001276697.1,c.164A>G,MODERATE,,tolerated(0.06),probably_damaging(0.922),-1;TP53,missense_variant,p.H82R,ENST00000504937,NM_001126115.1,c.245A>G,MODERATE,,deleterious(0.03),probably_damaging(0.922),-1;TP53,missense_variant,p.H214R,ENST00000359597,,c.641A>G,MODERATE,,deleterious(0.04),probably_damaging(0.91),-1;TP53,missense_variant,p.H203R,ENST00000615910,,c.608A>G,MODERATE,,deleterious(0.01),probably_damaging(0.954),-1;TP53,missense_variant,p.H214R,ENST00000413465,,c.641A>G,MODERATE,,deleterious(0.02),probably_damaging(0.979),-1;TP53,missense_variant,p.H82R,ENST00000509690,,c.245A>G,MODERATE,,deleterious(0.02),probably_damaging(0.922),-1;TP53,missense_variant,p.H121R,ENST00000514944,,c.362A>G,MODERATE,,deleterious(0.03),probably_damaging(0.95),-1;TP53,downstream_gene_variant,,ENST00000508793,,,MODIFIER,,,,-1;TP53,downstream_gene_variant,,ENST00000604348,,,MODIFIER,,,,-1;TP53,downstream_gene_variant,,ENST00000503591,,,MODIFIER,,,,-1;TP53,upstream_gene_variant,,ENST00000576024,,,MODIFIER,,,,-1;TP53,intron_variant,,ENST00000574684,,n.67+163A>G,MODIFIER,,,,-1;TP53,non_coding_transcript_exon_variant,,ENST00000505014,,n.897A>G,MODIFIER,,,,-1|TP53,missense_variant,p.H214R,ENST00000617185,NM_001126114.2,c.641A>G,MODERATE,,deleterious(0.04),probably_damaging(0.91),-1;TP53,missense_variant,p.H214R,ENST00000420246,,c.641A>G,MODERATE,,deleterious(0.04),probably_damaging(0.91),-1;TP53,missense_variant,p.H175R,ENST00000622645,NM_001276696.1,c.524A>G,MODERATE,,deleterious(0.02),probably_damaging(0.91),-1;TP53,missense_variant,p.H175R,ENST00000610292,NM_001126118.1,c.524A>G,MODERATE,,deleterious(0.03),probably_damaging(0.922),-1;TP53,missense_variant,p.H214R,ENST00000455263,NM_001126113.2,c.641A>G,MODERATE,,deleterious(0.04),probably_damaging(0.938),-1;TP53,missense_variant,p.H175R,ENST00000610538,NM_001276695.1,c.524A>G,MODERATE,,deleterious(0.02),probably_damaging(0.938),-1;TP53,missense_variant,p.H175R,ENST00000620739,NM_001276761.1&NM_001276760.1,c.524A>G,MODERATE,,deleterious(0.03),probably_damaging(0.922),-1;TP53,missense_variant,p.H214R,ENST00000269305,NM_000546.5&NM_001126112.2,c.641A>G,MODERATE,YES,deleterious(0.02),probably_damaging(0.922),-1;TP53,missense_variant,p.H214R,ENST00000445888,,c.641A>G,MODERATE,,deleterious(0.02),probably_damaging(0.922),-1;TP53,missense_variant,p.H175R,ENST00000619485,,c.524A>G,MODERATE,,deleterious(0.03),probably_damaging(0.922),-1;TP53,missense_variant,p.H82R,ENST00000510385,NM_001126116.1,c.245A>G,MODERATE,,deleterious(0.01),probably_damaging(0.91),-1;TP53,missense_variant,p.H55R,ENST00000618944,NM_001276698.1,c.164A>G,MODERATE,,deleterious(0.01),probably_damaging(0.91),-1;TP53,missense_variant,p.H82R,ENST00000504290,NM_001126117.1,c.245A>G,MODERATE,,deleterious(0.02),probably_damaging(0.938),-1;TP53,missense_variant,p.H55R,ENST00000610623,NM_001276699.1,c.164A>G,MODERATE,,deleterious(0.02),probably_damaging(0.938),-1;TP53,missense_variant,p.H82R,ENST00000504937,NM_001126115.1,c.245A>G,MODERATE,,deleterious(0.03),probably_damaging(0.922),-1;TP53,missense_variant,p.H55R,ENST00000619186,NM_001276697.1,c.164A>G,MODERATE,,tolerated(0.06),probably_damaging(0.922),-1;TP53,missense_variant,p.H214R,ENST00000359597,,c.641A>G,MODERATE,,deleterious(0.04),probably_damaging(0.91),-1;TP53,missense_variant,p.H203R,ENST00000615910,,c.608A>G,MODERATE,,deleterious(0.01),probably_damaging(0.954),-1;TP53,missense_variant,p.H214R,ENST00000413465,,c.641A>G,MODERATE,,deleterious(0.02),probably_damaging(0.979),-1;TP53,missense_variant,p.H82R,ENST00000509690,,c.245A>G,MODERATE,,deleterious(0.02),probably_damaging(0.922),-1;TP53,missense_variant,p.H121R,ENST00000514944,,c.362A>G,MODERATE,,deleterious(0.03),probably_damaging(0.95),-1;TP53,downstream_gene_variant,,ENST00000508793,,,MODIFIER,,,,-1;TP53,downstream_gene_variant,,ENST00000604348,,,MODIFIER,,,,-1;TP53,downstream_gene_variant,,ENST00000503591,,,MODIFIER,,,,-1;TP53,upstream_gene_variant,,ENST00000576024,,,MODIFIER,,,,-1;TP53,intron_variant,,ENST00000574684,,n.67+163A>G,MODIFIER,,,,-1;TP53,non_coding_transcript_exon_variant,,ENST00000505014,,n.897A>G,MODIFIER,,,,-1\", \"C\", \"ENSG00000141510\", \"ENST00000269305\", \"Transcript\", \"missense_variant\", \"missense_variant\", \"831/2579\", \"641/1182\", \"214/393\", \"H/R\", \"cAt/cGt\", \"TP53_g.12710A>G\", \"1\", \"None\", -1, \"TP53\", \"HGNC\", \"HGNC:11998\", \"protein_coding\", \"YES\", \"CCDS11118.1\", \"ENSP00000269305\", \"P04637\", \"K7PPA8\", \"None\", \"NM_000546.5;NM_001126112.2\", \"deleterious(0.02)\", \"probably_damaging(0.922)\", \"6/11\", \"None\", \"Pfam_domain:PF00870;Prints_domain:PR00386;Superfamily_domains:SSF49417\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODERATE\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"CACTATGTCGA\", \"7ccd6ac4-820a-4bb6-a1d5-59e6007fbc3d|ebaeca89-9782-4b80-a3f9-87aebb40c6a1\", \"dd7b9f39-ebd0-4873-9423-74e6a9eeeba6\", \"49b9ee4c-ab34-4ac9-8524-12cf6ca1b6cf\", \"38dd826d-06dc-4a73-b852-c3d78c9c3ff4\", \"wga_pair\", \"COSM1640840;COSM307279;COSM307280;COSM307281;COSM307282;COSM3388198;COSM43687\", \"True\", \"Unknown\", \"somaticsniper|varscan\", \"61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-d5ab-4024-98fb-b6c46f9d90a9\", \"TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca-e9928fd4b936.DR-10.0.somatic.maf|TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46f9d90a9.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-7011\", \"TCGA-DU-7011-01A\", \"TCGA-DU-7011-10A\", \"TCGA-DU-7011-01A-11D-2024-08\", \"TCGA-DU-7011-10A-01D-2024-08\", \"SIRPB1\", 10326, \"BI\", \"GRCh38\", \"chr20\", 1605035, 1605035, \"+\", \"Intron\", \"SNP\", \"G\", \"G\", \"A\", \"novel\", \"None\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"a998b8e9-3711-460c-8e4b-6597b6760a15\", \"faf5593b-8173-4404-adef-379c03202b68\", \"c.76+14834C>T\", \"None\", \"None\", \"ENST00000381605\", \"None\", \"28|30\", \"24|25\", \"4|5\", \"84|25\", \"SIRPB1,missense_variant,p.S153L,ENST00000279477,NM_001135844.2,c.458C>T,MODERATE,,tolerated(0.41),benign(0.007),-1;SIRPB1,missense_variant,p.S153L,ENST00000568365,,c.458C>T,MODERATE,,tolerated(0.41),benign(0.007),-1;SIRPB1,intron_variant,,ENST00000381605,NM_006065.3,c.76+14834C>T,MODIFIER,YES,,,-1;SIRPB1,intron_variant,,ENST00000381603,NM_001083910.2,c.76+14834C>T,MODIFIER,,,,-1;RP4-576H24.4,intron_variant,,ENST00000564763,,c.76+14834C>T,MODIFIER,,,,-1;RP4-576H24.4,intron_variant,,ENST00000566961,,c.207+6322C>T,MODIFIER,,,,-1;SIRPB1,intron_variant,,ENST00000569629,,c.64+6322C>T,MODIFIER,,,,-1;SIRPB1,upstream_gene_variant,,ENST00000569387,,,MODIFIER,,,,-1;SIRPB1,upstream_gene_variant,,ENST00000566055,,,MODIFIER,,,,-1;SIRPB1,upstream_gene_variant,,ENST00000565087,,,MODIFIER,,,,-1;SIRPB1,upstream_gene_variant,,ENST00000562014,,,MODIFIER,,,,-1;SIRPB1,non_coding_transcript_exon_variant,,ENST00000381596,,n.596C>T,MODIFIER,,,,-1;SIRPB1,intron_variant,,ENST00000565775,,n.193+14834C>T,MODIFIER,,,,-1;SIRPB1,upstream_gene_variant,,ENST00000565230,,,MODIFIER,,,,-1\", \"A\", \"ENSG00000101307\", \"ENST00000381605\", \"Transcript\", \"intron_variant\", \"intron_variant\", \"-/3241\", \"-/1197\", \"-/398\", \"None\", \"None\", \"None\", \"1\", \"None\", -1, \"SIRPB1\", \"HGNC\", \"HGNC:15928\", \"protein_coding\", \"YES\", \"CCDS13019.1\", \"ENSP00000371018\", \"O00241\", \"None\", \"UPI000036700F\", \"NM_006065.3\", \"None\", \"None\", \"None\", \"1/5\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"MODIFIER\", \"1\", \"SNV\", 1.0, NaN, \"None\", \"1\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"None\", \"PASS\", \"GGCCCGATACC\", \"ac696fc8-82f2-4e9e-9273-f7b28f8a0d8b|6cc39480-c0cd-4151-9646-5a23021cbc87\", \"265b7262-df74-4239-a5f6-77c326cf5f4e\", \"e9c5af45-ba04-4ea4-ac71-7c48fc9205f0\", \"cb598780-9e42-4167-b487-eec90ad4f36f\", \"None\", \"None\", \"True\", \"Unknown\", \"mutect|varscan\", \"1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"], [\"TCGA-LGG\", \"TCGA-DU-7290\", \"TCGA-DU-7290-01A\", \"TCGA-DU-7290-10A\", \"TCGA-DU-7290-01A-11D-2024-08\", \"TCGA-DU-7290-10A-01D-2024-08\", \"MXRA5\", 25878, \"BI\", \"GRCh38\", \"chrX\", 3311477, 3311477, \"+\", \"Silent\", \"SNP\", \"C\", \"C\", \"T\", \"rs182612819\", \"by1000G;byCluster\", \"None\", \"None\", \"Somatic\", \"None\", \"Illumina HiSeq 2000\", \"78e1afce-55f4-4924-9fa3-4e5227c2818c\", \"a58fe3f9-3bcd-4481-9f8d-4fcf99e84d62\", \"c.6726G>A\", \"p.=\", \"p.P2242P\", \"ENST00000217939\", \"7/7\", \"158|156|158|130\", \"121|120|121|102\", \"37|36|37|28\", \"128|127|128|112\", \"MXRA5,synonymous_variant,p.P2242P,ENST00000217939,NM_015419.3,c.6726G>A,LOW,YES,,,-1\", \"T\", \"ENSG00000101825\", \"ENST00000217939\", \"Transcript\", \"synonymous_variant\", \"synonymous_variant\", \"6881/9793\", \"6726/8487\", \"2242/2828\", \"P\", \"ccG/ccA\", \"rs182612819\", \"1\", \"None\", -1, \"MXRA5\", \"HGNC\", \"HGNC:7539\", \"protein_coding\", \"YES\", \"CCDS14124.1\", \"ENSP00000217939\", \"Q9NR99\", \"None\", \"UPI000013C73B\", \"NM_015419.3\", \"None\", \"None\", \"7/7\", \"None\", \"PROSITE_profiles:PS50835;Superfamily_domains:SSF48726;Superfamily_domains:SSF48726\", \"0.0003\", \"0.0\", \"0.0\", \"0.0\", \"0.001\", \"0.0\", \"None\", \"None\", \"None\", \"None\", \"None\", \"LOW\", \"1\", \"SNV\", 5.0, NaN, \"None\", \"1\", \"6.589e-05\", \"8.031e-05\", \"0\", \"0\", \"0\", \"0\", \"0.000105\", \"0\", \"0.0001982\", \"PASS\", \"TTGGCCGGTTT\", \"3066ed58-ddc6-4edd-b987-5a2e7fccd727|153fb375-8988-4458-9eeb-b7cc005a9d92|ac4ccae5-3210-47d0-a572-0ce2f9373ebe|8aab7c16-74f3-4c2a-89d8-97356841e412\", \"cbf5d324-9fa0-4e81-a5a1-0a1d447a1f19\", \"7803ef81-54b1-40f8-8093-19d608b2c8dd\", \"e00a9855-c15e-46ef-988f-25ca64ec4717\", \"None\", \"COSM3973603;COSM3973604\", \"True\", \"Unknown\", \"muse|mutect|somaticsniper|varscan\", \"27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-fcde-41d3-9ae3-47cfaf527f25|76313658-c6df-4f73-8e04-affdbb0013bd|7381c199-3770-4453-bb27-68fbd356cb54\", \"TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c597c9c.DR-10.0.somatic.maf|TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf527f25.DR-10.0.somatic.maf|TCGA.LGG.somaticsniper.76313658-c6df-4f73-8e04-affdbb0013bd.DR-10.0.somatic.maf|TCGA.LGG.varscan.7381c199-3770-4453-bb27-68fbd356cb54.DR-10.0.somatic.maf\"]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"paging\": true, \"scrollCollapse\": true, \"scrollX\": \"200px\"};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        // Display the table\n",
       "        $(document).ready(function () {\n",
       "            \n",
       "            window.__itables_render('#c44d1e3e-ac89-4c84-9565-ca0939740efd', dt_args);\n",
       "        });\n",
       "    }\n",
       "</script>\n"
      ],
      "text/plain": [
       "   project_short_name  case_barcode sample_barcode_tumor  \\\n",
       "0            TCGA-GBM  TCGA-06-5415     TCGA-06-5415-01A   \n",
       "1            TCGA-GBM  TCGA-32-5222     TCGA-32-5222-01A   \n",
       "2            TCGA-GBM  TCGA-41-5651     TCGA-41-5651-01A   \n",
       "3            TCGA-LGG  TCGA-HT-8109     TCGA-HT-8109-01A   \n",
       "4            TCGA-LGG  TCGA-HW-A5KL     TCGA-HW-A5KL-01A   \n",
       "..                ...           ...                  ...   \n",
       "95           TCGA-LGG  TCGA-HT-7677     TCGA-HT-7677-01A   \n",
       "96           TCGA-GBM  TCGA-14-0787     TCGA-14-0787-01A   \n",
       "97           TCGA-GBM  TCGA-14-1821     TCGA-14-1821-01A   \n",
       "98           TCGA-LGG  TCGA-DU-7011     TCGA-DU-7011-01A   \n",
       "99           TCGA-LGG  TCGA-DU-7290     TCGA-DU-7290-01A   \n",
       "\n",
       "   sample_barcode_normal         aliquot_barcode_tumor  \\\n",
       "0       TCGA-06-5415-10A  TCGA-06-5415-01A-01D-1486-08   \n",
       "1       TCGA-32-5222-10A  TCGA-32-5222-01A-01D-1486-08   \n",
       "2       TCGA-41-5651-10A  TCGA-41-5651-01A-01D-1696-08   \n",
       "3       TCGA-HT-8109-10A  TCGA-HT-8109-01A-11D-2395-08   \n",
       "4       TCGA-HW-A5KL-10A  TCGA-HW-A5KL-01A-11D-A27K-08   \n",
       "..                   ...                           ...   \n",
       "95      TCGA-HT-7677-10A  TCGA-HT-7677-01A-11D-2253-08   \n",
       "96      TCGA-14-0787-10A  TCGA-14-0787-01A-01D-1492-08   \n",
       "97      TCGA-14-1821-10A  TCGA-14-1821-01A-01W-0643-08   \n",
       "98      TCGA-DU-7011-10A  TCGA-DU-7011-01A-11D-2024-08   \n",
       "99      TCGA-DU-7290-10A  TCGA-DU-7290-01A-11D-2024-08   \n",
       "\n",
       "          aliquot_barcode_normal Hugo_Symbol  Entrez_Gene_Id Center  \\\n",
       "0   TCGA-06-5415-10A-01D-1486-08       RASA1            5921     BI   \n",
       "1   TCGA-32-5222-10A-01D-1486-08       HECW1           23072     BI   \n",
       "2   TCGA-41-5651-10A-01D-1696-08    CDC42EP3           10602     BI   \n",
       "3   TCGA-HT-8109-10A-01D-2396-08       LOXL4           84171     BI   \n",
       "4   TCGA-HW-A5KL-10A-01D-A27N-08       UBXN1           51035     BI   \n",
       "..                           ...         ...             ...    ...   \n",
       "95  TCGA-HT-7677-10A-01D-2253-08      ARID1B           57492     BI   \n",
       "96  TCGA-14-0787-10A-01D-1492-08       NOP56           10528     BI   \n",
       "97  TCGA-14-1821-10A-01W-0644-08        TP53            7157     BI   \n",
       "98  TCGA-DU-7011-10A-01D-2024-08      SIRPB1           10326     BI   \n",
       "99  TCGA-DU-7290-10A-01D-2024-08       MXRA5           25878     BI   \n",
       "\n",
       "   NCBI_Build  ...                        tumor_bam_uuid  \\\n",
       "0      GRCh38  ...  b49524b5-c615-4893-895d-bc2a24688ffa   \n",
       "1      GRCh38  ...  44e42588-b00e-4282-9f57-74c15b5aee1a   \n",
       "2      GRCh38  ...  06526eec-5632-4c24-a035-274bd3118661   \n",
       "3      GRCh38  ...  d25043dd-2196-496a-aeeb-5adadf1adb84   \n",
       "4      GRCh38  ...  3ad19e57-5d90-4624-9320-9320d1535086   \n",
       "..        ...  ...                                   ...   \n",
       "95     GRCh38  ...  359da179-14d2-4e7c-901e-864f03cdad8d   \n",
       "96     GRCh38  ...  211cf8f0-d56b-447e-9fd8-f2622b75e94b   \n",
       "97     GRCh38  ...  dd7b9f39-ebd0-4873-9423-74e6a9eeeba6   \n",
       "98     GRCh38  ...  265b7262-df74-4239-a5f6-77c326cf5f4e   \n",
       "99     GRCh38  ...  cbf5d324-9fa0-4e81-a5a1-0a1d447a1f19   \n",
       "\n",
       "                         normal_bam_uuid  \\\n",
       "0   0a26c1a1-5900-4dac-b5ee-bf7b94fbafb2   \n",
       "1   41a523dd-b452-4c4c-b46b-6461cf478fcc   \n",
       "2   950aea08-5e79-4aa6-b015-0f9cb6836211   \n",
       "3   0e6b0fb2-46ff-4901-be54-926f4bed5f73   \n",
       "4   a377e4b9-2de0-457c-87bc-1253f14a42ca   \n",
       "..                                   ...   \n",
       "95  f29abb60-b6a6-4742-a4e8-9656c501f4b8   \n",
       "96  b2250dde-b989-4e6b-a075-ea96326bd3aa   \n",
       "97  49b9ee4c-ab34-4ac9-8524-12cf6ca1b6cf   \n",
       "98  e9c5af45-ba04-4ea4-ac71-7c48fc9205f0   \n",
       "99  7803ef81-54b1-40f8-8093-19d608b2c8dd   \n",
       "\n",
       "                                 case_id GDC_FILTER  \\\n",
       "0   713190ed-c6c1-4695-814b-85ca9b95e6a0       None   \n",
       "1   e876dd29-68b0-4bf1-83d1-488c40068a35       None   \n",
       "2   c184c3ca-7ad3-4202-b108-cb9fd5f5d947       None   \n",
       "3   c7b2833a-9fe8-49f6-b888-2d27b0516f5c       None   \n",
       "4   0639b753-4099-4ca4-adb9-763069a614ef       None   \n",
       "..                                   ...        ...   \n",
       "95  00b18ad6-ff70-41fe-8f4d-0763ac8f28b9       None   \n",
       "96  a2338b30-f511-4163-af3b-1e4a40ff00e1       None   \n",
       "97  38dd826d-06dc-4a73-b852-c3d78c9c3ff4   wga_pair   \n",
       "98  cb598780-9e42-4167-b487-eec90ad4f36f       None   \n",
       "99  e00a9855-c15e-46ef-988f-25ca64ec4717       None   \n",
       "\n",
       "                                               COSMIC MC3_Overlap  \\\n",
       "0                             COSM2153241;COSM2153242        True   \n",
       "1                             COSM3412060;COSM3412061        True   \n",
       "2                                                None        True   \n",
       "3                                         COSM3966822        True   \n",
       "4                                                None       False   \n",
       "..                                                ...         ...   \n",
       "95                                               None        True   \n",
       "96                                               None       False   \n",
       "97  COSM1640840;COSM307279;COSM307280;COSM307281;C...        True   \n",
       "98                                               None        True   \n",
       "99                            COSM3973603;COSM3973604        True   \n",
       "\n",
       "   GDC_Validation_Status                         callerName  \\\n",
       "0                Unknown  muse|mutect|somaticsniper|varscan   \n",
       "1                Unknown                muse|mutect|varscan   \n",
       "2                Unknown               mutect|somaticsniper   \n",
       "3                Unknown  muse|mutect|somaticsniper|varscan   \n",
       "4                Unknown  muse|mutect|somaticsniper|varscan   \n",
       "..                   ...                                ...   \n",
       "95               Unknown                     mutect|varscan   \n",
       "96               Unknown                            varscan   \n",
       "97               Unknown              somaticsniper|varscan   \n",
       "98               Unknown                     mutect|varscan   \n",
       "99               Unknown  muse|mutect|somaticsniper|varscan   \n",
       "\n",
       "                                             fileUUID  \\\n",
       "0   59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-...   \n",
       "1   59a84472-27d4-497c-8f37-8bc447ff9374|da904cd3-...   \n",
       "2   da904cd3-79d7-4ae3-b6c0-e7127998b3e6|61b82eef-...   \n",
       "3   27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-...   \n",
       "4   27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-...   \n",
       "..                                                ...   \n",
       "95  1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-...   \n",
       "96               8f06ee91-d5ab-4024-98fb-b6c46f9d90a9   \n",
       "97  61b82eef-f454-434f-a1ca-e9928fd4b936|8f06ee91-...   \n",
       "98  1e0694ca-fcde-41d3-9ae3-47cfaf527f25|7381c199-...   \n",
       "99  27330980-b14d-4d4d-bd65-5eb19c597c9c|1e0694ca-...   \n",
       "\n",
       "                                             fileName  \n",
       "0   TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff...  \n",
       "1   TCGA.GBM.muse.59a84472-27d4-497c-8f37-8bc447ff...  \n",
       "2   TCGA.GBM.mutect.da904cd3-79d7-4ae3-b6c0-e71279...  \n",
       "3   TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c59...  \n",
       "4   TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c59...  \n",
       "..                                                ...  \n",
       "95  TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf...  \n",
       "96  TCGA.GBM.varscan.8f06ee91-d5ab-4024-98fb-b6c46...  \n",
       "97  TCGA.GBM.somaticsniper.61b82eef-f454-434f-a1ca...  \n",
       "98  TCGA.LGG.mutect.1e0694ca-fcde-41d3-9ae3-47cfaf...  \n",
       "99  TCGA.LGG.muse.27330980-b14d-4d4d-bd65-5eb19c59...  \n",
       "\n",
       "[100 rows x 109 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mutationresults = myquery.mutation.run()\n",
    "mutationresults.to_dataframe()"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "5c867d1980d5b66d2bfc8a5903dcee074b4b68f3917a4f27f8a310cab24e9f1b"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  },
  "metadata": {
   "interpreter": {
    "hash": "5c867d1980d5b66d2bfc8a5903dcee074b4b68f3917a4f27f8a310cab24e9f1b"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
