@prisma/studio-core 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/chunk-BUOKRYKO.js +10 -0
  2. package/dist/chunk-FRW62KTF.js +10 -0
  3. package/dist/chunk-P5LRZ6C2.js +10 -0
  4. package/dist/chunk-T2BEVNT5.js +10 -0
  5. package/dist/data/accelerate/index.cjs +2 -1
  6. package/dist/data/accelerate/index.d.cts +10 -2
  7. package/dist/data/accelerate/index.d.ts +10 -2
  8. package/dist/data/accelerate/index.js +10 -1
  9. package/dist/data/bff/index.cjs +2 -1
  10. package/dist/data/bff/index.d.cts +10 -3
  11. package/dist/data/bff/index.d.ts +10 -3
  12. package/dist/data/bff/index.js +10 -1
  13. package/dist/data/index.cjs +2 -1
  14. package/dist/data/index.d.cts +11 -2
  15. package/dist/data/index.d.ts +11 -2
  16. package/dist/data/index.js +10 -1
  17. package/dist/data/pglite/index.cjs +2 -1
  18. package/dist/data/pglite/index.d.cts +22 -5
  19. package/dist/data/pglite/index.d.ts +22 -5
  20. package/dist/data/pglite/index.js +10 -1
  21. package/dist/data/postgres-core/index.cjs +2 -1
  22. package/dist/data/postgres-core/index.d.cts +103 -18
  23. package/dist/data/postgres-core/index.d.ts +103 -18
  24. package/dist/data/postgres-core/index.js +10 -1
  25. package/dist/metafile-cjs.json +1 -0
  26. package/dist/metafile-esm.json +1 -0
  27. package/dist/query-Q-ZKX_Vr.d.cts +288 -0
  28. package/dist/query-Q-ZKX_Vr.d.ts +288 -0
  29. package/dist/ui/index.cjs +263 -1367
  30. package/dist/ui/index.css +1327 -680
  31. package/dist/ui/index.d.cts +69 -3
  32. package/dist/ui/index.d.ts +69 -3
  33. package/dist/ui/index.js +274 -41
  34. package/package.json +38 -31
  35. package/dist/CPIOZS5X-NALOZFPD.js +0 -1
  36. package/dist/OKF6E45R-6KC3BLVB.js +0 -1
  37. package/dist/adapter-Co8KY8Hi.d.cts +0 -166
  38. package/dist/adapter-Co8KY8Hi.d.ts +0 -166
  39. package/dist/chunk-2FW6TKD6.js +0 -1
  40. package/dist/chunk-5MNS4IJC.js +0 -1332
  41. package/dist/chunk-N2MLAUEV.js +0 -1
  42. package/dist/chunk-RGBMDID6.js +0 -1
  43. package/dist/chunk-ZCFLMQMM.js +0 -1
  44. package/dist/index-CnVNNyod.d.cts +0 -35
  45. package/dist/index-M4EjPWNJ.d.ts +0 -35
@@ -0,0 +1,10 @@
1
+ import * as ___react___ from 'react';
2
+ import * as ___react_dom___ from 'react-dom';
3
+
4
+ function require(mod) {
5
+ if (mod === 'react') return ___react___;
6
+ if (mod === 'react-dom') return ___react_dom___;
7
+ throw new Error(`Unknown module ${mod}`);
8
+ }
9
+ import{e as n}from"./chunk-P5LRZ6C2.js";n();n();n();n();n();function J(r){return typeof r>"u"||r===void 0}function g(r){return typeof r=="string"}function Fe(r){return typeof r=="number"}function Ir(r){return typeof r=="boolean"}function Br(r){return r===null}function mi(r){return r instanceof Date}function Dr(r){return typeof r=="bigint"}function W(r){return typeof r=="function"}function R(r){return typeof r=="object"&&r!==null}function o(r){return Object.freeze(r)}function wr(r){return Q(r)?r:[r]}function Q(r){return Array.isArray(r)}function F(r){return r}var l=o({is(r){return r.kind==="AlterTableNode"},create(r){return o({kind:"AlterTableNode",table:r})},cloneWithTableProps(r,e){return o({...r,...e})},cloneWithColumnAlteration(r,e){return o({...r,columnAlterations:r.columnAlterations?[...r.columnAlterations,e]:[e]})}});n();n();var c=o({is(r){return r.kind==="IdentifierNode"},create(r){return o({kind:"IdentifierNode",name:r})}});var X=o({is(r){return r.kind==="CreateIndexNode"},create(r){return o({kind:"CreateIndexNode",name:c.create(r)})},cloneWith(r,e){return o({...r,...e})},cloneWithColumns(r,e){return o({...r,columns:[...r.columns||[],...e]})}});n();var Qr=o({is(r){return r.kind==="CreateSchemaNode"},create(r,e){return o({kind:"CreateSchemaNode",schema:c.create(r),...e})},cloneWith(r,e){return o({...r,...e})}});n();var vo=["preserve rows","delete rows","drop"],z=o({is(r){return r.kind==="CreateTableNode"},create(r){return o({kind:"CreateTableNode",table:r,columns:o([])})},cloneWithColumn(r,e){return o({...r,columns:o([...r.columns,e])})},cloneWithConstraint(r,e){return o({...r,constraints:r.constraints?o([...r.constraints,e]):o([e])})},cloneWithFrontModifier(r,e){return o({...r,frontModifiers:r.frontModifiers?o([...r.frontModifiers,e]):o([e])})},cloneWithEndModifier(r,e){return o({...r,endModifiers:r.endModifiers?o([...r.endModifiers,e]):o([e])})},cloneWith(r,e){return o({...r,...e})}});n();n();var P=o({is(r){return r.kind==="SchemableIdentifierNode"},create(r){return o({kind:"SchemableIdentifierNode",identifier:c.create(r)})},createWithSchema(r,e){return o({kind:"SchemableIdentifierNode",schema:c.create(r),identifier:c.create(e)})}});var ge=o({is(r){return r.kind==="DropIndexNode"},create(r,e){return o({kind:"DropIndexNode",name:P.create(r),...e})},cloneWith(r,e){return o({...r,...e})}});n();var xr=o({is(r){return r.kind==="DropSchemaNode"},create(r,e){return o({kind:"DropSchemaNode",schema:c.create(r),...e})},cloneWith(r,e){return o({...r,...e})}});n();var Or=o({is(r){return r.kind==="DropTableNode"},create(r,e){return o({kind:"DropTableNode",table:r,...e})},cloneWith(r,e){return o({...r,...e})}});n();n();var v=o({is(r){return r.kind==="AliasNode"},create(r,e){return o({kind:"AliasNode",node:r,alias:e})}});n();var $=o({is(r){return r.kind==="TableNode"},create(r){return o({kind:"TableNode",table:P.create(r)})},createWithSchema(r,e){return o({kind:"TableNode",table:P.createWithSchema(r,e)})}});n();n();n();function C(r){return R(r)&&W(r.toOperationNode)}function Pr(r){return R(r)&&"expressionType"in r&&C(r)}function Lo(r){return R(r)&&"expression"in r&&g(r.alias)&&C(r)}n();n();n();var ae=o({is(r){return r.kind==="SelectModifierNode"},create(r,e){return o({kind:"SelectModifierNode",modifier:r,of:e})},createWithExpression(r){return o({kind:"SelectModifierNode",rawModifier:r})}});n();n();n();n();var V=o({is(r){return r.kind==="AndNode"},create(r,e){return o({kind:"AndNode",left:r,right:e})}});n();var Z=o({is(r){return r.kind==="OrNode"},create(r,e){return o({kind:"OrNode",left:r,right:e})}});var vr=o({is(r){return r.kind==="OnNode"},create(r){return o({kind:"OnNode",on:r})},cloneWithOperation(r,e,t){return o({...r,on:e==="And"?V.create(r.on,t):Z.create(r.on,t)})}});var le=o({is(r){return r.kind==="JoinNode"},create(r,e){return o({kind:"JoinNode",joinType:r,table:e,on:void 0})},createWithOn(r,e,t){return o({kind:"JoinNode",joinType:r,table:e,on:vr.create(t)})},cloneWithOn(r,e){return o({...r,on:r.on?vr.cloneWithOperation(r.on,"And",e):vr.create(e)})}});n();n();var Ce=o({is(r){return r.kind==="BinaryOperationNode"},create(r,e,t){return o({kind:"BinaryOperationNode",leftOperand:r,operator:e,rightOperand:t})}});n();var In=["=","==","!=","<>",">",">=","<","<=","in","not in","is","is not","like","not like","match","ilike","not ilike","@>","<@","^@","&&","?","?&","?|","!<","!>","<=>","!~","~","~*","!~*","@@","@@@","!!","<->","regexp","is distinct from","is not distinct from"],Bn=["+","-","*","/","%","^","&","|","#","<<",">>"],Fo=["->","->>"],Dn=[...In,...Bn,"&&","||"],Qn=["exists","not exists"],Pn=["not","-",...Qn],Mo=[...Dn,...Fo,...Pn,"between","between symmetric"],_=o({is(r){return r.kind==="OperatorNode"},create(r){return o({kind:"OperatorNode",operator:r})}});function Ft(r){return g(r)&&Fo.includes(r)}n();n();var h=o({is(r){return r.kind==="ColumnNode"},create(r){return o({kind:"ColumnNode",column:c.create(r)})}});n();n();var Me=o({is(r){return r.kind==="SelectAllNode"},create(){return o({kind:"SelectAllNode"})}});var ze=o({is(r){return r.kind==="ReferenceNode"},create(r,e){return o({kind:"ReferenceNode",table:e,column:r})},createSelectAll(r){return o({kind:"ReferenceNode",table:r,column:Me.create()})}});n();n();var Lr=class{#e;get dynamicReference(){return this.#e}get refType(){}constructor(e){this.#e=e}toOperationNode(){return Mt(this.#e)}};function Fr(r){return R(r)&&C(r)&&g(r.dynamicReference)}n();var ee=o({is(r){return r.kind==="OrderByItemNode"},create(r,e){return o({kind:"OrderByItemNode",orderBy:r,direction:e})},cloneWith(r,e){return o({...r,...e})}});n();var L=o({is(r){return r.kind==="RawNode"},create(r,e){return o({kind:"RawNode",sqlFragments:o(r),parameters:o(e)})},createWithSql(r){return L.create([r],[])},createWithChild(r){return L.create(["",""],[r])},createWithChildren(r){return L.create(new Array(r.length+1).fill(""),r)}});n();n();var zo={is(r){return r.kind==="CollateNode"},create(r){return o({kind:"CollateNode",collation:c.create(r)})}};var Mr=class r{#e;constructor(e){this.#e=o(e)}desc(){return new r({node:ee.cloneWith(this.#e.node,{direction:L.createWithSql("desc")})})}asc(){return new r({node:ee.cloneWith(this.#e.node,{direction:L.createWithSql("asc")})})}nullsLast(){return new r({node:ee.cloneWith(this.#e.node,{nulls:"last"})})}nullsFirst(){return new r({node:ee.cloneWith(this.#e.node,{nulls:"first"})})}collate(e){return new r({node:ee.cloneWith(this.#e.node,{collation:zo.create(e)})})}toOperationNode(){return this.#e.node}};n();var Vo=new Set;function Ve(r){Vo.has(r)||(Vo.add(r),console.log(r))}function Vt(r){return r==="asc"||r==="desc"}function K(r){if(r.length===2)return[zt(r[0],r[1])];if(r.length===1){let[e]=r;return Array.isArray(e)?(Ve("orderBy(array) is deprecated, use multiple orderBy calls instead."),e.map(t=>zt(t))):[zt(e)]}throw new Error(`Invalid number of arguments at order by! expected 1-2, received ${r.length}`)}function zt(r,e){let t=vn(r);if(ee.is(t)){if(e)throw new Error("Cannot specify direction twice!");return t}return Uo(t,e)}function vn(r){if(pe(r))return U(r);if(Fr(r))return r.toOperationNode();let[e,t]=r.split(" ");return t?(Ve("`orderBy('column asc')` is deprecated. Use `orderBy('column', 'asc')` instead."),Uo(re(e),t)):re(r)}function Uo(r,e){if(typeof e=="string"){if(!Vt(e))throw new Error(`Invalid order by direction: ${e}`);return ee.create(r,L.createWithSql(e))}if(Pr(e))return Ve("`orderBy(..., expr)` is deprecated. Use `orderBy(..., 'asc')` or `orderBy(..., (ob) => ...)` instead."),ee.create(r,e.toOperationNode());let t=ee.create(r);return e?e(new Mr({node:t})).toOperationNode():t}n();var Ue=o({is(r){return r.kind==="JSONReferenceNode"},create(r,e){return o({kind:"JSONReferenceNode",reference:r,traversal:e})},cloneWithTraversal(r,e){return o({...r,traversal:e})}});n();var zr=o({is(r){return r.kind==="JSONOperatorChainNode"},create(r){return o({kind:"JSONOperatorChainNode",operator:r,values:o([])})},cloneWithValue(r,e){return o({...r,values:o([...r.values,e])})}});n();var be=o({is(r){return r.kind==="JSONPathNode"},create(r){return o({kind:"JSONPathNode",inOperator:r,pathLegs:o([])})},cloneWithLeg(r,e){return o({...r,pathLegs:o([...r.pathLegs,e])})}});function Mt(r){return g(r)?re(r):r.toOperationNode()}function fe(r){return Q(r)?r.map(e=>q(e)):[q(r)]}function q(r){return pe(r)?U(r):Mt(r)}function Jo(r,e){let t=re(r);if(Ft(e))return Ue.create(t,zr.create(_.create(e)));let i=e.slice(0,-1);if(Ft(i))return Ue.create(t,be.create(_.create(i)));throw new Error(`Invalid JSON operator: ${e}`)}function re(r){let e=".";if(!r.includes(e))return ze.create(h.create(r));let t=r.split(e).map(Jt);if(t.length===3)return Ln(t);if(t.length===2)return Fn(t);throw new Error(`invalid column reference ${r}`)}function $o(r){let e=" as ";if(r.includes(e)){let[t,i]=r.split(e).map(Jt);return v.create(re(t),c.create(i))}else return re(r)}function Ut(r){return h.create(r)}function Je(r){let e=" ";if(r.includes(e)){let[t,i]=r.split(e).map(Jt);if(!Vt(i))throw new Error(`invalid order direction "${i}" next to "${t}"`);return K([t,i])[0]}else return Ut(r)}function Ln(r){let[e,t,i]=r;return ze.create(h.create(i),$.createWithSchema(e,t))}function Fn(r){let[e,t]=r;return ze.create(h.create(t),$.create(e))}function Jt(r){return r.trim()}n();n();var Vr=o({is(r){return r.kind==="PrimitiveValueListNode"},create(r){return o({kind:"PrimitiveValueListNode",values:o([...r])})}});n();var ue=o({is(r){return r.kind==="ValueListNode"},create(r){return o({kind:"ValueListNode",values:o(r)})}});n();var k=o({is(r){return r.kind==="ValueNode"},create(r){return o({kind:"ValueNode",value:r})},createImmediate(r){return o({kind:"ValueNode",value:r,immediate:!0})}});function Ko(r){return Q(r)?Mn(r):x(r)}function x(r){return pe(r)?U(r):k.create(r)}function Ur(r){return Fe(r)||Ir(r)||Br(r)}function Wr(r){if(!Ur(r))throw new Error(`unsafe immediate value ${JSON.stringify(r)}`);return k.createImmediate(r)}function Mn(r){return r.some(pe)?ue.create(r.map(e=>x(e))):Vr.create(r)}n();var ke=o({is(r){return r.kind==="ParensNode"},create(r){return o({kind:"ParensNode",node:r})}});function y(r){if(r.length===3)return Jr(r[0],r[1],r[2]);if(r.length===1)return x(r[0]);throw new Error(`invalid arguments: ${JSON.stringify(r)}`)}function Jr(r,e,t){return zn(e)&&jo(t)?Ce.create(q(r),$t(e),k.createImmediate(t)):Ce.create(q(r),$t(e),Ko(t))}function S(r,e,t){return Ce.create(q(r),$t(e),q(t))}function Kt(r,e){return $e(Object.entries(r).filter(([,t])=>!J(t)).map(([t,i])=>Jr(t,jo(i)?"is":"=",i)),e)}function $e(r,e,t=!0){let i=e==="and"?V.create:Z.create;if(r.length===0)return Ce.create(k.createImmediate(1),_.create("="),k.createImmediate(e==="and"?1:0));let a=Go(r[0]);for(let d=1;d<r.length;++d)a=i(a,Go(r[d]));return r.length>1&&t?ke.create(a):a}function zn(r){return r==="is"||r==="is not"}function jo(r){return Br(r)||Ir(r)}function $t(r){if(g(r)&&Mo.includes(r))return _.create(r);if(C(r))return r.toOperationNode();throw new Error(`invalid operator ${JSON.stringify(r)}`)}function Go(r){return C(r)?r.toOperationNode():r}n();n();n();var Ne=o({is(r){return r.kind==="OrderByNode"},create(r){return o({kind:"OrderByNode",items:o([...r])})},cloneWithItems(r,e){return o({...r,items:o([...r.items,...e])})}});n();var Gt=o({is(r){return r.kind==="PartitionByNode"},create(r){return o({kind:"PartitionByNode",items:o(r)})},cloneWithItems(r,e){return o({...r,items:o([...r.items,...e])})}});var gr=o({is(r){return r.kind==="OverNode"},create(){return o({kind:"OverNode"})},cloneWithOrderByItems(r,e){return o({...r,orderBy:r.orderBy?Ne.cloneWithItems(r.orderBy,e):Ne.create(e)})},cloneWithPartitionByItems(r,e){return o({...r,partitionBy:r.partitionBy?Gt.cloneWithItems(r.partitionBy,e):Gt.create(e)})}});n();n();var qe=o({is(r){return r.kind==="FromNode"},create(r){return o({kind:"FromNode",froms:o(r)})},cloneWithFroms(r,e){return o({...r,froms:o([...r.froms,...e])})}});n();var jt=o({is(r){return r.kind==="GroupByNode"},create(r){return o({kind:"GroupByNode",items:o(r)})},cloneWithItems(r,e){return o({...r,items:o([...r.items,...e])})}});n();var Ht=o({is(r){return r.kind==="HavingNode"},create(r){return o({kind:"HavingNode",having:r})},cloneWithOperation(r,e,t){return o({...r,having:e==="And"?V.create(r.having,t):Z.create(r.having,t)})}});n();n();var b=o({is(r){return r.kind==="InsertQueryNode"},create(r,e,t){return o({kind:"InsertQueryNode",into:r,...e&&{with:e},replace:t})},createWithoutInto(){return o({kind:"InsertQueryNode"})},cloneWith(r,e){return o({...r,...e})}});n();n();var $r=o({is(r){return r.kind==="ListNode"},create(r){return o({kind:"ListNode",items:o(r)})}});var de=o({is(r){return r.kind==="UpdateQueryNode"},create(r,e){return o({kind:"UpdateQueryNode",table:r.length===1?r[0]:$r.create(r),...e&&{with:e}})},createWithoutTable(){return o({kind:"UpdateQueryNode"})},cloneWithFromItems(r,e){return o({...r,from:r.from?qe.cloneWithFroms(r.from,e):qe.create(e)})},cloneWithUpdates(r,e){return o({...r,updates:r.updates?o([...r.updates,...e]):e})},cloneWithLimit(r,e){return o({...r,limit:e})}});n();n();var Yt=o({is(r){return r.kind==="UsingNode"},create(r){return o({kind:"UsingNode",tables:o(r)})},cloneWithTables(r,e){return o({...r,tables:o([...r.tables,...e])})}});var Te=o({is(r){return r.kind==="DeleteQueryNode"},create(r,e){return o({kind:"DeleteQueryNode",from:qe.create(r),...e&&{with:e}})},cloneWithOrderByItems:(r,e)=>u.cloneWithOrderByItems(r,e),cloneWithoutOrderBy:r=>u.cloneWithoutOrderBy(r),cloneWithLimit(r,e){return o({...r,limit:e})},cloneWithoutLimit(r){return o({...r,limit:void 0})},cloneWithUsing(r,e){return o({...r,using:r.using!==void 0?Yt.cloneWithTables(r.using,e):Yt.create(e)})}});n();var I=o({is(r){return r.kind==="WhereNode"},create(r){return o({kind:"WhereNode",where:r})},cloneWithOperation(r,e,t){return o({...r,where:e==="And"?V.create(r.where,t):Z.create(r.where,t)})}});n();var Xt=o({is(r){return r.kind==="ReturningNode"},create(r){return o({kind:"ReturningNode",selections:o(r)})},cloneWithSelections(r,e){return o({...r,selections:r.selections?o([...r.selections,...e]):o(e)})}});n();var Ho=o({is(r){return r.kind==="ExplainNode"},create(r,e){return o({kind:"ExplainNode",format:r,options:e})}});n();n();var ye=o({is(r){return r.kind==="WhenNode"},create(r){return o({kind:"WhenNode",condition:r})},cloneWithResult(r,e){return o({...r,result:e})}});var G=o({is(r){return r.kind==="MergeQueryNode"},create(r,e){return o({kind:"MergeQueryNode",into:r,...e&&{with:e}})},cloneWithUsing(r,e){return o({...r,using:e})},cloneWithWhen(r,e){return o({...r,whens:r.whens?o([...r.whens,e]):o([e])})},cloneWithThen(r,e){return o({...r,whens:r.whens?o([...r.whens.slice(0,-1),ye.cloneWithResult(r.whens[r.whens.length-1],e)]):void 0})}});n();var Zt=o({is(r){return r.kind==="OutputNode"},create(r){return o({kind:"OutputNode",selections:o(r)})},cloneWithSelections(r,e){return o({...r,selections:r.selections?o([...r.selections,...e]):o(e)})}});var u=o({is(r){return N.is(r)||b.is(r)||de.is(r)||Te.is(r)||G.is(r)},cloneWithEndModifier(r,e){return o({...r,endModifiers:r.endModifiers?o([...r.endModifiers,e]):o([e])})},cloneWithWhere(r,e){return o({...r,where:r.where?I.cloneWithOperation(r.where,"And",e):I.create(e)})},cloneWithJoin(r,e){return o({...r,joins:r.joins?o([...r.joins,e]):o([e])})},cloneWithReturning(r,e){return o({...r,returning:r.returning?Xt.cloneWithSelections(r.returning,e):Xt.create(e)})},cloneWithoutReturning(r){return o({...r,returning:void 0})},cloneWithoutWhere(r){return o({...r,where:void 0})},cloneWithExplain(r,e,t){return o({...r,explain:Ho.create(e,t?.toOperationNode())})},cloneWithTop(r,e){return o({...r,top:e})},cloneWithOutput(r,e){return o({...r,output:r.output?Zt.cloneWithSelections(r.output,e):Zt.create(e)})},cloneWithOrderByItems(r,e){return o({...r,orderBy:r.orderBy?Ne.cloneWithItems(r.orderBy,e):Ne.create(e)})},cloneWithoutOrderBy(r){return o({...r,orderBy:void 0})}});var N=o({is(r){return r.kind==="SelectQueryNode"},create(r){return o({kind:"SelectQueryNode",...r&&{with:r}})},createFrom(r,e){return o({kind:"SelectQueryNode",from:qe.create(r),...e&&{with:e}})},cloneWithSelections(r,e){return o({...r,selections:r.selections?o([...r.selections,...e]):o(e)})},cloneWithDistinctOn(r,e){return o({...r,distinctOn:r.distinctOn?o([...r.distinctOn,...e]):o(e)})},cloneWithFrontModifier(r,e){return o({...r,frontModifiers:r.frontModifiers?o([...r.frontModifiers,e]):o([e])})},cloneWithOrderByItems:(r,e)=>u.cloneWithOrderByItems(r,e),cloneWithGroupByItems(r,e){return o({...r,groupBy:r.groupBy?jt.cloneWithItems(r.groupBy,e):jt.create(e)})},cloneWithLimit(r,e){return o({...r,limit:e})},cloneWithOffset(r,e){return o({...r,offset:e})},cloneWithFetch(r,e){return o({...r,fetch:e})},cloneWithHaving(r,e){return o({...r,having:r.having?Ht.cloneWithOperation(r.having,"And",e):Ht.create(e)})},cloneWithSetOperations(r,e){return o({...r,setOperations:r.setOperations?o([...r.setOperations,...e]):o([...e])})},cloneWithoutSelections(r){return o({...r,selections:[]})},cloneWithoutLimit(r){return o({...r,limit:void 0})},cloneWithoutOffset(r){return o({...r,offset:void 0})},cloneWithoutOrderBy:r=>u.cloneWithoutOrderBy(r),cloneWithoutGroupBy(r){return o({...r,groupBy:void 0})}});n();var Kr=class r{#e;constructor(e){this.#e=o(e)}on(...e){return new r({...this.#e,joinNode:le.cloneWithOn(this.#e.joinNode,y(e))})}onRef(e,t,i){return new r({...this.#e,joinNode:le.cloneWithOn(this.#e.joinNode,S(e,t,i))})}onTrue(){return new r({...this.#e,joinNode:le.cloneWithOn(this.#e.joinNode,L.createWithSql("true"))})}$call(e){return e(this)}toOperationNode(){return this.#e.joinNode}};n();n();n();var Yo=o({is(r){return r.kind==="PartitionByItemNode"},create(r){return o({kind:"PartitionByItemNode",partitionBy:r})}});function Xo(r){return fe(r).map(Yo.create)}var Gr=class r{#e;constructor(e){this.#e=o(e)}orderBy(...e){return new r({overNode:gr.cloneWithOrderByItems(this.#e.overNode,K(e))})}clearOrderBy(){return new r({overNode:u.cloneWithoutOrderBy(this.#e.overNode)})}partitionBy(e){return new r({overNode:gr.cloneWithPartitionByItems(this.#e.overNode,Xo(e))})}$call(e){return e(this)}toOperationNode(){return this.#e.overNode}};n();n();n();n();var Ke=o({is(r){return r.kind==="SelectionNode"},create(r){return o({kind:"SelectionNode",selection:r})},createSelectAll(){return o({kind:"SelectionNode",selection:Me.create()})},createSelectAllFromTable(r){return o({kind:"SelectionNode",selection:ze.createSelectAll(r)})}});function T(r){return W(r)?T(r(te())):Q(r)?r.map(e=>Zo(e)):[Zo(r)]}function Zo(r){return g(r)?Ke.create($o(r)):Fr(r)?Ke.create(r.toOperationNode()):Ke.create(jr(r))}function E(r){return r?Array.isArray(r)?r.map(_o):[_o(r)]:[Ke.createSelectAll()]}function _o(r){if(g(r))return Ke.createSelectAllFromTable(p(r));throw new Error(`invalid value selectAll expression: ${JSON.stringify(r)}`)}n();n();var en=o({is(r){return r.kind==="ValuesNode"},create(r){return o({kind:"ValuesNode",values:o(r)})}});n();var rn=o({is(r){return r.kind==="DefaultInsertValueNode"},create(){return o({kind:"DefaultInsertValueNode"})}});function Hr(r){let e=W(r)?r(te()):r,t=Q(e)?e:o([e]);return Vn(t)}function Vn(r){let e=Un(r);return[o([...e.keys()].map(h.create)),en.create(r.map(t=>Jn(t,e)))]}function Un(r){let e=new Map;for(let t of r){let i=Object.keys(t);for(let a of i)!e.has(a)&&t[a]!==void 0&&e.set(a,e.size)}return e}function Jn(r,e){let t=Object.keys(r),i=Array.from({length:e.size}),a=!1,d=t.length;for(let A of t){let B=e.get(A);if(J(B)){d--;continue}let D=r[A];(J(D)||pe(D))&&(a=!0),i[B]=D}if(d<e.size||a){let A=rn.create();return ue.create(i.map(B=>J(B)?A:x(B)))}return Vr.create(i)}n();n();var _t=o({is(r){return r.kind==="ColumnUpdateNode"},create(r,e){return o({kind:"ColumnUpdateNode",column:r,value:e})}});function tn(...r){return r.length===2?[_t.create(q(r[0]),x(r[1]))]:Cr(r[0])}function Cr(r){let e=W(r)?r(te()):r;return Object.entries(e).filter(([t,i])=>i!==void 0).map(([t,i])=>_t.create(h.create(t),x(i)))}n();var on=o({is(r){return r.kind==="OnDuplicateKeyNode"},create(r){return o({kind:"OnDuplicateKeyNode",updates:r})}});n();var Yr=class{insertId;numInsertedOrUpdatedRows;constructor(e,t){this.insertId=e,this.numInsertedOrUpdatedRows=t}};n();var H=class extends Error{node;constructor(e){super("no result"),this.node=e}};function ce(r){return Object.prototype.hasOwnProperty.call(r,"prototype")}n();n();var M=o({is(r){return r.kind==="OnConflictNode"},create(){return o({kind:"OnConflictNode"})},cloneWith(r,e){return o({...r,...e})},cloneWithIndexWhere(r,e){return o({...r,indexWhere:r.indexWhere?I.cloneWithOperation(r.indexWhere,"And",e):I.create(e)})},cloneWithIndexOrWhere(r,e){return o({...r,indexWhere:r.indexWhere?I.cloneWithOperation(r.indexWhere,"Or",e):I.create(e)})},cloneWithUpdateWhere(r,e){return o({...r,updateWhere:r.updateWhere?I.cloneWithOperation(r.updateWhere,"And",e):I.create(e)})},cloneWithUpdateOrWhere(r,e){return o({...r,updateWhere:r.updateWhere?I.cloneWithOperation(r.updateWhere,"Or",e):I.create(e)})},cloneWithoutIndexWhere(r){return o({...r,indexWhere:void 0})},cloneWithoutUpdateWhere(r){return o({...r,updateWhere:void 0})}});var Xr=class r{#e;constructor(e){this.#e=o(e)}column(e){let t=h.create(e);return new r({...this.#e,onConflictNode:M.cloneWith(this.#e.onConflictNode,{columns:this.#e.onConflictNode.columns?o([...this.#e.onConflictNode.columns,t]):o([t])})})}columns(e){let t=e.map(h.create);return new r({...this.#e,onConflictNode:M.cloneWith(this.#e.onConflictNode,{columns:this.#e.onConflictNode.columns?o([...this.#e.onConflictNode.columns,...t]):o(t)})})}constraint(e){return new r({...this.#e,onConflictNode:M.cloneWith(this.#e.onConflictNode,{constraint:c.create(e)})})}expression(e){return new r({...this.#e,onConflictNode:M.cloneWith(this.#e.onConflictNode,{indexExpression:e.toOperationNode()})})}where(...e){return new r({...this.#e,onConflictNode:M.cloneWithIndexWhere(this.#e.onConflictNode,y(e))})}whereRef(e,t,i){return new r({...this.#e,onConflictNode:M.cloneWithIndexWhere(this.#e.onConflictNode,S(e,t,i))})}clearWhere(){return new r({...this.#e,onConflictNode:M.cloneWithoutIndexWhere(this.#e.onConflictNode)})}doNothing(){return new eo({...this.#e,onConflictNode:M.cloneWith(this.#e.onConflictNode,{doNothing:!0})})}doUpdateSet(e){return new ro({...this.#e,onConflictNode:M.cloneWith(this.#e.onConflictNode,{updates:Cr(e)})})}$call(e){return e(this)}},eo=class{#e;constructor(e){this.#e=o(e)}toOperationNode(){return this.#e.onConflictNode}},ro=class r{#e;constructor(e){this.#e=o(e)}where(...e){return new r({...this.#e,onConflictNode:M.cloneWithUpdateWhere(this.#e.onConflictNode,y(e))})}whereRef(e,t,i){return new r({...this.#e,onConflictNode:M.cloneWithUpdateWhere(this.#e.onConflictNode,S(e,t,i))})}clearWhere(){return new r({...this.#e,onConflictNode:M.cloneWithoutUpdateWhere(this.#e.onConflictNode)})}$call(e){return e(this)}toOperationNode(){return this.#e.onConflictNode}};n();n();var nn=o({is(r){return r.kind==="TopNode"},create(r,e){return o({kind:"TopNode",expression:r,modifiers:e})}});function oe(r,e){if(!Fe(r)&&!Dr(r))throw new Error(`Invalid top expression: ${r}`);if(!J(e)&&!$n(e))throw new Error(`Invalid top modifiers: ${e}`);return nn.create(r,e)}function $n(r){return r==="percent"||r==="with ties"||r==="percent with ties"}n();var Ie=o({is(r){return r.kind==="OrActionNode"},create(r){return o({kind:"OrActionNode",action:r})}});var br=class r{#e;constructor(e){this.#e=o(e)}values(e){let[t,i]=Hr(e);return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{columns:t,values:i})})}columns(e){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{columns:o(e.map(h.create))})})}expression(e){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{values:U(e)})})}defaultValues(){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{defaultValues:!0})})}modifyEnd(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}ignore(){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{orAction:Ie.create("ignore")})})}orIgnore(){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{orAction:Ie.create("ignore")})})}orAbort(){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{orAction:Ie.create("abort")})})}orFail(){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{orAction:Ie.create("fail")})})}orReplace(){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{orAction:Ie.create("replace")})})}orRollback(){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{orAction:Ie.create("rollback")})})}top(e,t){return new r({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,oe(e,t))})}onConflict(e){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{onConflict:e(new Xr({onConflictNode:M.create()})).toOperationNode()})})}onDuplicateKeyUpdate(e){return new r({...this.#e,queryNode:b.cloneWith(this.#e.queryNode,{onDuplicateKey:on.create(Cr(e))})})}returning(e){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,T(e))})}returningAll(){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E())})}output(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,T(e))})}outputAll(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}clearReturning(){return new r({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}$call(e){return e(this)}$if(e,t){return e?t(this):new r({...this.#e})}$castTo(){return new r(this.#e)}$narrowType(){return new r(this.#e)}$assertType(){return new r(this.#e)}withPlugin(e){return new r({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),t=await this.#e.executor.executeQuery(e,this.#e.queryId),{adapter:i}=this.#e.executor,a=e.query;return a.returning&&i.supportsReturning||a.output&&i.supportsOutput?t.rows:[new Yr(t.insertId,t.numAffectedRows??BigInt(0))]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=H){let t=await this.executeTakeFirst();if(t===void 0)throw ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return t}async*stream(e=100){let t=this.compile(),i=this.#e.executor.stream(t,e,this.#e.queryId);for await(let a of i)yield*a.rows}async explain(e,t){return await new r({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,t)}).execute()}};n();n();var Zr=class{numDeletedRows;constructor(e){this.numDeletedRows=e}};n();var Ge=o({is(r){return r.kind==="LimitNode"},create(r){return o({kind:"LimitNode",limit:r})}});var _r=class r{#e;constructor(e){this.#e=o(e)}where(...e){return new r({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,y(e))})}whereRef(e,t,i){return new r({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,S(e,t,i))})}clearWhere(){return new r({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}top(e,t){return new r({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,oe(e,t))})}using(e){return new r({...this.#e,queryNode:Te.cloneWithUsing(this.#e.queryNode,ne(e))})}innerJoin(...e){return this.#r("InnerJoin",e)}leftJoin(...e){return this.#r("LeftJoin",e)}rightJoin(...e){return this.#r("RightJoin",e)}fullJoin(...e){return this.#r("FullJoin",e)}#r(e,t){return new r({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,Se(e,t))})}returning(e){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,T(e))})}returningAll(e){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(e))})}output(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,T(e))})}outputAll(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}clearReturning(){return new r({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}clearLimit(){return new r({...this.#e,queryNode:Te.cloneWithoutLimit(this.#e.queryNode)})}orderBy(...e){return new r({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,K(e))})}clearOrderBy(){return new r({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new r({...this.#e,queryNode:Te.cloneWithLimit(this.#e.queryNode,Ge.create(x(e)))})}modifyEnd(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}$call(e){return e(this)}$if(e,t){return e?t(this):new r({...this.#e})}$castTo(){return new r(this.#e)}$narrowType(){return new r(this.#e)}$assertType(){return new r(this.#e)}withPlugin(e){return new r({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),t=await this.#e.executor.executeQuery(e,this.#e.queryId),{adapter:i}=this.#e.executor,a=e.query;return a.returning&&i.supportsReturning||a.output&&i.supportsOutput?t.rows:[new Zr(t.numAffectedRows??BigInt(0))]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=H){let t=await this.executeTakeFirst();if(t===void 0)throw ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return t}async*stream(e=100){let t=this.compile(),i=this.#e.executor.stream(t,e,this.#e.queryId);for await(let a of i)yield*a.rows}async explain(e,t){return await new r({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,t)}).execute()}};n();n();var et=class{numUpdatedRows;numChangedRows;constructor(e,t){this.numUpdatedRows=e,this.numChangedRows=t}};var je=class r{#e;constructor(e){this.#e=o(e)}where(...e){return new r({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,y(e))})}whereRef(e,t,i){return new r({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,S(e,t,i))})}clearWhere(){return new r({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}top(e,t){return new r({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,oe(e,t))})}from(e){return new r({...this.#e,queryNode:de.cloneWithFromItems(this.#e.queryNode,ne(e))})}innerJoin(...e){return this.#r("InnerJoin",e)}leftJoin(...e){return this.#r("LeftJoin",e)}rightJoin(...e){return this.#r("RightJoin",e)}fullJoin(...e){return this.#r("FullJoin",e)}#r(e,t){return new r({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,Se(e,t))})}orderBy(...e){return new r({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,K(e))})}clearOrderBy(){return new r({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new r({...this.#e,queryNode:de.cloneWithLimit(this.#e.queryNode,Ge.create(x(e)))})}set(...e){return new r({...this.#e,queryNode:de.cloneWithUpdates(this.#e.queryNode,tn(...e))})}returning(e){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,T(e))})}returningAll(e){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(e))})}output(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,T(e))})}outputAll(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}modifyEnd(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}clearReturning(){return new r({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}$call(e){return e(this)}$if(e,t){return e?t(this):new r({...this.#e})}$castTo(){return new r(this.#e)}$narrowType(){return new r(this.#e)}$assertType(){return new r(this.#e)}withPlugin(e){return new r({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),t=await this.#e.executor.executeQuery(e,this.#e.queryId),{adapter:i}=this.#e.executor,a=e.query;return a.returning&&i.supportsReturning||a.output&&i.supportsOutput?t.rows:[new et(t.numAffectedRows??BigInt(0),t.numChangedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=H){let t=await this.executeTakeFirst();if(t===void 0)throw ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return t}async*stream(e=100){let t=this.compile(),i=this.#e.executor.stream(t,e,this.#e.queryId);for await(let a of i)yield*a.rows}async explain(e,t){return await new r({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,t)}).execute()}};n();n();var to=o({is(r){return r.kind==="CommonTableExpressionNameNode"},create(r,e){return o({kind:"CommonTableExpressionNameNode",table:$.create(r),columns:e?o(e.map(h.create)):void 0})}});n();n();var He=o({is(r){return r.kind==="CommonTableExpressionNode"},create(r,e){return o({kind:"CommonTableExpressionNode",name:r,expression:e})},cloneWith(r,e){return o({...r,...e})}});var rt=class r{#e;constructor(e){this.#e=o(e)}materialized(){return new r({...this.#e,node:He.cloneWith(this.#e.node,{materialized:!0})})}notMaterialized(){return new r({...this.#e,node:He.cloneWith(this.#e.node,{materialized:!1})})}toOperationNode(){return this.#e.node}};function oo(r,e){let t=e(an()).toOperationNode();return W(r)?r(Kn(t)).toOperationNode():He.create(sn(r),t)}function Kn(r){return e=>new rt({node:He.create(sn(e),r)})}function sn(r){if(r.includes("(")){let e=r.split(/[\(\)]/),t=e[0],i=e[1].split(",").map(a=>a.trim());return to.create(t,i)}else return to.create(r)}n();var kr=o({is(r){return r.kind==="WithNode"},create(r,e){return o({kind:"WithNode",expressions:o([r]),...e})},cloneWithExpression(r,e){return o({...r,expressions:o([...r.expressions,e])})}});n();n();var un=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"];function dn(r){let e="";for(let t=0;t<r;++t)e+=Gn();return e}function Gn(){return un[~~(Math.random()*un.length)]}function O(){return new no}var no=class{#e;get queryId(){return this.#e===void 0&&(this.#e=dn(8)),this.#e}};n();n();n();var Ee=class{nodeStack=[];#e=o({AliasNode:this.transformAlias.bind(this),ColumnNode:this.transformColumn.bind(this),IdentifierNode:this.transformIdentifier.bind(this),SchemableIdentifierNode:this.transformSchemableIdentifier.bind(this),RawNode:this.transformRaw.bind(this),ReferenceNode:this.transformReference.bind(this),SelectQueryNode:this.transformSelectQuery.bind(this),SelectionNode:this.transformSelection.bind(this),TableNode:this.transformTable.bind(this),FromNode:this.transformFrom.bind(this),SelectAllNode:this.transformSelectAll.bind(this),AndNode:this.transformAnd.bind(this),OrNode:this.transformOr.bind(this),ValueNode:this.transformValue.bind(this),ValueListNode:this.transformValueList.bind(this),PrimitiveValueListNode:this.transformPrimitiveValueList.bind(this),ParensNode:this.transformParens.bind(this),JoinNode:this.transformJoin.bind(this),OperatorNode:this.transformOperator.bind(this),WhereNode:this.transformWhere.bind(this),InsertQueryNode:this.transformInsertQuery.bind(this),DeleteQueryNode:this.transformDeleteQuery.bind(this),ReturningNode:this.transformReturning.bind(this),CreateTableNode:this.transformCreateTable.bind(this),AddColumnNode:this.transformAddColumn.bind(this),ColumnDefinitionNode:this.transformColumnDefinition.bind(this),DropTableNode:this.transformDropTable.bind(this),DataTypeNode:this.transformDataType.bind(this),OrderByNode:this.transformOrderBy.bind(this),OrderByItemNode:this.transformOrderByItem.bind(this),GroupByNode:this.transformGroupBy.bind(this),GroupByItemNode:this.transformGroupByItem.bind(this),UpdateQueryNode:this.transformUpdateQuery.bind(this),ColumnUpdateNode:this.transformColumnUpdate.bind(this),LimitNode:this.transformLimit.bind(this),OffsetNode:this.transformOffset.bind(this),OnConflictNode:this.transformOnConflict.bind(this),OnDuplicateKeyNode:this.transformOnDuplicateKey.bind(this),CreateIndexNode:this.transformCreateIndex.bind(this),DropIndexNode:this.transformDropIndex.bind(this),ListNode:this.transformList.bind(this),PrimaryKeyConstraintNode:this.transformPrimaryKeyConstraint.bind(this),UniqueConstraintNode:this.transformUniqueConstraint.bind(this),ReferencesNode:this.transformReferences.bind(this),CheckConstraintNode:this.transformCheckConstraint.bind(this),WithNode:this.transformWith.bind(this),CommonTableExpressionNode:this.transformCommonTableExpression.bind(this),CommonTableExpressionNameNode:this.transformCommonTableExpressionName.bind(this),HavingNode:this.transformHaving.bind(this),CreateSchemaNode:this.transformCreateSchema.bind(this),DropSchemaNode:this.transformDropSchema.bind(this),AlterTableNode:this.transformAlterTable.bind(this),DropColumnNode:this.transformDropColumn.bind(this),RenameColumnNode:this.transformRenameColumn.bind(this),AlterColumnNode:this.transformAlterColumn.bind(this),ModifyColumnNode:this.transformModifyColumn.bind(this),AddConstraintNode:this.transformAddConstraint.bind(this),DropConstraintNode:this.transformDropConstraint.bind(this),RenameConstraintNode:this.transformRenameConstraint.bind(this),ForeignKeyConstraintNode:this.transformForeignKeyConstraint.bind(this),CreateViewNode:this.transformCreateView.bind(this),RefreshMaterializedViewNode:this.transformRefreshMaterializedView.bind(this),DropViewNode:this.transformDropView.bind(this),GeneratedNode:this.transformGenerated.bind(this),DefaultValueNode:this.transformDefaultValue.bind(this),OnNode:this.transformOn.bind(this),ValuesNode:this.transformValues.bind(this),SelectModifierNode:this.transformSelectModifier.bind(this),CreateTypeNode:this.transformCreateType.bind(this),DropTypeNode:this.transformDropType.bind(this),ExplainNode:this.transformExplain.bind(this),DefaultInsertValueNode:this.transformDefaultInsertValue.bind(this),AggregateFunctionNode:this.transformAggregateFunction.bind(this),OverNode:this.transformOver.bind(this),PartitionByNode:this.transformPartitionBy.bind(this),PartitionByItemNode:this.transformPartitionByItem.bind(this),SetOperationNode:this.transformSetOperation.bind(this),BinaryOperationNode:this.transformBinaryOperation.bind(this),UnaryOperationNode:this.transformUnaryOperation.bind(this),UsingNode:this.transformUsing.bind(this),FunctionNode:this.transformFunction.bind(this),CaseNode:this.transformCase.bind(this),WhenNode:this.transformWhen.bind(this),JSONReferenceNode:this.transformJSONReference.bind(this),JSONPathNode:this.transformJSONPath.bind(this),JSONPathLegNode:this.transformJSONPathLeg.bind(this),JSONOperatorChainNode:this.transformJSONOperatorChain.bind(this),TupleNode:this.transformTuple.bind(this),MergeQueryNode:this.transformMergeQuery.bind(this),MatchedNode:this.transformMatched.bind(this),AddIndexNode:this.transformAddIndex.bind(this),CastNode:this.transformCast.bind(this),FetchNode:this.transformFetch.bind(this),TopNode:this.transformTop.bind(this),OutputNode:this.transformOutput.bind(this),OrActionNode:this.transformOrAction.bind(this),CollateNode:this.transformCollate.bind(this)});transformNode(e,t){if(!e)return e;this.nodeStack.push(e);let i=this.transformNodeImpl(e,t);return this.nodeStack.pop(),o(i)}transformNodeImpl(e,t){return this.#e[e.kind](e,t)}transformNodeList(e,t){return e&&o(e.map(i=>this.transformNode(i,t)))}transformSelectQuery(e,t){return{kind:"SelectQueryNode",from:this.transformNode(e.from,t),selections:this.transformNodeList(e.selections,t),distinctOn:this.transformNodeList(e.distinctOn,t),joins:this.transformNodeList(e.joins,t),groupBy:this.transformNode(e.groupBy,t),orderBy:this.transformNode(e.orderBy,t),where:this.transformNode(e.where,t),frontModifiers:this.transformNodeList(e.frontModifiers,t),endModifiers:this.transformNodeList(e.endModifiers,t),limit:this.transformNode(e.limit,t),offset:this.transformNode(e.offset,t),with:this.transformNode(e.with,t),having:this.transformNode(e.having,t),explain:this.transformNode(e.explain,t),setOperations:this.transformNodeList(e.setOperations,t),fetch:this.transformNode(e.fetch,t),top:this.transformNode(e.top,t)}}transformSelection(e,t){return{kind:"SelectionNode",selection:this.transformNode(e.selection,t)}}transformColumn(e,t){return{kind:"ColumnNode",column:this.transformNode(e.column,t)}}transformAlias(e,t){return{kind:"AliasNode",node:this.transformNode(e.node,t),alias:this.transformNode(e.alias,t)}}transformTable(e,t){return{kind:"TableNode",table:this.transformNode(e.table,t)}}transformFrom(e,t){return{kind:"FromNode",froms:this.transformNodeList(e.froms,t)}}transformReference(e,t){return{kind:"ReferenceNode",column:this.transformNode(e.column,t),table:this.transformNode(e.table,t)}}transformAnd(e,t){return{kind:"AndNode",left:this.transformNode(e.left,t),right:this.transformNode(e.right,t)}}transformOr(e,t){return{kind:"OrNode",left:this.transformNode(e.left,t),right:this.transformNode(e.right,t)}}transformValueList(e,t){return{kind:"ValueListNode",values:this.transformNodeList(e.values,t)}}transformParens(e,t){return{kind:"ParensNode",node:this.transformNode(e.node,t)}}transformJoin(e,t){return{kind:"JoinNode",joinType:e.joinType,table:this.transformNode(e.table,t),on:this.transformNode(e.on,t)}}transformRaw(e,t){return{kind:"RawNode",sqlFragments:o([...e.sqlFragments]),parameters:this.transformNodeList(e.parameters,t)}}transformWhere(e,t){return{kind:"WhereNode",where:this.transformNode(e.where,t)}}transformInsertQuery(e,t){return{kind:"InsertQueryNode",into:this.transformNode(e.into,t),columns:this.transformNodeList(e.columns,t),values:this.transformNode(e.values,t),returning:this.transformNode(e.returning,t),onConflict:this.transformNode(e.onConflict,t),onDuplicateKey:this.transformNode(e.onDuplicateKey,t),endModifiers:this.transformNodeList(e.endModifiers,t),with:this.transformNode(e.with,t),ignore:e.ignore,orAction:this.transformNode(e.orAction,t),replace:e.replace,explain:this.transformNode(e.explain,t),defaultValues:e.defaultValues,top:this.transformNode(e.top,t),output:this.transformNode(e.output,t)}}transformValues(e,t){return{kind:"ValuesNode",values:this.transformNodeList(e.values,t)}}transformDeleteQuery(e,t){return{kind:"DeleteQueryNode",from:this.transformNode(e.from,t),using:this.transformNode(e.using,t),joins:this.transformNodeList(e.joins,t),where:this.transformNode(e.where,t),returning:this.transformNode(e.returning,t),endModifiers:this.transformNodeList(e.endModifiers,t),with:this.transformNode(e.with,t),orderBy:this.transformNode(e.orderBy,t),limit:this.transformNode(e.limit,t),explain:this.transformNode(e.explain,t),top:this.transformNode(e.top,t),output:this.transformNode(e.output,t)}}transformReturning(e,t){return{kind:"ReturningNode",selections:this.transformNodeList(e.selections,t)}}transformCreateTable(e,t){return{kind:"CreateTableNode",table:this.transformNode(e.table,t),columns:this.transformNodeList(e.columns,t),constraints:this.transformNodeList(e.constraints,t),temporary:e.temporary,ifNotExists:e.ifNotExists,onCommit:e.onCommit,frontModifiers:this.transformNodeList(e.frontModifiers,t),endModifiers:this.transformNodeList(e.endModifiers,t),selectQuery:this.transformNode(e.selectQuery,t)}}transformColumnDefinition(e,t){return{kind:"ColumnDefinitionNode",column:this.transformNode(e.column,t),dataType:this.transformNode(e.dataType,t),references:this.transformNode(e.references,t),primaryKey:e.primaryKey,autoIncrement:e.autoIncrement,unique:e.unique,notNull:e.notNull,unsigned:e.unsigned,defaultTo:this.transformNode(e.defaultTo,t),check:this.transformNode(e.check,t),generated:this.transformNode(e.generated,t),frontModifiers:this.transformNodeList(e.frontModifiers,t),endModifiers:this.transformNodeList(e.endModifiers,t),nullsNotDistinct:e.nullsNotDistinct,identity:e.identity,ifNotExists:e.ifNotExists}}transformAddColumn(e,t){return{kind:"AddColumnNode",column:this.transformNode(e.column,t)}}transformDropTable(e,t){return{kind:"DropTableNode",table:this.transformNode(e.table,t),ifExists:e.ifExists,cascade:e.cascade}}transformOrderBy(e,t){return{kind:"OrderByNode",items:this.transformNodeList(e.items,t)}}transformOrderByItem(e,t){return{kind:"OrderByItemNode",orderBy:this.transformNode(e.orderBy,t),direction:this.transformNode(e.direction,t),collation:this.transformNode(e.collation,t),nulls:e.nulls}}transformGroupBy(e,t){return{kind:"GroupByNode",items:this.transformNodeList(e.items,t)}}transformGroupByItem(e,t){return{kind:"GroupByItemNode",groupBy:this.transformNode(e.groupBy,t)}}transformUpdateQuery(e,t){return{kind:"UpdateQueryNode",table:this.transformNode(e.table,t),from:this.transformNode(e.from,t),joins:this.transformNodeList(e.joins,t),where:this.transformNode(e.where,t),updates:this.transformNodeList(e.updates,t),returning:this.transformNode(e.returning,t),endModifiers:this.transformNodeList(e.endModifiers,t),with:this.transformNode(e.with,t),explain:this.transformNode(e.explain,t),limit:this.transformNode(e.limit,t),top:this.transformNode(e.top,t),output:this.transformNode(e.output,t),orderBy:this.transformNode(e.orderBy,t)}}transformColumnUpdate(e,t){return{kind:"ColumnUpdateNode",column:this.transformNode(e.column,t),value:this.transformNode(e.value,t)}}transformLimit(e,t){return{kind:"LimitNode",limit:this.transformNode(e.limit,t)}}transformOffset(e,t){return{kind:"OffsetNode",offset:this.transformNode(e.offset,t)}}transformOnConflict(e,t){return{kind:"OnConflictNode",columns:this.transformNodeList(e.columns,t),constraint:this.transformNode(e.constraint,t),indexExpression:this.transformNode(e.indexExpression,t),indexWhere:this.transformNode(e.indexWhere,t),updates:this.transformNodeList(e.updates,t),updateWhere:this.transformNode(e.updateWhere,t),doNothing:e.doNothing}}transformOnDuplicateKey(e,t){return{kind:"OnDuplicateKeyNode",updates:this.transformNodeList(e.updates,t)}}transformCreateIndex(e,t){return{kind:"CreateIndexNode",name:this.transformNode(e.name,t),table:this.transformNode(e.table,t),columns:this.transformNodeList(e.columns,t),unique:e.unique,using:this.transformNode(e.using,t),ifNotExists:e.ifNotExists,where:this.transformNode(e.where,t),nullsNotDistinct:e.nullsNotDistinct}}transformList(e,t){return{kind:"ListNode",items:this.transformNodeList(e.items,t)}}transformDropIndex(e,t){return{kind:"DropIndexNode",name:this.transformNode(e.name,t),table:this.transformNode(e.table,t),ifExists:e.ifExists,cascade:e.cascade}}transformPrimaryKeyConstraint(e,t){return{kind:"PrimaryKeyConstraintNode",columns:this.transformNodeList(e.columns,t),name:this.transformNode(e.name,t),deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformUniqueConstraint(e,t){return{kind:"UniqueConstraintNode",columns:this.transformNodeList(e.columns,t),name:this.transformNode(e.name,t),nullsNotDistinct:e.nullsNotDistinct,deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformForeignKeyConstraint(e,t){return{kind:"ForeignKeyConstraintNode",columns:this.transformNodeList(e.columns,t),references:this.transformNode(e.references,t),name:this.transformNode(e.name,t),onDelete:e.onDelete,onUpdate:e.onUpdate,deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformSetOperation(e,t){return{kind:"SetOperationNode",operator:e.operator,expression:this.transformNode(e.expression,t),all:e.all}}transformReferences(e,t){return{kind:"ReferencesNode",table:this.transformNode(e.table,t),columns:this.transformNodeList(e.columns,t),onDelete:e.onDelete,onUpdate:e.onUpdate}}transformCheckConstraint(e,t){return{kind:"CheckConstraintNode",expression:this.transformNode(e.expression,t),name:this.transformNode(e.name,t)}}transformWith(e,t){return{kind:"WithNode",expressions:this.transformNodeList(e.expressions,t),recursive:e.recursive}}transformCommonTableExpression(e,t){return{kind:"CommonTableExpressionNode",name:this.transformNode(e.name,t),materialized:e.materialized,expression:this.transformNode(e.expression,t)}}transformCommonTableExpressionName(e,t){return{kind:"CommonTableExpressionNameNode",table:this.transformNode(e.table,t),columns:this.transformNodeList(e.columns,t)}}transformHaving(e,t){return{kind:"HavingNode",having:this.transformNode(e.having,t)}}transformCreateSchema(e,t){return{kind:"CreateSchemaNode",schema:this.transformNode(e.schema,t),ifNotExists:e.ifNotExists}}transformDropSchema(e,t){return{kind:"DropSchemaNode",schema:this.transformNode(e.schema,t),ifExists:e.ifExists,cascade:e.cascade}}transformAlterTable(e,t){return{kind:"AlterTableNode",table:this.transformNode(e.table,t),renameTo:this.transformNode(e.renameTo,t),setSchema:this.transformNode(e.setSchema,t),columnAlterations:this.transformNodeList(e.columnAlterations,t),addConstraint:this.transformNode(e.addConstraint,t),dropConstraint:this.transformNode(e.dropConstraint,t),renameConstraint:this.transformNode(e.renameConstraint,t),addIndex:this.transformNode(e.addIndex,t),dropIndex:this.transformNode(e.dropIndex,t)}}transformDropColumn(e,t){return{kind:"DropColumnNode",column:this.transformNode(e.column,t)}}transformRenameColumn(e,t){return{kind:"RenameColumnNode",column:this.transformNode(e.column,t),renameTo:this.transformNode(e.renameTo,t)}}transformAlterColumn(e,t){return{kind:"AlterColumnNode",column:this.transformNode(e.column,t),dataType:this.transformNode(e.dataType,t),dataTypeExpression:this.transformNode(e.dataTypeExpression,t),setDefault:this.transformNode(e.setDefault,t),dropDefault:e.dropDefault,setNotNull:e.setNotNull,dropNotNull:e.dropNotNull}}transformModifyColumn(e,t){return{kind:"ModifyColumnNode",column:this.transformNode(e.column,t)}}transformAddConstraint(e,t){return{kind:"AddConstraintNode",constraint:this.transformNode(e.constraint,t)}}transformDropConstraint(e,t){return{kind:"DropConstraintNode",constraintName:this.transformNode(e.constraintName,t),ifExists:e.ifExists,modifier:e.modifier}}transformRenameConstraint(e,t){return{kind:"RenameConstraintNode",oldName:this.transformNode(e.oldName,t),newName:this.transformNode(e.newName,t)}}transformCreateView(e,t){return{kind:"CreateViewNode",name:this.transformNode(e.name,t),temporary:e.temporary,orReplace:e.orReplace,ifNotExists:e.ifNotExists,materialized:e.materialized,columns:this.transformNodeList(e.columns,t),as:this.transformNode(e.as,t)}}transformRefreshMaterializedView(e,t){return{kind:"RefreshMaterializedViewNode",name:this.transformNode(e.name,t),concurrently:e.concurrently,withNoData:e.withNoData}}transformDropView(e,t){return{kind:"DropViewNode",name:this.transformNode(e.name,t),ifExists:e.ifExists,materialized:e.materialized,cascade:e.cascade}}transformGenerated(e,t){return{kind:"GeneratedNode",byDefault:e.byDefault,always:e.always,identity:e.identity,stored:e.stored,expression:this.transformNode(e.expression,t)}}transformDefaultValue(e,t){return{kind:"DefaultValueNode",defaultValue:this.transformNode(e.defaultValue,t)}}transformOn(e,t){return{kind:"OnNode",on:this.transformNode(e.on,t)}}transformSelectModifier(e,t){return{kind:"SelectModifierNode",modifier:e.modifier,rawModifier:this.transformNode(e.rawModifier,t),of:this.transformNodeList(e.of,t)}}transformCreateType(e,t){return{kind:"CreateTypeNode",name:this.transformNode(e.name,t),enum:this.transformNode(e.enum,t)}}transformDropType(e,t){return{kind:"DropTypeNode",name:this.transformNode(e.name,t),ifExists:e.ifExists}}transformExplain(e,t){return{kind:"ExplainNode",format:e.format,options:this.transformNode(e.options,t)}}transformSchemableIdentifier(e,t){return{kind:"SchemableIdentifierNode",schema:this.transformNode(e.schema,t),identifier:this.transformNode(e.identifier,t)}}transformAggregateFunction(e,t){return{kind:"AggregateFunctionNode",func:e.func,aggregated:this.transformNodeList(e.aggregated,t),distinct:e.distinct,orderBy:this.transformNode(e.orderBy,t),withinGroup:this.transformNode(e.withinGroup,t),filter:this.transformNode(e.filter,t),over:this.transformNode(e.over,t)}}transformOver(e,t){return{kind:"OverNode",orderBy:this.transformNode(e.orderBy,t),partitionBy:this.transformNode(e.partitionBy,t)}}transformPartitionBy(e,t){return{kind:"PartitionByNode",items:this.transformNodeList(e.items,t)}}transformPartitionByItem(e,t){return{kind:"PartitionByItemNode",partitionBy:this.transformNode(e.partitionBy,t)}}transformBinaryOperation(e,t){return{kind:"BinaryOperationNode",leftOperand:this.transformNode(e.leftOperand,t),operator:this.transformNode(e.operator,t),rightOperand:this.transformNode(e.rightOperand,t)}}transformUnaryOperation(e,t){return{kind:"UnaryOperationNode",operator:this.transformNode(e.operator,t),operand:this.transformNode(e.operand,t)}}transformUsing(e,t){return{kind:"UsingNode",tables:this.transformNodeList(e.tables,t)}}transformFunction(e,t){return{kind:"FunctionNode",func:e.func,arguments:this.transformNodeList(e.arguments,t)}}transformCase(e,t){return{kind:"CaseNode",value:this.transformNode(e.value,t),when:this.transformNodeList(e.when,t),else:this.transformNode(e.else,t),isStatement:e.isStatement}}transformWhen(e,t){return{kind:"WhenNode",condition:this.transformNode(e.condition,t),result:this.transformNode(e.result,t)}}transformJSONReference(e,t){return{kind:"JSONReferenceNode",reference:this.transformNode(e.reference,t),traversal:this.transformNode(e.traversal,t)}}transformJSONPath(e,t){return{kind:"JSONPathNode",inOperator:this.transformNode(e.inOperator,t),pathLegs:this.transformNodeList(e.pathLegs,t)}}transformJSONPathLeg(e,t){return{kind:"JSONPathLegNode",type:e.type,value:e.value}}transformJSONOperatorChain(e,t){return{kind:"JSONOperatorChainNode",operator:this.transformNode(e.operator,t),values:this.transformNodeList(e.values,t)}}transformTuple(e,t){return{kind:"TupleNode",values:this.transformNodeList(e.values,t)}}transformMergeQuery(e,t){return{kind:"MergeQueryNode",into:this.transformNode(e.into,t),using:this.transformNode(e.using,t),whens:this.transformNodeList(e.whens,t),with:this.transformNode(e.with,t),top:this.transformNode(e.top,t),endModifiers:this.transformNodeList(e.endModifiers,t),output:this.transformNode(e.output,t),returning:this.transformNode(e.returning,t)}}transformMatched(e,t){return{kind:"MatchedNode",not:e.not,bySource:e.bySource}}transformAddIndex(e,t){return{kind:"AddIndexNode",name:this.transformNode(e.name,t),columns:this.transformNodeList(e.columns,t),unique:e.unique,using:this.transformNode(e.using,t),ifNotExists:e.ifNotExists}}transformCast(e,t){return{kind:"CastNode",expression:this.transformNode(e.expression,t),dataType:this.transformNode(e.dataType,t)}}transformFetch(e,t){return{kind:"FetchNode",rowCount:this.transformNode(e.rowCount,t),modifier:e.modifier}}transformTop(e,t){return{kind:"TopNode",expression:e.expression,modifiers:e.modifiers}}transformOutput(e,t){return{kind:"OutputNode",selections:this.transformNodeList(e.selections,t)}}transformDataType(e,t){return e}transformSelectAll(e,t){return e}transformIdentifier(e,t){return e}transformValue(e,t){return e}transformPrimitiveValueList(e,t){return e}transformOperator(e,t){return e}transformDefaultInsertValue(e,t){return e}transformOrAction(e,t){return e}transformCollate(e,t){return e}};var jn=o({AlterTableNode:!0,CreateIndexNode:!0,CreateSchemaNode:!0,CreateTableNode:!0,CreateTypeNode:!0,CreateViewNode:!0,RefreshMaterializedViewNode:!0,DeleteQueryNode:!0,DropIndexNode:!0,DropSchemaNode:!0,DropTableNode:!0,DropTypeNode:!0,DropViewNode:!0,InsertQueryNode:!0,RawNode:!0,SelectQueryNode:!0,UpdateQueryNode:!0,MergeQueryNode:!0}),Hn={json_agg:!0,to_json:!0},tt=class extends Ee{#e;#r=new Set;#t=new Set;constructor(e){super(),this.#e=e}transformNodeImpl(e,t){if(!this.#o(e))return super.transformNodeImpl(e,t);let i=this.#d(e);for(let m of i)this.#t.add(m);let a=this.#a(e);for(let m of a)this.#r.add(m);let d=super.transformNodeImpl(e,t);for(let m of a)this.#r.delete(m);for(let m of i)this.#t.delete(m);return d}transformSchemableIdentifier(e,t){let i=super.transformSchemableIdentifier(e,t);return i.schema||!this.#r.has(e.identifier.name)?i:{...i,schema:c.create(this.#e)}}transformReferences(e,t){let i=super.transformReferences(e,t);return i.table.table.schema?i:{...i,table:$.createWithSchema(this.#e,i.table.table.identifier.name)}}transformAggregateFunction(e,t){return{...super.transformAggregateFunction({...e,aggregated:[]},t),aggregated:this.#i(e,t,"aggregated")}}transformFunction(e,t){return{...super.transformFunction({...e,arguments:[]},t),arguments:this.#i(e,t,"arguments")}}#i(e,t,i){return Hn[e.func]?e[i].map(a=>!$.is(a)||a.table.schema?this.transformNode(a,t):{...a,table:this.transformIdentifier(a.table.identifier,t)}):this.transformNodeList(e[i],t)}#o(e){return e.kind in jn}#a(e){let t=new Set;if("name"in e&&e.name&&P.is(e.name)&&this.#s(e.name,t),"from"in e&&e.from)for(let i of e.from.froms)this.#n(i,t);if("into"in e&&e.into&&this.#n(e.into,t),"table"in e&&e.table&&this.#n(e.table,t),"joins"in e&&e.joins)for(let i of e.joins)this.#n(i.table,t);return"using"in e&&e.using&&this.#n(e.using,t),t}#d(e){let t=new Set;return"with"in e&&e.with&&this.#u(e.with,t),t}#n(e,t){if($.is(e))this.#s(e.table,t);else if(v.is(e)&&$.is(e.node))this.#s(e.node.table,t);else if($r.is(e))for(let i of e.items)this.#n(i,t)}#s(e,t){let i=e.identifier.name;!this.#r.has(i)&&!this.#t.has(i)&&t.add(i)}#u(e,t){for(let i of e.expressions){let a=i.name.table.table.identifier.name;this.#t.has(a)||t.add(a)}}};var Y=class{#e;constructor(e){this.#e=new tt(e)}transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}async transformResult(e){return e.result}};n();n();n();var cn=o({is(r){return r.kind==="MatchedNode"},create(r,e=!1){return o({kind:"MatchedNode",not:r,bySource:e})}});function io(r,e,t){return ye.create($e([cn.create(!r.isMatched,r.bySource),...e&&e.length>0?[e.length===3&&t?S(e[0],e[1],e[2]):y(e)]:[]],"and",!1))}function Ye(r){return g(r)?L.create([r],[]):C(r)?r.toOperationNode():r}n();n();n();n();var Tr=class{#e;#r;#t;constructor(){this.#e=new Promise((e,t)=>{this.#t=t,this.#r=e})}get promise(){return this.#e}resolve=e=>{this.#r&&this.#r(e)};reject=e=>{this.#t&&this.#t(e)}};async function ot(r){let e=new Tr,t=new Tr;return r.provideConnection(async i=>(e.resolve(i),await t.promise)).catch(i=>e.reject(i)),o({connection:await e.promise,release:t.resolve})}var Yn=o([]),Xe=class{#e;constructor(e=Yn){this.#e=e}get plugins(){return this.#e}transformQuery(e,t){for(let i of this.#e){let a=i.transformQuery({node:e,queryId:t});if(a.kind===e.kind)e=a;else throw new Error(["KyselyPlugin.transformQuery must return a node","of the same kind that was given to it.",`The plugin was given a ${e.kind}`,`but it returned a ${a.kind}`].join(" "))}return e}async executeQuery(e,t){return await this.provideConnection(async i=>{let a=await i.executeQuery(e);return"numUpdatedOrDeletedRows"in a&&Ve("kysely:warning: outdated driver/plugin detected! `QueryResult.numUpdatedOrDeletedRows` has been replaced with `QueryResult.numAffectedRows`."),await this.#r(a,t)})}async*stream(e,t,i){let{connection:a,release:d}=await ot(this);try{for await(let m of a.streamQuery(e,t))yield await this.#r(m,i)}finally{d()}}async#r(e,t){for(let i of this.#e)e=await i.transformResult({result:e,queryId:t});return e}};var so=class r extends Xe{get adapter(){throw new Error("this query cannot be compiled to SQL")}compileQuery(){throw new Error("this query cannot be compiled to SQL")}provideConnection(){throw new Error("this query cannot be executed")}withConnectionProvider(){throw new Error("this query cannot have a connection provider")}withPlugin(e){return new r([...this.plugins,e])}withPlugins(e){return new r([...this.plugins,...e])}withPluginAtFront(e){return new r([e,...this.plugins])}withoutPlugins(){return new r([])}},Ze=new so;n();var nt=class{numChangedRows;constructor(e){this.numChangedRows=e}};var it=class r{#e;constructor(e){this.#e=o(e)}modifyEnd(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}top(e,t){return new r({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,oe(e,t))})}using(...e){return new Ae({...this.#e,queryNode:G.cloneWithUsing(this.#e.queryNode,Se("Using",e))})}returning(e){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,T(e))})}returningAll(e){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(e))})}output(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,T(e))})}outputAll(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}},Ae=class r{#e;constructor(e){this.#e=o(e)}modifyEnd(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}top(e,t){return new r({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,oe(e,t))})}whenMatched(){return this.#r([])}whenMatchedAnd(...e){return this.#r(e)}whenMatchedAndRef(e,t,i){return this.#r([e,t,i],!0)}#r(e,t){return new st({...this.#e,queryNode:G.cloneWithWhen(this.#e.queryNode,io({isMatched:!0},e,t))})}whenNotMatched(){return this.#t([])}whenNotMatchedAnd(...e){return this.#t(e)}whenNotMatchedAndRef(e,t,i){return this.#t([e,t,i],!0)}whenNotMatchedBySource(){return this.#t([],!1,!0)}whenNotMatchedBySourceAnd(...e){return this.#t(e,!1,!0)}whenNotMatchedBySourceAndRef(e,t,i){return this.#t([e,t,i],!0,!0)}returning(e){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,T(e))})}returningAll(e){return new r({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(e))})}output(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,T(e))})}outputAll(e){return new r({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}#t(e,t=!1,i=!1){let a={...this.#e,queryNode:G.cloneWithWhen(this.#e.queryNode,io({isMatched:!1,bySource:i},e,t))},d=i?st:ao;return new d(a)}$call(e){return e(this)}$if(e,t){return e?t(this):new r({...this.#e})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),t=await this.#e.executor.executeQuery(e,this.#e.queryId),{adapter:i}=this.#e.executor,a=e.query;return a.returning&&i.supportsReturning||a.output&&i.supportsOutput?t.rows:[new nt(t.numAffectedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=H){let t=await this.executeTakeFirst();if(t===void 0)throw ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return t}},st=class{#e;constructor(e){this.#e=o(e)}thenDelete(){return new Ae({...this.#e,queryNode:G.cloneWithThen(this.#e.queryNode,Ye("delete"))})}thenDoNothing(){return new Ae({...this.#e,queryNode:G.cloneWithThen(this.#e.queryNode,Ye("do nothing"))})}thenUpdate(e){return new Ae({...this.#e,queryNode:G.cloneWithThen(this.#e.queryNode,Ye(e(new je({queryId:this.#e.queryId,executor:Ze,queryNode:de.createWithoutTable()}))))})}thenUpdateSet(...e){return this.thenUpdate(t=>t.set(...e))}},ao=class{#e;constructor(e){this.#e=o(e)}thenDoNothing(){return new Ae({...this.#e,queryNode:G.cloneWithThen(this.#e.queryNode,Ye("do nothing"))})}thenInsertValues(e){let[t,i]=Hr(e);return new Ae({...this.#e,queryNode:G.cloneWithThen(this.#e.queryNode,Ye(b.cloneWith(b.createWithoutInto(),{columns:t,values:i})))})}};var _e=class r{#e;constructor(e){this.#e=o(e)}selectFrom(e){return Sr({queryId:O(),executor:this.#e.executor,queryNode:N.createFrom(ne(e),this.#e.withNode)})}selectNoFrom(e){return Sr({queryId:O(),executor:this.#e.executor,queryNode:N.cloneWithSelections(N.create(this.#e.withNode),T(e))})}insertInto(e){return new br({queryId:O(),executor:this.#e.executor,queryNode:b.create(p(e),this.#e.withNode)})}replaceInto(e){return new br({queryId:O(),executor:this.#e.executor,queryNode:b.create(p(e),this.#e.withNode,!0)})}deleteFrom(e){return new _r({queryId:O(),executor:this.#e.executor,queryNode:Te.create(ne(e),this.#e.withNode)})}updateTable(e){return new je({queryId:O(),executor:this.#e.executor,queryNode:de.create(ne(e),this.#e.withNode)})}mergeInto(e){return new it({queryId:O(),executor:this.#e.executor,queryNode:G.create(uo(e),this.#e.withNode)})}with(e,t){let i=oo(e,t);return new r({...this.#e,withNode:this.#e.withNode?kr.cloneWithExpression(this.#e.withNode,i):kr.create(i)})}withRecursive(e,t){let i=oo(e,t);return new r({...this.#e,withNode:this.#e.withNode?kr.cloneWithExpression(this.#e.withNode,i):kr.create(i,{recursive:!0})})}withPlugin(e){return new r({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new r({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new r({...this.#e,executor:this.#e.executor.withPluginAtFront(new Y(e))})}};function an(){return new _e({executor:Ze})}function mn(r,e){return new Kr({joinNode:le.create(r,Be(e))})}function hn(){return new Gr({overNode:gr.create()})}function Se(r,e){if(e.length===3)return Zn(r,e[0],e[1],e[2]);if(e.length===2)return Xn(r,e[0],e[1]);if(e.length===1)return _n(r,e[0]);throw new Error("not implemented")}function Xn(r,e,t){return t(mn(r,e)).toOperationNode()}function Zn(r,e,t,i){return le.createWithOn(r,Be(e),S(t,"=",i))}function _n(r,e){return le.create(r,Be(e))}n();var ln=o({is(r){return r.kind==="OffsetNode"},create(r){return o({kind:"OffsetNode",offset:r})}});n();n();var pn=o({is(r){return r.kind==="GroupByItemNode"},create(r){return o({kind:"GroupByItemNode",groupBy:r})}});function fn(r){return r=W(r)?r(te()):r,fe(r).map(pn.create)}n();n();var Nn=o({is(r){return r.kind==="SetOperationNode"},create(r,e,t){return o({kind:"SetOperationNode",operator:r,expression:e,all:t})}});function De(r,e,t){return W(e)&&(e=e(at())),Q(e)||(e=[e]),e.map(i=>Nn.create(r,U(i),t))}n();var f=class r{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Er(this,e)}or(...e){return new co(Z.create(this.#e,y(e)))}and(...e){return new mo(V.create(this.#e,y(e)))}$castTo(){return new r(this.#e)}$notNull(){return new r(this.#e)}toOperationNode(){return this.#e}},Er=class{#e;#r;constructor(e,t){this.#e=e,this.#r=t}get expression(){return this.#e}get alias(){return this.#r}toOperationNode(){return v.create(this.#e.toOperationNode(),C(this.#r)?this.#r.toOperationNode():c.create(this.#r))}},co=class r{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Er(this,e)}or(...e){return new r(Z.create(this.#e,y(e)))}$castTo(){return new r(this.#e)}toOperationNode(){return ke.create(this.#e)}},mo=class r{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Er(this,e)}and(...e){return new r(V.create(this.#e,y(e)))}$castTo(){return new r(this.#e)}toOperationNode(){return ke.create(this.#e)}};n();n();var yn={is(r){return r.kind==="FetchNode"},create(r,e){return{kind:"FetchNode",rowCount:k.create(r),modifier:e}}};function wn(r,e){if(!Fe(r)&&!Dr(r))throw new Error(`Invalid fetch row count: ${r}`);if(!ei(e))throw new Error(`Invalid fetch modifier: ${e}`);return yn.create(r,e)}function ei(r){return r==="only"||r==="with ties"}var ho=class r{#e;constructor(e){this.#e=o(e)}get expressionType(){}get isSelectQueryBuilder(){return!0}where(...e){return new r({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,y(e))})}whereRef(e,t,i){return new r({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,S(e,t,i))})}having(...e){return new r({...this.#e,queryNode:N.cloneWithHaving(this.#e.queryNode,y(e))})}havingRef(e,t,i){return new r({...this.#e,queryNode:N.cloneWithHaving(this.#e.queryNode,S(e,t,i))})}select(e){return new r({...this.#e,queryNode:N.cloneWithSelections(this.#e.queryNode,T(e))})}distinctOn(e){return new r({...this.#e,queryNode:N.cloneWithDistinctOn(this.#e.queryNode,fe(e))})}modifyFront(e){return new r({...this.#e,queryNode:N.cloneWithFrontModifier(this.#e.queryNode,ae.createWithExpression(e.toOperationNode()))})}modifyEnd(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ae.createWithExpression(e.toOperationNode()))})}distinct(){return new r({...this.#e,queryNode:N.cloneWithFrontModifier(this.#e.queryNode,ae.create("Distinct"))})}forUpdate(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ae.create("ForUpdate",e?wr(e).map(p):void 0))})}forShare(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ae.create("ForShare",e?wr(e).map(p):void 0))})}forKeyShare(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ae.create("ForKeyShare",e?wr(e).map(p):void 0))})}forNoKeyUpdate(e){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ae.create("ForNoKeyUpdate",e?wr(e).map(p):void 0))})}skipLocked(){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ae.create("SkipLocked"))})}noWait(){return new r({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ae.create("NoWait"))})}selectAll(e){return new r({...this.#e,queryNode:N.cloneWithSelections(this.#e.queryNode,E(e))})}innerJoin(...e){return this.#r("InnerJoin",e)}leftJoin(...e){return this.#r("LeftJoin",e)}rightJoin(...e){return this.#r("RightJoin",e)}fullJoin(...e){return this.#r("FullJoin",e)}crossJoin(...e){return this.#r("CrossJoin",e)}innerJoinLateral(...e){return this.#r("LateralInnerJoin",e)}leftJoinLateral(...e){return this.#r("LateralLeftJoin",e)}crossJoinLateral(...e){return this.#r("LateralCrossJoin",e)}crossApply(...e){return this.#r("CrossApply",e)}outerApply(...e){return this.#r("OuterApply",e)}#r(e,t){return new r({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,Se(e,t))})}orderBy(...e){return new r({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,K(e))})}groupBy(e){return new r({...this.#e,queryNode:N.cloneWithGroupByItems(this.#e.queryNode,fn(e))})}limit(e){return new r({...this.#e,queryNode:N.cloneWithLimit(this.#e.queryNode,Ge.create(x(e)))})}offset(e){return new r({...this.#e,queryNode:N.cloneWithOffset(this.#e.queryNode,ln.create(x(e)))})}fetch(e,t="only"){return new r({...this.#e,queryNode:N.cloneWithFetch(this.#e.queryNode,wn(e,t))})}top(e,t){return new r({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,oe(e,t))})}union(e){return new r({...this.#e,queryNode:N.cloneWithSetOperations(this.#e.queryNode,De("union",e,!1))})}unionAll(e){return new r({...this.#e,queryNode:N.cloneWithSetOperations(this.#e.queryNode,De("union",e,!0))})}intersect(e){return new r({...this.#e,queryNode:N.cloneWithSetOperations(this.#e.queryNode,De("intersect",e,!1))})}intersectAll(e){return new r({...this.#e,queryNode:N.cloneWithSetOperations(this.#e.queryNode,De("intersect",e,!0))})}except(e){return new r({...this.#e,queryNode:N.cloneWithSetOperations(this.#e.queryNode,De("except",e,!1))})}exceptAll(e){return new r({...this.#e,queryNode:N.cloneWithSetOperations(this.#e.queryNode,De("except",e,!0))})}as(e){return new lo(this,e)}clearSelect(){return new r({...this.#e,queryNode:N.cloneWithoutSelections(this.#e.queryNode)})}clearWhere(){return new r({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}clearLimit(){return new r({...this.#e,queryNode:N.cloneWithoutLimit(this.#e.queryNode)})}clearOffset(){return new r({...this.#e,queryNode:N.cloneWithoutOffset(this.#e.queryNode)})}clearOrderBy(){return new r({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}clearGroupBy(){return new r({...this.#e,queryNode:N.cloneWithoutGroupBy(this.#e.queryNode)})}$call(e){return e(this)}$if(e,t){return e?t(this):new r({...this.#e})}$castTo(){return new r(this.#e)}$narrowType(){return new r(this.#e)}$assertType(){return new r(this.#e)}$asTuple(){return new f(this.toOperationNode())}$asScalar(){return new f(this.toOperationNode())}withPlugin(e){return new r({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile();return(await this.#e.executor.executeQuery(e,this.#e.queryId)).rows}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=H){let t=await this.executeTakeFirst();if(t===void 0)throw ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return t}async*stream(e=100){let t=this.compile(),i=this.#e.executor.stream(t,e,this.#e.queryId);for await(let a of i)yield*a.rows}async explain(e,t){return await new r({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,t)}).execute()}};function Sr(r){return new ho(r)}var lo=class{#e;#r;constructor(e,t){this.#e=e,this.#r=t}get expression(){return this.#e}get alias(){return this.#r}get isAliasedSelectQueryBuilder(){return!0}toOperationNode(){return v.create(this.#e.toOperationNode(),c.create(this.#r))}};n();n();var me=o({is(r){return r.kind==="AggregateFunctionNode"},create(r,e=[]){return o({kind:"AggregateFunctionNode",func:r,aggregated:e})},cloneWithDistinct(r){return o({...r,distinct:!0})},cloneWithOrderBy(r,e,t=!1){let i=t?"withinGroup":"orderBy";return o({...r,[i]:r[i]?Ne.cloneWithItems(r[i],e):Ne.create(e)})},cloneWithFilter(r,e){return o({...r,filter:r.filter?I.cloneWithOperation(r.filter,"And",e):I.create(e)})},cloneWithOrFilter(r,e){return o({...r,filter:r.filter?I.cloneWithOperation(r.filter,"Or",e):I.create(e)})},cloneWithOver(r,e){return o({...r,over:e})}});n();var po=o({is(r){return r.kind==="FunctionNode"},create(r,e){return o({kind:"FunctionNode",func:r,arguments:e})}});n();var er=class r{#e;constructor(e){this.#e=o(e)}get expressionType(){}as(e){return new fo(this,e)}distinct(){return new r({...this.#e,aggregateFunctionNode:me.cloneWithDistinct(this.#e.aggregateFunctionNode)})}orderBy(...e){return new r({...this.#e,aggregateFunctionNode:u.cloneWithOrderByItems(this.#e.aggregateFunctionNode,K(e))})}clearOrderBy(){return new r({...this.#e,aggregateFunctionNode:u.cloneWithoutOrderBy(this.#e.aggregateFunctionNode)})}withinGroupOrderBy(...e){return new r({...this.#e,aggregateFunctionNode:me.cloneWithOrderBy(this.#e.aggregateFunctionNode,K(e),!0)})}filterWhere(...e){return new r({...this.#e,aggregateFunctionNode:me.cloneWithFilter(this.#e.aggregateFunctionNode,y(e))})}filterWhereRef(e,t,i){return new r({...this.#e,aggregateFunctionNode:me.cloneWithFilter(this.#e.aggregateFunctionNode,S(e,t,i))})}over(e){let t=hn();return new r({...this.#e,aggregateFunctionNode:me.cloneWithOver(this.#e.aggregateFunctionNode,(e?e(t):t).toOperationNode())})}$call(e){return e(this)}$castTo(){return new r(this.#e)}$notNull(){return new r(this.#e)}toOperationNode(){return this.#e.aggregateFunctionNode}},fo=class{#e;#r;constructor(e,t){this.#e=e,this.#r=t}get expression(){return this.#e}get alias(){return this.#r}toOperationNode(){return v.create(this.#e.toOperationNode(),c.create(this.#r))}};function ut(){let r=(t,i)=>new f(po.create(t,fe(i??[]))),e=(t,i)=>new er({aggregateFunctionNode:me.create(t,i?fe(i):void 0)});return Object.assign(r,{agg:e,avg(t){return e("avg",[t])},coalesce(...t){return r("coalesce",t)},count(t){return e("count",[t])},countAll(t){return new er({aggregateFunctionNode:me.create("count",E(t))})},max(t){return e("max",[t])},min(t){return e("min",[t])},sum(t){return e("sum",[t])},any(t){return r("any",[t])},jsonAgg(t){return new er({aggregateFunctionNode:me.create("json_agg",[g(t)?p(t):t.toOperationNode()])})},toJson(t){return new f(po.create("to_json",[g(t)?p(t):t.toOperationNode()]))}})}n();n();var xn=o({is(r){return r.kind==="UnaryOperationNode"},create(r,e){return o({kind:"UnaryOperationNode",operator:r,operand:e})}});function On(r,e){return xn.create(_.create(r),q(e))}n();n();var j=o({is(r){return r.kind==="CaseNode"},create(r){return o({kind:"CaseNode",value:r})},cloneWithWhen(r,e){return o({...r,when:o(r.when?[...r.when,e]:[e])})},cloneWithThen(r,e){return o({...r,when:r.when?o([...r.when.slice(0,-1),ye.cloneWithResult(r.when[r.when.length-1],e)]):void 0})},cloneWith(r,e){return o({...r,...e})}});var rr=class{#e;constructor(e){this.#e=o(e)}when(...e){return new dt({...this.#e,node:j.cloneWithWhen(this.#e.node,ye.create(y(e)))})}},dt=class{#e;constructor(e){this.#e=o(e)}then(e){return new No({...this.#e,node:j.cloneWithThen(this.#e.node,Ur(e)?Wr(e):x(e))})}},No=class{#e;constructor(e){this.#e=o(e)}when(...e){return new dt({...this.#e,node:j.cloneWithWhen(this.#e.node,ye.create(y(e)))})}else(e){return new yo({...this.#e,node:j.cloneWith(this.#e.node,{else:Ur(e)?Wr(e):x(e)})})}end(){return new f(j.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new f(j.cloneWith(this.#e.node,{isStatement:!0}))}},yo=class{#e;constructor(e){this.#e=o(e)}end(){return new f(j.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new f(j.cloneWith(this.#e.node,{isStatement:!0}))}};n();n();var wo=o({is(r){return r.kind==="JSONPathLegNode"},create(r,e){return o({kind:"JSONPathLegNode",type:r,value:e})}});var tr=class{#e;constructor(e){this.#e=e}at(e){return this.#r("ArrayLocation",e)}key(e){return this.#r("Member",e)}#r(e,t){return Ue.is(this.#e)?new ct(Ue.cloneWithTraversal(this.#e,be.is(this.#e.traversal)?be.cloneWithLeg(this.#e.traversal,wo.create(e,t)):zr.cloneWithValue(this.#e.traversal,k.createImmediate(t)))):new ct(be.cloneWithLeg(this.#e,wo.create(e,t)))}},ct=class r extends tr{#e;constructor(e){super(e),this.#e=e}get expressionType(){}as(e){return new xo(this,e)}$castTo(){return new r(this.#e)}$notNull(){return new r(this.#e)}toOperationNode(){return this.#e}},xo=class{#e;#r;constructor(e,t){this.#e=e,this.#r=t}get expression(){return this.#e}get alias(){return this.#r}toOperationNode(){return v.create(this.#e.toOperationNode(),C(this.#r)?this.#r.toOperationNode():c.create(this.#r))}};n();var Oo=o({is(r){return r.kind==="TupleNode"},create(r){return o({kind:"TupleNode",values:o(r)})}});n();n();var ri=["varchar","char","text","integer","int2","int4","int8","smallint","bigint","boolean","real","double precision","float4","float8","decimal","numeric","binary","bytea","date","datetime","time","timetz","timestamp","timestamptz","serial","bigserial","uuid","json","jsonb","blob","varbinary","int4range","int4multirange","int8range","int8multirange","numrange","nummultirange","tsrange","tsmultirange","tstzrange","tstzmultirange","daterange","datemultirange"],ti=[/^varchar\(\d+\)$/,/^char\(\d+\)$/,/^decimal\(\d+, \d+\)$/,/^numeric\(\d+, \d+\)$/,/^binary\(\d+\)$/,/^datetime\(\d+\)$/,/^time\(\d+\)$/,/^timetz\(\d+\)$/,/^timestamp\(\d+\)$/,/^timestamptz\(\d+\)$/,/^varbinary\(\d+\)$/],Wn=o({is(r){return r.kind==="DataTypeNode"},create(r){return o({kind:"DataTypeNode",dataType:r})}});function gn(r){return!!(ri.includes(r)||ti.some(e=>e.test(r)))}function ie(r){if(C(r))return r.toOperationNode();if(gn(r))return Wn.create(r);throw new Error(`invalid column data type ${JSON.stringify(r)}`)}n();var Cn=o({is(r){return r.kind==="CastNode"},create(r,e){return o({kind:"CastNode",expression:r,dataType:e})}});function at(r=Ze){function e(a,d,m){return new f(Jr(a,d,m))}function t(a,d){return new f(On(a,d))}let i=Object.assign(e,{fn:void 0,eb:void 0,selectFrom(a){return Sr({queryId:O(),executor:r,queryNode:N.createFrom(ne(a))})},case(a){return new rr({node:j.create(J(a)?void 0:q(a))})},ref(a,d){return J(d)?new f(re(a)):new tr(Jo(a,d))},jsonPath(){return new tr(be.create())},table(a){return new f(p(a))},val(a){return new f(x(a))},refTuple(...a){return new f(Oo.create(a.map(q)))},tuple(...a){return new f(Oo.create(a.map(x)))},lit(a){return new f(Wr(a))},unary:t,not(a){return t("not",a)},exists(a){return t("exists",a)},neg(a){return t("-",a)},between(a,d,m){return new f(Ce.create(q(a),_.create("between"),V.create(x(d),x(m))))},betweenSymmetric(a,d,m){return new f(Ce.create(q(a),_.create("between symmetric"),V.create(x(d),x(m))))},and(a){return Q(a)?new f($e(a,"and")):new f(Kt(a,"and"))},or(a){return Q(a)?new f($e(a,"or")):new f(Kt(a,"or"))},parens(...a){let d=y(a);return ke.is(d)?new f(d):new f(ke.create(d))},cast(a,d){return new f(Cn.create(q(a),ie(d)))},withSchema(a){return at(r.withPluginAtFront(new Y(a)))}});return i.fn=ut(),i.eb=i,i}function te(r){return at()}function U(r){if(C(r))return r.toOperationNode();if(W(r))return r(te()).toOperationNode();throw new Error(`invalid expression: ${JSON.stringify(r)}`)}function jr(r){if(C(r))return r.toOperationNode();if(W(r))return r(te()).toOperationNode();throw new Error(`invalid aliased expression: ${JSON.stringify(r)}`)}function pe(r){return Pr(r)||Lo(r)||W(r)}n();var mt=class{#e;get table(){return this.#e}constructor(e){this.#e=e}as(e){return new Wo(this.#e,e)}},Wo=class{#e;#r;get table(){return this.#e}get alias(){return this.#r}constructor(e,t){this.#e=e,this.#r=t}toOperationNode(){return v.create(p(this.#e),c.create(this.#r))}};function bn(r){return R(r)&&C(r)&&g(r.table)&&g(r.alias)}function ne(r){return Q(r)?r.map(e=>Be(e)):[Be(r)]}function Be(r){return g(r)?uo(r):bn(r)?r.toOperationNode():jr(r)}function uo(r){let e=" as ";if(r.includes(e)){let[t,i]=r.split(e).map(kn);return v.create(p(t),c.create(i))}else return p(r)}function p(r){let e=".";if(r.includes(e)){let[t,i]=r.split(e).map(kn);return $.createWithSchema(t,i)}else return $.create(r)}function kn(r){return r.trim()}n();n();var go=o({is(r){return r.kind==="AddColumnNode"},create(r){return o({kind:"AddColumnNode",column:r})}});n();var w=o({is(r){return r.kind==="ColumnDefinitionNode"},create(r,e){return o({kind:"ColumnDefinitionNode",column:h.create(r),dataType:e})},cloneWithFrontModifier(r,e){return o({...r,frontModifiers:r.frontModifiers?o([...r.frontModifiers,e]):[e]})},cloneWithEndModifier(r,e){return o({...r,endModifiers:r.endModifiers?o([...r.endModifiers,e]):[e]})},cloneWith(r,e){return o({...r,...e})}});n();var Co=o({is(r){return r.kind==="DropColumnNode"},create(r){return o({kind:"DropColumnNode",column:h.create(r)})}});n();var bo=o({is(r){return r.kind==="RenameColumnNode"},create(r,e){return o({kind:"RenameColumnNode",column:h.create(r),renameTo:h.create(e)})}});n();n();var or=o({is(r){return r.kind==="CheckConstraintNode"},create(r,e){return o({kind:"CheckConstraintNode",expression:r,name:e?c.create(e):void 0})}});n();var Tn=["no action","restrict","cascade","set null","set default"],nr=o({is(r){return r.kind==="ReferencesNode"},create(r,e){return o({kind:"ReferencesNode",table:r,columns:o([...e])})},cloneWithOnDelete(r,e){return o({...r,onDelete:e})},cloneWithOnUpdate(r,e){return o({...r,onUpdate:e})}});n();function ht(r){return C(r)?r.toOperationNode():k.createImmediate(r)}n();var Ar=o({is(r){return r.kind==="GeneratedNode"},create(r){return o({kind:"GeneratedNode",...r})},createWithExpression(r){return o({kind:"GeneratedNode",always:!0,expression:r})},cloneWith(r,e){return o({...r,...e})}});n();var Sn=o({is(r){return r.kind==="DefaultValueNode"},create(r){return o({kind:"DefaultValueNode",defaultValue:r})}});n();function ir(r){if(Tn.includes(r))return r;throw new Error(`invalid OnModifyForeignAction ${r}`)}var we=class r{#e;constructor(e){this.#e=e}autoIncrement(){return new r(w.cloneWith(this.#e,{autoIncrement:!0}))}identity(){return new r(w.cloneWith(this.#e,{identity:!0}))}primaryKey(){return new r(w.cloneWith(this.#e,{primaryKey:!0}))}references(e){let t=re(e);if(!t.table||Me.is(t.column))throw new Error(`invalid call references('${e}'). The reference must have format table.column or schema.table.column`);return new r(w.cloneWith(this.#e,{references:nr.create(t.table,[t.column])}))}onDelete(e){if(!this.#e.references)throw new Error("on delete constraint can only be added for foreign keys");return new r(w.cloneWith(this.#e,{references:nr.cloneWithOnDelete(this.#e.references,ir(e))}))}onUpdate(e){if(!this.#e.references)throw new Error("on update constraint can only be added for foreign keys");return new r(w.cloneWith(this.#e,{references:nr.cloneWithOnUpdate(this.#e.references,ir(e))}))}unique(){return new r(w.cloneWith(this.#e,{unique:!0}))}notNull(){return new r(w.cloneWith(this.#e,{notNull:!0}))}unsigned(){return new r(w.cloneWith(this.#e,{unsigned:!0}))}defaultTo(e){return new r(w.cloneWith(this.#e,{defaultTo:Sn.create(ht(e))}))}check(e){return new r(w.cloneWith(this.#e,{check:or.create(e.toOperationNode())}))}generatedAlwaysAs(e){return new r(w.cloneWith(this.#e,{generated:Ar.createWithExpression(e.toOperationNode())}))}generatedAlwaysAsIdentity(){return new r(w.cloneWith(this.#e,{generated:Ar.create({identity:!0,always:!0})}))}generatedByDefaultAsIdentity(){return new r(w.cloneWith(this.#e,{generated:Ar.create({identity:!0,byDefault:!0})}))}stored(){if(!this.#e.generated)throw new Error("stored() can only be called after generatedAlwaysAs");return new r(w.cloneWith(this.#e,{generated:Ar.cloneWith(this.#e.generated,{stored:!0})}))}modifyFront(e){return new r(w.cloneWithFrontModifier(this.#e,e.toOperationNode()))}nullsNotDistinct(){return new r(w.cloneWith(this.#e,{nullsNotDistinct:!0}))}ifNotExists(){return new r(w.cloneWith(this.#e,{ifNotExists:!0}))}modifyEnd(e){return new r(w.cloneWithEndModifier(this.#e,e.toOperationNode()))}$call(e){return e(this)}toOperationNode(){return this.#e}};n();var ko=o({is(r){return r.kind==="ModifyColumnNode"},create(r){return o({kind:"ModifyColumnNode",column:r})}});n();n();var se=o({is(r){return r.kind==="ForeignKeyConstraintNode"},create(r,e,t,i){return o({kind:"ForeignKeyConstraintNode",columns:r,references:nr.create(e,t),name:i?c.create(i):void 0})},cloneWith(r,e){return o({...r,...e})}});var sr=class r{#e;constructor(e){this.#e=e}onDelete(e){return new r(se.cloneWith(this.#e,{onDelete:ir(e)}))}onUpdate(e){return new r(se.cloneWith(this.#e,{onUpdate:ir(e)}))}deferrable(){return new r(se.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new r(se.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new r(se.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new r(se.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};n();var ar=o({is(r){return r.kind==="AddConstraintNode"},create(r){return o({kind:"AddConstraintNode",constraint:r})}});n();var he=o({is(r){return r.kind==="UniqueConstraintNode"},create(r,e,t){return o({kind:"UniqueConstraintNode",columns:o(r.map(h.create)),name:e?c.create(e):void 0,nullsNotDistinct:t})},cloneWith(r,e){return o({...r,...e})}});n();var ur=o({is(r){return r.kind==="DropConstraintNode"},create(r){return o({kind:"DropConstraintNode",constraintName:c.create(r)})},cloneWith(r,e){return o({...r,...e})}});n();n();var dr=o({is(r){return r.kind==="AlterColumnNode"},create(r,e,t){return o({kind:"AlterColumnNode",column:h.create(r),[e]:t})}});var Rr=class{#e;constructor(e){this.#e=e}setDataType(e){return new Qe(dr.create(this.#e,"dataType",ie(e)))}setDefault(e){return new Qe(dr.create(this.#e,"setDefault",ht(e)))}dropDefault(){return new Qe(dr.create(this.#e,"dropDefault",!0))}setNotNull(){return new Qe(dr.create(this.#e,"setNotNull",!0))}dropNotNull(){return new Qe(dr.create(this.#e,"dropNotNull",!0))}$call(e){return e(this)}},Qe=class{#e;constructor(e){this.#e=e}toOperationNode(){return this.#e}};n();var xe=class{#e;constructor(e){this.#e=o(e)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();var lt=class r{#e;constructor(e){this.#e=o(e)}onDelete(e){return new r({...this.#e,constraintBuilder:this.#e.constraintBuilder.onDelete(e)})}onUpdate(e){return new r({...this.#e,constraintBuilder:this.#e.constraintBuilder.onUpdate(e)})}deferrable(){return new r({...this.#e,constraintBuilder:this.#e.constraintBuilder.deferrable()})}notDeferrable(){return new r({...this.#e,constraintBuilder:this.#e.constraintBuilder.notDeferrable()})}initiallyDeferred(){return new r({...this.#e,constraintBuilder:this.#e.constraintBuilder.initiallyDeferred()})}initiallyImmediate(){return new r({...this.#e,constraintBuilder:this.#e.constraintBuilder.initiallyImmediate()})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(l.cloneWithTableProps(this.#e.node,{addConstraint:ar.create(this.#e.constraintBuilder.toOperationNode())}),this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();var qr=class r{#e;constructor(e){this.#e=o(e)}ifExists(){return new r({...this.#e,node:l.cloneWithTableProps(this.#e.node,{dropConstraint:ur.cloneWith(this.#e.node.dropConstraint,{ifExists:!0})})})}cascade(){return new r({...this.#e,node:l.cloneWithTableProps(this.#e.node,{dropConstraint:ur.cloneWith(this.#e.node.dropConstraint,{modifier:"cascade"})})})}restrict(){return new r({...this.#e,node:l.cloneWithTableProps(this.#e.node,{dropConstraint:ur.cloneWith(this.#e.node.dropConstraint,{modifier:"restrict"})})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();var Oe=o({is(r){return r.kind==="PrimaryKeyConstraintNode"},create(r,e){return o({kind:"PrimaryKeyConstraintNode",columns:o(r.map(h.create)),name:e?c.create(e):void 0})},cloneWith(r,e){return o({...r,...e})}});n();var Re=o({is(r){return r.kind==="AddIndexNode"},create(r){return o({kind:"AddIndexNode",name:c.create(r)})},cloneWith(r,e){return o({...r,...e})},cloneWithColumns(r,e){return o({...r,columns:[...r.columns||[],...e]})}});n();var pt=class r{#e;constructor(e){this.#e=o(e)}unique(){return new r({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Re.cloneWith(this.#e.node.addIndex,{unique:!0})})})}column(e){return new r({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Re.cloneWithColumns(this.#e.node.addIndex,[Je(e)])})})}columns(e){return new r({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Re.cloneWithColumns(this.#e.node.addIndex,e.map(Je))})})}expression(e){return new r({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Re.cloneWithColumns(this.#e.node.addIndex,[e.toOperationNode()])})})}using(e){return new r({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Re.cloneWith(this.#e.node.addIndex,{using:L.createWithSql(e)})})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();var cr=class r{#e;constructor(e){this.#e=e}nullsNotDistinct(){return new r(he.cloneWith(this.#e,{nullsNotDistinct:!0}))}deferrable(){return new r(he.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new r(he.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new r(he.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new r(he.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};n();var mr=class r{#e;constructor(e){this.#e=e}deferrable(){return new r(Oe.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new r(Oe.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new r(Oe.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new r(Oe.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};n();var hr=class{#e;constructor(e){this.#e=e}$call(e){return e(this)}toOperationNode(){return this.#e}};n();var En=o({is(r){return r.kind==="RenameConstraintNode"},create(r,e){return o({kind:"RenameConstraintNode",oldName:c.create(r),newName:c.create(e)})}});var ft=class{#e;constructor(e){this.#e=o(e)}renameTo(e){return new xe({...this.#e,node:l.cloneWithTableProps(this.#e.node,{renameTo:p(e)})})}setSchema(e){return new xe({...this.#e,node:l.cloneWithTableProps(this.#e.node,{setSchema:c.create(e)})})}alterColumn(e,t){let i=t(new Rr(e));return new Pe({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,i.toOperationNode())})}dropColumn(e){return new Pe({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,Co.create(e))})}renameColumn(e,t){return new Pe({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,bo.create(e,t))})}addColumn(e,t,i=F){let a=i(new we(w.create(e,ie(t))));return new Pe({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,go.create(a.toOperationNode()))})}modifyColumn(e,t,i=F){let a=i(new we(w.create(e,ie(t))));return new Pe({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,ko.create(a.toOperationNode()))})}addUniqueConstraint(e,t,i=F){let a=i(new cr(he.create(t,e)));return new xe({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addConstraint:ar.create(a.toOperationNode())})})}addCheckConstraint(e,t,i=F){let a=i(new hr(or.create(t.toOperationNode(),e)));return new xe({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addConstraint:ar.create(a.toOperationNode())})})}addForeignKeyConstraint(e,t,i,a,d=F){let m=d(new sr(se.create(t.map(h.create),p(i),a.map(h.create),e)));return new lt({...this.#e,constraintBuilder:m})}addPrimaryKeyConstraint(e,t,i=F){let a=i(new mr(Oe.create(t,e)));return new xe({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addConstraint:ar.create(a.toOperationNode())})})}dropConstraint(e){return new qr({...this.#e,node:l.cloneWithTableProps(this.#e.node,{dropConstraint:ur.create(e)})})}renameConstraint(e,t){return new qr({...this.#e,node:l.cloneWithTableProps(this.#e.node,{renameConstraint:En.create(e,t)})})}addIndex(e){return new pt({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Re.create(e)})})}dropIndex(e){return new xe({...this.#e,node:l.cloneWithTableProps(this.#e.node,{dropIndex:ge.create(e)})})}$call(e){return e(this)}},Pe=class r{#e;constructor(e){this.#e=o(e)}alterColumn(e,t){let i=t(new Rr(e));return new r({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,i.toOperationNode())})}dropColumn(e){return new r({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,Co.create(e))})}renameColumn(e,t){return new r({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,bo.create(e,t))})}addColumn(e,t,i=F){let a=i(new we(w.create(e,ie(t))));return new r({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,go.create(a.toOperationNode()))})}modifyColumn(e,t,i=F){let a=i(new we(w.create(e,ie(t))));return new r({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,ko.create(a.toOperationNode()))})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();n();var lr=class extends Ee{transformPrimitiveValueList(e){return ue.create(e.values.map(k.createImmediate))}transformValue(e){return k.createImmediate(e.value)}};var Nt=class r{#e;constructor(e){this.#e=o(e)}ifNotExists(){return new r({...this.#e,node:X.cloneWith(this.#e.node,{ifNotExists:!0})})}unique(){return new r({...this.#e,node:X.cloneWith(this.#e.node,{unique:!0})})}nullsNotDistinct(){return new r({...this.#e,node:X.cloneWith(this.#e.node,{nullsNotDistinct:!0})})}on(e){return new r({...this.#e,node:X.cloneWith(this.#e.node,{table:p(e)})})}column(e){return new r({...this.#e,node:X.cloneWithColumns(this.#e.node,[Je(e)])})}columns(e){return new r({...this.#e,node:X.cloneWithColumns(this.#e.node,e.map(Je))})}expression(e){return new r({...this.#e,node:X.cloneWithColumns(this.#e.node,[e.toOperationNode()])})}using(e){return new r({...this.#e,node:X.cloneWith(this.#e.node,{using:L.createWithSql(e)})})}where(...e){let t=new lr;return new r({...this.#e,node:u.cloneWithWhere(this.#e.node,t.transformNode(y(e),this.#e.queryId))})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();var yt=class r{#e;constructor(e){this.#e=o(e)}ifNotExists(){return new r({...this.#e,node:Qr.cloneWith(this.#e.node,{ifNotExists:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();n();function An(r){if(vo.includes(r))return r;throw new Error(`invalid OnCommitAction ${r}`)}var wt=class r{#e;constructor(e){this.#e=o(e)}temporary(){return new r({...this.#e,node:z.cloneWith(this.#e.node,{temporary:!0})})}onCommit(e){return new r({...this.#e,node:z.cloneWith(this.#e.node,{onCommit:An(e)})})}ifNotExists(){return new r({...this.#e,node:z.cloneWith(this.#e.node,{ifNotExists:!0})})}addColumn(e,t,i=F){let a=i(new we(w.create(e,ie(t))));return new r({...this.#e,node:z.cloneWithColumn(this.#e.node,a.toOperationNode())})}addPrimaryKeyConstraint(e,t,i=F){let a=i(new mr(Oe.create(t,e)));return new r({...this.#e,node:z.cloneWithConstraint(this.#e.node,a.toOperationNode())})}addUniqueConstraint(e,t,i=F){let a=i(new cr(he.create(t,e)));return new r({...this.#e,node:z.cloneWithConstraint(this.#e.node,a.toOperationNode())})}addCheckConstraint(e,t,i=F){let a=i(new hr(or.create(t.toOperationNode(),e)));return new r({...this.#e,node:z.cloneWithConstraint(this.#e.node,a.toOperationNode())})}addForeignKeyConstraint(e,t,i,a,d=F){let m=d(new sr(se.create(t.map(h.create),p(i),a.map(h.create),e)));return new r({...this.#e,node:z.cloneWithConstraint(this.#e.node,m.toOperationNode())})}modifyFront(e){return new r({...this.#e,node:z.cloneWithFrontModifier(this.#e.node,e.toOperationNode())})}modifyEnd(e){return new r({...this.#e,node:z.cloneWithEndModifier(this.#e.node,e.toOperationNode())})}as(e){return new r({...this.#e,node:z.cloneWith(this.#e.node,{selectQuery:U(e)})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();var xt=class r{#e;constructor(e){this.#e=o(e)}on(e){return new r({...this.#e,node:ge.cloneWith(this.#e.node,{table:p(e)})})}ifExists(){return new r({...this.#e,node:ge.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new r({...this.#e,node:ge.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();var Ot=class r{#e;constructor(e){this.#e=o(e)}ifExists(){return new r({...this.#e,node:xr.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new r({...this.#e,node:xr.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();var Wt=class r{#e;constructor(e){this.#e=o(e)}ifExists(){return new r({...this.#e,node:Or.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new r({...this.#e,node:Or.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();n();var We=o({is(r){return r.kind==="CreateViewNode"},create(r){return o({kind:"CreateViewNode",name:P.create(r)})},cloneWith(r,e){return o({...r,...e})}});n();var gt=class{#e=new lr;transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}transformResult(e){return Promise.resolve(e.result)}};var Ct=class r{#e;constructor(e){this.#e=o(e)}temporary(){return new r({...this.#e,node:We.cloneWith(this.#e.node,{temporary:!0})})}materialized(){return new r({...this.#e,node:We.cloneWith(this.#e.node,{materialized:!0})})}ifNotExists(){return new r({...this.#e,node:We.cloneWith(this.#e.node,{ifNotExists:!0})})}orReplace(){return new r({...this.#e,node:We.cloneWith(this.#e.node,{orReplace:!0})})}columns(e){return new r({...this.#e,node:We.cloneWith(this.#e.node,{columns:e.map(Ut)})})}as(e){let t=e.withPlugin(new gt).toOperationNode();return new r({...this.#e,node:We.cloneWith(this.#e.node,{as:t})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();n();var pr=o({is(r){return r.kind==="DropViewNode"},create(r){return o({kind:"DropViewNode",name:P.create(r)})},cloneWith(r,e){return o({...r,...e})}});var bt=class r{#e;constructor(e){this.#e=o(e)}materialized(){return new r({...this.#e,node:pr.cloneWith(this.#e.node,{materialized:!0})})}ifExists(){return new r({...this.#e,node:pr.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new r({...this.#e,node:pr.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();n();var kt=o({is(r){return r.kind==="CreateTypeNode"},create(r){return o({kind:"CreateTypeNode",name:r})},cloneWithEnum(r,e){return o({...r,enum:ue.create(e.map(k.createImmediate))})}});var Tt=class r{#e;constructor(e){this.#e=o(e)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}asEnum(e){return new r({...this.#e,node:kt.cloneWithEnum(this.#e.node,e)})}$call(e){return e(this)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();n();var St=o({is(r){return r.kind==="DropTypeNode"},create(r){return o({kind:"DropTypeNode",name:r})},cloneWith(r,e){return o({...r,...e})}});var Et=class r{#e;constructor(e){this.#e=o(e)}ifExists(){return new r({...this.#e,node:St.cloneWith(this.#e.node,{ifExists:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};n();function To(r){let e=".";if(r.includes(e)){let t=r.split(e).map(oi);if(t.length===2)return P.createWithSchema(t[0],t[1]);throw new Error(`invalid schemable identifier ${r}`)}else return P.create(r)}function oi(r){return r.trim()}n();n();var fr=o({is(r){return r.kind==="RefreshMaterializedViewNode"},create(r){return o({kind:"RefreshMaterializedViewNode",name:P.create(r)})},cloneWith(r,e){return o({...r,...e})}});var At=class r{#e;constructor(e){this.#e=o(e)}concurrently(){return new r({...this.#e,node:fr.cloneWith(this.#e.node,{concurrently:!0,withNoData:!1})})}withData(){return new r({...this.#e,node:fr.cloneWith(this.#e.node,{withNoData:!1})})}withNoData(){return new r({...this.#e,node:fr.cloneWith(this.#e.node,{withNoData:!0,concurrently:!1})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile(),this.#e.queryId)}};var Rt=class r{#e;constructor(e){this.#e=e}createTable(e){return new wt({queryId:O(),executor:this.#e,node:z.create(p(e))})}dropTable(e){return new Wt({queryId:O(),executor:this.#e,node:Or.create(p(e))})}createIndex(e){return new Nt({queryId:O(),executor:this.#e,node:X.create(e)})}dropIndex(e){return new xt({queryId:O(),executor:this.#e,node:ge.create(e)})}createSchema(e){return new yt({queryId:O(),executor:this.#e,node:Qr.create(e)})}dropSchema(e){return new Ot({queryId:O(),executor:this.#e,node:xr.create(e)})}alterTable(e){return new ft({queryId:O(),executor:this.#e,node:l.create(p(e))})}createView(e){return new Ct({queryId:O(),executor:this.#e,node:We.create(e)})}refreshMaterializedView(e){return new At({queryId:O(),executor:this.#e,node:fr.create(e)})}dropView(e){return new bt({queryId:O(),executor:this.#e,node:pr.create(e)})}createType(e){return new Tt({queryId:O(),executor:this.#e,node:kt.create(To(e))})}dropType(e){return new Et({queryId:O(),executor:this.#e,node:St.create(To(e))})}withPlugin(e){return new r(this.#e.withPlugin(e))}withoutPlugins(){return new r(this.#e.withoutPlugins())}withSchema(e){return new r(this.#e.withPluginAtFront(new Y(e)))}};n();var qt=class{ref(e){return new Lr(e)}table(e){return new mt(e)}};n();var It=class{#e;constructor(e){this.#e=e}async provideConnection(e){let t=await this.#e.acquireConnection();try{return await e(t)}finally{await this.#e.releaseConnection(t)}}};n();var Bt=class r extends Xe{#e;#r;#t;constructor(e,t,i,a=[]){super(a),this.#e=e,this.#r=t,this.#t=i}get adapter(){return this.#r}compileQuery(e,t){return this.#e.compileQuery(e,t)}provideConnection(e){return this.#t.provideConnection(e)}withPlugins(e){return new r(this.#e,this.#r,this.#t,[...this.plugins,...e])}withPlugin(e){return new r(this.#e,this.#r,this.#t,[...this.plugins,e])}withPluginAtFront(e){return new r(this.#e,this.#r,this.#t,[e,...this.plugins])}withConnectionProvider(e){return new r(this.#e,this.#r,e,[...this.plugins])}withoutPlugins(){return new r(this.#e,this.#r,this.#t,[])}};n();n();function Dt(){return typeof performance<"u"&&W(performance.now)?performance.now():Date.now()}var Qt=class{#e;#r;#t;#i;#o;#a=new WeakSet;constructor(e,t){this.#i=!1,this.#e=e,this.#r=t}async init(){if(this.#o)throw new Error("driver has already been destroyed");this.#t||(this.#t=this.#e.init().then(()=>{this.#i=!0}).catch(e=>(this.#t=void 0,Promise.reject(e)))),await this.#t}async acquireConnection(){if(this.#o)throw new Error("driver has already been destroyed");this.#i||await this.init();let e=await this.#e.acquireConnection();return this.#a.has(e)||(this.#d()&&this.#n(e),this.#a.add(e)),e}async releaseConnection(e){await this.#e.releaseConnection(e)}beginTransaction(e,t){return this.#e.beginTransaction(e,t)}commitTransaction(e){return this.#e.commitTransaction(e)}rollbackTransaction(e){return this.#e.rollbackTransaction(e)}savepoint(e,t,i){if(this.#e.savepoint)return this.#e.savepoint(e,t,i);throw new Error("The `savepoint` method is not supported by this driver")}rollbackToSavepoint(e,t,i){if(this.#e.rollbackToSavepoint)return this.#e.rollbackToSavepoint(e,t,i);throw new Error("The `rollbackToSavepoint` method is not supported by this driver")}releaseSavepoint(e,t,i){if(this.#e.releaseSavepoint)return this.#e.releaseSavepoint(e,t,i);throw new Error("The `releaseSavepoint` method is not supported by this driver")}async destroy(){this.#t&&(await this.#t,this.#o||(this.#o=this.#e.destroy().catch(e=>(this.#o=void 0,Promise.reject(e)))),await this.#o)}#d(){return this.#r.isLevelEnabled("query")||this.#r.isLevelEnabled("error")}#n(e){let t=e.executeQuery,i=e.streamQuery,a=this;e.executeQuery=async d=>{let m,A=Dt();try{return await t.call(e,d)}catch(B){throw m=B,await a.#s(B,d,A),B}finally{m||await a.#u(d,A)}},e.streamQuery=async function*(d,m){let A,B=Dt();try{for await(let D of i.call(e,d,m))yield D}catch(D){throw A=D,await a.#s(D,d,B),D}finally{A||await a.#u(d,B,!0)}}}async#s(e,t,i){await this.#r.error(()=>({level:"error",error:e,query:t,queryDurationMillis:this.#c(i)}))}async#u(e,t,i=!1){await this.#r.query(()=>({level:"query",isStream:i,query:e,queryDurationMillis:this.#c(t)}))}#c(e){return Dt()-e}};n();var ni=()=>{},Nr=class{#e;#r;constructor(e){this.#e=e}async provideConnection(e){for(;this.#r;)await this.#r.catch(ni);return this.#r=this.#t(e).finally(()=>{this.#r=void 0}),this.#r}async#t(e){return await e(this.#e)}};n();var ii=["read only","read write"],si=["read uncommitted","read committed","repeatable read","serializable","snapshot"];function So(r){if(r.accessMode&&!ii.includes(r.accessMode))throw new Error(`invalid transaction access mode ${r.accessMode}`);if(r.isolationLevel&&!si.includes(r.isolationLevel))throw new Error(`invalid transaction isolation level ${r.isolationLevel}`)}n();var JC=o(["query","error"]),Pt=class{#e;#r;constructor(e){W(e)?(this.#r=e,this.#e=o({query:!0,error:!0})):(this.#r=ai,this.#e=o({query:e.includes("query"),error:e.includes("error")}))}isLevelEnabled(e){return this.#e[e]}async query(e){this.#e.query&&await this.#r(e())}async error(e){this.#e.error&&await this.#r(e())}};function ai(r){if(r.level==="query"){let e=`kysely:query:${r.isStream?"stream:":""}`;console.log(`${e} ${r.query.sql}`),console.log(`${e} duration: ${r.queryDurationMillis.toFixed(1)}ms`)}else r.level==="error"&&(r.error instanceof Error?console.error(`kysely:error: ${r.error.stack??r.error.message}`):console.error(`kysely:error: ${JSON.stringify({error:r.error,query:r.query.sql,queryDurationMillis:r.queryDurationMillis})}`))}n();function Rn(r){return R(r)&&W(r.compile)}Symbol.asyncDispose??=Symbol("Symbol.asyncDispose");var yr=class r extends _e{#e;constructor(e){let t,i;if(ui(e))t={executor:e.executor},i={...e};else{let a=e.dialect,d=a.createDriver(),m=a.createQueryCompiler(),A=a.createAdapter(),B=new Pt(e.log??[]),D=new Qt(d,B),qn=new It(D),Po=new Bt(m,A,qn,e.plugins??[]);t={executor:Po},i={config:e,executor:Po,dialect:a,driver:D}}super(t),this.#e=o(i)}get schema(){return new Rt(this.#e.executor)}get dynamic(){return new qt}get introspection(){return this.#e.dialect.createIntrospector(this.withoutPlugins())}case(e){return new rr({node:j.create(J(e)?void 0:U(e))})}get fn(){return ut()}transaction(){return new Ao({...this.#e})}startTransaction(){return new Ro({...this.#e})}connection(){return new Eo({...this.#e})}withPlugin(e){return new r({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new r({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new r({...this.#e,executor:this.#e.executor.withPluginAtFront(new Y(e))})}withTables(){return new r({...this.#e})}async destroy(){await this.#e.driver.destroy()}get isTransaction(){return!1}getExecutor(){return this.#e.executor}executeQuery(e,t=O()){let i=Rn(e)?e.compile():e;return this.getExecutor().executeQuery(i,t)}async[Symbol.asyncDispose](){await this.destroy()}},vt=class r extends yr{#e;constructor(e){super(e),this.#e=e}get isTransaction(){return!0}transaction(){throw new Error("calling the transaction method for a Transaction is not supported")}connection(){throw new Error("calling the connection method for a Transaction is not supported")}async destroy(){throw new Error("calling the destroy method for a Transaction is not supported")}withPlugin(e){return new r({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new r({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new r({...this.#e,executor:this.#e.executor.withPluginAtFront(new Y(e))})}withTables(){return new r({...this.#e})}};function ui(r){return R(r)&&R(r.config)&&R(r.driver)&&R(r.executor)&&R(r.dialect)}var Eo=class{#e;constructor(e){this.#e=o(e)}async execute(e){return this.#e.executor.provideConnection(async t=>{let i=this.#e.executor.withConnectionProvider(new Nr(t)),a=new yr({...this.#e,executor:i});return await e(a)})}},Ao=class r{#e;constructor(e){this.#e=o(e)}setAccessMode(e){return new r({...this.#e,accessMode:e})}setIsolationLevel(e){return new r({...this.#e,isolationLevel:e})}async execute(e){let{isolationLevel:t,accessMode:i,...a}=this.#e,d={isolationLevel:t,accessMode:i};return So(d),this.#e.executor.provideConnection(async m=>{let A=this.#e.executor.withConnectionProvider(new Nr(m)),B=new vt({...a,executor:A});try{await this.#e.driver.beginTransaction(m,d);let D=await e(B);return await this.#e.driver.commitTransaction(m),D}catch(D){throw await this.#e.driver.rollbackTransaction(m),D}})}},Ro=class r{#e;constructor(e){this.#e=o(e)}setAccessMode(e){return new r({...this.#e,accessMode:e})}setIsolationLevel(e){return new r({...this.#e,isolationLevel:e})}async execute(){let{isolationLevel:e,accessMode:t,...i}=this.#e,a={isolationLevel:e,accessMode:t};So(a);let d=await ot(this.#e.executor);return await this.#e.driver.beginTransaction(d.connection,a),new qo({...i,connection:d,executor:this.#e.executor.withConnectionProvider(new Nr(d.connection))})}},qo=class r extends vt{#e;#r;#t;constructor(e){let t={isCommitted:!1,isRolledBack:!1};e={...e,executor:new Io(e.executor,t)};let{connection:i,...a}=e;super(a),this.#e=o(e),this.#t=t;let d=O();this.#r=m=>e.executor.compileQuery(m,d)}get isCommitted(){return this.#t.isCommitted}get isRolledBack(){return this.#t.isRolledBack}commit(){return Le(this.#t),new ve(async()=>{await this.#e.driver.commitTransaction(this.#e.connection.connection),this.#t.isCommitted=!0,this.#e.connection.release()})}rollback(){return Le(this.#t),new ve(async()=>{await this.#e.driver.rollbackTransaction(this.#e.connection.connection),this.#t.isRolledBack=!0,this.#e.connection.release()})}savepoint(e){return Le(this.#t),new ve(async()=>(await this.#e.driver.savepoint?.(this.#e.connection.connection,e,this.#r),new r({...this.#e})))}rollbackToSavepoint(e){return Le(this.#t),new ve(async()=>(await this.#e.driver.rollbackToSavepoint?.(this.#e.connection.connection,e,this.#r),new r({...this.#e})))}releaseSavepoint(e){return Le(this.#t),new ve(async()=>(await this.#e.driver.releaseSavepoint?.(this.#e.connection.connection,e,this.#r),new r({...this.#e})))}withPlugin(e){return new r({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new r({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new r({...this.#e,executor:this.#e.executor.withPluginAtFront(new Y(e))})}withTables(){return new r({...this.#e})}},ve=class{#e;constructor(e){this.#e=e}async execute(){return await this.#e()}};function Le(r){if(r.isCommitted)throw new Error("Transaction is already committed");if(r.isRolledBack)throw new Error("Transaction is already rolled back")}var Io=class r{#e;#r;constructor(e,t){e instanceof r?this.#e=e.#e:this.#e=e,this.#r=t}get adapter(){return this.#e.adapter}get plugins(){return this.#e.plugins}transformQuery(e,t){return this.#e.transformQuery(e,t)}compileQuery(e,t){return this.#e.compileQuery(e,t)}provideConnection(e){return this.#e.provideConnection(e)}executeQuery(e,t){return Le(this.#r),this.#e.executeQuery(e,t)}stream(e,t,i){return Le(this.#r),this.#e.stream(e,t,i)}withConnectionProvider(e){return new r(this.#e.withConnectionProvider(e),this.#r)}withPlugin(e){return new r(this.#e.withPlugin(e),this.#r)}withPlugins(e){return new r(this.#e.withPlugins(e),this.#r)}withPluginAtFront(e){return new r(this.#e.withPluginAtFront(e),this.#r)}withoutPlugins(){return new r(this.#e.withoutPlugins(),this.#r)}};n();var Lt=class{async init(){}async acquireConnection(){return new Bo}async beginTransaction(){}async commitTransaction(){}async rollbackTransaction(){}async releaseConnection(){}async destroy(){}async releaseSavepoint(){}async rollbackToSavepoint(){}async savepoint(){}},Bo=class{async executeQuery(){return{rows:[]}}async*streamQuery(){}};function xb(r){return new yr({dialect:{createAdapter:()=>new r.Adapter,createDriver:()=>new Lt,createIntrospector:()=>null,createQueryCompiler:()=>new r.QueryCompiler},plugins:[...r.noParameters?[new Do]:[]]})}var Do=class{#e=new Qo;transformQuery(e){return this.#e.transformNode(e.node)}transformResult(e){return Promise.resolve(e.result)}},Qo=class extends Ee{transformPrimitiveValueList(e){return ue.create(e.values.map(k.createImmediate))}transformValue(e){return{...super.transformValue(e),immediate:!0}}};function Ob(r){let e=r.compile();return{parameters:e.parameters,sql:e.sql}}function Wb(r,e){let t=ci(r,e);return i=>i.where(a=>a.or(t.map(d=>a.and(d.map(([m,A])=>a(m,A===null?"is":"=",A))))))}function di(r,e){return Object.entries(Object.values(e).reduce((t,i)=>{let{isInPrimaryKey:a,name:d}=i;return a&&(t[d]=r[d]??null),t},{}))}function ci(r,e){return r.map(t=>di(t,e))}export{g as a,Fe as b,Ir as c,Br as d,mi as e,Dr as f,o as g,c as h,z as i,v as j,C as k,_ as l,L as m,Ve as n,re as o,k as p,x as q,ke as r,b as s,G as t,u,O as v,Ze as w,Nn as x,p as y,We as z,xb as A,Ob as B,Wb as C,di as D};
10
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vZGF0YS9xdWVyeS50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2t5c2VseS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9zY2hlbWEuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hbHRlci10YWJsZS1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9vYmplY3QtdXRpbHMuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jcmVhdGUtaW5kZXgtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1zY2hlbWEtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS10YWJsZS1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3Atc2NoZW1hLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kcm9wLXRhYmxlLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvdGFibGUtcGFyc2VyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3RhYmxlLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvZXhwcmVzc2lvbi1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9leHByZXNzaW9uL2V4cHJlc3Npb24uanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3QtbW9kaWZpZXItbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9qb2luLXBhcnNlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29uLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29yLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9iaW5hcnktb3BlcmF0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcGVyYXRvci1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3JlZmVyZW5jZS1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LWFsbC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL29yZGVyLWJ5LXBhcnNlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2R5bmFtaWMvZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29yZGVyLWJ5LWl0ZW0tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vcmRlci1ieS1pdGVtLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jb2xsYXRlLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2xvZy1vbmNlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvanNvbi1yZWZlcmVuY2Utbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2pzb24tb3BlcmF0b3ItY2hhaW4tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3ByaW1pdGl2ZS12YWx1ZS1saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcGFyZW5zLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvcGFyc2UtdXRpbHMuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vdmVyLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcmRlci1ieS1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcGFydGl0aW9uLWJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Zyb20tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2dyb3VwLWJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9oYXZpbmctbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9pbnNlcnQtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3VwZGF0ZS1xdWVyeS1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvbGlzdC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZGVsZXRlLXF1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS91c2luZy1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvd2hlcmUtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3JldHVybmluZy1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZXhwbGFpbi1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvbWVyZ2UtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3doZW4tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL291dHB1dC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9qb2luLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL292ZXItYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9wYXJ0aXRpb24tYnktcGFyc2VyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcGFydGl0aW9uLWJ5LWl0ZW0tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWNyZWF0b3IuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2luc2VydC1xdWVyeS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3Rpb24tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9pbnNlcnQtdmFsdWVzLXBhcnNlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3ZhbHVlcy1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZGVmYXVsdC1pbnNlcnQtdmFsdWUtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci91cGRhdGUtc2V0LXBhcnNlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbHVtbi11cGRhdGUtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29uLWR1cGxpY2F0ZS1rZXktbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvaW5zZXJ0LXJlc3VsdC5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvbm8tcmVzdWx0LWVycm9yLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vbi1jb25mbGljdC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb24tY29uZmxpY3Qtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci90b3AtcGFyc2VyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdG9wLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vci1hY3Rpb24tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvZGVsZXRlLXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2RlbGV0ZS1yZXN1bHQuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9saW1pdC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci91cGRhdGUtcXVlcnktYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvdXBkYXRlLXJlc3VsdC5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci93aXRoLXBhcnNlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5hbWUtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvY3RlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvd2l0aC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9xdWVyeS1pZC5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3V0aWwvcmFuZG9tLXN0cmluZy5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wbHVnaW4vd2l0aC1zY2hlbWEvd2l0aC1zY2hlbWEtdHJhbnNmb3JtZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS10cmFuc2Zvcm1lci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvbWVyZ2UtcXVlcnktYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9tZXJnZS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9tYXRjaGVkLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktZXhlY3V0b3IvcXVlcnktZXhlY3V0b3ItYmFzZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3V0aWwvcHJvdmlkZS1jb250cm9sbGVkLWNvbm5lY3Rpb24uanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2RlZmVycmVkLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9tZXJnZS1yZXN1bHQuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vZmZzZXQtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9ncm91cC1ieS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9ncm91cC1ieS1pdGVtLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvc2V0LW9wZXJhdGlvbi1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZXQtb3BlcmF0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9leHByZXNzaW9uL2V4cHJlc3Npb24td3JhcHBlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9mZXRjaC1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9mZXRjaC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZ2dyZWdhdGUtZnVuY3Rpb24tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Z1bmN0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1idWlsZGVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3VuYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS91bmFyeS1vcGVyYXRpb24tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvY2FzZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9qc29uLXBhdGgtYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1sZWctbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3R1cGxlLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2RhdGEtdHlwZS1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY2FzdC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZHluYW1pYy9keW5hbWljLXRhYmxlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FkZC1jb2x1bW4tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kcm9wLWNvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVuYW1lLWNvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NvbHVtbi1kZWZpbml0aW9uLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jaGVjay1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yZWZlcmVuY2VzLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvZGVmYXVsdC12YWx1ZS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9nZW5lcmF0ZWQtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2RlZmF1bHQtdmFsdWUtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9vbi1tb2RpZnktYWN0aW9uLXBhcnNlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21vZGlmeS1jb2x1bW4tbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2FsdGVyLWNvbHVtbi1idWlsZGVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWx0ZXItY29sdW1uLW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtZXhlY3V0b3IuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYWRkLWZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9hbHRlci10YWJsZS1kcm9wLWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2FsdGVyLXRhYmxlLWFkZC1pbmRleC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NoZWNrLWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3JlbmFtZS1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY3JlYXRlLWluZGV4LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS10cmFuc2Zvcm1lci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9jcmVhdGUtc2NoZW1hLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY3JlYXRlLXRhYmxlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvb24tY29tbWl0LWFjdGlvbi1wYXJzZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9kcm9wLWluZGV4LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvZHJvcC1zY2hlbWEtYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9kcm9wLXRhYmxlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY3JlYXRlLXZpZXctYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvZHJvcC12aWV3LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kcm9wLXZpZXctbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9jcmVhdGUtdHlwZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9kcm9wLXR5cGUtYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtdHlwZS1ub2RlLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2lkZW50aWZpZXItcGFyc2VyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctYnVpbGRlci5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctbm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2R5bmFtaWMvZHluYW1pYy5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RyaXZlci9kZWZhdWx0LWNvbm5lY3Rpb24tcHJvdmlkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1leGVjdXRvci9kZWZhdWx0LXF1ZXJ5LWV4ZWN1dG9yLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZHJpdmVyL3J1bnRpbWUtZHJpdmVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9wZXJmb3JtYW5jZS1ub3cuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvc2luZ2xlLWNvbm5lY3Rpb24tcHJvdmlkZXIuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvZHJpdmVyLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9sb2cuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2NvbXBpbGFibGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvZHVtbXktZHJpdmVyLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1xuICB0eXBlIENvbXBpbGFibGUsXG4gIHR5cGUgRGlhbGVjdEFkYXB0ZXIsXG4gIER1bW15RHJpdmVyLFxuICBLeXNlbHksXG4gIHR5cGUgS3lzZWx5UGx1Z2luLFxuICBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIsXG4gIHR5cGUgUGx1Z2luVHJhbnNmb3JtUXVlcnlBcmdzLFxuICB0eXBlIFBsdWdpblRyYW5zZm9ybVJlc3VsdEFyZ3MsXG4gIHR5cGUgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSxcbiAgdHlwZSBRdWVyeUNvbXBpbGVyLFxuICB0eXBlIFF1ZXJ5UmVzdWx0IGFzIEt5c2VseVF1ZXJ5UmVzdWx0LFxuICB0eXBlIFJvb3RPcGVyYXRpb25Ob2RlLFxuICB0eXBlIFVua25vd25Sb3csXG4gIFZhbHVlTGlzdE5vZGUsXG4gIFZhbHVlTm9kZSxcbiAgdHlwZSBXaGVyZUludGVyZmFjZSxcbn0gZnJvbSBcImt5c2VseVwiO1xuXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJSZXF1aXJlbWVudHMge1xuICBBZGFwdGVyOiB7IG5ldyAoKTogRGlhbGVjdEFkYXB0ZXIgfTtcbiAgbm9QYXJhbWV0ZXJzPzogYm9vbGVhbjtcbiAgUXVlcnlDb21waWxlcjogeyBuZXcgKCk6IFF1ZXJ5Q29tcGlsZXIgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkZXI8REI+KHJlcXVpcmVtZW50czogQnVpbGRlclJlcXVpcmVtZW50cyk6IEt5c2VseTxEQj4ge1xuICByZXR1cm4gbmV3IEt5c2VseSh7XG4gICAgZGlhbGVjdDoge1xuICAgICAgY3JlYXRlQWRhcHRlcjogKCkgPT4gbmV3IHJlcXVpcmVtZW50cy5BZGFwdGVyKCksXG4gICAgICBjcmVhdGVEcml2ZXI6ICgpID0+IG5ldyBEdW1teURyaXZlcigpLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHdlIGRvbid0IG5lZWQgYnVpbHQtaW4gaW50cm9zcGVjdGlvbiBpbiB0aGlzIGNhc2VcbiAgICAgIGNyZWF0ZUludHJvc3BlY3RvcjogKCkgPT4gbnVsbCxcbiAgICAgIGNyZWF0ZVF1ZXJ5Q29tcGlsZXI6ICgpID0+IG5ldyByZXF1aXJlbWVudHMuUXVlcnlDb21waWxlcigpLFxuICAgIH0sXG4gICAgcGx1Z2luczogWy4uLihyZXF1aXJlbWVudHMubm9QYXJhbWV0ZXJzID8gW25ldyBJbW1lZGlhdGVWYWx1ZVBsdWdpbigpXSA6IFtdKV0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIHRoYXQgdHJhbnNmb3JtcyBhbGwgdmFsdWVzIHRvIGltbWVkaWF0ZSB2YWx1ZXMuIFRoaXMgbWVhbnMgdGhlaXIgaW5qZWN0ZWQgaW50byB0aGUgU1FMIHN0cmluZyBpbnN0ZWFkIG9mIHBvcHVsYXRpbmcgdGhlIHBhcmFtZXRlcnMgYXJyYXkuXG4gKiBJbiBzb21lIHNpdHVhdGlvbnMsIGEgZGF0YWJhc2UgZHJpdmVyIG1pZ2h0IG5vdCBzdXBwb3J0IHBhcmFtZXRlcnMsIGFuZCB0aGlzIHBsdWdpbiBjYW4gYmUgdXNlZCB0byB3b3JrIGFyb3VuZCB0aGF0LlxuICovXG5jbGFzcyBJbW1lZGlhdGVWYWx1ZVBsdWdpbiBpbXBsZW1lbnRzIEt5c2VseVBsdWdpbiB7XG4gIHJlYWRvbmx5ICN0cmFuc2Zvcm1lciA9IG5ldyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyKCk7XG5cbiAgdHJhbnNmb3JtUXVlcnkoYXJnczogUGx1Z2luVHJhbnNmb3JtUXVlcnlBcmdzKTogUm9vdE9wZXJhdGlvbk5vZGUge1xuICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKGFyZ3Mubm9kZSk7XG4gIH1cblxuICB0cmFuc2Zvcm1SZXN1bHQoYXJnczogUGx1Z2luVHJhbnNmb3JtUmVzdWx0QXJncyk6IFByb21pc2U8S3lzZWx5UXVlcnlSZXN1bHQ8VW5rbm93blJvdz4+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFyZ3MucmVzdWx0KTtcbiAgfVxufVxuXG5jbGFzcyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyIGV4dGVuZHMgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHRyYW5zZm9ybVByaW1pdGl2ZVZhbHVlTGlzdChub2RlOiBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlKTogUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSB7XG4gICAgcmV0dXJuIFZhbHVlTGlzdE5vZGUuY3JlYXRlKG5vZGUudmFsdWVzLm1hcChWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKSkgYXMgbmV2ZXI7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1WYWx1ZShub2RlOiBWYWx1ZU5vZGUpOiBWYWx1ZU5vZGUge1xuICAgIHJldHVybiB7IC4uLnN1cGVyLnRyYW5zZm9ybVZhbHVlKG5vZGUpLCBpbW1lZGlhdGU6IHRydWUgfTtcbiAgfVxufVxuXG5kZWNsYXJlIGNvbnN0IHF1ZXJ5VHlwZTogdW5pcXVlIHN5bWJvbDtcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnk8VCA9IHVua25vd24+IHtcbiAgW3F1ZXJ5VHlwZV0/OiBUO1xuICBwYXJhbWV0ZXJzOiByZWFkb25seSB1bmtub3duW107XG4gIHNxbDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNRdWVyeTxUPihxdWVyeTogc3RyaW5nIHwgUXVlcnk8dW5rbm93bj4pOiBRdWVyeTxUPiB7XG4gIGlmICh0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4geyBwYXJhbWV0ZXJzOiBbXSwgc3FsOiBxdWVyeSB9IGFzIG5ldmVyO1xuICB9XG5cbiAgcmV0dXJuIHF1ZXJ5IGFzIG5ldmVyO1xufVxuXG5leHBvcnQgdHlwZSBRdWVyeVJlc3VsdDxUPiA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIFQgZXh0ZW5kcyBRdWVyeTxpbmZlciBSPiA/IFJbXSA6IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IFF1ZXJ5PGluZmVyIFI+ID8gUltdIDogbmV2ZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlPFQ+KGNvbXBpbGVhYmxlOiBDb21waWxhYmxlPFQ+KTogUXVlcnk8VD4ge1xuICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gY29tcGlsZWFibGUuY29tcGlsZSgpO1xuXG4gIHJldHVybiB7XG4gICAgcGFyYW1ldGVyczogY29tcGlsZWRRdWVyeS5wYXJhbWV0ZXJzLFxuICAgIHNxbDogY29tcGlsZWRRdWVyeS5zcWwsXG4gIH07XG59XG5cbi8qKlxuICogQXBwbGllcyBhIGZpbHRlciB0byB0aGUgZ2l2ZW4gcm93cyBiYXNlZCBvbiB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBvZiB0aGUgdGFibGUuXG4gKlxuICogQGV4YW1wbGUgZGIuc2VsZWN0RnJvbShcInVzZXJzXCIpLiRjYWxsKGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKHJvd3MsIGNvbHVtbnMpKS5zZWxlY3RBbGwoKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMocm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSwgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdKSB7XG4gIGNvbnN0IHJvd0ZpbHRlcnMgPSBpbmZlclJvd0ZpbHRlcnMocm93cywgY29sdW1ucyk7XG5cbiAgcmV0dXJuIDxRQiBleHRlbmRzIFdoZXJlSW50ZXJmYWNlPGFueSwgYW55Pj4ocWI6IFFCKTogUUIgPT5cbiAgICBxYi53aGVyZSgoZWIpID0+IHtcbiAgICAgIHJldHVybiBlYi5vcihcbiAgICAgICAgcm93RmlsdGVycy5tYXAoKHJvd0ZpbHRlcikgPT4ge1xuICAgICAgICAgIHJldHVybiBlYi5hbmQocm93RmlsdGVyLm1hcCgoW2NvbHVtbk5hbWUsIHZhbHVlXSkgPT4gZWIoY29sdW1uTmFtZSwgdmFsdWUgPT09IG51bGwgPyBcImlzXCIgOiBcIj1cIiwgdmFsdWUpKSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KSBhcyBuZXZlcjtcbn1cblxuLyoqXG4gKiBQYXJ0IG9mIGEgZmlsdGVyIHRoYXQgcHJlZGljdHMgYSBtYXRjaC5cbiAqIGllLiAuLi4gV0hFUkUgJENvbHVtTmFtZSA9ICRWYWx1ZSAuLi5cbiAqL1xudHlwZSBSb3dGaWx0ZXJQcmVkaWNhdGUgPSBbQ29sdW1uTmFtZTogc3RyaW5nLCBWYWx1ZTogdW5rbm93bl07XG5cbi8qKlxuICogQSByb3cgZmlsdGVyIGlzIGNvbXByaXNlZCBvZiBvbmUgb3IgbW9yZSBwcmVkaWNhdGVzLlxuICovXG50eXBlIFJvd0ZpbHRlciA9IFJvd0ZpbHRlclByZWRpY2F0ZVtdO1xuXG4vKipcbiAqIFJvdyBmaWx0ZXJzIGlzIHNpbXBseSBhIHNldCBvZiBtdWx0aXBsZSB7QGxpbmsgUm93RmlsdGVyfS5cbiAqL1xudHlwZSBSb3dGaWx0ZXJzID0gUm93RmlsdGVyW107XG5cbi8qKlxuICogSW5mZXJzIHRoZSBmaWx0ZXIgdGhhdCBpcyBuZWNlc3NhcnkgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBnaXZlbiByb3dcbiAqIGluZGl2aWR1YWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyUm93RmlsdGVyKHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGNvbHVtbnM6IFRhYmxlW1wiY29sdW1uc1wiXSk6IFJvd0ZpbHRlciB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhcbiAgICBPYmplY3QudmFsdWVzKGNvbHVtbnMpLnJlZHVjZShcbiAgICAgIChwaywgY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaXNJblByaW1hcnlLZXksIG5hbWU6IGNvbHVtbk5hbWUgfSA9IGNvbHVtbjtcblxuICAgICAgICBpZiAoIWlzSW5QcmltYXJ5S2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHBrO1xuICAgICAgICB9XG5cbiAgICAgICAgcGtbY29sdW1uTmFtZV0gPSByb3dbY29sdW1uTmFtZV0gPz8gbnVsbDtcbiAgICAgICAgcmV0dXJuIHBrO1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICksXG4gICk7XG59XG5cbi8qKlxuICogSW5mZXJzIHRoZSBmaWx0ZXIgdGhhdCBpcyBuZWNlc3NhcnkgdG8gdW5pcXVlbHkgaWRlbnRpZnkgbXVsdGlwbGUgcm93c1xuICogaW5kaXZpZHVhbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJSb3dGaWx0ZXJzKHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sIGNvbHVtbnM6IFRhYmxlW1wiY29sdW1uc1wiXSk6IFJvd0ZpbHRlcnMge1xuICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gaW5mZXJSb3dGaWx0ZXIocm93LCBjb2x1bW5zKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2t5c2VseS5kLnRzXCIgLz5cbmltcG9ydCB7IFNjaGVtYU1vZHVsZSB9IGZyb20gJy4vc2NoZW1hL3NjaGVtYS5qcyc7XG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlIH0gZnJvbSAnLi9keW5hbWljL2R5bmFtaWMuanMnO1xuaW1wb3J0IHsgRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciB9IGZyb20gJy4vZHJpdmVyL2RlZmF1bHQtY29ubmVjdGlvbi1wcm92aWRlci5qcyc7XG5pbXBvcnQgeyBRdWVyeUNyZWF0b3IgfSBmcm9tICcuL3F1ZXJ5LWNyZWF0b3IuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IgfSBmcm9tICcuL3F1ZXJ5LWV4ZWN1dG9yL2RlZmF1bHQtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBpc09iamVjdCwgaXNVbmRlZmluZWQgfSBmcm9tICcuL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJ1bnRpbWVEcml2ZXIgfSBmcm9tICcuL2RyaXZlci9ydW50aW1lLWRyaXZlci5qcyc7XG5pbXBvcnQgeyBTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIgfSBmcm9tICcuL2RyaXZlci9zaW5nbGUtY29ubmVjdGlvbi1wcm92aWRlci5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3MsIH0gZnJvbSAnLi9kcml2ZXIvZHJpdmVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUZ1bmN0aW9uTW9kdWxlLCB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMnO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi91dGlsL2xvZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IGlzQ29tcGlsYWJsZSB9IGZyb20gJy4vdXRpbC9jb21waWxhYmxlLmpzJztcbmltcG9ydCB7IENhc2VCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL2Nhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDYXNlTm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiB9IGZyb20gJy4vcGFyc2VyL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IFdpdGhTY2hlbWFQbHVnaW4gfSBmcm9tICcuL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uLCB9IGZyb20gJy4vdXRpbC9wcm92aWRlLWNvbnRyb2xsZWQtY29ubmVjdGlvbi5qcyc7XG4vLyBAdHMtaWdub3JlXG5TeW1ib2wuYXN5bmNEaXNwb3NlID8/PSBTeW1ib2woJ1N5bWJvbC5hc3luY0Rpc3Bvc2UnKTtcbi8qKlxuICogVGhlIG1haW4gS3lzZWx5IGNsYXNzLlxuICpcbiAqIFlvdSBzaG91bGQgY3JlYXRlIG9uZSBpbnN0YW5jZSBvZiBgS3lzZWx5YCBwZXIgZGF0YWJhc2UgdXNpbmcgdGhlIHtAbGluayBLeXNlbHl9XG4gKiBjb25zdHJ1Y3Rvci4gRWFjaCBgS3lzZWx5YCBpbnN0YW5jZSBtYWludGFpbnMgaXRzIG93biBjb25uZWN0aW9uIHBvb2wuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogVGhpcyBleGFtcGxlIGFzc3VtZXMgeW91ciBkYXRhYmFzZSBoYXMgYSBcInBlcnNvblwiIHRhYmxlOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgKiBhcyBTcWxpdGUgZnJvbSAnYmV0dGVyLXNxbGl0ZTMnXG4gKiBpbXBvcnQge1x1MDBBMHR5cGUgR2VuZXJhdGVkLCBLeXNlbHksIFNxbGl0ZURpYWxlY3QgfSBmcm9tICdreXNlbHknXG4gKlxuICogaW50ZXJmYWNlIERhdGFiYXNlIHtcbiAqICAgcGVyc29uOiB7XG4gKiAgICAgaWQ6IEdlbmVyYXRlZDxudW1iZXI+XG4gKiAgICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gKiAgICAgbGFzdF9uYW1lOiBzdHJpbmcgfCBudWxsXG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBkYiA9IG5ldyBLeXNlbHk8RGF0YWJhc2U+KHtcbiAqICAgZGlhbGVjdDogbmV3IFNxbGl0ZURpYWxlY3Qoe1xuICogICAgIGRhdGFiYXNlOiBuZXcgU3FsaXRlKCc6bWVtb3J5OicpLFxuICogICB9KVxuICogfSlcbiAqIGBgYFxuICpcbiAqIEB0eXBlUGFyYW0gREIgLSBUaGUgZGF0YWJhc2UgaW50ZXJmYWNlIHR5cGUuIEtleXMgb2YgdGhpcyB0eXBlIG11c3QgYmUgdGFibGUgbmFtZXNcbiAqICAgIGluIHRoZSBkYXRhYmFzZSBhbmQgdmFsdWVzIG11c3QgYmUgaW50ZXJmYWNlcyB0aGF0IGRlc2NyaWJlIHRoZSByb3dzIGluIHRob3NlXG4gKiAgICB0YWJsZXMuIFNlZSB0aGUgZXhhbXBsZXMgYWJvdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBLeXNlbHkgZXh0ZW5kcyBRdWVyeUNyZWF0b3Ige1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIGxldCBzdXBlclByb3BzO1xuICAgICAgICBsZXQgcHJvcHM7XG4gICAgICAgIGlmIChpc0t5c2VseVByb3BzKGFyZ3MpKSB7XG4gICAgICAgICAgICBzdXBlclByb3BzID0geyBleGVjdXRvcjogYXJncy5leGVjdXRvciB9O1xuICAgICAgICAgICAgcHJvcHMgPSB7IC4uLmFyZ3MgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxlY3QgPSBhcmdzLmRpYWxlY3Q7XG4gICAgICAgICAgICBjb25zdCBkcml2ZXIgPSBkaWFsZWN0LmNyZWF0ZURyaXZlcigpO1xuICAgICAgICAgICAgY29uc3QgY29tcGlsZXIgPSBkaWFsZWN0LmNyZWF0ZVF1ZXJ5Q29tcGlsZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZXIgPSBkaWFsZWN0LmNyZWF0ZUFkYXB0ZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGxvZyA9IG5ldyBMb2coYXJncy5sb2cgPz8gW10pO1xuICAgICAgICAgICAgY29uc3QgcnVudGltZURyaXZlciA9IG5ldyBSdW50aW1lRHJpdmVyKGRyaXZlciwgbG9nKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb25Qcm92aWRlciA9IG5ldyBEZWZhdWx0Q29ubmVjdGlvblByb3ZpZGVyKHJ1bnRpbWVEcml2ZXIpO1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IoY29tcGlsZXIsIGFkYXB0ZXIsIGNvbm5lY3Rpb25Qcm92aWRlciwgYXJncy5wbHVnaW5zID8/IFtdKTtcbiAgICAgICAgICAgIHN1cGVyUHJvcHMgPSB7IGV4ZWN1dG9yIH07XG4gICAgICAgICAgICBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBjb25maWc6IGFyZ3MsXG4gICAgICAgICAgICAgICAgZXhlY3V0b3IsXG4gICAgICAgICAgICAgICAgZGlhbGVjdCxcbiAgICAgICAgICAgICAgICBkcml2ZXI6IHJ1bnRpbWVEcml2ZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHN1cGVyUHJvcHMpO1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBTY2hlbWFNb2R1bGV9IG1vZHVsZSBmb3IgYnVpbGRpbmcgZGF0YWJhc2Ugc2NoZW1hLlxuICAgICAqL1xuICAgIGdldCBzY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI3Byb3BzLmV4ZWN1dG9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHRoZSB7QGxpbmsgRHluYW1pY01vZHVsZX0gbW9kdWxlLlxuICAgICAqXG4gICAgICogVGhlIHtAbGluayBEeW5hbWljTW9kdWxlfSBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gYnlwYXNzIHN0cmljdCB0eXBpbmcgYW5kXG4gICAgICogcGFzc2luZyBpbiBkeW5hbWljIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZXMuXG4gICAgICovXG4gICAgZ2V0IGR5bmFtaWMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHluYW1pY01vZHVsZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIERhdGFiYXNlSW50cm9zcGVjdG9yIHwgZGF0YWJhc2UgaW50cm9zcGVjdG9yfS5cbiAgICAgKi9cbiAgICBnZXQgaW50cm9zcGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmRpYWxlY3QuY3JlYXRlSW50cm9zcGVjdG9yKHRoaXMud2l0aG91dFBsdWdpbnMoKSk7XG4gICAgfVxuICAgIGNhc2UodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXNlQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jcmVhdGUoaXNVbmRlZmluZWQodmFsdWUpID8gdW5kZWZpbmVkIDogcGFyc2VFeHByZXNzaW9uKHZhbHVlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEZ1bmN0aW9uTW9kdWxlfSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHNvbWV3aGF0IHR5cGUtc2FmZSBmdW5jdGlvblxuICAgICAqIGNhbGxzLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB7IGNvdW50IH0gPSBkYi5mblxuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5pbm5lckpvaW4oJ3BldCcsICdwZXQub3duZXJfaWQnLCAncGVyc29uLmlkJylcbiAgICAgKiAgIC5zZWxlY3QoW1xuICAgICAqICAgICAnaWQnLFxuICAgICAqICAgICBjb3VudCgncGV0LmlkJykuYXMoJ3BlcnNvbl9jb3VudCcpLFxuICAgICAqICAgXSlcbiAgICAgKiAgIC5ncm91cEJ5KCdwZXJzb24uaWQnKVxuICAgICAqICAgLmhhdmluZyhjb3VudCgncGV0LmlkJyksICc+JywgMTApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwZXJzb25cIi5cImlkXCIsIGNvdW50KFwicGV0XCIuXCJpZFwiKSBhcyBcInBlcnNvbl9jb3VudFwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogaW5uZXIgam9pbiBcInBldFwiIG9uIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCJcbiAgICAgKiBncm91cCBieSBcInBlcnNvblwiLlwiaWRcIlxuICAgICAqIGhhdmluZyBjb3VudChcInBldFwiLlwiaWRcIikgPiAkMVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogV2h5IFwic29tZXdoYXRcIiB0eXBlLXNhZmU/IEJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbGxzIGFyZSBub3QgYm91bmQgdG8gdGhlXG4gICAgICogY3VycmVudCBxdWVyeSBjb250ZXh0LiBUaGV5IGFsbG93IHlvdSB0byByZWZlcmVuY2UgY29sdW1ucyBhbmQgdGFibGVzIHRoYXRcbiAgICAgKiBhcmUgbm90IGluIHRoZSBjdXJyZW50IHF1ZXJ5LiBFLmcuIHJlbW92ZSB0aGUgYGlubmVySm9pbmAgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAgKiBxdWVyeSBhbmQgVHlwZVNjcmlwdCB3b24ndCBldmVuIGNvbXBsYWluLlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gbWFrZSB0aGUgZnVuY3Rpb24gY2FsbHMgZnVsbHkgdHlwZS1zYWZlLCB5b3UgY2FuIHVzZSB0aGVcbiAgICAgKiB7QGxpbmsgRXhwcmVzc2lvbkJ1aWxkZXIuZm59IGdldHRlciBmb3IgYSBxdWVyeSBjb250ZXh0LWF3YXJlLCBzdHJpY3RlciB7QGxpbmsgRnVuY3Rpb25Nb2R1bGV9LlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLmlubmVySm9pbigncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAgICAgKiAgICAgJ3BlcnNvbi5pZCcsXG4gICAgICogICAgIGViLmZuLmNvdW50KCdwZXQuaWQnKS5hcygncGV0X2NvdW50JylcbiAgICAgKiAgIF0pXG4gICAgICogICAuZ3JvdXBCeSgncGVyc29uLmlkJylcbiAgICAgKiAgIC5oYXZpbmcoKGViKSA9PiBlYi5mbi5jb3VudCgncGV0LmlkJyksICc+JywgMTApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGZuKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb25Nb2R1bGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBUcmFuc2FjdGlvbkJ1aWxkZXJ9IHRoYXQgY2FuIGJlIHVzZWQgdG8gcnVuIHF1ZXJpZXMgaW5zaWRlIGEgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlcn0gY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc2FjdGlvbi4gVGhlXG4gICAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlfSBtZXRob2QgY2FuIHRoZW4gYmUgY2FsbGVkIHRvIHJ1biB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlfSB0YWtlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIGluc2lkZSB0aGVcbiAgICAgKiB0cmFuc2FjdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24sXG4gICAgICogMS4gdGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQsXG4gICAgICogMi4gdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrLCBhbmRcbiAgICAgKiAzLiB0aGUgZXhjZXB0aW9uIGlzIHRocm93biBhZ2Fpbi5cbiAgICAgKiBPdGhlcndpc2UgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIHtAbGluayBUcmFuc2FjdGlvbkJ1aWxkZXIuZXhlY3V0ZSB8IGV4ZWN1dGV9XG4gICAgICogbWV0aG9kIGdldHMgdGhlIHRyYW5zYWN0aW9uIG9iamVjdCBhcyBpdHMgb25seSBhcmd1bWVudC4gVGhlIHRyYW5zYWN0aW9uIGlzXG4gICAgICogb2YgdHlwZSB7QGxpbmsgVHJhbnNhY3Rpb259IHdoaWNoIGluaGVyaXRzIHtAbGluayBLeXNlbHl9LiBBbnkgcXVlcnlcbiAgICAgKiBzdGFydGVkIHRocm91Z2ggdGhlIHRyYW5zYWN0aW9uIG9iamVjdCBpcyBleGVjdXRlZCBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogVG8gcnVuIGEgY29udHJvbGxlZCB0cmFuc2FjdGlvbiwgYWxsb3dpbmcgeW91IHRvIGNvbW1pdCBhbmQgcm9sbGJhY2sgbWFudWFsbHksXG4gICAgICogdXNlIHtAbGluayBzdGFydFRyYW5zYWN0aW9ufSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwidHJhbnNhY3Rpb25zXCIsIFwiU2ltcGxlIHRyYW5zYWN0aW9uXCIsIDEwKSAtLT5cbiAgICAgKlxuICAgICAqIFRoaXMgZXhhbXBsZSBpbnNlcnRzIHR3byByb3dzIGluIGEgdHJhbnNhY3Rpb24uIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zaWRlXG4gICAgICogdGhlIGNhbGxiYWNrIHBhc3NlZCB0byB0aGUgYGV4ZWN1dGVgIG1ldGhvZCxcbiAgICAgKiAxLiB0aGUgZXhjZXB0aW9uIGlzIGNhdWdodCxcbiAgICAgKiAyLiB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2ssIGFuZFxuICAgICAqIDMuIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGFnYWluLlxuICAgICAqIE90aGVyd2lzZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBjYXR0byA9IGF3YWl0IGRiLnRyYW5zYWN0aW9uKCkuZXhlY3V0ZShhc3luYyAodHJ4KSA9PiB7XG4gICAgICogICBjb25zdCBqZW5uaWZlciA9IGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICAgIGFnZTogNDAsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBvd25lcl9pZDogamVubmlmZXIuaWQsXG4gICAgICogICAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgICBpc19mYXZvcml0ZTogZmFsc2UsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNldHRpbmcgdGhlIGlzb2xhdGlvbiBsZXZlbDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLnRyYW5zYWN0aW9uKClcbiAgICAgKiAgIC5zZXRJc29sYXRpb25MZXZlbCgnc2VyaWFsaXphYmxlJylcbiAgICAgKiAgIC5leGVjdXRlKGFzeW5jICh0cngpID0+IHtcbiAgICAgKiAgICAgYXdhaXQgZG9TdHVmZih0cngpXG4gICAgICogICB9KVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9TdHVmZihreXNlbHk6IHR5cGVvZiBkYikge1xuICAgICAqICAgLy8gLi4uXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXJ9IHRoYXQgY2FuIGJlIHVzZWQgdG8gcnVuIHF1ZXJpZXMgaW5zaWRlIGEgY29udHJvbGxlZCB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcn0gY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBUaGUge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIuZXhlY3V0ZX0gbWV0aG9kIGNhbiB0aGVuIGJlIGNhbGxlZFxuICAgICAqIHRvIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBhbmQgcmV0dXJuIGEge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbn0uXG4gICAgICpcbiAgICAgKiBBIHtAbGluayBDb250cm9sbGVkVHJhbnNhY3Rpb259IGFsbG93cyB5b3UgdG8gY29tbWl0IGFuZCByb2xsYmFjayBtYW51YWxseSxcbiAgICAgKiBleGVjdXRlIHNhdmVwb2ludCBjb21tYW5kcy4gSXQgZXh0ZW5kcyB7QGxpbmsgVHJhbnNhY3Rpb259IHdoaWNoIGV4dGVuZHMge0BsaW5rIEt5c2VseX0sXG4gICAgICogc28geW91IGNhbiBydW4gcXVlcmllcyBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uLiBPbmNlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQsXG4gICAgICogb3Igcm9sbGVkIGJhY2ssIGl0IGNhbid0IGJlIHVzZWQgYW55bW9yZSAtIGFsbCBxdWVyaWVzIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICogVGhpcyBpcyB0byBwcmV2ZW50IGFjY2lkZW50YWxseSBydW5uaW5nIHF1ZXJpZXMgb3V0c2lkZSB0aGUgdHJhbnNhY3Rpb24gLSB3aGVyZVxuICAgICAqIGF0b21pY2l0eSBpcyBub3QgZ3VhcmFudGVlZCBhbnltb3JlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwidHJhbnNhY3Rpb25zXCIsIFwiQ29udHJvbGxlZCB0cmFuc2FjdGlvblwiLCAxMSkgLS0+XG4gICAgICpcbiAgICAgKiBBIGNvbnRyb2xsZWQgdHJhbnNhY3Rpb24gYWxsb3dzIHlvdSB0byBjb21taXQgYW5kIHJvbGxiYWNrIG1hbnVhbGx5LCBleGVjdXRlXG4gICAgICogc2F2ZXBvaW50IGNvbW1hbmRzLCBhbmQgcXVlcmllcyBpbiBnZW5lcmFsLlxuICAgICAqXG4gICAgICogSW4gdGhpcyBleGFtcGxlIHdlIHN0YXJ0IGEgdHJhbnNhY3Rpb24sIHVzZSBpdCB0byBpbnNlcnQgdHdvIHJvd3MgYW5kIHRoZW4gY29tbWl0XG4gICAgICogdGhlIHRyYW5zYWN0aW9uLiBJZiBhbiBlcnJvciBpcyB0aHJvd24sIHdlIGNhdGNoIGl0IGFuZCByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBjb25zdCBqZW5uaWZlciA9IGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICAgIGFnZTogNDAsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgY29uc3QgY2F0dG8gPSBhd2FpdCB0cnguaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgb3duZXJfaWQ6IGplbm5pZmVyLmlkLFxuICAgICAqICAgICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgICAgaXNfZmF2b3JpdGU6IGZhbHNlLFxuICAgICAqICAgICB9KVxuICAgICAqICAgICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4LmNvbW1pdCgpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcInRyYW5zYWN0aW9uc1wiLCBcIkNvbnRyb2xsZWQgdHJhbnNhY3Rpb24gL3cgc2F2ZXBvaW50c1wiLCAxMikgLS0+XG4gICAgICpcbiAgICAgKiBBIGNvbnRyb2xsZWQgdHJhbnNhY3Rpb24gYWxsb3dzIHlvdSB0byBjb21taXQgYW5kIHJvbGxiYWNrIG1hbnVhbGx5LCBleGVjdXRlXG4gICAgICogc2F2ZXBvaW50IGNvbW1hbmRzLCBhbmQgcXVlcmllcyBpbiBnZW5lcmFsLlxuICAgICAqXG4gICAgICogSW4gdGhpcyBleGFtcGxlIHdlIHN0YXJ0IGEgdHJhbnNhY3Rpb24sIGluc2VydCBhIHBlcnNvbiwgY3JlYXRlIGEgc2F2ZXBvaW50LFxuICAgICAqIHRyeSBpbnNlcnRpbmcgYSB0b3kgYW5kIGEgcGV0LCBhbmQgaWYgYW4gZXJyb3IgaXMgdGhyb3duLCB3ZSByb2xsYmFjayB0byB0aGVcbiAgICAgKiBzYXZlcG9pbnQuIEV2ZW50dWFsbHkgd2UgcmVsZWFzZSB0aGUgc2F2ZXBvaW50LCBpbnNlcnQgYW4gYXVkaXQgcmVjb3JkIGFuZFxuICAgICAqIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24uIElmIGFuIGVycm9yIGlzIHRocm93biwgd2UgY2F0Y2ggaXQgYW5kIHJvbGxiYWNrIHRoZVxuICAgICAqIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB0cnggPSBhd2FpdCBkYi5zdGFydFRyYW5zYWN0aW9uKCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgY29uc3QgamVubmlmZXIgPSBhd2FpdCB0cnhcbiAgICAgKiAgICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgICAgYWdlOiA0MCxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICBjb25zdCB0cnhBZnRlckplbm5pZmVyID0gYXdhaXQgdHJ4LnNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqICAgdHJ5IHtcbiAgICAgKiAgICAgY29uc3QgY2F0dG8gPSBhd2FpdCB0cnhBZnRlckplbm5pZmVyXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgICBvd25lcl9pZDogamVubmlmZXIuaWQsXG4gICAgICogICAgICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgICAgfSlcbiAgICAgKiAgICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgICBhd2FpdCB0cnhBZnRlckplbm5pZmVyXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3RveScpXG4gICAgICogICAgICAgLnZhbHVlcyh7IG5hbWU6ICdCb25lJywgcHJpY2U6IDEuOTksIHBldF9pZDogY2F0dG8uaWQgfSlcbiAgICAgKiAgICAgICAuZXhlY3V0ZSgpXG4gICAgICogICB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgICBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucmVsZWFzZVNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4Lmluc2VydEludG8oJ2F1ZGl0JykudmFsdWVzKHsgYWN0aW9uOiAnYWRkZWQgSmVubmlmZXInIH0pLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICBhd2FpdCB0cnguY29tbWl0KCkuZXhlY3V0ZSgpXG4gICAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgKiAgIGF3YWl0IHRyeC5yb2xsYmFjaygpLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGFydFRyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIoeyAuLi50aGlzLiNwcm9wcyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSBreXNlbHkgaW5zdGFuY2UgYm91bmQgdG8gYSBzaW5nbGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmNvbm5lY3Rpb24oKVxuICAgICAqICAgLmV4ZWN1dGUoYXN5bmMgKGRiKSA9PiB7XG4gICAgICogICAgIC8vIGBkYmAgaXMgYW4gaW5zdGFuY2Ugb2YgYEt5c2VseWAgdGhhdCdzIGJvdW5kIHRvIGEgc2luZ2xlXG4gICAgICogICAgIC8vIGRhdGFiYXNlIGNvbm5lY3Rpb24uIEFsbCBxdWVyaWVzIGV4ZWN1dGVkIHRocm91Z2ggYGRiYCB1c2VcbiAgICAgKiAgICAgLy8gdGhlIHNhbWUgY29ubmVjdGlvbi5cbiAgICAgKiAgICAgYXdhaXQgZG9TdHVmZihkYilcbiAgICAgKiAgIH0pXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1N0dWZmKGt5c2VseTogdHlwZW9mIGRiKSB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uQnVpbGRlcih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIEt5c2VseSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaW5zdGFsbGVkLlxuICAgICAqL1xuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgS3lzZWx5IGluc3RhbmNlIHdpdGhvdXQgYW55IHBsdWdpbnMuXG4gICAgICovXG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IEt5c2VseSh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgS3lzZWx5IGluc3RhbmNlIHdpdGggdGFibGVzIGFkZGVkIHRvIGl0c1xuICAgICAqIGRhdGFiYXNlIHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IG1vZGlmaWVzIHRoZSB0eXBlcyBhbmQgZG9lc24ndCBhZmZlY3QgYW55IG9mIHRoZVxuICAgICAqIGV4ZWN1dGVkIHF1ZXJpZXMgaW4gYW55IHdheS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGFkZHMgYW5kIHVzZXMgYSB0ZW1wb3JhcnkgdGFibGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCd0ZW1wX3RhYmxlJylcbiAgICAgKiAgIC50ZW1wb3JhcnkoKVxuICAgICAqICAgLmFkZENvbHVtbignc29tZV9jb2x1bW4nLCAnaW50ZWdlcicpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCB0ZW1wRGIgPSBkYi53aXRoVGFibGVzPHtcbiAgICAgKiAgIHRlbXBfdGFibGU6IHtcbiAgICAgKiAgICAgc29tZV9jb2x1bW46IG51bWJlclxuICAgICAqICAgfVxuICAgICAqIH0+KClcbiAgICAgKlxuICAgICAqIGF3YWl0IHRlbXBEYlxuICAgICAqICAgLmluc2VydEludG8oJ3RlbXBfdGFibGUnKVxuICAgICAqICAgLnZhbHVlcyh7IHNvbWVfY29sdW1uOiAxMDAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aXRoVGFibGVzKCkge1xuICAgICAgICByZXR1cm4gbmV3IEt5c2VseSh7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBhbGwgcmVzb3VyY2VzIGFuZCBkaXNjb25uZWN0cyBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgKlxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBhcmUgZG9uZSB1c2luZyB0aGUgYEt5c2VseWAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYEt5c2VseWAgaW5zdGFuY2UgaXMgYSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyB1c2UgYGRiIGluc3RhbmNlb2YgVHJhbnNhY3Rpb25gLlxuICAgICAqL1xuICAgIGdldCBpc1RyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RXhlY3V0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBnaXZlbiBjb21waWxlZCBxdWVyeSBvciBxdWVyeSBidWlsZGVyLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20va3lzZWx5LW9yZy9reXNlbHkvYmxvYi9tYXN0ZXIvc2l0ZS9kb2NzL3JlY2lwZXMvMDAwNC1zcGxpdHRpbmctcXVlcnktYnVpbGRpbmctYW5kLWV4ZWN1dGlvbi5tZCNleGVjdXRlLWNvbXBpbGVkLXF1ZXJpZXMgc3BsaXR0aW5nIGJ1aWxkLCBjb21waWxlIGFuZCBleGVjdXRlIGNvZGUgcmVjaXBlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBleGVjdXRlUXVlcnkocXVlcnksIHF1ZXJ5SWQgPSBjcmVhdGVRdWVyeUlkKCkpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IGlzQ29tcGlsYWJsZShxdWVyeSkgPyBxdWVyeS5jb21waWxlKCkgOiBxdWVyeTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhlY3V0b3IoKS5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgS3lzZWx5IHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLiNwcm9wcyA9IHByb3BzO1xuICAgIH1cbiAgICAvLyBUaGUgcmV0dXJuIHR5cGUgaXMgYHRydWVgIGluc3RlYWQgb2YgYGJvb2xlYW5gIHRvIG1ha2UgS3lzZWx5PERCPlxuICAgIC8vIHVuYXNzaWduYWJsZSB0byBUcmFuc2FjdGlvbjxEQj4gd2hpbGUgYWxsb3dpbmcgYXNzaWdubWVudCB0aGVcbiAgICAvLyBvdGhlciB3YXkgYXJvdW5kLlxuICAgIGdldCBpc1RyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0aGUgdHJhbnNhY3Rpb24gbWV0aG9kIGZvciBhIFRyYW5zYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gICAgY29ubmVjdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRoZSBjb25uZWN0aW9uIG1ldGhvZCBmb3IgYSBUcmFuc2FjdGlvbiBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0aGUgZGVzdHJveSBtZXRob2QgZm9yIGEgVHJhbnNhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aFRhYmxlcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0t5c2VseVByb3BzKG9iaikge1xuICAgIHJldHVybiAoaXNPYmplY3Qob2JqKSAmJlxuICAgICAgICBpc09iamVjdChvYmouY29uZmlnKSAmJlxuICAgICAgICBpc09iamVjdChvYmouZHJpdmVyKSAmJlxuICAgICAgICBpc09iamVjdChvYmouZXhlY3V0b3IpICYmXG4gICAgICAgIGlzT2JqZWN0KG9iai5kaWFsZWN0KSk7XG59XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnByb3ZpZGVDb25uZWN0aW9uKGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRvciA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIobmV3IFNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uKSk7XG4gICAgICAgICAgICBjb25zdCBkYiA9IG5ldyBLeXNlbHkoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soZGIpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBzZXRBY2Nlc3NNb2RlKGFjY2Vzc01vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhY2Nlc3NNb2RlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0SXNvbGF0aW9uTGV2ZWwoaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBpc29sYXRpb25MZXZlbCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgeyBpc29sYXRpb25MZXZlbCwgYWNjZXNzTW9kZSwgLi4ua3lzZWx5UHJvcHMgfSA9IHRoaXMuI3Byb3BzO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHsgaXNvbGF0aW9uTGV2ZWwsIGFjY2Vzc01vZGUgfTtcbiAgICAgICAgdmFsaWRhdGVUcmFuc2FjdGlvblNldHRpbmdzKHNldHRpbmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnByb3ZpZGVDb25uZWN0aW9uKGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRvciA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIobmV3IFNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uKSk7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAgICAgLi4ua3lzZWx5UHJvcHMsXG4gICAgICAgICAgICAgICAgZXhlY3V0b3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLmJlZ2luVHJhbnNhY3Rpb24oY29ubmVjdGlvbiwgc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbGxiYWNrKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuY29tbWl0VHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5yb2xsYmFja1RyYW5zYWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgc2V0QWNjZXNzTW9kZShhY2Nlc3NNb2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFjY2Vzc01vZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRJc29sYXRpb25MZXZlbChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBpc29sYXRpb25MZXZlbCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IHsgaXNvbGF0aW9uTGV2ZWwsIGFjY2Vzc01vZGUsIC4uLnByb3BzIH0gPSB0aGlzLiNwcm9wcztcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7IGlzb2xhdGlvbkxldmVsLCBhY2Nlc3NNb2RlIH07XG4gICAgICAgIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24odGhpcy4jcHJvcHMuZXhlY3V0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuYmVnaW5UcmFuc2FjdGlvbihjb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNldHRpbmdzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIobmV3IFNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uLmNvbm5lY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbnRyb2xsZWRUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uIHtcbiAgICAjcHJvcHM7XG4gICAgI2NvbXBpbGVRdWVyeTtcbiAgICAjc3RhdGU7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7IGlzQ29tbWl0dGVkOiBmYWxzZSwgaXNSb2xsZWRCYWNrOiBmYWxzZSB9O1xuICAgICAgICBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcihwcm9wcy5leGVjdXRvciwgc3RhdGUpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGNvbm5lY3Rpb24sIC4uLnRyYW5zYWN0aW9uUHJvcHMgfSA9IHByb3BzO1xuICAgICAgICBzdXBlcih0cmFuc2FjdGlvblByb3BzKTtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgICAgICB0aGlzLiNzdGF0ZSA9IHN0YXRlO1xuICAgICAgICBjb25zdCBxdWVyeUlkID0gY3JlYXRlUXVlcnlJZCgpO1xuICAgICAgICB0aGlzLiNjb21waWxlUXVlcnkgPSAobm9kZSkgPT4gcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICBnZXQgaXNDb21taXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0ZS5pc0NvbW1pdHRlZDtcbiAgICB9XG4gICAgZ2V0IGlzUm9sbGVkQmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlLmlzUm9sbGVkQmFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIHJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cngpXG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeC5jb21taXQoKS5leGVjdXRlKClcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9Tb21ldGhpbmcoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbW1pdCgpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5jb21taXRUcmFuc2FjdGlvbih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUuaXNDb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy4jcHJvcHMuY29ubmVjdGlvbi5yZWxlYXNlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgY29tbWl0fSBhbmQge0BsaW5rIHJvbGxiYWNrVG9TYXZlcG9pbnR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGRvU29tZXRoaW5nKHRyeClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4LmNvbW1pdCgpLmV4ZWN1dGUoKVxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cngucm9sbGJhY2soKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcm9sbGJhY2soKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWFuZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIucm9sbGJhY2tUcmFuc2FjdGlvbih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUuaXNSb2xsZWRCYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24ucmVsZWFzZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNhdmVwb2ludCB3aXRoIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgcm9sbGJhY2tUb1NhdmVwb2ludH0gYW5kIHtAbGluayByZWxlYXNlU2F2ZXBvaW50fS5cbiAgICAgKlxuICAgICAqIEZvciBhIHR5cGUtc2FmZSBleHBlcmllbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgZnJvbSBub3cgb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG4gICAgICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnggPSBhd2FpdCBkYi5zdGFydFRyYW5zYWN0aW9uKCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBhd2FpdCBpbnNlcnRKZW5uaWZlcih0cngpXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnhBZnRlckplbm5pZmVyID0gYXdhaXQgdHJ4LnNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cnhBZnRlckplbm5pZmVyKVxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0SmVubmlmZXIoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU29tZXRoaW5nKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzYXZlcG9pbnQoc2F2ZXBvaW50TmFtZSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnNhdmVwb2ludD8uKHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24uY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgdGhpcy4jY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRvIGEgc2F2ZXBvaW50IHdpdGggYSBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBzYXZlcG9pbnR9IGFuZCB7QGxpbmsgcmVsZWFzZVNhdmVwb2ludH0uXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCB1c2UgdGhlIHNhbWUgaW5zdGFuY2UgcmV0dXJuZWQgYnkge0BsaW5rIHNhdmVwb2ludH0sIG9yXG4gICAgICogZXNjYXBlIHRoZSB0eXBlLWNoZWNrIGJ5IHVzaW5nIGBhcyBhbnlgLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogYXdhaXQgaW5zZXJ0SmVubmlmZXIodHJ4KVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4QWZ0ZXJKZW5uaWZlciA9IGF3YWl0IHRyeC5zYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgYXdhaXQgZG9Tb21ldGhpbmcodHJ4QWZ0ZXJKZW5uaWZlcilcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4QWZ0ZXJKZW5uaWZlci5yb2xsYmFja1RvU2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydEplbm5pZmVyKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcm9sbGJhY2tUb1NhdmVwb2ludChzYXZlcG9pbnROYW1lKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWFuZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIucm9sbGJhY2tUb1NhdmVwb2ludD8uKHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24uY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgdGhpcy4jY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBhIHNhdmVwb2ludCB3aXRoIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgc2F2ZXBvaW50fSBhbmQge0BsaW5rIHJvbGxiYWNrVG9TYXZlcG9pbnR9LlxuICAgICAqXG4gICAgICogWW91IG11c3QgdXNlIHRoZSBzYW1lIGluc3RhbmNlIHJldHVybmVkIGJ5IHtAbGluayBzYXZlcG9pbnR9LCBvclxuICAgICAqIGVzY2FwZSB0aGUgdHlwZS1jaGVjayBieSB1c2luZyBgYXMgYW55YC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGF3YWl0IGluc2VydEplbm5pZmVyKHRyeClcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeEFmdGVySmVubmlmZXIgPSBhd2FpdCB0cnguc2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGRvU29tZXRoaW5nKHRyeEFmdGVySmVubmlmZXIpXG4gICAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgKiAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucm9sbGJhY2tUb1NhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJlbGVhc2VTYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBhd2FpdCBkb1NvbWV0aGluZ0Vsc2UodHJ4KVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0SmVubmlmZXIoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU29tZXRoaW5nKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZ0Vsc2Uoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlbGVhc2VTYXZlcG9pbnQoc2F2ZXBvaW50TmFtZSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnJlbGVhc2VTYXZlcG9pbnQ/Lih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIHRoaXMuI2NvbXBpbGVRdWVyeSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhUYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbW1hbmQge1xuICAgICNjYjtcbiAgICBjb25zdHJ1Y3RvcihjYikge1xuICAgICAgICB0aGlzLiNjYiA9IGNiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY29tbWFuZC5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jY2IoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2soc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuaXNDb21taXR0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBpcyBhbHJlYWR5IGNvbW1pdHRlZCcpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuaXNSb2xsZWRCYWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaXMgYWxyZWFkeSByb2xsZWQgYmFjaycpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXhlY3V0b3Igd3JhcHBlciB0aGF0IGFzc2VydHMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc3RhdGUgaXMgbm90IGNvbW1pdHRlZFxuICogb3Igcm9sbGVkIGJhY2sgd2hlbiBhIHF1ZXJ5IGlzIGV4ZWN1dGVkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvciB7XG4gICAgI2V4ZWN1dG9yO1xuICAgICNzdGF0ZTtcbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvciwgc3RhdGUpIHtcbiAgICAgICAgaWYgKGV4ZWN1dG9yIGluc3RhbmNlb2YgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuI2V4ZWN1dG9yID0gZXhlY3V0b3IuI2V4ZWN1dG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzdGF0ZSA9IHN0YXRlO1xuICAgIH1cbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLmFkYXB0ZXI7XG4gICAgfVxuICAgIGdldCBwbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IucGx1Z2lucztcbiAgICB9XG4gICAgdHJhbnNmb3JtUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5jb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5wcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcik7XG4gICAgfVxuICAgIGV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5LCBxdWVyeUlkKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICB3aXRoQ29ubmVjdGlvblByb3ZpZGVyKGNvbm5lY3Rpb25Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvblByb3ZpZGVyKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IodGhpcy4jZXhlY3V0b3Iud2l0aFBsdWdpbnMocGx1Z2lucyksIHRoaXMuI3N0YXRlKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IodGhpcy4jZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcih0aGlzLiNleGVjdXRvci53aXRob3V0UGx1Z2lucygpLCB0aGlzLiNzdGF0ZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zY2hlbWEuZC50c1wiIC8+XG5pbXBvcnQgeyBBbHRlclRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLWluZGV4LW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlU2NoZW1hTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IERyb3BTY2hlbWFOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZUluZGV4QnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLWluZGV4LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQ3JlYXRlU2NoZW1hQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXNjaGVtYS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXRhYmxlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRHJvcEluZGV4QnVpbGRlciB9IGZyb20gJy4vZHJvcC1pbmRleC1idWlsZGVyLmpzJztcbmltcG9ydCB7IERyb3BTY2hlbWFCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXNjaGVtYS1idWlsZGVyLmpzJztcbmltcG9ydCB7IERyb3BUYWJsZUJ1aWxkZXIgfSBmcm9tICcuL2Ryb3AtdGFibGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBXaXRoU2NoZW1hUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3QnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXZpZXctYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcFZpZXdCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXZpZXctYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXZpZXctbm9kZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUeXBlQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXR5cGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wVHlwZUJ1aWxkZXIgfSBmcm9tICcuL2Ryb3AtdHlwZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZVR5cGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wVHlwZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIgfSBmcm9tICcuLi9wYXJzZXIvaWRlbnRpZmllci1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIH0gZnJvbSAnLi9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1ub2RlLmpzJztcbi8qKlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgYnVpbGRpbmcgZGF0YWJhc2Ugc2NoZW1hLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hTW9kdWxlIHtcbiAgICAjZXhlY3V0b3I7XG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHRhYmxlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIG5ldyB0YWJsZSB3aXRoIGNvbHVtbnMgYGlkYCwgYGZpcnN0X25hbWVgLFxuICAgICAqIGBsYXN0X25hbWVgIGFuZCBgZ2VuZGVyYDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkuYXV0b0luY3JlbWVudCgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcicsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignZ2VuZGVyJywgJ3ZhcmNoYXInKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSB0YWJsZSB3aXRoIGEgZm9yZWlnbiBrZXkuIE5vdCBhbGwgZGF0YWJhc2VcbiAgICAgKiBlbmdpbmVzIHN1cHBvcnQgY29sdW1uLWxldmVsIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbnMuXG4gICAgICogRm9yIGV4YW1wbGUgaWYgeW91IGFyZSB1c2luZyBNeVNRTCA1Llggc2VlIHRoZSBuZXh0IGV4YW1wbGUgYWZ0ZXJcbiAgICAgKiB0aGlzIG9uZS5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkuYXV0b0luY3JlbWVudCgpKVxuICAgICAqICAgLmFkZENvbHVtbignb3duZXJfaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2xcbiAgICAgKiAgICAgLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpXG4gICAgICogICAgIC5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIGV4YW1wbGUgYWRkcyBhIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZm9yIGEgY29sdW1ucyBqdXN0XG4gICAgICogbGlrZSB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IHVzaW5nIGEgdGFibGUtbGV2ZWwgc3RhdGVtZW50LlxuICAgICAqIE9uIE15U1FMIDUuWCB5b3UgbmVlZCB0byBkZWZpbmUgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgbGlrZVxuICAgICAqIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpLmF1dG9JbmNyZW1lbnQoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ293bmVyX2lkJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50KFxuICAgICAqICAgICAncGV0X293bmVyX2lkX2ZvcmVpZ24nLCBbJ293bmVyX2lkJ10sICdwZXJzb24nLCBbJ2lkJ10sXG4gICAgICogICAgIChjb25zdHJhaW50KSA9PiBjb25zdHJhaW50Lm9uRGVsZXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVUYWJsZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wVGFibGVOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaW5kZXguXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlSW5kZXgoJ3BlcnNvbl9mdWxsX25hbWVfdW5pcXVlX2luZGV4JylcbiAgICAgKiAgIC5vbigncGVyc29uJylcbiAgICAgKiAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVJbmRleChpbmRleE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcCBhbiBpbmRleC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wSW5kZXgoJ3BlcnNvbl9mdWxsX25hbWVfdW5pcXVlX2luZGV4JylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkcm9wSW5kZXgoaW5kZXhOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHNjaGVtYS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVTY2hlbWEoJ3NvbWVfc2NoZW1hJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVTY2hlbWFOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcCBhIHNjaGVtYS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wU2NoZW1hKCdzb21lX3NjaGVtYScpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wU2NoZW1hTm9kZS5jcmVhdGUoc2NoZW1hKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsdGVyIGEgdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hbHRlckNvbHVtbignZmlyc3RfbmFtZScsIChhYykgPT4gYWMuc2V0RGF0YVR5cGUoJ3RleHQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhbHRlclRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB2aWV3LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVZpZXcoJ2RvZ3MnKVxuICAgICAqICAgLm9yUmVwbGFjZSgpXG4gICAgICogICAuYXMoZGIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0QWxsKCkud2hlcmUoJ3NwZWNpZXMnLCAnPScsICdkb2cnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVWaWV3KHZpZXdOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY3JlYXRlKHZpZXdOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggYSBtYXRlcmlhbGl6ZWQgdmlldy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5yZWZyZXNoTWF0ZXJpYWxpemVkVmlldygnbXlfdmlldycpXG4gICAgICogICAuY29uY3VycmVudGx5KClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWZyZXNoTWF0ZXJpYWxpemVkVmlldyh2aWV3TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUuY3JlYXRlKHZpZXdOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB2aWV3LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmRyb3BWaWV3KCdkb2dzJylcbiAgICAgKiAgIC5pZkV4aXN0cygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFZpZXcodmlld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNyZWF0ZSh2aWV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgdHlwZS5cbiAgICAgKlxuICAgICAqIE9ubHkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgaGF2ZSB1c2VyLWRlZmluZWQgdHlwZXMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVHlwZSgnc3BlY2llcycpXG4gICAgICogICAuYXNFbnVtKFsnZG9nJywgJ2NhdCcsICdmcm9nJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY3JlYXRlVHlwZSh0eXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVR5cGVOb2RlLmNyZWF0ZShwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIodHlwZU5hbWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB0eXBlLlxuICAgICAqXG4gICAgICogT25seSBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBoYXZlIHVzZXItZGVmaW5lZCB0eXBlcy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wVHlwZSgnc3BlY2llcycpXG4gICAgICogICAuaWZFeGlzdHMoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BUeXBlKHR5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IERyb3BUeXBlTm9kZS5jcmVhdGUocGFyc2VTY2hlbWFibGVJZGVudGlmaWVyKHR5cGVOYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHNjaGVtYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFNjaGVtYU1vZHVsZSh0aGlzLiNleGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHNjaGVtYSBtb2R1bGUgIHdpdGhvdXQgYW55IHBsdWdpbnMuXG4gICAgICovXG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI2V4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIFF1ZXJ5Q3JlYXRvci53aXRoU2NoZW1hfVxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLXRhYmxlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQWx0ZXJUYWJsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FsdGVyVGFibGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbHRlclRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUYWJsZVByb3BzKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aENvbHVtbkFsdGVyYXRpb24obm9kZSwgY29sdW1uQWx0ZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBjb2x1bW5BbHRlcmF0aW9uczogbm9kZS5jb2x1bW5BbHRlcmF0aW9uc1xuICAgICAgICAgICAgICAgID8gWy4uLm5vZGUuY29sdW1uQWx0ZXJhdGlvbnMsIGNvbHVtbkFsdGVyYXRpb25dXG4gICAgICAgICAgICAgICAgOiBbY29sdW1uQWx0ZXJhdGlvbl0sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb2JqZWN0LXV0aWxzLmQudHNcIiAvPlxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSB8fCBpc1N0cmluZyhvYmopIHx8IGlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iai5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9iaikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgfHwgb2JqID09PSB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4ob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdib29sZWFuJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bGwob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUob2JqKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIERhdGU7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaWdJbnQob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdiaWdpbnQnO1xufVxuLy8gRG9uJ3QgY2hhbmdlIHRoZSByZXR1cm5kIHR5cGUgdG8gYG9iaiBpcyBCdWZmZXJgIHRvIG5vdCBjcmVhdGUgYVxuLy8gaGFyZCBkZXBlbmRlbmN5IHRvIG5vZGUuXG5leHBvcnQgZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIEJ1ZmZlci5pc0J1ZmZlcihvYmopO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5QnVmZmVyT3JWaWV3KG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICAgIGlmICghaXNPYmplY3Qob2JqKSB8fCBnZXRUYWcob2JqKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBwcm90byA9IG9iajtcbiAgICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSAhPT0gbnVsbCkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gcHJvdG87XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdChhcnIpIHtcbiAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmcmVlemUob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUob2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5KGFyZykge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoYXJnKSkge1xuICAgICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFthcmddO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBhc1JlYWRvbmx5QXJyYXkoYXJnKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheShhcmcpKSB7XG4gICAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZnJlZXplKFthcmddKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNSZWFkb25seUFycmF5KGFyZykge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9vcChvYmopIHtcbiAgICByZXR1cm4gb2JqO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmUob2JqMSwgb2JqMikge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkob2JqMSkgJiYgaXNSZWFkb25seUFycmF5KG9iajIpKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlQXJyYXlzKG9iajEsIG9iajIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdChvYmoxKSAmJiBpc09iamVjdChvYmoyKSkge1xuICAgICAgICByZXR1cm4gY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMik7XG4gICAgfVxuICAgIHJldHVybiBvYmoxID09PSBvYmoyO1xufVxuZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnIxLCBhcnIyKSB7XG4gICAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyMS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoIWNvbXBhcmUoYXJyMVtpXSwgYXJyMltpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBpZiAoaXNCdWZmZXIob2JqMSkgJiYgaXNCdWZmZXIob2JqMikpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVCdWZmZXJzKG9iajEsIG9iajIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0RhdGUob2JqMSkgJiYgaXNEYXRlKG9iajIpKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlRGF0ZXMob2JqMSwgb2JqMik7XG4gICAgfVxuICAgIHJldHVybiBjb21wYXJlR2VuZXJpY09iamVjdHMob2JqMSwgb2JqMik7XG59XG5mdW5jdGlvbiBjb21wYXJlQnVmZmVycyhidWYxLCBidWYyKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGJ1ZjEsIGJ1ZjIpID09PSAwO1xufVxuZnVuY3Rpb24gY29tcGFyZURhdGVzKGRhdGUxLCBkYXRlMikge1xuICAgIHJldHVybiBkYXRlMS5nZXRUaW1lKCkgPT09IGRhdGUyLmdldFRpbWUoKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVHZW5lcmljT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgY29uc3Qga2V5czEgPSBPYmplY3Qua2V5cyhvYmoxKTtcbiAgICBjb25zdCBrZXlzMiA9IE9iamVjdC5rZXlzKG9iajIpO1xuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMxKSB7XG4gICAgICAgIGlmICghY29tcGFyZShvYmoxW2tleV0sIG9iajJba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmZ1bmN0aW9uIGdldFRhZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJ1tvYmplY3QgVW5kZWZpbmVkXScgOiAnW29iamVjdCBOdWxsXSc7XG4gICAgfVxuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLWluZGV4LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVJbmRleE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NyZWF0ZUluZGV4Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW5zKG5vZGUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgY29sdW1uczogWy4uLihub2RlLmNvbHVtbnMgfHwgW10pLCAuLi5jb2x1bW5zXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pZGVudGlmaWVyLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSWRlbnRpZmllck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0lkZW50aWZpZXJOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0lkZW50aWZpZXJOb2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXNjaGVtYS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ3JlYXRlU2NoZW1hTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlU2NoZW1hTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2NoZW1hLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlU2NoZW1hTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVTY2hlbWEsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVNjaGVtYSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtdGFibGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjb25zdCBPTl9DT01NSVRfQUNUSU9OUyA9IFsncHJlc2VydmUgcm93cycsICdkZWxldGUgcm93cycsICdkcm9wJ107XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ3JlYXRlVGFibGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDcmVhdGVUYWJsZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShbXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoQ29sdW1uKGNyZWF0ZVRhYmxlLCBjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUYWJsZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShbLi4uY3JlYXRlVGFibGUuY29sdW1ucywgY29sdW1uXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoQ29uc3RyYWludChjcmVhdGVUYWJsZSwgY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVRhYmxlLFxuICAgICAgICAgICAgY29uc3RyYWludHM6IGNyZWF0ZVRhYmxlLmNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLmNyZWF0ZVRhYmxlLmNvbnN0cmFpbnRzLCBjb25zdHJhaW50XSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShbY29uc3RyYWludF0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb250TW9kaWZpZXIoY3JlYXRlVGFibGUsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVGFibGUsXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogY3JlYXRlVGFibGUuZnJvbnRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uY3JlYXRlVGFibGUuZnJvbnRNb2RpZmllcnMsIG1vZGlmaWVyXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShbbW9kaWZpZXJdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFbmRNb2RpZmllcihjcmVhdGVUYWJsZSwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUYWJsZSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogY3JlYXRlVGFibGUuZW5kTW9kaWZpZXJzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLmNyZWF0ZVRhYmxlLmVuZE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFttb2RpZmllcl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVUYWJsZSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVGFibGUsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1pbmRleC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BJbmRleE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BJbmRleE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoZHJvcEluZGV4LCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRyb3BJbmRleCxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2NoZW1hYmxlSWRlbnRpZmllck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2NoZW1hYmxlSWRlbnRpZmllck5vZGUnLFxuICAgICAgICAgICAgaWRlbnRpZmllcjogSWRlbnRpZmllck5vZGUuY3JlYXRlKGlkZW50aWZpZXIpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhTY2hlbWEoc2NoZW1hLCBpZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NjaGVtYWJsZUlkZW50aWZpZXJOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKHNjaGVtYSksXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoaWRlbnRpZmllciksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1zY2hlbWEtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BTY2hlbWFOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wU2NoZW1hTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2NoZW1hLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFNjaGVtYU5vZGUnLFxuICAgICAgICAgICAgc2NoZW1hOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoc2NoZW1hKSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoZHJvcFNjaGVtYSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZHJvcFNjaGVtYSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXRhYmxlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFRhYmxlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRHJvcFRhYmxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGUsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wSW5kZXgsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRyb3BJbmRleCxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi90YWJsZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBpc1JlYWRvbmx5QXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS90YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlQWxpYXNlZEV4cHJlc3Npb24sIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0FsaWFzZWREeW5hbWljVGFibGVCdWlsZGVyLCB9IGZyb20gJy4uL2R5bmFtaWMvZHluYW1pYy10YWJsZS1idWlsZGVyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCh0YWJsZSkge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkodGFibGUpKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5tYXAoKGl0KSA9PiBwYXJzZVRhYmxlRXhwcmVzc2lvbihpdCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtwYXJzZVRhYmxlRXhwcmVzc2lvbih0YWJsZSldO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhYmxlRXhwcmVzc2lvbih0YWJsZSkge1xuICAgIGlmIChpc1N0cmluZyh0YWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlQWxpYXNlZFRhYmxlKHRhYmxlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlcih0YWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlQWxpYXNlZEV4cHJlc3Npb24odGFibGUpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFsaWFzZWRUYWJsZShmcm9tKSB7XG4gICAgY29uc3QgQUxJQVNfU0VQQVJBVE9SID0gJyBhcyAnO1xuICAgIGlmIChmcm9tLmluY2x1ZGVzKEFMSUFTX1NFUEFSQVRPUikpIHtcbiAgICAgICAgY29uc3QgW3RhYmxlLCBhbGlhc10gPSBmcm9tLnNwbGl0KEFMSUFTX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSwgSWRlbnRpZmllck5vZGUuY3JlYXRlKGFsaWFzKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VUYWJsZShmcm9tKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUYWJsZShmcm9tKSB7XG4gICAgY29uc3QgU0NIRU1BX1NFUEFSQVRPUiA9ICcuJztcbiAgICBpZiAoZnJvbS5pbmNsdWRlcyhTQ0hFTUFfU0VQQVJBVE9SKSkge1xuICAgICAgICBjb25zdCBbc2NoZW1hLCB0YWJsZV0gPSBmcm9tLnNwbGl0KFNDSEVNQV9TRVBBUkFUT1IpLm1hcCh0cmltKTtcbiAgICAgICAgcmV0dXJuIFRhYmxlTm9kZS5jcmVhdGVXaXRoU2NoZW1hKHNjaGVtYSwgdGFibGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFRhYmxlTm9kZS5jcmVhdGUoZnJvbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWxpYXMtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBbGlhc05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FsaWFzTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobm9kZSwgYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWxpYXNOb2RlJyxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi90YWJsZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFRhYmxlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVGFibGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZSh0YWJsZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1RhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIHRhYmxlKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHByZXNzaW9uLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzQWxpYXNlZEV4cHJlc3Npb24sIGlzRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UoZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKGV4cCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cChleHByZXNzaW9uQnVpbGRlcigpKS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGV4cHJlc3Npb246ICR7SlNPTi5zdHJpbmdpZnkoZXhwKX1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFsaWFzZWRFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UoZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKGV4cCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cChleHByZXNzaW9uQnVpbGRlcigpKS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGFsaWFzZWQgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShleHApfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbk9yRmFjdG9yeShvYmopIHtcbiAgICByZXR1cm4gaXNFeHByZXNzaW9uKG9iaikgfHwgaXNBbGlhc2VkRXhwcmVzc2lvbihvYmopIHx8IGlzRnVuY3Rpb24ob2JqKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZXhwcmVzc2lvbi5kLnRzXCIgLz5cbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihvYmopIHtcbiAgICByZXR1cm4gaXNPYmplY3Qob2JqKSAmJiAnZXhwcmVzc2lvblR5cGUnIGluIG9iaiAmJiBpc09wZXJhdGlvbk5vZGVTb3VyY2Uob2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FsaWFzZWRFeHByZXNzaW9uKG9iaikge1xuICAgIHJldHVybiAoaXNPYmplY3Qob2JqKSAmJlxuICAgICAgICAnZXhwcmVzc2lvbicgaW4gb2JqICYmXG4gICAgICAgIGlzU3RyaW5nKG9iai5hbGlhcykgJiZcbiAgICAgICAgaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaikpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcGVyYXRpb24tbm9kZS1zb3VyY2UuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc09wZXJhdGlvbk5vZGVTb3VyY2Uob2JqKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgaXNGdW5jdGlvbihvYmoudG9PcGVyYXRpb25Ob2RlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZXhwcmVzc2lvbi1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyLCB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QsIHBhcnNlVGFibGUsIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBXaXRoU2NoZW1hUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVGdW5jdGlvbk1vZHVsZSwgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2Z1bmN0aW9uLW1vZHVsZS5qcyc7XG5pbXBvcnQgeyBwYXJzZUpTT05SZWZlcmVuY2UsIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiwgcGFyc2VTdHJpbmdSZWZlcmVuY2UsIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VGaWx0ZXJMaXN0LCBwYXJzZUZpbHRlck9iamVjdCwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbiwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUGFyZW5zTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzJztcbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgT3BlcmF0b3JOb2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VVbmFyeU9wZXJhdGlvbiB9IGZyb20gJy4uL3BhcnNlci91bmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlLCBwYXJzZVZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IE5PT1BfUVVFUllfRVhFQ1VUT1IgfSBmcm9tICcuLi9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IENhc2VCdWlsZGVyIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9jYXNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQ2FzZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jYXNlLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNSZWFkb25seUFycmF5LCBpc1VuZGVmaW5lZCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEpTT05QYXRoQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvanNvbi1wYXRoLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQmluYXJ5T3BlcmF0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2JpbmFyeS1vcGVyYXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBBbmROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYW5kLW5vZGUuanMnO1xuaW1wb3J0IHsgVHVwbGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdHVwbGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBDYXN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Nhc3Qtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhwcmVzc2lvbkJ1aWxkZXIoZXhlY3V0b3IgPSBOT09QX1FVRVJZX0VYRUNVVE9SKSB7XG4gICAgZnVuY3Rpb24gYmluYXJ5KGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuYXJ5KG9wLCBleHByKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VVbmFyeU9wZXJhdGlvbihvcCwgZXhwcikpO1xuICAgIH1cbiAgICBjb25zdCBlYiA9IE9iamVjdC5hc3NpZ24oYmluYXJ5LCB7XG4gICAgICAgIGZuOiB1bmRlZmluZWQsXG4gICAgICAgIGViOiB1bmRlZmluZWQsXG4gICAgICAgIHNlbGVjdEZyb20odGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgICAgICBleGVjdXRvcixcbiAgICAgICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jcmVhdGVGcm9tKHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KHRhYmxlKSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FzZShyZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FzZUJ1aWxkZXIoe1xuICAgICAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNyZWF0ZShpc1VuZGVmaW5lZChyZWZlcmVuY2UpXG4gICAgICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIDogcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKHJlZmVyZW5jZSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZihyZWZlcmVuY2UsIG9wKSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQob3ApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVN0cmluZ1JlZmVyZW5jZShyZWZlcmVuY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTlBhdGhCdWlsZGVyKHBhcnNlSlNPTlJlZmVyZW5jZShyZWZlcmVuY2UsIG9wKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGpzb25QYXRoKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OUGF0aEJ1aWxkZXIoSlNPTlBhdGhOb2RlLmNyZWF0ZSgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGFibGUodGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VUYWJsZSh0YWJsZSkpO1xuICAgICAgICB9LFxuICAgICAgICB2YWwodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VWYWx1ZUV4cHJlc3Npb24odmFsdWUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmVHVwbGUoLi4udmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKFR1cGxlTm9kZS5jcmVhdGUodmFsdWVzLm1hcChwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24pKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHR1cGxlKC4uLnZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihUdXBsZU5vZGUuY3JlYXRlKHZhbHVlcy5tYXAocGFyc2VWYWx1ZUV4cHJlc3Npb24pKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxpdCh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICB9LFxuICAgICAgICB1bmFyeSxcbiAgICAgICAgbm90KGV4cHIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmFyeSgnbm90JywgZXhwcik7XG4gICAgICAgIH0sXG4gICAgICAgIGV4aXN0cyhleHByKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5hcnkoJ2V4aXN0cycsIGV4cHIpO1xuICAgICAgICB9LFxuICAgICAgICBuZWcoZXhwcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuYXJ5KCctJywgZXhwcik7XG4gICAgICAgIH0sXG4gICAgICAgIGJldHdlZW4oZXhwciwgc3RhcnQsIGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwciksIE9wZXJhdG9yTm9kZS5jcmVhdGUoJ2JldHdlZW4nKSwgQW5kTm9kZS5jcmVhdGUocGFyc2VWYWx1ZUV4cHJlc3Npb24oc3RhcnQpLCBwYXJzZVZhbHVlRXhwcmVzc2lvbihlbmQpKSkpO1xuICAgICAgICB9LFxuICAgICAgICBiZXR3ZWVuU3ltbWV0cmljKGV4cHIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQmluYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGV4cHIpLCBPcGVyYXRvck5vZGUuY3JlYXRlKCdiZXR3ZWVuIHN5bW1ldHJpYycpLCBBbmROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihzdGFydCksIHBhcnNlVmFsdWVFeHByZXNzaW9uKGVuZCkpKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFuZChleHBycykge1xuICAgICAgICAgICAgaWYgKGlzUmVhZG9ubHlBcnJheShleHBycykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlRmlsdGVyTGlzdChleHBycywgJ2FuZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VGaWx0ZXJPYmplY3QoZXhwcnMsICdhbmQnKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9yKGV4cHJzKSB7XG4gICAgICAgICAgICBpZiAoaXNSZWFkb25seUFycmF5KGV4cHJzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VGaWx0ZXJMaXN0KGV4cHJzLCAnb3InKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlRmlsdGVyT2JqZWN0KGV4cHJzLCAnb3InKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBhcmVucyguLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKTtcbiAgICAgICAgICAgIGlmIChQYXJlbnNOb2RlLmlzKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gZG91YmxlIHdyYXBwaW5nLlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKFBhcmVuc05vZGUuY3JlYXRlKG5vZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FzdChleHByLCBkYXRhVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihDYXN0Tm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGV4cHIpLCBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkpKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2l0aFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVFeHByZXNzaW9uQnVpbGRlcihleGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgZWIuZm4gPSBjcmVhdGVGdW5jdGlvbk1vZHVsZSgpO1xuICAgIGViLmViID0gZWI7XG4gICAgcmV0dXJuIGViO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cHJlc3Npb25CdWlsZGVyKF8pIHtcbiAgICByZXR1cm4gY3JlYXRlRXhwcmVzc2lvbkJ1aWxkZXIoKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdE1vZGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1tb2RpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlSm9pbiwgfSBmcm9tICcuLi9wYXJzZXIvam9pbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBcmcsIHBhcnNlU2VsZWN0QWxsLCB9IGZyb20gJy4uL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IExpbWl0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2xpbWl0LW5vZGUuanMnO1xuaW1wb3J0IHsgT2Zmc2V0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29mZnNldC1ub2RlLmpzJztcbmltcG9ydCB7IGFzQXJyYXksIGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlR3JvdXBCeSB9IGZyb20gJy4uL3BhcnNlci9ncm91cC1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IsIE5vUmVzdWx0RXJyb3IsIH0gZnJvbSAnLi9uby1yZXN1bHQtZXJyb3IuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VTZXRPcGVyYXRpb25zLCB9IGZyb20gJy4uL3BhcnNlci9zZXQtb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBFeHByZXNzaW9uV3JhcHBlciB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi13cmFwcGVyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VGZXRjaCB9IGZyb20gJy4uL3BhcnNlci9mZXRjaC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUb3AgfSBmcm9tICcuLi9wYXJzZXIvdG9wLXBhcnNlci5qcyc7XG5jbGFzcyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBpc1NlbGVjdFF1ZXJ5QnVpbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoV2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYXZpbmcoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhIYXZpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhdmluZ1JlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoSGF2aW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNlbGVjdChzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2VsZWN0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGlzdGluY3RPbihzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRGlzdGluY3RPbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUZyb250KG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aEZyb250TW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlV2l0aEV4cHJlc3Npb24obW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGVXaXRoRXhwcmVzc2lvbihtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGlzdGluY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aEZyb250TW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdEaXN0aW5jdCcpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvclVwZGF0ZShvZikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0ZvclVwZGF0ZScsIG9mID8gYXNBcnJheShvZikubWFwKHBhcnNlVGFibGUpIDogdW5kZWZpbmVkKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3JTaGFyZShvZikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0ZvclNoYXJlJywgb2YgPyBhc0FycmF5KG9mKS5tYXAocGFyc2VUYWJsZSkgOiB1bmRlZmluZWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvcktleVNoYXJlKG9mKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnRm9yS2V5U2hhcmUnLCBvZiA/IGFzQXJyYXkob2YpLm1hcChwYXJzZVRhYmxlKSA6IHVuZGVmaW5lZCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yTm9LZXlVcGRhdGUob2YpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdGb3JOb0tleVVwZGF0ZScsIG9mID8gYXNBcnJheShvZikubWFwKHBhcnNlVGFibGUpIDogdW5kZWZpbmVkKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBza2lwTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ1NraXBMb2NrZWQnKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub1dhaXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnTm9XYWl0JykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VsZWN0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNlbGVjdGlvbnModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5uZXJKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0lubmVySm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBsZWZ0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMZWZ0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICByaWdodEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignUmlnaHRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGZ1bGxKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0Z1bGxKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGNyb3NzSm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdDcm9zc0pvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgaW5uZXJKb2luTGF0ZXJhbCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMYXRlcmFsSW5uZXJKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGxlZnRKb2luTGF0ZXJhbCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMYXRlcmFsTGVmdEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgY3Jvc3NKb2luTGF0ZXJhbCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMYXRlcmFsQ3Jvc3NKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGNyb3NzQXBwbHkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignQ3Jvc3NBcHBseScsIGFyZ3MpO1xuICAgIH1cbiAgICBvdXRlckFwcGx5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ091dGVyQXBwbHknLCBhcmdzKTtcbiAgICB9XG4gICAgI2pvaW4oam9pblR5cGUsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoSm9pbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlSm9pbihqb2luVHlwZSwgYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBncm91cEJ5KGdyb3VwQnkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoR3JvdXBCeUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VHcm91cEJ5KGdyb3VwQnkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aExpbWl0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgTGltaXROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihsaW1pdCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9mZnNldChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoT2Zmc2V0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgT2Zmc2V0Tm9kZS5jcmVhdGUocGFyc2VWYWx1ZUV4cHJlc3Npb24ob2Zmc2V0KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZmV0Y2gocm93Q291bnQsIG1vZGlmaWVyID0gJ29ubHknKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aEZldGNoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VGZXRjaChyb3dDb3VudCwgbW9kaWZpZXIpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bmlvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNldE9wZXJhdGlvbnModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNldE9wZXJhdGlvbnMoJ3VuaW9uJywgZXhwcmVzc2lvbiwgZmFsc2UpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuaW9uQWxsKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygndW5pb24nLCBleHByZXNzaW9uLCB0cnVlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnRlcnNlY3QoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCdpbnRlcnNlY3QnLCBleHByZXNzaW9uLCBmYWxzZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW50ZXJzZWN0QWxsKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygnaW50ZXJzZWN0JywgZXhwcmVzc2lvbiwgdHJ1ZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXhjZXB0KGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygnZXhjZXB0JywgZXhwcmVzc2lvbiwgZmFsc2UpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGV4Y2VwdEFsbChleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNldE9wZXJhdGlvbnModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNldE9wZXJhdGlvbnMoJ2V4Y2VwdCcsIGV4cHJlc3Npb24sIHRydWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwodGhpcywgYWxpYXMpO1xuICAgIH1cbiAgICBjbGVhclNlbGVjdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRob3V0U2VsZWN0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJXaGVyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0V2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyTGltaXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aG91dExpbWl0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRob3V0T2Zmc2V0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9yZGVyQnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyR3JvdXBCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRob3V0R3JvdXBCeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgJGlmKGNvbmRpdGlvbiwgZnVuYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAkbmFycm93VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgJGFzc2VydFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgICRhc1R1cGxlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgIH1cbiAgICAkYXNTY2FsYXIoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5LCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0KCkge1xuICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW0oY2h1bmtTaXplID0gMTAwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy4jcHJvcHMuZXhlY3V0b3Iuc3RyZWFtKGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBzdHJlYW0pIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtLnJvd3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwbGFpbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRXhwbGFpbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIGZvcm1hdCwgb3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVpbGRlci5leGVjdXRlKCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlcihwcm9wcykge1xuICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbChwcm9wcyk7XG59XG4vKipcbiAqIHtAbGluayBTZWxlY3RRdWVyeUJ1aWxkZXJ9IHdpdGggYW4gYWxpYXMuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB7QGxpbmsgU2VsZWN0UXVlcnlCdWlsZGVyLmFzfS5cbiAqL1xuY2xhc3MgQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwge1xuICAgICNxdWVyeUJ1aWxkZXI7XG4gICAgI2FsaWFzO1xuICAgIGNvbnN0cnVjdG9yKHF1ZXJ5QnVpbGRlciwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jcXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3F1ZXJ5QnVpbGRlcjtcbiAgICB9XG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIGdldCBpc0FsaWFzZWRTZWxlY3RRdWVyeUJ1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHRoaXMuI3F1ZXJ5QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSwgSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtbW9kaWZpZXItbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3RNb2RpZmllck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1NlbGVjdE1vZGlmaWVyTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobW9kaWZpZXIsIG9mKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdE1vZGlmaWVyTm9kZScsXG4gICAgICAgICAgICBtb2RpZmllcixcbiAgICAgICAgICAgIG9mLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhFeHByZXNzaW9uKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdE1vZGlmaWVyTm9kZScsXG4gICAgICAgICAgICByYXdNb2RpZmllcjogbW9kaWZpZXIsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vam9pbi1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIH0gZnJvbSAnLi9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVKb2luQnVpbGRlciB9IGZyb20gJy4vcGFyc2UtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb24sIH0gZnJvbSAnLi90YWJsZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSm9pbihqb2luVHlwZSwgYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gcGFyc2VTaW5nbGVPbkpvaW4oam9pblR5cGUsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gcGFyc2VDYWxsYmFja0pvaW4oam9pblR5cGUsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcGFyc2VPbmxlc3NKb2luKGpvaW5UeXBlLCBhcmdzWzBdKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VDYWxsYmFja0pvaW4oam9pblR5cGUsIGZyb20sIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUpvaW5CdWlsZGVyKGpvaW5UeXBlLCBmcm9tKSkudG9PcGVyYXRpb25Ob2RlKCk7XG59XG5mdW5jdGlvbiBwYXJzZVNpbmdsZU9uSm9pbihqb2luVHlwZSwgZnJvbSwgbGhzQ29sdW1uLCByaHNDb2x1bW4pIHtcbiAgICByZXR1cm4gSm9pbk5vZGUuY3JlYXRlV2l0aE9uKGpvaW5UeXBlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbihmcm9tKSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHNDb2x1bW4sICc9JywgcmhzQ29sdW1uKSk7XG59XG5mdW5jdGlvbiBwYXJzZU9ubGVzc0pvaW4oam9pblR5cGUsIGZyb20pIHtcbiAgICByZXR1cm4gSm9pbk5vZGUuY3JlYXRlKGpvaW5UeXBlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbihmcm9tKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pvaW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE9uTm9kZSB9IGZyb20gJy4vb24tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSm9pbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0pvaW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShqb2luVHlwZSwgdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSm9pbk5vZGUnLFxuICAgICAgICAgICAgam9pblR5cGUsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIG9uOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aE9uKGpvaW5UeXBlLCB0YWJsZSwgb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSm9pbk5vZGUnLFxuICAgICAgICAgICAgam9pblR5cGUsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIG9uOiBPbk5vZGUuY3JlYXRlKG9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPbihqb2luTm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uam9pbk5vZGUsXG4gICAgICAgICAgICBvbjogam9pbk5vZGUub25cbiAgICAgICAgICAgICAgICA/IE9uTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24oam9pbk5vZGUub24sICdBbmQnLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBPbk5vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuL2FuZC1ub2RlLmpzJztcbmltcG9ydCB7IE9yTm9kZSB9IGZyb20gJy4vb3Itbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbk5vZGUnLFxuICAgICAgICAgICAgb246IGZpbHRlcixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcGVyYXRpb24ob25Ob2RlLCBvcGVyYXRvciwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub25Ob2RlLFxuICAgICAgICAgICAgb246IG9wZXJhdG9yID09PSAnQW5kJ1xuICAgICAgICAgICAgICAgID8gQW5kTm9kZS5jcmVhdGUob25Ob2RlLm9uLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBPck5vZGUuY3JlYXRlKG9uTm9kZS5vbiwgb3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbmQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBbmROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBbmROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShsZWZ0LCByaWdodCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbmROb2RlJyxcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vci1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9yTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3JOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShsZWZ0LCByaWdodCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPck5vZGUnLFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQmluYXJ5T3BlcmF0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2JpbmFyeS1vcGVyYXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0Jvb2xlYW4sIGlzTnVsbCwgaXNTdHJpbmcsIGlzVW5kZWZpbmVkLCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgT3BlcmF0b3JOb2RlLCBPUEVSQVRPUlMsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24sIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uLCBwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBQYXJlbnNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcGFyZW5zLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Itbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZUV4cHJlc3Npb24oYXJnc1swXSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbihsZWZ0LCBvcGVyYXRvciwgcmlnaHQpIHtcbiAgICBpZiAoaXNJc09wZXJhdG9yKG9wZXJhdG9yKSAmJiBuZWVkc0lzT3BlcmF0b3IocmlnaHQpKSB7XG4gICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24obGVmdCksIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpLCBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHJpZ2h0KSk7XG4gICAgfVxuICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24obGVmdCksIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpLCBwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdChyaWdodCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGVmdCwgb3BlcmF0b3IsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihsZWZ0KSwgcGFyc2VPcGVyYXRvcihvcGVyYXRvciksIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihyaWdodCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmlsdGVyT2JqZWN0KG9iaiwgY29tYmluYXRvcikge1xuICAgIHJldHVybiBwYXJzZUZpbHRlckxpc3QoT2JqZWN0LmVudHJpZXMob2JqKVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gIWlzVW5kZWZpbmVkKHYpKVxuICAgICAgICAubWFwKChbaywgdl0pID0+IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24oaywgbmVlZHNJc09wZXJhdG9yKHYpID8gJ2lzJyA6ICc9JywgdikpLCBjb21iaW5hdG9yKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpbHRlckxpc3QobGlzdCwgY29tYmluYXRvciwgd2l0aFBhcmVucyA9IHRydWUpIHtcbiAgICBjb25zdCBjb21iaW5lID0gY29tYmluYXRvciA9PT0gJ2FuZCcgPyBBbmROb2RlLmNyZWF0ZSA6IE9yTm9kZS5jcmVhdGU7XG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKDEpLCBPcGVyYXRvck5vZGUuY3JlYXRlKCc9JyksIFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUoY29tYmluYXRvciA9PT0gJ2FuZCcgPyAxIDogMCkpO1xuICAgIH1cbiAgICBsZXQgbm9kZSA9IHRvT3BlcmF0aW9uTm9kZShsaXN0WzBdKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IGNvbWJpbmUobm9kZSwgdG9PcGVyYXRpb25Ob2RlKGxpc3RbaV0pKTtcbiAgICB9XG4gICAgaWYgKGxpc3QubGVuZ3RoID4gMSAmJiB3aXRoUGFyZW5zKSB7XG4gICAgICAgIHJldHVybiBQYXJlbnNOb2RlLmNyZWF0ZShub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBpc0lzT3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3IgPT09ICdpcycgfHwgb3BlcmF0b3IgPT09ICdpcyBub3QnO1xufVxuZnVuY3Rpb24gbmVlZHNJc09wZXJhdG9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzTnVsbCh2YWx1ZSkgfHwgaXNCb29sZWFuKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgICBpZiAoaXNTdHJpbmcob3BlcmF0b3IpICYmIE9QRVJBVE9SUy5pbmNsdWRlcyhvcGVyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIE9wZXJhdG9yTm9kZS5jcmVhdGUob3BlcmF0b3IpO1xuICAgIH1cbiAgICBpZiAoaXNPcGVyYXRpb25Ob2RlU291cmNlKG9wZXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gb3BlcmF0b3IudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcGVyYXRvciAke0pTT04uc3RyaW5naWZ5KG9wZXJhdG9yKX1gKTtcbn1cbmZ1bmN0aW9uIHRvT3BlcmF0aW9uTm9kZShub2RlT3JTb3VyY2UpIHtcbiAgICByZXR1cm4gaXNPcGVyYXRpb25Ob2RlU291cmNlKG5vZGVPclNvdXJjZSlcbiAgICAgICAgPyBub2RlT3JTb3VyY2UudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgOiBub2RlT3JTb3VyY2U7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2JpbmFyeS1vcGVyYXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBCaW5hcnlPcGVyYXRpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdCaW5hcnlPcGVyYXRpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShsZWZ0T3BlcmFuZCwgb3BlcmF0b3IsIHJpZ2h0T3BlcmFuZCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdCaW5hcnlPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIGxlZnRPcGVyYW5kLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICByaWdodE9wZXJhbmQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3BlcmF0b3Itbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY29uc3QgQ09NUEFSSVNPTl9PUEVSQVRPUlMgPSBbXG4gICAgJz0nLFxuICAgICc9PScsXG4gICAgJyE9JyxcbiAgICAnPD4nLFxuICAgICc+JyxcbiAgICAnPj0nLFxuICAgICc8JyxcbiAgICAnPD0nLFxuICAgICdpbicsXG4gICAgJ25vdCBpbicsXG4gICAgJ2lzJyxcbiAgICAnaXMgbm90JyxcbiAgICAnbGlrZScsXG4gICAgJ25vdCBsaWtlJyxcbiAgICAnbWF0Y2gnLFxuICAgICdpbGlrZScsXG4gICAgJ25vdCBpbGlrZScsXG4gICAgJ0A+JyxcbiAgICAnPEAnLFxuICAgICdeQCcsXG4gICAgJyYmJyxcbiAgICAnPycsXG4gICAgJz8mJyxcbiAgICAnP3wnLFxuICAgICchPCcsXG4gICAgJyE+JyxcbiAgICAnPD0+JyxcbiAgICAnIX4nLFxuICAgICd+JyxcbiAgICAnfionLFxuICAgICchfionLFxuICAgICdAQCcsXG4gICAgJ0BAQCcsXG4gICAgJyEhJyxcbiAgICAnPC0+JyxcbiAgICAncmVnZXhwJyxcbiAgICAnaXMgZGlzdGluY3QgZnJvbScsXG4gICAgJ2lzIG5vdCBkaXN0aW5jdCBmcm9tJyxcbl07XG5leHBvcnQgY29uc3QgQVJJVEhNRVRJQ19PUEVSQVRPUlMgPSBbXG4gICAgJysnLFxuICAgICctJyxcbiAgICAnKicsXG4gICAgJy8nLFxuICAgICclJyxcbiAgICAnXicsXG4gICAgJyYnLFxuICAgICd8JyxcbiAgICAnIycsXG4gICAgJzw8JyxcbiAgICAnPj4nLFxuXTtcbmV4cG9ydCBjb25zdCBKU09OX09QRVJBVE9SUyA9IFsnLT4nLCAnLT4+J107XG5leHBvcnQgY29uc3QgQklOQVJZX09QRVJBVE9SUyA9IFtcbiAgICAuLi5DT01QQVJJU09OX09QRVJBVE9SUyxcbiAgICAuLi5BUklUSE1FVElDX09QRVJBVE9SUyxcbiAgICAnJiYnLFxuICAgICd8fCcsXG5dO1xuZXhwb3J0IGNvbnN0IFVOQVJZX0ZJTFRFUl9PUEVSQVRPUlMgPSBbJ2V4aXN0cycsICdub3QgZXhpc3RzJ107XG5leHBvcnQgY29uc3QgVU5BUllfT1BFUkFUT1JTID0gWydub3QnLCAnLScsIC4uLlVOQVJZX0ZJTFRFUl9PUEVSQVRPUlNdO1xuZXhwb3J0IGNvbnN0IE9QRVJBVE9SUyA9IFtcbiAgICAuLi5CSU5BUllfT1BFUkFUT1JTLFxuICAgIC4uLkpTT05fT1BFUkFUT1JTLFxuICAgIC4uLlVOQVJZX09QRVJBVE9SUyxcbiAgICAnYmV0d2VlbicsXG4gICAgJ2JldHdlZW4gc3ltbWV0cmljJyxcbl07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3BlcmF0b3JOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPcGVyYXRvck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9wZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09wZXJhdG9yTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlcmF0b3Iob3ApIHtcbiAgICByZXR1cm4gaXNTdHJpbmcob3ApICYmIE9QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaW5hcnlPcGVyYXRvcihvcCkge1xuICAgIHJldHVybiBpc1N0cmluZyhvcCkgJiYgQklOQVJZX09QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21wYXJpc29uT3BlcmF0b3Iob3ApIHtcbiAgICByZXR1cm4gaXNTdHJpbmcob3ApICYmIENPTVBBUklTT05fT1BFUkFUT1JTLmluY2x1ZGVzKG9wKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FyaXRobWV0aWNPcGVyYXRvcihvcCkge1xuICAgIHJldHVybiBpc1N0cmluZyhvcCkgJiYgQVJJVEhNRVRJQ19PUEVSQVRPUlMuaW5jbHVkZXMob3ApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNPTk9wZXJhdG9yKG9wKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKG9wKSAmJiBKU09OX09QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZmVyZW5jZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBSZWZlcmVuY2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBpc1JlYWRvbmx5QXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uLCBpc0V4cHJlc3Npb25PckZhY3RvcnksIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09yZGVyQnlEaXJlY3Rpb24sIHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuL29yZGVyLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBPcGVyYXRvck5vZGUsIGlzSlNPTk9wZXJhdG9yLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgSlNPTlJlZmVyZW5jZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLXJlZmVyZW5jZS1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05PcGVyYXRvckNoYWluTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tb3BlcmF0b3ItY2hhaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc1N0cmluZyhleHApKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZShleHApO1xuICAgIH1cbiAgICByZXR1cm4gZXhwLnRvT3BlcmF0aW9uTm9kZSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChhcmcpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KGFyZykpIHtcbiAgICAgICAgcmV0dXJuIGFyZy5tYXAoKGl0KSA9PiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oaXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGFyZyldO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzRXhwcmVzc2lvbk9yRmFjdG9yeShleHApKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oZXhwKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbihleHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSlNPTlJlZmVyZW5jZShyZWYsIG9wKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZik7XG4gICAgaWYgKGlzSlNPTk9wZXJhdG9yKG9wKSkge1xuICAgICAgICByZXR1cm4gSlNPTlJlZmVyZW5jZU5vZGUuY3JlYXRlKHJlZmVyZW5jZU5vZGUsIEpTT05PcGVyYXRvckNoYWluTm9kZS5jcmVhdGUoT3BlcmF0b3JOb2RlLmNyZWF0ZShvcCkpKTtcbiAgICB9XG4gICAgY29uc3Qgb3BXaXRob3V0TGFzdENoYXIgPSBvcC5zbGljZSgwLCAtMSk7XG4gICAgaWYgKGlzSlNPTk9wZXJhdG9yKG9wV2l0aG91dExhc3RDaGFyKSkge1xuICAgICAgICByZXR1cm4gSlNPTlJlZmVyZW5jZU5vZGUuY3JlYXRlKHJlZmVyZW5jZU5vZGUsIEpTT05QYXRoTm9kZS5jcmVhdGUoT3BlcmF0b3JOb2RlLmNyZWF0ZShvcFdpdGhvdXRMYXN0Q2hhcikpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04gb3BlcmF0b3I6ICR7b3B9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmKSB7XG4gICAgY29uc3QgQ09MVU1OX1NFUEFSQVRPUiA9ICcuJztcbiAgICBpZiAoIXJlZi5pbmNsdWRlcyhDT0xVTU5fU0VQQVJBVE9SKSkge1xuICAgICAgICByZXR1cm4gUmVmZXJlbmNlTm9kZS5jcmVhdGUoQ29sdW1uTm9kZS5jcmVhdGUocmVmKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gcmVmLnNwbGl0KENPTFVNTl9TRVBBUkFUT1IpLm1hcCh0cmltKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZUFuZFNjaGVtYShwYXJ0cyk7XG4gICAgfVxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVmZXJlbmNlV2l0aFRhYmxlKHBhcnRzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGNvbHVtbiByZWZlcmVuY2UgJHtyZWZ9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlKHJlZikge1xuICAgIGNvbnN0IEFMSUFTX1NFUEFSQVRPUiA9ICcgYXMgJztcbiAgICBpZiAocmVmLmluY2x1ZGVzKEFMSUFTX1NFUEFSQVRPUikpIHtcbiAgICAgICAgY29uc3QgW2NvbHVtblJlZiwgYWxpYXNdID0gcmVmLnNwbGl0KEFMSUFTX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZShwYXJzZVN0cmluZ1JlZmVyZW5jZShjb2x1bW5SZWYpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUoYWxpYXMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZShyZWYpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbHVtbk5hbWUoY29sdW1uKSB7XG4gICAgcmV0dXJuIENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbik7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcmRlcmVkQ29sdW1uTmFtZShjb2x1bW4pIHtcbiAgICBjb25zdCBPUkRFUl9TRVBBUkFUT1IgPSAnICc7XG4gICAgaWYgKGNvbHVtbi5pbmNsdWRlcyhPUkRFUl9TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5OYW1lLCBvcmRlcl0gPSBjb2x1bW4uc3BsaXQoT1JERVJfU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgICAgIGlmICghaXNPcmRlckJ5RGlyZWN0aW9uKG9yZGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9yZGVyIGRpcmVjdGlvbiBcIiR7b3JkZXJ9XCIgbmV4dCB0byBcIiR7Y29sdW1uTmFtZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZU9yZGVyQnkoW2NvbHVtbk5hbWUsIG9yZGVyXSlbMF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VDb2x1bW5OYW1lKGNvbHVtbik7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGVBbmRTY2hlbWEocGFydHMpIHtcbiAgICBjb25zdCBbc2NoZW1hLCB0YWJsZSwgY29sdW1uXSA9IHBhcnRzO1xuICAgIHJldHVybiBSZWZlcmVuY2VOb2RlLmNyZWF0ZShDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLCBUYWJsZU5vZGUuY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIHRhYmxlKSk7XG59XG5mdW5jdGlvbiBwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZShwYXJ0cykge1xuICAgIGNvbnN0IFt0YWJsZSwgY29sdW1uXSA9IHBhcnRzO1xuICAgIHJldHVybiBSZWZlcmVuY2VOb2RlLmNyZWF0ZShDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLCBUYWJsZU5vZGUuY3JlYXRlKHRhYmxlKSk7XG59XG5mdW5jdGlvbiB0cmltKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbHVtbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbHVtbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbHVtbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmVmZXJlbmNlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBTZWxlY3RBbGxOb2RlIH0gZnJvbSAnLi9zZWxlY3QtYWxsLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJlZmVyZW5jZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JlZmVyZW5jZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbiwgdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVTZWxlY3RBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIGNvbHVtbjogU2VsZWN0QWxsTm9kZS5jcmVhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtYWxsLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0QWxsTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2VsZWN0QWxsTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdEFsbE5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yZGVyLWJ5LXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIsIH0gZnJvbSAnLi4vZHluYW1pYy9keW5hbWljLXJlZmVyZW5jZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgeyBPcmRlckJ5SXRlbU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcmRlci1ieS1pdGVtLW5vZGUuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IE9yZGVyQnlJdGVtQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvb3JkZXItYnktaXRlbS1idWlsZGVyLmpzJztcbmltcG9ydCB7IGxvZ09uY2UgfSBmcm9tICcuLi91dGlsL2xvZy1vbmNlLmpzJztcbmltcG9ydCB7IGlzRXhwcmVzc2lvbk9yRmFjdG9yeSwgcGFyc2VFeHByZXNzaW9uLCB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTdHJpbmdSZWZlcmVuY2UsIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc09yZGVyQnlEaXJlY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgPT09ICdhc2MnIHx8IHRoaW5nID09PSAnZGVzYyc7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcmRlckJ5KGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIFtwYXJzZU9yZGVyQnlJdGVtKGFyZ3NbMF0sIGFyZ3NbMV0pXTtcbiAgICB9XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IFtvcmRlckJ5XSA9IGFyZ3M7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9yZGVyQnkpKSB7XG4gICAgICAgICAgICBsb2dPbmNlKCdvcmRlckJ5KGFycmF5KSBpcyBkZXByZWNhdGVkLCB1c2UgbXVsdGlwbGUgb3JkZXJCeSBjYWxscyBpbnN0ZWFkLicpO1xuICAgICAgICAgICAgcmV0dXJuIG9yZGVyQnkubWFwKChpdGVtKSA9PiBwYXJzZU9yZGVyQnlJdGVtKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3BhcnNlT3JkZXJCeUl0ZW0ob3JkZXJCeSldO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBhdCBvcmRlciBieSEgZXhwZWN0ZWQgMS0yLCByZWNlaXZlZCAke2FyZ3MubGVuZ3RofWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3JkZXJCeUl0ZW0oZXhwciwgbW9kaWZpZXJzKSB7XG4gICAgY29uc3QgcGFyc2VkUmVmID0gcGFyc2VPcmRlckJ5RXhwcmVzc2lvbihleHByKTtcbiAgICBpZiAoT3JkZXJCeUl0ZW1Ob2RlLmlzKHBhcnNlZFJlZikpIHtcbiAgICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc3BlY2lmeSBkaXJlY3Rpb24gdHdpY2UhJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZFJlZjtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlT3JkZXJCeVdpdGhNb2RpZmllcnMocGFyc2VkUmVmLCBtb2RpZmllcnMpO1xufVxuZnVuY3Rpb24gcGFyc2VPcmRlckJ5RXhwcmVzc2lvbihleHByKSB7XG4gICAgaWYgKGlzRXhwcmVzc2lvbk9yRmFjdG9yeShleHByKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uKGV4cHIpO1xuICAgIH1cbiAgICBpZiAoaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlcihleHByKSkge1xuICAgICAgICByZXR1cm4gZXhwci50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgY29uc3QgW3JlZiwgZGlyZWN0aW9uXSA9IGV4cHIuc3BsaXQoJyAnKTtcbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgIGxvZ09uY2UoXCJgb3JkZXJCeSgnY29sdW1uIGFzYycpYCBpcyBkZXByZWNhdGVkLiBVc2UgYG9yZGVyQnkoJ2NvbHVtbicsICdhc2MnKWAgaW5zdGVhZC5cIik7XG4gICAgICAgIHJldHVybiBwYXJzZU9yZGVyQnlXaXRoTW9kaWZpZXJzKHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZiksIGRpcmVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZShleHByKTtcbn1cbmZ1bmN0aW9uIHBhcnNlT3JkZXJCeVdpdGhNb2RpZmllcnMoZXhwciwgbW9kaWZpZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBtb2RpZmllcnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghaXNPcmRlckJ5RGlyZWN0aW9uKG1vZGlmaWVycykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcmRlciBieSBkaXJlY3Rpb246ICR7bW9kaWZpZXJzfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPcmRlckJ5SXRlbU5vZGUuY3JlYXRlKGV4cHIsIFJhd05vZGUuY3JlYXRlV2l0aFNxbChtb2RpZmllcnMpKTtcbiAgICB9XG4gICAgaWYgKGlzRXhwcmVzc2lvbihtb2RpZmllcnMpKSB7XG4gICAgICAgIGxvZ09uY2UoXCJgb3JkZXJCeSguLi4sIGV4cHIpYCBpcyBkZXByZWNhdGVkLiBVc2UgYG9yZGVyQnkoLi4uLCAnYXNjJylgIG9yIGBvcmRlckJ5KC4uLiwgKG9iKSA9PiAuLi4pYCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgcmV0dXJuIE9yZGVyQnlJdGVtTm9kZS5jcmVhdGUoZXhwciwgbW9kaWZpZXJzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICB9XG4gICAgY29uc3Qgbm9kZSA9IE9yZGVyQnlJdGVtTm9kZS5jcmVhdGUoZXhwcik7XG4gICAgaWYgKCFtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJldHVybiBtb2RpZmllcnMobmV3IE9yZGVyQnlJdGVtQnVpbGRlcih7IG5vZGUgfSkpLnRvT3BlcmF0aW9uTm9kZSgpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9keW5hbWljLXJlZmVyZW5jZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24gfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIge1xuICAgICNkeW5hbWljUmVmZXJlbmNlO1xuICAgIGdldCBkeW5hbWljUmVmZXJlbmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHluYW1pY1JlZmVyZW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKlxuICAgICAqIFRoaXMgbmVlZHMgdG8gYmUgaGVyZSBqdXN0IHNvIHRoYXQgdGhlIHR5cGluZ3Mgd29yay4gV2l0aG91dCB0aGlzXG4gICAgICogdGhlIGdlbmVyYXRlZCAuZC50cyBmaWxlIGNvbnRhaW5zIG5vIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBwYXJhbSBSXG4gICAgICogd2hpY2ggY2F1c2VzIHRoaXMgdHlwZSB0byBiZSBlcXVhbCB0byBEeW5hbWljUmVmZXJlbmNlQnVpbGRlciB3aXRoXG4gICAgICogYW55IFIuXG4gICAgICovXG4gICAgZ2V0IHJlZlR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHJlZmVyZW5jZSkge1xuICAgICAgICB0aGlzLiNkeW5hbWljUmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24odGhpcy4jZHluYW1pY1JlZmVyZW5jZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIob2JqKSB7XG4gICAgcmV0dXJuIChpc09iamVjdChvYmopICYmXG4gICAgICAgIGlzT3BlcmF0aW9uTm9kZVNvdXJjZShvYmopICYmXG4gICAgICAgIGlzU3RyaW5nKG9iai5keW5hbWljUmVmZXJlbmNlKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yZGVyLWJ5LWl0ZW0tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPcmRlckJ5SXRlbU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09yZGVyQnlJdGVtTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob3JkZXJCeSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09yZGVyQnlJdGVtTm9kZScsXG4gICAgICAgICAgICBvcmRlckJ5LFxuICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yYXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSYXdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSYXdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzcWxGcmFnbWVudHMsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmF3Tm9kZScsXG4gICAgICAgICAgICBzcWxGcmFnbWVudHM6IGZyZWV6ZShzcWxGcmFnbWVudHMpLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogZnJlZXplKHBhcmFtZXRlcnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhTcWwoc3FsKSB7XG4gICAgICAgIHJldHVybiBSYXdOb2RlLmNyZWF0ZShbc3FsXSwgW10pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aENoaWxkKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBSYXdOb2RlLmNyZWF0ZShbJycsICcnXSwgW2NoaWxkXSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgICAgICAgcmV0dXJuIFJhd05vZGUuY3JlYXRlKG5ldyBBcnJheShjaGlsZHJlbi5sZW5ndGggKyAxKS5maWxsKCcnKSwgY2hpbGRyZW4pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3JkZXItYnktaXRlbS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sbGF0ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2xsYXRlLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JkZXJCeUl0ZW1Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3JkZXItYnktaXRlbS1ub2RlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT3JkZXJCeUl0ZW1CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBkZXNjYCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBhc2N9IGZvciB0aGUgb3Bwb3NpdGUuXG4gICAgICovXG4gICAgZGVzYygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoJ2Rlc2MnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgYXNjYCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBkZXNjfSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIGFzYygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoJ2FzYycpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBsYXN0YCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBhbmQgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBudWxsc0ZpcnN0fSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIG51bGxzTGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IG51bGxzOiAnbGFzdCcgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBmaXJzdGAgdG8gdGhlIGBvcmRlciBieWAgaXRlbS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgYW5kIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgbnVsbHNMYXN0fSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIG51bGxzRmlyc3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IE9yZGVyQnlJdGVtTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwgeyBudWxsczogJ2ZpcnN0JyB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYGNvbGxhdGUgPGNvbGxhdGlvbk5hbWU+YCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqL1xuICAgIGNvbGxhdGUoY29sbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IE9yZGVyQnlJdGVtTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbGxhdGlvbjogQ29sbGF0ZU5vZGUuY3JlYXRlKGNvbGxhdGlvbiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb2xsYXRlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb2xsYXRlTm9kZSA9IHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDb2xsYXRlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbGxhdGVOb2RlJyxcbiAgICAgICAgICAgIGNvbGxhdGlvbjogSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbGxhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59O1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9sb2ctb25jZS5kLnRzXCIgLz5cbmNvbnN0IExPR0dFRF9NRVNTQUdFUyA9IG5ldyBTZXQoKTtcbi8qKlxuICogVXNlIGZvciBzeXN0ZW0tbGV2ZWwgbG9nZ2luZywgc3VjaCBhcyBkZXByZWNhdGlvbiBtZXNzYWdlcy5cbiAqIExvZ3MgYSBtZXNzYWdlIGFuZCBlbnN1cmVzIGl0IHdvbid0IGJlIGxvZ2dlZCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ09uY2UobWVzc2FnZSkge1xuICAgIGlmIChMT0dHRURfTUVTU0FHRVMuaGFzKG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTE9HR0VEX01FU1NBR0VTLmFkZChtZXNzYWdlKTtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1yZWZlcmVuY2Utbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBKU09OUmVmZXJlbmNlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSlNPTlJlZmVyZW5jZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHJlZmVyZW5jZSwgdHJhdmVyc2FsKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pTT05SZWZlcmVuY2VOb2RlJyxcbiAgICAgICAgICAgIHJlZmVyZW5jZSxcbiAgICAgICAgICAgIHRyYXZlcnNhbCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUcmF2ZXJzYWwobm9kZSwgdHJhdmVyc2FsKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHRyYXZlcnNhbCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qc29uLW9wZXJhdG9yLWNoYWluLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKU09OT3BlcmF0b3JDaGFpbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9wZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pTT05PcGVyYXRvckNoYWluTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKFtdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhWYWx1ZShub2RlLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZShbLi4ubm9kZS52YWx1ZXMsIHZhbHVlXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1wYXRoLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSlNPTlBhdGhOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKU09OUGF0aE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGluT3BlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTlBhdGhOb2RlJyxcbiAgICAgICAgICAgIGluT3BlcmF0b3IsXG4gICAgICAgICAgICBwYXRoTGVnczogZnJlZXplKFtdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhMZWcoanNvblBhdGhOb2RlLCBwYXRoTGVnKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uanNvblBhdGhOb2RlLFxuICAgICAgICAgICAgcGF0aExlZ3M6IGZyZWV6ZShbLi4uanNvblBhdGhOb2RlLnBhdGhMZWdzLCBwYXRoTGVnXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdmFsdWUtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ByaW1pdGl2ZS12YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVMaXN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLWxpc3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IGlzQm9vbGVhbiwgaXNOdWxsLCBpc051bWJlciwgaXNSZWFkb25seUFycmF5LCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiwgaXNFeHByZXNzaW9uT3JGYWN0b3J5LCB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWVFeHByZXNzaW9uT3JMaXN0KGFyZykge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoYXJnKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZUV4cHJlc3Npb25MaXN0KGFyZyk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVZhbHVlRXhwcmVzc2lvbihhcmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWVFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc0V4cHJlc3Npb25PckZhY3RvcnkoZXhwKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uKGV4cCk7XG4gICAgfVxuICAgIHJldHVybiBWYWx1ZU5vZGUuY3JlYXRlKGV4cCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gaXNOdW1iZXIodmFsdWUpIHx8IGlzQm9vbGVhbih2YWx1ZSkgfHwgaXNOdWxsKHZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICghaXNTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zYWZlIGltbWVkaWF0ZSB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUodmFsdWUpO1xufVxuZnVuY3Rpb24gcGFyc2VWYWx1ZUV4cHJlc3Npb25MaXN0KGFyZykge1xuICAgIGlmIChhcmcuc29tZShpc0V4cHJlc3Npb25PckZhY3RvcnkpKSB7XG4gICAgICAgIHJldHVybiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZShhcmcubWFwKChpdCkgPT4gcGFyc2VWYWx1ZUV4cHJlc3Npb24oaXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlLmNyZWF0ZShhcmcpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wcmltaXRpdmUtdmFsdWUtbGlzdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1ByaW1pdGl2ZVZhbHVlTGlzdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQcmltaXRpdmVWYWx1ZUxpc3ROb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKFsuLi52YWx1ZXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZS1saXN0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVmFsdWVMaXN0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVmFsdWVMaXN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlTGlzdE5vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiBmcmVlemUodmFsdWVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbHVlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVmFsdWVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlSW1tZWRpYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wYXJlbnMtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQYXJlbnNOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdQYXJlbnNOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1BhcmVuc05vZGUnLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wYXJzZS11dGlscy5kLnRzXCIgLz5cbmltcG9ydCB7IEpvaW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvam9pbi1ub2RlLmpzJztcbmltcG9ydCB7IE92ZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Zlci1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IEpvaW5CdWlsZGVyIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9qb2luLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgT3ZlckJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL292ZXItYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIgYXMgbmV3U2VsZWN0UXVlcnlCdWlsZGVyLCB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUXVlcnlDcmVhdG9yIH0gZnJvbSAnLi4vcXVlcnktY3JlYXRvci5qcyc7XG5pbXBvcnQgeyBOT09QX1FVRVJZX0VYRUNVVE9SIH0gZnJvbSAnLi4vcXVlcnktZXhlY3V0b3Ivbm9vcC1xdWVyeS1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlRXhwcmVzc2lvbiwgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi90YWJsZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlcigpIHtcbiAgICByZXR1cm4gbmV3U2VsZWN0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICBleGVjdXRvcjogTk9PUF9RVUVSWV9FWEVDVVRPUixcbiAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY3JlYXRlRnJvbShwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdChbXSkpLFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5Q3JlYXRvcigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5Q3JlYXRvcih7XG4gICAgICAgIGV4ZWN1dG9yOiBOT09QX1FVRVJZX0VYRUNVVE9SLFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUpvaW5CdWlsZGVyKGpvaW5UeXBlLCB0YWJsZSkge1xuICAgIHJldHVybiBuZXcgSm9pbkJ1aWxkZXIoe1xuICAgICAgICBqb2luTm9kZTogSm9pbk5vZGUuY3JlYXRlKGpvaW5UeXBlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbih0YWJsZSkpLFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU92ZXJCdWlsZGVyKCkge1xuICAgIHJldHVybiBuZXcgT3ZlckJ1aWxkZXIoe1xuICAgICAgICBvdmVyTm9kZTogT3Zlck5vZGUuY3JlYXRlKCksXG4gICAgfSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL292ZXItbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE9yZGVyQnlOb2RlIH0gZnJvbSAnLi9vcmRlci1ieS1ub2RlLmpzJztcbmltcG9ydCB7IFBhcnRpdGlvbkJ5Tm9kZSB9IGZyb20gJy4vcGFydGl0aW9uLWJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE92ZXJOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPdmVyTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ092ZXJOb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXMob3Zlck5vZGUsIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub3Zlck5vZGUsXG4gICAgICAgICAgICBvcmRlckJ5OiBvdmVyTm9kZS5vcmRlckJ5XG4gICAgICAgICAgICAgICAgPyBPcmRlckJ5Tm9kZS5jbG9uZVdpdGhJdGVtcyhvdmVyTm9kZS5vcmRlckJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IE9yZGVyQnlOb2RlLmNyZWF0ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoUGFydGl0aW9uQnlJdGVtcyhvdmVyTm9kZSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5vdmVyTm9kZSxcbiAgICAgICAgICAgIHBhcnRpdGlvbkJ5OiBvdmVyTm9kZS5wYXJ0aXRpb25CeVxuICAgICAgICAgICAgICAgID8gUGFydGl0aW9uQnlOb2RlLmNsb25lV2l0aEl0ZW1zKG92ZXJOb2RlLnBhcnRpdGlvbkJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IFBhcnRpdGlvbkJ5Tm9kZS5jcmVhdGUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yZGVyLWJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3JkZXJCeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09yZGVyQnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcmRlckJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKFsuLi5pdGVtc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEl0ZW1zKG9yZGVyQnksIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub3JkZXJCeSxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoWy4uLm9yZGVyQnkuaXRlbXMsIC4uLml0ZW1zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcGFydGl0aW9uLWJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUGFydGl0aW9uQnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdQYXJ0aXRpb25CeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1BhcnRpdGlvbkJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJdGVtcyhwYXJ0aXRpb25CeSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5wYXJ0aXRpb25CeSxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoWy4uLnBhcnRpdGlvbkJ5Lml0ZW1zLCAuLi5pdGVtc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NlbGVjdC1xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgRnJvbU5vZGUgfSBmcm9tICcuL2Zyb20tbm9kZS5qcyc7XG5pbXBvcnQgeyBHcm91cEJ5Tm9kZSB9IGZyb20gJy4vZ3JvdXAtYnktbm9kZS5qcyc7XG5pbXBvcnQgeyBIYXZpbmdOb2RlIH0gZnJvbSAnLi9oYXZpbmctbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuL3F1ZXJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdFF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2VsZWN0UXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh3aXRoTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RRdWVyeU5vZGUnLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlRnJvbShmcm9tSXRlbXMsIHdpdGhOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdFF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBmcm9tOiBGcm9tTm9kZS5jcmVhdGUoZnJvbUl0ZW1zKSxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFNlbGVjdGlvbnMoc2VsZWN0LCBzZWxlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0aW9uczogc2VsZWN0LnNlbGVjdGlvbnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uc2VsZWN0LnNlbGVjdGlvbnMsIC4uLnNlbGVjdGlvbnNdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKHNlbGVjdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aERpc3RpbmN0T24oc2VsZWN0LCBleHByZXNzaW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGRpc3RpbmN0T246IHNlbGVjdC5kaXN0aW5jdE9uXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnNlbGVjdC5kaXN0aW5jdE9uLCAuLi5leHByZXNzaW9uc10pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoZXhwcmVzc2lvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb250TW9kaWZpZXIoc2VsZWN0LCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiBzZWxlY3QuZnJvbnRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uc2VsZWN0LmZyb250TW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW21vZGlmaWVyXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXM6IChub2RlLCBpdGVtcykgPT4gUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyhub2RlLCBpdGVtcyksXG4gICAgY2xvbmVXaXRoR3JvdXBCeUl0ZW1zKHNlbGVjdE5vZGUsIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIGdyb3VwQnk6IHNlbGVjdE5vZGUuZ3JvdXBCeVxuICAgICAgICAgICAgICAgID8gR3JvdXBCeU5vZGUuY2xvbmVXaXRoSXRlbXMoc2VsZWN0Tm9kZS5ncm91cEJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IEdyb3VwQnlOb2RlLmNyZWF0ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoTGltaXQoc2VsZWN0Tm9kZSwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT2Zmc2V0KHNlbGVjdE5vZGUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRmV0Y2goc2VsZWN0Tm9kZSwgZmV0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgZmV0Y2gsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSGF2aW5nKHNlbGVjdE5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBoYXZpbmc6IHNlbGVjdE5vZGUuaGF2aW5nXG4gICAgICAgICAgICAgICAgPyBIYXZpbmdOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihzZWxlY3ROb2RlLmhhdmluZywgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IEhhdmluZ05vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyhzZWxlY3ROb2RlLCBzZXRPcGVyYXRpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIHNldE9wZXJhdGlvbnM6IHNlbGVjdE5vZGUuc2V0T3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5zZWxlY3ROb2RlLnNldE9wZXJhdGlvbnMsIC4uLnNldE9wZXJhdGlvbnNdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFsuLi5zZXRPcGVyYXRpb25zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0U2VsZWN0aW9ucyhzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBbXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRMaW1pdChzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBsaW1pdDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dE9mZnNldChzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBvZmZzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gdjAuMjlcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5YCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGNsb25lV2l0aG91dE9yZGVyQnk6IChub2RlKSA9PiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeShub2RlKSxcbiAgICBjbG9uZVdpdGhvdXRHcm91cEJ5KHNlbGVjdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGdyb3VwQnk6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mcm9tLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRnJvbU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Zyb21Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmcm9tcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGcm9tTm9kZScsXG4gICAgICAgICAgICBmcm9tczogZnJlZXplKGZyb21zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGcm9tcyhmcm9tLCBmcm9tcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmZyb20sXG4gICAgICAgICAgICBmcm9tczogZnJlZXplKFsuLi5mcm9tLmZyb21zLCAuLi5mcm9tc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2dyb3VwLWJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgR3JvdXBCeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0dyb3VwQnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHcm91cEJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJdGVtcyhncm91cEJ5LCBpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmdyb3VwQnksXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKFsuLi5ncm91cEJ5Lml0ZW1zLCAuLi5pdGVtc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2hhdmluZy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQW5kTm9kZSB9IGZyb20gJy4vYW5kLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi9vci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBIYXZpbmdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdIYXZpbmdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSGF2aW5nTm9kZScsXG4gICAgICAgICAgICBoYXZpbmc6IGZpbHRlcixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcGVyYXRpb24oaGF2aW5nTm9kZSwgb3BlcmF0b3IsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmhhdmluZ05vZGUsXG4gICAgICAgICAgICBoYXZpbmc6IG9wZXJhdG9yID09PSAnQW5kJ1xuICAgICAgICAgICAgICAgID8gQW5kTm9kZS5jcmVhdGUoaGF2aW5nTm9kZS5oYXZpbmcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IE9yTm9kZS5jcmVhdGUoaGF2aW5nTm9kZS5oYXZpbmcsIG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4vaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlOb2RlIH0gZnJvbSAnLi9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeU5vZGUgfSBmcm9tICcuL3VwZGF0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vZGVsZXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgV2hlcmVOb2RlIH0gZnJvbSAnLi93aGVyZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJldHVybmluZ05vZGUgfSBmcm9tICcuL3JldHVybmluZy1ub2RlLmpzJztcbmltcG9ydCB7IEV4cGxhaW5Ob2RlIH0gZnJvbSAnLi9leHBsYWluLW5vZGUuanMnO1xuaW1wb3J0IHsgTWVyZ2VRdWVyeU5vZGUgfSBmcm9tICcuL21lcmdlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgT3V0cHV0Tm9kZSB9IGZyb20gJy4vb3V0cHV0LW5vZGUuanMnO1xuaW1wb3J0IHsgT3JkZXJCeU5vZGUgfSBmcm9tICcuL29yZGVyLWJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gKFNlbGVjdFF1ZXJ5Tm9kZS5pcyhub2RlKSB8fFxuICAgICAgICAgICAgSW5zZXJ0UXVlcnlOb2RlLmlzKG5vZGUpIHx8XG4gICAgICAgICAgICBVcGRhdGVRdWVyeU5vZGUuaXMobm9kZSkgfHxcbiAgICAgICAgICAgIERlbGV0ZVF1ZXJ5Tm9kZS5pcyhub2RlKSB8fFxuICAgICAgICAgICAgTWVyZ2VRdWVyeU5vZGUuaXMobm9kZSkpO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRW5kTW9kaWZpZXIobm9kZSwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiBub2RlLmVuZE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5ub2RlLmVuZE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFttb2RpZmllcl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFdoZXJlKG5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB3aGVyZTogbm9kZS53aGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLndoZXJlLCAnQW5kJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogV2hlcmVOb2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEpvaW4obm9kZSwgam9pbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBqb2luczogbm9kZS5qb2lucyA/IGZyZWV6ZShbLi4ubm9kZS5qb2lucywgam9pbl0pIDogZnJlZXplKFtqb2luXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoUmV0dXJuaW5nKG5vZGUsIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiBub2RlLnJldHVybmluZ1xuICAgICAgICAgICAgICAgID8gUmV0dXJuaW5nTm9kZS5jbG9uZVdpdGhTZWxlY3Rpb25zKG5vZGUucmV0dXJuaW5nLCBzZWxlY3Rpb25zKVxuICAgICAgICAgICAgICAgIDogUmV0dXJuaW5nTm9kZS5jcmVhdGUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0UmV0dXJuaW5nKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0V2hlcmUobm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB3aGVyZTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEV4cGxhaW4obm9kZSwgZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGV4cGxhaW46IEV4cGxhaW5Ob2RlLmNyZWF0ZShmb3JtYXQsIG9wdGlvbnM/LnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUb3Aobm9kZSwgdG9wKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPdXRwdXQobm9kZSwgc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBvdXRwdXQ6IG5vZGUub3V0cHV0XG4gICAgICAgICAgICAgICAgPyBPdXRwdXROb2RlLmNsb25lV2l0aFNlbGVjdGlvbnMobm9kZS5vdXRwdXQsIHNlbGVjdGlvbnMpXG4gICAgICAgICAgICAgICAgOiBPdXRwdXROb2RlLmNyZWF0ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXMobm9kZSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgb3JkZXJCeTogbm9kZS5vcmRlckJ5XG4gICAgICAgICAgICAgICAgPyBPcmRlckJ5Tm9kZS5jbG9uZVdpdGhJdGVtcyhub2RlLm9yZGVyQnksIGl0ZW1zKVxuICAgICAgICAgICAgICAgIDogT3JkZXJCeU5vZGUuY3JlYXRlKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRPcmRlckJ5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgb3JkZXJCeTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2luc2VydC1xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEluc2VydFF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSW5zZXJ0UXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpbnRvLCB3aXRoTm9kZSwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdJbnNlcnRRdWVyeU5vZGUnLFxuICAgICAgICAgICAgaW50byxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICAgICAgcmVwbGFjZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRob3V0SW50bygpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSW5zZXJ0UXVlcnlOb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoaW5zZXJ0UXVlcnksIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uaW5zZXJ0UXVlcnksXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91cGRhdGUtcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEZyb21Ob2RlIH0gZnJvbSAnLi9mcm9tLW5vZGUuanMnO1xuaW1wb3J0IHsgTGlzdE5vZGUgfSBmcm9tICcuL2xpc3Qtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVXBkYXRlUXVlcnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdVcGRhdGVRdWVyeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlcywgd2l0aE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVXBkYXRlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIHRoZSByYXcgdGFibGUgbm9kZSB3aGVuIHRoZXJlJ3Mgb25seSBvbmUgdGFibGVcbiAgICAgICAgICAgIC8vIGFuZCBkb24ndCByZW5hbWUgdGhlIHByb3BlcnR5IHRvIHNvbWV0aGluZyBsaWtlIGB0YWJsZXNgLlxuICAgICAgICAgICAgdGFibGU6IHRhYmxlcy5sZW5ndGggPT09IDEgPyB0YWJsZXNbMF0gOiBMaXN0Tm9kZS5jcmVhdGUodGFibGVzKSxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhvdXRUYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVXBkYXRlUXVlcnlOb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGcm9tSXRlbXModXBkYXRlUXVlcnksIGZyb21JdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnVwZGF0ZVF1ZXJ5LFxuICAgICAgICAgICAgZnJvbTogdXBkYXRlUXVlcnkuZnJvbVxuICAgICAgICAgICAgICAgID8gRnJvbU5vZGUuY2xvbmVXaXRoRnJvbXModXBkYXRlUXVlcnkuZnJvbSwgZnJvbUl0ZW1zKVxuICAgICAgICAgICAgICAgIDogRnJvbU5vZGUuY3JlYXRlKGZyb21JdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVXBkYXRlcyh1cGRhdGVRdWVyeSwgdXBkYXRlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnVwZGF0ZVF1ZXJ5LFxuICAgICAgICAgICAgdXBkYXRlczogdXBkYXRlUXVlcnkudXBkYXRlc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi51cGRhdGVRdWVyeS51cGRhdGVzLCAuLi51cGRhdGVzXSlcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoTGltaXQodXBkYXRlUXVlcnksIGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4udXBkYXRlUXVlcnksXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9saXN0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTGlzdE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0xpc3ROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdMaXN0Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWxldGUtcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEZyb21Ob2RlIH0gZnJvbSAnLi9mcm9tLW5vZGUuanMnO1xuaW1wb3J0IHsgVXNpbmdOb2RlIH0gZnJvbSAnLi91c2luZy1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4vcXVlcnktbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGVsZXRlUXVlcnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEZWxldGVRdWVyeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZyb21JdGVtcywgd2l0aE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRGVsZXRlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGZyb206IEZyb21Ob2RlLmNyZWF0ZShmcm9tSXRlbXMpLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXM6IChub2RlLCBpdGVtcykgPT4gUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyhub2RlLCBpdGVtcyksXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhvdXRPcmRlckJ5OiAobm9kZSkgPT4gUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkobm9kZSksXG4gICAgY2xvbmVXaXRoTGltaXQoZGVsZXRlTm9kZSwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kZWxldGVOb2RlLFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0TGltaXQoZGVsZXRlTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRlbGV0ZU5vZGUsXG4gICAgICAgICAgICBsaW1pdDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFVzaW5nKGRlbGV0ZU5vZGUsIHRhYmxlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRlbGV0ZU5vZGUsXG4gICAgICAgICAgICB1c2luZzogZGVsZXRlTm9kZS51c2luZyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBVc2luZ05vZGUuY2xvbmVXaXRoVGFibGVzKGRlbGV0ZU5vZGUudXNpbmcsIHRhYmxlcylcbiAgICAgICAgICAgICAgICA6IFVzaW5nTm9kZS5jcmVhdGUodGFibGVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91c2luZy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFVzaW5nTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVXNpbmdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVXNpbmdOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlczogZnJlZXplKHRhYmxlcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVGFibGVzKHVzaW5nLCB0YWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi51c2luZyxcbiAgICAgICAgICAgIHRhYmxlczogZnJlZXplKFsuLi51c2luZy50YWJsZXMsIC4uLnRhYmxlc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3doZXJlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBbmROb2RlIH0gZnJvbSAnLi9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBPck5vZGUgfSBmcm9tICcuL29yLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFdoZXJlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnV2hlcmVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnV2hlcmVOb2RlJyxcbiAgICAgICAgICAgIHdoZXJlOiBmaWx0ZXIsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3BlcmF0aW9uKHdoZXJlTm9kZSwgb3BlcmF0b3IsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLndoZXJlTm9kZSxcbiAgICAgICAgICAgIHdoZXJlOiBvcGVyYXRvciA9PT0gJ0FuZCdcbiAgICAgICAgICAgICAgICA/IEFuZE5vZGUuY3JlYXRlKHdoZXJlTm9kZS53aGVyZSwgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogT3JOb2RlLmNyZWF0ZSh3aGVyZU5vZGUud2hlcmUsIG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmV0dXJuaW5nLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmV0dXJuaW5nTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUmV0dXJuaW5nTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZXR1cm5pbmdOb2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IGZyZWV6ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhTZWxlY3Rpb25zKHJldHVybmluZywgc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnJldHVybmluZyxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IHJldHVybmluZy5zZWxlY3Rpb25zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnJldHVybmluZy5zZWxlY3Rpb25zLCAuLi5zZWxlY3Rpb25zXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHBsYWluLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRXhwbGFpbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0V4cGxhaW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRXhwbGFpbk5vZGUnLFxuICAgICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9tZXJnZS1xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuL3doZW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTWVyZ2VRdWVyeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ01lcmdlUXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpbnRvLCB3aXRoTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdNZXJnZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBpbnRvLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVXNpbmcobWVyZ2VOb2RlLCB1c2luZykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm1lcmdlTm9kZSxcbiAgICAgICAgICAgIHVzaW5nLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFdoZW4obWVyZ2VOb2RlLCB3aGVuKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubWVyZ2VOb2RlLFxuICAgICAgICAgICAgd2hlbnM6IG1lcmdlTm9kZS53aGVuc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5tZXJnZU5vZGUud2hlbnMsIHdoZW5dKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFt3aGVuXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVGhlbihtZXJnZU5vZGUsIHRoZW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5tZXJnZU5vZGUsXG4gICAgICAgICAgICB3aGVuczogbWVyZ2VOb2RlLndoZW5zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoW1xuICAgICAgICAgICAgICAgICAgICAuLi5tZXJnZU5vZGUud2hlbnMuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgICAgICAgICBXaGVuTm9kZS5jbG9uZVdpdGhSZXN1bHQobWVyZ2VOb2RlLndoZW5zW21lcmdlTm9kZS53aGVucy5sZW5ndGggLSAxXSwgdGhlbiksXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aGVuLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV2hlbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1doZW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb25kaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnV2hlbk5vZGUnLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFJlc3VsdCh3aGVuTm9kZSwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ud2hlbk5vZGUsXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3V0cHV0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3V0cHV0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3V0cHV0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPdXRwdXROb2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IGZyZWV6ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhTZWxlY3Rpb25zKG91dHB1dCwgc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm91dHB1dCxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IG91dHB1dC5zZWxlY3Rpb25zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLm91dHB1dC5zZWxlY3Rpb25zLCAuLi5zZWxlY3Rpb25zXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qb2luLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEpvaW5CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBvbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSm9pbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBqb2luTm9kZTogSm9pbk5vZGUuY2xvbmVXaXRoT24odGhpcy4jcHJvcHMuam9pbk5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSnVzdCBsaWtlIHtAbGluayBXaGVyZUludGVyZmFjZS53aGVyZVJlZn0gYnV0IGFkZHMgYW4gaXRlbSB0byB0aGUgam9pbidzXG4gICAgICogYG9uYCBjbGF1c2UgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgV2hlcmVJbnRlcmZhY2Uud2hlcmVSZWZ9IGZvciBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy5cbiAgICAgKi9cbiAgICBvblJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKb2luQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGpvaW5Ob2RlOiBKb2luTm9kZS5jbG9uZVdpdGhPbih0aGlzLiNwcm9wcy5qb2luTm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYG9uIHRydWVgLlxuICAgICAqL1xuICAgIG9uVHJ1ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKb2luQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGpvaW5Ob2RlOiBKb2luTm9kZS5jbG9uZVdpdGhPbih0aGlzLiNwcm9wcy5qb2luTm9kZSwgUmF3Tm9kZS5jcmVhdGVXaXRoU3FsKCd0cnVlJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5qb2luTm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL292ZXItYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IE92ZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Zlci1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4uL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VQYXJ0aXRpb25CeSwgfSBmcm9tICcuLi9wYXJzZXIvcGFydGl0aW9uLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT3ZlckJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIG9yZGVyQnkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE92ZXJCdWlsZGVyKHtcbiAgICAgICAgICAgIG92ZXJOb2RlOiBPdmVyTm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMub3Zlck5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9yZGVyQnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlckJ1aWxkZXIoe1xuICAgICAgICAgICAgb3Zlck5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5KHRoaXMuI3Byb3BzLm92ZXJOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBhcnRpdGlvbkJ5KHBhcnRpdGlvbkJ5KSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlckJ1aWxkZXIoe1xuICAgICAgICAgICAgb3Zlck5vZGU6IE92ZXJOb2RlLmNsb25lV2l0aFBhcnRpdGlvbkJ5SXRlbXModGhpcy4jcHJvcHMub3Zlck5vZGUsIHBhcnNlUGFydGl0aW9uQnkocGFydGl0aW9uQnkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMub3Zlck5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wYXJ0aXRpb24tYnktcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgUGFydGl0aW9uQnlJdGVtTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcnRpdGlvbi1ieS1pdGVtLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXJ0aXRpb25CeShwYXJ0aXRpb25CeSkge1xuICAgIHJldHVybiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QocGFydGl0aW9uQnkpLm1hcChQYXJ0aXRpb25CeUl0ZW1Ob2RlLmNyZWF0ZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BhcnRpdGlvbi1ieS1pdGVtLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUGFydGl0aW9uQnlJdGVtTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUGFydGl0aW9uQnlJdGVtTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUocGFydGl0aW9uQnkpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUGFydGl0aW9uQnlJdGVtTm9kZScsXG4gICAgICAgICAgICBwYXJ0aXRpb25CeSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9xdWVyeS1jcmVhdG9yLmQudHNcIiAvPlxuaW1wb3J0IHsgY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyLCB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9zZWxlY3QtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvaW5zZXJ0LXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRGVsZXRlUXVlcnlCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL2RlbGV0ZS1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5QnVpbGRlciB9IGZyb20gJy4vcXVlcnktYnVpbGRlci91cGRhdGUtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEZWxldGVRdWVyeU5vZGUgfSBmcm9tICcuL29wZXJhdGlvbi1ub2RlL2RlbGV0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeU5vZGUgfSBmcm9tICcuL29wZXJhdGlvbi1ub2RlL3VwZGF0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUsIHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0LCBwYXJzZUFsaWFzZWRUYWJsZSwgfSBmcm9tICcuL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb24sIH0gZnJvbSAnLi9wYXJzZXIvd2l0aC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgV2l0aE5vZGUgfSBmcm9tICcuL29wZXJhdGlvbi1ub2RlL3dpdGgtbm9kZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IFdpdGhTY2hlbWFQbHVnaW4gfSBmcm9tICcuL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgfSBmcm9tICcuL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzJztcbmltcG9ydCB7IE1lcmdlUXVlcnlCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL21lcmdlLXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgTWVyZ2VRdWVyeU5vZGUgfSBmcm9tICcuL29wZXJhdGlvbi1ub2RlL21lcmdlLXF1ZXJ5LW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIFF1ZXJ5Q3JlYXRvciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBzZWxlY3RgIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBnaXZlbiB0YWJsZSBvciB0YWJsZXMuXG4gICAgICpcbiAgICAgKiBUaGUgdGFibGVzIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBhcmUgYnVpbHQgYXMgdGhlIHF1ZXJ5J3MgYGZyb21gIGNsYXVzZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogQ3JlYXRlIGEgc2VsZWN0IHF1ZXJ5IGZvciBvbmUgdGFibGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdEFsbCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIHNlbGVjdCBxdWVyeSBmb3Igb25lIHRhYmxlIHdpdGggYW4gYWxpYXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHBlcnNvbnMgPSBhd2FpdCBkYi5zZWxlY3RGcm9tKCdwZXJzb24gYXMgcCcpXG4gICAgICogICAuc2VsZWN0KFsncC5pZCcsICdmaXJzdF9uYW1lJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwZXJzb25zWzBdLmlkKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicFwiLlwiaWRcIiwgXCJmaXJzdF9uYW1lXCIgZnJvbSBcInBlcnNvblwiIGFzIFwicFwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBzZWxlY3QgcXVlcnkgZnJvbSBhIHN1YnF1ZXJ5OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwZXJzb25zID0gYXdhaXQgZGIuc2VsZWN0RnJvbShcbiAgICAgKiAgICAgKGViKSA9PiBlYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoJ3BlcnNvbi5pZCBhcyBpZGVudGlmaWVyJykuYXMoJ3AnKVxuICAgICAqICAgKVxuICAgICAqICAgLnNlbGVjdCgncC5pZGVudGlmaWVyJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHBlcnNvbnNbMF0uaWRlbnRpZmllcilcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcInBcIi5cImlkZW50aWZpZXJcIixcbiAgICAgKiBmcm9tIChcbiAgICAgKiAgIHNlbGVjdCBcInBlcnNvblwiLlwiaWRcIiBhcyBcImlkZW50aWZpZXJcIiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiApIGFzIHBcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIHNlbGVjdCBxdWVyeSBmcm9tIHJhdyBzcWw6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgaXRlbXMgPSBhd2FpdCBkYlxuICAgICAqICAgLnNlbGVjdEZyb20oc3FsPHsgb25lOiBudW1iZXIgfT5gKHNlbGVjdCAxIGFzIG9uZSlgLmFzKCdxJykpXG4gICAgICogICAuc2VsZWN0KCdxLm9uZScpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhpdGVtc1swXS5vbmUpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJxXCIuXCJvbmVcIixcbiAgICAgKiBmcm9tIChcbiAgICAgKiAgIHNlbGVjdCAxIGFzIG9uZVxuICAgICAqICkgYXMgcVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogV2hlbiB5b3UgdXNlIHRoZSBgc3FsYCB0YWcgeW91IG5lZWQgdG8gYWxzbyBwcm92aWRlIHRoZSByZXN1bHQgdHlwZSBvZiB0aGVcbiAgICAgKiByYXcgc25pcHBldCAvIHF1ZXJ5IHNvIHRoYXQgS3lzZWx5IGNhbiBmaWd1cmUgb3V0IHdoYXQgY29sdW1ucyBhcmVcbiAgICAgKiBhdmFpbGFibGUgZm9yIHRoZSByZXN0IG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoZSBgc2VsZWN0RnJvbWAgbWV0aG9kIGFsc28gYWNjZXB0cyBhbiBhcnJheSBmb3IgbXVsdGlwbGUgdGFibGVzLiBBbGxcbiAgICAgKiB0aGUgYWJvdmUgZXhhbXBsZXMgY2FuIGFsc28gYmUgdXNlZCBpbiBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBpdGVtcyA9IGF3YWl0IGRiLnNlbGVjdEZyb20oW1xuICAgICAqICAgICAncGVyc29uIGFzIHAnLFxuICAgICAqICAgICBkYi5zZWxlY3RGcm9tKCdwZXQnKS5zZWxlY3QoJ3BldC5zcGVjaWVzJykuYXMoJ2EnKSxcbiAgICAgKiAgICAgc3FsPHsgb25lOiBudW1iZXIgfT5gKHNlbGVjdCAxIGFzIG9uZSlgLmFzKCdxJylcbiAgICAgKiAgIF0pXG4gICAgICogICAuc2VsZWN0KFsncC5pZCcsICdhLnNwZWNpZXMnLCAncS5vbmUnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcInBcIi5pZCwgXCJhXCIuXCJzcGVjaWVzXCIsIFwicVwiLlwib25lXCJcbiAgICAgKiBmcm9tXG4gICAgICogICBcInBlcnNvblwiIGFzIFwicFwiLFxuICAgICAqICAgKHNlbGVjdCBcInBldFwiLlwic3BlY2llc1wiIGZyb20gXCJwZXRcIikgYXMgYSxcbiAgICAgKiAgIChzZWxlY3QgMSBhcyBvbmUpIGFzIFwicVwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2VsZWN0RnJvbShmcm9tKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY3JlYXRlRnJvbShwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdChmcm9tKSwgdGhpcy4jcHJvcHMud2l0aE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VsZWN0Tm9Gcm9tKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNlbGVjdGlvbnMoU2VsZWN0UXVlcnlOb2RlLmNyZWF0ZSh0aGlzLiNwcm9wcy53aXRoTm9kZSksIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnNlcnQgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgcXVlcnkgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEluc2VydFJlc3VsdH0uIHtAbGluayBJbnNlcnRSZXN1bHR9XG4gICAgICogaGFzIHRoZSB7QGxpbmsgSW5zZXJ0UmVzdWx0Lmluc2VydElkIHwgaW5zZXJ0SWR9IGZpZWxkIHRoYXQgaG9sZHMgdGhlIGF1dG8gaW5jcmVtZW50ZWQgaWQgb2ZcbiAgICAgKiB0aGUgaW5zZXJ0ZWQgcm93IGlmIHRoZSBkYiByZXR1cm5lZCBvbmUuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayBJbnNlcnRRdWVyeUJ1aWxkZXIudmFsdWVzIHwgdmFsdWVzfSBtZXRob2QgZm9yIG1vcmUgaW5mbyBhbmQgZXhhbXBsZXMuIEFsc28gc2VlXG4gICAgICogdGhlIHtAbGluayBSZXR1cm5pbmdJbnRlcmZhY2UucmV0dXJuaW5nIHwgcmV0dXJuaW5nfSBtZXRob2QgZm9yIGEgd2F5IHRvIHJldHVybiBjb2x1bW5zXG4gICAgICogb24gc3VwcG9ydGVkIGRhdGFiYXNlcyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3QoKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0Lmluc2VydElkKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU29tZSBkYXRhYmFzZXMgbGlrZSBQb3N0Z3JlU1FMIHN1cHBvcnQgdGhlIGByZXR1cm5pbmdgIG1ldGhvZDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgeyBpZCB9ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nXG4gICAgICogICB9KVxuICAgICAqICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpbnNlcnRJbnRvKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSwgdGhpcy4jcHJvcHMud2l0aE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFwicmVwbGFjZSBpbnRvXCIgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNeVNRTCBvciBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIE15U1FMJ3Mge0BsaW5rIEluc2VydFF1ZXJ5QnVpbGRlci5vbkR1cGxpY2F0ZUtleVVwZGF0ZX0gdGhhdCBkZWxldGVzXG4gICAgICogYW5kIGluc2VydHMgdmFsdWVzIG9uIGNvbGxpc2lvbiBpbnN0ZWFkIG9mIHVwZGF0aW5nIGV4aXN0aW5nIHJvd3MuXG4gICAgICpcbiAgICAgKiBBbiBhbGlhcyBvZiBTUUxpdGUncyB7QGxpbmsgSW5zZXJ0UXVlcnlCdWlsZGVyLm9yUmVwbGFjZX0uXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgcXVlcnkgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEluc2VydFJlc3VsdH0uIHtAbGluayBJbnNlcnRSZXN1bHR9XG4gICAgICogaGFzIHRoZSB7QGxpbmsgSW5zZXJ0UmVzdWx0Lmluc2VydElkIHwgaW5zZXJ0SWR9IGZpZWxkIHRoYXQgaG9sZHMgdGhlIGF1dG8gaW5jcmVtZW50ZWQgaWQgb2ZcbiAgICAgKiB0aGUgaW5zZXJ0ZWQgcm93IGlmIHRoZSBkYiByZXR1cm5lZCBvbmUuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayBJbnNlcnRRdWVyeUJ1aWxkZXIudmFsdWVzIHwgdmFsdWVzfSBtZXRob2QgZm9yIG1vcmUgaW5mbyBhbmQgZXhhbXBsZXMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5yZXBsYWNlSW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJ1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQuaW5zZXJ0SWQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogcmVwbGFjZSBpbnRvIGBwZXJzb25gIChgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgKSB2YWx1ZXMgKD8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcmVwbGFjZUludG8odGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpLCB0aGlzLiNwcm9wcy53aXRoTm9kZSwgdHJ1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVsZXRlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgRGVsZXRlUXVlcnlCdWlsZGVyLndoZXJlfSBtZXRob2QgZm9yIGV4YW1wbGVzIG9uIGhvdyB0byBzcGVjaWZ5XG4gICAgICogYSB3aGVyZSBjbGF1c2UgZm9yIHRoZSBkZWxldGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcXVlcnkgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERlbGV0ZVJlc3VsdH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJkZWxldGVcIiwgXCJTaW5nbGUgcm93XCIsIDEwKSAtLT5cbiAgICAgKlxuICAgICAqIERlbGV0ZSBhIHNpbmdsZSByb3c6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC53aGVyZSgncGVyc29uLmlkJywgJz0nLCAxKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3QoKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0Lm51bURlbGV0ZWRSb3dzKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIGZyb20gXCJwZXJzb25cIiB3aGVyZSBcInBlcnNvblwiLlwiaWRcIiA9ICQxXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTb21lIGRhdGFiYXNlcyBzdWNoIGFzIE15U1FMIHN1cHBvcnQgZGVsZXRpbmcgZnJvbSBtdWx0aXBsZSB0YWJsZXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuZGVsZXRlRnJvbShbJ3BlcnNvbicsICdwZXQnXSlcbiAgICAgKiAgIC51c2luZygncGVyc29uJylcbiAgICAgKiAgIC5pbm5lckpvaW4oJ3BldCcsICdwZXQub3duZXJfaWQnLCAncGVyc29uLmlkJylcbiAgICAgKiAgIC53aGVyZSgncGVyc29uLmlkJywgJz0nLCAxKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3QoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIGBwZXJzb25gLCBgcGV0YFxuICAgICAqIHVzaW5nIGBwZXJzb25gXG4gICAgICogaW5uZXIgam9pbiBgcGV0YCBvbiBgcGV0YC5gb3duZXJfaWRgID0gYHBlcnNvbmAuYGlkYFxuICAgICAqIHdoZXJlIGBwZXJzb25gLmBpZGAgPSA/XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZGVsZXRlRnJvbShmcm9tKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogRGVsZXRlUXVlcnlOb2RlLmNyZWF0ZShwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdChmcm9tKSwgdGhpcy4jcHJvcHMud2l0aE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB1cGRhdGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayBVcGRhdGVRdWVyeUJ1aWxkZXIud2hlcmV9IG1ldGhvZCBmb3IgZXhhbXBsZXMgb24gaG93IHRvIHNwZWNpZnlcbiAgICAgKiBhIHdoZXJlIGNsYXVzZSBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayBVcGRhdGVRdWVyeUJ1aWxkZXIuc2V0fSBtZXRob2QgZm9yIGV4YW1wbGVzIG9uIGhvdyB0b1xuICAgICAqIHNwZWNpZnkgdGhlIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBxdWVyeSBpcyBhbiB7QGxpbmsgVXBkYXRlUmVzdWx0fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGZpcnN0X25hbWU6ICdKZW5uaWZlcicgfSlcbiAgICAgKiAgIC53aGVyZSgncGVyc29uLmlkJywgJz0nLCAxKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3QoKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0Lm51bVVwZGF0ZWRSb3dzKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHVwZGF0ZVRhYmxlKHRhYmxlcykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFVwZGF0ZVF1ZXJ5Tm9kZS5jcmVhdGUocGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QodGFibGVzKSwgdGhpcy4jcHJvcHMud2l0aE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1lcmdlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcXVlcnkgaXMgYSB7QGxpbmsgTWVyZ2VSZXN1bHR9LlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgTWVyZ2VRdWVyeUJ1aWxkZXIudXNpbmd9IG1ldGhvZCBmb3IgZXhhbXBsZXMgb24gaG93IHRvIHNwZWNpZnlcbiAgICAgKiB0aGUgb3RoZXIgdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJtZXJnZVwiLCBcIlNvdXJjZSByb3cgZXhpc3RlbmNlXCIsIDEwKSAtLT5cbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIHRhcmdldCBjb2x1bW4gYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZiBhIHNvdXJjZSByb3c6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAubWVyZ2VJbnRvKCdwZXJzb24gYXMgdGFyZ2V0JylcbiAgICAgKiAgIC51c2luZygncGV0IGFzIHNvdXJjZScsICdzb3VyY2Uub3duZXJfaWQnLCAndGFyZ2V0LmlkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZEFuZCgndGFyZ2V0Lmhhc19wZXRzJywgJyE9JywgJ1knKVxuICAgICAqICAgLnRoZW5VcGRhdGVTZXQoeyBoYXNfcGV0czogJ1knIH0pXG4gICAgICogICAud2hlbk5vdE1hdGNoZWRCeVNvdXJjZUFuZCgndGFyZ2V0Lmhhc19wZXRzJywgJz0nLCAnWScpXG4gICAgICogICAudGhlblVwZGF0ZVNldCh7IGhhc19wZXRzOiAnTicgfSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQubnVtQ2hhbmdlZFJvd3MpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiXG4gICAgICogb24gXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCBhbmQgXCJoYXNfcGV0c1wiICE9ICQxXG4gICAgICogdGhlbiB1cGRhdGUgc2V0IFwiaGFzX3BldHNcIiA9ICQyXG4gICAgICogd2hlbiBub3QgbWF0Y2hlZCBieSBzb3VyY2UgYW5kIFwiaGFzX3BldHNcIiA9ICQzXG4gICAgICogdGhlbiB1cGRhdGUgc2V0IFwiaGFzX3BldHNcIiA9ICQ0XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwibWVyZ2VcIiwgXCJUZW1wb3JhcnkgY2hhbmdlcyB0YWJsZVwiLCAyMCkgLS0+XG4gICAgICpcbiAgICAgKiBNZXJnZSBuZXcgZW50cmllcyBmcm9tIGEgdGVtcG9yYXJ5IGNoYW5nZXMgdGFibGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAubWVyZ2VJbnRvKCd3aW5lIGFzIHRhcmdldCcpXG4gICAgICogICAudXNpbmcoXG4gICAgICogICAgICd3aW5lX3N0b2NrX2NoYW5nZSBhcyBzb3VyY2UnLFxuICAgICAqICAgICAnc291cmNlLndpbmVfbmFtZScsXG4gICAgICogICAgICd0YXJnZXQubmFtZScsXG4gICAgICogICApXG4gICAgICogICAud2hlbk5vdE1hdGNoZWRBbmQoJ3NvdXJjZS5zdG9ja19kZWx0YScsICc+JywgMClcbiAgICAgKiAgIC50aGVuSW5zZXJ0VmFsdWVzKCh7IHJlZiB9KSA9PiAoe1xuICAgICAqICAgICBuYW1lOiByZWYoJ3NvdXJjZS53aW5lX25hbWUnKSxcbiAgICAgKiAgICAgc3RvY2s6IHJlZignc291cmNlLnN0b2NrX2RlbHRhJyksXG4gICAgICogICB9KSlcbiAgICAgKiAgIC53aGVuTWF0Y2hlZEFuZChcbiAgICAgKiAgICAgKGViKSA9PiBlYigndGFyZ2V0LnN0b2NrJywgJysnLCBlYi5yZWYoJ3NvdXJjZS5zdG9ja19kZWx0YScpKSxcbiAgICAgKiAgICAgJz4nLFxuICAgICAqICAgICAwLFxuICAgICAqICAgKVxuICAgICAqICAgLnRoZW5VcGRhdGVTZXQoJ3N0b2NrJywgKGViKSA9PlxuICAgICAqICAgICBlYigndGFyZ2V0LnN0b2NrJywgJysnLCBlYi5yZWYoJ3NvdXJjZS5zdG9ja19kZWx0YScpKSxcbiAgICAgKiAgIClcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRlbGV0ZSgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcIndpbmVcIiBhcyBcInRhcmdldFwiXG4gICAgICogdXNpbmcgXCJ3aW5lX3N0b2NrX2NoYW5nZVwiIGFzIFwic291cmNlXCJcbiAgICAgKiBvbiBcInNvdXJjZVwiLlwid2luZV9uYW1lXCIgPSBcInRhcmdldFwiLlwibmFtZVwiXG4gICAgICogd2hlbiBub3QgbWF0Y2hlZCBhbmQgXCJzb3VyY2VcIi5cInN0b2NrX2RlbHRhXCIgPiAkMVxuICAgICAqIHRoZW4gaW5zZXJ0IChcIm5hbWVcIiwgXCJzdG9ja1wiKSB2YWx1ZXMgKFwic291cmNlXCIuXCJ3aW5lX25hbWVcIiwgXCJzb3VyY2VcIi5cInN0b2NrX2RlbHRhXCIpXG4gICAgICogd2hlbiBtYXRjaGVkIGFuZCBcInRhcmdldFwiLlwic3RvY2tcIiArIFwic291cmNlXCIuXCJzdG9ja19kZWx0YVwiID4gJDJcbiAgICAgKiB0aGVuIHVwZGF0ZSBzZXQgXCJzdG9ja1wiID0gXCJ0YXJnZXRcIi5cInN0b2NrXCIgKyBcInNvdXJjZVwiLlwic3RvY2tfZGVsdGFcIlxuICAgICAqIHdoZW4gbWF0Y2hlZFxuICAgICAqIHRoZW4gZGVsZXRlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbWVyZ2VJbnRvKHRhcmdldFRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBNZXJnZVF1ZXJ5Tm9kZS5jcmVhdGUocGFyc2VBbGlhc2VkVGFibGUodGFyZ2V0VGFibGUpLCB0aGlzLiNwcm9wcy53aXRoTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYHdpdGhgIHF1ZXJ5IChDb21tb24gVGFibGUgRXhwcmVzc2lvbikuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJjdGVcIiwgXCJTaW1wbGUgc2VsZWN0c1wiLCAxMCkgLS0+XG4gICAgICpcbiAgICAgKiBDb21tb24gdGFibGUgZXhwcmVzc2lvbnMgKENURSkgYXJlIGEgZ3JlYXQgd2F5IHRvIG1vZHVsYXJpemUgY29tcGxleCBxdWVyaWVzLlxuICAgICAqIEVzc2VudGlhbGx5IHRoZXkgYWxsb3cgeW91IHRvIHJ1biBtdWx0aXBsZSBzZXBhcmF0ZSBxdWVyaWVzIHdpdGhpbiBhXG4gICAgICogc2luZ2xlIHJvdW5kdHJpcCB0byB0aGUgREIuXG4gICAgICpcbiAgICAgKiBTaW5jZSBDVEVzIGFyZSBhIHBhcnQgb2YgdGhlIG1haW4gcXVlcnksIHF1ZXJ5IG9wdGltaXplcnMgaW5zaWRlIERCXG4gICAgICogZW5naW5lcyBhcmUgYWJsZSB0byBvcHRpbWl6ZSB0aGUgb3ZlcmFsbCBxdWVyeS4gRm9yIGV4YW1wbGUsIHBvc3RncmVzXG4gICAgICogaXMgYWJsZSB0byBpbmxpbmUgdGhlIENURXMgaW5zaWRlIHRoZSB1c2luZyBxdWVyaWVzIGlmIGl0IGRlY2lkZXMgaXQnc1xuICAgICAqIGZhc3Rlci5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC8vIENyZWF0ZSBhIENURSBjYWxsZWQgYGplbm5pZmVyc2AgdGhhdCBzZWxlY3RzIGFsbFxuICAgICAqICAgLy8gcGVyc29ucyBuYW1lZCAnSmVubmlmZXInLlxuICAgICAqICAgLndpdGgoJ2plbm5pZmVycycsIChkYikgPT4gZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0plbm5pZmVyJylcbiAgICAgKiAgICAgLnNlbGVjdChbJ2lkJywgJ2FnZSddKVxuICAgICAqICAgKVxuICAgICAqICAgLy8gU2VsZWN0IGFsbCByb3dzIGZyb20gdGhlIGBqZW5uaWZlcnNgIENURSBhbmRcbiAgICAgKiAgIC8vIGZ1cnRoZXIgZmlsdGVyIGl0LlxuICAgICAqICAgLndpdGgoJ2FkdWx0X2plbm5pZmVycycsIChkYikgPT4gZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ2plbm5pZmVycycpXG4gICAgICogICAgIC53aGVyZSgnYWdlJywgJz4nLCAxOClcbiAgICAgKiAgICAgLnNlbGVjdChbJ2lkJywgJ2FnZSddKVxuICAgICAqICAgKVxuICAgICAqICAgLy8gRmluYWxseSBzZWxlY3QgYWxsIGFkdWx0IGplbm5pZmVycyB0aGF0IGFyZVxuICAgICAqICAgLy8gYWxzbyB5b3VuZ2VyIHRoYW4gNjAuXG4gICAgICogICAuc2VsZWN0RnJvbSgnYWR1bHRfamVubmlmZXJzJylcbiAgICAgKiAgIC53aGVyZSgnYWdlJywgJzwnLCA2MClcbiAgICAgKiAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImN0ZVwiLCBcIkluc2VydHMsIHVwZGF0ZXMgYW5kIGRlbGV0aW9uc1wiLCAyMCkgLS0+XG4gICAgICpcbiAgICAgKiBTb21lIGRhdGFiYXNlcyBsaWtlIHBvc3RncmVzIGFsc28gYWxsb3cgeW91IHRvIHJ1biBvdGhlciBxdWVyaWVzIHRoYW4gc2VsZWN0c1xuICAgICAqIGluIENURXMuIE9uIHRoZXNlIGRhdGFiYXNlcyBDVEVzIGFyZSBleHRyZW1lbHkgcG93ZXJmdWw6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAud2l0aCgnbmV3X3BlcnNvbicsIChkYikgPT4gZGJcbiAgICAgKiAgICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgICAgYWdlOiAzNSxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgKVxuICAgICAqICAgLndpdGgoJ25ld19wZXQnLCAoZGIpID0+IGRiXG4gICAgICogICAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBuYW1lOiAnRG9nZ28nLFxuICAgICAqICAgICAgIHNwZWNpZXM6ICdkb2cnLFxuICAgICAqICAgICAgIGlzX2Zhdm9yaXRlOiB0cnVlLFxuICAgICAqICAgICAgIC8vIFVzZSB0aGUgaWQgb2YgdGhlIHBlcnNvbiB3ZSBqdXN0IGluc2VydGVkLlxuICAgICAqICAgICAgIG93bmVyX2lkOiBkYlxuICAgICAqICAgICAgICAgLnNlbGVjdEZyb20oJ25ld19wZXJzb24nKVxuICAgICAqICAgICAgICAgLnNlbGVjdCgnaWQnKVxuICAgICAqICAgICB9KVxuICAgICAqICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICApXG4gICAgICogICAuc2VsZWN0RnJvbShbJ25ld19wZXJzb24nLCAnbmV3X3BldCddKVxuICAgICAqICAgLnNlbGVjdChbXG4gICAgICogICAgICduZXdfcGVyc29uLmlkIGFzIHBlcnNvbl9pZCcsXG4gICAgICogICAgICduZXdfcGV0LmlkIGFzIHBldF9pZCdcbiAgICAgKiAgIF0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgQ1RFIG5hbWUgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBjb2x1bW4gbmFtZXMgaW4gYWRkaXRpb24gdG9cbiAgICAgKiBhIG5hbWUuIEluIHRoYXQgY2FzZSBLeXNlbHkgcmVxdWlyZXMgdGhlIGV4cHJlc3Npb24gdG8gcmV0dW5cbiAgICAgKiByb3dzIHdpdGggdGhlIHNhbWUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoKCdqZW5uaWZlcnMoaWQsIGFnZSknLCAoZGIpID0+IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKZW5uaWZlcicpXG4gICAgICogICAgIC8vIFRoaXMgaXMgb2sgc2luY2Ugd2UgcmV0dXJuIGNvbHVtbnMgd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAvLyBuYW1lcyBhcyBzcGVjaWZpZWQgYnkgYGplbm5pZmVycyhpZCwgYWdlKWAuXG4gICAgICogICAgIC5zZWxlY3QoWydpZCcsICdhZ2UnXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdqZW5uaWZlcnMnKVxuICAgICAqICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGFsc28gYmUgYSBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIGlzIHBhc3NlZFxuICAgICAqIGEgYENURUJ1aWxkZXJgIGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBDVEU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAud2l0aChcbiAgICAgKiAgICAgKGN0ZSkgPT4gY3RlKCdqZW5uaWZlcnMnKS5tYXRlcmlhbGl6ZWQoKSxcbiAgICAgKiAgICAgKGRiKSA9PiBkYlxuICAgICAqICAgICAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0plbm5pZmVyJylcbiAgICAgKiAgICAgICAuc2VsZWN0KFsnaWQnLCAnYWdlJ10pXG4gICAgICogICApXG4gICAgICogICAuc2VsZWN0RnJvbSgnamVubmlmZXJzJylcbiAgICAgKiAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHdpdGgobmFtZU9yQnVpbGRlciwgZXhwcmVzc2lvbikge1xuICAgICAgICBjb25zdCBjdGUgPSBwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbihuYW1lT3JCdWlsZGVyLCBleHByZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICB3aXRoTm9kZTogdGhpcy4jcHJvcHMud2l0aE5vZGVcbiAgICAgICAgICAgICAgICA/IFdpdGhOb2RlLmNsb25lV2l0aEV4cHJlc3Npb24odGhpcy4jcHJvcHMud2l0aE5vZGUsIGN0ZSlcbiAgICAgICAgICAgICAgICA6IFdpdGhOb2RlLmNyZWF0ZShjdGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlY3Vyc2l2ZSBgd2l0aGAgcXVlcnkgKENvbW1vbiBUYWJsZSBFeHByZXNzaW9uKS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCByZWN1cnNpdmVuZXNzIGlzIGEgcHJvcGVydHkgb2YgdGhlIHdob2xlIGB3aXRoYCBzdGF0ZW1lbnQuXG4gICAgICogWW91IGNhbm5vdCBoYXZlIHJlY3Vyc2l2ZSBhbmQgbm9uLXJlY3Vyc2l2ZSBDVEVzIGluIGEgc2FtZSBgd2l0aGAgc3RhdGVtZW50LlxuICAgICAqIFRoZXJlZm9yZSB0aGUgcmVjdXJzaXZlbmVzcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSAqKmZpcnN0KiogYHdpdGhgIG9yXG4gICAgICogYHdpdGhSZWN1c2l2ZWAgY2FsbCB5b3UgbWFrZS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIHdpdGh9IG1ldGhvZCBmb3IgZXhhbXBsZXMgYW5kIG1vcmUgZG9jdW1lbnRhdGlvbi5cbiAgICAgKi9cbiAgICB3aXRoUmVjdXJzaXZlKG5hbWVPckJ1aWxkZXIsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgY29uc3QgY3RlID0gcGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb24obmFtZU9yQnVpbGRlciwgZXhwcmVzc2lvbik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgd2l0aE5vZGU6IHRoaXMuI3Byb3BzLndpdGhOb2RlXG4gICAgICAgICAgICAgICAgPyBXaXRoTm9kZS5jbG9uZVdpdGhFeHByZXNzaW9uKHRoaXMuI3Byb3BzLndpdGhOb2RlLCBjdGUpXG4gICAgICAgICAgICAgICAgOiBXaXRoTm9kZS5jcmVhdGUoY3RlLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgcXVlcnkgY3JlYXRvciBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaW5zdGFsbGVkLlxuICAgICAqL1xuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgcXVlcnkgY3JlYXRvciBpbnN0YW5jZSB3aXRob3V0IGFueSBwbHVnaW5zLlxuICAgICAqL1xuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5Q3JlYXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRob3V0UGx1Z2lucygpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2NoZW1hIHRvIGJlIHVzZWQgZm9yIGFsbCB0YWJsZSByZWZlcmVuY2VzIHRoYXQgZG9uJ3QgZXhwbGljaXRseVxuICAgICAqIHNwZWNpZnkgYSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgYWZmZWN0cyB0aGUgcXVlcnkgY3JlYXRlZCB0aHJvdWdoIHRoZSBidWlsZGVyIHJldHVybmVkIGZyb21cbiAgICAgKiB0aGlzIG1ldGhvZCBhbmQgZG9lc24ndCBtb2RpZnkgdGhlIGBkYmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBTZWUgW3RoaXMgcmVjaXBlXShodHRwczovL2dpdGh1Yi5jb20va3lzZWx5LW9yZy9reXNlbHkvYmxvYi9tYXN0ZXIvc2l0ZS9kb2NzL3JlY2lwZXMvMDAwNy1zY2hlbWFzLm1kKVxuICAgICAqIGZvciBhIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAud2l0aFNjaGVtYSgnbWFtbWFscycpXG4gICAgICogICAuc2VsZWN0RnJvbSgncGV0JylcbiAgICAgKiAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgLmlubmVySm9pbigncHVibGljLnBlcnNvbicsICdwdWJsaWMucGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgKiBmcm9tIFwibWFtbWFsc1wiLlwicGV0XCJcbiAgICAgKiBpbm5lciBqb2luIFwicHVibGljXCIuXCJwZXJzb25cIlxuICAgICAqIG9uIFwicHVibGljXCIuXCJwZXJzb25cIi5cImlkXCIgPSBcIm1hbW1hbHNcIi5cInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYHdpdGhTY2hlbWFgIGlzIHNtYXJ0IGVub3VnaCB0byBub3QgYWRkIHNjaGVtYSBmb3IgYWxpYXNlcyxcbiAgICAgKiBjb21tb24gdGFibGUgZXhwcmVzc2lvbnMgb3Igb3RoZXIgcGxhY2VzIHdoZXJlIHRoZSBzY2hlbWFcbiAgICAgKiBkb2Vzbid0IGJlbG9uZyB0bzpcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAud2l0aFNjaGVtYSgnbWFtbWFscycpXG4gICAgICogICAuc2VsZWN0RnJvbSgncGV0IGFzIHAnKVxuICAgICAqICAgLnNlbGVjdCgncC5uYW1lJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcInBcIi5cIm5hbWVcIiBmcm9tIFwibWFtbWFsc1wiLlwicGV0XCIgYXMgXCJwXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5Q3JlYXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbnNlcnQtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IHBhcnNlU2VsZWN0QXJnLCBwYXJzZVNlbGVjdEFsbCwgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUluc2VydEV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2luc2VydC12YWx1ZXMtcGFyc2VyLmpzJztcbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2luc2VydC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci91cGRhdGUtc2V0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBPbkR1cGxpY2F0ZUtleU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vbi1kdXBsaWNhdGUta2V5LW5vZGUuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UmVzdWx0IH0gZnJvbSAnLi9pbnNlcnQtcmVzdWx0LmpzJztcbmltcG9ydCB7IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yLCBOb1Jlc3VsdEVycm9yLCB9IGZyb20gJy4vbm8tcmVzdWx0LWVycm9yLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IE9uQ29uZmxpY3RCdWlsZGVyLCB9IGZyb20gJy4vb24tY29uZmxpY3QtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBPbkNvbmZsaWN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29uLWNvbmZsaWN0LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUb3AgfSBmcm9tICcuLi9wYXJzZXIvdG9wLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBPckFjdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vci1hY3Rpb24tbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgSW5zZXJ0UXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZXMgdG8gaW5zZXJ0IGZvciBhbiB7QGxpbmsgS3lzZWx5Lmluc2VydEludG8gfCBpbnNlcnR9IHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdGFrZXMgYW4gb2JqZWN0IHdob3NlIGtleXMgYXJlIGNvbHVtbiBuYW1lcyBhbmQgdmFsdWVzIGFyZVxuICAgICAqIHZhbHVlcyB0byBpbnNlcnQuIEluIGFkZGl0aW9uIHRvIHRoZSBjb2x1bW4ncyB0eXBlLCB0aGUgdmFsdWVzIGNhbiBiZVxuICAgICAqIHJhdyB7QGxpbmsgc3FsfSBzbmlwcGV0cyBvciBzZWxlY3QgcXVlcmllcy5cbiAgICAgKlxuICAgICAqIFlvdSBtdXN0IHByb3ZpZGUgYWxsIGZpZWxkcyB5b3UgaGF2ZW4ndCBleHBsaWNpdGx5IG1hcmtlZCBhcyBudWxsYWJsZVxuICAgICAqIG9yIG9wdGlvbmFsIHVzaW5nIHtAbGluayBHZW5lcmF0ZWR9IG9yIHtAbGluayBDb2x1bW5UeXBlfS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgYW4gYGluc2VydGAgcXVlcnkgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEluc2VydFJlc3VsdH0uIFRoZVxuICAgICAqIHtAbGluayBJbnNlcnRSZXN1bHQuaW5zZXJ0SWQgfCBpbnNlcnRJZH0gZmllbGQgaG9sZHMgdGhlIGF1dG8gaW5jcmVtZW50ZWQgcHJpbWFyeVxuICAgICAqIGtleSBpZiB0aGUgZGF0YWJhc2UgcmV0dXJuZWQgb25lLlxuICAgICAqXG4gICAgICogT24gUG9zdGdyZVNRTCBhbmQgc29tZSBvdGhlciBkaWFsZWN0cywgeW91IG5lZWQgdG8gY2FsbCBgcmV0dXJuaW5nYCB0byBnZXRcbiAgICAgKiBzb21ldGhpbmcgb3V0IG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgZXhwcmVzc2lvbn0gbWV0aG9kIGZvciBpbnNlcnRpbmcgdGhlIHJlc3VsdCBvZiBhIHNlbGVjdFxuICAgICAqIHF1ZXJ5IG9yIGFueSBvdGhlciBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiaW5zZXJ0XCIsIFwiU2luZ2xlIHJvd1wiLCAxMCkgLS0+XG4gICAgICpcbiAgICAgKiBJbnNlcnQgYSBzaW5nbGUgcm93OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgIGFnZTogNDBcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICpcbiAgICAgKiAvLyBgaW5zZXJ0SWRgIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGRpYWxlY3RzIHRoYXRcbiAgICAgKiAvLyBhdXRvbWF0aWNhbGx5IHJldHVybiB0aGUgaWQgb2YgdGhlIGluc2VydGVkIHJvd1xuICAgICAqIC8vIHN1Y2ggYXMgTXlTUUwgYW5kIFNRTGl0ZS4gT24gUG9zdGdyZVNRTCwgZm9yIGV4YW1wbGUsXG4gICAgICogLy8geW91IG5lZWQgdG8gYWRkIGEgYHJldHVybmluZ2AgY2xhdXNlIHRvIHRoZSBxdWVyeSB0b1xuICAgICAqIC8vIGdldCBhbnl0aGluZyBvdXQuIFNlZSB0aGUgXCJyZXR1cm5pbmcgZGF0YVwiIGV4YW1wbGUuXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0Lmluc2VydElkKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIGBwZXJzb25gIChgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCkgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImluc2VydFwiLCBcIk11bHRpcGxlIHJvd3NcIiwgMjApIC0tPlxuICAgICAqXG4gICAgICogT24gZGlhbGVjdHMgdGhhdCBzdXBwb3J0IGl0IChmb3IgZXhhbXBsZSBQb3N0Z3JlU1FMKSB5b3UgY2FuIGluc2VydCBtdWx0aXBsZVxuICAgICAqIHJvd3MgYnkgcHJvdmlkaW5nIGFuIGFycmF5LiBOb3RlIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyBvbmNlIGFnYWluIHZlcnlcbiAgICAgKiBkaWFsZWN0LXNwZWNpZmljLiBTb21lIGRhdGFiYXNlcyBtYXkgb25seSByZXR1cm4gdGhlIGlkIG9mIHRoZSAqbGFzdCogaW5zZXJ0ZWRcbiAgICAgKiByb3cgYW5kIHNvbWUgcmV0dXJuIG5vdGhpbmcgYXQgYWxsIHVubGVzcyB5b3UgY2FsbCBgcmV0dXJuaW5nYC5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyhbe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJyxcbiAgICAgKiAgICAgYWdlOiA0MCxcbiAgICAgKiAgIH0sIHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0Fybm9sZCcsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ1NjaHdhcnplbmVnZ2VyJyxcbiAgICAgKiAgICAgYWdlOiA3MCxcbiAgICAgKiAgIH1dKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiYWdlXCIpIHZhbHVlcyAoKCQxLCAkMiwgJDMpLCAoJDQsICQ1LCAkNikpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiaW5zZXJ0XCIsIFwiUmV0dXJuaW5nIGRhdGFcIiwgMzApIC0tPlxuICAgICAqXG4gICAgICogT24gc3VwcG9ydGVkIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCB5b3UgbmVlZCB0byBjaGFpbiBgcmV0dXJuaW5nYCB0byB0aGUgcXVlcnkgdG8gZ2V0XG4gICAgICogdGhlIGluc2VydGVkIHJvdydzIGNvbHVtbnMgKG9yIGFueSBvdGhlciBleHByZXNzaW9uKSBhcyB0aGUgcmV0dXJuIHZhbHVlLiBgcmV0dXJuaW5nYFxuICAgICAqIHdvcmtzIGp1c3QgbGlrZSBgc2VsZWN0YC4gUmVmZXIgdG8gYHNlbGVjdGAgbWV0aG9kJ3MgZXhhbXBsZXMgYW5kIGRvY3VtZW50YXRpb24gZm9yXG4gICAgICogbW9yZSBpbmZvLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgIGFnZTogNDAsXG4gICAgICogICB9KVxuICAgICAqICAgLnJldHVybmluZyhbJ2lkJywgJ2ZpcnN0X25hbWUgYXMgbmFtZSddKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImFnZVwiKSB2YWx1ZXMgKCQxLCAkMiwgJDMpIHJldHVybmluZyBcImlkXCIsIFwiZmlyc3RfbmFtZVwiIGFzIFwibmFtZVwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiaW5zZXJ0XCIsIFwiQ29tcGxleCB2YWx1ZXNcIiwgNDApIC0tPlxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gcHJpbWl0aXZlcywgdGhlIHZhbHVlcyBjYW4gYWxzbyBiZSBhcmJpdHJhcnkgZXhwcmVzc2lvbnMuXG4gICAgICogWW91IGNhbiBidWlsZCB0aGUgZXhwcmVzc2lvbnMgYnkgdXNpbmcgYSBjYWxsYmFjayBhbmQgY2FsbGluZyB0aGUgbWV0aG9kc1xuICAgICAqIG9uIHRoZSBleHByZXNzaW9uIGJ1aWxkZXIgcGFzc2VkIHRvIGl0OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBhbmkgPSBcIkFuaVwiXG4gICAgICogY29uc3Qgc3RvbiA9IFwic3RvblwiXG4gICAgICpcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKCh7IHJlZiwgc2VsZWN0RnJvbSwgZm4gfSkgPT4gKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiBzcWw8c3RyaW5nPmBjb25jYXQoJHthbml9LCAke3N0b259KWAsXG4gICAgICogICAgIG1pZGRsZV9uYW1lOiByZWYoJ2ZpcnN0X25hbWUnKSxcbiAgICAgKiAgICAgYWdlOiBzZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAgIC5zZWxlY3QoZm4uYXZnPG51bWJlcj4oJ2FnZScpLmFzKCdhdmdfYWdlJykpLFxuICAgICAqICAgfSkpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiZmlyc3RfbmFtZVwiLFxuICAgICAqICAgXCJsYXN0X25hbWVcIixcbiAgICAgKiAgIFwibWlkZGxlX25hbWVcIixcbiAgICAgKiAgIFwiYWdlXCJcbiAgICAgKiApXG4gICAgICogdmFsdWVzIChcbiAgICAgKiAgICQxLFxuICAgICAqICAgY29uY2F0KCQyLCAkMyksXG4gICAgICogICBcImZpcnN0X25hbWVcIixcbiAgICAgKiAgIChzZWxlY3QgYXZnKFwiYWdlXCIpIGFzIFwiYXZnX2FnZVwiIGZyb20gXCJwZXJzb25cIilcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoZSBjYWxsYmFjayB2ZXJzaW9uIG9mIHN1YnF1ZXJpZXMgb3IgcmF3IGV4cHJlc3Npb25zOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi53aXRoKCdqZW5uaWZlcicsIChkYikgPT4gZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSmVubmlmZXInKVxuICAgICAqICAgLnNlbGVjdChbJ2lkJywgJ2ZpcnN0X25hbWUnLCAnZ2VuZGVyJ10pXG4gICAgICogICAubGltaXQoMSlcbiAgICAgKiApLmluc2VydEludG8oJ3BldCcpLnZhbHVlcygoZWIpID0+ICh7XG4gICAgICogICBvd25lcl9pZDogZWIuc2VsZWN0RnJvbSgnamVubmlmZXInKS5zZWxlY3QoJ2lkJyksXG4gICAgICogICBuYW1lOiBlYi5zZWxlY3RGcm9tKCdqZW5uaWZlcicpLnNlbGVjdCgnZmlyc3RfbmFtZScpLFxuICAgICAqICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogfSkpXG4gICAgICogLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogd2l0aCBcImplbm5pZmVyXCIgYXMgKFxuICAgICAqICAgc2VsZWN0IFwiaWRcIiwgXCJmaXJzdF9uYW1lXCIsIFwiZ2VuZGVyXCJcbiAgICAgKiAgIGZyb20gXCJwZXJzb25cIlxuICAgICAqICAgd2hlcmUgXCJmaXJzdF9uYW1lXCIgPSAkMVxuICAgICAqICAgbGltaXQgJDJcbiAgICAgKiApXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJvd25lcl9pZFwiLCBcIm5hbWVcIiwgXCJzcGVjaWVzXCIpXG4gICAgICogdmFsdWVzIChcbiAgICAgKiAgKHNlbGVjdCBcImlkXCIgZnJvbSBcImplbm5pZmVyXCIpLFxuICAgICAqICAoc2VsZWN0IFwiZmlyc3RfbmFtZVwiIGZyb20gXCJqZW5uaWZlclwiKSxcbiAgICAgKiAgJDNcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdmFsdWVzKGluc2VydCkge1xuICAgICAgICBjb25zdCBbY29sdW1ucywgdmFsdWVzXSA9IHBhcnNlSW5zZXJ0RXhwcmVzc2lvbihpbnNlcnQpO1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29sdW1ucyB0byBpbnNlcnQuXG4gICAgICpcbiAgICAgKiBUaGUge0BsaW5rIHZhbHVlc30gbWV0aG9kIHNldHMgYm90aCB0aGUgY29sdW1ucyBhbmQgdGhlIHZhbHVlcyBhbmQgdGhpcyBtZXRob2RcbiAgICAgKiBpcyBub3QgbmVlZGVkLiBCdXQgaWYgeW91IGFyZSB1c2luZyB0aGUge0BsaW5rIGV4cHJlc3Npb259IG1ldGhvZCwgeW91IGNhbiB1c2VcbiAgICAgKiB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIGNvbHVtbnMgdG8gaW5zZXJ0LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgIC5leHByZXNzaW9uKChlYikgPT4gZWIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0KCdwZXQubmFtZScpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIpXG4gICAgICogc2VsZWN0IFwicGV0XCIuXCJuYW1lXCIgZnJvbSBcInBldFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uIEZvciBleGFtcGxlIHRoZSByZXN1bHQgb2YgYSBzZWxlY3QgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJpbnNlcnRcIiwgXCJJbnNlcnQgc3VicXVlcnlcIiwgNTApIC0tPlxuICAgICAqXG4gICAgICogWW91IGNhbiBjcmVhdGUgYW4gYElOU0VSVCBJTlRPIFNFTEVDVCBGUk9NYCBxdWVyeSB1c2luZyB0aGUgYGV4cHJlc3Npb25gIG1ldGhvZC5cbiAgICAgKiBUaGlzIEFQSSBkb2Vzbid0IGZvbGxvdyBvdXIgV1lTSVdZRyBwcmluY2lwbGVzIGFuZCBtaWdodCBiZSBhIGJpdCBkaWZmaWN1bHQgdG9cbiAgICAgKiByZW1lbWJlci4gVGhlIHJlYXNvbnMgZm9yIHRoaXMgZGVzaWduIHN0ZW0gZnJvbSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHRpZXMuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2FnZSddKVxuICAgICAqICAgLmV4cHJlc3Npb24oKGViKSA9PiBlYlxuICAgICAqICAgICAuc2VsZWN0RnJvbSgncGV0JylcbiAgICAgKiAgICAgLnNlbGVjdCgoZWIpID0+IFtcbiAgICAgKiAgICAgICAncGV0Lm5hbWUnLFxuICAgICAqICAgICAgIGViLnZhbCgnUGV0c29uJykuYXMoJ2xhc3RfbmFtZScpLFxuICAgICAqICAgICAgIGViLmxpdCg3KS5hcygnYWdlJyksXG4gICAgICogICAgIF0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJhZ2VcIilcbiAgICAgKiBzZWxlY3QgXCJwZXRcIi5cIm5hbWVcIiwgJDEgYXMgXCJsYXN0X25hbWVcIiwgNyBhcyBcImFnZSBmcm9tIFwicGV0XCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBleHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYGluc2VydCBpbnRvIFwicGVyc29uXCIgZGVmYXVsdCB2YWx1ZXNgIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAuZGVmYXVsdFZhbHVlcygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIGRlZmF1bHQgdmFsdWVzXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZGVmYXVsdFZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlczogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAubW9kaWZ5RW5kKHNxbGAtLSBUaGlzIGlzIGEgY29tbWVudGApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gYHBlcnNvbmAgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKVxuICAgICAqIHZhbHVlcyAoPywgPywgPykgLS0gVGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IGlnbm9yZSBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE15U1FMLlxuICAgICAqXG4gICAgICogVG8gYXZvaWQgYSBmb290Z3VuLCB3aGVuIGludm9rZWQgd2l0aCB0aGUgU1FMaXRlIGRpYWxlY3QsIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAgKiBiZSBoYW5kbGVkIGxpa2Uge0BsaW5rIG9ySWdub3JlfS4gU2VlIGFsc28sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yRmFpbH0sXG4gICAgICoge0BsaW5rIG9yUmVwbGFjZX0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiBJZiB5b3UgdXNlIHRoZSBpZ25vcmUgbW9kaWZpZXIsIGlnbm9yYWJsZSBlcnJvcnMgdGhhdCBvY2N1ciB3aGlsZSBleGVjdXRpbmcgdGhlXG4gICAgICogaW5zZXJ0IHN0YXRlbWVudCBhcmUgaWdub3JlZC4gRm9yIGV4YW1wbGUsIHdpdGhvdXQgaWdub3JlLCBhIHJvdyB0aGF0IGR1cGxpY2F0ZXNcbiAgICAgKiBhbiBleGlzdGluZyB1bmlxdWUgaW5kZXggb3IgcHJpbWFyeSBrZXkgdmFsdWUgaW4gdGhlIHRhYmxlIGNhdXNlcyBhIGR1cGxpY2F0ZS1rZXlcbiAgICAgKiBlcnJvciBhbmQgdGhlIHN0YXRlbWVudCBpcyBhYm9ydGVkLiBXaXRoIGlnbm9yZSwgdGhlIHJvdyBpcyBkaXNjYXJkZWQgYW5kIG5vIGVycm9yXG4gICAgICogb2NjdXJzLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAuaWdub3JlKClcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ2ZlbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpZ25vcmUgaW50byBgcGVyc29uYCAoYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGdlbmRlcmApIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIGlnbm9yZSBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaWdub3JlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvckFjdGlvbjogT3JBY3Rpb25Ob2RlLmNyZWF0ZSgnaWdub3JlJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIGlnbm9yZSBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFRvIGF2b2lkIGEgZm9vdGd1biwgd2hlbiBpbnZva2VkIHdpdGggdGhlIE15U1FMIGRpYWxlY3QsIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAgKiBiZSBoYW5kbGVkIGxpa2Uge0BsaW5rIGlnbm9yZX0uXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbywge0BsaW5rIG9yQWJvcnR9LCB7QGxpbmsgb3JGYWlsfSwge0BsaW5rIG9yUmVwbGFjZX0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5vcklnbm9yZSgpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIGlnbm9yZSBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGlnbm9yZSBpbnRvIGBwZXJzb25gIChgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgZ2VuZGVyYCkgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9ySWdub3JlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvckFjdGlvbjogT3JBY3Rpb25Ob2RlLmNyZWF0ZSgnaWdub3JlJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIGFib3J0IGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvcklnbm9yZX0sIHtAbGluayBvckZhaWx9LCB7QGxpbmsgb3JSZXBsYWNlfSwgYW5kIHtAbGluayBvclJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLm9yQWJvcnQoKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciBhYm9ydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb3JBYm9ydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ2Fib3J0JyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIGZhaWwgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbywge0BsaW5rIG9ySWdub3JlfSwge0BsaW5rIG9yQWJvcnR9LCB7QGxpbmsgb3JSZXBsYWNlfSwgYW5kIHtAbGluayBvclJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLm9yRmFpbCgpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIGZhaWwgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9yRmFpbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ2ZhaWwnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgb3IgcmVwbGFjZSBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyB1c2Uge0BsaW5rIEt5c2VseS5yZXBsYWNlSW50b30gdG8gYWNoaWV2ZSB0aGUgc2FtZSByZXN1bHQuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbywge0BsaW5rIG9ySWdub3JlfSwge0BsaW5rIG9yQWJvcnR9LCB7QGxpbmsgb3JGYWlsfSwgYW5kIHtAbGluayBvclJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLm9yUmVwbGFjZSgpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIHJlcGxhY2UgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9yUmVwbGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ3JlcGxhY2UnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgb3Igcm9sbGJhY2sgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbywge0BsaW5rIG9ySWdub3JlfSwge0BsaW5rIG9yQWJvcnR9LCB7QGxpbmsgb3JGYWlsfSwgYW5kIHtAbGluayBvclJlcGxhY2V9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAub3JSb2xsYmFjaygpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIHJvbGxiYWNrIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvclJvbGxiYWNrKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvckFjdGlvbjogT3JBY3Rpb25Ob2RlLmNyZWF0ZSgncm9sbGJhY2snKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgdG9wIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogYHRvcGAgY2xhdXNlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNUyBTUUwgU2VydmVyLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBJbnNlcnQgdGhlIGZpcnN0IDUgcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC50b3AoNSlcbiAgICAgKiAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdnZW5kZXInXSlcbiAgICAgKiAgIC5leHByZXNzaW9uKFxuICAgICAqICAgICAoZWIpID0+IGViLnNlbGVjdEZyb20oJ3BldCcpLnNlbGVjdChbJ25hbWUnLCBzcWwubGl0KCdvdGhlcicpLmFzKCdnZW5kZXInKV0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgdG9wKDUpIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHNlbGVjdCBcIm5hbWVcIiwgJ290aGVyJyBhcyBcImdlbmRlclwiIGZyb20gXCJwZXRcIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW5zZXJ0IHRoZSBmaXJzdCA1MCBwZXJjZW50IG9mIHJvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUwLCAncGVyY2VudCcpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnZ2VuZGVyJ10pXG4gICAgICogICAuZXhwcmVzc2lvbihcbiAgICAgKiAgICAgKGViKSA9PiBlYi5zZWxlY3RGcm9tKCdwZXQnKS5zZWxlY3QoWyduYW1lJywgc3FsLmxpdCgnb3RoZXInKS5hcygnZ2VuZGVyJyldKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IHRvcCg1MCkgcGVyY2VudCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImdlbmRlclwiKSBzZWxlY3QgXCJuYW1lXCIsICdvdGhlcicgYXMgXCJnZW5kZXJcIiBmcm9tIFwicGV0XCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0b3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGBvbiBjb25mbGljdGAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIGBvbiBjb25mbGljdGAgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgYW5kIFNRTGl0ZS4gT24gTXlTUUxcbiAgICAgKiB5b3UgY2FuIHVzZSB7QGxpbmsgaWdub3JlfSBhbmQge0BsaW5rIG9uRHVwbGljYXRlS2V5VXBkYXRlfSB0byBhY2hpZXZlIHNpbWlsYXIgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgIG93bmVyX2lkOiAzLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignbmFtZScpXG4gICAgICogICAgIC5kb1VwZGF0ZVNldCh7IHNwZWNpZXM6ICdoYW1zdGVyJyB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJuYW1lXCIsIFwic3BlY2llc1wiLCBcIm93bmVyX2lkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIG9uIGNvbmZsaWN0IChcIm5hbWVcIilcbiAgICAgKiBkbyB1cGRhdGUgc2V0IFwic3BlY2llc1wiID0gJDRcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gcHJvdmlkZSB0aGUgbmFtZSBvZiB0aGUgY29uc3RyYWludCBpbnN0ZWFkIG9mIGEgY29sdW1uIG5hbWU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgb3duZXJfaWQ6IDMsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuY29uc3RyYWludCgncGV0X25hbWVfa2V5JylcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHsgc3BlY2llczogJ2hhbXN0ZXInIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm5hbWVcIiwgXCJzcGVjaWVzXCIsIFwib3duZXJfaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogb24gY29uZmxpY3Qgb24gY29uc3RyYWludCBcInBldF9uYW1lX2tleVwiXG4gICAgICogZG8gdXBkYXRlIHNldCBcInNwZWNpZXNcIiA9ICQ0XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhbiBleHByZXNzaW9uIGFzIHRoZSBjb25mbGljdCB0YXJnZXQgaW4gY2FzZVxuICAgICAqIHRoZSB1bmlxdWUgaW5kZXggaXMgYW4gZXhwcmVzc2lvbiBpbmRleDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICBvd25lcl9pZDogMyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5leHByZXNzaW9uKHNxbDxzdHJpbmc+YGxvd2VyKG5hbWUpYClcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHsgc3BlY2llczogJ2hhbXN0ZXInIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm5hbWVcIiwgXCJzcGVjaWVzXCIsIFwib3duZXJfaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogb24gY29uZmxpY3QgKGxvd2VyKG5hbWUpKVxuICAgICAqIGRvIHVwZGF0ZSBzZXQgXCJzcGVjaWVzXCIgPSAkNFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiBhZGQgYSBmaWx0ZXIgZm9yIHRoZSB1cGRhdGUgc3RhdGVtZW50IGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICBvd25lcl9pZDogMyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ25hbWUnKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoeyBzcGVjaWVzOiAnaGFtc3RlcicgfSlcbiAgICAgKiAgICAgLndoZXJlKCdleGNsdWRlZC5uYW1lJywgJyE9JywgJ0NhdHRvJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGV0XCIgKFwibmFtZVwiLCBcInNwZWNpZXNcIiwgXCJvd25lcl9pZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyLCAkMylcbiAgICAgKiBvbiBjb25mbGljdCAoXCJuYW1lXCIpXG4gICAgICogZG8gdXBkYXRlIHNldCBcInNwZWNpZXNcIiA9ICQ0XG4gICAgICogd2hlcmUgXCJleGNsdWRlZFwiLlwibmFtZVwiICE9ICQ1XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGNyZWF0ZSBhbiBgb24gY29uZmxpY3QgZG8gbm90aGluZ2AgY2xhdXNlcyBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgb3duZXJfaWQ6IDMsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuY29sdW1uKCduYW1lJylcbiAgICAgKiAgICAgLmRvTm90aGluZygpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm5hbWVcIiwgXCJzcGVjaWVzXCIsIFwib3duZXJfaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogb24gY29uZmxpY3QgKFwibmFtZVwiKSBkbyBub3RoaW5nXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHJlZmVyIHRvIHRoZSBjb2x1bW5zIG9mIHRoZSB2aXJ0dWFsIGBleGNsdWRlZGAgdGFibGVcbiAgICAgKiBpbiBhIHR5cGUtc2FmZSB3YXkgdXNpbmcgYSBjYWxsYmFjayBhbmQgdGhlIGByZWZgIG1ldGhvZCBvZlxuICAgICAqIGBFeHByZXNzaW9uQnVpbGRlcmA6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgaWQ6IDEsXG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3Qob2MgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignaWQnKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6IChlYikgPT4gZWIucmVmKCdleGNsdWRlZC5maXJzdF9uYW1lJyksXG4gICAgICogICAgICAgbGFzdF9uYW1lOiAoZWIpID0+IGViLnJlZignZXhjbHVkZWQubGFzdF9uYW1lJylcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiaWRcIiwgXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzLCAkNClcbiAgICAgKiBvbiBjb25mbGljdCAoXCJpZFwiKVxuICAgICAqIGRvIHVwZGF0ZSBzZXRcbiAgICAgKiAgXCJmaXJzdF9uYW1lXCIgPSBcImV4Y2x1ZGVkXCIuXCJmaXJzdF9uYW1lXCIsXG4gICAgICogIFwibGFzdF9uYW1lXCIgPSBcImV4Y2x1ZGVkXCIuXCJsYXN0X25hbWVcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9uQ29uZmxpY3QoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb25Db25mbGljdDogY2FsbGJhY2sobmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNyZWF0ZSgpLFxuICAgICAgICAgICAgICAgIH0pKS50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgb24gZHVwbGljYXRlIGtleSB1cGRhdGVgIHRvIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIElmIHlvdSBzcGVjaWZ5IGBvbiBkdXBsaWNhdGUga2V5IHVwZGF0ZWAsIGFuZCBhIHJvdyBpcyBpbnNlcnRlZCB0aGF0IHdvdWxkIGNhdXNlXG4gICAgICogYSBkdXBsaWNhdGUgdmFsdWUgaW4gYSB1bmlxdWUgaW5kZXggb3IgcHJpbWFyeSBrZXksIGFuIHVwZGF0ZSBvZiB0aGUgb2xkIHJvdyBvY2N1cnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgaW1wbGVtZW50ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE15U1FMLiBPbiBtb3N0IGRpYWxlY3RzIHlvdSBzaG91bGRcbiAgICAgKiB1c2Uge0BsaW5rIG9uQ29uZmxpY3R9IGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGlkOiAxLFxuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ21hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkR1cGxpY2F0ZUtleVVwZGF0ZSh7IHVwZGF0ZWRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIGBwZXJzb25gIChgaWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgZ2VuZGVyYClcbiAgICAgKiB2YWx1ZXMgKD8sID8sID8sID8pXG4gICAgICogb24gZHVwbGljYXRlIGtleSB1cGRhdGUgYHVwZGF0ZWRfYXRgID0gP1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9uRHVwbGljYXRlS2V5VXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvbkR1cGxpY2F0ZUtleTogT25EdXBsaWNhdGVLZXlOb2RlLmNyZWF0ZShwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24odXBkYXRlKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZyhzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgYHJldHVybmluZ2AgY2xhdXNlcyBmcm9tIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7IGZpcnN0X25hbWU6ICdKYW1lcycsIGxhc3RfbmFtZTogJ1NtaXRoJywgZ2VuZGVyOiAnbWFsZScgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmcoWydmaXJzdF9uYW1lJ10pXG4gICAgICogICAuY2xlYXJSZXR1cm5pbmcoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNsZWFyUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbmRpdGlvbmFsbHkgY2FsbCBhIG1ldGhvZCBvbiBgdGhpc2AsIHNlZVxuICAgICAqIHRoZSB7QGxpbmsgJGlmfSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFRoZSBuZXh0IGV4YW1wbGUgdXNlcyBhIGhlbHBlciBmdW5jdGlvbiBgbG9nYCB0byBsb2cgYSBxdWVyeTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBDb21waWxhYmxlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogZnVuY3Rpb24gbG9nPFQgZXh0ZW5kcyBDb21waWxhYmxlPihxYjogVCk6IFQge1xuICAgICAqICAgY29uc29sZS5sb2cocWIuY29tcGlsZSgpKVxuICAgICAqICAgcmV0dXJuIHFiXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoeyBmaXJzdF9uYW1lOiAnSm9obicsIGxhc3RfbmFtZTogJ0RvZScsIGdlbmRlcjogJ21hbGUnIH0pXG4gICAgICogICAuJGNhbGwobG9nKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgYGZ1bmModGhpcylgIGlmIGBjb25kaXRpb25gIGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlc3BlY2lhbGx5IGhhbmR5IHdpdGggb3B0aW9uYWwgc2VsZWN0cy4gQW55IGByZXR1cm5pbmdgIG9yIGByZXR1cm5pbmdBbGxgXG4gICAgICogbWV0aG9kIGNhbGxzIGFkZCBjb2x1bW5zIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGUgb3V0cHV0IHR5cGUgd2hlbiBjYWxsZWQgaW5zaWRlXG4gICAgICogdGhlIGBmdW5jYCBjYWxsYmFjay4gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhvc2Ugc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5XG4gICAgICogbWFkZSBiZWZvcmUgcnVubmluZyB0aGUgY29kZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBjYWxsIGFueSBvdGhlciBtZXRob2RzIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOZXdQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0UGVyc29uKHZhbHVlczogTmV3UGVyc29uLCByZXR1cm5MYXN0TmFtZTogYm9vbGVhbikge1xuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHZhbHVlcylcbiAgICAgKiAgICAgLnJldHVybmluZyhbJ2lkJywgJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgICAgLiRpZihyZXR1cm5MYXN0TmFtZSwgKHFiKSA9PiBxYi5yZXR1cm5pbmcoJ2xhc3RfbmFtZScpKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFueSBzZWxlY3Rpb25zIGFkZGVkIGluc2lkZSB0aGUgYGlmYCBjYWxsYmFjayB3aWxsIGJlIGFkZGVkIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGVcbiAgICAgKiBvdXRwdXQgdHlwZSBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIHRoZSBzZWxlY3Rpb25zIHdlcmUgYWN0dWFsbHkgbWFkZSBiZWZvcmUgcnVubmluZ1xuICAgICAqIHRoZSBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGBpbnNlcnRQZXJzb25gIGZ1bmN0aW9uIGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBQcm9taXNlPHtcbiAgICAgKiAgIGlkOiBudW1iZXJcbiAgICAgKiAgIGZpcnN0X25hbWU6IHN0cmluZ1xuICAgICAqICAgbGFzdF9uYW1lPzogc3RyaW5nXG4gICAgICogfT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkaWYoY29uZGl0aW9uLCBmdW5jKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYEluc2VydFF1ZXJ5QnVpbGRlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgKHBhcnRzIG9mKSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogS3lzZWx5IHRyaWVzIHRvIGJlIGFzIHR5cGUtc2FmZSBhcyBwb3NzaWJsZSwgYnV0IGluIHNvbWUgY2FzZXMgd2UgaGF2ZSB0byBtYWtlXG4gICAgICogY29tcHJvbWlzZXMgZm9yIGJldHRlciBtYWludGFpbmFiaWxpdHkgYW5kIGNvbXBpbGF0aW9uIHBlcmZvcm1hbmNlLiBBdCBwcmVzZW50LFxuICAgICAqIEt5c2VseSBkb2Vzbid0IG5hcnJvdyB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5IGJhc2VkIG9uIHtAbGluayB2YWx1ZXN9IGlucHV0XG4gICAgICogd2hlbiB1c2luZyB7QGxpbmsgcmV0dXJuaW5nfSBvciB7QGxpbmsgcmV0dXJuaW5nQWxsfS5cbiAgICAgKlxuICAgICAqIFRoaXMgdXRpbGl0eSBtZXRob2QgaXMgdmVyeSB1c2VmdWwgZm9yIHRoZXNlIHNpdHVhdGlvbnMsIGFzIGl0IHJlbW92ZXMgdW5uY2Vzc2FyeVxuICAgICAqIHJ1bnRpbWUgYXNzZXJ0aW9uL2d1YXJkIGNvZGUuIEl0cyBpbnB1dCB0eXBlIGlzIGxpbWl0ZWQgdG8gdGhlIG91dHB1dCB0eXBlXG4gICAgICogb2YgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuJ3QgYWRkIGEgY29sdW1uIHRoYXQgZG9lc24ndCBleGlzdCwgb3IgY2hhbmdlIGEgY29sdW1uJ3NcbiAgICAgKiB0eXBlIHRvIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gaXRzIHVuaW9uIHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFR1cm4gdGhpcyBjb2RlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFBlcnNvbiB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnbWFsZScsXG4gICAgICogICAgIG51bGxhYmxlX2NvbHVtbjogJ2hlbGwgeWVhaCEnXG4gICAgICogICB9KVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogaWYgKGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbikpIHtcbiAgICAgKiAgIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc1dpdGhOb051bGxWYWx1ZShwZXJzb246IFBlcnNvbik6IHBlcnNvbiBpcyBQZXJzb24gJiB7IG51bGxhYmxlX2NvbHVtbjogc3RyaW5nIH0ge1xuICAgICAqICAgcmV0dXJuIHBlcnNvbi5udWxsYWJsZV9jb2x1bW4gIT0gbnVsbFxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEludG8gdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOb3ROdWxsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ21hbGUnLFxuICAgICAqICAgICBudWxsYWJsZV9jb2x1bW46ICdoZWxsIHllYWghJ1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLiRuYXJyb3dUeXBlPHsgbnVsbGFibGVfY29sdW1uOiBOb3ROdWxsIH0+KClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBmdW5jdGlvblRoYXRFeHBlY3RzUGVyc29uV2l0aE5vbk51bGxWYWx1ZShwZXJzb24pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgJG5hcnJvd1R5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzZXJ0cyB0aGF0IHF1ZXJ5J3Mgb3V0cHV0IHJvdyB0eXBlIGVxdWFscyB0aGUgZ2l2ZW4gdHlwZSBgVGAuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzaW1wbGlmeSBleGNlc3NpdmVseSBjb21wbGV4IHR5cGVzIHRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweVxuICAgICAqIGFuZCBtdWNoIGZhc3Rlci5cbiAgICAgKlxuICAgICAqIEt5c2VseSB1c2VzIGNvbXBsZXggdHlwZSBtYWdpYyB0byBhY2hpZXZlIGl0cyB0eXBlIHNhZmV0eS4gVGhpcyBjb21wbGV4aXR5IGlzIHNvbWV0aW1lcyB0b28gbXVjaFxuICAgICAqIGZvciBUeXBlU2NyaXB0IGFuZCB5b3UgZ2V0IGVycm9ycyBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBlcnJvciBUUzI1ODk6IFR5cGUgaW5zdGFudGlhdGlvbiBpcyBleGNlc3NpdmVseSBkZWVwIGFuZCBwb3NzaWJseSBpbmZpbml0ZS5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluIHRoZXNlIGNhc2UgeW91IGNhbiBvZnRlbiB1c2UgdGhpcyBtZXRob2QgdG8gaGVscCBUeXBlU2NyaXB0IGEgbGl0dGxlIGJpdC4gV2hlbiB5b3UgdXNlIHRoaXNcbiAgICAgKiBtZXRob2QgdG8gYXNzZXJ0IHRoZSBvdXRwdXQgdHlwZSBvZiBhIHF1ZXJ5LCBLeXNlbHkgY2FuIGRyb3AgdGhlIGNvbXBsZXggb3V0cHV0IHR5cGUgdGhhdFxuICAgICAqIGNvbnNpc3RzIG9mIG11bHRpcGxlIG5lc3RlZCBoZWxwZXIgdHlwZXMgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgc2ltcGxlIGFzc2VydGVkIHR5cGUuXG4gICAgICpcbiAgICAgKiBVc2luZyB0aGlzIG1ldGhvZCBkb2Vzbid0IHJlZHVjZSB0eXBlIHNhZmV0eSBhdCBhbGwuIFlvdSBoYXZlIHRvIHBhc3MgaW4gYSB0eXBlIHRoYXQgaXNcbiAgICAgKiBzdHJ1Y3R1cmFsbHkgZXF1YWwgdG8gdGhlIGN1cnJlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IE5ld1BlcnNvbiwgTmV3UGV0LCBTcGVjaWVzIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydFBlcnNvbkFuZFBldChwZXJzb246IE5ld1BlcnNvbiwgcGV0OiBPbWl0PE5ld1BldCwgJ293bmVyX2lkJz4pIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAud2l0aCgnbmV3X3BlcnNvbicsIChxYikgPT4gcWJcbiAgICAgKiAgICAgICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgICAgICAudmFsdWVzKHBlcnNvbilcbiAgICAgKiAgICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICAgICAgLiRhc3NlcnRUeXBlPHsgaWQ6IG51bWJlciB9PigpXG4gICAgICogICAgIClcbiAgICAgKiAgICAgLndpdGgoJ25ld19wZXQnLCAocWIpID0+IHFiXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAgICAgLnZhbHVlcygoZWIpID0+ICh7XG4gICAgICogICAgICAgICBvd25lcl9pZDogZWIuc2VsZWN0RnJvbSgnbmV3X3BlcnNvbicpLnNlbGVjdCgnaWQnKSxcbiAgICAgKiAgICAgICAgIC4uLnBldFxuICAgICAqICAgICAgIH0pKVxuICAgICAqICAgICAgIC5yZXR1cm5pbmcoWyduYW1lIGFzIHBldF9uYW1lJywgJ3NwZWNpZXMnXSlcbiAgICAgKiAgICAgICAuJGFzc2VydFR5cGU8eyBwZXRfbmFtZTogc3RyaW5nLCBzcGVjaWVzOiBTcGVjaWVzIH0+KClcbiAgICAgKiAgICAgKVxuICAgICAqICAgICAuc2VsZWN0RnJvbShbJ25ld19wZXJzb24nLCAnbmV3X3BldCddKVxuICAgICAqICAgICAuc2VsZWN0QWxsKClcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGFzc2VydFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBJbnNlcnRRdWVyeUJ1aWxkZXIgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygcm93cy5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdH0gYW5kIHtAbGluayBleGVjdXRlVGFrZUZpcnN0T3JUaHJvd30gbWV0aG9kcy5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5LCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICAgICAgY29uc3QgeyBhZGFwdGVyIH0gPSB0aGlzLiNwcm9wcy5leGVjdXRvcjtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBjb21waWxlZFF1ZXJ5LnF1ZXJ5O1xuICAgICAgICBpZiAoKHF1ZXJ5LnJldHVybmluZyAmJiBhZGFwdGVyLnN1cHBvcnRzUmV0dXJuaW5nKSB8fFxuICAgICAgICAgICAgKHF1ZXJ5Lm91dHB1dCAmJiBhZGFwdGVyLnN1cHBvcnRzT3V0cHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgSW5zZXJ0UmVzdWx0KHJlc3VsdC5pbnNlcnRJZCwgcmVzdWx0Lm51bUFmZmVjdGVkUm93cyA/PyBCaWdJbnQoMCkpLFxuICAgICAgICBdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHRocm93cyBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0IGFuIGluc3RhbmNlIG9mIHtAbGluayBOb1Jlc3VsdEVycm9yfSBpcyB0aHJvd24sIGJ1dCB5b3UgY2FuXG4gICAgICogcHJvdmlkZSBhIGN1c3RvbSBlcnJvciBjbGFzcywgb3IgY2FsbGJhY2sgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhyb3cgYSBkaWZmZXJlbnRcbiAgICAgKiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW0oY2h1bmtTaXplID0gMTAwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy4jcHJvcHMuZXhlY3V0b3Iuc3RyZWFtKGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBzdHJlYW0pIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtLnJvd3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwbGFpbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFeHBsYWluKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgZm9ybWF0LCBvcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmV4ZWN1dGUoKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NlbGVjdC1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc1JlYWRvbmx5QXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlQWxpYXNlZFN0cmluZ1JlZmVyZW5jZSB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyLCB9IGZyb20gJy4uL2R5bmFtaWMvZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUFsaWFzZWRFeHByZXNzaW9uLCB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4vdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi1idWlsZGVyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pIHtcbiAgICBpZiAoaXNGdW5jdGlvbihzZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24oZXhwcmVzc2lvbkJ1aWxkZXIoKSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1JlYWRvbmx5QXJyYXkoc2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLm1hcCgoaXQpID0+IHBhcnNlU2VsZWN0RXhwcmVzc2lvbihpdCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtwYXJzZVNlbGVjdEV4cHJlc3Npb24oc2VsZWN0aW9uKV07XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VTZWxlY3RFeHByZXNzaW9uKHNlbGVjdGlvbikge1xuICAgIGlmIChpc1N0cmluZyhzZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb25Ob2RlLmNyZWF0ZShwYXJzZUFsaWFzZWRTdHJpbmdSZWZlcmVuY2Uoc2VsZWN0aW9uKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIoc2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uTm9kZS5jcmVhdGUoc2VsZWN0aW9uLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb25Ob2RlLmNyZWF0ZShwYXJzZUFsaWFzZWRFeHByZXNzaW9uKHNlbGVjdGlvbikpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbGVjdEFsbCh0YWJsZSkge1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIFtTZWxlY3Rpb25Ob2RlLmNyZWF0ZVNlbGVjdEFsbCgpXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0YWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLm1hcChwYXJzZVNlbGVjdEFsbEFyZyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW3BhcnNlU2VsZWN0QWxsQXJnKHRhYmxlKV07XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VTZWxlY3RBbGxBcmcodGFibGUpIHtcbiAgICBpZiAoaXNTdHJpbmcodGFibGUpKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb25Ob2RlLmNyZWF0ZVNlbGVjdEFsbEZyb21UYWJsZShwYXJzZVRhYmxlKHRhYmxlKSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZSBzZWxlY3RBbGwgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeSh0YWJsZSl9YCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NlbGVjdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgUmVmZXJlbmNlTm9kZSB9IGZyb20gJy4vcmVmZXJlbmNlLW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0QWxsTm9kZSB9IGZyb20gJy4vc2VsZWN0LWFsbC1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3Rpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdTZWxlY3Rpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0aW9uTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVTZWxlY3RBbGwoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdGlvbk5vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiBTZWxlY3RBbGxOb2RlLmNyZWF0ZSgpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVNlbGVjdEFsbEZyb21UYWJsZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogUmVmZXJlbmNlTm9kZS5jcmVhdGVTZWxlY3RBbGwodGFibGUpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2luc2VydC12YWx1ZXMtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wcmltaXRpdmUtdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBpc0Z1bmN0aW9uLCBpc1JlYWRvbmx5QXJyYXksIGlzVW5kZWZpbmVkLCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uIH0gZnJvbSAnLi92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgVmFsdWVzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlcy1ub2RlLmpzJztcbmltcG9ydCB7IGlzRXhwcmVzc2lvbk9yRmFjdG9yeSB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgRGVmYXVsdEluc2VydFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2RlZmF1bHQtaW5zZXJ0LXZhbHVlLW5vZGUuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5zZXJ0RXhwcmVzc2lvbihhcmcpIHtcbiAgICBjb25zdCBvYmplY3RPckxpc3QgPSBpc0Z1bmN0aW9uKGFyZykgPyBhcmcoZXhwcmVzc2lvbkJ1aWxkZXIoKSkgOiBhcmc7XG4gICAgY29uc3QgbGlzdCA9IGlzUmVhZG9ubHlBcnJheShvYmplY3RPckxpc3QpXG4gICAgICAgID8gb2JqZWN0T3JMaXN0XG4gICAgICAgIDogZnJlZXplKFtvYmplY3RPckxpc3RdKTtcbiAgICByZXR1cm4gcGFyc2VJbnNlcnRDb2x1bW5zQW5kVmFsdWVzKGxpc3QpO1xufVxuZnVuY3Rpb24gcGFyc2VJbnNlcnRDb2x1bW5zQW5kVmFsdWVzKHJvd3MpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gcGFyc2VDb2x1bW5OYW1lc0FuZEluZGV4ZXMocm93cyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgZnJlZXplKFsuLi5jb2x1bW5zLmtleXMoKV0ubWFwKENvbHVtbk5vZGUuY3JlYXRlKSksXG4gICAgICAgIFZhbHVlc05vZGUuY3JlYXRlKHJvd3MubWFwKChyb3cpID0+IHBhcnNlUm93VmFsdWVzKHJvdywgY29sdW1ucykpKSxcbiAgICBdO1xufVxuZnVuY3Rpb24gcGFyc2VDb2x1bW5OYW1lc0FuZEluZGV4ZXMocm93cykge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBjb25zdCBjb2xzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xuICAgICAgICAgICAgaWYgKCFjb2x1bW5zLmhhcyhjb2wpICYmIHJvd1tjb2xdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnNldChjb2wsIGNvbHVtbnMuc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbnM7XG59XG5mdW5jdGlvbiBwYXJzZVJvd1ZhbHVlcyhyb3csIGNvbHVtbnMpIHtcbiAgICBjb25zdCByb3dDb2x1bW5zID0gT2JqZWN0LmtleXMocm93KTtcbiAgICBjb25zdCByb3dWYWx1ZXMgPSBBcnJheS5mcm9tKHtcbiAgICAgICAgbGVuZ3RoOiBjb2x1bW5zLnNpemUsXG4gICAgfSk7XG4gICAgbGV0IGhhc1VuZGVmaW5lZE9yQ29tcGxleENvbHVtbnMgPSBmYWxzZTtcbiAgICBsZXQgaW5kZXhlZFJvd0NvbHVtbnMgPSByb3dDb2x1bW5zLmxlbmd0aDtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiByb3dDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbklkeCA9IGNvbHVtbnMuZ2V0KGNvbCk7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChjb2x1bW5JZHgpKSB7XG4gICAgICAgICAgICBpbmRleGVkUm93Q29sdW1ucy0tO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbY29sXTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSB8fCBpc0V4cHJlc3Npb25PckZhY3RvcnkodmFsdWUpKSB7XG4gICAgICAgICAgICBoYXNVbmRlZmluZWRPckNvbXBsZXhDb2x1bW5zID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByb3dWYWx1ZXNbY29sdW1uSWR4XSA9IHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBoYXNNaXNzaW5nQ29sdW1ucyA9IGluZGV4ZWRSb3dDb2x1bW5zIDwgY29sdW1ucy5zaXplO1xuICAgIGlmIChoYXNNaXNzaW5nQ29sdW1ucyB8fCBoYXNVbmRlZmluZWRPckNvbXBsZXhDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IERlZmF1bHRJbnNlcnRWYWx1ZU5vZGUuY3JlYXRlKCk7XG4gICAgICAgIHJldHVybiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZShyb3dWYWx1ZXMubWFwKChpdCkgPT4gaXNVbmRlZmluZWQoaXQpID8gZGVmYXVsdFZhbHVlIDogcGFyc2VWYWx1ZUV4cHJlc3Npb24oaXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlLmNyZWF0ZShyb3dWYWx1ZXMpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZXMtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBWYWx1ZXNOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdWYWx1ZXNOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVmFsdWVzTm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZSh2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtaW5zZXJ0LXZhbHVlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdEluc2VydFZhbHVlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRGVmYXVsdEluc2VydFZhbHVlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0RlZmF1bHRJbnNlcnRWYWx1ZU5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VwZGF0ZS1zZXQtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtblVwZGF0ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tdXBkYXRlLW5vZGUuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uIH0gZnJvbSAnLi92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uLCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcGRhdGUoLi4uYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgQ29sdW1uVXBkYXRlTm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGFyZ3NbMF0pLCBwYXJzZVZhbHVlRXhwcmVzc2lvbihhcmdzWzFdKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24oYXJnc1swXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uKHVwZGF0ZSkge1xuICAgIGNvbnN0IHVwZGF0ZU9iaiA9IGlzRnVuY3Rpb24odXBkYXRlKSA/IHVwZGF0ZShleHByZXNzaW9uQnVpbGRlcigpKSA6IHVwZGF0ZTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModXBkYXRlT2JqKVxuICAgICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcmV0dXJuIENvbHVtblVwZGF0ZU5vZGUuY3JlYXRlKENvbHVtbk5vZGUuY3JlYXRlKGtleSksIHBhcnNlVmFsdWVFeHByZXNzaW9uKHZhbHVlKSk7XG4gICAgfSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbHVtbi11cGRhdGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb2x1bW5VcGRhdGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDb2x1bW5VcGRhdGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtblVwZGF0ZU5vZGUnLFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tZHVwbGljYXRlLWtleS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9uRHVwbGljYXRlS2V5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT25EdXBsaWNhdGVLZXlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh1cGRhdGVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09uRHVwbGljYXRlS2V5Tm9kZScsXG4gICAgICAgICAgICB1cGRhdGVzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2luc2VydC1yZXN1bHQuZC50c1wiIC8+XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgYW4gaW5zZXJ0IHF1ZXJ5LlxuICpcbiAqIElmIHRoZSB0YWJsZSBoYXMgYW4gYXV0byBpbmNyZW1lbnRpbmcgcHJpbWFyeSBrZXkge0BsaW5rIGluc2VydElkfSB3aWxsIGhvbGRcbiAqIHRoZSBnZW5lcmF0ZWQgaWQgb24gZGlhbGVjdHMgdGhhdCBzdXBwb3J0IGl0LiBGb3IgZXhhbXBsZSBQb3N0Z3JlU1FMIGRvZXNuJ3RcbiAqIHJldHVybiB0aGUgaWQgYnkgZGVmYXVsdCBhbmQge0BsaW5rIGluc2VydElkfSBpcyB1bmRlZmluZWQuIE9uIFBvc3RncmVTUUwgeW91XG4gKiBuZWVkIHRvIHVzZSB7QGxpbmsgUmV0dXJuaW5nSW50ZXJmYWNlLnJldHVybmluZ30gb3Ige0BsaW5rIFJldHVybmluZ0ludGVyZmFjZS5yZXR1cm5pbmdBbGx9XG4gKiB0byBnZXQgb3V0IHRoZSBpbnNlcnRlZCBpZC5cbiAqXG4gKiB7QGxpbmsgbnVtSW5zZXJ0ZWRPclVwZGF0ZWRSb3dzfSBob2xkcyB0aGUgbnVtYmVyIG9mIChhY3R1YWxseSkgaW5zZXJ0ZWQgcm93cy5cbiAqIE9uIE15U1FMLCB1cGRhdGVkIHJvd3MgYXJlIGNvdW50ZWQgdHdpY2Ugd2hlbiB1c2luZyBgb24gZHVwbGljYXRlIGtleSB1cGRhdGVgLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgdHlwZSB7IE5ld1BlcnNvbiB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gKlxuICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0UGVyc29uKHBlcnNvbjogTmV3UGVyc29uKSB7XG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gKiAgICAgLnZhbHVlcyhwZXJzb24pXG4gKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAqXG4gKiAgIGNvbnNvbGUubG9nKHJlc3VsdC5pbnNlcnRJZCkgLy8gcmVsZXZhbnQgb24gTXlTUUxcbiAqICAgY29uc29sZS5sb2cocmVzdWx0Lm51bUluc2VydGVkT3JVcGRhdGVkUm93cykgLy8gYWx3YXlzIHJlbGV2YW50XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEluc2VydFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dG8gaW5jcmVtZW50aW5nIHByaW1hcnkga2V5IG9mIHRoZSBpbnNlcnRlZCByb3cuXG4gICAgICpcbiAgICAgKiBUaGlzIHByb3BlcnR5IGNhbiBiZSB1bmRlZmluZWQgd2hlbiB0aGUgcXVlcnkgY29udGFpbnMgYW4gYG9uIGNvbmZsaWN0YFxuICAgICAqIGNsYXVzZSB0aGF0IG1ha2VzIHRoZSBxdWVyeSBzdWNjZWVkIGV2ZW4gd2hlbiBub3RoaW5nIGdldHMgaW5zZXJ0ZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsd2F5cyB1bmRlZmluZWQgb24gZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIHRoYXRcbiAgICAgKiBkb24ndCByZXR1cm4gdGhlIGluc2VydGVkIGlkIGJ5IGRlZmF1bHQuIE9uIHRob3NlIGRpYWxlY3RzIHlvdSBuZWVkXG4gICAgICogdG8gdXNlIHRoZSB7QGxpbmsgUmV0dXJuaW5nSW50ZXJmYWNlLnJldHVybmluZyB8IHJldHVybmluZ30gbWV0aG9kLlxuICAgICAqL1xuICAgIGluc2VydElkO1xuICAgIC8qKlxuICAgICAqIEFmZmVjdGVkIHJvd3MgY291bnQuXG4gICAgICovXG4gICAgbnVtSW5zZXJ0ZWRPclVwZGF0ZWRSb3dzO1xuICAgIGNvbnN0cnVjdG9yKGluc2VydElkLCBudW1JbnNlcnRlZE9yVXBkYXRlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRJZCA9IGluc2VydElkO1xuICAgICAgICB0aGlzLm51bUluc2VydGVkT3JVcGRhdGVkUm93cyA9IG51bUluc2VydGVkT3JVcGRhdGVkUm93cztcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL25vLXJlc3VsdC1lcnJvci5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBOb1Jlc3VsdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIFRoZSBvcGVyYXRpb24gbm9kZSB0cmVlIG9mIHRoZSBxdWVyeSB0aGF0IHdhcyBleGVjdXRlZC5cbiAgICAgKi9cbiAgICBub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgc3VwZXIoJ25vIHJlc3VsdCcpO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3Rvcihmbikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm4sICdwcm90b3R5cGUnKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tY29uZmxpY3QtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBPbkNvbmZsaWN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29uLWNvbmZsaWN0LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci91cGRhdGUtc2V0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT25Db25mbGljdEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBzaW5nbGUgY29sdW1uIGFzIHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGNvbHVtbnN9LCB7QGxpbmsgY29uc3RyYWludH0gYW5kIHtAbGluayBleHByZXNzaW9ufVxuICAgICAqIG1ldGhvZHMgZm9yIGFsdGVybmF0aXZlIHdheXMgdG8gc3BlY2lmeSB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIGNvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgY29uc3QgY29sdW1uTm9kZSA9IENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbik7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogdGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4udGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1ucywgY29sdW1uTm9kZV0pXG4gICAgICAgICAgICAgICAgICAgIDogZnJlZXplKFtjb2x1bW5Ob2RlXSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBsaXN0IG9mIGNvbHVtbnMgYXMgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1ufSwge0BsaW5rIGNvbnN0cmFpbnR9IGFuZCB7QGxpbmsgZXhwcmVzc2lvbn1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uTm9kZXMgPSBjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogdGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4udGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1ucywgLi4uY29sdW1uTm9kZXNdKVxuICAgICAgICAgICAgICAgICAgICA6IGZyZWV6ZShjb2x1bW5Ob2RlcyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBzcGVjaWZpYyBjb25zdHJhaW50IGJ5IG5hbWUgYXMgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1ufSwge0BsaW5rIGNvbHVtbnN9IGFuZCB7QGxpbmsgZXhwcmVzc2lvbn1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBjb25zdHJhaW50KGNvbnN0cmFpbnROYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludDogSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBleHByZXNzaW9uIGFzIHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSB1bmlxdWUgaW5kZXggaXMgYW4gZXhwcmVzc2lvbiBpbmRleC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1ufSwge0BsaW5rIGNvbHVtbnN9IGFuZCB7QGxpbmsgY29uc3RyYWludH1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBleHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHtcbiAgICAgICAgICAgICAgICBpbmRleEV4cHJlc3Npb246IGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhJbmRleFdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aEluZGV4V2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aG91dEluZGV4V2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJkbyBub3RoaW5nXCIgY29uZmxpY3QgYWN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGlkID0gMVxuICAgICAqIGNvbnN0IGZpcnN0X25hbWUgPSAnSm9obidcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1x1MDBBMGZpcnN0X25hbWUsIGlkIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ2lkJylcbiAgICAgKiAgICAgLmRvTm90aGluZygpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJpZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyKVxuICAgICAqIG9uIGNvbmZsaWN0IChcImlkXCIpIGRvIG5vdGhpbmdcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkb05vdGhpbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdERvTm90aGluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgZG9Ob3RoaW5nOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImRvIHVwZGF0ZSBzZXRcIiBjb25mbGljdCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgaWQgPSAxXG4gICAgICogY29uc3QgZmlyc3RfbmFtZSA9ICdKb2huJ1xuICAgICAqXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XHUwMEEwZmlyc3RfbmFtZSwgaWQgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignaWQnKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoeyBmaXJzdF9uYW1lIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJpZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyKVxuICAgICAqIG9uIGNvbmZsaWN0IChcImlkXCIpXG4gICAgICogZG8gdXBkYXRlIHNldCBcImZpcnN0X25hbWVcIiA9ICQzXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGUgbmV4dCBleGFtcGxlIHdlIHVzZSB0aGUgYHJlZmAgbWV0aG9kIHRvIHJlZmVyZW5jZVxuICAgICAqIGNvbHVtbnMgb2YgdGhlIHZpcnR1YWwgdGFibGUgYGV4Y2x1ZGVkYCBpbiBhIHR5cGUtc2FmZSB3YXlcbiAgICAgKiB0byBjcmVhdGUgYW4gdXBzZXJ0IG9wZXJhdGlvbjpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOZXdQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gdXBzZXJ0UGVyc29uKHBlcnNvbjogTmV3UGVyc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICogICBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHBlcnNvbilcbiAgICAgKiAgICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAgIC5jb2x1bW4oJ2lkJylcbiAgICAgKiAgICAgICAuZG9VcGRhdGVTZXQoKGViKSA9PiAoe1xuICAgICAqICAgICAgICAgZmlyc3RfbmFtZTogZWIucmVmKCdleGNsdWRlZC5maXJzdF9uYW1lJyksXG4gICAgICogICAgICAgICBsYXN0X25hbWU6IGViLnJlZignZXhjbHVkZWQubGFzdF9uYW1lJylcbiAgICAgKiAgICAgICB9KVxuICAgICAqICAgICApXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIpXG4gICAgICogb24gY29uZmxpY3QgKFwiaWRcIilcbiAgICAgKiBkbyB1cGRhdGUgc2V0XG4gICAgICogIFwiZmlyc3RfbmFtZVwiID0gZXhjbHVkZWQuXCJmaXJzdF9uYW1lXCIsXG4gICAgICogIFwibGFzdF9uYW1lXCIgPSBleGNsdWRlZC5cImxhc3RfbmFtZVwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZG9VcGRhdGVTZXQodXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgdXBkYXRlczogcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uKHVwZGF0ZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgT25Db25mbGljdERvTm90aGluZ0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBPbkNvbmZsaWN0VXBkYXRlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RVcGRhdGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aFVwZGF0ZVdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSB3aGVyZSBjb25kaXRpb24gZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBXaGVyZUludGVyZmFjZS53aGVyZVJlZn0gZm9yIG1vcmUgaW5mby5cbiAgICAgKi9cbiAgICB3aGVyZVJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0VXBkYXRlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhVcGRhdGVXaGVyZSh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyV2hlcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRob3V0VXBkYXRlV2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLWNvbmZsaWN0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBXaGVyZU5vZGUgfSBmcm9tICcuL3doZXJlLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9uQ29uZmxpY3ROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPbkNvbmZsaWN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09uQ29uZmxpY3ROb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSW5kZXhXaGVyZShub2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgaW5kZXhXaGVyZTogbm9kZS5pbmRleFdoZXJlXG4gICAgICAgICAgICAgICAgPyBXaGVyZU5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKG5vZGUuaW5kZXhXaGVyZSwgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJbmRleE9yV2hlcmUobm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGluZGV4V2hlcmU6IG5vZGUuaW5kZXhXaGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLmluZGV4V2hlcmUsICdPcicsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVcGRhdGVXaGVyZShub2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgdXBkYXRlV2hlcmU6IG5vZGUudXBkYXRlV2hlcmVcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24obm9kZS51cGRhdGVXaGVyZSwgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVcGRhdGVPcldoZXJlKG5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB1cGRhdGVXaGVyZTogbm9kZS51cGRhdGVXaGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLnVwZGF0ZVdoZXJlLCAnT3InLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0SW5kZXhXaGVyZShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGluZGV4V2hlcmU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRVcGRhdGVXaGVyZShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHVwZGF0ZVdoZXJlOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdG9wLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IFRvcE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS90b3Atbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0JpZ0ludCwgaXNOdW1iZXIsIGlzVW5kZWZpbmVkIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgIGlmICghaXNOdW1iZXIoZXhwcmVzc2lvbikgJiYgIWlzQmlnSW50KGV4cHJlc3Npb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0b3AgZXhwcmVzc2lvbjogJHtleHByZXNzaW9ufWApO1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKG1vZGlmaWVycykgJiYgIWlzVG9wTW9kaWZpZXJzKG1vZGlmaWVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRvcCBtb2RpZmllcnM6ICR7bW9kaWZpZXJzfWApO1xuICAgIH1cbiAgICByZXR1cm4gVG9wTm9kZS5jcmVhdGUoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKTtcbn1cbmZ1bmN0aW9uIGlzVG9wTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAgIHJldHVybiAobW9kaWZpZXJzID09PSAncGVyY2VudCcgfHxcbiAgICAgICAgbW9kaWZpZXJzID09PSAnd2l0aCB0aWVzJyB8fFxuICAgICAgICBtb2RpZmllcnMgPT09ICdwZXJjZW50IHdpdGggdGllcycpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi90b3Atbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBUb3BOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdUb3BOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVG9wTm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgbW9kaWZpZXJzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yLWFjdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9yQWN0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3JBY3Rpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT3JBY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWxldGUtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IHBhcnNlSm9pbiwgfSBmcm9tICcuLi9wYXJzZXIvam9pbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgcGFyc2VTZWxlY3RBbGwsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgTm9SZXN1bHRFcnJvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBEZWxldGVSZXN1bHQgfSBmcm9tICcuL2RlbGV0ZS1yZXN1bHQuanMnO1xuaW1wb3J0IHsgRGVsZXRlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZGVsZXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgTGltaXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbGltaXQtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZU9yZGVyQnksIH0gZnJvbSAnLi4vcGFyc2VyL29yZGVyLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVG9wIH0gZnJvbSAnLi4vcGFyc2VyL3RvcC1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIERlbGV0ZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aGVyZVJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGEgYGRlbGV0ZSBmcm9tYCBxdWVyeSBpbnRvIGEgYGRlbGV0ZSB0b3AgZnJvbWAgcXVlcnkuXG4gICAgICpcbiAgICAgKiBgdG9wYCBjbGF1c2UgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE1TIFNRTCBTZXJ2ZXIuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIERlbGV0ZSB0aGUgZmlyc3QgNSByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUpXG4gICAgICogICAud2hlcmUoJ2FnZScsICc+JywgMTgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIHRvcCg1KSBmcm9tIFwicGVyc29uXCIgd2hlcmUgXCJhZ2VcIiA+IEAxXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBEZWxldGUgdGhlIGZpcnN0IDUwJSBvZiByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUwLCAncGVyY2VudCcpXG4gICAgICogICAud2hlcmUoJ2FnZScsICc+JywgMTgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIHRvcCg1MCkgcGVyY2VudCBmcm9tIFwicGVyc29uXCIgd2hlcmUgXCJhZ2VcIiA+IEAxXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXNpbmcodGFibGVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBEZWxldGVRdWVyeU5vZGUuY2xvbmVXaXRoVXNpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCh0YWJsZXMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlubmVySm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdJbm5lckpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgbGVmdEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignTGVmdEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgcmlnaHRKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ1JpZ2h0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBmdWxsSm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdGdWxsSm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICAjam9pbihqb2luVHlwZSwgYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEpvaW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUpvaW4oam9pblR5cGUsIGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZyhzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXQoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGByZXR1cm5pbmdgIGNsYXVzZXMgZnJvbSB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuZGVsZXRlRnJvbSgncGV0JylcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLndoZXJlKCduYW1lJywgJz0nLCAnTWF4JylcbiAgICAgKiAgIC5jbGVhclJldHVybmluZygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIFwicGV0XCIgd2hlcmUgXCJuYW1lXCIgPSBcIk1heFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY2xlYXJSZXR1cm5pbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0UmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGBsaW1pdGAgY2xhdXNlIGZyb20gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmRlbGV0ZUZyb20oJ3BldCcpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC53aGVyZSgnbmFtZScsICc9JywgJ01heCcpXG4gICAgICogICAubGltaXQoNSlcbiAgICAgKiAgIC5jbGVhckxpbWl0KClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIGZyb20gXCJwZXRcIiB3aGVyZSBcIm5hbWVcIiA9IFwiTWF4XCIgcmV0dXJuaW5nICpcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjbGVhckxpbWl0KCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogRGVsZXRlUXVlcnlOb2RlLmNsb25lV2l0aG91dExpbWl0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU9yZGVyQnkoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJPcmRlckJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaW1pdCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogQSBsaW1pdCBjbGF1c2UgaW4gYSBkZWxldGUgcXVlcnkgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0c1xuICAgICAqIGxpa2UgTXlTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIERlbGV0ZSA1IG9sZGVzdCBpdGVtcyBpbiBhIHRhYmxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oJ3BldCcpXG4gICAgICogICAub3JkZXJCeSgnY3JlYXRlZF9hdCcpXG4gICAgICogICAubGltaXQoNSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBgcGV0YCBvcmRlciBieSBgY3JlYXRlZF9hdGAgbGltaXQgP1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBEZWxldGVRdWVyeU5vZGUuY2xvbmVXaXRoTGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBMaW1pdE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKGxpbWl0KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKb2huJylcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsYC0tIFRoaXMgaXMgYSBjb21tZW50YClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBgcGVyc29uYFxuICAgICAqIHdoZXJlIGBmaXJzdF9uYW1lYCA9IFwiSm9oblwiIC0tIFRoaXMgaXMgYSBjb21tZW50XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gY29uZGl0aW9uYWxseSBjYWxsIGEgbWV0aG9kIG9uIGB0aGlzYCwgc2VlXG4gICAgICogdGhlIHtAbGluayAkaWZ9IG1ldGhvZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVGhlIG5leHQgZXhhbXBsZSB1c2VzIGEgaGVscGVyIGZ1bmN0aW9uIGBsb2dgIHRvIGxvZyBhIHF1ZXJ5OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IENvbXBpbGFibGUgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBsb2c8VCBleHRlbmRzIENvbXBpbGFibGU+KHFiOiBUKTogVCB7XG4gICAgICogICBjb25zb2xlLmxvZyhxYi5jb21waWxlKCkpXG4gICAgICogICByZXR1cm4gcWJcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLiRjYWxsKGxvZylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGBmdW5jKHRoaXMpYCBpZiBgY29uZGl0aW9uYCBpcyB0cnVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXNwZWNpYWxseSBoYW5keSB3aXRoIG9wdGlvbmFsIHNlbGVjdHMuIEFueSBgcmV0dXJuaW5nYCBvciBgcmV0dXJuaW5nQWxsYFxuICAgICAqIG1ldGhvZCBjYWxscyBhZGQgY29sdW1ucyBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlIG91dHB1dCB0eXBlIHdoZW4gY2FsbGVkIGluc2lkZVxuICAgICAqIHRoZSBgZnVuY2AgY2FsbGJhY2suIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRob3NlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseVxuICAgICAqIG1hZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVBlcnNvbihpZDogbnVtYmVyLCByZXR1cm5MYXN0TmFtZTogYm9vbGVhbikge1xuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAud2hlcmUoJ2lkJywgJz0nLCBpZClcbiAgICAgKiAgICAgLnJldHVybmluZyhbJ2lkJywgJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgICAgLiRpZihyZXR1cm5MYXN0TmFtZSwgKHFiKSA9PiBxYi5yZXR1cm5pbmcoJ2xhc3RfbmFtZScpKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFueSBzZWxlY3Rpb25zIGFkZGVkIGluc2lkZSB0aGUgYGlmYCBjYWxsYmFjayB3aWxsIGJlIGFkZGVkIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGVcbiAgICAgKiBvdXRwdXQgdHlwZSBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIHRoZSBzZWxlY3Rpb25zIHdlcmUgYWN0dWFsbHkgbWFkZSBiZWZvcmUgcnVubmluZ1xuICAgICAqIHRoZSBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGBkZWxldGVQZXJzb25gIGZ1bmN0aW9uIGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBQcm9taXNlPHtcbiAgICAgKiAgIGlkOiBudW1iZXJcbiAgICAgKiAgIGZpcnN0X25hbWU6IHN0cmluZ1xuICAgICAqICAgbGFzdF9uYW1lPzogc3RyaW5nXG4gICAgICogfT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkaWYoY29uZGl0aW9uLCBmdW5jKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYERlbGV0ZVF1ZXJ5QnVpbGRlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgKHBhcnRzIG9mKSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogS3lzZWx5IHRyaWVzIHRvIGJlIGFzIHR5cGUtc2FmZSBhcyBwb3NzaWJsZSwgYnV0IGluIHNvbWUgY2FzZXMgd2UgaGF2ZSB0byBtYWtlXG4gICAgICogY29tcHJvbWlzZXMgZm9yIGJldHRlciBtYWludGFpbmFiaWxpdHkgYW5kIGNvbXBpbGF0aW9uIHBlcmZvcm1hbmNlLiBBdCBwcmVzZW50LFxuICAgICAqIEt5c2VseSBkb2Vzbid0IG5hcnJvdyB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5IHdoZW4gdXNpbmcge0BsaW5rIHdoZXJlfSBhbmQge0BsaW5rIHJldHVybmluZ30gb3Ige0BsaW5rIHJldHVybmluZ0FsbH0uXG4gICAgICpcbiAgICAgKiBUaGlzIHV0aWxpdHkgbWV0aG9kIGlzIHZlcnkgdXNlZnVsIGZvciB0aGVzZSBzaXR1YXRpb25zLCBhcyBpdCByZW1vdmVzIHVubmNlc3NhcnlcbiAgICAgKiBydW50aW1lIGFzc2VydGlvbi9ndWFyZCBjb2RlLiBJdHMgaW5wdXQgdHlwZSBpcyBsaW1pdGVkIHRvIHRoZSBvdXRwdXQgdHlwZVxuICAgICAqIG9mIHRoZSBxdWVyeSwgc28geW91IGNhbid0IGFkZCBhIGNvbHVtbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIG9yIGNoYW5nZSBhIGNvbHVtbidzXG4gICAgICogdHlwZSB0byBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0IGluIGl0cyB1bmlvbiB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUdXJuIHRoaXMgY29kZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC53aGVyZSgnaWQnLCAnPScsIDMpXG4gICAgICogICAud2hlcmUoJ251bGxhYmxlX2NvbHVtbicsICdpcyBub3QnLCBudWxsKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogaWYgKGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbikpIHtcbiAgICAgKiAgIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc1dpdGhOb051bGxWYWx1ZShwZXJzb246IFBlcnNvbik6IHBlcnNvbiBpcyBQZXJzb24gJiB7IG51bGxhYmxlX2NvbHVtbjogc3RyaW5nIH0ge1xuICAgICAqICAgcmV0dXJuIHBlcnNvbi5udWxsYWJsZV9jb2x1bW4gIT0gbnVsbFxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEludG8gdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOb3ROdWxsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC53aGVyZSgnaWQnLCAnPScsIDMpXG4gICAgICogICAud2hlcmUoJ251bGxhYmxlX2NvbHVtbicsICdpcyBub3QnLCBudWxsKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuJG5hcnJvd1R5cGU8eyBudWxsYWJsZV9jb2x1bW46IE5vdE51bGwgfT4oKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkbmFycm93VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NlcnRzIHRoYXQgcXVlcnkncyBvdXRwdXQgcm93IHR5cGUgZXF1YWxzIHRoZSBnaXZlbiB0eXBlIGBUYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNpbXBsaWZ5IGV4Y2Vzc2l2ZWx5IGNvbXBsZXggdHlwZXMgdG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5XG4gICAgICogYW5kIG11Y2ggZmFzdGVyLlxuICAgICAqXG4gICAgICogS3lzZWx5IHVzZXMgY29tcGxleCB0eXBlIG1hZ2ljIHRvIGFjaGlldmUgaXRzIHR5cGUgc2FmZXR5LiBUaGlzIGNvbXBsZXhpdHkgaXMgc29tZXRpbWVzIHRvbyBtdWNoXG4gICAgICogZm9yIFR5cGVTY3JpcHQgYW5kIHlvdSBnZXQgZXJyb3JzIGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGVycm9yIFRTMjU4OTogVHlwZSBpbnN0YW50aWF0aW9uIGlzIGV4Y2Vzc2l2ZWx5IGRlZXAgYW5kIHBvc3NpYmx5IGluZmluaXRlLlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gdGhlc2UgY2FzZSB5b3UgY2FuIG9mdGVuIHVzZSB0aGlzIG1ldGhvZCB0byBoZWxwIFR5cGVTY3JpcHQgYSBsaXR0bGUgYml0LiBXaGVuIHlvdSB1c2UgdGhpc1xuICAgICAqIG1ldGhvZCB0byBhc3NlcnQgdGhlIG91dHB1dCB0eXBlIG9mIGEgcXVlcnksIEt5c2VseSBjYW4gZHJvcCB0aGUgY29tcGxleCBvdXRwdXQgdHlwZSB0aGF0XG4gICAgICogY29uc2lzdHMgb2YgbXVsdGlwbGUgbmVzdGVkIGhlbHBlciB0eXBlcyBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBzaW1wbGUgYXNzZXJ0ZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIFVzaW5nIHRoaXMgbWV0aG9kIGRvZXNuJ3QgcmVkdWNlIHR5cGUgc2FmZXR5IGF0IGFsbC4gWW91IGhhdmUgdG8gcGFzcyBpbiBhIHR5cGUgdGhhdCBpc1xuICAgICAqIHN0cnVjdHVyYWxseSBlcXVhbCB0byB0aGUgY3VycmVudCB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgU3BlY2llcyB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkZWxldGVQZXJzb25BbmRQZXRzKHBlcnNvbklkOiBudW1iZXIpIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAud2l0aCgnZGVsZXRlZF9wZXJzb24nLCAocWIpID0+IHFiXG4gICAgICogICAgICAgIC5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAgICAud2hlcmUoJ2lkJywgJz0nLCBwZXJzb25JZClcbiAgICAgKiAgICAgICAgLnJldHVybmluZygnZmlyc3RfbmFtZScpXG4gICAgICogICAgICAgIC4kYXNzZXJ0VHlwZTx7IGZpcnN0X25hbWU6IHN0cmluZyB9PigpXG4gICAgICogICAgIClcbiAgICAgKiAgICAgLndpdGgoJ2RlbGV0ZWRfcGV0cycsIChxYikgPT4gcWJcbiAgICAgKiAgICAgICAuZGVsZXRlRnJvbSgncGV0JylcbiAgICAgKiAgICAgICAud2hlcmUoJ293bmVyX2lkJywgJz0nLCBwZXJzb25JZClcbiAgICAgKiAgICAgICAucmV0dXJuaW5nKFsnbmFtZSBhcyBwZXRfbmFtZScsICdzcGVjaWVzJ10pXG4gICAgICogICAgICAgLiRhc3NlcnRUeXBlPHsgcGV0X25hbWU6IHN0cmluZywgc3BlY2llczogU3BlY2llcyB9PigpXG4gICAgICogICAgIClcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oWydkZWxldGVkX3BlcnNvbicsICdkZWxldGVkX3BldHMnXSlcbiAgICAgKiAgICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAgIC5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGFzc2VydFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBEZWxldGVRdWVyeUJ1aWxkZXIgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygcm93cy5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdH0gYW5kIHtAbGluayBleGVjdXRlVGFrZUZpcnN0T3JUaHJvd30gbWV0aG9kcy5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5LCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICAgICAgY29uc3QgeyBhZGFwdGVyIH0gPSB0aGlzLiNwcm9wcy5leGVjdXRvcjtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBjb21waWxlZFF1ZXJ5LnF1ZXJ5O1xuICAgICAgICBpZiAoKHF1ZXJ5LnJldHVybmluZyAmJiBhZGFwdGVyLnN1cHBvcnRzUmV0dXJuaW5nKSB8fFxuICAgICAgICAgICAgKHF1ZXJ5Lm91dHB1dCAmJiBhZGFwdGVyLnN1cHBvcnRzT3V0cHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbmV3IERlbGV0ZVJlc3VsdChyZXN1bHQubnVtQWZmZWN0ZWRSb3dzID8/IEJpZ0ludCgwKSldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHRocm93cyBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0IGFuIGluc3RhbmNlIG9mIHtAbGluayBOb1Jlc3VsdEVycm9yfSBpcyB0aHJvd24sIGJ1dCB5b3UgY2FuXG4gICAgICogcHJvdmlkZSBhIGN1c3RvbSBlcnJvciBjbGFzcywgb3IgY2FsbGJhY2sgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhyb3cgYSBkaWZmZXJlbnRcbiAgICAgKiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW0oY2h1bmtTaXplID0gMTAwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy4jcHJvcHMuZXhlY3V0b3Iuc3RyZWFtKGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBzdHJlYW0pIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtLnJvd3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwbGFpbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFeHBsYWluKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgZm9ybWF0LCBvcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmV4ZWN1dGUoKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlbGV0ZS1yZXN1bHQuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgRGVsZXRlUmVzdWx0IHtcbiAgICBudW1EZWxldGVkUm93cztcbiAgICBjb25zdHJ1Y3RvcihudW1EZWxldGVkUm93cykge1xuICAgICAgICB0aGlzLm51bURlbGV0ZWRSb3dzID0gbnVtRGVsZXRlZFJvd3M7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9saW1pdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IExpbWl0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnTGltaXROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShsaW1pdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdMaW1pdE5vZGUnLFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXBkYXRlLXF1ZXJ5LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBwYXJzZUpvaW4sIH0gZnJvbSAnLi4vcGFyc2VyL2pvaW4tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBcmcsIHBhcnNlU2VsZWN0QWxsLCB9IGZyb20gJy4uL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdXBkYXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VVcGRhdGUsIH0gZnJvbSAnLi4vcGFyc2VyL3VwZGF0ZS1zZXQtcGFyc2VyLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFVwZGF0ZVJlc3VsdCB9IGZyb20gJy4vdXBkYXRlLXJlc3VsdC5qcyc7XG5pbXBvcnQgeyBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgTm9SZXN1bHRFcnJvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IExpbWl0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2xpbWl0LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUb3AgfSBmcm9tICcuLi9wYXJzZXIvdG9wLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZU9yZGVyQnksIH0gZnJvbSAnLi4vcGFyc2VyL29yZGVyLWJ5LXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgVXBkYXRlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB3aGVyZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoV2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyV2hlcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0V2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYHVwZGF0ZWAgcXVlcnkgaW50byBhIGB1cGRhdGUgdG9wYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIGB0b3BgIGNsYXVzZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBmaXJzdCByb3c6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCgxKVxuICAgICAqICAgLnNldCh7IGZpcnN0X25hbWU6ICdGb28nIH0pXG4gICAgICogICAud2hlcmUoJ2FnZScsICc+JywgMTgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogdXBkYXRlIHRvcCgxKSBcInBlcnNvblwiIHNldCBcImZpcnN0X25hbWVcIiA9IEAxIHdoZXJlIFwiYWdlXCIgPiBAMlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSA1MCUgZmlyc3Qgcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUwLCAncGVyY2VudCcpXG4gICAgICogICAuc2V0KHsgZmlyc3RfbmFtZTogJ0ZvbycgfSlcbiAgICAgKiAgIC53aGVyZSgnYWdlJywgJz4nLCAxOClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgdG9wKDUwKSBwZXJjZW50IFwicGVyc29uXCIgc2V0IFwiZmlyc3RfbmFtZVwiID0gQDEgd2hlcmUgXCJhZ2VcIiA+IEAyXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnJvbShmcm9tKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBVcGRhdGVRdWVyeU5vZGUuY2xvbmVXaXRoRnJvbUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QoZnJvbSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5uZXJKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0lubmVySm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBsZWZ0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMZWZ0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICByaWdodEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignUmlnaHRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGZ1bGxKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0Z1bGxKb2luJywgYXJncyk7XG4gICAgfVxuICAgICNqb2luKGpvaW5UeXBlLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoSm9pbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlSm9pbihqb2luVHlwZSwgYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VPcmRlckJ5KGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT3JkZXJCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGltaXQgY2xhdXNlIHRvIHRoZSB1cGRhdGUgcXVlcnkgZm9yIHN1cHBvcnRlZCBkYXRhYmFzZXMsIHN1Y2ggYXMgTXlTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFVwZGF0ZSB0aGUgZmlyc3QgMiByb3dzIGluIHRoZSAncGVyc29uJyB0YWJsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQoeyBmaXJzdF9uYW1lOiAnRm9vJyB9KVxuICAgICAqICAgLmxpbWl0KDIpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogdXBkYXRlIGBwZXJzb25gIHNldCBgZmlyc3RfbmFtZWAgPSA/IGxpbWl0ID9cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBsaW1pdChsaW1pdCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogVXBkYXRlUXVlcnlOb2RlLmNsb25lV2l0aExpbWl0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgTGltaXROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihsaW1pdCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBVcGRhdGVRdWVyeU5vZGUuY2xvbmVXaXRoVXBkYXRlcyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVXBkYXRlKC4uLmFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZyhzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXQoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgYWdlOiAzOSB9KVxuICAgICAqICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSm9obicpXG4gICAgICogICAubW9kaWZ5RW5kKHNxbC5yYXcoJy0tIFRoaXMgaXMgYSBjb21tZW50JykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogdXBkYXRlIGBwZXJzb25gXG4gICAgICogc2V0IGBhZ2VgID0gMzlcbiAgICAgKiB3aGVyZSBgZmlyc3RfbmFtZWAgPSBcIkpvaG5cIiAtLSBUaGlzIGlzIGEgY29tbWVudFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBgcmV0dXJuaW5nYCBjbGF1c2VzIGZyb20gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuc2V0KHsgYWdlOiAzOSB9KVxuICAgICAqICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSm9obicpXG4gICAgICogICAuY2xlYXJSZXR1cm5pbmcoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgXCJwZXJzb25cIiBzZXQgXCJhZ2VcIiA9IDM5IHdoZXJlIFwiZmlyc3RfbmFtZVwiID0gXCJKb2huXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjbGVhclJldHVybmluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBjb25kaXRpb25hbGx5IGNhbGwgYSBtZXRob2Qgb24gYHRoaXNgLCBzZWVcbiAgICAgKiB0aGUge0BsaW5rICRpZn0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgbmV4dCBleGFtcGxlIHVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gYGxvZ2AgdG8gbG9nIGEgcXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgQ29tcGlsYWJsZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFBlcnNvblVwZGF0ZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBsb2c8VCBleHRlbmRzIENvbXBpbGFibGU+KHFiOiBUKTogVCB7XG4gICAgICogICBjb25zb2xlLmxvZyhxYi5jb21waWxlKCkpXG4gICAgICogICByZXR1cm4gcWJcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICogICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogfSBzYXRpc2ZpZXMgUGVyc29uVXBkYXRlXG4gICAgICpcbiAgICAgKiBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQodmFsdWVzKVxuICAgICAqICAgLiRjYWxsKGxvZylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGBmdW5jKHRoaXMpYCBpZiBgY29uZGl0aW9uYCBpcyB0cnVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXNwZWNpYWxseSBoYW5keSB3aXRoIG9wdGlvbmFsIHNlbGVjdHMuIEFueSBgcmV0dXJuaW5nYCBvciBgcmV0dXJuaW5nQWxsYFxuICAgICAqIG1ldGhvZCBjYWxscyBhZGQgY29sdW1ucyBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlIG91dHB1dCB0eXBlIHdoZW4gY2FsbGVkIGluc2lkZVxuICAgICAqIHRoZSBgZnVuY2AgY2FsbGJhY2suIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRob3NlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseVxuICAgICAqIG1hZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uVXBkYXRlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVBlcnNvbihpZDogbnVtYmVyLCB1cGRhdGVzOiBQZXJzb25VcGRhdGUsIHJldHVybkxhc3ROYW1lOiBib29sZWFuKSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgICAuc2V0KHVwZGF0ZXMpXG4gICAgICogICAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgICAuJGlmKHJldHVybkxhc3ROYW1lLCAocWIpID0+IHFiLnJldHVybmluZygnbGFzdF9uYW1lJykpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW55IHNlbGVjdGlvbnMgYWRkZWQgaW5zaWRlIHRoZSBgaWZgIGNhbGxiYWNrIHdpbGwgYmUgYWRkZWQgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZVxuICAgICAqIG91dHB1dCB0eXBlIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgdGhlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseSBtYWRlIGJlZm9yZSBydW5uaW5nXG4gICAgICogdGhlIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYHVwZGF0ZVBlcnNvbmAgZnVuY3Rpb24gaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFByb21pc2U8e1xuICAgICAqICAgaWQ6IG51bWJlclxuICAgICAqICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gICAgICogICBsYXN0X25hbWU/OiBzdHJpbmdcbiAgICAgKiB9PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRpZihjb25kaXRpb24sIGZ1bmMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgVXBkYXRlUXVlcnlCdWlsZGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmFycm93cyAocGFydHMgb2YpIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdHJpZXMgdG8gYmUgYXMgdHlwZS1zYWZlIGFzIHBvc3NpYmxlLCBidXQgaW4gc29tZSBjYXNlcyB3ZSBoYXZlIHRvIG1ha2VcbiAgICAgKiBjb21wcm9taXNlcyBmb3IgYmV0dGVyIG1haW50YWluYWJpbGl0eSBhbmQgY29tcGlsYXRpb24gcGVyZm9ybWFuY2UuIEF0IHByZXNlbnQsXG4gICAgICogS3lzZWx5IGRvZXNuJ3QgbmFycm93IHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkgYmFzZWQgb24ge0BsaW5rIHNldH0gaW5wdXRcbiAgICAgKiB3aGVuIHVzaW5nIHtAbGluayB3aGVyZX0gYW5kL29yIHtAbGluayByZXR1cm5pbmd9IG9yIHtAbGluayByZXR1cm5pbmdBbGx9LlxuICAgICAqXG4gICAgICogVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyB2ZXJ5IHVzZWZ1bCBmb3IgdGhlc2Ugc2l0dWF0aW9ucywgYXMgaXQgcmVtb3ZlcyB1bm5jZXNzYXJ5XG4gICAgICogcnVudGltZSBhc3NlcnRpb24vZ3VhcmQgY29kZS4gSXRzIGlucHV0IHR5cGUgaXMgbGltaXRlZCB0byB0aGUgb3V0cHV0IHR5cGVcbiAgICAgKiBvZiB0aGUgcXVlcnksIHNvIHlvdSBjYW4ndCBhZGQgYSBjb2x1bW4gdGhhdCBkb2Vzbid0IGV4aXN0LCBvciBjaGFuZ2UgYSBjb2x1bW4nc1xuICAgICAqIHR5cGUgdG8gc29tZXRoaW5nIHRoYXQgZG9lc24ndCBleGlzdCBpbiBpdHMgdW5pb24gdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVHVybiB0aGlzIGNvZGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IGlkID0gMVxuICAgICAqIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgZGVsZXRlZF9hdDogbm93IH0pXG4gICAgICogICAud2hlcmUoJ2lkJywgJz0nLCBpZClcbiAgICAgKiAgIC53aGVyZSgnbnVsbGFibGVfY29sdW1uJywgJ2lzIG5vdCcsIG51bGwpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBpZiAoaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uKSkge1xuICAgICAqICAgZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbjogUGVyc29uKTogcGVyc29uIGlzIFBlcnNvbiAmIHsgbnVsbGFibGVfY29sdW1uOiBzdHJpbmcgfSB7XG4gICAgICogICByZXR1cm4gcGVyc29uLm51bGxhYmxlX2NvbHVtbiAhPSBudWxsXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW50byB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IE5vdE51bGwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBpZCA9IDFcbiAgICAgKiBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGRlbGV0ZWRfYXQ6IG5vdyB9KVxuICAgICAqICAgLndoZXJlKCdpZCcsICc9JywgaWQpXG4gICAgICogICAud2hlcmUoJ251bGxhYmxlX2NvbHVtbicsICdpcyBub3QnLCBudWxsKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuJG5hcnJvd1R5cGU8eyBkZWxldGVkX2F0OiBEYXRlOyBudWxsYWJsZV9jb2x1bW46IE5vdE51bGwgfT4oKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkbmFycm93VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NlcnRzIHRoYXQgcXVlcnkncyBvdXRwdXQgcm93IHR5cGUgZXF1YWxzIHRoZSBnaXZlbiB0eXBlIGBUYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNpbXBsaWZ5IGV4Y2Vzc2l2ZWx5IGNvbXBsZXggdHlwZXMgdG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5XG4gICAgICogYW5kIG11Y2ggZmFzdGVyLlxuICAgICAqXG4gICAgICogS3lzZWx5IHVzZXMgY29tcGxleCB0eXBlIG1hZ2ljIHRvIGFjaGlldmUgaXRzIHR5cGUgc2FmZXR5LiBUaGlzIGNvbXBsZXhpdHkgaXMgc29tZXRpbWVzIHRvbyBtdWNoXG4gICAgICogZm9yIFR5cGVTY3JpcHQgYW5kIHlvdSBnZXQgZXJyb3JzIGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGVycm9yIFRTMjU4OTogVHlwZSBpbnN0YW50aWF0aW9uIGlzIGV4Y2Vzc2l2ZWx5IGRlZXAgYW5kIHBvc3NpYmx5IGluZmluaXRlLlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gdGhlc2UgY2FzZSB5b3UgY2FuIG9mdGVuIHVzZSB0aGlzIG1ldGhvZCB0byBoZWxwIFR5cGVTY3JpcHQgYSBsaXR0bGUgYml0LiBXaGVuIHlvdSB1c2UgdGhpc1xuICAgICAqIG1ldGhvZCB0byBhc3NlcnQgdGhlIG91dHB1dCB0eXBlIG9mIGEgcXVlcnksIEt5c2VseSBjYW4gZHJvcCB0aGUgY29tcGxleCBvdXRwdXQgdHlwZSB0aGF0XG4gICAgICogY29uc2lzdHMgb2YgbXVsdGlwbGUgbmVzdGVkIGhlbHBlciB0eXBlcyBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBzaW1wbGUgYXNzZXJ0ZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIFVzaW5nIHRoaXMgbWV0aG9kIGRvZXNuJ3QgcmVkdWNlIHR5cGUgc2FmZXR5IGF0IGFsbC4gWW91IGhhdmUgdG8gcGFzcyBpbiBhIHR5cGUgdGhhdCBpc1xuICAgICAqIHN0cnVjdHVyYWxseSBlcXVhbCB0byB0aGUgY3VycmVudCB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uVXBkYXRlLCBQZXRVcGRhdGUsIFNwZWNpZXMgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0ge1xuICAgICAqICAgaWQ6IDEsXG4gICAgICogICBnZW5kZXI6ICdvdGhlcicsXG4gICAgICogfSBzYXRpc2ZpZXMgUGVyc29uVXBkYXRlXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXQgPSB7XG4gICAgICogICBuYW1lOiAnRmx1ZmZ5JyxcbiAgICAgKiB9IHNhdGlzZmllcyBQZXRVcGRhdGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAud2l0aCgndXBkYXRlZF9wZXJzb24nLCAocWIpID0+IHFiXG4gICAgICogICAgIC51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgICAgLnNldChwZXJzb24pXG4gICAgICogICAgIC53aGVyZSgnaWQnLCAnPScsIHBlcnNvbi5pZClcbiAgICAgKiAgICAgLnJldHVybmluZygnZmlyc3RfbmFtZScpXG4gICAgICogICAgIC4kYXNzZXJ0VHlwZTx7IGZpcnN0X25hbWU6IHN0cmluZyB9PigpXG4gICAgICogICApXG4gICAgICogICAud2l0aCgndXBkYXRlZF9wZXQnLCAocWIpID0+IHFiXG4gICAgICogICAgIC51cGRhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgICAgLnNldChwZXQpXG4gICAgICogICAgIC53aGVyZSgnb3duZXJfaWQnLCAnPScsIHBlcnNvbi5pZClcbiAgICAgKiAgICAgLnJldHVybmluZyhbJ25hbWUgYXMgcGV0X25hbWUnLCAnc3BlY2llcyddKVxuICAgICAqICAgICAuJGFzc2VydFR5cGU8eyBwZXRfbmFtZTogc3RyaW5nLCBzcGVjaWVzOiBTcGVjaWVzIH0+KClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5zZWxlY3RGcm9tKFsndXBkYXRlZF9wZXJzb24nLCAndXBkYXRlZF9wZXQnXSlcbiAgICAgKiAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkYXNzZXJ0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIFVwZGF0ZVF1ZXJ5QnVpbGRlciBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaW5zdGFsbGVkLlxuICAgICAqL1xuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiByb3dzLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBleGVjdXRlVGFrZUZpcnN0fSBhbmQge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93fSBtZXRob2RzLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgICAgICBjb25zdCB7IGFkYXB0ZXIgfSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGNvbXBpbGVkUXVlcnkucXVlcnk7XG4gICAgICAgIGlmICgocXVlcnkucmV0dXJuaW5nICYmIGFkYXB0ZXIuc3VwcG9ydHNSZXR1cm5pbmcpIHx8XG4gICAgICAgICAgICAocXVlcnkub3V0cHV0ICYmIGFkYXB0ZXIuc3VwcG9ydHNPdXRwdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBVcGRhdGVSZXN1bHQocmVzdWx0Lm51bUFmZmVjdGVkUm93cyA/PyBCaWdJbnQoMCksIHJlc3VsdC5udW1DaGFuZ2VkUm93cyksXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHVuZGVmaW5lZCBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdCgpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdGhyb3dzIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vUmVzdWx0RXJyb3J9IGlzIHRocm93biwgYnV0IHlvdSBjYW5cbiAgICAgKiBwcm92aWRlIGEgY3VzdG9tIGVycm9yIGNsYXNzLCBvciBjYWxsYmFjayBhcyB0aGUgb25seSBhcmd1bWVudCB0byB0aHJvdyBhIGRpZmZlcmVudFxuICAgICAqIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjaHVua1NpemUgPSAxMDApIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLiNwcm9wcy5leGVjdXRvci5zdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHN0cmVhbSkge1xuICAgICAgICAgICAgeWllbGQqIGl0ZW0ucm93cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBleHBsYWluKGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEV4cGxhaW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBmb3JtYXQsIG9wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1aWxkZXIuZXhlY3V0ZSgpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXBkYXRlLXJlc3VsdC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBVcGRhdGVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyB0aGUgdXBkYXRlIHF1ZXJ5IHVwZGF0ZWQgKGV2ZW4gaWYgbm90IGNoYW5nZWQpLlxuICAgICAqL1xuICAgIG51bVVwZGF0ZWRSb3dzO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyB0aGUgdXBkYXRlIHF1ZXJ5IGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzICoqb3B0aW9uYWwqKiBhbmQgb25seSBzdXBwb3J0ZWQgaW4gZGlhbGVjdHMgc3VjaCBhcyBNeVNRTC5cbiAgICAgKiBZb3Ugd291bGQgcHJvYmFibHkgdXNlIHtAbGluayBudW1VcGRhdGVkUm93c30gaW4gbW9zdCBjYXNlcy5cbiAgICAgKi9cbiAgICBudW1DaGFuZ2VkUm93cztcbiAgICBjb25zdHJ1Y3RvcihudW1VcGRhdGVkUm93cywgbnVtQ2hhbmdlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5udW1VcGRhdGVkUm93cyA9IG51bVVwZGF0ZWRSb3dzO1xuICAgICAgICB0aGlzLm51bUNoYW5nZWRSb3dzID0gbnVtQ2hhbmdlZFJvd3M7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aXRoLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29tbW9uLXRhYmxlLWV4cHJlc3Npb24tbmFtZS1ub2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5Q3JlYXRvciB9IGZyb20gJy4vcGFyc2UtdXRpbHMuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENURUJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2N0ZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbihuYW1lT3JCdWlsZGVyQ2FsbGJhY2ssIGV4cHJlc3Npb24pIHtcbiAgICBjb25zdCBleHByZXNzaW9uTm9kZSA9IGV4cHJlc3Npb24oY3JlYXRlUXVlcnlDcmVhdG9yKCkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKG5hbWVPckJ1aWxkZXJDYWxsYmFjaykpIHtcbiAgICAgICAgcmV0dXJuIG5hbWVPckJ1aWxkZXJDYWxsYmFjayhjdGVCdWlsZGVyRmFjdG9yeShleHByZXNzaW9uTm9kZSkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZS5jcmVhdGUocGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lKG5hbWVPckJ1aWxkZXJDYWxsYmFjayksIGV4cHJlc3Npb25Ob2RlKTtcbn1cbmZ1bmN0aW9uIGN0ZUJ1aWxkZXJGYWN0b3J5KGV4cHJlc3Npb25Ob2RlKSB7XG4gICAgcmV0dXJuIChuYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ1RFQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlLmNyZWF0ZShwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobmFtZSksIGV4cHJlc3Npb25Ob2RlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZShuYW1lKSB7XG4gICAgaWYgKG5hbWUuaW5jbHVkZXMoJygnKSkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoL1tcXChcXCldLyk7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gcGFydHNbMF07XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBwYXJ0c1sxXS5zcGxpdCgnLCcpLm1hcCgoaXQpID0+IGl0LnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZS5jcmVhdGUodGFibGUsIGNvbHVtbnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlLmNyZWF0ZShuYW1lKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5hbWUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IFRhYmxlTm9kZSB9IGZyb20gJy4vdGFibGUtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZU5hbWUsIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiBUYWJsZU5vZGUuY3JlYXRlKHRhYmxlTmFtZSksXG4gICAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5OYW1lc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKGNvbHVtbk5hbWVzLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3RlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29tbW9uLXRhYmxlLWV4cHJlc3Npb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQ1RFQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGNvbW1vbiB0YWJsZSBleHByZXNzaW9uIG1hdGVyaWFsaXplZC5cbiAgICAgKi9cbiAgICBtYXRlcmlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ1RFQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBjb21tb24gdGFibGUgZXhwcmVzc2lvbiBub3QgbWF0ZXJpYWxpemVkLlxuICAgICAqL1xuICAgIG5vdE1hdGVyaWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDVEVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplZDogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZScsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vd2l0aC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFdpdGhOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdXaXRoTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZXhwcmVzc2lvbiwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1dpdGhOb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25zOiBmcmVlemUoW2V4cHJlc3Npb25dKSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFeHByZXNzaW9uKHdpdGhOb2RlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ud2l0aE5vZGUsXG4gICAgICAgICAgICBleHByZXNzaW9uczogZnJlZXplKFsuLi53aXRoTm9kZS5leHByZXNzaW9ucywgZXhwcmVzc2lvbl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3F1ZXJ5LWlkLmQudHNcIiAvPlxuaW1wb3J0IHsgcmFuZG9tU3RyaW5nIH0gZnJvbSAnLi9yYW5kb20tc3RyaW5nLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdWVyeUlkKCkge1xuICAgIHJldHVybiBuZXcgTGF6eVF1ZXJ5SWQoKTtcbn1cbmNsYXNzIExhenlRdWVyeUlkIHtcbiAgICAjcXVlcnlJZDtcbiAgICBnZXQgcXVlcnlJZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI3F1ZXJ5SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy4jcXVlcnlJZCA9IHJhbmRvbVN0cmluZyg4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jcXVlcnlJZDtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JhbmRvbS1zdHJpbmcuZC50c1wiIC8+XG5jb25zdCBDSEFSUyA9IFtcbiAgICAnQScsXG4gICAgJ0InLFxuICAgICdDJyxcbiAgICAnRCcsXG4gICAgJ0UnLFxuICAgICdGJyxcbiAgICAnRycsXG4gICAgJ0gnLFxuICAgICdJJyxcbiAgICAnSicsXG4gICAgJ0snLFxuICAgICdMJyxcbiAgICAnTScsXG4gICAgJ04nLFxuICAgICdPJyxcbiAgICAnUCcsXG4gICAgJ1EnLFxuICAgICdSJyxcbiAgICAnUycsXG4gICAgJ1QnLFxuICAgICdVJyxcbiAgICAnVicsXG4gICAgJ1cnLFxuICAgICdYJyxcbiAgICAnWScsXG4gICAgJ1onLFxuICAgICdhJyxcbiAgICAnYicsXG4gICAgJ2MnLFxuICAgICdkJyxcbiAgICAnZScsXG4gICAgJ2YnLFxuICAgICdnJyxcbiAgICAnaCcsXG4gICAgJ2knLFxuICAgICdqJyxcbiAgICAnaycsXG4gICAgJ2wnLFxuICAgICdtJyxcbiAgICAnbicsXG4gICAgJ28nLFxuICAgICdwJyxcbiAgICAncScsXG4gICAgJ3InLFxuICAgICdzJyxcbiAgICAndCcsXG4gICAgJ3UnLFxuICAgICd2JyxcbiAgICAndycsXG4gICAgJ3gnLFxuICAgICd5JyxcbiAgICAneicsXG4gICAgJzAnLFxuICAgICcxJyxcbiAgICAnMicsXG4gICAgJzMnLFxuICAgICc0JyxcbiAgICAnNScsXG4gICAgJzYnLFxuICAgICc3JyxcbiAgICAnOCcsXG4gICAgJzknLFxuXTtcbmV4cG9ydCBmdW5jdGlvbiByYW5kb21TdHJpbmcobGVuZ3RoKSB7XG4gICAgbGV0IGNoYXJzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICBjaGFycyArPSByYW5kb21DaGFyKCk7XG4gICAgfVxuICAgIHJldHVybiBjaGFycztcbn1cbmZ1bmN0aW9uIHJhbmRvbUNoYXIoKSB7XG4gICAgcmV0dXJuIENIQVJTW35+KE1hdGgucmFuZG9tKCkgKiBDSEFSUy5sZW5ndGgpXTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vd2l0aC1zY2hlbWEtcGx1Z2luLmQudHNcIiAvPlxuaW1wb3J0IHsgV2l0aFNjaGVtYVRyYW5zZm9ybWVyIH0gZnJvbSAnLi93aXRoLXNjaGVtYS10cmFuc2Zvcm1lci5qcyc7XG5leHBvcnQgY2xhc3MgV2l0aFNjaGVtYVBsdWdpbiB7XG4gICAgI3RyYW5zZm9ybWVyO1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICB0aGlzLiN0cmFuc2Zvcm1lciA9IG5ldyBXaXRoU2NoZW1hVHJhbnNmb3JtZXIoc2NoZW1hKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUXVlcnkoYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhbnNmb3JtZXIudHJhbnNmb3JtTm9kZShhcmdzLm5vZGUsIGFyZ3MucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIHRyYW5zZm9ybVJlc3VsdChhcmdzKSB7XG4gICAgICAgIHJldHVybiBhcmdzLnJlc3VsdDtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBMaXN0Tm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL2xpc3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS10cmFuc2Zvcm1lci5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi8uLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vLyBUaGlzIG9iamVjdCBleGlzdCBvbmx5IHNvIHRoYXQgd2UgZ2V0IGEgdHlwZSBlcnJvciB3aGVuIGEgbmV3IFJvb3RPcGVyYXRpb25Ob2RlXG4vLyBpcyBhZGRlZC4gSWYgeW91IGdldCBhIHR5cGUgZXJyb3IgaGVyZSwgbWFrZSBzdXJlIHRvIGFkZCB0aGUgbmV3IHJvb3Qgbm9kZSBhbmRcbi8vIGhhbmRsZSBpdCBjb3JyZWN0bHkgaW4gdGhlIHRyYW5zZm9ybWVyLlxuLy9cbi8vIERPIE5PVCBSRUZBQ1RPUiBUSElTIEVWRU4gSUYgSVQgU0VFTVMgVVNFTEVTUyBUTyBZT1UhXG5jb25zdCBST09UX09QRVJBVElPTl9OT0RFUyA9IGZyZWV6ZSh7XG4gICAgQWx0ZXJUYWJsZU5vZGU6IHRydWUsXG4gICAgQ3JlYXRlSW5kZXhOb2RlOiB0cnVlLFxuICAgIENyZWF0ZVNjaGVtYU5vZGU6IHRydWUsXG4gICAgQ3JlYXRlVGFibGVOb2RlOiB0cnVlLFxuICAgIENyZWF0ZVR5cGVOb2RlOiB0cnVlLFxuICAgIENyZWF0ZVZpZXdOb2RlOiB0cnVlLFxuICAgIFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZTogdHJ1ZSxcbiAgICBEZWxldGVRdWVyeU5vZGU6IHRydWUsXG4gICAgRHJvcEluZGV4Tm9kZTogdHJ1ZSxcbiAgICBEcm9wU2NoZW1hTm9kZTogdHJ1ZSxcbiAgICBEcm9wVGFibGVOb2RlOiB0cnVlLFxuICAgIERyb3BUeXBlTm9kZTogdHJ1ZSxcbiAgICBEcm9wVmlld05vZGU6IHRydWUsXG4gICAgSW5zZXJ0UXVlcnlOb2RlOiB0cnVlLFxuICAgIFJhd05vZGU6IHRydWUsXG4gICAgU2VsZWN0UXVlcnlOb2RlOiB0cnVlLFxuICAgIFVwZGF0ZVF1ZXJ5Tm9kZTogdHJ1ZSxcbiAgICBNZXJnZVF1ZXJ5Tm9kZTogdHJ1ZSxcbn0pO1xuY29uc3QgU0NIRU1BTEVTU19GVU5DVElPTlMgPSB7XG4gICAganNvbl9hZ2c6IHRydWUsXG4gICAgdG9fanNvbjogdHJ1ZSxcbn07XG5leHBvcnQgY2xhc3MgV2l0aFNjaGVtYVRyYW5zZm9ybWVyIGV4dGVuZHMgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIHtcbiAgICAjc2NoZW1hO1xuICAgICNzY2hlbWFibGVJZHMgPSBuZXcgU2V0KCk7XG4gICAgI2N0ZXMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI3NjaGVtYSA9IHNjaGVtYTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTm9kZUltcGwobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICBpZiAoIXRoaXMuI2lzUm9vdE9wZXJhdGlvbk5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci50cmFuc2Zvcm1Ob2RlSW1wbChub2RlLCBxdWVyeUlkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdGVzID0gdGhpcy4jY29sbGVjdENURXMobm9kZSk7XG4gICAgICAgIGZvciAoY29uc3QgY3RlIG9mIGN0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI2N0ZXMuYWRkKGN0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVzID0gdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkcyhub2RlKTtcbiAgICAgICAgZm9yIChjb25zdCB0YWJsZSBvZiB0YWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI3NjaGVtYWJsZUlkcy5hZGQodGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gc3VwZXIudHJhbnNmb3JtTm9kZUltcGwobm9kZSwgcXVlcnlJZCk7XG4gICAgICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLiNzY2hlbWFibGVJZHMuZGVsZXRlKHRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGN0ZSBvZiBjdGVzKSB7XG4gICAgICAgICAgICB0aGlzLiNjdGVzLmRlbGV0ZShjdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2NoZW1hYmxlSWRlbnRpZmllcihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gc3VwZXIudHJhbnNmb3JtU2NoZW1hYmxlSWRlbnRpZmllcihub2RlLCBxdWVyeUlkKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkLnNjaGVtYSB8fCAhdGhpcy4jc2NoZW1hYmxlSWRzLmhhcyhub2RlLmlkZW50aWZpZXIubmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udHJhbnNmb3JtZWQsXG4gICAgICAgICAgICBzY2hlbWE6IElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNzY2hlbWEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZWZlcmVuY2VzKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBzdXBlci50cmFuc2Zvcm1SZWZlcmVuY2VzKG5vZGUsIHF1ZXJ5SWQpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWQudGFibGUudGFibGUuc2NoZW1hKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRyYW5zZm9ybWVkLFxuICAgICAgICAgICAgdGFibGU6IFRhYmxlTm9kZS5jcmVhdGVXaXRoU2NoZW1hKHRoaXMuI3NjaGVtYSwgdHJhbnNmb3JtZWQudGFibGUudGFibGUuaWRlbnRpZmllci5uYW1lKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWdncmVnYXRlRnVuY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3VwZXIudHJhbnNmb3JtQWdncmVnYXRlRnVuY3Rpb24oeyAuLi5ub2RlLCBhZ2dyZWdhdGVkOiBbXSB9LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZWQ6IHRoaXMuI3RyYW5zZm9ybVRhYmxlQXJnc1dpdGhvdXRTY2hlbWFzKG5vZGUsIHF1ZXJ5SWQsICdhZ2dyZWdhdGVkJyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHRyYW5zZm9ybUZ1bmN0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN1cGVyLnRyYW5zZm9ybUZ1bmN0aW9uKHsgLi4ubm9kZSwgYXJndW1lbnRzOiBbXSB9LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogdGhpcy4jdHJhbnNmb3JtVGFibGVBcmdzV2l0aG91dFNjaGVtYXMobm9kZSwgcXVlcnlJZCwgJ2FyZ3VtZW50cycpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAjdHJhbnNmb3JtVGFibGVBcmdzV2l0aG91dFNjaGVtYXMobm9kZSwgcXVlcnlJZCwgYXJnc0tleSkge1xuICAgICAgICByZXR1cm4gU0NIRU1BTEVTU19GVU5DVElPTlNbbm9kZS5mdW5jXVxuICAgICAgICAgICAgPyBub2RlW2FyZ3NLZXldLm1hcCgoYXJnKSA9PiAhVGFibGVOb2RlLmlzKGFyZykgfHwgYXJnLnRhYmxlLnNjaGVtYVxuICAgICAgICAgICAgICAgID8gdGhpcy50cmFuc2Zvcm1Ob2RlKGFyZywgcXVlcnlJZClcbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYXJnLFxuICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1JZGVudGlmaWVyKGFyZy50YWJsZS5pZGVudGlmaWVyLCBxdWVyeUlkKSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGVbYXJnc0tleV0sIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICAjaXNSb290T3BlcmF0aW9uTm9kZShub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgaW4gUk9PVF9PUEVSQVRJT05fTk9ERVM7XG4gICAgfVxuICAgICNjb2xsZWN0U2NoZW1hYmxlSWRzKG5vZGUpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hYmxlSWRzID0gbmV3IFNldCgpO1xuICAgICAgICBpZiAoJ25hbWUnIGluIG5vZGUgJiYgbm9kZS5uYW1lICYmIFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmlzKG5vZGUubmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZChub2RlLm5hbWUsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdmcm9tJyBpbiBub2RlICYmIG5vZGUuZnJvbSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmcm9tIG9mIG5vZGUuZnJvbS5mcm9tcykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKGZyb20sIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdpbnRvJyBpbiBub2RlICYmIG5vZGUuaW50bykge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIobm9kZS5pbnRvLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgndGFibGUnIGluIG5vZGUgJiYgbm9kZS50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIobm9kZS50YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2pvaW5zJyBpbiBub2RlICYmIG5vZGUuam9pbnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgam9pbiBvZiBub2RlLmpvaW5zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIoam9pbi50YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ3VzaW5nJyBpbiBub2RlICYmIG5vZGUudXNpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKG5vZGUudXNpbmcsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjaGVtYWJsZUlkcztcbiAgICB9XG4gICAgI2NvbGxlY3RDVEVzKG5vZGUpIHtcbiAgICAgICAgY29uc3QgY3RlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgaWYgKCd3aXRoJyBpbiBub2RlICYmIG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdENURUlkcyhub2RlLndpdGgsIGN0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdGVzO1xuICAgIH1cbiAgICAjY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIobm9kZSwgc2NoZW1hYmxlSWRzKSB7XG4gICAgICAgIGlmIChUYWJsZU5vZGUuaXMobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZChub2RlLnRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFsaWFzTm9kZS5pcyhub2RlKSAmJiBUYWJsZU5vZGUuaXMobm9kZS5ub2RlKSkge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkKG5vZGUubm9kZS50YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChMaXN0Tm9kZS5pcyhub2RlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YWJsZSBvZiBub2RlLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIodGFibGUsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2NvbGxlY3RTY2hlbWFibGVJZChub2RlLCBzY2hlbWFibGVJZHMpIHtcbiAgICAgICAgY29uc3QgaWQgPSBub2RlLmlkZW50aWZpZXIubmFtZTtcbiAgICAgICAgaWYgKCF0aGlzLiNzY2hlbWFibGVJZHMuaGFzKGlkKSAmJiAhdGhpcy4jY3Rlcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBzY2hlbWFibGVJZHMuYWRkKGlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjY29sbGVjdENURUlkcyhub2RlLCBjdGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBub2RlLmV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBjb25zdCBjdGVJZCA9IGV4cHIubmFtZS50YWJsZS50YWJsZS5pZGVudGlmaWVyLm5hbWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2N0ZXMuaGFzKGN0ZUlkKSkge1xuICAgICAgICAgICAgICAgIGN0ZXMuYWRkKGN0ZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3BlcmF0aW9uLW5vZGUtdHJhbnNmb3JtZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyByZXF1aXJlQWxsUHJvcHMgfSBmcm9tICcuLi91dGlsL3JlcXVpcmUtYWxsLXByb3BzLmpzJztcbi8qKlxuICogVHJhbnNmb3JtcyBhbiBvcGVyYXRpb24gbm9kZSB0cmVlIGludG8gYW5vdGhlciBvbmUuXG4gKlxuICogS3lzZWx5IHF1ZXJpZXMgYXJlIGV4cHJlc3NlZCBpbnRlcm5hbGx5IGFzIGEgdHJlZSBvZiBvYmplY3RzIChvcGVyYXRpb24gbm9kZXMpLlxuICogYE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lcmAgdGFrZXMgc3VjaCBhIHRyZWUgYXMgaXRzIGlucHV0IGFuZCByZXR1cm5zIGFcbiAqIHRyYW5zZm9ybWVkIGRlZXAgY29weSBvZiBpdC4gQnkgZGVmYXVsdCB0aGUgYE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lcmBcbiAqIGRvZXMgbm90aGluZy4gWW91IG5lZWQgdG8gb3ZlcnJpZGUgb25lIG9yIG1vcmUgbWV0aG9kcyB0byBtYWtlIGl0IGRvXG4gKiBzb21ldGhpbmcuXG4gKlxuICogVGhlcmUncyBhIG1ldGhvZCBmb3IgZWFjaCBub2RlIHR5cGUuIEZvciBleGFtcGxlIGlmIHlvdSdkIGxpa2UgdG8gY29udmVydFxuICogZWFjaCBpZGVudGlmaWVyICh0YWJsZSBuYW1lLCBjb2x1bW4gbmFtZSwgYWxpYXMgZXRjLikgZnJvbSBjYW1lbENhc2UgdG9cbiAqIHNuYWtlX2Nhc2UsIHlvdSdkIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHR5cGUgSWRlbnRpZmllck5vZGUsIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB9IGZyb20gJ2t5c2VseSdcbiAqIGltcG9ydCBzbmFrZUNhc2UgZnJvbSAnbG9kYXNoL3NuYWtlQ2FzZSdcbiAqXG4gKiBjbGFzcyBDYW1lbENhc2VUcmFuc2Zvcm1lciBleHRlbmRzIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB7XG4gKiAgIG92ZXJyaWRlIHRyYW5zZm9ybUlkZW50aWZpZXIobm9kZTogSWRlbnRpZmllck5vZGUpOiBJZGVudGlmaWVyTm9kZSB7XG4gKiAgICAgbm9kZSA9IHN1cGVyLnRyYW5zZm9ybUlkZW50aWZpZXIobm9kZSlcbiAqXG4gKiAgICAgcmV0dXJuIHtcbiAqICAgICAgIC4uLm5vZGUsXG4gKiAgICAgICBuYW1lOiBzbmFrZUNhc2Uobm9kZS5uYW1lKSxcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBDYW1lbENhc2VUcmFuc2Zvcm1lcigpXG4gKlxuICogY29uc3QgcXVlcnkgPSBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddKVxuICpcbiAqIGNvbnN0IHRyZWUgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKHF1ZXJ5LnRvT3BlcmF0aW9uTm9kZSgpKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICAgIG5vZGVTdGFjayA9IFtdO1xuICAgICN0cmFuc2Zvcm1lcnMgPSBmcmVlemUoe1xuICAgICAgICBBbGlhc05vZGU6IHRoaXMudHJhbnNmb3JtQWxpYXMuYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1Db2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgSWRlbnRpZmllck5vZGU6IHRoaXMudHJhbnNmb3JtSWRlbnRpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBTY2hlbWFibGVJZGVudGlmaWVyTm9kZTogdGhpcy50cmFuc2Zvcm1TY2hlbWFibGVJZGVudGlmaWVyLmJpbmQodGhpcyksXG4gICAgICAgIFJhd05vZGU6IHRoaXMudHJhbnNmb3JtUmF3LmJpbmQodGhpcyksXG4gICAgICAgIFJlZmVyZW5jZU5vZGU6IHRoaXMudHJhbnNmb3JtUmVmZXJlbmNlLmJpbmQodGhpcyksXG4gICAgICAgIFNlbGVjdFF1ZXJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1TZWxlY3RRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3Rpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybVNlbGVjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBUYWJsZU5vZGU6IHRoaXMudHJhbnNmb3JtVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRnJvbU5vZGU6IHRoaXMudHJhbnNmb3JtRnJvbS5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3RBbGxOb2RlOiB0aGlzLnRyYW5zZm9ybVNlbGVjdEFsbC5iaW5kKHRoaXMpLFxuICAgICAgICBBbmROb2RlOiB0aGlzLnRyYW5zZm9ybUFuZC5iaW5kKHRoaXMpLFxuICAgICAgICBPck5vZGU6IHRoaXMudHJhbnNmb3JtT3IuYmluZCh0aGlzKSxcbiAgICAgICAgVmFsdWVOb2RlOiB0aGlzLnRyYW5zZm9ybVZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTGlzdE5vZGU6IHRoaXMudHJhbnNmb3JtVmFsdWVMaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFByaW1pdGl2ZVZhbHVlTGlzdE5vZGU6IHRoaXMudHJhbnNmb3JtUHJpbWl0aXZlVmFsdWVMaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFBhcmVuc05vZGU6IHRoaXMudHJhbnNmb3JtUGFyZW5zLmJpbmQodGhpcyksXG4gICAgICAgIEpvaW5Ob2RlOiB0aGlzLnRyYW5zZm9ybUpvaW4uYmluZCh0aGlzKSxcbiAgICAgICAgT3BlcmF0b3JOb2RlOiB0aGlzLnRyYW5zZm9ybU9wZXJhdG9yLmJpbmQodGhpcyksXG4gICAgICAgIFdoZXJlTm9kZTogdGhpcy50cmFuc2Zvcm1XaGVyZS5iaW5kKHRoaXMpLFxuICAgICAgICBJbnNlcnRRdWVyeU5vZGU6IHRoaXMudHJhbnNmb3JtSW5zZXJ0UXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgRGVsZXRlUXVlcnlOb2RlOiB0aGlzLnRyYW5zZm9ybURlbGV0ZVF1ZXJ5LmJpbmQodGhpcyksXG4gICAgICAgIFJldHVybmluZ05vZGU6IHRoaXMudHJhbnNmb3JtUmV0dXJuaW5nLmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVRhYmxlTm9kZTogdGhpcy50cmFuc2Zvcm1DcmVhdGVUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRDb2x1bW5Ob2RlOiB0aGlzLnRyYW5zZm9ybUFkZENvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb2x1bW5EZWZpbml0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1Db2x1bW5EZWZpbml0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BUYWJsZU5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcFRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIERhdGFUeXBlTm9kZTogdGhpcy50cmFuc2Zvcm1EYXRhVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgICBPcmRlckJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1PcmRlckJ5LmJpbmQodGhpcyksXG4gICAgICAgIE9yZGVyQnlJdGVtTm9kZTogdGhpcy50cmFuc2Zvcm1PcmRlckJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBHcm91cEJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1Hcm91cEJ5LmJpbmQodGhpcyksXG4gICAgICAgIEdyb3VwQnlJdGVtTm9kZTogdGhpcy50cmFuc2Zvcm1Hcm91cEJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBVcGRhdGVRdWVyeU5vZGU6IHRoaXMudHJhbnNmb3JtVXBkYXRlUXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uVXBkYXRlTm9kZTogdGhpcy50cmFuc2Zvcm1Db2x1bW5VcGRhdGUuYmluZCh0aGlzKSxcbiAgICAgICAgTGltaXROb2RlOiB0aGlzLnRyYW5zZm9ybUxpbWl0LmJpbmQodGhpcyksXG4gICAgICAgIE9mZnNldE5vZGU6IHRoaXMudHJhbnNmb3JtT2Zmc2V0LmJpbmQodGhpcyksXG4gICAgICAgIE9uQ29uZmxpY3ROb2RlOiB0aGlzLnRyYW5zZm9ybU9uQ29uZmxpY3QuYmluZCh0aGlzKSxcbiAgICAgICAgT25EdXBsaWNhdGVLZXlOb2RlOiB0aGlzLnRyYW5zZm9ybU9uRHVwbGljYXRlS2V5LmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZUluZGV4Tm9kZTogdGhpcy50cmFuc2Zvcm1DcmVhdGVJbmRleC5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wSW5kZXhOb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BJbmRleC5iaW5kKHRoaXMpLFxuICAgICAgICBMaXN0Tm9kZTogdGhpcy50cmFuc2Zvcm1MaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1QcmltYXJ5S2V5Q29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBVbmlxdWVDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1VbmlxdWVDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFJlZmVyZW5jZXNOb2RlOiB0aGlzLnRyYW5zZm9ybVJlZmVyZW5jZXMuYmluZCh0aGlzKSxcbiAgICAgICAgQ2hlY2tDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1DaGVja0NvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgV2l0aE5vZGU6IHRoaXMudHJhbnNmb3JtV2l0aC5iaW5kKHRoaXMpLFxuICAgICAgICBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlOiB0aGlzLnRyYW5zZm9ybUNvbW1vblRhYmxlRXhwcmVzc2lvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZTogdGhpcy50cmFuc2Zvcm1Db21tb25UYWJsZUV4cHJlc3Npb25OYW1lLmJpbmQodGhpcyksXG4gICAgICAgIEhhdmluZ05vZGU6IHRoaXMudHJhbnNmb3JtSGF2aW5nLmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVNjaGVtYU5vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlU2NoZW1hLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BTY2hlbWFOb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BTY2hlbWEuYmluZCh0aGlzKSxcbiAgICAgICAgQWx0ZXJUYWJsZU5vZGU6IHRoaXMudHJhbnNmb3JtQWx0ZXJUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wQ29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIFJlbmFtZUNvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtUmVuYW1lQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIEFsdGVyQ29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1BbHRlckNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBNb2RpZnlDb2x1bW5Ob2RlOiB0aGlzLnRyYW5zZm9ybU1vZGlmeUNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1BZGRDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIERyb3BDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBSZW5hbWVDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1SZW5hbWVDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1Gb3JlaWduS2V5Q29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVWaWV3Tm9kZTogdGhpcy50cmFuc2Zvcm1DcmVhdGVWaWV3LmJpbmQodGhpcyksXG4gICAgICAgIFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZTogdGhpcy50cmFuc2Zvcm1SZWZyZXNoTWF0ZXJpYWxpemVkVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVmlld05vZGU6IHRoaXMudHJhbnNmb3JtRHJvcFZpZXcuYmluZCh0aGlzKSxcbiAgICAgICAgR2VuZXJhdGVkTm9kZTogdGhpcy50cmFuc2Zvcm1HZW5lcmF0ZWQuYmluZCh0aGlzKSxcbiAgICAgICAgRGVmYXVsdFZhbHVlTm9kZTogdGhpcy50cmFuc2Zvcm1EZWZhdWx0VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgT25Ob2RlOiB0aGlzLnRyYW5zZm9ybU9uLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlc05vZGU6IHRoaXMudHJhbnNmb3JtVmFsdWVzLmJpbmQodGhpcyksXG4gICAgICAgIFNlbGVjdE1vZGlmaWVyTm9kZTogdGhpcy50cmFuc2Zvcm1TZWxlY3RNb2RpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVUeXBlTm9kZTogdGhpcy50cmFuc2Zvcm1DcmVhdGVUeXBlLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BUeXBlTm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgICBFeHBsYWluTm9kZTogdGhpcy50cmFuc2Zvcm1FeHBsYWluLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRJbnNlcnRWYWx1ZU5vZGU6IHRoaXMudHJhbnNmb3JtRGVmYXVsdEluc2VydFZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1BZ2dyZWdhdGVGdW5jdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBPdmVyTm9kZTogdGhpcy50cmFuc2Zvcm1PdmVyLmJpbmQodGhpcyksXG4gICAgICAgIFBhcnRpdGlvbkJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1QYXJ0aXRpb25CeS5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJ0aXRpb25CeUl0ZW1Ob2RlOiB0aGlzLnRyYW5zZm9ybVBhcnRpdGlvbkJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBTZXRPcGVyYXRpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybVNldE9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBCaW5hcnlPcGVyYXRpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybUJpbmFyeU9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBVbmFyeU9wZXJhdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtVW5hcnlPcGVyYXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgVXNpbmdOb2RlOiB0aGlzLnRyYW5zZm9ybVVzaW5nLmJpbmQodGhpcyksXG4gICAgICAgIEZ1bmN0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1GdW5jdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDYXNlTm9kZTogdGhpcy50cmFuc2Zvcm1DYXNlLmJpbmQodGhpcyksXG4gICAgICAgIFdoZW5Ob2RlOiB0aGlzLnRyYW5zZm9ybVdoZW4uYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTlJlZmVyZW5jZU5vZGU6IHRoaXMudHJhbnNmb3JtSlNPTlJlZmVyZW5jZS5iaW5kKHRoaXMpLFxuICAgICAgICBKU09OUGF0aE5vZGU6IHRoaXMudHJhbnNmb3JtSlNPTlBhdGguYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTlBhdGhMZWdOb2RlOiB0aGlzLnRyYW5zZm9ybUpTT05QYXRoTGVnLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05PcGVyYXRvckNoYWluTm9kZTogdGhpcy50cmFuc2Zvcm1KU09OT3BlcmF0b3JDaGFpbi5iaW5kKHRoaXMpLFxuICAgICAgICBUdXBsZU5vZGU6IHRoaXMudHJhbnNmb3JtVHVwbGUuYmluZCh0aGlzKSxcbiAgICAgICAgTWVyZ2VRdWVyeU5vZGU6IHRoaXMudHJhbnNmb3JtTWVyZ2VRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBNYXRjaGVkTm9kZTogdGhpcy50cmFuc2Zvcm1NYXRjaGVkLmJpbmQodGhpcyksXG4gICAgICAgIEFkZEluZGV4Tm9kZTogdGhpcy50cmFuc2Zvcm1BZGRJbmRleC5iaW5kKHRoaXMpLFxuICAgICAgICBDYXN0Tm9kZTogdGhpcy50cmFuc2Zvcm1DYXN0LmJpbmQodGhpcyksXG4gICAgICAgIEZldGNoTm9kZTogdGhpcy50cmFuc2Zvcm1GZXRjaC5iaW5kKHRoaXMpLFxuICAgICAgICBUb3BOb2RlOiB0aGlzLnRyYW5zZm9ybVRvcC5iaW5kKHRoaXMpLFxuICAgICAgICBPdXRwdXROb2RlOiB0aGlzLnRyYW5zZm9ybU91dHB1dC5iaW5kKHRoaXMpLFxuICAgICAgICBPckFjdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtT3JBY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgQ29sbGF0ZU5vZGU6IHRoaXMudHJhbnNmb3JtQ29sbGF0ZS5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICAgIHRyYW5zZm9ybU5vZGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZVN0YWNrLnB1c2gobm9kZSk7XG4gICAgICAgIGNvbnN0IG91dCA9IHRoaXMudHJhbnNmb3JtTm9kZUltcGwobm9kZSwgcXVlcnlJZCk7XG4gICAgICAgIHRoaXMubm9kZVN0YWNrLnBvcCgpO1xuICAgICAgICByZXR1cm4gZnJlZXplKG91dCk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU5vZGVJbXBsKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zZm9ybWVyc1tub2RlLmtpbmRdKG5vZGUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ob2RlTGlzdChsaXN0LCBxdWVyeUlkKSB7XG4gICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyZWV6ZShsaXN0Lm1hcCgobm9kZSkgPT4gdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUsIHF1ZXJ5SWQpKSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNlbGVjdFF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0UXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGZyb206IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZyb20sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgc2VsZWN0aW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnNlbGVjdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGlzdGluY3RPbjogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmRpc3RpbmN0T24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgam9pbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5qb2lucywgcXVlcnlJZCksXG4gICAgICAgICAgICBncm91cEJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5ncm91cEJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGxpbWl0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5saW1pdCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9mZnNldCwgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGhhdmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaGF2aW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGV4cGxhaW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cGxhaW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgc2V0T3BlcmF0aW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnNldE9wZXJhdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZmV0Y2g6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZldGNoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNlbGVjdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdGlvbk5vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zZWxlY3Rpb24sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BbGlhcyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FsaWFzTm9kZScsXG4gICAgICAgICAgICBub2RlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5ub2RlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFsaWFzOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5hbGlhcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1UYWJsZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1RhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRnJvbShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Zyb21Ob2RlJyxcbiAgICAgICAgICAgIGZyb21zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZnJvbXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVmZXJlbmNlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQW5kKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQW5kTm9kZScsXG4gICAgICAgICAgICBsZWZ0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5sZWZ0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yaWdodCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Pcihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09yTm9kZScsXG4gICAgICAgICAgICBsZWZ0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5sZWZ0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yaWdodCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1WYWx1ZUxpc3Qobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZUxpc3ROb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnZhbHVlcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1QYXJlbnMobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQYXJlbnNOb2RlJyxcbiAgICAgICAgICAgIG5vZGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5vZGUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSm9pbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0pvaW5Ob2RlJyxcbiAgICAgICAgICAgIGpvaW5UeXBlOiBub2RlLmpvaW5UeXBlLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SYXcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSYXdOb2RlJyxcbiAgICAgICAgICAgIHNxbEZyYWdtZW50czogZnJlZXplKFsuLi5ub2RlLnNxbEZyYWdtZW50c10pLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnBhcmFtZXRlcnMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtV2hlcmUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdXaGVyZU5vZGUnLFxuICAgICAgICAgICAgd2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUluc2VydFF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSW5zZXJ0UXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGludG86IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmludG8sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS52YWx1ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZXR1cm5pbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb25Db25mbGljdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub25Db25mbGljdCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvbkR1cGxpY2F0ZUtleTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub25EdXBsaWNhdGVLZXksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndpdGgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWdub3JlOiBub2RlLmlnbm9yZSxcbiAgICAgICAgICAgIG9yQWN0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vckFjdGlvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICByZXBsYWNlOiBub2RlLnJlcGxhY2UsXG4gICAgICAgICAgICBleHBsYWluOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHBsYWluLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZXM6IG5vZGUuZGVmYXVsdFZhbHVlcyxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3V0cHV0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVZhbHVlcyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlc05vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudmFsdWVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURlbGV0ZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRGVsZXRlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGZyb206IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZyb20sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdXNpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnVzaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGpvaW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuam9pbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJldHVybmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmV0dXJuaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxpbWl0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGV4cGxhaW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cGxhaW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50b3AsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3V0cHV0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vdXRwdXQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmV0dXJuaW5nKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmV0dXJuaW5nTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuc2VsZWN0aW9ucywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DcmVhdGVUYWJsZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29uc3RyYWludHM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb25zdHJhaW50cywgcXVlcnlJZCksXG4gICAgICAgICAgICB0ZW1wb3Jhcnk6IG5vZGUudGVtcG9yYXJ5LFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgICAgICBvbkNvbW1pdDogbm9kZS5vbkNvbW1pdCxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNlbGVjdFF1ZXJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zZWxlY3RRdWVyeSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Db2x1bW5EZWZpbml0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uRGVmaW5pdGlvbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGF0YVR5cGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRhdGFUeXBlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlZmVyZW5jZXMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcHJpbWFyeUtleTogbm9kZS5wcmltYXJ5S2V5LFxuICAgICAgICAgICAgYXV0b0luY3JlbWVudDogbm9kZS5hdXRvSW5jcmVtZW50LFxuICAgICAgICAgICAgdW5pcXVlOiBub2RlLnVuaXF1ZSxcbiAgICAgICAgICAgIG5vdE51bGw6IG5vZGUubm90TnVsbCxcbiAgICAgICAgICAgIHVuc2lnbmVkOiBub2RlLnVuc2lnbmVkLFxuICAgICAgICAgICAgZGVmYXVsdFRvOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kZWZhdWx0VG8sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY2hlY2s6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNoZWNrLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZ2VuZXJhdGVkLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG51bGxzTm90RGlzdGluY3Q6IG5vZGUubnVsbHNOb3REaXN0aW5jdCxcbiAgICAgICAgICAgIGlkZW50aXR5OiBub2RlLmlkZW50aXR5LFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BZGRDb2x1bW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BUYWJsZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgY2FzY2FkZTogbm9kZS5jYXNjYWRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3JkZXJCeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09yZGVyQnlOb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuaXRlbXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3JkZXJCeUl0ZW0obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcmRlckJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICBkaXJlY3Rpb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRpcmVjdGlvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2xsYXRpb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbGxhdGlvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBudWxsczogbm9kZS5udWxscyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUdyb3VwQnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHcm91cEJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLml0ZW1zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUdyb3VwQnlJdGVtKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnR3JvdXBCeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIGdyb3VwQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmdyb3VwQnksIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVXBkYXRlUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVcGRhdGVRdWVyeU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGZyb206IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZyb20sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgam9pbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5qb2lucywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdXBkYXRlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnVwZGF0ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZXR1cm5pbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndpdGgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZXhwbGFpbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwbGFpbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBsaW1pdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGltaXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50b3AsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3V0cHV0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vdXRwdXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Db2x1bW5VcGRhdGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb2x1bW5VcGRhdGVOb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS52YWx1ZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1MaW1pdChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0xpbWl0Tm9kZScsXG4gICAgICAgICAgICBsaW1pdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGltaXQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT2Zmc2V0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT2Zmc2V0Tm9kZScsXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9mZnNldCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PbkNvbmZsaWN0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT25Db25mbGljdE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29uc3RyYWludDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29uc3RyYWludCwgcXVlcnlJZCksXG4gICAgICAgICAgICBpbmRleEV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmluZGV4RXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBpbmRleFdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pbmRleFdoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS51cGRhdGVzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVwZGF0ZVdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51cGRhdGVXaGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBkb05vdGhpbmc6IG5vZGUuZG9Ob3RoaW5nLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT25EdXBsaWNhdGVLZXkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbkR1cGxpY2F0ZUtleU5vZGUnLFxuICAgICAgICAgICAgdXBkYXRlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnVwZGF0ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ3JlYXRlSW5kZXgobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdW5pcXVlOiBub2RlLnVuaXF1ZSxcbiAgICAgICAgICAgIHVzaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51c2luZywgcXVlcnlJZCksXG4gICAgICAgICAgICBpZk5vdEV4aXN0czogbm9kZS5pZk5vdEV4aXN0cyxcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiBub2RlLm51bGxzTm90RGlzdGluY3QsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1MaXN0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnTGlzdE5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5pdGVtcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wSW5kZXgobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgY2FzY2FkZTogbm9kZS5jYXNjYWRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUHJpbWFyeUtleUNvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiBub2RlLmRlZmVycmFibGUsXG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogbm9kZS5pbml0aWFsbHlEZWZlcnJlZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVVuaXF1ZUNvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVbmlxdWVDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG51bGxzTm90RGlzdGluY3Q6IG5vZGUubnVsbHNOb3REaXN0aW5jdCxcbiAgICAgICAgICAgIGRlZmVycmFibGU6IG5vZGUuZGVmZXJyYWJsZSxcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBub2RlLmluaXRpYWxseURlZmVycmVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRm9yZWlnbktleUNvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGb3JlaWduS2V5Q29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVmZXJlbmNlczogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVmZXJlbmNlcywgcXVlcnlJZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBub2RlLm9uRGVsZXRlLFxuICAgICAgICAgICAgb25VcGRhdGU6IG5vZGUub25VcGRhdGUsXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiBub2RlLmRlZmVycmFibGUsXG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogbm9kZS5pbml0aWFsbHlEZWZlcnJlZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNldE9wZXJhdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1NldE9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3I6IG5vZGUub3BlcmF0b3IsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFsbDogbm9kZS5hbGwsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZWZlcmVuY2VzKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlc05vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBub2RlLm9uRGVsZXRlLFxuICAgICAgICAgICAgb25VcGRhdGU6IG5vZGUub25VcGRhdGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DaGVja0NvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDaGVja0NvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1XaXRoKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnV2l0aE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5leHByZXNzaW9ucywgcXVlcnlJZCksXG4gICAgICAgICAgICByZWN1cnNpdmU6IG5vZGUucmVjdXJzaXZlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29tbW9uVGFibGVFeHByZXNzaW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG1hdGVyaWFsaXplZDogbm9kZS5tYXRlcmlhbGl6ZWQsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSGF2aW5nKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSGF2aW5nTm9kZScsXG4gICAgICAgICAgICBoYXZpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmhhdmluZywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DcmVhdGVTY2hlbWEobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVTY2hlbWFOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2NoZW1hLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcFNjaGVtYShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BTY2hlbWFOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2NoZW1hLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgY2FzY2FkZTogbm9kZS5jYXNjYWRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWx0ZXJUYWJsZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FsdGVyVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICByZW5hbWVUbzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVuYW1lVG8sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgc2V0U2NoZW1hOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zZXRTY2hlbWEsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uQWx0ZXJhdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5BbHRlcmF0aW9ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBhZGRDb25zdHJhaW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5hZGRDb25zdHJhaW50LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kcm9wQ29uc3RyYWludCwgcXVlcnlJZCksXG4gICAgICAgICAgICByZW5hbWVDb25zdHJhaW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZW5hbWVDb25zdHJhaW50LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFkZEluZGV4OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5hZGRJbmRleCwgcXVlcnlJZCksXG4gICAgICAgICAgICBkcm9wSW5kZXg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRyb3BJbmRleCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVuYW1lQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVuYW1lQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgICAgICByZW5hbWVUbzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVuYW1lVG8sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWx0ZXJDb2x1bW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbHRlckNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGF0YVR5cGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRhdGFUeXBlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRhdGFUeXBlRXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZGF0YVR5cGVFeHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNldERlZmF1bHQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNldERlZmF1bHQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZHJvcERlZmF1bHQ6IG5vZGUuZHJvcERlZmF1bHQsXG4gICAgICAgICAgICBzZXROb3ROdWxsOiBub2RlLnNldE5vdE51bGwsXG4gICAgICAgICAgICBkcm9wTm90TnVsbDogbm9kZS5kcm9wTm90TnVsbCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU1vZGlmeUNvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ01vZGlmeUNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWRkQ29uc3RyYWludChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FkZENvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbnN0cmFpbnQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcENvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29uc3RyYWludE5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbnN0cmFpbnROYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgbW9kaWZpZXI6IG5vZGUubW9kaWZpZXIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZW5hbWVDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVuYW1lQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgb2xkTmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub2xkTmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBuZXdOYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uZXdOYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNyZWF0ZVZpZXcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVWaWV3Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRlbXBvcmFyeTogbm9kZS50ZW1wb3JhcnksXG4gICAgICAgICAgICBvclJlcGxhY2U6IG5vZGUub3JSZXBsYWNlLFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IG5vZGUubWF0ZXJpYWxpemVkLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYXM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmFzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29uY3VycmVudGx5OiBub2RlLmNvbmN1cnJlbnRseSxcbiAgICAgICAgICAgIHdpdGhOb0RhdGE6IG5vZGUud2l0aE5vRGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BWaWV3KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZFeGlzdHM6IG5vZGUuaWZFeGlzdHMsXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IG5vZGUubWF0ZXJpYWxpemVkLFxuICAgICAgICAgICAgY2FzY2FkZTogbm9kZS5jYXNjYWRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtR2VuZXJhdGVkKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnR2VuZXJhdGVkTm9kZScsXG4gICAgICAgICAgICBieURlZmF1bHQ6IG5vZGUuYnlEZWZhdWx0LFxuICAgICAgICAgICAgYWx3YXlzOiBub2RlLmFsd2F5cyxcbiAgICAgICAgICAgIGlkZW50aXR5OiBub2RlLmlkZW50aXR5LFxuICAgICAgICAgICAgc3RvcmVkOiBub2RlLnN0b3JlZCxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRGVmYXVsdFZhbHVlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRGVmYXVsdFZhbHVlTm9kZScsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRlZmF1bHRWYWx1ZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Pbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09uTm9kZScsXG4gICAgICAgICAgICBvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub24sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2VsZWN0TW9kaWZpZXIobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RNb2RpZmllck5vZGUnLFxuICAgICAgICAgICAgbW9kaWZpZXI6IG5vZGUubW9kaWZpZXIsXG4gICAgICAgICAgICByYXdNb2RpZmllcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmF3TW9kaWZpZXIsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb2Y6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5vZiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DcmVhdGVUeXBlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVHlwZU5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBlbnVtOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5lbnVtLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BUeXBlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFR5cGVOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZFeGlzdHM6IG5vZGUuaWZFeGlzdHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1FeHBsYWluKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRXhwbGFpbk5vZGUnLFxuICAgICAgICAgICAgZm9ybWF0OiBub2RlLmZvcm1hdCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9wdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2NoZW1hYmxlSWRlbnRpZmllcihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1NjaGVtYWJsZUlkZW50aWZpZXJOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2NoZW1hLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmlkZW50aWZpZXIsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWdncmVnYXRlRnVuY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZ2dyZWdhdGVGdW5jdGlvbk5vZGUnLFxuICAgICAgICAgICAgZnVuYzogbm9kZS5mdW5jLFxuICAgICAgICAgICAgYWdncmVnYXRlZDogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmFnZ3JlZ2F0ZWQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGlzdGluY3Q6IG5vZGUuZGlzdGluY3QsXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGhpbkdyb3VwOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoaW5Hcm91cCwgcXVlcnlJZCksXG4gICAgICAgICAgICBmaWx0ZXI6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZpbHRlciwgcXVlcnlJZCksXG4gICAgICAgICAgICBvdmVyOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vdmVyLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU92ZXIobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPdmVyTm9kZScsXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHBhcnRpdGlvbkJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5wYXJ0aXRpb25CeSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1QYXJ0aXRpb25CeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1BhcnRpdGlvbkJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLml0ZW1zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVBhcnRpdGlvbkJ5SXRlbShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1BhcnRpdGlvbkJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgcGFydGl0aW9uQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnBhcnRpdGlvbkJ5LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUJpbmFyeU9wZXJhdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0JpbmFyeU9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgbGVmdE9wZXJhbmQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxlZnRPcGVyYW5kLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9wZXJhdG9yOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcGVyYXRvciwgcXVlcnlJZCksXG4gICAgICAgICAgICByaWdodE9wZXJhbmQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJpZ2h0T3BlcmFuZCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1VbmFyeU9wZXJhdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1VuYXJ5T3BlcmF0aW9uTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3BlcmF0b3IsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3BlcmFuZDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3BlcmFuZCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Vc2luZyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1VzaW5nTm9kZScsXG4gICAgICAgICAgICB0YWJsZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS50YWJsZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRnVuY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGdW5jdGlvbk5vZGUnLFxuICAgICAgICAgICAgZnVuYzogbm9kZS5mdW5jLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuYXJndW1lbnRzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNhc2Uobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDYXNlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudmFsdWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlbjogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLndoZW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZWxzZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZWxzZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpc1N0YXRlbWVudDogbm9kZS5pc1N0YXRlbWVudCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVdoZW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdXaGVuTm9kZScsXG4gICAgICAgICAgICBjb25kaXRpb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbmRpdGlvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICByZXN1bHQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlc3VsdCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1KU09OUmVmZXJlbmNlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTlJlZmVyZW5jZU5vZGUnLFxuICAgICAgICAgICAgcmVmZXJlbmNlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZWZlcmVuY2UsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdHJhdmVyc2FsOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50cmF2ZXJzYWwsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSlNPTlBhdGgobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUGF0aE5vZGUnLFxuICAgICAgICAgICAgaW5PcGVyYXRvcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaW5PcGVyYXRvciwgcXVlcnlJZCksXG4gICAgICAgICAgICBwYXRoTGVnczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnBhdGhMZWdzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUpTT05QYXRoTGVnKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0pTT05QYXRoTGVnTm9kZScsXG4gICAgICAgICAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgICAgICAgICB2YWx1ZTogbm9kZS52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUpTT05PcGVyYXRvckNoYWluKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcGVyYXRvciwgcXVlcnlJZCksXG4gICAgICAgICAgICB2YWx1ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS52YWx1ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVHVwbGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUdXBsZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudmFsdWVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU1lcmdlUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdNZXJnZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBpbnRvOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pbnRvLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVzaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51c2luZywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aGVuczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLndoZW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndpdGgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50b3AsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3V0cHV0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJldHVybmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmV0dXJuaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU1hdGNoZWQobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnTWF0Y2hlZE5vZGUnLFxuICAgICAgICAgICAgbm90OiBub2RlLm5vdCxcbiAgICAgICAgICAgIGJ5U291cmNlOiBub2RlLmJ5U291cmNlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWRkSW5kZXgobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICB1bmlxdWU6IG5vZGUudW5pcXVlLFxuICAgICAgICAgICAgdXNpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnVzaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ2FzdChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Nhc3ROb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGF0YVR5cGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRhdGFUeXBlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUZldGNoKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRmV0Y2hOb2RlJyxcbiAgICAgICAgICAgIHJvd0NvdW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yb3dDb3VudCwgcXVlcnlJZCksXG4gICAgICAgICAgICBtb2RpZmllcjogbm9kZS5tb2RpZmllcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVRvcChub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUb3BOb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IG5vZGUuZXhwcmVzc2lvbixcbiAgICAgICAgICAgIG1vZGlmaWVyczogbm9kZS5tb2RpZmllcnMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PdXRwdXQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPdXRwdXROb2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5zZWxlY3Rpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURhdGFUeXBlKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNlbGVjdEFsbChub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1JZGVudGlmaWVyKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybVZhbHVlKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybVByaW1pdGl2ZVZhbHVlTGlzdChub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PcGVyYXRvcihub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1EZWZhdWx0SW5zZXJ0VmFsdWUobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3JBY3Rpb24obm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29sbGF0ZShub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWVyZ2UtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2luc2VydC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IE1lcmdlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbWVyZ2UtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3VwZGF0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlSW5zZXJ0RXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvaW5zZXJ0LXZhbHVlcy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VKb2luLCB9IGZyb20gJy4uL3BhcnNlci9qb2luLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZU1lcmdlVGhlbiwgcGFyc2VNZXJnZVdoZW4gfSBmcm9tICcuLi9wYXJzZXIvbWVyZ2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QWxsLCBwYXJzZVNlbGVjdEFyZywgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmltcG9ydCB7IE5PT1BfUVVFUllfRVhFQ1VUT1IgfSBmcm9tICcuLi9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE1lcmdlUmVzdWx0IH0gZnJvbSAnLi9tZXJnZS1yZXN1bHQuanMnO1xuaW1wb3J0IHsgTm9SZXN1bHRFcnJvciwgaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IsIH0gZnJvbSAnLi9uby1yZXN1bHQtZXJyb3IuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlCdWlsZGVyIH0gZnJvbSAnLi91cGRhdGUtcXVlcnktYnVpbGRlci5qcyc7XG5leHBvcnQgY2xhc3MgTWVyZ2VRdWVyeUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsLnJhdygnLS0gdGhpcyBpcyBhIGNvbW1lbnQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIiB1c2luZyBcInBldFwiIG9uIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCIgd2hlbiBtYXRjaGVkIHRoZW4gZGVsZXRlIC0tIHRoaXMgaXMgYSBjb21tZW50XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYSBgbWVyZ2UgaW50b2AgcXVlcnkgdG8gYW4gYG1lcmdlIHRvcCBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIGB0b3BgIGNsYXVzZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogQWZmZWN0IDUgbWF0Y2hlZCByb3dzIGF0IG1vc3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC50b3AoNSlcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIHRvcCg1KSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgZGVsZXRlXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBZmZlY3QgNTAlIG9mIG1hdGNoZWQgcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1MCwgJ3BlcmNlbnQnKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgdG9wKDUwKSBwZXJjZW50IGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0b3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhUb3AodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVzaW5nKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVXNpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUpvaW4oJ1VzaW5nJywgYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXRBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGV0Lm93bmVyX2lkJywgJ3BlcnNvbi5pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLm1vZGlmeUVuZChzcWwucmF3KCctLSB0aGlzIGlzIGEgY29tbWVudCcpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiIHVzaW5nIFwicGV0XCIgb24gXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIiB3aGVuIG1hdGNoZWQgdGhlbiBkZWxldGUgLS0gdGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VlIHtAbGluayBNZXJnZVF1ZXJ5QnVpbGRlci50b3B9LlxuICAgICAqL1xuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbXBsZSBgd2hlbiBtYXRjaGVkYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlIHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLCBzZWUge0BsaW5rIHdoZW5NYXRjaGVkQW5kfS5cbiAgICAgKlxuICAgICAqIEZvciBhIHNpbXBsZSBgd2hlbiBub3QgbWF0Y2hlZGAgY2xhdXNlLCBzZWUge0BsaW5rIHdoZW5Ob3RNYXRjaGVkfS5cbiAgICAgKlxuICAgICAqIEZvciBhIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2Ugd2l0aCBhbiBgYW5kYCBjb25kaXRpb24sIHNlZSB7QGxpbmsgd2hlbk5vdE1hdGNoZWRBbmR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aGVuTWF0Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5NYXRjaGVkKFtdKTtcbiAgICB9XG4gICAgd2hlbk1hdGNoZWRBbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk1hdGNoZWQoYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGB3aGVuIG1hdGNoZWRgIGNsYXVzZSB0byB0aGUgcXVlcnkgd2l0aCBhbiBgYW5kYCBjb25kaXRpb24uIEJ1dCB1bmxpa2VcbiAgICAgKiB7QGxpbmsgd2hlbk1hdGNoZWRBbmR9LCB0aGlzIG1ldGhvZCBhY2NlcHRzIGEgY29sdW1uIHJlZmVyZW5jZSBhcyB0aGUgM3JkIGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB7QGxpbmsgU2VsZWN0UXVlcnlCdWlsZGVyLndoZXJlUmVmfSwgc28gc2VlIHRoZSBkb2N1bWVudGF0aW9uXG4gICAgICogZm9yIHRoYXQgbWV0aG9kIGZvciBtb3JlIGV4YW1wbGVzLlxuICAgICAqL1xuICAgIHdoZW5NYXRjaGVkQW5kUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk1hdGNoZWQoW2xocywgb3AsIHJoc10sIHRydWUpO1xuICAgIH1cbiAgICAjd2hlbk1hdGNoZWQoYXJncywgcmVmUmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoV2hlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VXaGVuKHsgaXNNYXRjaGVkOiB0cnVlIH0sIGFyZ3MsIHJlZlJpZ2h0KSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2ltcGxlIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbm90IG1hdGNoZWRgIGNsYXVzZSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbiwgc2VlIHtAbGluayB3aGVuTm90TWF0Y2hlZEFuZH0uXG4gICAgICpcbiAgICAgKiBGb3IgYSBzaW1wbGUgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlLCBzZWUge0BsaW5rIHdoZW5NYXRjaGVkfS5cbiAgICAgKlxuICAgICAqIEZvciBhIGB3aGVuIG1hdGNoZWRgIGNsYXVzZSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbiwgc2VlIHtAbGluayB3aGVuTWF0Y2hlZEFuZH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk5vdE1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5JbnNlcnRWYWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBub3QgbWF0Y2hlZCB0aGVuXG4gICAgICogICBpbnNlcnQgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiKSB2YWx1ZXMgKCQxLCAkMilcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aGVuTm90TWF0Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtdKTtcbiAgICB9XG4gICAgd2hlbk5vdE1hdGNoZWRBbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5IHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLiBCdXQgdW5saWtlXG4gICAgICoge0BsaW5rIHdoZW5Ob3RNYXRjaGVkQW5kfSwgdGhpcyBtZXRob2QgYWNjZXB0cyBhIGNvbHVtbiByZWZlcmVuY2UgYXMgdGhlIDNyZCBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgd2hlbk1hdGNoZWRBbmRSZWZ9LCB5b3UgY2Fubm90IHJlZmVyZW5jZSBjb2x1bW5zIGZyb20gdGhlIHRhcmdldCB0YWJsZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8ge0BsaW5rIFNlbGVjdFF1ZXJ5QnVpbGRlci53aGVyZVJlZn0sIHNvIHNlZSB0aGUgZG9jdW1lbnRhdGlvblxuICAgICAqIGZvciB0aGF0IG1ldGhvZCBmb3IgbW9yZSBleGFtcGxlcy5cbiAgICAgKi9cbiAgICB3aGVuTm90TWF0Y2hlZEFuZFJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtsaHMsIG9wLCByaHNdLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbXBsZSBgd2hlbiBub3QgbWF0Y2hlZCBieSBzb3VyY2VgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBTdXBwb3J0ZWQgaW4gTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIHdoZW5Ob3RNYXRjaGVkfSwgYnV0IHJldHVybnMgYSB7QGxpbmsgTWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXJ9LlxuICAgICAqL1xuICAgIHdoZW5Ob3RNYXRjaGVkQnlTb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3aGVuTm90TWF0Y2hlZChbXSwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICB3aGVuTm90TWF0Y2hlZEJ5U291cmNlQW5kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKGFyZ3MsIGZhbHNlLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYHdoZW4gbm90IG1hdGNoZWQgYnkgc291cmNlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5IHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLlxuICAgICAqXG4gICAgICogU2ltaWxhciB0byB7QGxpbmsgd2hlbk5vdE1hdGNoZWRBbmRSZWZ9LCBidXQgeW91IGNhbiByZWZlcmVuY2UgY29sdW1ucyBmcm9tXG4gICAgICogdGhlIHRhcmdldCB0YWJsZSwgYW5kIG5vdCBmcm9tIHNvdXJjZSB0YWJsZSBhbmQgcmV0dXJucyBhIHtAbGluayBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcn0uXG4gICAgICovXG4gICAgd2hlbk5vdE1hdGNoZWRCeVNvdXJjZUFuZFJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtsaHMsIG9wLCByaHNdLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXRBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjd2hlbk5vdE1hdGNoZWQoYXJncywgcmVmUmlnaHQgPSBmYWxzZSwgYnlTb3VyY2UgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBNZXJnZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVuKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VNZXJnZVdoZW4oeyBpc01hdGNoZWQ6IGZhbHNlLCBieVNvdXJjZSB9LCBhcmdzLCByZWZSaWdodCkpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBCdWlsZGVyID0gYnlTb3VyY2VcbiAgICAgICAgICAgID8gTWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXJcbiAgICAgICAgICAgIDogTm90TWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXI7XG4gICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBjb25kaXRpb25hbGx5IGNhbGwgYSBtZXRob2Qgb24gYHRoaXNgLCBzZWVcbiAgICAgKiB0aGUge0BsaW5rICRpZn0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgbmV4dCBleGFtcGxlIHVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gYGxvZ2AgdG8gbG9nIGEgcXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgQ29tcGlsYWJsZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGxvZzxUIGV4dGVuZHMgQ29tcGlsYWJsZT4ocWI6IFQpOiBUIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHFiLmNvbXBpbGUoKSlcbiAgICAgKiAgIHJldHVybiBxYlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGZpcnN0X25hbWU6ICdKb2huJyB9KVxuICAgICAqICAgLiRjYWxsKGxvZylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGBmdW5jKHRoaXMpYCBpZiBgY29uZGl0aW9uYCBpcyB0cnVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXNwZWNpYWxseSBoYW5keSB3aXRoIG9wdGlvbmFsIHNlbGVjdHMuIEFueSBgcmV0dXJuaW5nYCBvciBgcmV0dXJuaW5nQWxsYFxuICAgICAqIG1ldGhvZCBjYWxscyBhZGQgY29sdW1ucyBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlIG91dHB1dCB0eXBlIHdoZW4gY2FsbGVkIGluc2lkZVxuICAgICAqIHRoZSBgZnVuY2AgY2FsbGJhY2suIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRob3NlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseVxuICAgICAqIG1hZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uVXBkYXRlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVBlcnNvbihpZDogbnVtYmVyLCB1cGRhdGVzOiBQZXJzb25VcGRhdGUsIHJldHVybkxhc3ROYW1lOiBib29sZWFuKSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgICAuc2V0KHVwZGF0ZXMpXG4gICAgICogICAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgICAuJGlmKHJldHVybkxhc3ROYW1lLCAocWIpID0+IHFiLnJldHVybmluZygnbGFzdF9uYW1lJykpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW55IHNlbGVjdGlvbnMgYWRkZWQgaW5zaWRlIHRoZSBgaWZgIGNhbGxiYWNrIHdpbGwgYmUgYWRkZWQgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZVxuICAgICAqIG91dHB1dCB0eXBlIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgdGhlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseSBtYWRlIGJlZm9yZSBydW5uaW5nXG4gICAgICogdGhlIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYHVwZGF0ZVBlcnNvbmAgZnVuY3Rpb24gaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFByb21pc2U8e1xuICAgICAqICAgaWQ6IG51bWJlclxuICAgICAqICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gICAgICogICBsYXN0X25hbWU/OiBzdHJpbmdcbiAgICAgKiB9PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRpZihjb25kaXRpb24sIGZ1bmMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiByb3dzLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBleGVjdXRlVGFrZUZpcnN0fSBhbmQge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93fSBtZXRob2RzLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgICAgICBjb25zdCB7IGFkYXB0ZXIgfSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGNvbXBpbGVkUXVlcnkucXVlcnk7XG4gICAgICAgIGlmICgocXVlcnkucmV0dXJuaW5nICYmIGFkYXB0ZXIuc3VwcG9ydHNSZXR1cm5pbmcpIHx8XG4gICAgICAgICAgICAocXVlcnkub3V0cHV0ICYmIGFkYXB0ZXIuc3VwcG9ydHNPdXRwdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtuZXcgTWVyZ2VSZXN1bHQocmVzdWx0Lm51bUFmZmVjdGVkUm93cyldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHRocm93cyBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0IGFuIGluc3RhbmNlIG9mIHtAbGluayBOb1Jlc3VsdEVycm9yfSBpcyB0aHJvd24sIGJ1dCB5b3UgY2FuXG4gICAgICogcHJvdmlkZSBhIGN1c3RvbSBlcnJvciBjbGFzcywgb3IgY2FsbGJhY2sgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhyb3cgYSBkaWZmZXJlbnRcbiAgICAgKiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYGRlbGV0ZWAgYWN0aW9uLlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRvIG5vdGhpbmdgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuRG9Ob3RoaW5nfS5cbiAgICAgKlxuICAgICAqIFRvIHBlcmZvcm0gdGhlIGB1cGRhdGVgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuVXBkYXRlfSBvciB7QGxpbmsgdGhlblVwZGF0ZVNldH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIGRlbGV0ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5EZWxldGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbignZGVsZXRlJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGBkbyBub3RoaW5nYCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN1cHBvcnRlZCBpbiBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRlbGV0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5EZWxldGV9LlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYHVwZGF0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5VcGRhdGV9IG9yIHtAbGluayB0aGVuVXBkYXRlU2V0fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRvTm90aGluZygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgZG8gbm90aGluZ1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5Eb05vdGhpbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbignZG8gbm90aGluZycpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gYW4gYHVwZGF0ZWAgb3BlcmF0aW9uIHdpdGggYSBmdWxsLWZsZWRnZWQge0BsaW5rIFVwZGF0ZVF1ZXJ5QnVpbGRlcn0uXG4gICAgICogVGhpcyBpcyBoYW5keSB3aGVuIG11bHRpcGxlIGBzZXRgIGludm9jYXRpb25zIGFyZSBuZWVkZWQuXG4gICAgICpcbiAgICAgKiBGb3IgYSBzaG9ydGhhbmQgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCwgc2VlIHtAbGluayB0aGVuVXBkYXRlU2V0fS5cbiAgICAgKlxuICAgICAqIFRvIHBlcmZvcm0gdGhlIGBkZWxldGVgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuRGVsZXRlfS5cbiAgICAgKlxuICAgICAqIFRvIHBlcmZvcm0gdGhlIGBkbyBub3RoaW5nYCBhY3Rpb24sIHNlZSB7QGxpbmsgdGhlbkRvTm90aGluZ30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5VcGRhdGUoKHViKSA9PiB1YlxuICAgICAqICAgICAuc2V0KHNxbGBtZXRhZGF0YVsnaGFzX3BldHMnXWAsICdZJylcbiAgICAgKiAgICAgLnNldCh7XG4gICAgICogICAgICAgdXBkYXRlZF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAqICAgICB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIHVwZGF0ZSBzZXQgbWV0YWRhdGFbJ2hhc19wZXRzJ10gPSAkMSwgXCJ1cGRhdGVkX2F0XCIgPSAkMlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5VcGRhdGUoc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbihzZXQobmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAgICAgcXVlcnlJZDogdGhpcy4jcHJvcHMucXVlcnlJZCxcbiAgICAgICAgICAgICAgICBleGVjdXRvcjogTk9PUF9RVUVSWV9FWEVDVVRPUixcbiAgICAgICAgICAgICAgICBxdWVyeU5vZGU6IFVwZGF0ZVF1ZXJ5Tm9kZS5jcmVhdGVXaXRob3V0VGFibGUoKSxcbiAgICAgICAgICAgIH0pKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhlblVwZGF0ZVNldCguLi5hcmdzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgbm90IHN1cmUgaG93IHRvIHR5cGUgdGhpcyBzbyBpdCB3b24ndCBjb21wbGFpbiBhYm91dCBzZXQoLi4uYXJncykuXG4gICAgICAgIHJldHVybiB0aGlzLnRoZW5VcGRhdGUoKHViKSA9PiB1Yi5zZXQoLi4uYXJncykpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBOb3RNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGBkbyBub3RoaW5nYCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN1cHBvcnRlZCBpbiBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGluc2VydGAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5JbnNlcnRWYWx1ZXN9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5Ob3RNYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRG9Ob3RoaW5nKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbm90IG1hdGNoZWQgdGhlblxuICAgICAqICAgZG8gbm90aGluZ1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5Eb05vdGhpbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbignZG8gbm90aGluZycpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRoZW5JbnNlcnRWYWx1ZXMoaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5zLCB2YWx1ZXNdID0gcGFyc2VJbnNlcnRFeHByZXNzaW9uKGluc2VydCk7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbihJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKEluc2VydFF1ZXJ5Tm9kZS5jcmVhdGVXaXRob3V0SW50bygpLCB7XG4gICAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB9KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21lcmdlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IE1hdGNoZWROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbWF0Y2hlZC1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IFdoZW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvd2hlbi1ub2RlLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VGaWx0ZXJMaXN0LCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4vYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWVyZ2VXaGVuKHR5cGUsIGFyZ3MsIHJlZlJpZ2h0KSB7XG4gICAgcmV0dXJuIFdoZW5Ob2RlLmNyZWF0ZShwYXJzZUZpbHRlckxpc3QoW1xuICAgICAgICBNYXRjaGVkTm9kZS5jcmVhdGUoIXR5cGUuaXNNYXRjaGVkLCB0eXBlLmJ5U291cmNlKSxcbiAgICAgICAgLi4uKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9PT0gMyAmJiByZWZSaWdodFxuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgXSwgJ2FuZCcsIGZhbHNlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXJnZVRoZW4ocmVzdWx0KSB7XG4gICAgaWYgKGlzU3RyaW5nKHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIFJhd05vZGUuY3JlYXRlKFtyZXN1bHRdLCBbXSk7XG4gICAgfVxuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9tYXRjaGVkLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTWF0Y2hlZE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ01hdGNoZWROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShub3QsIGJ5U291cmNlID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnTWF0Y2hlZE5vZGUnLFxuICAgICAgICAgICAgbm90LFxuICAgICAgICAgICAgYnlTb3VyY2UsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbm9vcC1xdWVyeS1leGVjdXRvci5kLnRzXCIgLz5cbmltcG9ydCB7IFF1ZXJ5RXhlY3V0b3JCYXNlIH0gZnJvbSAnLi9xdWVyeS1leGVjdXRvci1iYXNlLmpzJztcbi8qKlxuICogQSB7QGxpbmsgUXVlcnlFeGVjdXRvcn0gc3ViY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHlvdSBkb24ndFxuICogaGF2ZSBhIHtAbGluayBRdWVyeUNvbXBpbGVyfSwge0BsaW5rIENvbm5lY3Rpb25Qcm92aWRlcn0gb3IgYW55XG4gKiBvdGhlciBuZWVkZWQgdGhpbmdzIHRvIGFjdHVhbGx5IGV4ZWN1dGUgcXVlcmllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vb3BRdWVyeUV4ZWN1dG9yIGV4dGVuZHMgUXVlcnlFeGVjdXRvckJhc2Uge1xuICAgIGdldCBhZGFwdGVyKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgcXVlcnkgY2Fubm90IGJlIGNvbXBpbGVkIHRvIFNRTCcpO1xuICAgIH1cbiAgICBjb21waWxlUXVlcnkoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhpcyBxdWVyeSBjYW5ub3QgYmUgY29tcGlsZWQgdG8gU1FMJyk7XG4gICAgfVxuICAgIHByb3ZpZGVDb25uZWN0aW9uKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgcXVlcnkgY2Fubm90IGJlIGV4ZWN1dGVkJyk7XG4gICAgfVxuICAgIHdpdGhDb25uZWN0aW9uUHJvdmlkZXIoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhpcyBxdWVyeSBjYW5ub3QgaGF2ZSBhIGNvbm5lY3Rpb24gcHJvdmlkZXInKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wUXVlcnlFeGVjdXRvcihbLi4udGhpcy5wbHVnaW5zLCBwbHVnaW5dKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbnMocGx1Z2lucykge1xuICAgICAgICByZXR1cm4gbmV3IE5vb3BRdWVyeUV4ZWN1dG9yKFsuLi50aGlzLnBsdWdpbnMsIC4uLnBsdWdpbnNdKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFF1ZXJ5RXhlY3V0b3IoW3BsdWdpbiwgLi4udGhpcy5wbHVnaW5zXSk7XG4gICAgfVxuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IE5vb3BRdWVyeUV4ZWN1dG9yKFtdKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgTk9PUF9RVUVSWV9FWEVDVVRPUiA9IG5ldyBOb29wUXVlcnlFeGVjdXRvcigpO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9xdWVyeS1leGVjdXRvci1iYXNlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uIH0gZnJvbSAnLi4vdXRpbC9wcm92aWRlLWNvbnRyb2xsZWQtY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBsb2dPbmNlIH0gZnJvbSAnLi4vdXRpbC9sb2ctb25jZS5qcyc7XG5jb25zdCBOT19QTFVHSU5TID0gZnJlZXplKFtdKTtcbmV4cG9ydCBjbGFzcyBRdWVyeUV4ZWN1dG9yQmFzZSB7XG4gICAgI3BsdWdpbnM7XG4gICAgY29uc3RydWN0b3IocGx1Z2lucyA9IE5PX1BMVUdJTlMpIHtcbiAgICAgICAgdGhpcy4jcGx1Z2lucyA9IHBsdWdpbnM7XG4gICAgfVxuICAgIGdldCBwbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGx1Z2lucztcbiAgICB9XG4gICAgdHJhbnNmb3JtUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLiNwbHVnaW5zKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZE5vZGUgPSBwbHVnaW4udHJhbnNmb3JtUXVlcnkoeyBub2RlLCBxdWVyeUlkIH0pO1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyBhIHJ1bnRpbWUgY2hlY2sgaGVyZS4gVGhlcmUgaXMgbm8gZ29vZCB3YXlcbiAgICAgICAgICAgIC8vIHRvIHdyaXRlIHR5cGVzIHRoYXQgZW5mb3JjZSB0aGlzIGNvbnN0cmFpbnQuXG4gICAgICAgICAgICBpZiAodHJhbnNmb3JtZWROb2RlLmtpbmQgPT09IG5vZGUua2luZCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB0cmFuc2Zvcm1lZE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoW1xuICAgICAgICAgICAgICAgICAgICBgS3lzZWx5UGx1Z2luLnRyYW5zZm9ybVF1ZXJ5IG11c3QgcmV0dXJuIGEgbm9kZWAsXG4gICAgICAgICAgICAgICAgICAgIGBvZiB0aGUgc2FtZSBraW5kIHRoYXQgd2FzIGdpdmVuIHRvIGl0LmAsXG4gICAgICAgICAgICAgICAgICAgIGBUaGUgcGx1Z2luIHdhcyBnaXZlbiBhICR7bm9kZS5raW5kfWAsXG4gICAgICAgICAgICAgICAgICAgIGBidXQgaXQgcmV0dXJuZWQgYSAke3RyYW5zZm9ybWVkTm9kZS5raW5kfWAsXG4gICAgICAgICAgICAgICAgXS5qb2luKCcgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm92aWRlQ29ubmVjdGlvbihhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29ubmVjdGlvbi5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSk7XG4gICAgICAgICAgICBpZiAoJ251bVVwZGF0ZWRPckRlbGV0ZWRSb3dzJyBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBsb2dPbmNlKCdreXNlbHk6d2FybmluZzogb3V0ZGF0ZWQgZHJpdmVyL3BsdWdpbiBkZXRlY3RlZCEgYFF1ZXJ5UmVzdWx0Lm51bVVwZGF0ZWRPckRlbGV0ZWRSb3dzYCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGBRdWVyeVJlc3VsdC5udW1BZmZlY3RlZFJvd3NgLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3RyYW5zZm9ybVJlc3VsdChyZXN1bHQsIHF1ZXJ5SWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgY29uc3QgeyBjb25uZWN0aW9uLCByZWxlYXNlIH0gPSBhd2FpdCBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24odGhpcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHJlc3VsdCBvZiBjb25uZWN0aW9uLnN0cmVhbVF1ZXJ5KGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBhd2FpdCB0aGlzLiN0cmFuc2Zvcm1SZXN1bHQocmVzdWx0LCBxdWVyeUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyAjdHJhbnNmb3JtUmVzdWx0KHJlc3VsdCwgcXVlcnlJZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLiNwbHVnaW5zKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBwbHVnaW4udHJhbnNmb3JtUmVzdWx0KHsgcmVzdWx0LCBxdWVyeUlkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wcm92aWRlLWNvbnRyb2xsZWQtY29ubmVjdGlvbi5kLnRzXCIgLz5cbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi9kZWZlcnJlZC5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uKGNvbm5lY3Rpb25Qcm92aWRlcikge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25EZWZlciA9IG5ldyBEZWZlcnJlZCgpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb25SZWxlYXNlRGVmZXIgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBjb25uZWN0aW9uUHJvdmlkZXJcbiAgICAgICAgLnByb3ZpZGVDb25uZWN0aW9uKGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbm5lY3Rpb25EZWZlci5yZXNvbHZlKGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gYXdhaXQgY29ubmVjdGlvblJlbGVhc2VEZWZlci5wcm9taXNlO1xuICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXgpID0+IGNvbm5lY3Rpb25EZWZlci5yZWplY3QoZXgpKTtcbiAgICAvLyBDcmVhdGUgY29tcG9zaXRlIG9mIHRoZSBjb25uZWN0aW9uIGFuZCB0aGUgcmVsZWFzZSBtZXRob2QgaW5zdGVhZCBvZlxuICAgIC8vIG1vZGlmeWluZyB0aGUgY29ubmVjdGlvbiBvciBjcmVhdGluZyBhIG5ldyBuZXN0aW5nIGBEYXRhYmFzZUNvbm5lY3Rpb25gLlxuICAgIC8vIFRoaXMgd2F5IHdlIGRvbid0IGFjY2lkZW50YWxseSBvdmVycmlkZSBhbnkgbWV0aG9kcyBvZiAzcmQgcGFydHlcbiAgICAvLyBjb25uZWN0aW9ucyBhbmQgZG9uJ3QgcmV0dXJuIHdyYXBwZWQgY29ubmVjdGlvbnMgdG8gZHJpdmVycyB0aGF0XG4gICAgLy8gZXhwZWN0IGEgY2VydGFpbiBzcGVjaWZpYyBjb25uZWN0aW9uIGNsYXNzLlxuICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICBjb25uZWN0aW9uOiBhd2FpdCBjb25uZWN0aW9uRGVmZXIucHJvbWlzZSxcbiAgICAgICAgcmVsZWFzZTogY29ubmVjdGlvblJlbGVhc2VEZWZlci5yZXNvbHZlLFxuICAgIH0pO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZlcnJlZC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgI3Byb21pc2U7XG4gICAgI3Jlc29sdmU7XG4gICAgI3JlamVjdDtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy4jcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgICAgIHRoaXMuI3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9taXNlO1xuICAgIH1cbiAgICByZXNvbHZlID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNyZXNvbHZlKSB7XG4gICAgICAgICAgICB0aGlzLiNyZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmVqZWN0ID0gKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLiNyZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21lcmdlLXJlc3VsdC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBNZXJnZVJlc3VsdCB7XG4gICAgbnVtQ2hhbmdlZFJvd3M7XG4gICAgY29uc3RydWN0b3IobnVtQ2hhbmdlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5udW1DaGFuZ2VkUm93cyA9IG51bUNoYW5nZWRSb3dzO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb2Zmc2V0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT2Zmc2V0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT2Zmc2V0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09mZnNldE5vZGUnLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2dyb3VwLWJ5LXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IEdyb3VwQnlJdGVtTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2dyb3VwLWJ5LWl0ZW0tbm9kZS5qcyc7XG5pbXBvcnQgeyBleHByZXNzaW9uQnVpbGRlciwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHcm91cEJ5KGdyb3VwQnkpIHtcbiAgICBncm91cEJ5ID0gaXNGdW5jdGlvbihncm91cEJ5KSA/IGdyb3VwQnkoZXhwcmVzc2lvbkJ1aWxkZXIoKSkgOiBncm91cEJ5O1xuICAgIHJldHVybiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QoZ3JvdXBCeSkubWFwKEdyb3VwQnlJdGVtTm9kZS5jcmVhdGUpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9ncm91cC1ieS1pdGVtLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgR3JvdXBCeUl0ZW1Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdHcm91cEJ5SXRlbU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGdyb3VwQnkpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnR3JvdXBCeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIGdyb3VwQnksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2V0LW9wZXJhdGlvbi1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBjcmVhdGVFeHByZXNzaW9uQnVpbGRlciwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBTZXRPcGVyYXRpb25Ob2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NldC1vcGVyYXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc1JlYWRvbmx5QXJyYXkgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24gfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNldE9wZXJhdGlvbnMob3BlcmF0b3IsIGV4cHJlc3Npb24sIGFsbCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uKGNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyKCkpO1xuICAgIH1cbiAgICBpZiAoIWlzUmVhZG9ubHlBcnJheShleHByZXNzaW9uKSkge1xuICAgICAgICBleHByZXNzaW9uID0gW2V4cHJlc3Npb25dO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcmVzc2lvbi5tYXAoKGV4cHIpID0+IFNldE9wZXJhdGlvbk5vZGUuY3JlYXRlKG9wZXJhdG9yLCBwYXJzZUV4cHJlc3Npb24oZXhwciksIGFsbCkpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZXQtb3BlcmF0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2V0T3BlcmF0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2V0T3BlcmF0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob3BlcmF0b3IsIGV4cHJlc3Npb24sIGFsbCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZXRPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGFsbCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHByZXNzaW9uLXdyYXBwZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBQYXJlbnNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcGFyZW5zLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25XcmFwcGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEV4cHJlc3Npb25XcmFwcGVyKHRoaXMsIGFsaWFzKTtcbiAgICB9XG4gICAgb3IoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE9yV3JhcHBlcihPck5vZGUuY3JlYXRlKHRoaXMuI25vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKTtcbiAgICB9XG4gICAgYW5kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmRXcmFwcGVyKEFuZE5vZGUuY3JlYXRlKHRoaXMuI25vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgRXhwcmVzc2lvbldyYXBwZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT21pdCBudWxsIGZyb20gdGhlIGV4cHJlc3Npb24ncyB0eXBlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIGluIGNhc2VzIHdoZXJlIHlvdSBrbm93IGFuIGV4cHJlc3Npb24gY2FuJ3QgYmVcbiAgICAgKiBudWxsLCBidXQgS3lzZWx5IGlzIHVuYWJsZSB0byBpbmZlciBpdC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgYHRoaXNgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJG5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFsaWFzZWRFeHByZXNzaW9uV3JhcHBlciB7XG4gICAgI2V4cHI7XG4gICAgI2FsaWFzO1xuICAgIGNvbnN0cnVjdG9yKGV4cHIsIGFsaWFzKSB7XG4gICAgICAgIHRoaXMuI2V4cHIgPSBleHByO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4cHI7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsaWFzO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHRoaXMuI2V4cHIudG9PcGVyYXRpb25Ob2RlKCksIGlzT3BlcmF0aW9uTm9kZVNvdXJjZSh0aGlzLiNhbGlhcylcbiAgICAgICAgICAgID8gdGhpcy4jYWxpYXMudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgICAgIDogSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE9yV3JhcHBlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb25UeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBhcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IEFsaWFzZWRFeHByZXNzaW9uV3JhcHBlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcldyYXBwZXIoT3JOb2RlLmNyZWF0ZSh0aGlzLiNub2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYE9yV3JhcHBlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9yV3JhcHBlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gUGFyZW5zTm9kZS5jcmVhdGUodGhpcy4jbm9kZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFuZFdyYXBwZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIodGhpcywgYWxpYXMpO1xuICAgIH1cbiAgICBhbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IEFuZFdyYXBwZXIoQW5kTm9kZS5jcmVhdGUodGhpcy4jbm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBBbmRXcmFwcGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5kV3JhcHBlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gUGFyZW5zTm9kZS5jcmVhdGUodGhpcy4jbm9kZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mZXRjaC1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBGZXRjaE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9mZXRjaC1ub2RlLmpzJztcbmltcG9ydCB7IGlzQmlnSW50LCBpc051bWJlciB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZldGNoKHJvd0NvdW50LCBtb2RpZmllcikge1xuICAgIGlmICghaXNOdW1iZXIocm93Q291bnQpICYmICFpc0JpZ0ludChyb3dDb3VudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZldGNoIHJvdyBjb3VudDogJHtyb3dDb3VudH1gKTtcbiAgICB9XG4gICAgaWYgKCFpc0ZldGNoTW9kaWZpZXIobW9kaWZpZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmZXRjaCBtb2RpZmllcjogJHttb2RpZmllcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIEZldGNoTm9kZS5jcmVhdGUocm93Q291bnQsIG1vZGlmaWVyKTtcbn1cbmZ1bmN0aW9uIGlzRmV0Y2hNb2RpZmllcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ29ubHknIHx8IHZhbHVlID09PSAnd2l0aCB0aWVzJztcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZmV0Y2gtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4vdmFsdWUtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRmV0Y2hOb2RlID0ge1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0ZldGNoTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUocm93Q291bnQsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnRmV0Y2hOb2RlJyxcbiAgICAgICAgICAgIHJvd0NvdW50OiBWYWx1ZU5vZGUuY3JlYXRlKHJvd0NvdW50KSxcbiAgICAgICAgICAgIG1vZGlmaWVyLFxuICAgICAgICB9O1xuICAgIH0sXG59O1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mdW5jdGlvbi1tb2R1bGUuZC50c1wiIC8+XG5pbXBvcnQgeyBFeHByZXNzaW9uV3JhcHBlciB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi13cmFwcGVyLmpzJztcbmltcG9ydCB7IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Z1bmN0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QWxsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9hZ2dyZWdhdGUtZnVuY3Rpb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbk1vZHVsZSgpIHtcbiAgICBjb25zdCBmbiA9IChuYW1lLCBhcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoRnVuY3Rpb25Ob2RlLmNyZWF0ZShuYW1lLCBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QoYXJncyA/PyBbXSkpKTtcbiAgICB9O1xuICAgIGNvbnN0IGFnZyA9IChuYW1lLCBhcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNyZWF0ZShuYW1lLCBhcmdzID8gcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0KGFyZ3MpIDogdW5kZWZpbmVkKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihmbiwge1xuICAgICAgICBhZ2csXG4gICAgICAgIGF2Zyhjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ2F2ZycsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29hbGVzY2UoLi4udmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4oJ2NvYWxlc2NlJywgdmFsdWVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgY291bnQoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gYWdnKCdjb3VudCcsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAgY291bnRBbGwodGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5jcmVhdGUoJ2NvdW50JywgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtYXgoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gYWdnKCdtYXgnLCBbY29sdW1uXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1pbihjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ21pbicsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3VtKGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGFnZygnc3VtJywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBhbnkoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4oJ2FueScsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAganNvbkFnZyh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNyZWF0ZSgnanNvbl9hZ2cnLCBbXG4gICAgICAgICAgICAgICAgICAgIGlzU3RyaW5nKHRhYmxlKSA/IHBhcnNlVGFibGUodGFibGUpIDogdGFibGUudG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgdG9Kc29uKHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKEZ1bmN0aW9uTm9kZS5jcmVhdGUoJ3RvX2pzb24nLCBbXG4gICAgICAgICAgICAgICAgaXNTdHJpbmcodGFibGUpID8gcGFyc2VUYWJsZSh0YWJsZSkgOiB0YWJsZS50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWdncmVnYXRlLWZ1bmN0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBXaGVyZU5vZGUgfSBmcm9tICcuL3doZXJlLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JkZXJCeU5vZGUgfSBmcm9tICcuL29yZGVyLWJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWdncmVnYXRlRnVuY3Rpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShhZ2dyZWdhdGVGdW5jdGlvbiwgYWdncmVnYXRlZCA9IFtdKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZScsXG4gICAgICAgICAgICBmdW5jOiBhZ2dyZWdhdGVGdW5jdGlvbixcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRGlzdGluY3QoYWdncmVnYXRlRnVuY3Rpb25Ob2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uYWdncmVnYXRlRnVuY3Rpb25Ob2RlLFxuICAgICAgICAgICAgZGlzdGluY3Q6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3JkZXJCeShhZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIG9yZGVySXRlbXMsIHdpdGhpbkdyb3VwID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IHdpdGhpbkdyb3VwID8gJ3dpdGhpbkdyb3VwJyA6ICdvcmRlckJ5JztcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsXG4gICAgICAgICAgICBbcHJvcF06IGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZVtwcm9wXVxuICAgICAgICAgICAgICAgID8gT3JkZXJCeU5vZGUuY2xvbmVXaXRoSXRlbXMoYWdncmVnYXRlRnVuY3Rpb25Ob2RlW3Byb3BdLCBvcmRlckl0ZW1zKVxuICAgICAgICAgICAgICAgIDogT3JkZXJCeU5vZGUuY3JlYXRlKG9yZGVySXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZpbHRlcihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSxcbiAgICAgICAgICAgIGZpbHRlcjogYWdncmVnYXRlRnVuY3Rpb25Ob2RlLmZpbHRlclxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUuZmlsdGVyLCAnQW5kJywgZmlsdGVyKVxuICAgICAgICAgICAgICAgIDogV2hlcmVOb2RlLmNyZWF0ZShmaWx0ZXIpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9yRmlsdGVyKGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uYWdncmVnYXRlRnVuY3Rpb25Ob2RlLFxuICAgICAgICAgICAgZmlsdGVyOiBhZ2dyZWdhdGVGdW5jdGlvbk5vZGUuZmlsdGVyXG4gICAgICAgICAgICAgICAgPyBXaGVyZU5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5maWx0ZXIsICdPcicsIGZpbHRlcilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUoZmlsdGVyKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPdmVyKGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgb3Zlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSxcbiAgICAgICAgICAgIG92ZXIsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZnVuY3Rpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBGdW5jdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Z1bmN0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZnVuYywgYXJncykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGdW5jdGlvbk5vZGUnLFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hZ2dyZWdhdGUtZnVuY3Rpb24tYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgY3JlYXRlT3ZlckJ1aWxkZXIgfSBmcm9tICcuLi9wYXJzZXIvcGFyc2UtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4uL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcXVlcnktbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYWxpYXNlZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIHNsYXBwaW5nIGBhcyBcInRoZV9hbGlhc1wiYCB0byB0aGUgZW5kIG9mIHRoZSBTUUwsXG4gICAgICogdGhpcyBtZXRob2QgYWxzbyBwcm92aWRlcyBzdHJpY3QgdHlwaW5nOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAuc2VsZWN0KFxuICAgICAqICAgICAoZWIpID0+IGViLmZuLmNvdW50PG51bWJlcj4oJ2lkJykuYXMoJ3BlcnNvbl9jb3VudCcpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogLy8gYHBlcnNvbl9jb3VudDogbnVtYmVyYCBmaWVsZCBleGlzdHMgaW4gdGhlIHJlc3VsdCB0eXBlLlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5wZXJzb25fY291bnQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgY291bnQoXCJpZFwiKSBhcyBcInBlcnNvbl9jb3VudFwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHRoaXMsIGFsaWFzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGBkaXN0aW5jdGAgY2xhdXNlIGluc2lkZSB0aGUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdCgoZWIpID0+XG4gICAgICogICAgIGViLmZuLmNvdW50PG51bWJlcj4oJ2ZpcnN0X25hbWUnKS5kaXN0aW5jdCgpLmFzKCdmaXJzdF9uYW1lX2NvdW50JylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgY291bnQoZGlzdGluY3QgXCJmaXJzdF9uYW1lXCIpIGFzIFwiZmlyc3RfbmFtZV9jb3VudFwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZGlzdGluY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoRGlzdGluY3QodGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9yZGVyQnkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyh0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9yZGVyQnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeSh0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aGluR3JvdXBPcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5jbG9uZVdpdGhPcmRlckJ5KHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgcGFyc2VPcmRlckJ5KGFyZ3MpLCB0cnVlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZpbHRlcldoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5jbG9uZVdpdGhGaWx0ZXIodGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBgZmlsdGVyYCBjbGF1c2Ugd2l0aCBhIG5lc3RlZCBgd2hlcmVgIGNsYXVzZSBhZnRlciB0aGUgZnVuY3Rpb24sIHdoZXJlXG4gICAgICogYm90aCBzaWRlcyBvZiB0aGUgb3BlcmF0b3IgYXJlIHJlZmVyZW5jZXMgdG8gY29sdW1ucy5cbiAgICAgKlxuICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIFdoZXJlSW50ZXJmYWNlfSdzIGB3aGVyZVJlZmAgbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBDb3VudCBwZW9wbGUgd2l0aCBzYW1lIGZpcnN0IGFuZCBsYXN0IG5hbWVzIHZlcnN1cyBnZW5lcmFsIHB1YmxpYzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAgICAgKiAgICAgZWIuZm5cbiAgICAgKiAgICAgICAuY291bnQ8bnVtYmVyPignaWQnKVxuICAgICAqICAgICAgIC5maWx0ZXJXaGVyZVJlZignZmlyc3RfbmFtZScsICc9JywgJ2xhc3RfbmFtZScpXG4gICAgICogICAgICAgLmFzKCdyZXBlYXRfbmFtZV9jb3VudCcpLFxuICAgICAqICAgICBlYi5mbi5jb3VudDxudW1iZXI+KCdpZCcpLmFzKCd0b3RhbF9jb3VudCcpLFxuICAgICAqICAgXSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3RcbiAgICAgKiAgIGNvdW50KFwiaWRcIikgZmlsdGVyKHdoZXJlIFwiZmlyc3RfbmFtZVwiID0gXCJsYXN0X25hbWVcIikgYXMgXCJyZXBlYXRfbmFtZV9jb3VudFwiLFxuICAgICAqICAgY291bnQoXCJpZFwiKSBhcyBcInRvdGFsX2NvdW50XCJcbiAgICAgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBmaWx0ZXJXaGVyZVJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5jbG9uZVdpdGhGaWx0ZXIodGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBgb3ZlcmAgY2xhdXNlICh3aW5kb3cgZnVuY3Rpb25zKSBhZnRlciB0aGUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChcbiAgICAgKiAgICAgKGViKSA9PiBlYi5mbi5hdmc8bnVtYmVyPignYWdlJykub3ZlcigpLmFzKCdhdmVyYWdlX2FnZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgYXZnKFwiYWdlXCIpIG92ZXIoKSBhcyBcImF2ZXJhZ2VfYWdlXCJcbiAgICAgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFsc28gc3VwcG9ydHMgcGFzc2luZyBhIGNhbGxiYWNrIHRoYXQgcmV0dXJucyBhbiBvdmVyIGJ1aWxkZXIsXG4gICAgICogYWxsb3dpbmcgdG8gYWRkIHBhcnRpdGlvbiBieSBhbmQgc29ydCBieSBjbGF1c2VzIGluc2lkZSBvdmVyLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAuc2VsZWN0KFxuICAgICAqICAgICAoZWIpID0+IGViLmZuLmF2ZzxudW1iZXI+KCdhZ2UnKS5vdmVyKFxuICAgICAqICAgICAgIG9iID0+IG9iLnBhcnRpdGlvbkJ5KCdsYXN0X25hbWUnKS5vcmRlckJ5KCdmaXJzdF9uYW1lJywgJ2FzYycpXG4gICAgICogICAgICkuYXMoJ2F2ZXJhZ2VfYWdlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBhdmcoXCJhZ2VcIikgb3ZlcihwYXJ0aXRpb24gYnkgXCJsYXN0X25hbWVcIiBvcmRlciBieSBcImZpcnN0X25hbWVcIiBhc2MpIGFzIFwiYXZlcmFnZV9hZ2VcIlxuICAgICAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG92ZXIob3Zlcikge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlT3ZlckJ1aWxkZXIoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5jbG9uZVdpdGhPdmVyKHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgKG92ZXIgPyBvdmVyKGJ1aWxkZXIpIDogYnVpbGRlcikudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYXN0cyB0aGUgZXhwcmVzc2lvbiB0byB0aGUgZ2l2ZW4gdHlwZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT21pdCBudWxsIGZyb20gdGhlIGV4cHJlc3Npb24ncyB0eXBlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIGluIGNhc2VzIHdoZXJlIHlvdSBrbm93IGFuIGV4cHJlc3Npb24gY2FuJ3QgYmVcbiAgICAgKiBudWxsLCBidXQgS3lzZWx5IGlzIHVuYWJsZSB0byBpbmZlciBpdC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgYHRoaXNgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJG5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlO1xuICAgIH1cbn1cbi8qKlxuICoge0BsaW5rIEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcn0gd2l0aCBhbiBhbGlhcy4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHtAbGluayBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIuYXN9LlxuICovXG5leHBvcnQgY2xhc3MgQWxpYXNlZEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciB7XG4gICAgI2FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcjtcbiAgICAjYWxpYXM7XG4gICAgY29uc3RydWN0b3IoYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyLCBhbGlhcykge1xuICAgICAgICB0aGlzLiNhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIgPSBhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXI7XG4gICAgICAgIHRoaXMuI2FsaWFzID0gYWxpYXM7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbGlhcztcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZSh0aGlzLiNhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCksIElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNhbGlhcykpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdW5hcnktb3BlcmF0aW9uLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IE9wZXJhdG9yTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgVW5hcnlPcGVyYXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5hcnktb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uLCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFeGlzdHMob3BlcmFuZCkge1xuICAgIHJldHVybiBwYXJzZVVuYXJ5T3BlcmF0aW9uKCdleGlzdHMnLCBvcGVyYW5kKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU5vdEV4aXN0cyhvcGVyYW5kKSB7XG4gICAgcmV0dXJuIHBhcnNlVW5hcnlPcGVyYXRpb24oJ25vdCBleGlzdHMnLCBvcGVyYW5kKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuYXJ5T3BlcmF0aW9uKG9wZXJhdG9yLCBvcGVyYW5kKSB7XG4gICAgcmV0dXJuIFVuYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUoT3BlcmF0b3JOb2RlLmNyZWF0ZShvcGVyYXRvciksIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihvcGVyYW5kKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VuYXJ5LW9wZXJhdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFVuYXJ5T3BlcmF0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVW5hcnlPcGVyYXRpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShvcGVyYXRvciwgb3BlcmFuZCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVbmFyeU9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICBvcGVyYW5kLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Nhc2UtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ2FzZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jYXNlLW5vZGUuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS93aGVuLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNTYWZlSW1tZWRpYXRlVmFsdWUsIHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlLCBwYXJzZVZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBDYXNlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZVRoZW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ2FzZU5vZGUuY2xvbmVXaXRoV2hlbih0aGlzLiNwcm9wcy5ub2RlLCBXaGVuTm9kZS5jcmVhdGUocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ2FzZVRoZW5CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB0aGVuKHZhbHVlRXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENhc2VXaGVuQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMubm9kZSwgaXNTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWVFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgID8gcGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWVFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogcGFyc2VWYWx1ZUV4cHJlc3Npb24odmFsdWVFeHByZXNzaW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDYXNlV2hlbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHdoZW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IENhc2VUaGVuQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNsb25lV2l0aFdoZW4odGhpcy4jcHJvcHMubm9kZSwgV2hlbk5vZGUuY3JlYXRlKHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UodmFsdWVFeHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZUVuZEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGVsc2U6IGlzU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlRXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgIDogcGFyc2VWYWx1ZUV4cHJlc3Npb24odmFsdWVFeHByZXNzaW9uKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW5kKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKENhc2VOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IGlzU3RhdGVtZW50OiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGVuZENhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IHRydWUgfSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDYXNlRW5kQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgZW5kKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKENhc2VOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IGlzU3RhdGVtZW50OiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGVuZENhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IHRydWUgfSkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY2FzZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuL3doZW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ2FzZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Nhc2VOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDYXNlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhXaGVuKGNhc2VOb2RlLCB3aGVuKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY2FzZU5vZGUsXG4gICAgICAgICAgICB3aGVuOiBmcmVlemUoY2FzZU5vZGUud2hlbiA/IFsuLi5jYXNlTm9kZS53aGVuLCB3aGVuXSA6IFt3aGVuXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVGhlbihjYXNlTm9kZSwgdGhlbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNhc2VOb2RlLFxuICAgICAgICAgICAgd2hlbjogY2FzZU5vZGUud2hlblxuICAgICAgICAgICAgICAgID8gZnJlZXplKFtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2FzZU5vZGUud2hlbi5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICAgICAgICAgIFdoZW5Ob2RlLmNsb25lV2l0aFJlc3VsdChjYXNlTm9kZS53aGVuW2Nhc2VOb2RlLndoZW4ubGVuZ3RoIC0gMV0sIHRoZW4pLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGNhc2VOb2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNhc2VOb2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1wYXRoLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05PcGVyYXRvckNoYWluTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tb3BlcmF0b3ItY2hhaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aExlZ05vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLWxlZy1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05QYXRoTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05SZWZlcmVuY2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1yZWZlcmVuY2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgSlNPTlBhdGhCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgYW4gZWxlbWVudCBvZiBhIEpTT04gYXJyYXkgaW4gYSBzcGVjaWZpYyBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIFNpbmNlIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIGFuIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBnaXZlbiBhcnJheSBsb2NhdGlvbiwgdGhlXG4gICAgICogcmVzdWx0aW5nIHR5cGUgaXMgYWx3YXlzIG51bGxhYmxlLiBJZiB5b3UncmUgc3VyZSB0aGUgZWxlbWVudCBleGlzdHMsIHlvdVxuICAgICAqIHNob3VsZCB1c2Uge0BsaW5rIFNlbGVjdFF1ZXJ5QnVpbGRlci4kYXNzZXJ0VHlwZX0gdG8gbmFycm93IHRoZSB0eXBlIHNhZmVseS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvIHtAbGluayBrZXl9IHRvIGFjY2VzcyBwcm9wZXJ0aWVzIG9mIEpTT04gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChlYiA9PlxuICAgICAqICAgICBlYi5yZWYoJ25pY2tuYW1lcycsICctPicpLmF0KDApLmFzKCdwcmltYXJ5X25pY2tuYW1lJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcIm5pY2tuYW1lc1wiLT4wIGFzIFwicHJpbWFyeV9uaWNrbmFtZVwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqYGBgXG4gICAgICpcbiAgICAgKiBDb21iaW5lZCB3aXRoIHtAbGluayBrZXl9OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZignZXhwZXJpZW5jZScsICctPicpLmF0KDApLmtleSgncm9sZScpLmFzKCdmaXJzdF9yb2xlJylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJleHBlcmllbmNlXCItPjAtPidyb2xlJyBhcyBcImZpcnN0X3JvbGVcIiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gdXNlIGAnbGFzdCdgIHRvIGFjY2VzcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBpbiBNeVNRTDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ25pY2tuYW1lcycsICctPiQnKS5hdCgnbGFzdCcpLmFzKCdsYXN0X25pY2tuYW1lJylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGBuaWNrbmFtZXNgLT4nJFtsYXN0XScgYXMgYGxhc3Rfbmlja25hbWVgIGZyb20gYHBlcnNvbmBcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE9yIGAnIy0xJ2AgaW4gU1FMaXRlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZignbmlja25hbWVzJywgJy0+PiQnKS5hdCgnIy0xJykuYXMoJ2xhc3Rfbmlja25hbWUnKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwibmlja25hbWVzXCItPj4nJFsjLTFdJyBhcyBgbGFzdF9uaWNrbmFtZWAgZnJvbSBgcGVyc29uYFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF0KGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVCdWlsZGVyV2l0aFBhdGhMZWcoJ0FycmF5TG9jYXRpb24nLCBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjY2VzcyBhIHByb3BlcnR5IG9mIGEgSlNPTiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBJZiBhIGZpZWxkIGlzIG9wdGlvbmFsLCB0aGUgcmVzdWx0aW5nIHR5cGUgd2lsbCBiZSBudWxsYWJsZS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvIHtAbGluayBhdH0gdG8gYWNjZXNzIGVsZW1lbnRzIG9mIEpTT04gYXJyYXlzLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdChlYiA9PlxuICAgICAqICAgZWIucmVmKCdhZGRyZXNzJywgJy0+Jykua2V5KCdjaXR5JykuYXMoJ2NpdHknKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcImFkZHJlc3NcIi0+J2NpdHknIGFzIFwiY2l0eVwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogR29pbmcgZGVlcGVyOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZigncHJvZmlsZScsICctPiQnKS5rZXkoJ3dlYnNpdGUnKS5rZXkoJ3VybCcpLmFzKCd3ZWJzaXRlX3VybCcpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBgcHJvZmlsZWAtPickLndlYnNpdGUudXJsJyBhcyBgd2Vic2l0ZV91cmxgIGZyb20gYHBlcnNvbmBcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIENvbWJpbmVkIHdpdGgge0BsaW5rIGF0fTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ3Byb2ZpbGUnLCAnLT4nKS5rZXkoJ2FkZHJlc3NlcycpLmF0KDApLmtleSgnY2l0eScpLmFzKCdjaXR5JylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwcm9maWxlXCItPidhZGRyZXNzZXMnLT4wLT4nY2l0eScgYXMgXCJjaXR5XCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAga2V5KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlQnVpbGRlcldpdGhQYXRoTGVnKCdNZW1iZXInLCBrZXkpO1xuICAgIH1cbiAgICAjY3JlYXRlQnVpbGRlcldpdGhQYXRoTGVnKGxlZ1R5cGUsIHZhbHVlKSB7XG4gICAgICAgIGlmIChKU09OUmVmZXJlbmNlTm9kZS5pcyh0aGlzLiNub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIoSlNPTlJlZmVyZW5jZU5vZGUuY2xvbmVXaXRoVHJhdmVyc2FsKHRoaXMuI25vZGUsIEpTT05QYXRoTm9kZS5pcyh0aGlzLiNub2RlLnRyYXZlcnNhbClcbiAgICAgICAgICAgICAgICA/IEpTT05QYXRoTm9kZS5jbG9uZVdpdGhMZWcodGhpcy4jbm9kZS50cmF2ZXJzYWwsIEpTT05QYXRoTGVnTm9kZS5jcmVhdGUobGVnVHlwZSwgdmFsdWUpKVxuICAgICAgICAgICAgICAgIDogSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlLmNsb25lV2l0aFZhbHVlKHRoaXMuI25vZGUudHJhdmVyc2FsLCBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHZhbHVlKSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyYXZlcnNlZEpTT05QYXRoQnVpbGRlcihKU09OUGF0aE5vZGUuY2xvbmVXaXRoTGVnKHRoaXMuI25vZGUsIEpTT05QYXRoTGVnTm9kZS5jcmVhdGUobGVnVHlwZSwgdmFsdWUpKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRyYXZlcnNlZEpTT05QYXRoQnVpbGRlciBleHRlbmRzIEpTT05QYXRoQnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICBzdXBlcihub2RlKTtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkSlNPTlBhdGhCdWlsZGVyKHRoaXMsIGFsaWFzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUganNvbiBwYXRoLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBKU09OUGF0aEJ1aWxkZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgICRub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYXZlcnNlZEpTT05QYXRoQnVpbGRlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbm9kZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWxpYXNlZEpTT05QYXRoQnVpbGRlciB7XG4gICAgI2pzb25QYXRoO1xuICAgICNhbGlhcztcbiAgICBjb25zdHJ1Y3Rvcihqc29uUGF0aCwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4janNvblBhdGggPSBqc29uUGF0aDtcbiAgICAgICAgdGhpcy4jYWxpYXMgPSBhbGlhcztcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqc29uUGF0aDtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4janNvblBhdGgudG9PcGVyYXRpb25Ob2RlKCksIGlzT3BlcmF0aW9uTm9kZVNvdXJjZSh0aGlzLiNhbGlhcylcbiAgICAgICAgICAgID8gdGhpcy4jYWxpYXMudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgICAgIDogSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qc29uLXBhdGgtbGVnLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSlNPTlBhdGhMZWdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKU09OUGF0aExlZ05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pTT05QYXRoTGVnTm9kZScsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdHVwbGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBUdXBsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1R1cGxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1R1cGxlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZSh2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RhdGEtdHlwZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEYXRhVHlwZU5vZGUsIGlzQ29sdW1uRGF0YVR5cGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZGF0YS10eXBlLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkge1xuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UoZGF0YVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBkYXRhVHlwZS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgaWYgKGlzQ29sdW1uRGF0YVR5cGUoZGF0YVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBEYXRhVHlwZU5vZGUuY3JlYXRlKGRhdGFUeXBlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGNvbHVtbiBkYXRhIHR5cGUgJHtKU09OLnN0cmluZ2lmeShkYXRhVHlwZSl9YCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RhdGEtdHlwZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuY29uc3QgU0lNUExFX0NPTFVNTl9EQVRBX1RZUEVTID0gW1xuICAgICd2YXJjaGFyJyxcbiAgICAnY2hhcicsXG4gICAgJ3RleHQnLFxuICAgICdpbnRlZ2VyJyxcbiAgICAnaW50MicsXG4gICAgJ2ludDQnLFxuICAgICdpbnQ4JyxcbiAgICAnc21hbGxpbnQnLFxuICAgICdiaWdpbnQnLFxuICAgICdib29sZWFuJyxcbiAgICAncmVhbCcsXG4gICAgJ2RvdWJsZSBwcmVjaXNpb24nLFxuICAgICdmbG9hdDQnLFxuICAgICdmbG9hdDgnLFxuICAgICdkZWNpbWFsJyxcbiAgICAnbnVtZXJpYycsXG4gICAgJ2JpbmFyeScsXG4gICAgJ2J5dGVhJyxcbiAgICAnZGF0ZScsXG4gICAgJ2RhdGV0aW1lJyxcbiAgICAndGltZScsXG4gICAgJ3RpbWV0eicsXG4gICAgJ3RpbWVzdGFtcCcsXG4gICAgJ3RpbWVzdGFtcHR6JyxcbiAgICAnc2VyaWFsJyxcbiAgICAnYmlnc2VyaWFsJyxcbiAgICAndXVpZCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uYicsXG4gICAgJ2Jsb2InLFxuICAgICd2YXJiaW5hcnknLFxuICAgICdpbnQ0cmFuZ2UnLFxuICAgICdpbnQ0bXVsdGlyYW5nZScsXG4gICAgJ2ludDhyYW5nZScsXG4gICAgJ2ludDhtdWx0aXJhbmdlJyxcbiAgICAnbnVtcmFuZ2UnLFxuICAgICdudW1tdWx0aXJhbmdlJyxcbiAgICAndHNyYW5nZScsXG4gICAgJ3RzbXVsdGlyYW5nZScsXG4gICAgJ3RzdHpyYW5nZScsXG4gICAgJ3RzdHptdWx0aXJhbmdlJyxcbiAgICAnZGF0ZXJhbmdlJyxcbiAgICAnZGF0ZW11bHRpcmFuZ2UnLFxuXTtcbmNvbnN0IENPTFVNTl9EQVRBX1RZUEVfUkVHRVggPSBbXG4gICAgL152YXJjaGFyXFwoXFxkK1xcKSQvLFxuICAgIC9eY2hhclxcKFxcZCtcXCkkLyxcbiAgICAvXmRlY2ltYWxcXChcXGQrLCBcXGQrXFwpJC8sXG4gICAgL15udW1lcmljXFwoXFxkKywgXFxkK1xcKSQvLFxuICAgIC9eYmluYXJ5XFwoXFxkK1xcKSQvLFxuICAgIC9eZGF0ZXRpbWVcXChcXGQrXFwpJC8sXG4gICAgL150aW1lXFwoXFxkK1xcKSQvLFxuICAgIC9edGltZXR6XFwoXFxkK1xcKSQvLFxuICAgIC9edGltZXN0YW1wXFwoXFxkK1xcKSQvLFxuICAgIC9edGltZXN0YW1wdHpcXChcXGQrXFwpJC8sXG4gICAgL152YXJiaW5hcnlcXChcXGQrXFwpJC8sXG5dO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERhdGFUeXBlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRGF0YVR5cGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShkYXRhVHlwZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEYXRhVHlwZU5vZGUnLFxuICAgICAgICAgICAgZGF0YVR5cGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbHVtbkRhdGFUeXBlKGRhdGFUeXBlKSB7XG4gICAgaWYgKFNJTVBMRV9DT0xVTU5fREFUQV9UWVBFUy5pbmNsdWRlcyhkYXRhVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDT0xVTU5fREFUQV9UWVBFX1JFR0VYLnNvbWUoKHIpID0+IHIudGVzdChkYXRhVHlwZSkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Nhc3Qtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDYXN0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ2FzdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGV4cHJlc3Npb24sIGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Nhc3ROb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICBkYXRhVHlwZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9keW5hbWljLXRhYmxlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNUYWJsZUJ1aWxkZXIge1xuICAgICN0YWJsZTtcbiAgICBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0YWJsZTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICAgICAgdGhpcy4jdGFibGUgPSB0YWJsZTtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlcih0aGlzLiN0YWJsZSwgYWxpYXMpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciB7XG4gICAgI3RhYmxlO1xuICAgICNhbGlhcztcbiAgICBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0YWJsZTtcbiAgICB9XG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRhYmxlLCBhbGlhcykge1xuICAgICAgICB0aGlzLiN0YWJsZSA9IHRhYmxlO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHBhcnNlVGFibGUodGhpcy4jdGFibGUpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlcihvYmopIHtcbiAgICByZXR1cm4gKGlzT2JqZWN0KG9iaikgJiZcbiAgICAgICAgaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaikgJiZcbiAgICAgICAgaXNTdHJpbmcob2JqLnRhYmxlKSAmJlxuICAgICAgICBpc1N0cmluZyhvYmouYWxpYXMpKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbHRlci10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLWRlZmluaXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgUmVuYW1lQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlbmFtZS1jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIG5vb3AgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlciwgfSBmcm9tICcuL2NvbHVtbi1kZWZpbml0aW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgTW9kaWZ5Q29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL21vZGlmeS1jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQWRkQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgRHJvcENvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQWx0ZXJDb2x1bW5CdWlsZGVyLCB9IGZyb20gJy4vYWx0ZXItY29sdW1uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZUV4ZWN1dG9yIH0gZnJvbSAnLi9hbHRlci10YWJsZS1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1hZGQtZm9yZWlnbi1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVEcm9wQ29uc3RyYWludEJ1aWxkZXIgfSBmcm9tICcuL2FsdGVyLXRhYmxlLWRyb3AtY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFkZEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIgfSBmcm9tICcuL2FsdGVyLXRhYmxlLWFkZC1pbmRleC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciwgfSBmcm9tICcuL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IENoZWNrQ29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUmVuYW1lQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZW5hbWUtY29uc3RyYWludC1ub2RlLmpzJztcbi8qKlxuICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGBhbHRlciB0YWJsZWAgcXVlcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgcmVuYW1lVG8obmV3VGFibGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgcmVuYW1lVG86IHBhcnNlVGFibGUobmV3VGFibGVOYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0U2NoZW1hKG5ld1NjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHNldFNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5ld1NjaGVtYSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFsdGVyQ29sdW1uKGNvbHVtbiwgYWx0ZXJhdGlvbikge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYWx0ZXJhdGlvbihuZXcgQWx0ZXJDb2x1bW5CdWlsZGVyKGNvbHVtbikpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBEcm9wQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb2x1bW4oY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBSZW5hbWVDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGRhdGFUeXBlLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jcmVhdGUoY29sdW1uTmFtZSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIEFkZENvbHVtbk5vZGUuY3JlYXRlKGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUNvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBNb2RpZnlDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRVbmlxdWVDb25zdHJhaW50fVxuICAgICAqL1xuICAgIGFkZFVuaXF1ZUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCB1bmlxdWVDb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZENvbnN0cmFpbnQ6IEFkZENvbnN0cmFpbnROb2RlLmNyZWF0ZSh1bmlxdWVDb25zdHJhaW50QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZENoZWNrQ29uc3RyYWludH1cbiAgICAgKi9cbiAgICBhZGRDaGVja0NvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNoZWNrRXhwcmVzc2lvbiwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGNvbnN0cmFpbnRCdWlsZGVyID0gYnVpbGQobmV3IENoZWNrQ29uc3RyYWludEJ1aWxkZXIoQ2hlY2tDb25zdHJhaW50Tm9kZS5jcmVhdGUoY2hlY2tFeHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRDb25zdHJhaW50OiBBZGRDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH1cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50fSB0aGlzIG1ldGhvZCByZXR1cm5zXG4gICAgICogdGhlIGNvbnN0cmFpbnQgYnVpbGRlciBhbmQgZG9lc24ndCB0YWtlIGEgY2FsbGJhY2sgYXMgdGhlIGxhc3QgYXJndW1lbnQuIFRoaXNcbiAgICAgKiBpcyBiZWNhdXNlIHlvdSBjYW4gb25seSBhZGQgb25lIGNvbHVtbiBwZXIgYEFMVEVSIFRBQkxFYCBxdWVyeS5cbiAgICAgKi9cbiAgICBhZGRGb3JlaWduS2V5Q29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY29sdW1ucywgdGFyZ2V0VGFibGUsIHRhcmdldENvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIHBhcnNlVGFibGUodGFyZ2V0VGFibGUpLCB0YXJnZXRDb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZFByaW1hcnlLZXlDb25zdHJhaW50fVxuICAgICAqL1xuICAgIGFkZFByaW1hcnlLZXlDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkQ29uc3RyYWludDogQWRkQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZHJvcENvbnN0cmFpbnQ6IERyb3BDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb25zdHJhaW50KG9sZE5hbWUsIG5ld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgcmVuYW1lQ29uc3RyYWludDogUmVuYW1lQ29uc3RyYWludE5vZGUuY3JlYXRlKG9sZE5hbWUsIG5ld05hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBpbmRleCB0byB0YWJsZS5cbiAgICAgKlxuICAgICAqICAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkSW5kZXgoJ3BlcnNvbl9lbWFpbF9pbmRleCcpXG4gICAgICogICAuY29sdW1uKCdlbWFpbCcpXG4gICAgICogICAudW5pcXVlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgdW5pcXVlIGluZGV4IGBwZXJzb25fZW1haWxfaW5kZXhgIChgZW1haWxgKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZEluZGV4KGluZGV4TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRyb3AgaW5kZXggZnJvbSB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zY2hlbWEuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5kcm9wSW5kZXgoJ3BlcnNvbl9lbWFpbF9pbmRleCcpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgZHJvcCBpbmRleCBgdGVzdF9maXJzdF9uYW1lX2luZGV4YFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BJbmRleChpbmRleE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBkcm9wSW5kZXg6IERyb3BJbmRleE5vZGUuY3JlYXRlKGluZGV4TmFtZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLiRjYWxsfVxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGFsdGVyQ29sdW1uKGNvbHVtbiwgYWx0ZXJhdGlvbikge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYWx0ZXJhdGlvbihuZXcgQWx0ZXJDb2x1bW5CdWlsZGVyKGNvbHVtbikpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBEcm9wQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb2x1bW4oY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBSZW5hbWVDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGRhdGFUeXBlLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jcmVhdGUoY29sdW1uTmFtZSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIEFkZENvbHVtbk5vZGUuY3JlYXRlKGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUNvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBNb2RpZnlDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FkZC1jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZGRDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBZGRDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWRkQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29sdW1uLWRlZmluaXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb2x1bW5EZWZpbml0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29sdW1uRGVmaW5pdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbiwgZGF0YVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uRGVmaW5pdGlvbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLFxuICAgICAgICAgICAgZGF0YVR5cGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRnJvbnRNb2RpZmllcihub2RlLCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogbm9kZS5mcm9udE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5ub2RlLmZyb250TW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBbbW9kaWZpZXJdLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEVuZE1vZGlmaWVyKG5vZGUsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogbm9kZS5lbmRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4ubm9kZS5lbmRNb2RpZmllcnMsIG1vZGlmaWVyXSlcbiAgICAgICAgICAgICAgICA6IFttb2RpZmllcl0sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcENvbHVtbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlbmFtZS1jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZW5hbWVDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZW5hbWVDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZW5hbWVDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgICAgIHJlbmFtZVRvOiBDb2x1bW5Ob2RlLmNyZWF0ZShuZXdDb2x1bW4pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbHVtbi1kZWZpbml0aW9uLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IFJlZmVyZW5jZXNOb2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlZmVyZW5jZXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBTZWxlY3RBbGxOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LWFsbC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlU3RyaW5nUmVmZXJlbmNlIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tZGVmaW5pdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlRGVmYXVsdFZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGVmYXVsdC12YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgR2VuZXJhdGVkTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2dlbmVyYXRlZC1ub2RlLmpzJztcbmltcG9ydCB7IERlZmF1bHRWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LXZhbHVlLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24gfSBmcm9tICcuLi9wYXJzZXIvb24tbW9kaWZ5LWFjdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIENvbHVtbkRlZmluaXRpb25CdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBhdXRvX2luY3JlbWVudGAgb3IgYGF1dG9pbmNyZW1lbnRgIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvblxuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgZGlhbGVjdC5cbiAgICAgKlxuICAgICAqIFNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIGRvbid0IHN1cHBvcnQgdGhpcy4gT24gUG9zdGdyZVNRTFxuICAgICAqIHlvdSBjYW4gdXNlIHRoZSBgc2VyaWFsYCBvciBgYmlnc2VyaWFsYCBkYXRhIHR5cGUgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLmF1dG9JbmNyZW1lbnQoKS5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBpZGAgaW50ZWdlciBwcmltYXJ5IGtleSBhdXRvX2luY3JlbWVudFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhdXRvSW5jcmVtZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgY29sdW1uIGFuIGlkZW50aXR5IGNvbHVtbi5cbiAgICAgKlxuICAgICAqIFRoaXMgb25seSB3b3JrcyBvbiBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlciAoTVNTUUwpLlxuICAgICAqXG4gICAgICogRm9yIFBvc3RncmVTUUwncyBgZ2VuZXJhdGVkIGFsd2F5cyBhcyBpZGVudGl0eWAgdXNlIHtAbGluayBnZW5lcmF0ZWRBbHdheXNBc0lkZW50aXR5fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLmlkZW50aXR5KCkucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiaWRcIiBpbnRlZ2VyIGlkZW50aXR5IHByaW1hcnkga2V5XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGlkZW50aXR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGlkZW50aXR5OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGNvbHVtbiB0aGUgcHJpbWFyeSBrZXkuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgY29tcG9zaXRlIHByaW1hcnkga2V5IHVzZSB0aGVcbiAgICAgKiB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZFByaW1hcnlLZXlDb25zdHJhaW50fSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBpZGAgaW50ZWdlciBwcmltYXJ5IGtleVxuICAgICAqIClcbiAgICAgKi9cbiAgICBwcmltYXJ5S2V5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IHByaW1hcnlLZXk6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZm9yZWlnbiBrZXkgY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqIElmIHlvdXIgZGF0YWJhc2UgZW5naW5lIGRvZXNuJ3Qgc3VwcG9ydCBmb3JlaWduIGtleSBjb25zdHJhaW50cyBpbiB0aGVcbiAgICAgKiBjb2x1bW4gZGVmaW5pdGlvbiAobGlrZSBNeVNRTCA1KSB5b3UgbmVlZCB0byBjYWxsIHRoZSB0YWJsZSBsZXZlbFxuICAgICAqIHtAbGluayBDcmVhdGVUYWJsZUJ1aWxkZXIuYWRkRm9yZWlnbktleUNvbnN0cmFpbnR9IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignb3duZXJfaWQnLCAnaW50ZWdlcicsIChjb2wpID0+IGNvbC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBldFwiIChcbiAgICAgKiAgIFwib3duZXJfaWRcIiBpbnRlZ2VyIHJlZmVyZW5jZXMgXCJwZXJzb25cIiAoXCJpZFwiKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWZlcmVuY2VzKHJlZikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VzID0gcGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmKTtcbiAgICAgICAgaWYgKCFyZWZlcmVuY2VzLnRhYmxlIHx8IFNlbGVjdEFsbE5vZGUuaXMocmVmZXJlbmNlcy5jb2x1bW4pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgY2FsbCByZWZlcmVuY2VzKCcke3JlZn0nKS4gVGhlIHJlZmVyZW5jZSBtdXN0IGhhdmUgZm9ybWF0IHRhYmxlLmNvbHVtbiBvciBzY2hlbWEudGFibGUuY29sdW1uYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgcmVmZXJlbmNlczogUmVmZXJlbmNlc05vZGUuY3JlYXRlKHJlZmVyZW5jZXMudGFibGUsIFtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzLmNvbHVtbixcbiAgICAgICAgICAgIF0pLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYG9uIGRlbGV0ZWAgY29uc3RyYWludCBmb3IgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi5cbiAgICAgKlxuICAgICAqIElmIHlvdXIgZGF0YWJhc2UgZW5naW5lIGRvZXNuJ3Qgc3VwcG9ydCBmb3JlaWduIGtleSBjb25zdHJhaW50cyBpbiB0aGVcbiAgICAgKiBjb2x1bW4gZGVmaW5pdGlvbiAobGlrZSBNeVNRTCA1KSB5b3UgbmVlZCB0byBjYWxsIHRoZSB0YWJsZSBsZXZlbFxuICAgICAqIHtAbGluayBDcmVhdGVUYWJsZUJ1aWxkZXIuYWRkRm9yZWlnbktleUNvbnN0cmFpbnR9IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbihcbiAgICAgKiAgICAgJ293bmVyX2lkJyxcbiAgICAgKiAgICAgJ2ludGVnZXInLFxuICAgICAqICAgICAoY29sKSA9PiBjb2wucmVmZXJlbmNlcygncGVyc29uLmlkJykub25EZWxldGUoJ2Nhc2NhZGUnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGV0XCIgKFxuICAgICAqICAgXCJvd25lcl9pZFwiIGludGVnZXIgcmVmZXJlbmNlcyBcInBlcnNvblwiIChcImlkXCIpIG9uIGRlbGV0ZSBjYXNjYWRlXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9uRGVsZXRlKG9uRGVsZXRlKSB7XG4gICAgICAgIGlmICghdGhpcy4jbm9kZS5yZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uIGRlbGV0ZSBjb25zdHJhaW50IGNhbiBvbmx5IGJlIGFkZGVkIGZvciBmb3JlaWduIGtleXMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzTm9kZS5jbG9uZVdpdGhPbkRlbGV0ZSh0aGlzLiNub2RlLnJlZmVyZW5jZXMsIHBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uKG9uRGVsZXRlKSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBgb24gdXBkYXRlYCBjb25zdHJhaW50IGZvciB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLlxuICAgICAqXG4gICAgICogSWYgeW91ciBkYXRhYmFzZSBlbmdpbmUgZG9lc24ndCBzdXBwb3J0IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGluIHRoZVxuICAgICAqIGNvbHVtbiBkZWZpbml0aW9uIChsaWtlIE15U1FMIDUpIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHRhYmxlIGxldmVsXG4gICAgICoge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH0gbWV0aG9kIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKFxuICAgICAqICAgICAnb3duZXJfaWQnLFxuICAgICAqICAgICAnaW50ZWdlcicsXG4gICAgICogICAgIChjb2wpID0+IGNvbC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKS5vblVwZGF0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXRcIiAoXG4gICAgICogICBcIm93bmVyX2lkXCIgaW50ZWdlciByZWZlcmVuY2VzIFwicGVyc29uXCIgKFwiaWRcIikgb24gdXBkYXRlIGNhc2NhZGVcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb25VcGRhdGUob25VcGRhdGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNub2RlLnJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb24gdXBkYXRlIGNvbnN0cmFpbnQgY2FuIG9ubHkgYmUgYWRkZWQgZm9yIGZvcmVpZ24ga2V5cycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNOb2RlLmNsb25lV2l0aE9uVXBkYXRlKHRoaXMuI25vZGUucmVmZXJlbmNlcywgcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24ob25VcGRhdGUpKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdW5pcXVlIGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdlbWFpbCcsICd2YXJjaGFyKDI1NSknLCBjb2wgPT4gY29sLnVuaXF1ZSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgZW1haWxgIHZhcmNoYXIoMjU1KSB1bmlxdWVcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdW5pcXVlKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IHVuaXF1ZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBgbm90IG51bGxgIGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoMjU1KScsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgZmlyc3RfbmFtZWAgdmFyY2hhcigyNTUpIG5vdCBudWxsXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgbm90TnVsbDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBgdW5zaWduZWRgIG1vZGlmaWVyIGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBNeVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2FnZScsICdpbnRlZ2VyJywgY29sID0+IGNvbC51bnNpZ25lZCgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgYWdlYCBpbnRlZ2VyIHVuc2lnbmVkXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHVuc2lnbmVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IHVuc2lnbmVkOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRlZmF1bHQgdmFsdWUgY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ251bWJlcl9vZl9sZWdzJywgJ2ludGVnZXInLCAoY29sKSA9PiBjb2wuZGVmYXVsdFRvKDQpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGV0YCAoXG4gICAgICogICBgbnVtYmVyX29mX2xlZ3NgIGludGVnZXIgZGVmYXVsdCA0XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVmFsdWVzIHBhc3NlZCB0byBgZGVmYXVsdFRvYCBhcmUgaW50ZXJwcmV0ZWQgYXMgdmFsdWUgbGl0ZXJhbHMgYnkgZGVmYXVsdC4gWW91IGNhbiBkZWZpbmVcbiAgICAgKiBhbiBhcmJpdHJhcnkgU1FMIGV4cHJlc3Npb24gdXNpbmcgdGhlIHtAbGluayBzcWx9IHRlbXBsYXRlIHRhZzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oXG4gICAgICogICAgICdjcmVhdGVkX2F0JyxcbiAgICAgKiAgICAgJ3RpbWVzdGFtcCcsXG4gICAgICogICAgIChjb2wpID0+IGNvbC5kZWZhdWx0VG8oc3FsYENVUlJFTlRfVElNRVNUQU1QYClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBldGAgKFxuICAgICAqICAgYGNyZWF0ZWRfYXRgIHRpbWVzdGFtcCBkZWZhdWx0IENVUlJFTlRfVElNRVNUQU1QXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRlZmF1bHRUbyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBkZWZhdWx0VG86IERlZmF1bHRWYWx1ZU5vZGUuY3JlYXRlKHBhcnNlRGVmYXVsdFZhbHVlRXhwcmVzc2lvbih2YWx1ZSkpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjaGVjayBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdudW1iZXJfb2ZfbGVncycsICdpbnRlZ2VyJywgKGNvbCkgPT5cbiAgICAgKiAgICAgY29sLmNoZWNrKHNxbGBudW1iZXJfb2ZfbGVncyA8IDVgKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGV0YCAoXG4gICAgICogICBgbnVtYmVyX29mX2xlZ3NgIGludGVnZXIgY2hlY2sgKG51bWJlcl9vZl9sZWdzIDwgNSlcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY2hlY2soZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBjaGVjazogQ2hlY2tDb25zdHJhaW50Tm9kZS5jcmVhdGUoZXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGNvbHVtbiBhIGdlbmVyYXRlZCBjb2x1bW4gdXNpbmcgYSBgZ2VuZXJhdGVkIGFsd2F5cyBhc2Agc3RhdGVtZW50LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmdWxsX25hbWUnLCAndmFyY2hhcigyNTUpJyxcbiAgICAgKiAgICAgKGNvbCkgPT4gY29sLmdlbmVyYXRlZEFsd2F5c0FzKHNxbGBjb25jYXQoZmlyc3RfbmFtZSwgJyAnLCBsYXN0X25hbWUpYClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGZ1bGxfbmFtZWAgdmFyY2hhcigyNTUpIGdlbmVyYXRlZCBhbHdheXMgYXMgKGNvbmNhdChmaXJzdF9uYW1lLCAnICcsIGxhc3RfbmFtZSkpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdlbmVyYXRlZEFsd2F5c0FzKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWROb2RlLmNyZWF0ZVdpdGhFeHByZXNzaW9uKGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGBnZW5lcmF0ZWQgYWx3YXlzIGFzIGlkZW50aXR5YCBzcGVjaWZpZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiBGb3IgTVMgU1FMIFNlcnZlciAoTVNTUUwpJ3MgaWRlbnRpdHkgY29sdW1uIHVzZSB7QGxpbmsgaWRlbnRpdHl9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wuZ2VuZXJhdGVkQWx3YXlzQXNJZGVudGl0eSgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiaWRcIiBpbnRlZ2VyIGdlbmVyYXRlZCBhbHdheXMgYXMgaWRlbnRpdHkgcHJpbWFyeSBrZXlcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2VuZXJhdGVkQWx3YXlzQXNJZGVudGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWROb2RlLmNyZWF0ZSh7IGlkZW50aXR5OiB0cnVlLCBhbHdheXM6IHRydWUgfSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYGdlbmVyYXRlZCBieSBkZWZhdWx0IGFzIGlkZW50aXR5YCBzcGVjaWZpZXIgb24gc3VwcG9ydGVkIGRpYWxlY3RzLlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogRm9yIE1TIFNRTCBTZXJ2ZXIgKE1TU1FMKSdzIGlkZW50aXR5IGNvbHVtbiB1c2Uge0BsaW5rIGlkZW50aXR5fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLmdlbmVyYXRlZEJ5RGVmYXVsdEFzSWRlbnRpdHkoKS5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXJzb25cIiAoXG4gICAgICogICBcImlkXCIgaW50ZWdlciBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBhcyBpZGVudGl0eSBwcmltYXJ5IGtleVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRCeURlZmF1bHRBc0lkZW50aXR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZE5vZGUuY3JlYXRlKHsgaWRlbnRpdHk6IHRydWUsIGJ5RGVmYXVsdDogdHJ1ZSB9KSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIGdlbmVyYXRlZCBjb2x1bW4gc3RvcmVkIGluc3RlYWQgb2YgdmlydHVhbC4gVGhpcyBtZXRob2QgY2FuIG9ubHlcbiAgICAgKiBiZSB1c2VkIHdpdGgge0BsaW5rIGdlbmVyYXRlZEFsd2F5c0FzfVxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignZnVsbF9uYW1lJywgJ3ZhcmNoYXIoMjU1KScsIChjb2wpID0+IGNvbFxuICAgICAqICAgICAuZ2VuZXJhdGVkQWx3YXlzQXMoc3FsYGNvbmNhdChmaXJzdF9uYW1lLCAnICcsIGxhc3RfbmFtZSlgKVxuICAgICAqICAgICAuc3RvcmVkKClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGZ1bGxfbmFtZWAgdmFyY2hhcigyNTUpIGdlbmVyYXRlZCBhbHdheXMgYXMgKGNvbmNhdChmaXJzdF9uYW1lLCAnICcsIGxhc3RfbmFtZSkpIHN0b3JlZFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdG9yZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy4jbm9kZS5nZW5lcmF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RvcmVkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGdlbmVyYXRlZEFsd2F5c0FzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLmdlbmVyYXRlZCwge1xuICAgICAgICAgICAgICAgIHN0b3JlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCByaWdodCBhZnRlciB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbihcbiAgICAgKiAgICAgJ2ZpcnN0X25hbWUnLFxuICAgICAqICAgICAndmFyY2hhcigzNiknLFxuICAgICAqICAgICAoY29sKSA9PiBjb2wubW9kaWZ5RnJvbnQoc3FsYGNvbGxhdGUgdXRmOG1iNF9nZW5lcmFsX2NpYCkubm90TnVsbCgpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBpZGAgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIGBmaXJzdF9uYW1lYCB2YXJjaGFyKDM2KSBjb2xsYXRlIHV0ZjhtYjRfZ2VuZXJhbF9jaSBub3QgbnVsbFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlGcm9udChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aEZyb250TW9kaWZpZXIodGhpcy4jbm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgbnVsbHMgbm90IGRpc3RpbmN0YCBzcGVjaWZpZXIuXG4gICAgICogU2hvdWxkIGJlIHVzZWQgd2l0aCBgdW5pcXVlYCBjb25zdHJhaW50LlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDMwKScsIGNvbCA9PiBjb2wudW5pcXVlKCkubnVsbHNOb3REaXN0aW5jdCgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGVyc29uXCIgKFxuICAgICAqICAgXCJpZFwiIGludGVnZXIgcHJpbWFyeSBrZXksXG4gICAgICogICBcImZpcnN0X25hbWVcIiB2YXJjaGFyKDMwKSB1bmlxdWUgbnVsbHMgbm90IGRpc3RpbmN0XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG51bGxzTm90RGlzdGluY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgbnVsbHNOb3REaXN0aW5jdDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYGlmIG5vdCBleGlzdHNgIHNwZWNpZmllci4gVGhpcyBvbmx5IHdvcmtzIGZvciBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdlbWFpbCcsICd2YXJjaGFyKDI1NSknLCBjb2wgPT4gY29sLnVuaXF1ZSgpLmlmTm90RXhpc3RzKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBcInBlcnNvblwiIGFkZCBjb2x1bW4gaWYgbm90IGV4aXN0cyBcImVtYWlsXCIgdmFyY2hhcigyNTUpIHVuaXF1ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGlmTm90RXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGlmTm90RXhpc3RzOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbihcbiAgICAgKiAgICAgJ2FnZScsXG4gICAgICogICAgICdpbnRlZ2VyJyxcbiAgICAgKiAgICAgY29sID0+IGNvbC51bnNpZ25lZCgpXG4gICAgICogICAgICAgLm5vdE51bGwoKVxuICAgICAqICAgICAgIC5tb2RpZnlFbmQoc3FsYGNvbW1lbnQgJHtzcWwubGl0KCdpdCBpcyBub3QgcG9saXRlIHRvIGFzayBhIHdvbWFuIGhlciBhZ2UnKX1gKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgaWRgIGludGVnZXIgcHJpbWFyeSBrZXksXG4gICAgICogICBgYWdlYCBpbnRlZ2VyIHVuc2lnbmVkIG5vdCBudWxsIGNvbW1lbnQgJ2l0IGlzIG5vdCBwb2xpdGUgdG8gYXNrIGEgd29tYW4gaGVyIGFnZSdcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jbm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY2hlY2stY29uc3RyYWludC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ2hlY2tDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ2hlY2tDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZXhwcmVzc2lvbiwgY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ2hlY2tDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgbmFtZTogY29uc3RyYWludE5hbWUgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZmVyZW5jZXMtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjb25zdCBPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TID0gW1xuICAgICdubyBhY3Rpb24nLFxuICAgICdyZXN0cmljdCcsXG4gICAgJ2Nhc2NhZGUnLFxuICAgICdzZXQgbnVsbCcsXG4gICAgJ3NldCBkZWZhdWx0Jyxcbl07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmVmZXJlbmNlc05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JlZmVyZW5jZXNOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZSwgY29sdW1ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZlcmVuY2VzTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShbLi4uY29sdW1uc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9uRGVsZXRlKHJlZmVyZW5jZXMsIG9uRGVsZXRlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ucmVmZXJlbmNlcyxcbiAgICAgICAgICAgIG9uRGVsZXRlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9uVXBkYXRlKHJlZmVyZW5jZXMsIG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ucmVmZXJlbmNlcyxcbiAgICAgICAgICAgIG9uVXBkYXRlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtdmFsdWUtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVmYXVsdFZhbHVlRXhwcmVzc2lvbih2YWx1ZSkge1xuICAgIHJldHVybiBpc09wZXJhdGlvbk5vZGVTb3VyY2UodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgOiBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHZhbHVlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZ2VuZXJhdGVkLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgR2VuZXJhdGVkTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnR2VuZXJhdGVkTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0dlbmVyYXRlZE5vZGUnLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhFeHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnR2VuZXJhdGVkTm9kZScsXG4gICAgICAgICAgICBhbHdheXM6IHRydWUsXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtdmFsdWUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0VmFsdWVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEZWZhdWx0VmFsdWVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRGVmYXVsdFZhbHVlTm9kZScsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tbW9kaWZ5LWFjdGlvbi1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlZmVyZW5jZXMtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24oYWN0aW9uKSB7XG4gICAgaWYgKE9OX01PRElGWV9GT1JFSUdOX0FDVElPTlMuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgT25Nb2RpZnlGb3JlaWduQWN0aW9uICR7YWN0aW9ufWApO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9tb2RpZnktY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTW9kaWZ5Q29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnTW9kaWZ5Q29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ01vZGlmeUNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbiB9IGZyb20gJy4uL3BhcnNlci9vbi1tb2RpZnktYWN0aW9uLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICBvbkRlbGV0ZShvbkRlbGV0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIG9uRGVsZXRlOiBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbihvbkRlbGV0ZSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgb25VcGRhdGUob25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBvblVwZGF0ZTogcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24ob25VcGRhdGUpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGRlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgbm90RGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5SW1tZWRpYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IFJlZmVyZW5jZXNOb2RlIH0gZnJvbSAnLi9yZWZlcmVuY2VzLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRm9yZWlnbktleUNvbnN0cmFpbnROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzb3VyY2VDb2x1bW5zLCB0YXJnZXRUYWJsZSwgdGFyZ2V0Q29sdW1ucywgY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRm9yZWlnbktleUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHNvdXJjZUNvbHVtbnMsXG4gICAgICAgICAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzTm9kZS5jcmVhdGUodGFyZ2V0VGFibGUsIHRhcmdldENvbHVtbnMpLFxuICAgICAgICAgICAgbmFtZTogY29uc3RyYWludE5hbWUgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hZGQtY29uc3RyYWludC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFkZENvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBZGRDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb25zdHJhaW50LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VuaXF1ZS1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVbmlxdWVDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVW5pcXVlQ29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lLCBudWxsc05vdERpc3RpbmN0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VuaXF1ZUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpLFxuICAgICAgICAgICAgbmFtZTogY29uc3RyYWludE5hbWUgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEcm9wQ29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnROYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wQ29uc3RyYWludCwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wQ29uc3RyYWludCxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLWNvbHVtbi1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWx0ZXJDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9kZWZhdWx0LXZhbHVlLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJDb2x1bW5CdWlsZGVyIHtcbiAgICAjY29sdW1uO1xuICAgIGNvbnN0cnVjdG9yKGNvbHVtbikge1xuICAgICAgICB0aGlzLiNjb2x1bW4gPSBjb2x1bW47XG4gICAgfVxuICAgIHNldERhdGFUeXBlKGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdkYXRhVHlwZScsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdzZXREZWZhdWx0JywgcGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uKHZhbHVlKSkpO1xuICAgIH1cbiAgICBkcm9wRGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlcmVkQ29sdW1uQnVpbGRlcihBbHRlckNvbHVtbk5vZGUuY3JlYXRlKHRoaXMuI2NvbHVtbiwgJ2Ryb3BEZWZhdWx0JywgdHJ1ZSkpO1xuICAgIH1cbiAgICBzZXROb3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyZWRDb2x1bW5CdWlsZGVyKEFsdGVyQ29sdW1uTm9kZS5jcmVhdGUodGhpcy4jY29sdW1uLCAnc2V0Tm90TnVsbCcsIHRydWUpKTtcbiAgICB9XG4gICAgZHJvcE5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdkcm9wTm90TnVsbCcsIHRydWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbn1cbi8qKlxuICogQWxsb3dzIHVzIHRvIGZvcmNlIGNvbnN1bWVycyB0byBkbyBleGFjdGx5IG9uZSBhbHRlcmF0aW9uIHRvIGEgY29sdW1uLlxuICpcbiAqIE9uZSBjYW5ub3QgZG8gbm8gYWx0ZXJhdGlvbnM6XG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IGRiLnNjaGVtYVxuICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAqIC8vICAuZXhlY3V0ZSgpIC8vIFByb3BlcnR5ICdleGVjdXRlJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdBbHRlcmVkQ29sdW1uQnVpbGRlcicuXG4gKiBgYGBcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgZGIuc2NoZW1hXG4gKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICogLy8gIC5hbHRlckNvbHVtbignYWdlJywgKGFjKSA9PiBhYykgLy8gVHlwZSAnQWx0ZXJDb2x1bW5CdWlsZGVyJyBpcyBub3QgYXNzaWduYWJsZSB0byB0eXBlICdBbHRlcmVkQ29sdW1uQnVpbGRlcicuXG4gKiAvLyAgLmV4ZWN1dGUoKVxuICogYGBgXG4gKlxuICogT25lIGNhbm5vdCBkbyBtdWx0aXBsZSBhbHRlcmF0aW9uczpcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgZGIuc2NoZW1hXG4gKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICogLy8gIC5hbHRlckNvbHVtbignYWdlJywgKGFjKSA9PiBhYy5kcm9wTm90TnVsbCgpLnNldE5vdE51bGwoKSkgLy8gUHJvcGVydHkgJ3NldE5vdE51bGwnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0FsdGVyZWRDb2x1bW5CdWlsZGVyJy5cbiAqIC8vICAuZXhlY3V0ZSgpXG4gKiBgYGBcbiAqXG4gKiBXaGljaCB3b3VsZCBub3cgdGhyb3cgYSBjb21waWxhdGlvbiBlcnJvciwgaW5zdGVhZCBvZiBhIHJ1bnRpbWUgZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbHRlcmVkQ29sdW1uQnVpbGRlciB7XG4gICAgI2FsdGVyQ29sdW1uTm9kZTtcbiAgICBjb25zdHJ1Y3RvcihhbHRlckNvbHVtbk5vZGUpIHtcbiAgICAgICAgdGhpcy4jYWx0ZXJDb2x1bW5Ob2RlID0gYWx0ZXJDb2x1bW5Ob2RlO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbHRlckNvbHVtbk5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci1jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBbHRlckNvbHVtbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FsdGVyQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uLCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbHRlckNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLFxuICAgICAgICAgICAgW3Byb3BdOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1leGVjdXRvci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlRXhlY3V0b3Ige1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtYWRkLWZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZENvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWRkLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIG9uRGVsZXRlKG9uRGVsZXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5vbkRlbGV0ZShvbkRlbGV0ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvblVwZGF0ZShvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcjogdGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIub25VcGRhdGUob25VcGRhdGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLmRlZmVycmFibGUoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5ub3REZWZlcnJhYmxlKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsbHlEZWZlcnJlZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLmluaXRpYWxseURlZmVycmVkKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsbHlJbW1lZGlhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5pbml0aWFsbHlJbW1lZGlhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkoQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICBhZGRDb25zdHJhaW50OiBBZGRDb25zdHJhaW50Tm9kZS5jcmVhdGUodGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1kcm9wLWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsdGVyVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgaWZFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuZHJvcENvbnN0cmFpbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuZHJvcENvbnN0cmFpbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXI6ICdjYXNjYWRlJyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzdHJpY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuZHJvcENvbnN0cmFpbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXI6ICdyZXN0cmljdCcsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wcmltYXJ5LWtleS1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1ByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpLFxuICAgICAgICAgICAgbmFtZTogY29uc3RyYWludE5hbWUgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHsgLi4ubm9kZSwgLi4ucHJvcHMgfSk7XG4gICAgfSxcbn0pO1xuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgYSB0eXBvIGluIHRoZSBjb2RlYmFzZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZX0gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFByaW1hcnlDb25zdHJhaW50Tm9kZSA9IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWRkLWluZGV4LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZGRJbmRleE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FkZEluZGV4Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW5zKG5vZGUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgY29sdW1uczogWy4uLihub2RlLmNvbHVtbnMgfHwgW10pLCAuLi5jb2x1bW5zXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1hZGQtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZSwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGluZGV4IHVuaXF1ZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZEluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogICAudW5pcXVlKClcbiAgICAgKiAgIC5jb2x1bW4oJ2VtYWlsJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgdW5pcXVlIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9pbmRleGAgKGBlbWFpbGApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdW5pcXVlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgaW5kZXguXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB7QGxpbmsgY29sdW1uc30gZm9yIGFkZGluZyBtdWx0aXBsZSBjb2x1bW5zIGF0IG9uY2Ugb3Ige0BsaW5rIGV4cHJlc3Npb259XG4gICAgICogZm9yIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAuY29sdW1uKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgIC5jb2x1bW4oJ2FnZSBkZXNjJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgaW5kZXggYHBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhgIChgZmlyc3RfbmFtZWAsIGBhZ2VgIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZS5hZGRJbmRleCwgW1xuICAgICAgICAgICAgICAgICAgICBwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKGNvbHVtbiksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbn0gZm9yIGFkZGluZyBhIHNpbmdsZSBjb2x1bW4gb3Ige0BsaW5rIGV4cHJlc3Npb259IGZvclxuICAgICAqIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnYWdlIGRlc2MnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgaW5kZXggYHBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhgIChgZmlyc3RfbmFtZWAsIGBhZ2VgIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZEluZGV4OiBBZGRJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCBjb2x1bW5zLm1hcChwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbiBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfaW5kZXgnKVxuICAgICAqICAgLmV4cHJlc3Npb24oc3FsPGJvb2xlYW4+YChmaXJzdF9uYW1lIDwgJ1NhbWknKWApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgYWRkIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9pbmRleGAgKChmaXJzdF9uYW1lIDwgJ1NhbWknKSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBleHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkSW5kZXg6IEFkZEluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUuYWRkSW5kZXgsIFtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXNpbmcoaW5kZXhUeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZEluZGV4OiBBZGRJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuYWRkSW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgdXNpbmc6IFJhd05vZGUuY3JlYXRlV2l0aFNxbChpbmRleFR5cGUpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdW5pcXVlLWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBub3QgZGlzdGluY3RgIHRvIHRoZSB1bmlxdWUgY29uc3RyYWludCBkZWZpbml0aW9uXG4gICAgICpcbiAgICAgKiBTdXBwb3J0ZWQgYnkgUG9zdGdyZVNRTCBkaWFsZWN0IG9ubHlcbiAgICAgKi9cbiAgICBudWxsc05vdERpc3RpbmN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlcihVbmlxdWVDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBudWxsc05vdERpc3RpbmN0OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgZGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgZGVmZXJyYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBpbml0aWFsbHlJbW1lZGlhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcHJpbWFyeS1rZXktY29uc3RyYWludC1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIGRlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgbm90RGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIoUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5SW1tZWRpYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlcihQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgQ2hlY2tDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmVuYW1lLWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJlbmFtZUNvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZW5hbWVDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob2xkTmFtZSwgbmV3TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZW5hbWVDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBvbGROYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUob2xkTmFtZSksXG4gICAgICAgICAgICBuZXdOYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUobmV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLWluZGV4LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDcmVhdGVJbmRleE5vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLWluZGV4LW5vZGUuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJlZENvbHVtbk5hbWUsIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vcGx1Z2luL2ltbWVkaWF0ZS12YWx1ZS9pbW1lZGlhdGUtdmFsdWUtdHJhbnNmb3JtZXIuanMnO1xuZXhwb3J0IGNsYXNzIENyZWF0ZUluZGV4QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJpZiBub3QgZXhpc3RzXCIgbW9kaWZpZXIuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgaW5kZXggYWxyZWFkeSBleGlzdHMsIG5vIGVycm9yIGlzIHRocm93biBpZiB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICovXG4gICAgaWZOb3RFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZOb3RFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBpbmRleCB1bmlxdWUuXG4gICAgICovXG4gICAgdW5pcXVlKCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgbnVsbHMgbm90IGRpc3RpbmN0YCBzcGVjaWZpZXIgdG8gaW5kZXguXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNjaGVtYS5jcmVhdGVJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfaW5kZXgnKVxuICAgICAqICAub24oJ3BlcnNvbicpXG4gICAgICogIC5jb2x1bW4oJ2ZpcnN0X25hbWUnKVxuICAgICAqICAubnVsbHNOb3REaXN0aW5jdCgpXG4gICAgICogIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSBpbmRleCBcInBlcnNvbl9maXJzdF9uYW1lX2luZGV4XCJcbiAgICAgKiBvbiBcInRlc3RcIiAoXCJmaXJzdF9uYW1lXCIpXG4gICAgICogbnVsbHMgbm90IGRpc3RpbmN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG51bGxzTm90RGlzdGluY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB0YWJsZSBmb3IgdGhlIGluZGV4LlxuICAgICAqL1xuICAgIG9uKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgdGFibGU6IHBhcnNlVGFibGUodGFibGUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sdW1uIHRvIHRoZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHtAbGluayBjb2x1bW5zfSBmb3IgYWRkaW5nIG11bHRpcGxlIGNvbHVtbnMgYXQgb25jZSBvciB7QGxpbmsgZXhwcmVzc2lvbn1cbiAgICAgKiBmb3Igc3BlY2lmeWluZyBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgICAgICAgIC5jcmVhdGVJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAgICAgICAub24oJ3BlcnNvbicpXG4gICAgICogICAgICAgICAuY29sdW1uKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgICAgICAgIC5jb2x1bW4oJ2FnZSBkZXNjJylcbiAgICAgKiAgICAgICAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSBpbmRleCBcInBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhcIiBvbiBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJhZ2VcIiBkZXNjKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLCBbXG4gICAgICAgICAgICAgICAgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZShjb2x1bW4pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYSBsaXN0IG9mIGNvbHVtbnMgZm9yIHRoZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHtAbGluayBjb2x1bW59IGZvciBhZGRpbmcgYSBzaW5nbGUgY29sdW1uIG9yIHtAbGluayBleHByZXNzaW9ufSBmb3JcbiAgICAgKiBzcGVjaWZ5aW5nIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgICAgICAgLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4JylcbiAgICAgKiAgICAgICAgIC5vbigncGVyc29uJylcbiAgICAgKiAgICAgICAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdhZ2UgZGVzYyddKVxuICAgICAqICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleFwiIG9uIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImFnZVwiIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZSwgY29sdW1ucy5tYXAocGFyc2VPcmRlcmVkQ29sdW1uTmFtZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGFuIGFyYml0cmFyeSBleHByZXNzaW9uIGZvciB0aGUgaW5kZXguXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfaW5kZXgnKVxuICAgICAqICAgLm9uKCdwZXJzb24nKVxuICAgICAqICAgLmV4cHJlc3Npb24oc3FsYGZpcnN0X25hbWUgQ09MTEFURSBcImZpX0ZJXCJgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfaW5kZXhcIiBvbiBcInBlcnNvblwiIChmaXJzdF9uYW1lIENPTExBVEUgXCJmaV9GSVwiKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGV4cHJlc3Npb24oZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUsIFtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1c2luZyhpbmRleFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB1c2luZzogUmF3Tm9kZS5jcmVhdGVXaXRoU3FsKGluZGV4VHlwZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBuZXcgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lcigpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5ub2RlLCB0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncyksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbW1lZGlhdGUtdmFsdWUtdHJhbnNmb3JtZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS10cmFuc2Zvcm1lci5qcyc7XG5pbXBvcnQgeyBWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIGFsbCBWYWx1ZU5vZGVzIHRvIGltbWVkaWF0ZS5cbiAqXG4gKiBXQVJOSU5HISBUaGlzIHNob3VsZCBuZXZlciBiZSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLiBVc2VycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMuXG4gKiBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlci5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIgZXh0ZW5kcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICAgIHRyYW5zZm9ybVByaW1pdGl2ZVZhbHVlTGlzdChub2RlKSB7XG4gICAgICAgIHJldHVybiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZShub2RlLnZhbHVlcy5tYXAoVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSkpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1WYWx1ZShub2RlKSB7XG4gICAgICAgIHJldHVybiBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKG5vZGUudmFsdWUpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXNjaGVtYS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ3JlYXRlU2NoZW1hTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQ3JlYXRlU2NoZW1hQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgaWZOb3RFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVNjaGVtYU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaWZOb3RFeGlzdHM6IHRydWUgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXRhYmxlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVGFibGVOb2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb25CdWlsZGVyIH0gZnJvbSAnLi9jb2x1bW4tZGVmaW5pdGlvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGZyZWV6ZSwgbm9vcCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vZm9yZWlnbi1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9kYXRhLXR5cGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBVbmlxdWVDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3VuaXF1ZS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQ2hlY2tDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NoZWNrLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZU9uQ29tbWl0QWN0aW9uIH0gZnJvbSAnLi4vcGFyc2VyL29uLWNvbW1pdC1hY3Rpb24tcGFyc2UuanMnO1xuaW1wb3J0IHsgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyLCB9IGZyb20gJy4vdW5pcXVlLWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24gfSBmcm9tICcuLi9wYXJzZXIvZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IENoZWNrQ29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuLyoqXG4gKiBUaGlzIGJ1aWxkZXIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgYGNyZWF0ZSB0YWJsZWAgcXVlcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVhdGVUYWJsZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIFwidGVtcG9yYXJ5XCIgbW9kaWZpZXIuXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgdGFibGUuXG4gICAgICovXG4gICAgdGVtcG9yYXJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHRlbXBvcmFyeTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBcIm9uIGNvbW1pdFwiIHN0YXRlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0ZW1wb3JhcnkgdGFibGVzIG9uIHN1cHBvcnRlZCBkYXRhYmFzZXNcbiAgICAgKiBsaWtlIFBvc3RncmVTUUwuXG4gICAgICovXG4gICAgb25Db21taXQob25Db21taXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBvbkNvbW1pdDogcGFyc2VPbkNvbW1pdEFjdGlvbihvbkNvbW1pdCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIFwiaWYgbm90IGV4aXN0c1wiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogSWYgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RzLCBubyBlcnJvciBpcyB0aHJvd24gaWYgdGhpcyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLlxuICAgICAqL1xuICAgIGlmTm90RXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmTm90RXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sdW1uIHRvIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIChjb2wpID0+IGNvbC5hdXRvSW5jcmVtZW50KCkucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDUwKScsIChjb2wpID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcigyNTUpJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2JhbmtfYmFsYW5jZScsICdudW1lcmljKDgsIDIpJylcbiAgICAgKiAgIC8vIFlvdSBjYW4gc3BlY2lmeSBhbnkgZGF0YSB0eXBlIHVzaW5nIHRoZSBgc3FsYCB0YWcgaWYgdGhlIHR5cGVzXG4gICAgICogICAvLyBkb24ndCBpbmNsdWRlIGl0LlxuICAgICAqICAgLmFkZENvbHVtbignZGF0YScsIHNxbGBhbnlfdHlwZV9oZXJlYClcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ3BhcmVudF9pZCcsICdpbnRlZ2VyJywgKGNvbCkgPT5cbiAgICAgKiAgICAgY29sLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpLm9uRGVsZXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFdpdGggdGhpcyBtZXRob2QsIGl0J3Mgb25jZSBhZ2FpbiBnb29kIHRvIHJlbWVtYmVyIHRoYXQgS3lzZWx5IGp1c3QgYnVpbGRzIHRoZVxuICAgICAqIHF1ZXJ5IGFuZCBkb2Vzbid0IHByb3ZpZGUgdGhlIHNhbWUgQVBJIGZvciBhbGwgZGF0YWJhc2VzLiBGb3IgZXhhbXBsZSwgc29tZVxuICAgICAqIGRhdGFiYXNlcyBsaWtlIG9sZGVyIE15U1FMIGRvbid0IHN1cHBvcnQgdGhlIGByZWZlcmVuY2VzYCBzdGF0ZW1lbnQgaW4gdGhlXG4gICAgICogY29sdW1uIGRlZmluaXRpb24uIEluc3RlYWQgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgbmVlZCB0byBiZSBkZWZpbmVkIGluIHRoZVxuICAgICAqIGBjcmVhdGUgdGFibGVgIHF1ZXJ5LiBTZWUgdGhlIG5leHQgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgKGNvbCkgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ3BhcmVudF9pZCcsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5hZGRGb3JlaWduS2V5Q29uc3RyYWludChcbiAgICAgKiAgICAgJ3BlcnNvbl9wYXJlbnRfaWRfZmsnLFxuICAgICAqICAgICBbJ3BhcmVudF9pZCddLFxuICAgICAqICAgICAncGVyc29uJyxcbiAgICAgKiAgICAgWydpZCddLFxuICAgICAqICAgICAoY2IpID0+IGNiLm9uRGVsZXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFub3RoZXIgZ29vZCBleGFtcGxlIGlzIHRoYXQgUG9zdGdyZVNRTCBkb2Vzbid0IHN1cHBvcnQgdGhlIGBhdXRvX2luY3JlbWVudGBcbiAgICAgKiBrZXl3b3JkIGFuZCB5b3UgbmVlZCB0byBkZWZpbmUgYW4gYXV0b2luY3JlbWVudGluZyBjb2x1bW4gZm9yIGV4YW1wbGUgdXNpbmdcbiAgICAgKiBgc2VyaWFsYDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdzZXJpYWwnLCAoY29sKSA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZENvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uKHRoaXMuI3Byb3BzLm5vZGUsIGNvbHVtbkJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHByaW1hcnkga2V5IGNvbnN0cmFpbnQgZm9yIG9uZSBvciBtb3JlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RyYWludCBuYW1lIGNhbiBiZSBhbnl0aGluZyB5b3Ugd2FudCwgYnV0IGl0IG11c3QgYmUgdW5pcXVlXG4gICAgICogYWNyb3NzIHRoZSB3aG9sZSBkYXRhYmFzZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig2NCknKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRQcmltYXJ5S2V5Q29uc3RyYWludCgncHJpbWFyeV9rZXknLCBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYWRkUHJpbWFyeUtleUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIoUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoQ29uc3RyYWludCh0aGlzLiNwcm9wcy5ub2RlLCBjb25zdHJhaW50QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdW5pcXVlIGNvbnN0cmFpbnQgZm9yIG9uZSBvciBtb3JlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RyYWludCBuYW1lIGNhbiBiZSBhbnl0aGluZyB5b3Ugd2FudCwgYnV0IGl0IG11c3QgYmUgdW5pcXVlXG4gICAgICogYWNyb3NzIHRoZSB3aG9sZSBkYXRhYmFzZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig2NCknKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRVbmlxdWVDb25zdHJhaW50KFxuICAgICAqICAgICAnZmlyc3RfbmFtZV9sYXN0X25hbWVfdW5pcXVlJyxcbiAgICAgKiAgICAgWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiBkaWFsZWN0cyBzdWNoIGFzIFBvc3RncmVTUUwgeW91IGNhbiBzcGVjaWZ5IGBudWxscyBub3QgZGlzdGluY3RgIGFzIGZvbGxvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcig2NCknKVxuICAgICAqICAgLmFkZFVuaXF1ZUNvbnN0cmFpbnQoXG4gICAgICogICAgICdmaXJzdF9uYW1lX2xhc3RfbmFtZV91bmlxdWUnLFxuICAgICAqICAgICBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJ10sXG4gICAgICogICAgIChjYikgPT4gY2IubnVsbHNOb3REaXN0aW5jdCgpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYWRkVW5pcXVlQ29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY29sdW1ucywgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyID0gYnVpbGQobmV3IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlcihVbmlxdWVDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aENvbnN0cmFpbnQodGhpcy4jcHJvcHMubm9kZSwgdW5pcXVlQ29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNoZWNrIGNvbnN0cmFpbnQuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RyYWludCBuYW1lIGNhbiBiZSBhbnl0aGluZyB5b3Ugd2FudCwgYnV0IGl0IG11c3QgYmUgdW5pcXVlXG4gICAgICogYWNyb3NzIHRoZSB3aG9sZSBkYXRhYmFzZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdhbmltYWwnKVxuICAgICAqICAgLmFkZENvbHVtbignbnVtYmVyX29mX2xlZ3MnLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkQ2hlY2tDb25zdHJhaW50KCdjaGVja19sZWdzJywgc3FsYG51bWJlcl9vZl9sZWdzIDwgNWApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYWRkQ2hlY2tDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjaGVja0V4cHJlc3Npb24sIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBDaGVja0NvbnN0cmFpbnRCdWlsZGVyKENoZWNrQ29uc3RyYWludE5vZGUuY3JlYXRlKGNoZWNrRXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSwgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aENvbnN0cmFpbnQodGhpcy4jcHJvcHMubm9kZSwgY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RyYWludCBuYW1lIGNhbiBiZSBhbnl0aGluZyB5b3Ugd2FudCwgYnV0IGl0IG11c3QgYmUgdW5pcXVlXG4gICAgICogYWNyb3NzIHRoZSB3aG9sZSBkYXRhYmFzZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ293bmVyX2lkJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50KFxuICAgICAqICAgICAnb3duZXJfaWRfZm9yZWlnbicsXG4gICAgICogICAgIFsnb3duZXJfaWQnXSxcbiAgICAgKiAgICAgJ3BlcnNvbicsXG4gICAgICogICAgIFsnaWQnXSxcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFkZCBjb25zdHJhaW50IGZvciBtdWx0aXBsZSBjb2x1bW5zOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ293bmVyX2lkMScsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ293bmVyX2lkMicsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5hZGRGb3JlaWduS2V5Q29uc3RyYWludChcbiAgICAgKiAgICAgJ293bmVyX2lkX2ZvcmVpZ24nLFxuICAgICAqICAgICBbJ293bmVyX2lkMScsICdvd25lcl9pZDInXSxcbiAgICAgKiAgICAgJ3BlcnNvbicsXG4gICAgICogICAgIFsnaWQxJywgJ2lkMiddLFxuICAgICAqICAgICAoY2IpID0+IGNiLm9uRGVsZXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhZGRGb3JlaWduS2V5Q29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY29sdW1ucywgdGFyZ2V0VGFibGUsIHRhcmdldENvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYnVpbGQobmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMubWFwKENvbHVtbk5vZGUuY3JlYXRlKSwgcGFyc2VUYWJsZSh0YXJnZXRUYWJsZSksIHRhcmdldENvbHVtbnMubWFwKENvbHVtbk5vZGUuY3JlYXRlKSwgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aENvbnN0cmFpbnQodGhpcy4jcHJvcHMubm9kZSwgYnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGZyb250IG9mIHRoZSBxdWVyeSBfX2FmdGVyX18gdGhlIGBjcmVhdGVgIGtleXdvcmQuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB7QGxpbmsgdGVtcG9yYXJ5fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5tb2RpZnlGcm9udChzcWxgZ2xvYmFsIHRlbXBvcmFyeWApXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcig2NCknLCBjb2wgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3Jlcyk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgZ2xvYmFsIHRlbXBvcmFyeSB0YWJsZSBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiaWRcIiBpbnRlZ2VyIHByaW1hcnkga2V5LFxuICAgICAqICAgXCJmaXJzdF9uYW1lXCIgdmFyY2hhcig2NCkgbm90IG51bGwsXG4gICAgICogICBcImxhc3RfbmFtZVwiIHZhcmNoYXIoNjQpIG5vdCBudWxsXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUZyb250KG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aEZyb250TW9kaWZpZXIodGhpcy4jcHJvcHMubm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIG9uQ29tbWl0fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig2NCknLCBjb2wgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDY0KScsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLm1vZGlmeUVuZChzcWxgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2lgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgaWRgIGludGVnZXIgcHJpbWFyeSBrZXksXG4gICAgICogICBgZmlyc3RfbmFtZWAgdmFyY2hhcig2NCkgbm90IG51bGwsXG4gICAgICogICBgbGFzdF9uYW1lYCB2YXJjaGFyKDY0KSBub3QgbnVsbFxuICAgICAqICkgY29sbGF0ZSB1dGY4X3VuaWNvZGVfY2lcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMubm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3dzIHRvIGNyZWF0ZSB0YWJsZSBmcm9tIGBzZWxlY3RgIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdjb3B5JylcbiAgICAgKiAgIC50ZW1wb3JhcnkoKVxuICAgICAqICAgLmFzKGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdChbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJ10pKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRlbXBvcmFyeSB0YWJsZSBcImNvcHlcIiBhc1xuICAgICAqIHNlbGVjdCBcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhcyhleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgc2VsZWN0UXVlcnk6IHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIGdpdmVuIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCd0ZXN0JylcbiAgICAgKiAgIC4kY2FsbCgoYnVpbGRlcikgPT4gYnVpbGRlci5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBjcmVhdGluZyByZXVzYWJsZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggYSBidWlsZGVyLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyB0eXBlIENyZWF0ZVRhYmxlQnVpbGRlciwgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgYWRkRGVmYXVsdENvbHVtbnMgPSAoY3RiOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgICogICByZXR1cm4gY3RiXG4gICAgICogICAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCAoY29sKSA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgICAuYWRkQ29sdW1uKCdjcmVhdGVkX2F0JywgJ2RhdGUnLCAoY29sKSA9PlxuICAgICAqICAgICAgIGNvbC5ub3ROdWxsKCkuZGVmYXVsdFRvKHNxbGBub3coKWApXG4gICAgICogICAgIClcbiAgICAgKiAgICAgLmFkZENvbHVtbigndXBkYXRlZF9hdCcsICdkYXRlJywgKGNvbCkgPT5cbiAgICAgKiAgICAgICBjb2wubm90TnVsbCgpLmRlZmF1bHRUbyhzcWxgbm93KClgKVxuICAgICAqICAgICApXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3Rlc3QnKVxuICAgICAqICAgLiRjYWxsKGFkZERlZmF1bHRDb2x1bW5zKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tY29tbWl0LWFjdGlvbi1wYXJzZS5kLnRzXCIgLz5cbmltcG9ydCB7IE9OX0NPTU1JVF9BQ1RJT05TLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS10YWJsZS1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9uQ29tbWl0QWN0aW9uKGFjdGlvbikge1xuICAgIGlmIChPTl9DT01NSVRfQUNUSU9OUy5pbmNsdWRlcyhhY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBPbkNvbW1pdEFjdGlvbiAke2FjdGlvbn1gKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1pbmRleC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgRHJvcEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtaW5kZXgtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgRHJvcEluZGV4QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB0YWJsZSB0aGUgaW5kZXggd2FzIGNyZWF0ZWQgZm9yLiBUaGlzIGlzIG5vdCBuZWVkZWRcbiAgICAgKiBpbiBhbGwgZGlhbGVjdHMuXG4gICAgICovXG4gICAgb24odGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcEluZGV4Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHRhYmxlOiBwYXJzZVRhYmxlKHRhYmxlKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWZFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZkV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2FzY2FkZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcEluZGV4Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNhc2NhZGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXNjaGVtYS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgRHJvcFNjaGVtYU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXNjaGVtYS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEcm9wU2NoZW1hQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgaWZFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFNjaGVtYUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wU2NoZW1hTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNjYWRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BTY2hlbWFCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFNjaGVtYU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC10YWJsZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgRHJvcFRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgRHJvcFRhYmxlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgaWZFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZkV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2FzY2FkZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFRhYmxlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNhc2NhZGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtdmlldy1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdmlldy1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlQ29sdW1uTmFtZSB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IEltbWVkaWF0ZVZhbHVlUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2luL2ltbWVkaWF0ZS12YWx1ZS9pbW1lZGlhdGUtdmFsdWUtcGx1Z2luLmpzJztcbmV4cG9ydCBjbGFzcyBDcmVhdGVWaWV3QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJ0ZW1wb3JhcnlcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSB2aWV3LlxuICAgICAqL1xuICAgIHRlbXBvcmFyeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgdGVtcG9yYXJ5OiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXRlcmlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT25seSBpbXBsZW1lbnRlZCBvbiBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLiBPbiBtb3N0IGRpYWxlY3RzLCB1c2Uge0BsaW5rIG9yUmVwbGFjZX0uXG4gICAgICovXG4gICAgaWZOb3RFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmTm90RXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvclJlcGxhY2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG9yUmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMubWFwKHBhcnNlQ29sdW1uTmFtZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNlbGVjdCBxdWVyeSBvciBhIGB2YWx1ZXNgIHN0YXRlbWVudCB0aGF0IGNyZWF0ZXMgdGhlIHZpZXcuXG4gICAgICpcbiAgICAgKiBXQVJOSU5HIVxuICAgICAqIFNvbWUgZGlhbGVjdHMgZG9uJ3Qgc3VwcG9ydCBwYXJhbWV0ZXJpemVkIHF1ZXJpZXMgaW4gRERMIHN0YXRlbWVudHMgYW5kIHRoZXJlZm9yZVxuICAgICAqIHRoZSBxdWVyeSBvciByYXcge0BsaW5rIHNxbCB9IGV4cHJlc3Npb24gcGFzc2VkIGhlcmUgaXMgaW50ZXJwb2xhdGVkIGludG8gYSBzaW5nbGVcbiAgICAgKiBzdHJpbmcgb3BlbmluZyBhbiBTUUwgaW5qZWN0aW9uIHZ1bG5lcmFiaWxpdHkuIERPIE5PVCBwYXNzIHVuY2hlY2tlZCB1c2VyIGlucHV0XG4gICAgICogaW50byB0aGUgcXVlcnkgb3IgcmF3IGV4cHJlc3Npb24gcGFzc2VkIHRvIHRoaXMgbWV0aG9kIVxuICAgICAqL1xuICAgIGFzKHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5Tm9kZSA9IHF1ZXJ5XG4gICAgICAgICAgICAud2l0aFBsdWdpbihuZXcgSW1tZWRpYXRlVmFsdWVQbHVnaW4oKSlcbiAgICAgICAgICAgIC50b09wZXJhdGlvbk5vZGUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYXM6IHF1ZXJ5Tm9kZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS12aWV3LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ3JlYXRlVmlld05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NyZWF0ZVZpZXdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoY3JlYXRlVmlldywgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVmlldyxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbW1lZGlhdGUtdmFsdWUtcGx1Z2luLmQudHNcIiAvPlxuaW1wb3J0IHsgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciB9IGZyb20gJy4vaW1tZWRpYXRlLXZhbHVlLXRyYW5zZm9ybWVyLmpzJztcbi8qKlxuICogVHJhbnNmb3JtcyBhbGwgVmFsdWVOb2RlcyB0byBpbW1lZGlhdGUuXG4gKlxuICogV0FSTklORyEgVGhpcyBzaG91bGQgbmV2ZXIgYmUgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gVXNlcnMgc2hvdWxkIG5ldmVyIHVzZSB0aGlzLlxuICogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWxwZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBJbW1lZGlhdGVWYWx1ZVBsdWdpbiB7XG4gICAgI3RyYW5zZm9ybWVyID0gbmV3IEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIoKTtcbiAgICB0cmFuc2Zvcm1RdWVyeShhcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKGFyZ3Mubm9kZSwgYXJncy5xdWVyeUlkKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVzdWx0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcmdzLnJlc3VsdCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXZpZXctYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IERyb3BWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3Atdmlldy1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBEcm9wVmlld0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIG1hdGVyaWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNjYWRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNhc2NhZGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXZpZXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEcm9wVmlld05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BWaWV3Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wVmlldywgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZHJvcFZpZXcsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXR5cGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENyZWF0ZVR5cGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgQ3JlYXRlVHlwZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFudW0gdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zY2hlbWEuY3JlYXRlVHlwZSgnc3BlY2llcycpLmFzRW51bShbJ2NhdCcsICdkb2cnLCAnZnJvZyddKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzRW51bSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUeXBlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVR5cGVOb2RlLmNsb25lV2l0aEVudW0odGhpcy4jcHJvcHMubm9kZSwgdmFsdWVzKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi92YWx1ZS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVUeXBlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVHlwZU5vZGUnLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFbnVtKGNyZWF0ZVR5cGUsIHZhbHVlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVR5cGUsXG4gICAgICAgICAgICBlbnVtOiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZSh2YWx1ZXMubWFwKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXR5cGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BUeXBlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtdHlwZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEcm9wVHlwZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUeXBlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BUeXBlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFR5cGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFR5cGVOb2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BUeXBlLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wVHlwZSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pZGVudGlmaWVyLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTY2hlbWFibGVJZGVudGlmaWVyKGlkKSB7XG4gICAgY29uc3QgU0NIRU1BX1NFUEFSQVRPUiA9ICcuJztcbiAgICBpZiAoaWQuaW5jbHVkZXMoU0NIRU1BX1NFUEFSQVRPUikpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBpZC5zcGxpdChTQ0hFTUFfU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGVXaXRoU2NoZW1hKHBhcnRzWzBdLCBwYXJ0c1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgc2NoZW1hYmxlIGlkZW50aWZpZXIgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZShpZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIFwiY29uY3VycmVudGx5XCIgbW9kaWZpZXIuXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byByZWZyZXNoIHRoZSB2aWV3IHdpdGhvdXQgbG9ja2luZyBvdXQgY29uY3VycmVudCBzZWxlY3RzIG9uIHRoZSBtYXRlcmlhbGl6ZWQgdmlldy5cbiAgICAgKlxuICAgICAqIFdBUk5JTkchXG4gICAgICogVGhpcyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoZSBcIndpdGggbm8gZGF0YVwiIG1vZGlmaWVyLlxuICAgICAqL1xuICAgIGNvbmN1cnJlbnRseSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBjb25jdXJyZW50bHk6IHRydWUsXG4gICAgICAgICAgICAgICAgd2l0aE5vRGF0YTogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIFwid2l0aCBkYXRhXCIgbW9kaWZpZXIuXG4gICAgICpcbiAgICAgKiBJZiBzcGVjaWZpZWQgKG9yIGRlZmF1bHRzKSB0aGUgYmFja2luZyBxdWVyeSBpcyBleGVjdXRlZCB0byBwcm92aWRlIHRoZSBuZXcgZGF0YSwgYW5kIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyBpcyBsZWZ0IGluIGEgc2Nhbm5hYmxlIHN0YXRlXG4gICAgICovXG4gICAgd2l0aERhdGEoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgd2l0aE5vRGF0YTogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIFwid2l0aCBubyBkYXRhXCIgbW9kaWZpZXIuXG4gICAgICpcbiAgICAgKiBJZiBzcGVjaWZpZWQsIG5vIG5ldyBkYXRhIGlzIGdlbmVyYXRlZCBhbmQgdGhlIG1hdGVyaWFsaXplZCB2aWV3IGlzIGxlZnQgaW4gYW4gdW5zY2FubmFibGUgc3RhdGUuXG4gICAgICpcbiAgICAgKiBXQVJOSU5HIVxuICAgICAqIFRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGUgXCJjb25jdXJyZW50bHlcIiBtb2RpZmllci5cbiAgICAgKi9cbiAgICB3aXRoTm9EYXRhKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHdpdGhOb0RhdGE6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uY3VycmVudGx5OiBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVWaWV3LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2R5bmFtaWMuZC50c1wiIC8+XG5pbXBvcnQgeyBEeW5hbWljUmVmZXJlbmNlQnVpbGRlciB9IGZyb20gJy4vZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEeW5hbWljVGFibGVCdWlsZGVyIH0gZnJvbSAnLi9keW5hbWljLXRhYmxlLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNNb2R1bGUge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkeW5hbWljIHJlZmVyZW5jZSB0byBhIGNvbHVtbiB0aGF0IGlzIG5vdCBrbm93IGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKlxuICAgICAqIEt5c2VseSBpcyBidWlsdCBpbiBhIHdheSB0aGF0IGJ5IGRlZmF1bHQgeW91IGNhbid0IHJlZmVyIHRvIHRhYmxlcyBvciBjb2x1bW5zXG4gICAgICogdGhhdCBhcmUgbm90IGFjdHVhbGx5IHZpc2libGUgaW4gdGhlIGN1cnJlbnQgcXVlcnkgYW5kIGNvbnRleHQuIFRoaXMgaXMgYWxsXG4gICAgICogZG9uZSBieSBUeXBlU2NyaXB0IGF0IGNvbXBpbGUgdGltZSwgd2hpY2ggbWVhbnMgdGhhdCB5b3UgbmVlZCB0byBrbm93IHRoZVxuICAgICAqIGNvbHVtbnMgYW5kIHRhYmxlcyBhdCBjb21waWxlIHRpbWUuIFRoaXMgaXMgbm90IGFsd2F5cyB0aGUgY2FzZSBvZiBjb3Vyc2UuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIGluIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBjb2x1bW4gbmFtZXNcbiAgICAgKiBjb21lIGZyb20gdGhlIHVzZXIgaW5wdXQgb3IgYXJlIG5vdCBvdGhlcndpc2Uga25vd24gYXQgY29tcGlsZSB0aW1lLlxuICAgICAqXG4gICAgICogV0FSTklORyEgVW5saWtlIHZhbHVlcywgY29sdW1uIG5hbWVzIGFyZSBub3QgZXNjYXBlZCBieSB0aGUgZGF0YWJhc2UgZW5naW5lXG4gICAgICogb3IgS3lzZWx5IGFuZCBpZiB5b3UgcGFzcyBpbiB1bmNoZWNrZWQgY29sdW1uIG5hbWVzIHVzaW5nIHRoaXMgbWV0aG9kLCB5b3VcbiAgICAgKiBjcmVhdGUgYW4gU1FMIGluamVjdGlvbiB2dWxuZXJhYmlsaXR5LiBBbHdheXMgX19hbHdheXNfXyB2YWxpZGF0ZSB0aGUgdXNlclxuICAgICAqIGlucHV0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogVGhlcmUgYXJlIGNvdXBsZSBvZiBleGFtcGxlcyBiZWxvdyBmb3Igc29tZSB1c2UgY2FzZXMsIGJ1dCB5b3UgY2FuIHBhc3NcbiAgICAgKiBgcmVmYCB0byBvdGhlciBtZXRob2RzIGFzIHdlbGwuIElmIHRoZSB0eXBlcyBhbGxvdyB5b3UgdG8gcGFzcyBhIGByZWZgXG4gICAgICogdmFsdWUgdG8gc29tZSBwbGFjZSwgaXQgc2hvdWxkIHdvcmsuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIEZpbHRlciBieSBhIGNvbHVtbiBub3Qga25vdyBhdCBjb21waWxlIHRpbWU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHNvbWVRdWVyeShmaWx0ZXJDb2x1bW46IHN0cmluZywgZmlsdGVyVmFsdWU6IHN0cmluZykge1xuICAgICAqICAgY29uc3QgeyByZWYgfSA9IGRiLmR5bmFtaWNcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAuc2VsZWN0QWxsKClcbiAgICAgKiAgICAgLndoZXJlKHJlZihmaWx0ZXJDb2x1bW4pLCAnPScsIGZpbHRlclZhbHVlKVxuICAgICAqICAgICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogc29tZVF1ZXJ5KCdmaXJzdF9uYW1lJywgJ0Fybm9sZCcpXG4gICAgICogc29tZVF1ZXJ5KCdwZXJzb24ubGFzdF9uYW1lJywgJ0FuaXN0b24nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogT3JkZXIgYnkgYSBjb2x1bW4gbm90IGtub3cgYXQgY29tcGlsZSB0aW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBzb21lUXVlcnkob3JkZXJCeTogc3RyaW5nKSB7XG4gICAgICogICBjb25zdCB7IHJlZiB9ID0gZGIuZHluYW1pY1xuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgIC5zZWxlY3QoJ3BlcnNvbi5maXJzdF9uYW1lIGFzIGZuJylcbiAgICAgKiAgICAgLm9yZGVyQnkocmVmKG9yZGVyQnkpKVxuICAgICAqICAgICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogc29tZVF1ZXJ5KCdmbicpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGlzIGV4YW1wbGUgd2UgYWRkIHNlbGVjdGlvbnMgZHluYW1pY2FsbHk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHsgcmVmIH0gPSBkYi5keW5hbWljXG4gICAgICpcbiAgICAgKiAvLyBTb21lIGNvbHVtbiBuYW1lIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBWYWx1ZSBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLlxuICAgICAqIGNvbnN0IGNvbHVtbkZyb21Vc2VySW5wdXQ6IFBvc3NpYmxlQ29sdW1ucyA9ICdiaXJ0aGRhdGUnO1xuICAgICAqXG4gICAgICogLy8gQSB0eXBlIHRoYXQgbGlzdHMgYWxsIHBvc3NpYmxlIHZhbHVlcyBgY29sdW1uRnJvbVVzZXJJbnB1dGAgY2FuIGhhdmUuXG4gICAgICogLy8gWW91IGNhbiB1c2UgYGtleW9mIFBlcnNvbmAgaWYgYW55IGNvbHVtbiBvZiBhbiBpbnRlcmZhY2UgaXMgYWxsb3dlZC5cbiAgICAgKiB0eXBlIFBvc3NpYmxlQ29sdW1ucyA9ICdsYXN0X25hbWUnIHwgJ2ZpcnN0X25hbWUnIHwgJ2JpcnRoZGF0ZSdcbiAgICAgKlxuICAgICAqIGNvbnN0IFtwZXJzb25dID0gYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoW1xuICAgICAqICAgICByZWY8UG9zc2libGVDb2x1bW5zPihjb2x1bW5Gcm9tVXNlcklucHV0KSxcbiAgICAgKiAgICAgJ2lkJ1xuICAgICAqICAgXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIC8vIFRoZSByZXN1bHRpbmcgdHlwZSBjb250YWlucyBhbGwgYFBvc3NpYmxlQ29sdW1uc2AgYXMgb3B0aW9uYWwgZmllbGRzXG4gICAgICogLy8gYmVjYXVzZSB3ZSBjYW5ub3Qga25vdyB3aGljaCBmaWVsZCB3YXMgYWN0dWFsbHkgc2VsZWN0ZWQgYmVmb3JlXG4gICAgICogLy8gcnVubmluZyB0aGUgY29kZS5cbiAgICAgKiBjb25zdCBsYXN0TmFtZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IHBlcnNvbj8ubGFzdF9uYW1lXG4gICAgICogY29uc3QgZmlyc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwZXJzb24/LmZpcnN0X25hbWVcbiAgICAgKiBjb25zdCBiaXJ0aERhdGU6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkID0gcGVyc29uPy5iaXJ0aGRhdGVcbiAgICAgKlxuICAgICAqIC8vIFRoZSByZXN1bHQgdHlwZSBhbHNvIGNvbnRhaW5zIHRoZSBjb21waWxlIHRpbWUgc2VsZWN0aW9uIGBpZGAuXG4gICAgICogcGVyc29uPy5pZFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlZihyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljUmVmZXJlbmNlQnVpbGRlcihyZWZlcmVuY2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGFibGUgcmVmZXJlbmNlIHRvIGEgdGFibGUgdGhhdCdzIG5vdCBmdWxseSBrbm93biBhdCBjb21waWxlIHRpbWUuXG4gICAgICpcbiAgICAgKiBUaGUgdHlwZSBgVGAgaXMgYWxsb3dlZCB0byBiZSBhIHVuaW9uIG9mIG11bHRpcGxlIHRhYmxlcy5cbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJzZWxlY3RcIiwgXCJHZW5lcmljIGZpbmQgcXVlcnlcIiwgMTMwKSAtLT5cbiAgICAgKlxuICAgICAqIEEgZ2VuZXJpYyB0eXBlLXNhZmUgaGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kaW5nIGEgcm93IGJ5IGEgY29sdW1uIHZhbHVlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBTZWxlY3RUeXBlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBnZXRSb3dCeUNvbHVtbjxcbiAgICAgKiAgIFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSxcbiAgICAgKiAgIEMgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZVtUXSAmIHN0cmluZyxcbiAgICAgKiAgIFYgZXh0ZW5kcyBTZWxlY3RUeXBlPERhdGFiYXNlW1RdW0NdPixcbiAgICAgKiA+KHQ6IFQsIGM6IEMsIHY6IFYpIHtcbiAgICAgKiAgIC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBkeW5hbWljIG1vZHVsZSBzaW5jZSB0aGUgdGFibGUgbmFtZVxuICAgICAqICAgLy8gaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKiAgIGNvbnN0IHsgdGFibGUsIHJlZiB9ID0gZGIuZHluYW1pY1xuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20odGFibGUodCkuYXMoJ3QnKSlcbiAgICAgKiAgICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAgIC53aGVyZShyZWYoYyksICc9JywgdilcbiAgICAgKiAgICAgLm9yZGVyQnkoJ3QuaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGdldFJvd0J5Q29sdW1uKCdwZXJzb24nLCAnZmlyc3RfbmFtZScsICdBcm5vbGQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHluYW1pY1RhYmxlQnVpbGRlcih0YWJsZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LWNvbm5lY3Rpb24tcHJvdmlkZXIuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciB7XG4gICAgI2RyaXZlcjtcbiAgICBjb25zdHJ1Y3Rvcihkcml2ZXIpIHtcbiAgICAgICAgdGhpcy4jZHJpdmVyID0gZHJpdmVyO1xuICAgIH1cbiAgICBhc3luYyBwcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcikge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy4jZHJpdmVyLmFjcXVpcmVDb25uZWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY29uc3VtZXIoY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkcml2ZXIucmVsZWFzZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtcXVlcnktZXhlY3V0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBRdWVyeUV4ZWN1dG9yQmFzZSB9IGZyb20gJy4vcXVlcnktZXhlY3V0b3ItYmFzZS5qcyc7XG5leHBvcnQgY2xhc3MgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IgZXh0ZW5kcyBRdWVyeUV4ZWN1dG9yQmFzZSB7XG4gICAgI2NvbXBpbGVyO1xuICAgICNhZGFwdGVyO1xuICAgICNjb25uZWN0aW9uUHJvdmlkZXI7XG4gICAgY29uc3RydWN0b3IoY29tcGlsZXIsIGFkYXB0ZXIsIGNvbm5lY3Rpb25Qcm92aWRlciwgcGx1Z2lucyA9IFtdKSB7XG4gICAgICAgIHN1cGVyKHBsdWdpbnMpO1xuICAgICAgICB0aGlzLiNjb21waWxlciA9IGNvbXBpbGVyO1xuICAgICAgICB0aGlzLiNhZGFwdGVyID0gYWRhcHRlcjtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyID0gY29ubmVjdGlvblByb3ZpZGVyO1xuICAgIH1cbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FkYXB0ZXI7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb21waWxlci5jb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIucHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IodGhpcy4jY29tcGlsZXIsIHRoaXMuI2FkYXB0ZXIsIHRoaXMuI2Nvbm5lY3Rpb25Qcm92aWRlciwgWy4uLnRoaXMucGx1Z2lucywgLi4ucGx1Z2luc10pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRRdWVyeUV4ZWN1dG9yKHRoaXMuI2NvbXBpbGVyLCB0aGlzLiNhZGFwdGVyLCB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIsIFsuLi50aGlzLnBsdWdpbnMsIHBsdWdpbl0pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luQXRGcm9udChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyLCBbcGx1Z2luLCAuLi50aGlzLnBsdWdpbnNdKTtcbiAgICB9XG4gICAgd2l0aENvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgY29ubmVjdGlvblByb3ZpZGVyLCBbLi4udGhpcy5wbHVnaW5zXSk7XG4gICAgfVxuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRRdWVyeUV4ZWN1dG9yKHRoaXMuI2NvbXBpbGVyLCB0aGlzLiNhZGFwdGVyLCB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIsIFtdKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3J1bnRpbWUtZHJpdmVyLmQudHNcIiAvPlxuaW1wb3J0IHsgcGVyZm9ybWFuY2VOb3cgfSBmcm9tICcuLi91dGlsL3BlcmZvcm1hbmNlLW5vdy5qcyc7XG4vKipcbiAqIEEgc21hbGwgd3JhcHBlciBhcm91bmQge0BsaW5rIERyaXZlcn0gdGhhdCBtYWtlcyBzdXJlIHRoZSBkcml2ZXIgaXNcbiAqIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyB1c2VkLCBvbmx5IGluaXRpYWxpemVkIGFuZCBkZXN0cm95ZWRcbiAqIG9uY2UgZXRjLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZURyaXZlciB7XG4gICAgI2RyaXZlcjtcbiAgICAjbG9nO1xuICAgICNpbml0UHJvbWlzZTtcbiAgICAjaW5pdERvbmU7XG4gICAgI2Rlc3Ryb3lQcm9taXNlO1xuICAgICNjb25uZWN0aW9ucyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgY29uc3RydWN0b3IoZHJpdmVyLCBsb2cpIHtcbiAgICAgICAgdGhpcy4jaW5pdERvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jZHJpdmVyID0gZHJpdmVyO1xuICAgICAgICB0aGlzLiNsb2cgPSBsb2c7XG4gICAgfVxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkZXN0cm95UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkcml2ZXIgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2luaXRQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNpbml0UHJvbWlzZSA9IHRoaXMuI2RyaXZlclxuICAgICAgICAgICAgICAgIC5pbml0KClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaW5pdERvbmUgPSB0cnVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2luaXRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy4jaW5pdFByb21pc2U7XG4gICAgfVxuICAgIGFzeW5jIGFjcXVpcmVDb25uZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy4jZGVzdHJveVByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZHJpdmVyIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLiNpbml0RG9uZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuI2RyaXZlci5hY3F1aXJlQ29ubmVjdGlvbigpO1xuICAgICAgICBpZiAoIXRoaXMuI2Nvbm5lY3Rpb25zLmhhcyhjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI25lZWRzTG9nZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jYWRkTG9nZ2luZyhjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2Nvbm5lY3Rpb25zLmFkZChjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgcmVsZWFzZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICBhd2FpdCB0aGlzLiNkcml2ZXIucmVsZWFzZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfVxuICAgIGJlZ2luVHJhbnNhY3Rpb24oY29ubmVjdGlvbiwgc2V0dGluZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RyaXZlci5iZWdpblRyYW5zYWN0aW9uKGNvbm5lY3Rpb24sIHNldHRpbmdzKTtcbiAgICB9XG4gICAgY29tbWl0VHJhbnNhY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLmNvbW1pdFRyYW5zYWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH1cbiAgICByb2xsYmFja1RyYW5zYWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RyaXZlci5yb2xsYmFja1RyYW5zYWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH1cbiAgICBzYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KSB7XG4gICAgICAgIGlmICh0aGlzLiNkcml2ZXIuc2F2ZXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnNhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBzYXZlcG9pbnRgIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyJyk7XG4gICAgfVxuICAgIHJvbGxiYWNrVG9TYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KSB7XG4gICAgICAgIGlmICh0aGlzLiNkcml2ZXIucm9sbGJhY2tUb1NhdmVwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2RyaXZlci5yb2xsYmFja1RvU2F2ZXBvaW50KGNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIGNvbXBpbGVRdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHJvbGxiYWNrVG9TYXZlcG9pbnRgIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyJyk7XG4gICAgfVxuICAgIHJlbGVhc2VTYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KSB7XG4gICAgICAgIGlmICh0aGlzLiNkcml2ZXIucmVsZWFzZVNhdmVwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2RyaXZlci5yZWxlYXNlU2F2ZXBvaW50KGNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIGNvbXBpbGVRdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHJlbGVhc2VTYXZlcG9pbnRgIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyJyk7XG4gICAgfVxuICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy4jaW5pdFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNpbml0UHJvbWlzZTtcbiAgICAgICAgaWYgKCF0aGlzLiNkZXN0cm95UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy4jZGVzdHJveVByb21pc2UgPSB0aGlzLiNkcml2ZXIuZGVzdHJveSgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkZXN0cm95UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Rlc3Ryb3lQcm9taXNlO1xuICAgIH1cbiAgICAjbmVlZHNMb2dnaW5nKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI2xvZy5pc0xldmVsRW5hYmxlZCgncXVlcnknKSB8fCB0aGlzLiNsb2cuaXNMZXZlbEVuYWJsZWQoJ2Vycm9yJykpO1xuICAgIH1cbiAgICAvLyBUaGlzIG1ldGhvZCBtb25rZXkgcGF0Y2hlcyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbidzIGV4ZWN1dGVRdWVyeSBtZXRob2RcbiAgICAvLyBieSBhZGRpbmcgbG9nZ2luZyBjb2RlIGFyb3VuZCBpdC4gTW9ua2V5IHBhdGNoaW5nIGlzIG5vdCBwcmV0dHksIGJ1dCBpdCdzXG4gICAgLy8gdGhlIGJlc3Qgb3B0aW9uIGluIHRoaXMgY2FzZS5cbiAgICAjYWRkTG9nZ2luZyhjb25uZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGVRdWVyeSA9IGNvbm5lY3Rpb24uZXhlY3V0ZVF1ZXJ5O1xuICAgICAgICBjb25zdCBzdHJlYW1RdWVyeSA9IGNvbm5lY3Rpb24uc3RyZWFtUXVlcnk7XG4gICAgICAgIGNvbnN0IGRpcyA9IHRoaXM7XG4gICAgICAgIGNvbm5lY3Rpb24uZXhlY3V0ZVF1ZXJ5ID0gYXN5bmMgKGNvbXBpbGVkUXVlcnkpID0+IHtcbiAgICAgICAgICAgIGxldCBjYXVnaHRFcnJvcjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlUXVlcnkuY2FsbChjb25uZWN0aW9uLCBjb21waWxlZFF1ZXJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGlzLiNsb2dFcnJvcihlcnJvciwgY29tcGlsZWRRdWVyeSwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlmICghY2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzLiNsb2dRdWVyeShjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29ubmVjdGlvbi5zdHJlYW1RdWVyeSA9IGFzeW5jIGZ1bmN0aW9uKiAoY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKSB7XG4gICAgICAgICAgICBsZXQgY2F1Z2h0RXJyb3I7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHJlc3VsdCBvZiBzdHJlYW1RdWVyeS5jYWxsKGNvbm5lY3Rpb24sIGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGlzLiNsb2dFcnJvcihlcnJvciwgY29tcGlsZWRRdWVyeSwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlmICghY2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzLiNsb2dRdWVyeShjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgI2xvZ0Vycm9yKGVycm9yLCBjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jbG9nLmVycm9yKCgpID0+ICh7XG4gICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgcXVlcnk6IGNvbXBpbGVkUXVlcnksXG4gICAgICAgICAgICBxdWVyeUR1cmF0aW9uTWlsbGlzOiB0aGlzLiNjYWxjdWxhdGVEdXJhdGlvbk1pbGxpcyhzdGFydFRpbWUpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGFzeW5jICNsb2dRdWVyeShjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUsIGlzU3RyZWFtID0gZmFsc2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jbG9nLnF1ZXJ5KCgpID0+ICh7XG4gICAgICAgICAgICBsZXZlbDogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGlzU3RyZWFtLFxuICAgICAgICAgICAgcXVlcnk6IGNvbXBpbGVkUXVlcnksXG4gICAgICAgICAgICBxdWVyeUR1cmF0aW9uTWlsbGlzOiB0aGlzLiNjYWxjdWxhdGVEdXJhdGlvbk1pbGxpcyhzdGFydFRpbWUpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgICNjYWxjdWxhdGVEdXJhdGlvbk1pbGxpcyhzdGFydFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlTm93KCkgLSBzdGFydFRpbWU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wZXJmb3JtYW5jZS1ub3cuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBlcmZvcm1hbmNlTm93KCkge1xuICAgIGlmICh0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIGlzRnVuY3Rpb24ocGVyZm9ybWFuY2Uubm93KSkge1xuICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3coKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NpbmdsZS1jb25uZWN0aW9uLXByb3ZpZGVyLmQudHNcIiAvPlxuY29uc3QgaWdub3JlRXJyb3IgPSAoKSA9PiB7IH07XG5leHBvcnQgY2xhc3MgU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyIHtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjcnVubmluZ1Byb21pc2U7XG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgcHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuI3J1bm5pbmdQcm9taXNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5uaW5nUHJvbWlzZS5jYXRjaChpZ25vcmVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYCNydW5uaW5nUHJvbWlzZWAgbXVzdCBiZSBzZXQgdG8gdW5kZWZpbmVkIGJlZm9yZSBpdCdzXG4gICAgICAgIC8vIHJlc29sdmVkIG9yIHJlamVjdGVkLiBPdGhlcndpc2UgdGhlIHdoaWxlIGxvb3AgYWJvdmVcbiAgICAgICAgLy8gd2lsbCBtaXNiZWhhdmUuXG4gICAgICAgIHRoaXMuI3J1bm5pbmdQcm9taXNlID0gdGhpcy4jcnVuKGNvbnN1bWVyKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3J1bm5pbmdQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3J1bm5pbmdQcm9taXNlO1xuICAgIH1cbiAgICAvLyBSdW4gdGhlIHJ1bm5lciBpbiBhbiBhc3luYyBmdW5jdGlvbiB0byBtYWtlIHN1cmUgaXQgZG9lc24ndFxuICAgIC8vIHRocm93IHN5bmNocm9ub3VzIGVycm9ycy5cbiAgICBhc3luYyAjcnVuKHJ1bm5lcikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVubmVyKHRoaXMuI2Nvbm5lY3Rpb24pO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJpdmVyLmQudHNcIiAvPlxuZXhwb3J0IGNvbnN0IFRSQU5TQUNUSU9OX0FDQ0VTU19NT0RFUyA9IFsncmVhZCBvbmx5JywgJ3JlYWQgd3JpdGUnXTtcbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTID0gW1xuICAgICdyZWFkIHVuY29tbWl0dGVkJyxcbiAgICAncmVhZCBjb21taXR0ZWQnLFxuICAgICdyZXBlYXRhYmxlIHJlYWQnLFxuICAgICdzZXJpYWxpemFibGUnLFxuICAgICdzbmFwc2hvdCcsXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncykge1xuICAgIGlmIChzZXR0aW5ncy5hY2Nlc3NNb2RlICYmXG4gICAgICAgICFUUkFOU0FDVElPTl9BQ0NFU1NfTU9ERVMuaW5jbHVkZXMoc2V0dGluZ3MuYWNjZXNzTW9kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRyYW5zYWN0aW9uIGFjY2VzcyBtb2RlICR7c2V0dGluZ3MuYWNjZXNzTW9kZX1gKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLmlzb2xhdGlvbkxldmVsICYmXG4gICAgICAgICFUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTLmluY2x1ZGVzKHNldHRpbmdzLmlzb2xhdGlvbkxldmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsICR7c2V0dGluZ3MuaXNvbGF0aW9uTGV2ZWx9YCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9sb2cuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUsIGlzRnVuY3Rpb24gfSBmcm9tICcuL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY29uc3QgTE9HX0xFVkVMUyA9IGZyZWV6ZShbJ3F1ZXJ5JywgJ2Vycm9yJ10pO1xuZXhwb3J0IGNsYXNzIExvZyB7XG4gICAgI2xldmVscztcbiAgICAjbG9nZ2VyO1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICB0aGlzLiNsb2dnZXIgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLiNsZXZlbHMgPSBmcmVlemUoe1xuICAgICAgICAgICAgICAgIHF1ZXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNsb2dnZXIgPSBkZWZhdWx0TG9nZ2VyO1xuICAgICAgICAgICAgdGhpcy4jbGV2ZWxzID0gZnJlZXplKHtcbiAgICAgICAgICAgICAgICBxdWVyeTogY29uZmlnLmluY2x1ZGVzKCdxdWVyeScpLFxuICAgICAgICAgICAgICAgIGVycm9yOiBjb25maWcuaW5jbHVkZXMoJ2Vycm9yJyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0xldmVsRW5hYmxlZChsZXZlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGV2ZWxzW2xldmVsXTtcbiAgICB9XG4gICAgYXN5bmMgcXVlcnkoZ2V0RXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2xldmVscy5xdWVyeSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jbG9nZ2VyKGdldEV2ZW50KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGVycm9yKGdldEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLiNsZXZlbHMuZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2xvZ2dlcihnZXRFdmVudCgpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGRlZmF1bHRMb2dnZXIoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQubGV2ZWwgPT09ICdxdWVyeScpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gYGt5c2VseTpxdWVyeToke2V2ZW50LmlzU3RyZWFtID8gJ3N0cmVhbTonIDogJyd9YDtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fSAke2V2ZW50LnF1ZXJ5LnNxbH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fSBkdXJhdGlvbjogJHtldmVudC5xdWVyeUR1cmF0aW9uTWlsbGlzLnRvRml4ZWQoMSl9bXNgKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQubGV2ZWwgPT09ICdlcnJvcicpIHtcbiAgICAgICAgaWYgKGV2ZW50LmVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGt5c2VseTplcnJvcjogJHtldmVudC5lcnJvci5zdGFjayA/PyBldmVudC5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihga3lzZWx5OmVycm9yOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXZlbnQuZXJyb3IsXG4gICAgICAgICAgICAgICAgcXVlcnk6IGV2ZW50LnF1ZXJ5LnNxbCxcbiAgICAgICAgICAgICAgICBxdWVyeUR1cmF0aW9uTWlsbGlzOiBldmVudC5xdWVyeUR1cmF0aW9uTWlsbGlzLFxuICAgICAgICAgICAgfSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbXBpbGFibGUuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBpbGFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzRnVuY3Rpb24odmFsdWUuY29tcGlsZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2R1bW15LWRyaXZlci5kLnRzXCIgLz5cbi8qKlxuICogQSBkcml2ZXIgdGhhdCBkb2VzIGFic29sdXRlbHkgbm90aGluZy5cbiAqXG4gKiBZb3UgY2FuIHVzZSB0aGlzIHRvIGNyZWF0ZSBLeXNlbHkgaW5zdGFuY2VzIHNvbGVseSBmb3IgYnVpbGRpbmcgcXVlcmllc1xuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgS3lzZWx5IGluc3RhbmNlIGZvciBidWlsZGluZyBwb3N0Z3JlcyBxdWVyaWVzOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1xuICogICBEdW1teURyaXZlcixcbiAqICAgS3lzZWx5LFxuICogICBQb3N0Z3Jlc0FkYXB0ZXIsXG4gKiAgIFBvc3RncmVzSW50cm9zcGVjdG9yLFxuICogICBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXJcbiAqIH0gZnJvbSAna3lzZWx5J1xuICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gKlxuICogY29uc3QgZGIgPSBuZXcgS3lzZWx5PERhdGFiYXNlPih7XG4gKiAgIGRpYWxlY3Q6IHtcbiAqICAgICBjcmVhdGVBZGFwdGVyOiAoKSA9PiBuZXcgUG9zdGdyZXNBZGFwdGVyKCksXG4gKiAgICAgY3JlYXRlRHJpdmVyOiAoKSA9PiBuZXcgRHVtbXlEcml2ZXIoKSxcbiAqICAgICBjcmVhdGVJbnRyb3NwZWN0b3I6IChkYjogS3lzZWx5PGFueT4pID0+IG5ldyBQb3N0Z3Jlc0ludHJvc3BlY3RvcihkYiksXG4gKiAgICAgY3JlYXRlUXVlcnlDb21waWxlcjogKCkgPT4gbmV3IFBvc3RncmVzUXVlcnlDb21waWxlcigpLFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICpcbiAqIFlvdSBjYW4gdXNlIGl0IHRvIGJ1aWxkIGEgcXVlcnkgYW5kIGNvbXBpbGUgaXQgdG8gU1FMIGJ1dCB0cnlpbmcgdG9cbiAqIGV4ZWN1dGUgdGhlIHF1ZXJ5IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHsgc3FsIH0gPSBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3RBbGwoKS5jb21waWxlKClcbiAqIGNvbnNvbGUubG9nKHNxbCkgLy8gc2VsZWN0ICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIER1bW15RHJpdmVyIHtcbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIGFjcXVpcmVDb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IER1bW15Q29ubmVjdGlvbigpO1xuICAgIH1cbiAgICBhc3luYyBiZWdpblRyYW5zYWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIGNvbW1pdFRyYW5zYWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJvbGxiYWNrVHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgcmVsZWFzZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbiAgICBhc3luYyByZWxlYXNlU2F2ZXBvaW50KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJvbGxiYWNrVG9TYXZlcG9pbnQoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgc2F2ZXBvaW50KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxufVxuY2xhc3MgRHVtbXlDb25uZWN0aW9uIHtcbiAgICBhc3luYyBleGVjdXRlUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb3dzOiBbXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbVF1ZXJ5KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7d0NBQUFBLElDQUFDLElDQUFDLElDQUFDLElDQUFDLElBVU8sU0FBU0MsRUFBWUMsRUFBSyxDQUM3QixPQUFPLE9BQU9BLEVBQVEsS0FBZUEsSUFBUSxNQUNqRCxDQUNPLFNBQVNDLEVBQVNELEVBQUssQ0FDMUIsT0FBTyxPQUFPQSxHQUFRLFFBQzFCLENBQ08sU0FBU0UsR0FBU0YsRUFBSyxDQUMxQixPQUFPLE9BQU9BLEdBQVEsUUFDMUIsQ0FDTyxTQUFTRyxHQUFVSCxFQUFLLENBQzNCLE9BQU8sT0FBT0EsR0FBUSxTQUMxQixDQUNPLFNBQVNJLEdBQU9KLEVBQUssQ0FDeEIsT0FBT0EsSUFBUSxJQUNuQixDQUNPLFNBQVNLLEdBQU9MLEVBQUssQ0FDeEIsT0FBT0EsYUFBZSxJQUMxQixDQUNPLFNBQVNNLEdBQVNOLEVBQUssQ0FDMUIsT0FBTyxPQUFPQSxHQUFRLFFBQzFCLENBTU8sU0FBU08sRUFBV0MsRUFBSyxDQUM1QixPQUFPLE9B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TEYsRUFBR0osQ0FBVSxFQUFJRyxFQUFJSCxDQUFVLEdBQUssTUFDN0JJLENBQ1QsRUFDQSxDQUFDLENBQ0gsQ0FDRixDQUNGLENBTU8sU0FBU1IsR0FBZ0JILEVBQWlDQyxFQUF1QyxDQUN0RyxPQUFPRCxFQUFLLElBQUtVLEdBQVFELEdBQWVDLEVBQUtULENBQU8sQ0FBQyxDQUN2RCIsCiAgIm5hbWVzIjogWyJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpc1VuZGVmaW5lZCIsICJvYmoiLCAiaXNTdHJpbmciLCAiaXNOdW1iZXIiLCAiaXNCb29sZWFuIiwgImlzTnVsbCIsICJpc0RhdGUiLCAiaXNCaWdJbnQiLCAiaXNGdW5jdGlvbiIsICJvYmoiLCAiaXNPYmplY3QiLCAiZnJlZXplIiwgIm9iaiIsICJhc0FycmF5IiwgImFyZyIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXNSZWFkb25seUFycmF5IiwgImFyZyIsICJub29wIiwgIm9iaiIsICJBbHRlclRhYmxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZSIsICJwcm9wcyIsICJjb2x1bW5BbHRlcmF0aW9uIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIklkZW50aWZpZXJOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiQ3JlYXRlSW5kZXhOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAicHJvcHMiLCAiY29sdW1ucyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJDcmVhdGVTY2hlbWFOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNjaGVtYSIsICJwYXJhbXMiLCAiSWRlbnRpZmllck5vZGUiLCAiY3JlYXRlU2NoZW1hIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIk9OX0NPTU1JVF9BQ1RJT05TIiwgIkNyZWF0ZVRhYmxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZSIsICJjcmVhdGVUYWJsZSIsICJjb2x1bW4iLCAiY29uc3RyYWludCIsICJtb2RpZmllciIsICJwYXJhbXMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaWRlbnRpZmllciIsICJJZGVudGlmaWVyTm9kZSIsICJzY2hlbWEiLCAiRHJvcEluZGV4Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgInBhcmFtcyIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJkcm9wSW5kZXgiLCAicHJvcHMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiRHJvcFNjaGVtYU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic2NoZW1hIiwgInBhcmFtcyIsICJJZGVudGlmaWVyTm9kZSIsICJkcm9wU2NoZW1hIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkRyb3BUYWJsZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGUiLCAicGFyYW1zIiwgImRyb3BJbmRleCIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJBbGlhc05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiYWxpYXMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiVGFibGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgInNjaGVtYSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAib2JqIiwgImlzT2JqZWN0IiwgImlzRnVuY3Rpb24iLCAiaXNFeHByZXNzaW9uIiwgIm9iaiIsICJpc09iamVjdCIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNBbGlhc2VkRXhwcmVzc2lvbiIsICJpc1N0cmluZyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJTZWxlY3RNb2RpZmllck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibW9kaWZpZXIiLCAib2YiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQW5kTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJsZWZ0IiwgInJpZ2h0IiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIk9yTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJsZWZ0IiwgInJpZ2h0IiwgIk9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmaWx0ZXIiLCAib25Ob2RlIiwgIm9wZXJhdG9yIiwgIm9wZXJhdGlvbiIsICJBbmROb2RlIiwgIk9yTm9kZSIsICJKb2luTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJqb2luVHlwZSIsICJ0YWJsZSIsICJvbiIsICJPbk5vZGUiLCAiam9pbk5vZGUiLCAib3BlcmF0aW9uIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkJpbmFyeU9wZXJhdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGVmdE9wZXJhbmQiLCAib3BlcmF0b3IiLCAicmlnaHRPcGVyYW5kIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkNPTVBBUklTT05fT1BFUkFUT1JTIiwgIkFSSVRITUVUSUNfT1BFUkFUT1JTIiwgIkpTT05fT1BFUkFUT1JTIiwgIkJJTkFSWV9PUEVSQVRPUlMiLCAiVU5BUllfRklMVEVSX09QRVJBVE9SUyIsICJVTkFSWV9PUEVSQVRPUlMiLCAiT1BFUkFUT1JTIiwgIk9wZXJhdG9yTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcGVyYXRvciIsICJpc0pTT05PcGVyYXRvciIsICJvcCIsICJpc1N0cmluZyIsICJKU09OX09QRVJBVE9SUyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJJZGVudGlmaWVyTm9kZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJTZWxlY3RBbGxOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIlJlZmVyZW5jZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgInRhYmxlIiwgIlNlbGVjdEFsbE5vZGUiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAiI2R5bmFtaWNSZWZlcmVuY2UiLCAicmVmZXJlbmNlIiwgInBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIiwgIm9iaiIsICJpc09iamVjdCIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNTdHJpbmciLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiT3JkZXJCeUl0ZW1Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9yZGVyQnkiLCAiZGlyZWN0aW9uIiwgInByb3BzIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlJhd05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic3FsRnJhZ21lbnRzIiwgInBhcmFtZXRlcnMiLCAic3FsIiwgImNoaWxkIiwgImNoaWxkcmVuIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkNvbGxhdGVOb2RlIiwgIm5vZGUiLCAiY29sbGF0aW9uIiwgImZyZWV6ZSIsICJJZGVudGlmaWVyTm9kZSIsICJPcmRlckJ5SXRlbUJ1aWxkZXIiLCAiX09yZGVyQnlJdGVtQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIk9yZGVyQnlJdGVtTm9kZSIsICJSYXdOb2RlIiwgImNvbGxhdGlvbiIsICJDb2xsYXRlTm9kZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJMT0dHRURfTUVTU0FHRVMiLCAibG9nT25jZSIsICJtZXNzYWdlIiwgImlzT3JkZXJCeURpcmVjdGlvbiIsICJ0aGluZyIsICJwYXJzZU9yZGVyQnkiLCAiYXJncyIsICJwYXJzZU9yZGVyQnlJdGVtIiwgIm9yZGVyQnkiLCAibG9nT25jZSIsICJpdGVtIiwgImV4cHIiLCAibW9kaWZpZXJzIiwgInBhcnNlZFJlZiIsICJwYXJzZU9yZGVyQnlFeHByZXNzaW9uIiwgIk9yZGVyQnlJdGVtTm9kZSIsICJwYXJzZU9yZGVyQnlXaXRoTW9kaWZpZXJzIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJwYXJzZUV4cHJlc3Npb24iLCAiaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlciIsICJyZWYiLCAiZGlyZWN0aW9uIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIlJhd05vZGUiLCAiaXNFeHByZXNzaW9uIiwgIm5vZGUiLCAiT3JkZXJCeUl0ZW1CdWlsZGVyIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkpTT05SZWZlcmVuY2VOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInJlZmVyZW5jZSIsICJ0cmF2ZXJzYWwiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9wZXJhdG9yIiwgInZhbHVlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkpTT05QYXRoTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpbk9wZXJhdG9yIiwgImpzb25QYXRoTm9kZSIsICJwYXRoTGVnIiwgInBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJleHAiLCAiaXNTdHJpbmciLCAicGFyc2VTdHJpbmdSZWZlcmVuY2UiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgImFyZyIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXQiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJwYXJzZUV4cHJlc3Npb24iLCAicGFyc2VKU09OUmVmZXJlbmNlIiwgInJlZiIsICJvcCIsICJyZWZlcmVuY2VOb2RlIiwgImlzSlNPTk9wZXJhdG9yIiwgIkpTT05SZWZlcmVuY2VOb2RlIiwgIkpTT05PcGVyYXRvckNoYWluTm9kZSIsICJPcGVyYXRvck5vZGUiLCAib3BXaXRob3V0TGFzdENoYXIiLCAiSlNPTlBhdGhOb2RlIiwgIkNPTFVNTl9TRVBBUkFUT1IiLCAiUmVmZXJlbmNlTm9kZSIsICJDb2x1bW5Ob2RlIiwgInBhcnRzIiwgInRyaW0iLCAicGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGVBbmRTY2hlbWEiLCAicGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGUiLCAicGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlIiwgIkFMSUFTX1NFUEFSQVRPUiIsICJjb2x1bW5SZWYiLCAiYWxpYXMiLCAiQWxpYXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgInBhcnNlQ29sdW1uTmFtZSIsICJjb2x1bW4iLCAicGFyc2VPcmRlcmVkQ29sdW1uTmFtZSIsICJPUkRFUl9TRVBBUkFUT1IiLCAiY29sdW1uTmFtZSIsICJvcmRlciIsICJpc09yZGVyQnlEaXJlY3Rpb24iLCAicGFyc2VPcmRlckJ5IiwgInNjaGVtYSIsICJ0YWJsZSIsICJUYWJsZU5vZGUiLCAic3RyIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlByaW1pdGl2ZVZhbHVlTGlzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlZhbHVlTGlzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlZhbHVlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ2YWx1ZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdCIsICJhcmciLCAiaXNSZWFkb25seUFycmF5IiwgInBhcnNlVmFsdWVFeHByZXNzaW9uTGlzdCIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJleHAiLCAiaXNFeHByZXNzaW9uT3JGYWN0b3J5IiwgInBhcnNlRXhwcmVzc2lvbiIsICJWYWx1ZU5vZGUiLCAiaXNTYWZlSW1tZWRpYXRlVmFsdWUiLCAidmFsdWUiLCAiaXNOdW1iZXIiLCAiaXNCb29sZWFuIiwgImlzTnVsbCIsICJwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSIsICJWYWx1ZUxpc3ROb2RlIiwgIml0IiwgIlByaW1pdGl2ZVZhbHVlTGlzdE5vZGUiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiUGFyZW5zTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImFyZ3MiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbiIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJsZWZ0IiwgIm9wZXJhdG9yIiwgInJpZ2h0IiwgImlzSXNPcGVyYXRvciIsICJuZWVkc0lzT3BlcmF0b3IiLCAiQmluYXJ5T3BlcmF0aW9uTm9kZSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAicGFyc2VPcGVyYXRvciIsICJWYWx1ZU5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb25Pckxpc3QiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJwYXJzZUZpbHRlck9iamVjdCIsICJvYmoiLCAiY29tYmluYXRvciIsICJwYXJzZUZpbHRlckxpc3QiLCAidiIsICJpc1VuZGVmaW5lZCIsICJrIiwgImxpc3QiLCAid2l0aFBhcmVucyIsICJjb21iaW5lIiwgIkFuZE5vZGUiLCAiT3JOb2RlIiwgIk9wZXJhdG9yTm9kZSIsICJub2RlIiwgInRvT3BlcmF0aW9uTm9kZSIsICJpIiwgIlBhcmVuc05vZGUiLCAidmFsdWUiLCAiaXNOdWxsIiwgImlzQm9vbGVhbiIsICJpc1N0cmluZyIsICJPUEVSQVRPUlMiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIm5vZGVPclNvdXJjZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJPcmRlckJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpdGVtcyIsICJvcmRlckJ5IiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlBhcnRpdGlvbkJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpdGVtcyIsICJwYXJ0aXRpb25CeSIsICJPdmVyTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvdmVyTm9kZSIsICJpdGVtcyIsICJPcmRlckJ5Tm9kZSIsICJQYXJ0aXRpb25CeU5vZGUiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiRnJvbU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZnJvbXMiLCAiZnJvbSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJHcm91cEJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpdGVtcyIsICJncm91cEJ5IiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkhhdmluZ05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZmlsdGVyIiwgImhhdmluZ05vZGUiLCAib3BlcmF0b3IiLCAib3BlcmF0aW9uIiwgIkFuZE5vZGUiLCAiT3JOb2RlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpbnRvIiwgIndpdGhOb2RlIiwgInJlcGxhY2UiLCAiaW5zZXJ0UXVlcnkiLCAicHJvcHMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiTGlzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaXRlbXMiLCAiVXBkYXRlUXVlcnlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlcyIsICJ3aXRoTm9kZSIsICJMaXN0Tm9kZSIsICJ1cGRhdGVRdWVyeSIsICJmcm9tSXRlbXMiLCAiRnJvbU5vZGUiLCAidXBkYXRlcyIsICJsaW1pdCIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJVc2luZ05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGVzIiwgInVzaW5nIiwgIkRlbGV0ZVF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmcm9tSXRlbXMiLCAid2l0aE5vZGUiLCAiRnJvbU5vZGUiLCAiaXRlbXMiLCAiUXVlcnlOb2RlIiwgImRlbGV0ZU5vZGUiLCAibGltaXQiLCAidGFibGVzIiwgIlVzaW5nTm9kZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJXaGVyZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZmlsdGVyIiwgIndoZXJlTm9kZSIsICJvcGVyYXRvciIsICJvcGVyYXRpb24iLCAiQW5kTm9kZSIsICJPck5vZGUiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiUmV0dXJuaW5nTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJzZWxlY3Rpb25zIiwgInJldHVybmluZyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJFeHBsYWluTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJXaGVuTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb25kaXRpb24iLCAid2hlbk5vZGUiLCAicmVzdWx0IiwgIk1lcmdlUXVlcnlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImludG8iLCAid2l0aE5vZGUiLCAibWVyZ2VOb2RlIiwgInVzaW5nIiwgIndoZW4iLCAidGhlbiIsICJXaGVuTm9kZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJPdXRwdXROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNlbGVjdGlvbnMiLCAib3V0cHV0IiwgIlF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJTZWxlY3RRdWVyeU5vZGUiLCAiSW5zZXJ0UXVlcnlOb2RlIiwgIlVwZGF0ZVF1ZXJ5Tm9kZSIsICJEZWxldGVRdWVyeU5vZGUiLCAiTWVyZ2VRdWVyeU5vZGUiLCAibW9kaWZpZXIiLCAib3BlcmF0aW9uIiwgIldoZXJlTm9kZSIsICJqb2luIiwgInNlbGVjdGlvbnMiLCAiUmV0dXJuaW5nTm9kZSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJFeHBsYWluTm9kZSIsICJ0b3AiLCAiT3V0cHV0Tm9kZSIsICJpdGVtcyIsICJPcmRlckJ5Tm9kZSIsICJTZWxlY3RRdWVyeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAid2l0aE5vZGUiLCAiZnJvbUl0ZW1zIiwgIkZyb21Ob2RlIiwgInNlbGVjdCIsICJzZWxlY3Rpb25zIiwgImV4cHJlc3Npb25zIiwgIm1vZGlmaWVyIiwgIml0ZW1zIiwgIlF1ZXJ5Tm9kZSIsICJzZWxlY3ROb2RlIiwgIkdyb3VwQnlOb2RlIiwgImxpbWl0IiwgIm9mZnNldCIsICJmZXRjaCIsICJvcGVyYXRpb24iLCAiSGF2aW5nTm9kZSIsICJzZXRPcGVyYXRpb25zIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkpvaW5CdWlsZGVyIiwgIl9Kb2luQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFyZ3MiLCAiSm9pbk5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJsaHMiLCAib3AiLCAicmhzIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiUmF3Tm9kZSIsICJmdW5jIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlBhcnRpdGlvbkJ5SXRlbU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicGFydGl0aW9uQnkiLCAicGFyc2VQYXJ0aXRpb25CeSIsICJwYXJ0aXRpb25CeSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QiLCAiUGFydGl0aW9uQnlJdGVtTm9kZSIsICJPdmVyQnVpbGRlciIsICJfT3ZlckJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIk92ZXJOb2RlIiwgInBhcnNlT3JkZXJCeSIsICJRdWVyeU5vZGUiLCAicGFydGl0aW9uQnkiLCAicGFyc2VQYXJ0aXRpb25CeSIsICJmdW5jIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlNlbGVjdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic2VsZWN0aW9uIiwgIlNlbGVjdEFsbE5vZGUiLCAidGFibGUiLCAiUmVmZXJlbmNlTm9kZSIsICJwYXJzZVNlbGVjdEFyZyIsICJzZWxlY3Rpb24iLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXQiLCAicGFyc2VTZWxlY3RFeHByZXNzaW9uIiwgImlzU3RyaW5nIiwgIlNlbGVjdGlvbk5vZGUiLCAicGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlIiwgImlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAicGFyc2VBbGlhc2VkRXhwcmVzc2lvbiIsICJwYXJzZVNlbGVjdEFsbCIsICJ0YWJsZSIsICJwYXJzZVNlbGVjdEFsbEFyZyIsICJwYXJzZVRhYmxlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlZhbHVlc05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkRlZmF1bHRJbnNlcnRWYWx1ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicGFyc2VJbnNlcnRFeHByZXNzaW9uIiwgImFyZyIsICJvYmplY3RPckxpc3QiLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJsaXN0IiwgImlzUmVhZG9ubHlBcnJheSIsICJmcmVlemUiLCAicGFyc2VJbnNlcnRDb2x1bW5zQW5kVmFsdWVzIiwgInJvd3MiLCAiY29sdW1ucyIsICJwYXJzZUNvbHVtbk5hbWVzQW5kSW5kZXhlcyIsICJDb2x1bW5Ob2RlIiwgIlZhbHVlc05vZGUiLCAicm93IiwgInBhcnNlUm93VmFsdWVzIiwgImNvbHMiLCAiY29sIiwgInJvd0NvbHVtbnMiLCAicm93VmFsdWVzIiwgImhhc1VuZGVmaW5lZE9yQ29tcGxleENvbHVtbnMiLCAiaW5kZXhlZFJvd0NvbHVtbnMiLCAiY29sdW1uSWR4IiwgImlzVW5kZWZpbmVkIiwgInZhbHVlIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJkZWZhdWx0VmFsdWUiLCAiRGVmYXVsdEluc2VydFZhbHVlTm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIml0IiwgInBhcnNlVmFsdWVFeHByZXNzaW9uIiwgIlByaW1pdGl2ZVZhbHVlTGlzdE5vZGUiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQ29sdW1uVXBkYXRlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW4iLCAidmFsdWUiLCAicGFyc2VVcGRhdGUiLCAiYXJncyIsICJDb2x1bW5VcGRhdGVOb2RlIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24iLCAidXBkYXRlIiwgInVwZGF0ZU9iaiIsICJpc0Z1bmN0aW9uIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgIl8iLCAidmFsdWUiLCAia2V5IiwgIkNvbHVtbk5vZGUiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiT25EdXBsaWNhdGVLZXlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInVwZGF0ZXMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiSW5zZXJ0UmVzdWx0IiwgImluc2VydElkIiwgIm51bUluc2VydGVkT3JVcGRhdGVkUm93cyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJOb1Jlc3VsdEVycm9yIiwgIm5vZGUiLCAiaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IiLCAiZm4iLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiT25Db25mbGljdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicHJvcHMiLCAib3BlcmF0aW9uIiwgIldoZXJlTm9kZSIsICJPbkNvbmZsaWN0QnVpbGRlciIsICJfT25Db25mbGljdEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJjb2x1bW4iLCAiY29sdW1uTm9kZSIsICJDb2x1bW5Ob2RlIiwgIk9uQ29uZmxpY3ROb2RlIiwgImNvbHVtbnMiLCAiY29sdW1uTm9kZXMiLCAiY29uc3RyYWludE5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAiZXhwcmVzc2lvbiIsICJhcmdzIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAibGhzIiwgIm9wIiwgInJocyIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgIk9uQ29uZmxpY3REb05vdGhpbmdCdWlsZGVyIiwgInVwZGF0ZSIsICJPbkNvbmZsaWN0VXBkYXRlQnVpbGRlciIsICJwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24iLCAiZnVuYyIsICJfT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiVG9wTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJpc051bWJlciIsICJpc0JpZ0ludCIsICJpc1VuZGVmaW5lZCIsICJpc1RvcE1vZGlmaWVycyIsICJUb3BOb2RlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIk9yQWN0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJhY3Rpb24iLCAiSW5zZXJ0UXVlcnlCdWlsZGVyIiwgIl9JbnNlcnRRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJpbnNlcnQiLCAiY29sdW1ucyIsICJ2YWx1ZXMiLCAicGFyc2VJbnNlcnRFeHByZXNzaW9uIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJDb2x1bW5Ob2RlIiwgImV4cHJlc3Npb24iLCAicGFyc2VFeHByZXNzaW9uIiwgIm1vZGlmaWVyIiwgIlF1ZXJ5Tm9kZSIsICJPckFjdGlvbk5vZGUiLCAibW9kaWZpZXJzIiwgInBhcnNlVG9wIiwgImNhbGxiYWNrIiwgIk9uQ29uZmxpY3RCdWlsZGVyIiwgIk9uQ29uZmxpY3ROb2RlIiwgInVwZGF0ZSIsICJPbkR1cGxpY2F0ZUtleU5vZGUiLCAicGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uIiwgInNlbGVjdGlvbiIsICJwYXJzZVNlbGVjdEFyZyIsICJwYXJzZVNlbGVjdEFsbCIsICJhcmdzIiwgInRhYmxlIiwgImZ1bmMiLCAiY29uZGl0aW9uIiwgInBsdWdpbiIsICJjb21waWxlZFF1ZXJ5IiwgInJlc3VsdCIsICJhZGFwdGVyIiwgInF1ZXJ5IiwgIkluc2VydFJlc3VsdCIsICJlcnJvckNvbnN0cnVjdG9yIiwgIk5vUmVzdWx0RXJyb3IiLCAiaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IiLCAiY2h1bmtTaXplIiwgInN0cmVhbSIsICJpdGVtIiwgImZvcm1hdCIsICJvcHRpb25zIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkRlbGV0ZVJlc3VsdCIsICJudW1EZWxldGVkUm93cyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJMaW1pdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGltaXQiLCAiRGVsZXRlUXVlcnlCdWlsZGVyIiwgIl9EZWxldGVRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIlF1ZXJ5Tm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJ0YWJsZXMiLCAiRGVsZXRlUXVlcnlOb2RlIiwgInBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0IiwgIiNqb2luIiwgImpvaW5UeXBlIiwgInBhcnNlSm9pbiIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAicGFyc2VPcmRlckJ5IiwgImxpbWl0IiwgIkxpbWl0Tm9kZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJtb2RpZmllciIsICJmdW5jIiwgImNvbmRpdGlvbiIsICJwbHVnaW4iLCAiY29tcGlsZWRRdWVyeSIsICJyZXN1bHQiLCAiYWRhcHRlciIsICJxdWVyeSIsICJEZWxldGVSZXN1bHQiLCAiZXJyb3JDb25zdHJ1Y3RvciIsICJOb1Jlc3VsdEVycm9yIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgImNodW5rU2l6ZSIsICJzdHJlYW0iLCAiaXRlbSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJVcGRhdGVSZXN1bHQiLCAibnVtVXBkYXRlZFJvd3MiLCAibnVtQ2hhbmdlZFJvd3MiLCAiVXBkYXRlUXVlcnlCdWlsZGVyIiwgIl9VcGRhdGVRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIlF1ZXJ5Tm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJmcm9tIiwgIlVwZGF0ZVF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICIjam9pbiIsICJqb2luVHlwZSIsICJwYXJzZUpvaW4iLCAicGFyc2VPcmRlckJ5IiwgImxpbWl0IiwgIkxpbWl0Tm9kZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJwYXJzZVVwZGF0ZSIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAibW9kaWZpZXIiLCAiZnVuYyIsICJjb25kaXRpb24iLCAicGx1Z2luIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImFkYXB0ZXIiLCAicXVlcnkiLCAiVXBkYXRlUmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJjaHVua1NpemUiLCAic3RyZWFtIiwgIml0ZW0iLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGVOYW1lIiwgImNvbHVtbk5hbWVzIiwgIlRhYmxlTm9kZSIsICJDb2x1bW5Ob2RlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJleHByZXNzaW9uIiwgInByb3BzIiwgIkNURUJ1aWxkZXIiLCAiX0NURUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIiwgInBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uIiwgIm5hbWVPckJ1aWxkZXJDYWxsYmFjayIsICJleHByZXNzaW9uIiwgImV4cHJlc3Npb25Ob2RlIiwgImNyZWF0ZVF1ZXJ5Q3JlYXRvciIsICJpc0Z1bmN0aW9uIiwgImN0ZUJ1aWxkZXJGYWN0b3J5IiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUiLCAicGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lIiwgIm5hbWUiLCAiQ1RFQnVpbGRlciIsICJwYXJ0cyIsICJ0YWJsZSIsICJjb2x1bW5zIiwgIml0IiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIldpdGhOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImV4cHJlc3Npb24iLCAicGFyYW1zIiwgIndpdGhOb2RlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkNIQVJTIiwgInJhbmRvbVN0cmluZyIsICJsZW5ndGgiLCAiY2hhcnMiLCAiaSIsICJyYW5kb21DaGFyIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiTGF6eVF1ZXJ5SWQiLCAiI3F1ZXJ5SWQiLCAicmFuZG9tU3RyaW5nIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIk9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciIsICIjdHJhbnNmb3JtZXJzIiwgImZyZWV6ZSIsICJub2RlIiwgInF1ZXJ5SWQiLCAib3V0IiwgImxpc3QiLCAiX3F1ZXJ5SWQiLCAiUk9PVF9PUEVSQVRJT05fTk9ERVMiLCAiZnJlZXplIiwgIlNDSEVNQUxFU1NfRlVOQ1RJT05TIiwgIldpdGhTY2hlbWFUcmFuc2Zvcm1lciIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAiI3NjaGVtYSIsICIjc2NoZW1hYmxlSWRzIiwgIiNjdGVzIiwgInNjaGVtYSIsICJub2RlIiwgInF1ZXJ5SWQiLCAiI2lzUm9vdE9wZXJhdGlvbk5vZGUiLCAiY3RlcyIsICIjY29sbGVjdENURXMiLCAiY3RlIiwgInRhYmxlcyIsICIjY29sbGVjdFNjaGVtYWJsZUlkcyIsICJ0YWJsZSIsICJ0cmFuc2Zvcm1lZCIsICJJZGVudGlmaWVyTm9kZSIsICJUYWJsZU5vZGUiLCAiI3RyYW5zZm9ybVRhYmxlQXJnc1dpdGhvdXRTY2hlbWFzIiwgImFyZ3NLZXkiLCAiYXJnIiwgInNjaGVtYWJsZUlkcyIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICIjY29sbGVjdFNjaGVtYWJsZUlkIiwgImZyb20iLCAiI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByIiwgImpvaW4iLCAiI2NvbGxlY3RDVEVJZHMiLCAiQWxpYXNOb2RlIiwgIkxpc3ROb2RlIiwgImlkIiwgImV4cHIiLCAiY3RlSWQiLCAiV2l0aFNjaGVtYVBsdWdpbiIsICIjdHJhbnNmb3JtZXIiLCAic2NoZW1hIiwgIldpdGhTY2hlbWFUcmFuc2Zvcm1lciIsICJhcmdzIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIk1hdGNoZWROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5vdCIsICJieVNvdXJjZSIsICJwYXJzZU1lcmdlV2hlbiIsICJ0eXBlIiwgImFyZ3MiLCAicmVmUmlnaHQiLCAiV2hlbk5vZGUiLCAicGFyc2VGaWx0ZXJMaXN0IiwgIk1hdGNoZWROb2RlIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJwYXJzZU1lcmdlVGhlbiIsICJyZXN1bHQiLCAiaXNTdHJpbmciLCAiUmF3Tm9kZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiRGVmZXJyZWQiLCAiI3Byb21pc2UiLCAiI3Jlc29sdmUiLCAiI3JlamVjdCIsICJyZXNvbHZlIiwgInJlamVjdCIsICJ2YWx1ZSIsICJyZWFzb24iLCAicHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uIiwgImNvbm5lY3Rpb25Qcm92aWRlciIsICJjb25uZWN0aW9uRGVmZXIiLCAiRGVmZXJyZWQiLCAiY29ubmVjdGlvblJlbGVhc2VEZWZlciIsICJjb25uZWN0aW9uIiwgImV4IiwgImZyZWV6ZSIsICJOT19QTFVHSU5TIiwgImZyZWV6ZSIsICJRdWVyeUV4ZWN1dG9yQmFzZSIsICIjcGx1Z2lucyIsICJwbHVnaW5zIiwgIm5vZGUiLCAicXVlcnlJZCIsICJwbHVnaW4iLCAidHJhbnNmb3JtZWROb2RlIiwgImNvbXBpbGVkUXVlcnkiLCAiY29ubmVjdGlvbiIsICJyZXN1bHQiLCAibG9nT25jZSIsICIjdHJhbnNmb3JtUmVzdWx0IiwgImNodW5rU2l6ZSIsICJyZWxlYXNlIiwgInByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbiIsICJOb29wUXVlcnlFeGVjdXRvciIsICJfTm9vcFF1ZXJ5RXhlY3V0b3IiLCAiUXVlcnlFeGVjdXRvckJhc2UiLCAicGx1Z2luIiwgInBsdWdpbnMiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJNZXJnZVJlc3VsdCIsICJudW1DaGFuZ2VkUm93cyIsICJNZXJnZVF1ZXJ5QnVpbGRlciIsICJfTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJtb2RpZmllciIsICJRdWVyeU5vZGUiLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAiYXJncyIsICJXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlciIsICJNZXJnZVF1ZXJ5Tm9kZSIsICJwYXJzZUpvaW4iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAiX1doZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyIiwgIiN3aGVuTWF0Y2hlZCIsICJsaHMiLCAib3AiLCAicmhzIiwgInJlZlJpZ2h0IiwgIk1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIiwgInBhcnNlTWVyZ2VXaGVuIiwgIiN3aGVuTm90TWF0Y2hlZCIsICJieVNvdXJjZSIsICJCdWlsZGVyIiwgIk5vdE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIiwgImZ1bmMiLCAiY29uZGl0aW9uIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImFkYXB0ZXIiLCAicXVlcnkiLCAiTWVyZ2VSZXN1bHQiLCAiZXJyb3JDb25zdHJ1Y3RvciIsICJOb1Jlc3VsdEVycm9yIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgInBhcnNlTWVyZ2VUaGVuIiwgInNldCIsICJVcGRhdGVRdWVyeUJ1aWxkZXIiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJVcGRhdGVRdWVyeU5vZGUiLCAidWIiLCAiaW5zZXJ0IiwgImNvbHVtbnMiLCAidmFsdWVzIiwgInBhcnNlSW5zZXJ0RXhwcmVzc2lvbiIsICJJbnNlcnRRdWVyeU5vZGUiLCAiUXVlcnlDcmVhdG9yIiwgIl9RdWVyeUNyZWF0b3IiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJmcm9tIiwgImNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciIsICJjcmVhdGVRdWVyeUlkIiwgIlNlbGVjdFF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAiSW5zZXJ0UXVlcnlCdWlsZGVyIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlIiwgIkRlbGV0ZVF1ZXJ5QnVpbGRlciIsICJEZWxldGVRdWVyeU5vZGUiLCAidGFibGVzIiwgIlVwZGF0ZVF1ZXJ5QnVpbGRlciIsICJVcGRhdGVRdWVyeU5vZGUiLCAidGFyZ2V0VGFibGUiLCAiTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiTWVyZ2VRdWVyeU5vZGUiLCAicGFyc2VBbGlhc2VkVGFibGUiLCAibmFtZU9yQnVpbGRlciIsICJleHByZXNzaW9uIiwgImN0ZSIsICJwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbiIsICJXaXRoTm9kZSIsICJwbHVnaW4iLCAic2NoZW1hIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiY3JlYXRlUXVlcnlDcmVhdG9yIiwgIlF1ZXJ5Q3JlYXRvciIsICJOT09QX1FVRVJZX0VYRUNVVE9SIiwgImNyZWF0ZUpvaW5CdWlsZGVyIiwgImpvaW5UeXBlIiwgInRhYmxlIiwgIkpvaW5CdWlsZGVyIiwgIkpvaW5Ob2RlIiwgInBhcnNlVGFibGVFeHByZXNzaW9uIiwgImNyZWF0ZU92ZXJCdWlsZGVyIiwgIk92ZXJCdWlsZGVyIiwgIk92ZXJOb2RlIiwgInBhcnNlSm9pbiIsICJqb2luVHlwZSIsICJhcmdzIiwgInBhcnNlU2luZ2xlT25Kb2luIiwgInBhcnNlQ2FsbGJhY2tKb2luIiwgInBhcnNlT25sZXNzSm9pbiIsICJmcm9tIiwgImNhbGxiYWNrIiwgImNyZWF0ZUpvaW5CdWlsZGVyIiwgImxoc0NvbHVtbiIsICJyaHNDb2x1bW4iLCAiSm9pbk5vZGUiLCAicGFyc2VUYWJsZUV4cHJlc3Npb24iLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJPZmZzZXROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9mZnNldCIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJHcm91cEJ5SXRlbU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZ3JvdXBCeSIsICJwYXJzZUdyb3VwQnkiLCAiZ3JvdXBCeSIsICJpc0Z1bmN0aW9uIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCIsICJHcm91cEJ5SXRlbU5vZGUiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiU2V0T3BlcmF0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcGVyYXRvciIsICJleHByZXNzaW9uIiwgImFsbCIsICJwYXJzZVNldE9wZXJhdGlvbnMiLCAib3BlcmF0b3IiLCAiZXhwcmVzc2lvbiIsICJhbGwiLCAiaXNGdW5jdGlvbiIsICJjcmVhdGVFeHByZXNzaW9uQnVpbGRlciIsICJpc1JlYWRvbmx5QXJyYXkiLCAiZXhwciIsICJTZXRPcGVyYXRpb25Ob2RlIiwgInBhcnNlRXhwcmVzc2lvbiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJFeHByZXNzaW9uV3JhcHBlciIsICJfRXhwcmVzc2lvbldyYXBwZXIiLCAiI25vZGUiLCAibm9kZSIsICJhbGlhcyIsICJBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIiLCAiYXJncyIsICJPcldyYXBwZXIiLCAiT3JOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAiQW5kV3JhcHBlciIsICJBbmROb2RlIiwgIiNleHByIiwgIiNhbGlhcyIsICJleHByIiwgIkFsaWFzTm9kZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiSWRlbnRpZmllck5vZGUiLCAiX09yV3JhcHBlciIsICJQYXJlbnNOb2RlIiwgIl9BbmRXcmFwcGVyIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkZldGNoTm9kZSIsICJub2RlIiwgInJvd0NvdW50IiwgIm1vZGlmaWVyIiwgIlZhbHVlTm9kZSIsICJwYXJzZUZldGNoIiwgInJvd0NvdW50IiwgIm1vZGlmaWVyIiwgImlzTnVtYmVyIiwgImlzQmlnSW50IiwgImlzRmV0Y2hNb2RpZmllciIsICJGZXRjaE5vZGUiLCAidmFsdWUiLCAiU2VsZWN0UXVlcnlCdWlsZGVySW1wbCIsICJfU2VsZWN0UXVlcnlCdWlsZGVySW1wbCIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFyZ3MiLCAiUXVlcnlOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAibGhzIiwgIm9wIiwgInJocyIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgIlNlbGVjdFF1ZXJ5Tm9kZSIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgIm1vZGlmaWVyIiwgIlNlbGVjdE1vZGlmaWVyTm9kZSIsICJvZiIsICJhc0FycmF5IiwgInBhcnNlVGFibGUiLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAiI2pvaW4iLCAiam9pblR5cGUiLCAicGFyc2VKb2luIiwgInBhcnNlT3JkZXJCeSIsICJncm91cEJ5IiwgInBhcnNlR3JvdXBCeSIsICJsaW1pdCIsICJMaW1pdE5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAib2Zmc2V0IiwgIk9mZnNldE5vZGUiLCAicm93Q291bnQiLCAicGFyc2VGZXRjaCIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJwYXJzZVNldE9wZXJhdGlvbnMiLCAiYWxpYXMiLCAiQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwiLCAiZnVuYyIsICJjb25kaXRpb24iLCAiRXhwcmVzc2lvbldyYXBwZXIiLCAicGx1Z2luIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJjaHVua1NpemUiLCAic3RyZWFtIiwgIml0ZW0iLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyIiwgIiNxdWVyeUJ1aWxkZXIiLCAiI2FsaWFzIiwgInF1ZXJ5QnVpbGRlciIsICJBbGlhc05vZGUiLCAiSWRlbnRpZmllck5vZGUiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImFnZ3JlZ2F0ZUZ1bmN0aW9uIiwgImFnZ3JlZ2F0ZWQiLCAiYWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgIm9yZGVySXRlbXMiLCAid2l0aGluR3JvdXAiLCAicHJvcCIsICJPcmRlckJ5Tm9kZSIsICJmaWx0ZXIiLCAiV2hlcmVOb2RlIiwgIm92ZXIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiRnVuY3Rpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImZ1bmMiLCAiYXJncyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiX0FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFsaWFzIiwgIkFsaWFzZWRBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiQWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgImFyZ3MiLCAiUXVlcnlOb2RlIiwgInBhcnNlT3JkZXJCeSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJvdmVyIiwgImJ1aWxkZXIiLCAiY3JlYXRlT3ZlckJ1aWxkZXIiLCAiZnVuYyIsICIjYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIiwgIiNhbGlhcyIsICJhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiQWxpYXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgImNyZWF0ZUZ1bmN0aW9uTW9kdWxlIiwgImZuIiwgIm5hbWUiLCAiYXJncyIsICJFeHByZXNzaW9uV3JhcHBlciIsICJGdW5jdGlvbk5vZGUiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgImFnZyIsICJBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiQWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgImNvbHVtbiIsICJ2YWx1ZXMiLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAiaXNTdHJpbmciLCAicGFyc2VUYWJsZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJVbmFyeU9wZXJhdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib3BlcmF0b3IiLCAib3BlcmFuZCIsICJwYXJzZVVuYXJ5T3BlcmF0aW9uIiwgIm9wZXJhdG9yIiwgIm9wZXJhbmQiLCAiVW5hcnlPcGVyYXRpb25Ob2RlIiwgIk9wZXJhdG9yTm9kZSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQ2FzZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWUiLCAiY2FzZU5vZGUiLCAid2hlbiIsICJ0aGVuIiwgIldoZW5Ob2RlIiwgInByb3BzIiwgIkNhc2VCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJDYXNlVGhlbkJ1aWxkZXIiLCAiQ2FzZU5vZGUiLCAiV2hlbk5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJ2YWx1ZUV4cHJlc3Npb24iLCAiQ2FzZVdoZW5CdWlsZGVyIiwgImlzU2FmZUltbWVkaWF0ZVZhbHVlIiwgInBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlIiwgInBhcnNlVmFsdWVFeHByZXNzaW9uIiwgIkNhc2VFbmRCdWlsZGVyIiwgIkV4cHJlc3Npb25XcmFwcGVyIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkpTT05QYXRoTGVnTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0eXBlIiwgInZhbHVlIiwgIkpTT05QYXRoQnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgImluZGV4IiwgIiNjcmVhdGVCdWlsZGVyV2l0aFBhdGhMZWciLCAia2V5IiwgImxlZ1R5cGUiLCAidmFsdWUiLCAiSlNPTlJlZmVyZW5jZU5vZGUiLCAiVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyIiwgIkpTT05QYXRoTm9kZSIsICJKU09OUGF0aExlZ05vZGUiLCAiSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlIiwgIlZhbHVlTm9kZSIsICJfVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyIiwgImFsaWFzIiwgIkFsaWFzZWRKU09OUGF0aEJ1aWxkZXIiLCAiI2pzb25QYXRoIiwgIiNhbGlhcyIsICJqc29uUGF0aCIsICJBbGlhc05vZGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIklkZW50aWZpZXJOb2RlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlR1cGxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ2YWx1ZXMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiU0lNUExFX0NPTFVNTl9EQVRBX1RZUEVTIiwgIkNPTFVNTl9EQVRBX1RZUEVfUkVHRVgiLCAiRGF0YVR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImRhdGFUeXBlIiwgImlzQ29sdW1uRGF0YVR5cGUiLCAiciIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJkYXRhVHlwZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNDb2x1bW5EYXRhVHlwZSIsICJEYXRhVHlwZU5vZGUiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQ2FzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZXhwcmVzc2lvbiIsICJkYXRhVHlwZSIsICJjcmVhdGVFeHByZXNzaW9uQnVpbGRlciIsICJleGVjdXRvciIsICJOT09QX1FVRVJZX0VYRUNVVE9SIiwgImJpbmFyeSIsICJsaHMiLCAib3AiLCAicmhzIiwgIkV4cHJlc3Npb25XcmFwcGVyIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24iLCAidW5hcnkiLCAiZXhwciIsICJwYXJzZVVuYXJ5T3BlcmF0aW9uIiwgImViIiwgInRhYmxlIiwgImNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciIsICJjcmVhdGVRdWVyeUlkIiwgIlNlbGVjdFF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICJyZWZlcmVuY2UiLCAiQ2FzZUJ1aWxkZXIiLCAiQ2FzZU5vZGUiLCAiaXNVbmRlZmluZWQiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIkpTT05QYXRoQnVpbGRlciIsICJwYXJzZUpTT05SZWZlcmVuY2UiLCAiSlNPTlBhdGhOb2RlIiwgInBhcnNlVGFibGUiLCAidmFsdWUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAidmFsdWVzIiwgIlR1cGxlTm9kZSIsICJwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSIsICJzdGFydCIsICJlbmQiLCAiQmluYXJ5T3BlcmF0aW9uTm9kZSIsICJPcGVyYXRvck5vZGUiLCAiQW5kTm9kZSIsICJleHBycyIsICJpc1JlYWRvbmx5QXJyYXkiLCAicGFyc2VGaWx0ZXJMaXN0IiwgInBhcnNlRmlsdGVyT2JqZWN0IiwgImFyZ3MiLCAibm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgIlBhcmVuc05vZGUiLCAiZGF0YVR5cGUiLCAiQ2FzdE5vZGUiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAic2NoZW1hIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiY3JlYXRlRnVuY3Rpb25Nb2R1bGUiLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAiXyIsICJwYXJzZUV4cHJlc3Npb24iLCAiZXhwIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJpc0Z1bmN0aW9uIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgInBhcnNlQWxpYXNlZEV4cHJlc3Npb24iLCAiaXNFeHByZXNzaW9uT3JGYWN0b3J5IiwgIm9iaiIsICJpc0V4cHJlc3Npb24iLCAiaXNBbGlhc2VkRXhwcmVzc2lvbiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJEeW5hbWljVGFibGVCdWlsZGVyIiwgIiN0YWJsZSIsICJ0YWJsZSIsICJhbGlhcyIsICJBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciIsICIjYWxpYXMiLCAiQWxpYXNOb2RlIiwgInBhcnNlVGFibGUiLCAiSWRlbnRpZmllck5vZGUiLCAiaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciIsICJvYmoiLCAiaXNPYmplY3QiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgImlzU3RyaW5nIiwgInBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0IiwgInRhYmxlIiwgImlzUmVhZG9ubHlBcnJheSIsICJpdCIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbiIsICJpc1N0cmluZyIsICJwYXJzZUFsaWFzZWRUYWJsZSIsICJpc0FsaWFzZWREeW5hbWljVGFibGVCdWlsZGVyIiwgInBhcnNlQWxpYXNlZEV4cHJlc3Npb24iLCAiZnJvbSIsICJBTElBU19TRVBBUkFUT1IiLCAiYWxpYXMiLCAidHJpbSIsICJBbGlhc05vZGUiLCAicGFyc2VUYWJsZSIsICJJZGVudGlmaWVyTm9kZSIsICJTQ0hFTUFfU0VQQVJBVE9SIiwgInNjaGVtYSIsICJUYWJsZU5vZGUiLCAic3RyIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkFkZENvbHVtbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkNvbHVtbkRlZmluaXRpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJkYXRhVHlwZSIsICJDb2x1bW5Ob2RlIiwgIm1vZGlmaWVyIiwgInByb3BzIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkRyb3BDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJDb2x1bW5Ob2RlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlJlbmFtZUNvbHVtbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgIm5ld0NvbHVtbiIsICJDb2x1bW5Ob2RlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkNoZWNrQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZXhwcmVzc2lvbiIsICJjb25zdHJhaW50TmFtZSIsICJJZGVudGlmaWVyTm9kZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TIiwgIlJlZmVyZW5jZXNOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlIiwgImNvbHVtbnMiLCAicmVmZXJlbmNlcyIsICJvbkRlbGV0ZSIsICJvblVwZGF0ZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAidmFsdWUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIlZhbHVlTm9kZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJHZW5lcmF0ZWROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInBhcmFtcyIsICJleHByZXNzaW9uIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkRlZmF1bHRWYWx1ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZGVmYXVsdFZhbHVlIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgInBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIiwgImFjdGlvbiIsICJPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TIiwgIkNvbHVtbkRlZmluaXRpb25CdWlsZGVyIiwgIl9Db2x1bW5EZWZpbml0aW9uQnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgIkNvbHVtbkRlZmluaXRpb25Ob2RlIiwgInJlZiIsICJyZWZlcmVuY2VzIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIlNlbGVjdEFsbE5vZGUiLCAiUmVmZXJlbmNlc05vZGUiLCAib25EZWxldGUiLCAicGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24iLCAib25VcGRhdGUiLCAidmFsdWUiLCAiRGVmYXVsdFZhbHVlTm9kZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAiZXhwcmVzc2lvbiIsICJDaGVja0NvbnN0cmFpbnROb2RlIiwgIkdlbmVyYXRlZE5vZGUiLCAibW9kaWZpZXIiLCAiZnVuYyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJNb2RpZnlDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJGb3JlaWduS2V5Q29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic291cmNlQ29sdW1ucyIsICJ0YXJnZXRUYWJsZSIsICJ0YXJnZXRDb2x1bW5zIiwgImNvbnN0cmFpbnROYW1lIiwgIlJlZmVyZW5jZXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgInByb3BzIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJfRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAib25EZWxldGUiLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgInBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIiwgIm9uVXBkYXRlIiwgImZ1bmMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQWRkQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uc3RyYWludCIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW5zIiwgImNvbnN0cmFpbnROYW1lIiwgIm51bGxzTm90RGlzdGluY3QiLCAiQ29sdW1uTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJEcm9wQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uc3RyYWludE5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAiZHJvcENvbnN0cmFpbnQiLCAicHJvcHMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQWx0ZXJDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJwcm9wIiwgInZhbHVlIiwgIkNvbHVtbk5vZGUiLCAiQWx0ZXJDb2x1bW5CdWlsZGVyIiwgIiNjb2x1bW4iLCAiY29sdW1uIiwgImRhdGFUeXBlIiwgIkFsdGVyZWRDb2x1bW5CdWlsZGVyIiwgIkFsdGVyQ29sdW1uTm9kZSIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJ2YWx1ZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAiZnVuYyIsICIjYWx0ZXJDb2x1bW5Ob2RlIiwgImFsdGVyQ29sdW1uTm9kZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJBbHRlclRhYmxlRXhlY3V0b3IiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIl9BbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAib25EZWxldGUiLCAib25VcGRhdGUiLCAiZnVuYyIsICJBbHRlclRhYmxlTm9kZSIsICJBZGRDb25zdHJhaW50Tm9kZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIiwgIl9BbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQWx0ZXJUYWJsZU5vZGUiLCAiRHJvcENvbnN0cmFpbnROb2RlIiwgImZ1bmMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbnMiLCAiY29uc3RyYWludE5hbWUiLCAiQ29sdW1uTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJBZGRJbmRleE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJjb2x1bW5zIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIiLCAiX0FsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJBbHRlclRhYmxlTm9kZSIsICJBZGRJbmRleE5vZGUiLCAiY29sdW1uIiwgInBhcnNlT3JkZXJlZENvbHVtbk5hbWUiLCAiY29sdW1ucyIsICJleHByZXNzaW9uIiwgImluZGV4VHlwZSIsICJSYXdOb2RlIiwgImZ1bmMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIiwgIl9VbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIiLCAiI25vZGUiLCAibm9kZSIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJmdW5jIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciIsICJfUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgImZ1bmMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQ2hlY2tDb25zdHJhaW50QnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgImZ1bmMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiUmVuYW1lQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib2xkTmFtZSIsICJuZXdOYW1lIiwgIklkZW50aWZpZXJOb2RlIiwgIkFsdGVyVGFibGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAibmV3VGFibGVOYW1lIiwgIkFsdGVyVGFibGVFeGVjdXRvciIsICJBbHRlclRhYmxlTm9kZSIsICJwYXJzZVRhYmxlIiwgIm5ld1NjaGVtYSIsICJJZGVudGlmaWVyTm9kZSIsICJjb2x1bW4iLCAiYWx0ZXJhdGlvbiIsICJidWlsZGVyIiwgIkFsdGVyQ29sdW1uQnVpbGRlciIsICJBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyIiwgIkRyb3BDb2x1bW5Ob2RlIiwgIm5ld0NvbHVtbiIsICJSZW5hbWVDb2x1bW5Ob2RlIiwgImNvbHVtbk5hbWUiLCAiZGF0YVR5cGUiLCAiYnVpbGQiLCAibm9vcCIsICJDb2x1bW5EZWZpbml0aW9uQnVpbGRlciIsICJDb2x1bW5EZWZpbml0aW9uTm9kZSIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJBZGRDb2x1bW5Ob2RlIiwgIk1vZGlmeUNvbHVtbk5vZGUiLCAiY29uc3RyYWludE5hbWUiLCAiY29sdW1ucyIsICJ1bmlxdWVDb25zdHJhaW50QnVpbGRlciIsICJVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIiLCAiVW5pcXVlQ29uc3RyYWludE5vZGUiLCAiQWRkQ29uc3RyYWludE5vZGUiLCAiY2hlY2tFeHByZXNzaW9uIiwgImNvbnN0cmFpbnRCdWlsZGVyIiwgIkNoZWNrQ29uc3RyYWludEJ1aWxkZXIiLCAiQ2hlY2tDb25zdHJhaW50Tm9kZSIsICJ0YXJnZXRUYWJsZSIsICJ0YXJnZXRDb2x1bW5zIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJGb3JlaWduS2V5Q29uc3RyYWludE5vZGUiLCAiQ29sdW1uTm9kZSIsICJBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIlByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciIsICJQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUiLCAiQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlciIsICJEcm9wQ29uc3RyYWludE5vZGUiLCAib2xkTmFtZSIsICJuZXdOYW1lIiwgIlJlbmFtZUNvbnN0cmFpbnROb2RlIiwgImluZGV4TmFtZSIsICJBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyIiwgIkFkZEluZGV4Tm9kZSIsICJEcm9wSW5kZXhOb2RlIiwgImZ1bmMiLCAiX0FsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAibm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIlZhbHVlTm9kZSIsICJDcmVhdGVJbmRleEJ1aWxkZXIiLCAiX0NyZWF0ZUluZGV4QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZUluZGV4Tm9kZSIsICJ0YWJsZSIsICJwYXJzZVRhYmxlIiwgImNvbHVtbiIsICJwYXJzZU9yZGVyZWRDb2x1bW5OYW1lIiwgImNvbHVtbnMiLCAiZXhwcmVzc2lvbiIsICJpbmRleFR5cGUiLCAiUmF3Tm9kZSIsICJhcmdzIiwgInRyYW5zZm9ybWVyIiwgIkltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIiLCAiUXVlcnlOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAiZnVuYyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJDcmVhdGVTY2hlbWFCdWlsZGVyIiwgIl9DcmVhdGVTY2hlbWFCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ3JlYXRlU2NoZW1hTm9kZSIsICJmdW5jIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgInBhcnNlT25Db21taXRBY3Rpb24iLCAiYWN0aW9uIiwgIk9OX0NPTU1JVF9BQ1RJT05TIiwgIkNyZWF0ZVRhYmxlQnVpbGRlciIsICJfQ3JlYXRlVGFibGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ3JlYXRlVGFibGVOb2RlIiwgIm9uQ29tbWl0IiwgInBhcnNlT25Db21taXRBY3Rpb24iLCAiY29sdW1uTmFtZSIsICJkYXRhVHlwZSIsICJidWlsZCIsICJub29wIiwgImNvbHVtbkJ1aWxkZXIiLCAiQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIiLCAiQ29sdW1uRGVmaW5pdGlvbk5vZGUiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAiY29uc3RyYWludE5hbWUiLCAiY29sdW1ucyIsICJjb25zdHJhaW50QnVpbGRlciIsICJQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgInVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIiwgIlVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJjaGVja0V4cHJlc3Npb24iLCAiQ2hlY2tDb25zdHJhaW50QnVpbGRlciIsICJDaGVja0NvbnN0cmFpbnROb2RlIiwgInRhcmdldFRhYmxlIiwgInRhcmdldENvbHVtbnMiLCAiYnVpbGRlciIsICJGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgIkNvbHVtbk5vZGUiLCAicGFyc2VUYWJsZSIsICJtb2RpZmllciIsICJleHByZXNzaW9uIiwgInBhcnNlRXhwcmVzc2lvbiIsICJmdW5jIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkRyb3BJbmRleEJ1aWxkZXIiLCAiX0Ryb3BJbmRleEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJ0YWJsZSIsICJEcm9wSW5kZXhOb2RlIiwgInBhcnNlVGFibGUiLCAiZnVuYyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJEcm9wU2NoZW1hQnVpbGRlciIsICJfRHJvcFNjaGVtYUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJEcm9wU2NoZW1hTm9kZSIsICJmdW5jIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkRyb3BUYWJsZUJ1aWxkZXIiLCAiX0Ryb3BUYWJsZUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJEcm9wVGFibGVOb2RlIiwgImZ1bmMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiQ3JlYXRlVmlld05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJjcmVhdGVWaWV3IiwgInBhcmFtcyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJJbW1lZGlhdGVWYWx1ZVBsdWdpbiIsICIjdHJhbnNmb3JtZXIiLCAiSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciIsICJhcmdzIiwgIkNyZWF0ZVZpZXdCdWlsZGVyIiwgIl9DcmVhdGVWaWV3QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZVZpZXdOb2RlIiwgImNvbHVtbnMiLCAicGFyc2VDb2x1bW5OYW1lIiwgInF1ZXJ5IiwgInF1ZXJ5Tm9kZSIsICJJbW1lZGlhdGVWYWx1ZVBsdWdpbiIsICJmdW5jIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkRyb3BWaWV3Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgImRyb3BWaWV3IiwgInBhcmFtcyIsICJEcm9wVmlld0J1aWxkZXIiLCAiX0Ryb3BWaWV3QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkRyb3BWaWV3Tm9kZSIsICJmdW5jIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkNyZWF0ZVR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiY3JlYXRlVHlwZSIsICJ2YWx1ZXMiLCAiVmFsdWVMaXN0Tm9kZSIsICJWYWx1ZU5vZGUiLCAiQ3JlYXRlVHlwZUJ1aWxkZXIiLCAiX0NyZWF0ZVR5cGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAidmFsdWVzIiwgIkNyZWF0ZVR5cGVOb2RlIiwgImZ1bmMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiRHJvcFR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiZHJvcFR5cGUiLCAicGFyYW1zIiwgIkRyb3BUeXBlQnVpbGRlciIsICJfRHJvcFR5cGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiRHJvcFR5cGVOb2RlIiwgImZ1bmMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAicGFyc2VTY2hlbWFibGVJZGVudGlmaWVyIiwgImlkIiwgIlNDSEVNQV9TRVBBUkFUT1IiLCAicGFydHMiLCAidHJpbSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJzdHIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiY3JlYXRlVmlldyIsICJwYXJhbXMiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIiwgIl9SZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUiLCAiZnVuYyIsICJTY2hlbWFNb2R1bGUiLCAiX1NjaGVtYU1vZHVsZSIsICIjZXhlY3V0b3IiLCAiZXhlY3V0b3IiLCAidGFibGUiLCAiQ3JlYXRlVGFibGVCdWlsZGVyIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiQ3JlYXRlVGFibGVOb2RlIiwgInBhcnNlVGFibGUiLCAiRHJvcFRhYmxlQnVpbGRlciIsICJEcm9wVGFibGVOb2RlIiwgImluZGV4TmFtZSIsICJDcmVhdGVJbmRleEJ1aWxkZXIiLCAiQ3JlYXRlSW5kZXhOb2RlIiwgIkRyb3BJbmRleEJ1aWxkZXIiLCAiRHJvcEluZGV4Tm9kZSIsICJzY2hlbWEiLCAiQ3JlYXRlU2NoZW1hQnVpbGRlciIsICJDcmVhdGVTY2hlbWFOb2RlIiwgIkRyb3BTY2hlbWFCdWlsZGVyIiwgIkRyb3BTY2hlbWFOb2RlIiwgIkFsdGVyVGFibGVCdWlsZGVyIiwgIkFsdGVyVGFibGVOb2RlIiwgInZpZXdOYW1lIiwgIkNyZWF0ZVZpZXdCdWlsZGVyIiwgIkNyZWF0ZVZpZXdOb2RlIiwgIlJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlciIsICJSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUiLCAiRHJvcFZpZXdCdWlsZGVyIiwgIkRyb3BWaWV3Tm9kZSIsICJ0eXBlTmFtZSIsICJDcmVhdGVUeXBlQnVpbGRlciIsICJDcmVhdGVUeXBlTm9kZSIsICJwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIiLCAiRHJvcFR5cGVCdWlsZGVyIiwgIkRyb3BUeXBlTm9kZSIsICJwbHVnaW4iLCAiV2l0aFNjaGVtYVBsdWdpbiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJEeW5hbWljTW9kdWxlIiwgInJlZmVyZW5jZSIsICJEeW5hbWljUmVmZXJlbmNlQnVpbGRlciIsICJ0YWJsZSIsICJEeW5hbWljVGFibGVCdWlsZGVyIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIkRlZmF1bHRDb25uZWN0aW9uUHJvdmlkZXIiLCAiI2RyaXZlciIsICJkcml2ZXIiLCAiY29uc3VtZXIiLCAiY29ubmVjdGlvbiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJEZWZhdWx0UXVlcnlFeGVjdXRvciIsICJfRGVmYXVsdFF1ZXJ5RXhlY3V0b3IiLCAiUXVlcnlFeGVjdXRvckJhc2UiLCAiI2NvbXBpbGVyIiwgIiNhZGFwdGVyIiwgIiNjb25uZWN0aW9uUHJvdmlkZXIiLCAiY29tcGlsZXIiLCAiYWRhcHRlciIsICJjb25uZWN0aW9uUHJvdmlkZXIiLCAicGx1Z2lucyIsICJub2RlIiwgInF1ZXJ5SWQiLCAiY29uc3VtZXIiLCAicGx1Z2luIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgInBlcmZvcm1hbmNlTm93IiwgImlzRnVuY3Rpb24iLCAiUnVudGltZURyaXZlciIsICIjZHJpdmVyIiwgIiNsb2ciLCAiI2luaXRQcm9taXNlIiwgIiNpbml0RG9uZSIsICIjZGVzdHJveVByb21pc2UiLCAiI2Nvbm5lY3Rpb25zIiwgImRyaXZlciIsICJsb2ciLCAiZXJyIiwgImNvbm5lY3Rpb24iLCAiI25lZWRzTG9nZ2luZyIsICIjYWRkTG9nZ2luZyIsICJzZXR0aW5ncyIsICJzYXZlcG9pbnROYW1lIiwgImNvbXBpbGVRdWVyeSIsICJleGVjdXRlUXVlcnkiLCAic3RyZWFtUXVlcnkiLCAiZGlzIiwgImNvbXBpbGVkUXVlcnkiLCAiY2F1Z2h0RXJyb3IiLCAic3RhcnRUaW1lIiwgInBlcmZvcm1hbmNlTm93IiwgImVycm9yIiwgIiNsb2dFcnJvciIsICIjbG9nUXVlcnkiLCAiY2h1bmtTaXplIiwgInJlc3VsdCIsICIjY2FsY3VsYXRlRHVyYXRpb25NaWxsaXMiLCAiaXNTdHJlYW0iLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaWdub3JlRXJyb3IiLCAiU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyIiwgIiNjb25uZWN0aW9uIiwgIiNydW5uaW5nUHJvbWlzZSIsICJjb25uZWN0aW9uIiwgImNvbnN1bWVyIiwgIiNydW4iLCAicnVubmVyIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlRSQU5TQUNUSU9OX0FDQ0VTU19NT0RFUyIsICJUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTIiwgInZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyIsICJzZXR0aW5ncyIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJMT0dfTEVWRUxTIiwgImZyZWV6ZSIsICJMb2ciLCAiI2xldmVscyIsICIjbG9nZ2VyIiwgImNvbmZpZyIsICJpc0Z1bmN0aW9uIiwgImRlZmF1bHRMb2dnZXIiLCAibGV2ZWwiLCAiZ2V0RXZlbnQiLCAiZXZlbnQiLCAicHJlZml4IiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImlzQ29tcGlsYWJsZSIsICJ2YWx1ZSIsICJpc09iamVjdCIsICJpc0Z1bmN0aW9uIiwgIkt5c2VseSIsICJfS3lzZWx5IiwgIlF1ZXJ5Q3JlYXRvciIsICIjcHJvcHMiLCAiYXJncyIsICJzdXBlclByb3BzIiwgInByb3BzIiwgImlzS3lzZWx5UHJvcHMiLCAiZGlhbGVjdCIsICJkcml2ZXIiLCAiY29tcGlsZXIiLCAiYWRhcHRlciIsICJsb2ciLCAiTG9nIiwgInJ1bnRpbWVEcml2ZXIiLCAiUnVudGltZURyaXZlciIsICJjb25uZWN0aW9uUHJvdmlkZXIiLCAiRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciIsICJleGVjdXRvciIsICJEZWZhdWx0UXVlcnlFeGVjdXRvciIsICJmcmVlemUiLCAiU2NoZW1hTW9kdWxlIiwgIkR5bmFtaWNNb2R1bGUiLCAidmFsdWUiLCAiQ2FzZUJ1aWxkZXIiLCAiQ2FzZU5vZGUiLCAiaXNVbmRlZmluZWQiLCAicGFyc2VFeHByZXNzaW9uIiwgImNyZWF0ZUZ1bmN0aW9uTW9kdWxlIiwgIlRyYW5zYWN0aW9uQnVpbGRlciIsICJDb250cm9sbGVkVHJhbnNhY3Rpb25CdWlsZGVyIiwgIkNvbm5lY3Rpb25CdWlsZGVyIiwgInBsdWdpbiIsICJzY2hlbWEiLCAiV2l0aFNjaGVtYVBsdWdpbiIsICJxdWVyeSIsICJxdWVyeUlkIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiY29tcGlsZWRRdWVyeSIsICJpc0NvbXBpbGFibGUiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgIm9iaiIsICJpc09iamVjdCIsICJjYWxsYmFjayIsICJjb25uZWN0aW9uIiwgIlNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlciIsICJkYiIsICJfVHJhbnNhY3Rpb25CdWlsZGVyIiwgImFjY2Vzc01vZGUiLCAiaXNvbGF0aW9uTGV2ZWwiLCAia3lzZWx5UHJvcHMiLCAic2V0dGluZ3MiLCAidmFsaWRhdGVUcmFuc2FjdGlvblNldHRpbmdzIiwgInRyYW5zYWN0aW9uIiwgInJlc3VsdCIsICJlcnJvciIsICJfQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlciIsICJwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24iLCAiQ29udHJvbGxlZFRyYW5zYWN0aW9uIiwgIl9Db250cm9sbGVkVHJhbnNhY3Rpb24iLCAiI2NvbXBpbGVRdWVyeSIsICIjc3RhdGUiLCAic3RhdGUiLCAiTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IiLCAidHJhbnNhY3Rpb25Qcm9wcyIsICJub2RlIiwgImFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayIsICJDb21tYW5kIiwgInNhdmVwb2ludE5hbWUiLCAiI2NiIiwgImNiIiwgIl9Ob3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvciIsICIjZXhlY3V0b3IiLCAiY29uc3VtZXIiLCAiY2h1bmtTaXplIiwgInBsdWdpbnMiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiRHVtbXlEcml2ZXIiLCAiRHVtbXlDb25uZWN0aW9uIiwgImdldEJ1aWxkZXIiLCAicmVxdWlyZW1lbnRzIiwgIkt5c2VseSIsICJEdW1teURyaXZlciIsICJJbW1lZGlhdGVWYWx1ZVBsdWdpbiIsICIjdHJhbnNmb3JtZXIiLCAiSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciIsICJhcmdzIiwgIk9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciIsICJub2RlIiwgIlZhbHVlTGlzdE5vZGUiLCAiVmFsdWVOb2RlIiwgImNvbXBpbGUiLCAiY29tcGlsZWFibGUiLCAiY29tcGlsZWRRdWVyeSIsICJhcHBseUluZmVycmVkUm93RmlsdGVycyIsICJyb3dzIiwgImNvbHVtbnMiLCAicm93RmlsdGVycyIsICJpbmZlclJvd0ZpbHRlcnMiLCAicWIiLCAiZWIiLCAicm93RmlsdGVyIiwgImNvbHVtbk5hbWUiLCAidmFsdWUiLCAiaW5mZXJSb3dGaWx0ZXIiLCAicm93IiwgInBrIiwgImNvbHVtbiIsICJpc0luUHJpbWFyeUtleSJdCn0K