@prisma/studio-core 0.7.0 → 0.8.0
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.
- package/dist/chunk-32BUC7NR.js +10 -0
- package/dist/chunk-3KCOUVOV.js +10 -0
- package/dist/chunk-A6CVKSUD.js +10 -0
- package/dist/chunk-M7E5UEO3.js +10 -0
- package/dist/chunk-O6ZAHVDF.js +10 -0
- package/dist/chunk-SXTJF4PD.js +10 -0
- package/dist/chunk-ZUEQ555M.js +10 -0
- package/dist/data/accelerate/index.d.cts +1 -1
- package/dist/data/accelerate/index.d.ts +1 -1
- package/dist/data/bff/index.cjs +2 -2
- package/dist/data/bff/index.d.cts +15 -3
- package/dist/data/bff/index.d.ts +15 -3
- package/dist/data/bff/index.js +2 -2
- package/dist/data/index.d.cts +1 -1
- package/dist/data/index.d.ts +1 -1
- package/dist/data/index.js +1 -1
- package/dist/data/mysql-core/index.cjs +3 -0
- package/dist/data/mysql-core/index.d.cts +176 -0
- package/dist/data/mysql-core/index.d.ts +176 -0
- package/dist/data/mysql-core/index.js +11 -0
- package/dist/data/mysql2/index.cjs +2 -0
- package/dist/data/mysql2/index.d.cts +7 -0
- package/dist/data/mysql2/index.d.ts +7 -0
- package/dist/data/mysql2/index.js +10 -0
- package/dist/data/node-sqlite/index.cjs +2 -2
- package/dist/data/node-sqlite/index.d.cts +2 -3
- package/dist/data/node-sqlite/index.d.ts +2 -3
- package/dist/data/node-sqlite/index.js +2 -2
- package/dist/data/pglite/index.cjs +2 -2
- package/dist/data/pglite/index.d.cts +1 -1
- package/dist/data/pglite/index.d.ts +1 -1
- package/dist/data/pglite/index.js +2 -2
- package/dist/data/postgres-core/index.cjs +2 -2
- package/dist/data/postgres-core/index.d.cts +37 -37
- package/dist/data/postgres-core/index.d.ts +37 -37
- package/dist/data/postgres-core/index.js +1 -1
- package/dist/data/postgresjs/index.cjs +2 -2
- package/dist/data/postgresjs/index.d.cts +3 -14
- package/dist/data/postgresjs/index.d.ts +3 -14
- package/dist/data/postgresjs/index.js +2 -2
- package/dist/data/ppg/index.d.cts +1 -1
- package/dist/data/ppg/index.d.ts +1 -1
- package/dist/data/sqlite-core/index.cjs +2 -2
- package/dist/data/sqlite-core/index.d.cts +25 -25
- package/dist/data/sqlite-core/index.d.ts +25 -25
- package/dist/data/sqlite-core/index.js +2 -2
- package/dist/{index-2horhMcs.d.cts → index-BhPjNuvP.d.cts} +10 -6
- package/dist/{index-2horhMcs.d.ts → index-BhPjNuvP.d.ts} +10 -6
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/ui/index.cjs +1 -1
- package/dist/ui/index.d.cts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +2 -2
- package/package.json +22 -1
- package/dist/chunk-AHIV4VYN.js +0 -10
- package/dist/chunk-CTJRZ7VA.js +0 -10
- package/dist/chunk-NDYVVFWW.js +0 -10
- package/dist/chunk-OTK4ZF2W.js +0 -10
- package/dist/chunk-WHLVNWIR.js +0 -10
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";var hi=Object.defineProperty;var Qn=Object.getOwnPropertyDescriptor;var Pn=Object.getOwnPropertyNames;var Mn=Object.prototype.hasOwnProperty;var Fn=(t,e)=>{for(var r in e)hi(t,r,{get:e[r],enumerable:!0})},zn=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Pn(e))!Mn.call(t,n)&&n!==r&&hi(t,n,{get:()=>e[n],enumerable:!(o=Qn(e,n))||o.enumerable});return t};var Un=t=>zn(hi({},"__esModule",{value:!0}),t);var Bs={};Fn(Bs,{createMySQLAdapter:()=>ks,getCancelQuery:()=>Is,getDeleteQuery:()=>No,getInsertQuery:()=>Zt,getInsertRefetchQuery:()=>di,getSelectQuery:()=>xo,getTablesQuery:()=>bo,getTimezoneQuery:()=>vo,getUpdateQuery:()=>wo,getUpdateRefetchQuery:()=>yo,mockIntrospect:()=>Rs,mockSelectQuery:()=>Ts,mockTablesQuery:()=>Co,mockTimezoneQuery:()=>Eo});module.exports=Un(Bs);function R(t){let{error:e,query:r}=t,o=e;return o.query=r,[o]}function _(t){return typeof t>"u"||t===void 0}function E(t){return typeof t=="string"}function Qe(t){return typeof t=="number"}function Ke(t){return typeof t=="boolean"}function it(t){return t===null}function So(t){return t instanceof Date}function ot(t){return typeof t=="bigint"}function T(t){return typeof t=="function"}function M(t){return typeof t=="object"&&t!==null}function i(t){return Object.freeze(t)}function Qt(t){return V(t)?t:[t]}function V(t){return Array.isArray(t)}function j(t){return t}var f=i({is(t){return t.kind==="AlterTableNode"},create(t){return i({kind:"AlterTableNode",table:t})},cloneWithTableProps(t,e){return i({...t,...e})},cloneWithColumnAlteration(t,e){return i({...t,columnAlterations:t.columnAlterations?[...t.columnAlterations,e]:[e]})}});var d=i({is(t){return t.kind==="IdentifierNode"},create(t){return i({kind:"IdentifierNode",name:t})}});var de=i({is(t){return t.kind==="CreateIndexNode"},create(t){return i({kind:"CreateIndexNode",name:d.create(t)})},cloneWith(t,e){return i({...t,...e})},cloneWithColumns(t,e){return i({...t,columns:[...t.columns||[],...e]})}});var er=i({is(t){return t.kind==="CreateSchemaNode"},create(t,e){return i({kind:"CreateSchemaNode",schema:d.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var Ro=["preserve rows","delete rows","drop"],J=i({is(t){return t.kind==="CreateTableNode"},create(t){return i({kind:"CreateTableNode",table:t,columns:i([])})},cloneWithColumn(t,e){return i({...t,columns:i([...t.columns,e])})},cloneWithConstraint(t,e){return i({...t,constraints:t.constraints?i([...t.constraints,e]):i([e])})},cloneWithFrontModifier(t,e){return i({...t,frontModifiers:t.frontModifiers?i([...t.frontModifiers,e]):i([e])})},cloneWithEndModifier(t,e){return i({...t,endModifiers:t.endModifiers?i([...t.endModifiers,e]):i([e])})},cloneWith(t,e){return i({...t,...e})}});var $=i({is(t){return t.kind==="SchemableIdentifierNode"},create(t){return i({kind:"SchemableIdentifierNode",identifier:d.create(t)})},createWithSchema(t,e){return i({kind:"SchemableIdentifierNode",schema:d.create(t),identifier:d.create(e)})}});var Pe=i({is(t){return t.kind==="DropIndexNode"},create(t,e){return i({kind:"DropIndexNode",name:$.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var Pt=i({is(t){return t.kind==="DropSchemaNode"},create(t,e){return i({kind:"DropSchemaNode",schema:d.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var Mt=i({is(t){return t.kind==="DropTableNode"},create(t,e){return i({kind:"DropTableNode",table:t,...e})},cloneWith(t,e){return i({...t,...e})}});var B=i({is(t){return t.kind==="AliasNode"},create(t,e){return i({kind:"AliasNode",node:t,alias:e})}});var K=i({is(t){return t.kind==="TableNode"},create(t){return i({kind:"TableNode",table:$.create(t)})},createWithSchema(t,e){return i({kind:"TableNode",table:$.createWithSchema(t,e)})}});function C(t){return M(t)&&T(t.toOperationNode)}function tr(t){return M(t)&&"expressionType"in t&&C(t)}function Io(t){return M(t)&&"expression"in t&&E(t.alias)&&C(t)}var we=i({is(t){return t.kind==="SelectModifierNode"},create(t,e){return i({kind:"SelectModifierNode",modifier:t,of:e})},createWithExpression(t){return i({kind:"SelectModifierNode",rawModifier:t})}});var X=i({is(t){return t.kind==="AndNode"},create(t,e){return i({kind:"AndNode",left:t,right:e})}});var ce=i({is(t){return t.kind==="OrNode"},create(t,e){return i({kind:"OrNode",left:t,right:e})}});var rr=i({is(t){return t.kind==="OnNode"},create(t){return i({kind:"OnNode",on:t})},cloneWithOperation(t,e,r){return i({...t,on:e==="And"?X.create(t.on,r):ce.create(t.on,r)})}});var me=i({is(t){return t.kind==="JoinNode"},create(t,e){return i({kind:"JoinNode",joinType:t,table:e,on:void 0})},createWithOn(t,e,r){return i({kind:"JoinNode",joinType:t,table:e,on:rr.create(r)})},cloneWithOn(t,e){return i({...t,on:t.on?rr.cloneWithOperation(t.on,"And",e):rr.create(e)})}});var Me=i({is(t){return t.kind==="BinaryOperationNode"},create(t,e,r){return i({kind:"BinaryOperationNode",leftOperand:t,operator:e,rightOperand:r})}});var Vn=["=","==","!=","<>",">",">=","<","<=","in","not in","is","is not","like","not like","match","ilike","not ilike","@>","<@","^@","&&","?","?&","?|","!<","!>","<=>","!~","~","~*","!~*","@@","@@@","!!","<->","regexp","is distinct from","is not distinct from"],Jn=["+","-","*","/","%","^","&","|","#","<<",">>"],Bo=["->","->>"],$n=[...Vn,...Jn,"&&","||"],jn=["exists","not exists"],Kn=["not","-",...jn],qo=[...$n,...Bo,...Kn,"between","between symmetric"],ee=i({is(t){return t.kind==="OperatorNode"},create(t){return i({kind:"OperatorNode",operator:t})}});function li(t){return E(t)&&Bo.includes(t)}var m=i({is(t){return t.kind==="ColumnNode"},create(t){return i({kind:"ColumnNode",column:d.create(t)})}});var nt=i({is(t){return t.kind==="SelectAllNode"},create(){return i({kind:"SelectAllNode"})}});var We=i({is(t){return t.kind==="ReferenceNode"},create(t,e){return i({kind:"ReferenceNode",table:e,column:t})},createSelectAll(t){return i({kind:"ReferenceNode",table:t,column:nt.create()})}});var ir=class{#e;get dynamicReference(){return this.#e}get refType(){}constructor(e){this.#e=e}toOperationNode(){return fi(this.#e)}};function or(t){return M(t)&&C(t)&&E(t.dynamicReference)}var he=i({is(t){return t.kind==="OrderByItemNode"},create(t,e){return i({kind:"OrderByItemNode",orderBy:t,direction:e})},cloneWith(t,e){return i({...t,...e})}});var g=i({is(t){return t.kind==="RawNode"},create(t,e){return i({kind:"RawNode",sqlFragments:i(t),parameters:i(e)})},createWithSql(t){return g.create([t],[])},createWithChild(t){return g.create(["",""],[t])},createWithChildren(t){return g.create(new Array(t.length+1).fill(""),t)}});var Do={is(t){return t.kind==="CollateNode"},create(t){return i({kind:"CollateNode",collation:d.create(t)})}};var nr=class t{#e;constructor(e){this.#e=i(e)}desc(){return new t({node:he.cloneWith(this.#e.node,{direction:g.createWithSql("desc")})})}asc(){return new t({node:he.cloneWith(this.#e.node,{direction:g.createWithSql("asc")})})}nullsLast(){return new t({node:he.cloneWith(this.#e.node,{nulls:"last"})})}nullsFirst(){return new t({node:he.cloneWith(this.#e.node,{nulls:"first"})})}collate(e){return new t({node:he.cloneWith(this.#e.node,{collation:Do.create(e)})})}toOperationNode(){return this.#e.node}};var Lo=new Set;function ge(t){Lo.has(t)||(Lo.add(t),console.log(t))}function yi(t){return t==="asc"||t==="desc"}function re(t){if(t.length===2)return[Ni(t[0],t[1])];if(t.length===1){let[e]=t;return Array.isArray(e)?(ge("orderBy(array) is deprecated, use multiple orderBy calls instead."),e.map(r=>Ni(r))):[Ni(e)]}throw new Error(`Invalid number of arguments at order by! expected 1-2, received ${t.length}`)}function Ni(t,e){let r=Gn(t);if(he.is(r)){if(e)throw new Error("Cannot specify direction twice!");return r}return Qo(r,e)}function Gn(t){if(ke(t))return Z(t);if(or(t))return t.toOperationNode();let[e,r]=t.split(" ");return r?(ge("`orderBy('column asc')` is deprecated. Use `orderBy('column', 'asc')` instead."),Qo(te(e),r)):te(t)}function Qo(t,e){if(typeof e=="string"){if(!yi(e))throw new Error(`Invalid order by direction: ${e}`);return he.create(t,g.createWithSql(e))}if(tr(e))return ge("`orderBy(..., expr)` is deprecated. Use `orderBy(..., 'asc')` or `orderBy(..., (ob) => ...)` instead."),he.create(t,e.toOperationNode());let r=he.create(t);return e?e(new nr({node:r})).toOperationNode():r}var st=i({is(t){return t.kind==="JSONReferenceNode"},create(t,e){return i({kind:"JSONReferenceNode",reference:t,traversal:e})},cloneWithTraversal(t,e){return i({...t,traversal:e})}});var sr=i({is(t){return t.kind==="JSONOperatorChainNode"},create(t){return i({kind:"JSONOperatorChainNode",operator:t,values:i([])})},cloneWithValue(t,e){return i({...t,values:i([...t.values,e])})}});var Fe=i({is(t){return t.kind==="JSONPathNode"},create(t){return i({kind:"JSONPathNode",inOperator:t,pathLegs:i([])})},cloneWithLeg(t,e){return i({...t,pathLegs:i([...t.pathLegs,e])})}});function fi(t){return E(t)?te(t):t.toOperationNode()}function Se(t){return V(t)?t.map(e=>F(e)):[F(t)]}function F(t){return ke(t)?Z(t):fi(t)}function Po(t,e){let r=te(t);if(li(e))return st.create(r,sr.create(ee.create(e)));let o=e.slice(0,-1);if(li(o))return st.create(r,Fe.create(ee.create(o)));throw new Error(`Invalid JSON operator: ${e}`)}function te(t){let e=".";if(!t.includes(e))return We.create(m.create(t));let r=t.split(e).map(wi);if(r.length===3)return Yn(r);if(r.length===2)return Hn(r);throw new Error(`invalid column reference ${t}`)}function Mo(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(wi);return B.create(te(r),d.create(o))}else return te(t)}function xi(t){return m.create(t)}function at(t){let e=" ";if(t.includes(e)){let[r,o]=t.split(e).map(wi);if(!yi(o))throw new Error(`invalid order direction "${o}" next to "${r}"`);return re([r,o])[0]}else return xi(t)}function Yn(t){let[e,r,o]=t;return We.create(m.create(o),K.createWithSchema(e,r))}function Hn(t){let[e,r]=t;return We.create(m.create(r),K.create(e))}function wi(t){return t.trim()}var ar=i({is(t){return t.kind==="PrimitiveValueListNode"},create(t){return i({kind:"PrimitiveValueListNode",values:i([...t])})}});var Oe=i({is(t){return t.kind==="ValueListNode"},create(t){return i({kind:"ValueListNode",values:i(t)})}});var W=i({is(t){return t.kind==="ValueNode"},create(t){return i({kind:"ValueNode",value:t})},createImmediate(t){return i({kind:"ValueNode",value:t,immediate:!0})}});function Fo(t){return V(t)?Xn(t):O(t)}function O(t){return ke(t)?Z(t):W.create(t)}function ur(t){return Qe(t)||Ke(t)||it(t)}function Ft(t){if(!ur(t))throw new Error(`unsafe immediate value ${JSON.stringify(t)}`);return W.createImmediate(t)}function Xn(t){return t.some(ke)?Oe.create(t.map(e=>O(e))):ar.create(t)}var ie=i({is(t){return t.kind==="ParensNode"},create(t){return i({kind:"ParensNode",node:t})}});function b(t){if(t.length===3)return pr(t[0],t[1],t[2]);if(t.length===1)return O(t[0]);throw new Error(`invalid arguments: ${JSON.stringify(t)}`)}function pr(t,e,r){return Zn(e)&&Uo(r)?Me.create(F(t),gi(e),W.createImmediate(r)):Me.create(F(t),gi(e),Fo(r))}function Q(t,e,r){return Me.create(F(t),gi(e),F(r))}function Oi(t,e){return ut(Object.entries(t).filter(([,r])=>!_(r)).map(([r,o])=>pr(r,Uo(o)?"is":"=",o)),e)}function ut(t,e,r=!0){let o=e==="and"?X.create:ce.create;if(t.length===0)return Me.create(W.createImmediate(1),ee.create("="),W.createImmediate(e==="and"?1:0));let n=zo(t[0]);for(let a=1;a<t.length;++a)n=o(n,zo(t[a]));return t.length>1&&r?ie.create(n):n}function Zn(t){return t==="is"||t==="is not"}function Uo(t){return it(t)||Ke(t)}function gi(t){if(E(t)&&qo.includes(t))return ee.create(t);if(C(t))return t.toOperationNode();throw new Error(`invalid operator ${JSON.stringify(t)}`)}function zo(t){return C(t)?t.toOperationNode():t}var Re=i({is(t){return t.kind==="OrderByNode"},create(t){return i({kind:"OrderByNode",items:i([...t])})},cloneWithItems(t,e){return i({...t,items:i([...t.items,...e])})}});var bi=i({is(t){return t.kind==="PartitionByNode"},create(t){return i({kind:"PartitionByNode",items:i(t)})},cloneWithItems(t,e){return i({...t,items:i([...t.items,...e])})}});var zt=i({is(t){return t.kind==="OverNode"},create(){return i({kind:"OverNode"})},cloneWithOrderByItems(t,e){return i({...t,orderBy:t.orderBy?Re.cloneWithItems(t.orderBy,e):Re.create(e)})},cloneWithPartitionByItems(t,e){return i({...t,partitionBy:t.partitionBy?bi.cloneWithItems(t.partitionBy,e):bi.create(e)})}});var Ge=i({is(t){return t.kind==="FromNode"},create(t){return i({kind:"FromNode",froms:i(t)})},cloneWithFroms(t,e){return i({...t,froms:i([...t.froms,...e])})}});var Ci=i({is(t){return t.kind==="GroupByNode"},create(t){return i({kind:"GroupByNode",items:i(t)})},cloneWithItems(t,e){return i({...t,items:i([...t.items,...e])})}});var vi=i({is(t){return t.kind==="HavingNode"},create(t){return i({kind:"HavingNode",having:t})},cloneWithOperation(t,e,r){return i({...t,having:e==="And"?X.create(t.having,r):ce.create(t.having,r)})}});var k=i({is(t){return t.kind==="InsertQueryNode"},create(t,e,r){return i({kind:"InsertQueryNode",into:t,...e&&{with:e},replace:r})},createWithoutInto(){return i({kind:"InsertQueryNode"})},cloneWith(t,e){return i({...t,...e})}});var dr=i({is(t){return t.kind==="ListNode"},create(t){return i({kind:"ListNode",items:i(t)})}});var be=i({is(t){return t.kind==="UpdateQueryNode"},create(t,e){return i({kind:"UpdateQueryNode",table:t.length===1?t[0]:dr.create(t),...e&&{with:e}})},createWithoutTable(){return i({kind:"UpdateQueryNode"})},cloneWithFromItems(t,e){return i({...t,from:t.from?Ge.cloneWithFroms(t.from,e):Ge.create(e)})},cloneWithUpdates(t,e){return i({...t,updates:t.updates?i([...t.updates,...e]):e})},cloneWithLimit(t,e){return i({...t,limit:e})}});var Ei=i({is(t){return t.kind==="UsingNode"},create(t){return i({kind:"UsingNode",tables:i(t)})},cloneWithTables(t,e){return i({...t,tables:i([...t.tables,...e])})}});var ze=i({is(t){return t.kind==="DeleteQueryNode"},create(t,e){return i({kind:"DeleteQueryNode",from:Ge.create(t),...e&&{with:e}})},cloneWithOrderByItems:(t,e)=>u.cloneWithOrderByItems(t,e),cloneWithoutOrderBy:t=>u.cloneWithoutOrderBy(t),cloneWithLimit(t,e){return i({...t,limit:e})},cloneWithoutLimit(t){return i({...t,limit:void 0})},cloneWithUsing(t,e){return i({...t,using:t.using!==void 0?Ei.cloneWithTables(t.using,e):Ei.create(e)})}});var z=i({is(t){return t.kind==="WhereNode"},create(t){return i({kind:"WhereNode",where:t})},cloneWithOperation(t,e,r){return i({...t,where:e==="And"?X.create(t.where,r):ce.create(t.where,r)})}});var Ai=i({is(t){return t.kind==="ReturningNode"},create(t){return i({kind:"ReturningNode",selections:i(t)})},cloneWithSelections(t,e){return i({...t,selections:t.selections?i([...t.selections,...e]):i(e)})}});var Vo=i({is(t){return t.kind==="ExplainNode"},create(t,e){return i({kind:"ExplainNode",format:t,options:e})}});var ae=i({is(t){return t.kind==="WhenNode"},create(t){return i({kind:"WhenNode",condition:t})},cloneWithResult(t,e){return i({...t,result:e})}});var oe=i({is(t){return t.kind==="MergeQueryNode"},create(t,e){return i({kind:"MergeQueryNode",into:t,...e&&{with:e}})},cloneWithUsing(t,e){return i({...t,using:e})},cloneWithWhen(t,e){return i({...t,whens:t.whens?i([...t.whens,e]):i([e])})},cloneWithThen(t,e){return i({...t,whens:t.whens?i([...t.whens.slice(0,-1),ae.cloneWithResult(t.whens[t.whens.length-1],e)]):void 0})}});var Ti=i({is(t){return t.kind==="OutputNode"},create(t){return i({kind:"OutputNode",selections:i(t)})},cloneWithSelections(t,e){return i({...t,selections:t.selections?i([...t.selections,...e]):i(e)})}});var u=i({is(t){return w.is(t)||k.is(t)||be.is(t)||ze.is(t)||oe.is(t)},cloneWithEndModifier(t,e){return i({...t,endModifiers:t.endModifiers?i([...t.endModifiers,e]):i([e])})},cloneWithWhere(t,e){return i({...t,where:t.where?z.cloneWithOperation(t.where,"And",e):z.create(e)})},cloneWithJoin(t,e){return i({...t,joins:t.joins?i([...t.joins,e]):i([e])})},cloneWithReturning(t,e){return i({...t,returning:t.returning?Ai.cloneWithSelections(t.returning,e):Ai.create(e)})},cloneWithoutReturning(t){return i({...t,returning:void 0})},cloneWithoutWhere(t){return i({...t,where:void 0})},cloneWithExplain(t,e,r){return i({...t,explain:Vo.create(e,r?.toOperationNode())})},cloneWithTop(t,e){return i({...t,top:e})},cloneWithOutput(t,e){return i({...t,output:t.output?Ti.cloneWithSelections(t.output,e):Ti.create(e)})},cloneWithOrderByItems(t,e){return i({...t,orderBy:t.orderBy?Re.cloneWithItems(t.orderBy,e):Re.create(e)})},cloneWithoutOrderBy(t){return i({...t,orderBy:void 0})}});var w=i({is(t){return t.kind==="SelectQueryNode"},create(t){return i({kind:"SelectQueryNode",...t&&{with:t}})},createFrom(t,e){return i({kind:"SelectQueryNode",from:Ge.create(t),...e&&{with:e}})},cloneWithSelections(t,e){return i({...t,selections:t.selections?i([...t.selections,...e]):i(e)})},cloneWithDistinctOn(t,e){return i({...t,distinctOn:t.distinctOn?i([...t.distinctOn,...e]):i(e)})},cloneWithFrontModifier(t,e){return i({...t,frontModifiers:t.frontModifiers?i([...t.frontModifiers,e]):i([e])})},cloneWithOrderByItems:(t,e)=>u.cloneWithOrderByItems(t,e),cloneWithGroupByItems(t,e){return i({...t,groupBy:t.groupBy?Ci.cloneWithItems(t.groupBy,e):Ci.create(e)})},cloneWithLimit(t,e){return i({...t,limit:e})},cloneWithOffset(t,e){return i({...t,offset:e})},cloneWithFetch(t,e){return i({...t,fetch:e})},cloneWithHaving(t,e){return i({...t,having:t.having?vi.cloneWithOperation(t.having,"And",e):vi.create(e)})},cloneWithSetOperations(t,e){return i({...t,setOperations:t.setOperations?i([...t.setOperations,...e]):i([...e])})},cloneWithoutSelections(t){return i({...t,selections:[]})},cloneWithoutLimit(t){return i({...t,limit:void 0})},cloneWithoutOffset(t){return i({...t,offset:void 0})},cloneWithoutOrderBy:t=>u.cloneWithoutOrderBy(t),cloneWithoutGroupBy(t){return i({...t,groupBy:void 0})}});var cr=class t{#e;constructor(e){this.#e=i(e)}on(...e){return new t({...this.#e,joinNode:me.cloneWithOn(this.#e.joinNode,b(e))})}onRef(e,r,o){return new t({...this.#e,joinNode:me.cloneWithOn(this.#e.joinNode,Q(e,r,o))})}onTrue(){return new t({...this.#e,joinNode:me.cloneWithOn(this.#e.joinNode,g.createWithSql("true"))})}$call(e){return e(this)}toOperationNode(){return this.#e.joinNode}};var Jo=i({is(t){return t.kind==="PartitionByItemNode"},create(t){return i({kind:"PartitionByItemNode",partitionBy:t})}});function $o(t){return Se(t).map(Jo.create)}var mr=class t{#e;constructor(e){this.#e=i(e)}orderBy(...e){return new t({overNode:zt.cloneWithOrderByItems(this.#e.overNode,re(e))})}clearOrderBy(){return new t({overNode:u.cloneWithoutOrderBy(this.#e.overNode)})}partitionBy(e){return new t({overNode:zt.cloneWithPartitionByItems(this.#e.overNode,$o(e))})}$call(e){return e(this)}toOperationNode(){return this.#e.overNode}};var pt=i({is(t){return t.kind==="SelectionNode"},create(t){return i({kind:"SelectionNode",selection:t})},createSelectAll(){return i({kind:"SelectionNode",selection:nt.create()})},createSelectAllFromTable(t){return i({kind:"SelectionNode",selection:We.createSelectAll(t)})}});function L(t){return T(t)?L(t(G())):V(t)?t.map(e=>jo(e)):[jo(t)]}function jo(t){return E(t)?pt.create(Mo(t)):or(t)?pt.create(t.toOperationNode()):pt.create(hr(t))}function P(t){return t?Array.isArray(t)?t.map(Ko):[Ko(t)]:[pt.createSelectAll()]}function Ko(t){if(E(t))return pt.createSelectAllFromTable(N(t));throw new Error(`invalid value selectAll expression: ${JSON.stringify(t)}`)}var Go=i({is(t){return t.kind==="ValuesNode"},create(t){return i({kind:"ValuesNode",values:i(t)})}});var Yo=i({is(t){return t.kind==="DefaultInsertValueNode"},create(){return i({kind:"DefaultInsertValueNode"})}});function lr(t){let e=T(t)?t(G()):t,r=V(e)?e:i([e]);return _n(r)}function _n(t){let e=es(t);return[i([...e.keys()].map(m.create)),Go.create(t.map(r=>ts(r,e)))]}function es(t){let e=new Map;for(let r of t){let o=Object.keys(r);for(let n of o)!e.has(n)&&r[n]!==void 0&&e.set(n,e.size)}return e}function ts(t,e){let r=Object.keys(t),o=Array.from({length:e.size}),n=!1,a=r.length;for(let c of r){let l=e.get(c);if(_(l)){a--;continue}let h=t[c];(_(h)||ke(h))&&(n=!0),o[l]=h}if(a<e.size||n){let c=Yo.create();return Oe.create(o.map(l=>_(l)?c:O(l)))}return ar.create(o)}var Wi=i({is(t){return t.kind==="ColumnUpdateNode"},create(t,e){return i({kind:"ColumnUpdateNode",column:t,value:e})}});function Ho(...t){return t.length===2?[Wi.create(F(t[0]),O(t[1]))]:Ut(t[0])}function Ut(t){let e=T(t)?t(G()):t;return Object.entries(e).filter(([r,o])=>o!==void 0).map(([r,o])=>Wi.create(m.create(r),O(o)))}var Xo=i({is(t){return t.kind==="OnDuplicateKeyNode"},create(t){return i({kind:"OnDuplicateKeyNode",updates:t})}});var fr=class{insertId;numInsertedOrUpdatedRows;constructor(e,r){this.insertId=e,this.numInsertedOrUpdatedRows=r}};var ue=class extends Error{node;constructor(e){super("no result"),this.node=e}};function Ce(t){return Object.prototype.hasOwnProperty.call(t,"prototype")}var Y=i({is(t){return t.kind==="OnConflictNode"},create(){return i({kind:"OnConflictNode"})},cloneWith(t,e){return i({...t,...e})},cloneWithIndexWhere(t,e){return i({...t,indexWhere:t.indexWhere?z.cloneWithOperation(t.indexWhere,"And",e):z.create(e)})},cloneWithIndexOrWhere(t,e){return i({...t,indexWhere:t.indexWhere?z.cloneWithOperation(t.indexWhere,"Or",e):z.create(e)})},cloneWithUpdateWhere(t,e){return i({...t,updateWhere:t.updateWhere?z.cloneWithOperation(t.updateWhere,"And",e):z.create(e)})},cloneWithUpdateOrWhere(t,e){return i({...t,updateWhere:t.updateWhere?z.cloneWithOperation(t.updateWhere,"Or",e):z.create(e)})},cloneWithoutIndexWhere(t){return i({...t,indexWhere:void 0})},cloneWithoutUpdateWhere(t){return i({...t,updateWhere:void 0})}});var Nr=class t{#e;constructor(e){this.#e=i(e)}column(e){let r=m.create(e);return new t({...this.#e,onConflictNode:Y.cloneWith(this.#e.onConflictNode,{columns:this.#e.onConflictNode.columns?i([...this.#e.onConflictNode.columns,r]):i([r])})})}columns(e){let r=e.map(m.create);return new t({...this.#e,onConflictNode:Y.cloneWith(this.#e.onConflictNode,{columns:this.#e.onConflictNode.columns?i([...this.#e.onConflictNode.columns,...r]):i(r)})})}constraint(e){return new t({...this.#e,onConflictNode:Y.cloneWith(this.#e.onConflictNode,{constraint:d.create(e)})})}expression(e){return new t({...this.#e,onConflictNode:Y.cloneWith(this.#e.onConflictNode,{indexExpression:e.toOperationNode()})})}where(...e){return new t({...this.#e,onConflictNode:Y.cloneWithIndexWhere(this.#e.onConflictNode,b(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:Y.cloneWithIndexWhere(this.#e.onConflictNode,Q(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:Y.cloneWithoutIndexWhere(this.#e.onConflictNode)})}doNothing(){return new ki({...this.#e,onConflictNode:Y.cloneWith(this.#e.onConflictNode,{doNothing:!0})})}doUpdateSet(e){return new Si({...this.#e,onConflictNode:Y.cloneWith(this.#e.onConflictNode,{updates:Ut(e)})})}$call(e){return e(this)}},ki=class{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.onConflictNode}},Si=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,onConflictNode:Y.cloneWithUpdateWhere(this.#e.onConflictNode,b(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:Y.cloneWithUpdateWhere(this.#e.onConflictNode,Q(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:Y.cloneWithoutUpdateWhere(this.#e.onConflictNode)})}$call(e){return e(this)}toOperationNode(){return this.#e.onConflictNode}};var Zo=i({is(t){return t.kind==="TopNode"},create(t,e){return i({kind:"TopNode",expression:t,modifiers:e})}});function le(t,e){if(!Qe(t)&&!ot(t))throw new Error(`Invalid top expression: ${t}`);if(!_(e)&&!rs(e))throw new Error(`Invalid top modifiers: ${e}`);return Zo.create(t,e)}function rs(t){return t==="percent"||t==="with ties"||t==="percent with ties"}var Ye=i({is(t){return t.kind==="OrActionNode"},create(t){return i({kind:"OrActionNode",action:t})}});var Vt=class t{#e;constructor(e){this.#e=i(e)}values(e){let[r,o]=lr(e);return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{columns:r,values:o})})}columns(e){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{columns:i(e.map(m.create))})})}expression(e){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{values:Z(e)})})}defaultValues(){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{defaultValues:!0})})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}ignore(){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{orAction:Ye.create("ignore")})})}orIgnore(){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{orAction:Ye.create("ignore")})})}orAbort(){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{orAction:Ye.create("abort")})})}orFail(){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{orAction:Ye.create("fail")})})}orReplace(){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{orAction:Ye.create("replace")})})}orRollback(){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{orAction:Ye.create("rollback")})})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,le(e,r))})}onConflict(e){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{onConflict:e(new Nr({onConflictNode:Y.create()})).toOperationNode()})})}onDuplicateKeyUpdate(e){return new t({...this.#e,queryNode:k.cloneWith(this.#e.queryNode,{onDuplicateKey:Xo.create(Ut(e))})})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,L(e))})}returningAll(){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,P())})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,L(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,P(e))})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}withPlugin(e){return new t({...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(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new fr(r.insertId,r.numAffectedRows??BigInt(0))]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ue){let r=await this.executeTakeFirst();if(r===void 0)throw Ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};var yr=class{numDeletedRows;constructor(e){this.numDeletedRows=e}};var dt=i({is(t){return t.kind==="LimitNode"},create(t){return i({kind:"LimitNode",limit:t})}});var xr=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,b(e))})}whereRef(e,r,o){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,Q(e,r,o))})}clearWhere(){return new t({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,le(e,r))})}using(e){return new t({...this.#e,queryNode:ze.cloneWithUsing(this.#e.queryNode,fe(e))})}innerJoin(...e){return this.#t("InnerJoin",e)}leftJoin(...e){return this.#t("LeftJoin",e)}rightJoin(...e){return this.#t("RightJoin",e)}fullJoin(...e){return this.#t("FullJoin",e)}#t(e,r){return new t({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,Ue(e,r))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,L(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,P(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,L(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,P(e))})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}clearLimit(){return new t({...this.#e,queryNode:ze.cloneWithoutLimit(this.#e.queryNode)})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,re(e))})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new t({...this.#e,queryNode:ze.cloneWithLimit(this.#e.queryNode,dt.create(O(e)))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}withPlugin(e){return new t({...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(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new yr(r.numAffectedRows??BigInt(0))]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ue){let r=await this.executeTakeFirst();if(r===void 0)throw Ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};var wr=class{numUpdatedRows;numChangedRows;constructor(e,r){this.numUpdatedRows=e,this.numChangedRows=r}};var ct=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,b(e))})}whereRef(e,r,o){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,Q(e,r,o))})}clearWhere(){return new t({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,le(e,r))})}from(e){return new t({...this.#e,queryNode:be.cloneWithFromItems(this.#e.queryNode,fe(e))})}innerJoin(...e){return this.#t("InnerJoin",e)}leftJoin(...e){return this.#t("LeftJoin",e)}rightJoin(...e){return this.#t("RightJoin",e)}fullJoin(...e){return this.#t("FullJoin",e)}#t(e,r){return new t({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,Ue(e,r))})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,re(e))})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new t({...this.#e,queryNode:be.cloneWithLimit(this.#e.queryNode,dt.create(O(e)))})}set(...e){return new t({...this.#e,queryNode:be.cloneWithUpdates(this.#e.queryNode,Ho(...e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,L(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,P(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,L(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,P(e))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}withPlugin(e){return new t({...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(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new wr(r.numAffectedRows??BigInt(0),r.numChangedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ue){let r=await this.executeTakeFirst();if(r===void 0)throw Ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};var Ri=i({is(t){return t.kind==="CommonTableExpressionNameNode"},create(t,e){return i({kind:"CommonTableExpressionNameNode",table:K.create(t),columns:e?i(e.map(m.create)):void 0})}});var mt=i({is(t){return t.kind==="CommonTableExpressionNode"},create(t,e){return i({kind:"CommonTableExpressionNode",name:t,expression:e})},cloneWith(t,e){return i({...t,...e})}});var gr=class t{#e;constructor(e){this.#e=i(e)}materialized(){return new t({...this.#e,node:mt.cloneWith(this.#e.node,{materialized:!0})})}notMaterialized(){return new t({...this.#e,node:mt.cloneWith(this.#e.node,{materialized:!1})})}toOperationNode(){return this.#e.node}};function Ii(t,e){let r=e(en()).toOperationNode();return T(t)?t(is(r)).toOperationNode():mt.create(_o(t),r)}function is(t){return e=>new gr({node:mt.create(_o(e),t)})}function _o(t){if(t.includes("(")){let e=t.split(/[\(\)]/),r=e[0],o=e[1].split(",").map(n=>n.trim());return Ri.create(r,o)}else return Ri.create(t)}var Jt=i({is(t){return t.kind==="WithNode"},create(t,e){return i({kind:"WithNode",expressions:i([t]),...e})},cloneWithExpression(t,e){return i({...t,expressions:i([...t.expressions,e])})}});var tn=["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 rn(t){let e="";for(let r=0;r<t;++r)e+=os();return e}function os(){return tn[~~(Math.random()*tn.length)]}function y(){return new Bi}var Bi=class{#e;get queryId(){return this.#e===void 0&&(this.#e=rn(8)),this.#e}};var Ve=class{nodeStack=[];#e=i({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,r){if(!e)return e;this.nodeStack.push(e);let o=this.transformNodeImpl(e,r);return this.nodeStack.pop(),i(o)}transformNodeImpl(e,r){return this.#e[e.kind](e,r)}transformNodeList(e,r){return e&&i(e.map(o=>this.transformNode(o,r)))}transformSelectQuery(e,r){return{kind:"SelectQueryNode",from:this.transformNode(e.from,r),selections:this.transformNodeList(e.selections,r),distinctOn:this.transformNodeList(e.distinctOn,r),joins:this.transformNodeList(e.joins,r),groupBy:this.transformNode(e.groupBy,r),orderBy:this.transformNode(e.orderBy,r),where:this.transformNode(e.where,r),frontModifiers:this.transformNodeList(e.frontModifiers,r),endModifiers:this.transformNodeList(e.endModifiers,r),limit:this.transformNode(e.limit,r),offset:this.transformNode(e.offset,r),with:this.transformNode(e.with,r),having:this.transformNode(e.having,r),explain:this.transformNode(e.explain,r),setOperations:this.transformNodeList(e.setOperations,r),fetch:this.transformNode(e.fetch,r),top:this.transformNode(e.top,r)}}transformSelection(e,r){return{kind:"SelectionNode",selection:this.transformNode(e.selection,r)}}transformColumn(e,r){return{kind:"ColumnNode",column:this.transformNode(e.column,r)}}transformAlias(e,r){return{kind:"AliasNode",node:this.transformNode(e.node,r),alias:this.transformNode(e.alias,r)}}transformTable(e,r){return{kind:"TableNode",table:this.transformNode(e.table,r)}}transformFrom(e,r){return{kind:"FromNode",froms:this.transformNodeList(e.froms,r)}}transformReference(e,r){return{kind:"ReferenceNode",column:this.transformNode(e.column,r),table:this.transformNode(e.table,r)}}transformAnd(e,r){return{kind:"AndNode",left:this.transformNode(e.left,r),right:this.transformNode(e.right,r)}}transformOr(e,r){return{kind:"OrNode",left:this.transformNode(e.left,r),right:this.transformNode(e.right,r)}}transformValueList(e,r){return{kind:"ValueListNode",values:this.transformNodeList(e.values,r)}}transformParens(e,r){return{kind:"ParensNode",node:this.transformNode(e.node,r)}}transformJoin(e,r){return{kind:"JoinNode",joinType:e.joinType,table:this.transformNode(e.table,r),on:this.transformNode(e.on,r)}}transformRaw(e,r){return{kind:"RawNode",sqlFragments:i([...e.sqlFragments]),parameters:this.transformNodeList(e.parameters,r)}}transformWhere(e,r){return{kind:"WhereNode",where:this.transformNode(e.where,r)}}transformInsertQuery(e,r){return{kind:"InsertQueryNode",into:this.transformNode(e.into,r),columns:this.transformNodeList(e.columns,r),values:this.transformNode(e.values,r),returning:this.transformNode(e.returning,r),onConflict:this.transformNode(e.onConflict,r),onDuplicateKey:this.transformNode(e.onDuplicateKey,r),endModifiers:this.transformNodeList(e.endModifiers,r),with:this.transformNode(e.with,r),ignore:e.ignore,orAction:this.transformNode(e.orAction,r),replace:e.replace,explain:this.transformNode(e.explain,r),defaultValues:e.defaultValues,top:this.transformNode(e.top,r),output:this.transformNode(e.output,r)}}transformValues(e,r){return{kind:"ValuesNode",values:this.transformNodeList(e.values,r)}}transformDeleteQuery(e,r){return{kind:"DeleteQueryNode",from:this.transformNode(e.from,r),using:this.transformNode(e.using,r),joins:this.transformNodeList(e.joins,r),where:this.transformNode(e.where,r),returning:this.transformNode(e.returning,r),endModifiers:this.transformNodeList(e.endModifiers,r),with:this.transformNode(e.with,r),orderBy:this.transformNode(e.orderBy,r),limit:this.transformNode(e.limit,r),explain:this.transformNode(e.explain,r),top:this.transformNode(e.top,r),output:this.transformNode(e.output,r)}}transformReturning(e,r){return{kind:"ReturningNode",selections:this.transformNodeList(e.selections,r)}}transformCreateTable(e,r){return{kind:"CreateTableNode",table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r),constraints:this.transformNodeList(e.constraints,r),temporary:e.temporary,ifNotExists:e.ifNotExists,onCommit:e.onCommit,frontModifiers:this.transformNodeList(e.frontModifiers,r),endModifiers:this.transformNodeList(e.endModifiers,r),selectQuery:this.transformNode(e.selectQuery,r)}}transformColumnDefinition(e,r){return{kind:"ColumnDefinitionNode",column:this.transformNode(e.column,r),dataType:this.transformNode(e.dataType,r),references:this.transformNode(e.references,r),primaryKey:e.primaryKey,autoIncrement:e.autoIncrement,unique:e.unique,notNull:e.notNull,unsigned:e.unsigned,defaultTo:this.transformNode(e.defaultTo,r),check:this.transformNode(e.check,r),generated:this.transformNode(e.generated,r),frontModifiers:this.transformNodeList(e.frontModifiers,r),endModifiers:this.transformNodeList(e.endModifiers,r),nullsNotDistinct:e.nullsNotDistinct,identity:e.identity,ifNotExists:e.ifNotExists}}transformAddColumn(e,r){return{kind:"AddColumnNode",column:this.transformNode(e.column,r)}}transformDropTable(e,r){return{kind:"DropTableNode",table:this.transformNode(e.table,r),ifExists:e.ifExists,cascade:e.cascade}}transformOrderBy(e,r){return{kind:"OrderByNode",items:this.transformNodeList(e.items,r)}}transformOrderByItem(e,r){return{kind:"OrderByItemNode",orderBy:this.transformNode(e.orderBy,r),direction:this.transformNode(e.direction,r),collation:this.transformNode(e.collation,r),nulls:e.nulls}}transformGroupBy(e,r){return{kind:"GroupByNode",items:this.transformNodeList(e.items,r)}}transformGroupByItem(e,r){return{kind:"GroupByItemNode",groupBy:this.transformNode(e.groupBy,r)}}transformUpdateQuery(e,r){return{kind:"UpdateQueryNode",table:this.transformNode(e.table,r),from:this.transformNode(e.from,r),joins:this.transformNodeList(e.joins,r),where:this.transformNode(e.where,r),updates:this.transformNodeList(e.updates,r),returning:this.transformNode(e.returning,r),endModifiers:this.transformNodeList(e.endModifiers,r),with:this.transformNode(e.with,r),explain:this.transformNode(e.explain,r),limit:this.transformNode(e.limit,r),top:this.transformNode(e.top,r),output:this.transformNode(e.output,r),orderBy:this.transformNode(e.orderBy,r)}}transformColumnUpdate(e,r){return{kind:"ColumnUpdateNode",column:this.transformNode(e.column,r),value:this.transformNode(e.value,r)}}transformLimit(e,r){return{kind:"LimitNode",limit:this.transformNode(e.limit,r)}}transformOffset(e,r){return{kind:"OffsetNode",offset:this.transformNode(e.offset,r)}}transformOnConflict(e,r){return{kind:"OnConflictNode",columns:this.transformNodeList(e.columns,r),constraint:this.transformNode(e.constraint,r),indexExpression:this.transformNode(e.indexExpression,r),indexWhere:this.transformNode(e.indexWhere,r),updates:this.transformNodeList(e.updates,r),updateWhere:this.transformNode(e.updateWhere,r),doNothing:e.doNothing}}transformOnDuplicateKey(e,r){return{kind:"OnDuplicateKeyNode",updates:this.transformNodeList(e.updates,r)}}transformCreateIndex(e,r){return{kind:"CreateIndexNode",name:this.transformNode(e.name,r),table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r),unique:e.unique,using:this.transformNode(e.using,r),ifNotExists:e.ifNotExists,where:this.transformNode(e.where,r),nullsNotDistinct:e.nullsNotDistinct}}transformList(e,r){return{kind:"ListNode",items:this.transformNodeList(e.items,r)}}transformDropIndex(e,r){return{kind:"DropIndexNode",name:this.transformNode(e.name,r),table:this.transformNode(e.table,r),ifExists:e.ifExists,cascade:e.cascade}}transformPrimaryKeyConstraint(e,r){return{kind:"PrimaryKeyConstraintNode",columns:this.transformNodeList(e.columns,r),name:this.transformNode(e.name,r),deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformUniqueConstraint(e,r){return{kind:"UniqueConstraintNode",columns:this.transformNodeList(e.columns,r),name:this.transformNode(e.name,r),nullsNotDistinct:e.nullsNotDistinct,deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformForeignKeyConstraint(e,r){return{kind:"ForeignKeyConstraintNode",columns:this.transformNodeList(e.columns,r),references:this.transformNode(e.references,r),name:this.transformNode(e.name,r),onDelete:e.onDelete,onUpdate:e.onUpdate,deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformSetOperation(e,r){return{kind:"SetOperationNode",operator:e.operator,expression:this.transformNode(e.expression,r),all:e.all}}transformReferences(e,r){return{kind:"ReferencesNode",table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r),onDelete:e.onDelete,onUpdate:e.onUpdate}}transformCheckConstraint(e,r){return{kind:"CheckConstraintNode",expression:this.transformNode(e.expression,r),name:this.transformNode(e.name,r)}}transformWith(e,r){return{kind:"WithNode",expressions:this.transformNodeList(e.expressions,r),recursive:e.recursive}}transformCommonTableExpression(e,r){return{kind:"CommonTableExpressionNode",name:this.transformNode(e.name,r),materialized:e.materialized,expression:this.transformNode(e.expression,r)}}transformCommonTableExpressionName(e,r){return{kind:"CommonTableExpressionNameNode",table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r)}}transformHaving(e,r){return{kind:"HavingNode",having:this.transformNode(e.having,r)}}transformCreateSchema(e,r){return{kind:"CreateSchemaNode",schema:this.transformNode(e.schema,r),ifNotExists:e.ifNotExists}}transformDropSchema(e,r){return{kind:"DropSchemaNode",schema:this.transformNode(e.schema,r),ifExists:e.ifExists,cascade:e.cascade}}transformAlterTable(e,r){return{kind:"AlterTableNode",table:this.transformNode(e.table,r),renameTo:this.transformNode(e.renameTo,r),setSchema:this.transformNode(e.setSchema,r),columnAlterations:this.transformNodeList(e.columnAlterations,r),addConstraint:this.transformNode(e.addConstraint,r),dropConstraint:this.transformNode(e.dropConstraint,r),renameConstraint:this.transformNode(e.renameConstraint,r),addIndex:this.transformNode(e.addIndex,r),dropIndex:this.transformNode(e.dropIndex,r)}}transformDropColumn(e,r){return{kind:"DropColumnNode",column:this.transformNode(e.column,r)}}transformRenameColumn(e,r){return{kind:"RenameColumnNode",column:this.transformNode(e.column,r),renameTo:this.transformNode(e.renameTo,r)}}transformAlterColumn(e,r){return{kind:"AlterColumnNode",column:this.transformNode(e.column,r),dataType:this.transformNode(e.dataType,r),dataTypeExpression:this.transformNode(e.dataTypeExpression,r),setDefault:this.transformNode(e.setDefault,r),dropDefault:e.dropDefault,setNotNull:e.setNotNull,dropNotNull:e.dropNotNull}}transformModifyColumn(e,r){return{kind:"ModifyColumnNode",column:this.transformNode(e.column,r)}}transformAddConstraint(e,r){return{kind:"AddConstraintNode",constraint:this.transformNode(e.constraint,r)}}transformDropConstraint(e,r){return{kind:"DropConstraintNode",constraintName:this.transformNode(e.constraintName,r),ifExists:e.ifExists,modifier:e.modifier}}transformRenameConstraint(e,r){return{kind:"RenameConstraintNode",oldName:this.transformNode(e.oldName,r),newName:this.transformNode(e.newName,r)}}transformCreateView(e,r){return{kind:"CreateViewNode",name:this.transformNode(e.name,r),temporary:e.temporary,orReplace:e.orReplace,ifNotExists:e.ifNotExists,materialized:e.materialized,columns:this.transformNodeList(e.columns,r),as:this.transformNode(e.as,r)}}transformRefreshMaterializedView(e,r){return{kind:"RefreshMaterializedViewNode",name:this.transformNode(e.name,r),concurrently:e.concurrently,withNoData:e.withNoData}}transformDropView(e,r){return{kind:"DropViewNode",name:this.transformNode(e.name,r),ifExists:e.ifExists,materialized:e.materialized,cascade:e.cascade}}transformGenerated(e,r){return{kind:"GeneratedNode",byDefault:e.byDefault,always:e.always,identity:e.identity,stored:e.stored,expression:this.transformNode(e.expression,r)}}transformDefaultValue(e,r){return{kind:"DefaultValueNode",defaultValue:this.transformNode(e.defaultValue,r)}}transformOn(e,r){return{kind:"OnNode",on:this.transformNode(e.on,r)}}transformSelectModifier(e,r){return{kind:"SelectModifierNode",modifier:e.modifier,rawModifier:this.transformNode(e.rawModifier,r),of:this.transformNodeList(e.of,r)}}transformCreateType(e,r){return{kind:"CreateTypeNode",name:this.transformNode(e.name,r),enum:this.transformNode(e.enum,r)}}transformDropType(e,r){return{kind:"DropTypeNode",name:this.transformNode(e.name,r),ifExists:e.ifExists}}transformExplain(e,r){return{kind:"ExplainNode",format:e.format,options:this.transformNode(e.options,r)}}transformSchemableIdentifier(e,r){return{kind:"SchemableIdentifierNode",schema:this.transformNode(e.schema,r),identifier:this.transformNode(e.identifier,r)}}transformAggregateFunction(e,r){return{kind:"AggregateFunctionNode",func:e.func,aggregated:this.transformNodeList(e.aggregated,r),distinct:e.distinct,orderBy:this.transformNode(e.orderBy,r),withinGroup:this.transformNode(e.withinGroup,r),filter:this.transformNode(e.filter,r),over:this.transformNode(e.over,r)}}transformOver(e,r){return{kind:"OverNode",orderBy:this.transformNode(e.orderBy,r),partitionBy:this.transformNode(e.partitionBy,r)}}transformPartitionBy(e,r){return{kind:"PartitionByNode",items:this.transformNodeList(e.items,r)}}transformPartitionByItem(e,r){return{kind:"PartitionByItemNode",partitionBy:this.transformNode(e.partitionBy,r)}}transformBinaryOperation(e,r){return{kind:"BinaryOperationNode",leftOperand:this.transformNode(e.leftOperand,r),operator:this.transformNode(e.operator,r),rightOperand:this.transformNode(e.rightOperand,r)}}transformUnaryOperation(e,r){return{kind:"UnaryOperationNode",operator:this.transformNode(e.operator,r),operand:this.transformNode(e.operand,r)}}transformUsing(e,r){return{kind:"UsingNode",tables:this.transformNodeList(e.tables,r)}}transformFunction(e,r){return{kind:"FunctionNode",func:e.func,arguments:this.transformNodeList(e.arguments,r)}}transformCase(e,r){return{kind:"CaseNode",value:this.transformNode(e.value,r),when:this.transformNodeList(e.when,r),else:this.transformNode(e.else,r),isStatement:e.isStatement}}transformWhen(e,r){return{kind:"WhenNode",condition:this.transformNode(e.condition,r),result:this.transformNode(e.result,r)}}transformJSONReference(e,r){return{kind:"JSONReferenceNode",reference:this.transformNode(e.reference,r),traversal:this.transformNode(e.traversal,r)}}transformJSONPath(e,r){return{kind:"JSONPathNode",inOperator:this.transformNode(e.inOperator,r),pathLegs:this.transformNodeList(e.pathLegs,r)}}transformJSONPathLeg(e,r){return{kind:"JSONPathLegNode",type:e.type,value:e.value}}transformJSONOperatorChain(e,r){return{kind:"JSONOperatorChainNode",operator:this.transformNode(e.operator,r),values:this.transformNodeList(e.values,r)}}transformTuple(e,r){return{kind:"TupleNode",values:this.transformNodeList(e.values,r)}}transformMergeQuery(e,r){return{kind:"MergeQueryNode",into:this.transformNode(e.into,r),using:this.transformNode(e.using,r),whens:this.transformNodeList(e.whens,r),with:this.transformNode(e.with,r),top:this.transformNode(e.top,r),endModifiers:this.transformNodeList(e.endModifiers,r),output:this.transformNode(e.output,r),returning:this.transformNode(e.returning,r)}}transformMatched(e,r){return{kind:"MatchedNode",not:e.not,bySource:e.bySource}}transformAddIndex(e,r){return{kind:"AddIndexNode",name:this.transformNode(e.name,r),columns:this.transformNodeList(e.columns,r),unique:e.unique,using:this.transformNode(e.using,r),ifNotExists:e.ifNotExists}}transformCast(e,r){return{kind:"CastNode",expression:this.transformNode(e.expression,r),dataType:this.transformNode(e.dataType,r)}}transformFetch(e,r){return{kind:"FetchNode",rowCount:this.transformNode(e.rowCount,r),modifier:e.modifier}}transformTop(e,r){return{kind:"TopNode",expression:e.expression,modifiers:e.modifiers}}transformOutput(e,r){return{kind:"OutputNode",selections:this.transformNodeList(e.selections,r)}}transformDataType(e,r){return e}transformSelectAll(e,r){return e}transformIdentifier(e,r){return e}transformValue(e,r){return e}transformPrimitiveValueList(e,r){return e}transformOperator(e,r){return e}transformDefaultInsertValue(e,r){return e}transformOrAction(e,r){return e}transformCollate(e,r){return e}};var ns=i({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}),ss={json_agg:!0,to_json:!0},Or=class extends Ve{#e;#t=new Set;#r=new Set;constructor(e){super(),this.#e=e}transformNodeImpl(e,r){if(!this.#n(e))return super.transformNodeImpl(e,r);let o=this.#p(e);for(let p of o)this.#r.add(p);let n=this.#a(e);for(let p of n)this.#t.add(p);let a=super.transformNodeImpl(e,r);for(let p of n)this.#t.delete(p);for(let p of o)this.#r.delete(p);return a}transformSchemableIdentifier(e,r){let o=super.transformSchemableIdentifier(e,r);return o.schema||!this.#t.has(e.identifier.name)?o:{...o,schema:d.create(this.#e)}}transformReferences(e,r){let o=super.transformReferences(e,r);return o.table.table.schema?o:{...o,table:K.createWithSchema(this.#e,o.table.table.identifier.name)}}transformAggregateFunction(e,r){return{...super.transformAggregateFunction({...e,aggregated:[]},r),aggregated:this.#i(e,r,"aggregated")}}transformFunction(e,r){return{...super.transformFunction({...e,arguments:[]},r),arguments:this.#i(e,r,"arguments")}}#i(e,r,o){return ss[e.func]?e[o].map(n=>!K.is(n)||n.table.schema?this.transformNode(n,r):{...n,table:this.transformIdentifier(n.table.identifier,r)}):this.transformNodeList(e[o],r)}#n(e){return e.kind in ns}#a(e){let r=new Set;if("name"in e&&e.name&&$.is(e.name)&&this.#s(e.name,r),"from"in e&&e.from)for(let o of e.from.froms)this.#o(o,r);if("into"in e&&e.into&&this.#o(e.into,r),"table"in e&&e.table&&this.#o(e.table,r),"joins"in e&&e.joins)for(let o of e.joins)this.#o(o.table,r);return"using"in e&&e.using&&(me.is(e.using)?this.#o(e.using.table,r):this.#o(e.using,r)),r}#p(e){let r=new Set;return"with"in e&&e.with&&this.#u(e.with,r),r}#o(e,r){if(K.is(e))this.#s(e.table,r);else if(B.is(e)&&K.is(e.node))this.#s(e.node.table,r);else if(dr.is(e))for(let o of e.items)this.#o(o,r)}#s(e,r){let o=e.identifier.name;!this.#t.has(o)&&!this.#r.has(o)&&r.add(o)}#u(e,r){for(let o of e.expressions){let n=o.name.table.table.identifier.name;this.#r.has(n)||r.add(n)}}};var pe=class{#e;constructor(e){this.#e=new Or(e)}transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}async transformResult(e){return e.result}};var on=i({is(t){return t.kind==="MatchedNode"},create(t,e=!1){return i({kind:"MatchedNode",not:t,bySource:e})}});function qi(t,e,r){return ae.create(ut([on.create(!t.isMatched,t.bySource),...e&&e.length>0?[e.length===3&&r?Q(e[0],e[1],e[2]):b(e)]:[]],"and",!1))}function ht(t){return E(t)?g.create([t],[]):C(t)?t.toOperationNode():t}var $t=class{#e;#t;#r;constructor(){this.#e=new Promise((e,r)=>{this.#r=r,this.#t=e})}get promise(){return this.#e}resolve=e=>{this.#t&&this.#t(e)};reject=e=>{this.#r&&this.#r(e)}};async function br(t){let e=new $t,r=new $t;return t.provideConnection(async o=>(e.resolve(o),await r.promise)).catch(o=>e.reject(o)),i({connection:await e.promise,release:r.resolve})}var as=i([]),lt=class{#e;constructor(e=as){this.#e=e}get plugins(){return this.#e}transformQuery(e,r){for(let o of this.#e){let n=o.transformQuery({node:e,queryId:r});if(n.kind===e.kind)e=n;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 ${n.kind}`].join(" "))}return e}async executeQuery(e){return await this.provideConnection(async r=>{let o=await r.executeQuery(e);return"numUpdatedOrDeletedRows"in o&&ge("kysely:warning: outdated driver/plugin detected! `QueryResult.numUpdatedOrDeletedRows` has been replaced with `QueryResult.numAffectedRows`."),await this.#t(o,e.queryId)})}async*stream(e,r){let{connection:o,release:n}=await br(this);try{for await(let a of o.streamQuery(e,r))yield await this.#t(a,e.queryId)}finally{n()}}async#t(e,r){for(let o of this.#e)e=await o.transformResult({result:e,queryId:r});return e}};var Di=class t extends lt{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 t([...this.plugins,e])}withPlugins(e){return new t([...this.plugins,...e])}withPluginAtFront(e){return new t([e,...this.plugins])}withoutPlugins(){return new t([])}},Je=new Di;var Cr=class{numChangedRows;constructor(e){this.numChangedRows=e}};var vr=class t{#e;constructor(e){this.#e=i(e)}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,le(e,r))})}using(...e){return new $e({...this.#e,queryNode:oe.cloneWithUsing(this.#e.queryNode,Ue("Using",e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,L(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,P(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,L(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,P(e))})}},$e=class t{#e;constructor(e){this.#e=i(e)}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,le(e,r))})}whenMatched(){return this.#t([])}whenMatchedAnd(...e){return this.#t(e)}whenMatchedAndRef(e,r,o){return this.#t([e,r,o],!0)}#t(e,r){return new Er({...this.#e,queryNode:oe.cloneWithWhen(this.#e.queryNode,qi({isMatched:!0},e,r))})}whenNotMatched(){return this.#r([])}whenNotMatchedAnd(...e){return this.#r(e)}whenNotMatchedAndRef(e,r,o){return this.#r([e,r,o],!0)}whenNotMatchedBySource(){return this.#r([],!1,!0)}whenNotMatchedBySourceAnd(...e){return this.#r(e,!1,!0)}whenNotMatchedBySourceAndRef(e,r,o){return this.#r([e,r,o],!0,!0)}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,L(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,P(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,L(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,P(e))})}#r(e,r=!1,o=!1){let n={...this.#e,queryNode:oe.cloneWithWhen(this.#e.queryNode,qi({isMatched:!1,bySource:o},e,r))},a=o?Er:Li;return new a(n)}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...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(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new Cr(r.numAffectedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ue){let r=await this.executeTakeFirst();if(r===void 0)throw Ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}},Er=class{#e;constructor(e){this.#e=i(e)}thenDelete(){return new $e({...this.#e,queryNode:oe.cloneWithThen(this.#e.queryNode,ht("delete"))})}thenDoNothing(){return new $e({...this.#e,queryNode:oe.cloneWithThen(this.#e.queryNode,ht("do nothing"))})}thenUpdate(e){return new $e({...this.#e,queryNode:oe.cloneWithThen(this.#e.queryNode,ht(e(new ct({queryId:this.#e.queryId,executor:Je,queryNode:be.createWithoutTable()}))))})}thenUpdateSet(...e){return this.thenUpdate(r=>r.set(...e))}},Li=class{#e;constructor(e){this.#e=i(e)}thenDoNothing(){return new $e({...this.#e,queryNode:oe.cloneWithThen(this.#e.queryNode,ht("do nothing"))})}thenInsertValues(e){let[r,o]=lr(e);return new $e({...this.#e,queryNode:oe.cloneWithThen(this.#e.queryNode,ht(k.cloneWith(k.createWithoutInto(),{columns:r,values:o})))})}};var ft=class t{#e;constructor(e){this.#e=i(e)}selectFrom(e){return jt({queryId:y(),executor:this.#e.executor,queryNode:w.createFrom(fe(e),this.#e.withNode)})}selectNoFrom(e){return jt({queryId:y(),executor:this.#e.executor,queryNode:w.cloneWithSelections(w.create(this.#e.withNode),L(e))})}insertInto(e){return new Vt({queryId:y(),executor:this.#e.executor,queryNode:k.create(N(e),this.#e.withNode)})}replaceInto(e){return new Vt({queryId:y(),executor:this.#e.executor,queryNode:k.create(N(e),this.#e.withNode,!0)})}deleteFrom(e){return new xr({queryId:y(),executor:this.#e.executor,queryNode:ze.create(fe(e),this.#e.withNode)})}updateTable(e){return new ct({queryId:y(),executor:this.#e.executor,queryNode:be.create(fe(e),this.#e.withNode)})}mergeInto(e){return new vr({queryId:y(),executor:this.#e.executor,queryNode:oe.create(Qi(e),this.#e.withNode)})}with(e,r){let o=Ii(e,r);return new t({...this.#e,withNode:this.#e.withNode?Jt.cloneWithExpression(this.#e.withNode,o):Jt.create(o)})}withRecursive(e,r){let o=Ii(e,r);return new t({...this.#e,withNode:this.#e.withNode?Jt.cloneWithExpression(this.#e.withNode,o):Jt.create(o,{recursive:!0})})}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new pe(e))})}};function en(){return new ft({executor:Je})}function nn(t,e){return new cr({joinNode:me.create(t,He(e))})}function sn(){return new mr({overNode:zt.create()})}function Ue(t,e){if(e.length===3)return ps(t,e[0],e[1],e[2]);if(e.length===2)return us(t,e[0],e[1]);if(e.length===1)return ds(t,e[0]);throw new Error("not implemented")}function us(t,e,r){return r(nn(t,e)).toOperationNode()}function ps(t,e,r,o){return me.createWithOn(t,He(e),Q(r,"=",o))}function ds(t,e){return me.create(t,He(e))}var an=i({is(t){return t.kind==="OffsetNode"},create(t){return i({kind:"OffsetNode",offset:t})}});var un=i({is(t){return t.kind==="GroupByItemNode"},create(t){return i({kind:"GroupByItemNode",groupBy:t})}});function pn(t){return t=T(t)?t(G()):t,Se(t).map(un.create)}var Ar=i({is(t){return t.kind==="SetOperationNode"},create(t,e,r){return i({kind:"SetOperationNode",operator:t,expression:e,all:r})}});function Xe(t,e,r){return T(e)&&(e=e(Tr())),V(e)||(e=[e]),e.map(o=>Ar.create(t,Z(o),r))}var x=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Kt(this,e)}or(...e){return new Pi(ce.create(this.#e,b(e)))}and(...e){return new Mi(X.create(this.#e,b(e)))}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e}},Kt=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return B.create(this.#e.toOperationNode(),C(this.#t)?this.#t.toOperationNode():d.create(this.#t))}},Pi=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Kt(this,e)}or(...e){return new t(ce.create(this.#e,b(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return ie.create(this.#e)}},Mi=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Kt(this,e)}and(...e){return new t(X.create(this.#e,b(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return ie.create(this.#e)}};var dn={is(t){return t.kind==="FetchNode"},create(t,e){return{kind:"FetchNode",rowCount:W.create(t),modifier:e}}};function cn(t,e){if(!Qe(t)&&!ot(t))throw new Error(`Invalid fetch row count: ${t}`);if(!cs(e))throw new Error(`Invalid fetch modifier: ${e}`);return dn.create(t,e)}function cs(t){return t==="only"||t==="with ties"}var Fi=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}get isSelectQueryBuilder(){return!0}where(...e){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,b(e))})}whereRef(e,r,o){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,Q(e,r,o))})}having(...e){return new t({...this.#e,queryNode:w.cloneWithHaving(this.#e.queryNode,b(e))})}havingRef(e,r,o){return new t({...this.#e,queryNode:w.cloneWithHaving(this.#e.queryNode,Q(e,r,o))})}select(e){return new t({...this.#e,queryNode:w.cloneWithSelections(this.#e.queryNode,L(e))})}distinctOn(e){return new t({...this.#e,queryNode:w.cloneWithDistinctOn(this.#e.queryNode,Se(e))})}modifyFront(e){return new t({...this.#e,queryNode:w.cloneWithFrontModifier(this.#e.queryNode,we.createWithExpression(e.toOperationNode()))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,we.createWithExpression(e.toOperationNode()))})}distinct(){return new t({...this.#e,queryNode:w.cloneWithFrontModifier(this.#e.queryNode,we.create("Distinct"))})}forUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,we.create("ForUpdate",e?Qt(e).map(N):void 0))})}forShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,we.create("ForShare",e?Qt(e).map(N):void 0))})}forKeyShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,we.create("ForKeyShare",e?Qt(e).map(N):void 0))})}forNoKeyUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,we.create("ForNoKeyUpdate",e?Qt(e).map(N):void 0))})}skipLocked(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,we.create("SkipLocked"))})}noWait(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,we.create("NoWait"))})}selectAll(e){return new t({...this.#e,queryNode:w.cloneWithSelections(this.#e.queryNode,P(e))})}innerJoin(...e){return this.#t("InnerJoin",e)}leftJoin(...e){return this.#t("LeftJoin",e)}rightJoin(...e){return this.#t("RightJoin",e)}fullJoin(...e){return this.#t("FullJoin",e)}crossJoin(...e){return this.#t("CrossJoin",e)}innerJoinLateral(...e){return this.#t("LateralInnerJoin",e)}leftJoinLateral(...e){return this.#t("LateralLeftJoin",e)}crossJoinLateral(...e){return this.#t("LateralCrossJoin",e)}crossApply(...e){return this.#t("CrossApply",e)}outerApply(...e){return this.#t("OuterApply",e)}#t(e,r){return new t({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,Ue(e,r))})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,re(e))})}groupBy(e){return new t({...this.#e,queryNode:w.cloneWithGroupByItems(this.#e.queryNode,pn(e))})}limit(e){return new t({...this.#e,queryNode:w.cloneWithLimit(this.#e.queryNode,dt.create(O(e)))})}offset(e){return new t({...this.#e,queryNode:w.cloneWithOffset(this.#e.queryNode,an.create(O(e)))})}fetch(e,r="only"){return new t({...this.#e,queryNode:w.cloneWithFetch(this.#e.queryNode,cn(e,r))})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,le(e,r))})}union(e){return new t({...this.#e,queryNode:w.cloneWithSetOperations(this.#e.queryNode,Xe("union",e,!1))})}unionAll(e){return new t({...this.#e,queryNode:w.cloneWithSetOperations(this.#e.queryNode,Xe("union",e,!0))})}intersect(e){return new t({...this.#e,queryNode:w.cloneWithSetOperations(this.#e.queryNode,Xe("intersect",e,!1))})}intersectAll(e){return new t({...this.#e,queryNode:w.cloneWithSetOperations(this.#e.queryNode,Xe("intersect",e,!0))})}except(e){return new t({...this.#e,queryNode:w.cloneWithSetOperations(this.#e.queryNode,Xe("except",e,!1))})}exceptAll(e){return new t({...this.#e,queryNode:w.cloneWithSetOperations(this.#e.queryNode,Xe("except",e,!0))})}as(e){return new zi(this,e)}clearSelect(){return new t({...this.#e,queryNode:w.cloneWithoutSelections(this.#e.queryNode)})}clearWhere(){return new t({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}clearLimit(){return new t({...this.#e,queryNode:w.cloneWithoutLimit(this.#e.queryNode)})}clearOffset(){return new t({...this.#e,queryNode:w.cloneWithoutOffset(this.#e.queryNode)})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}clearGroupBy(){return new t({...this.#e,queryNode:w.cloneWithoutGroupBy(this.#e.queryNode)})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}$asTuple(){return new x(this.toOperationNode())}$asScalar(){return new x(this.toOperationNode())}withPlugin(e){return new t({...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)).rows}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ue){let r=await this.executeTakeFirst();if(r===void 0)throw Ce(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};function jt(t){return new Fi(t)}var zi=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}get isAliasedSelectQueryBuilder(){return!0}toOperationNode(){return B.create(this.#e.toOperationNode(),d.create(this.#t))}};var ve=i({is(t){return t.kind==="AggregateFunctionNode"},create(t,e=[]){return i({kind:"AggregateFunctionNode",func:t,aggregated:e})},cloneWithDistinct(t){return i({...t,distinct:!0})},cloneWithOrderBy(t,e,r=!1){let o=r?"withinGroup":"orderBy";return i({...t,[o]:t[o]?Re.cloneWithItems(t[o],e):Re.create(e)})},cloneWithFilter(t,e){return i({...t,filter:t.filter?z.cloneWithOperation(t.filter,"And",e):z.create(e)})},cloneWithOrFilter(t,e){return i({...t,filter:t.filter?z.cloneWithOperation(t.filter,"Or",e):z.create(e)})},cloneWithOver(t,e){return i({...t,over:e})}});var Ui=i({is(t){return t.kind==="FunctionNode"},create(t,e){return i({kind:"FunctionNode",func:t,arguments:e})}});var Nt=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}as(e){return new Vi(this,e)}distinct(){return new t({...this.#e,aggregateFunctionNode:ve.cloneWithDistinct(this.#e.aggregateFunctionNode)})}orderBy(...e){return new t({...this.#e,aggregateFunctionNode:u.cloneWithOrderByItems(this.#e.aggregateFunctionNode,re(e))})}clearOrderBy(){return new t({...this.#e,aggregateFunctionNode:u.cloneWithoutOrderBy(this.#e.aggregateFunctionNode)})}withinGroupOrderBy(...e){return new t({...this.#e,aggregateFunctionNode:ve.cloneWithOrderBy(this.#e.aggregateFunctionNode,re(e),!0)})}filterWhere(...e){return new t({...this.#e,aggregateFunctionNode:ve.cloneWithFilter(this.#e.aggregateFunctionNode,b(e))})}filterWhereRef(e,r,o){return new t({...this.#e,aggregateFunctionNode:ve.cloneWithFilter(this.#e.aggregateFunctionNode,Q(e,r,o))})}over(e){let r=sn();return new t({...this.#e,aggregateFunctionNode:ve.cloneWithOver(this.#e.aggregateFunctionNode,(e?e(r):r).toOperationNode())})}$call(e){return e(this)}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e.aggregateFunctionNode}},Vi=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return B.create(this.#e.toOperationNode(),d.create(this.#t))}};function Wr(){let t=(r,o)=>new x(Ui.create(r,Se(o??[]))),e=(r,o)=>new Nt({aggregateFunctionNode:ve.create(r,o?Se(o):void 0)});return Object.assign(t,{agg:e,avg(r){return e("avg",[r])},coalesce(...r){return t("coalesce",r)},count(r){return e("count",[r])},countAll(r){return new Nt({aggregateFunctionNode:ve.create("count",P(r))})},max(r){return e("max",[r])},min(r){return e("min",[r])},sum(r){return e("sum",[r])},any(r){return t("any",[r])},jsonAgg(r){return new Nt({aggregateFunctionNode:ve.create("json_agg",[E(r)?N(r):r.toOperationNode()])})},toJson(r){return new x(Ui.create("to_json",[E(r)?N(r):r.toOperationNode()]))}})}var mn=i({is(t){return t.kind==="UnaryOperationNode"},create(t,e){return i({kind:"UnaryOperationNode",operator:t,operand:e})}});function hn(t,e){return mn.create(ee.create(t),F(e))}var ne=i({is(t){return t.kind==="CaseNode"},create(t){return i({kind:"CaseNode",value:t})},cloneWithWhen(t,e){return i({...t,when:i(t.when?[...t.when,e]:[e])})},cloneWithThen(t,e){return i({...t,when:t.when?i([...t.when.slice(0,-1),ae.cloneWithResult(t.when[t.when.length-1],e)]):void 0})},cloneWith(t,e){return i({...t,...e})}});var yt=class{#e;constructor(e){this.#e=i(e)}when(...e){return new kr({...this.#e,node:ne.cloneWithWhen(this.#e.node,ae.create(b(e)))})}},kr=class{#e;constructor(e){this.#e=i(e)}then(e){return new Ji({...this.#e,node:ne.cloneWithThen(this.#e.node,ur(e)?Ft(e):O(e))})}},Ji=class{#e;constructor(e){this.#e=i(e)}when(...e){return new kr({...this.#e,node:ne.cloneWithWhen(this.#e.node,ae.create(b(e)))})}else(e){return new $i({...this.#e,node:ne.cloneWith(this.#e.node,{else:ur(e)?Ft(e):O(e)})})}end(){return new x(ne.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new x(ne.cloneWith(this.#e.node,{isStatement:!0}))}},$i=class{#e;constructor(e){this.#e=i(e)}end(){return new x(ne.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new x(ne.cloneWith(this.#e.node,{isStatement:!0}))}};var ji=i({is(t){return t.kind==="JSONPathLegNode"},create(t,e){return i({kind:"JSONPathLegNode",type:t,value:e})}});var xt=class{#e;constructor(e){this.#e=e}at(e){return this.#t("ArrayLocation",e)}key(e){return this.#t("Member",e)}#t(e,r){return st.is(this.#e)?new Sr(st.cloneWithTraversal(this.#e,Fe.is(this.#e.traversal)?Fe.cloneWithLeg(this.#e.traversal,ji.create(e,r)):sr.cloneWithValue(this.#e.traversal,W.createImmediate(r)))):new Sr(Fe.cloneWithLeg(this.#e,ji.create(e,r)))}},Sr=class t extends xt{#e;constructor(e){super(e),this.#e=e}get expressionType(){}as(e){return new Ki(this,e)}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e}},Ki=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return B.create(this.#e.toOperationNode(),C(this.#t)?this.#t.toOperationNode():d.create(this.#t))}};var Gi=i({is(t){return t.kind==="TupleNode"},create(t){return i({kind:"TupleNode",values:i(t)})}});var ms=["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"],hs=[/^varchar\(\d+\)$/,/^char\(\d+\)$/,/^decimal\(\d+, \d+\)$/,/^numeric\(\d+, \d+\)$/,/^binary\(\d+\)$/,/^datetime\(\d+\)$/,/^time\(\d+\)$/,/^timetz\(\d+\)$/,/^timestamp\(\d+\)$/,/^timestamptz\(\d+\)$/,/^varbinary\(\d+\)$/],ln=i({is(t){return t.kind==="DataTypeNode"},create(t){return i({kind:"DataTypeNode",dataType:t})}});function fn(t){return!!(ms.includes(t)||hs.some(e=>e.test(t)))}function Ne(t){if(C(t))return t.toOperationNode();if(fn(t))return ln.create(t);throw new Error(`invalid column data type ${JSON.stringify(t)}`)}var Nn=i({is(t){return t.kind==="CastNode"},create(t,e){return i({kind:"CastNode",expression:t,dataType:e})}});function Tr(t=Je){function e(n,a,p){return new x(pr(n,a,p))}function r(n,a){return new x(hn(n,a))}let o=Object.assign(e,{fn:void 0,eb:void 0,selectFrom(n){return jt({queryId:y(),executor:t,queryNode:w.createFrom(fe(n))})},case(n){return new yt({node:ne.create(_(n)?void 0:F(n))})},ref(n,a){return _(a)?new x(te(n)):new xt(Po(n,a))},jsonPath(){return new xt(Fe.create())},table(n){return new x(N(n))},val(n){return new x(O(n))},refTuple(...n){return new x(Gi.create(n.map(F)))},tuple(...n){return new x(Gi.create(n.map(O)))},lit(n){return new x(Ft(n))},unary:r,not(n){return r("not",n)},exists(n){return r("exists",n)},neg(n){return r("-",n)},between(n,a,p){return new x(Me.create(F(n),ee.create("between"),X.create(O(a),O(p))))},betweenSymmetric(n,a,p){return new x(Me.create(F(n),ee.create("between symmetric"),X.create(O(a),O(p))))},and(n){return V(n)?new x(ut(n,"and")):new x(Oi(n,"and"))},or(n){return V(n)?new x(ut(n,"or")):new x(Oi(n,"or"))},parens(...n){let a=b(n);return ie.is(a)?new x(a):new x(ie.create(a))},cast(n,a){return new x(Nn.create(F(n),Ne(a)))},withSchema(n){return Tr(t.withPluginAtFront(new pe(n)))}});return o.fn=Wr(),o.eb=o,o}function G(t){return Tr()}function Z(t){if(C(t))return t.toOperationNode();if(T(t))return t(G()).toOperationNode();throw new Error(`invalid expression: ${JSON.stringify(t)}`)}function hr(t){if(C(t))return t.toOperationNode();if(T(t))return t(G()).toOperationNode();throw new Error(`invalid aliased expression: ${JSON.stringify(t)}`)}function ke(t){return tr(t)||Io(t)||T(t)}var Rr=class{#e;get table(){return this.#e}constructor(e){this.#e=e}as(e){return new Yi(this.#e,e)}},Yi=class{#e;#t;get table(){return this.#e}get alias(){return this.#t}constructor(e,r){this.#e=e,this.#t=r}toOperationNode(){return B.create(N(this.#e),d.create(this.#t))}};function yn(t){return M(t)&&C(t)&&E(t.table)&&E(t.alias)}function fe(t){return V(t)?t.map(e=>He(e)):[He(t)]}function He(t){return E(t)?Qi(t):yn(t)?t.toOperationNode():hr(t)}function Qi(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(xn);return B.create(N(r),d.create(o))}else return N(t)}function N(t){let e=".";if(t.includes(e)){let[r,o]=t.split(e).map(xn);return K.createWithSchema(r,o)}else return K.create(t)}function xn(t){return t.trim()}var Hi=i({is(t){return t.kind==="AddColumnNode"},create(t){return i({kind:"AddColumnNode",column:t})}});var v=i({is(t){return t.kind==="ColumnDefinitionNode"},create(t,e){return i({kind:"ColumnDefinitionNode",column:m.create(t),dataType:e})},cloneWithFrontModifier(t,e){return i({...t,frontModifiers:t.frontModifiers?i([...t.frontModifiers,e]):[e]})},cloneWithEndModifier(t,e){return i({...t,endModifiers:t.endModifiers?i([...t.endModifiers,e]):[e]})},cloneWith(t,e){return i({...t,...e})}});var Xi=i({is(t){return t.kind==="DropColumnNode"},create(t){return i({kind:"DropColumnNode",column:m.create(t)})}});var Zi=i({is(t){return t.kind==="RenameColumnNode"},create(t,e){return i({kind:"RenameColumnNode",column:m.create(t),renameTo:m.create(e)})}});var wt=i({is(t){return t.kind==="CheckConstraintNode"},create(t,e){return i({kind:"CheckConstraintNode",expression:t,name:e?d.create(e):void 0})}});var wn=["no action","restrict","cascade","set null","set default"],gt=i({is(t){return t.kind==="ReferencesNode"},create(t,e){return i({kind:"ReferencesNode",table:t,columns:i([...e])})},cloneWithOnDelete(t,e){return i({...t,onDelete:e})},cloneWithOnUpdate(t,e){return i({...t,onUpdate:e})}});function Ir(t){return C(t)?t.toOperationNode():W.createImmediate(t)}var Gt=i({is(t){return t.kind==="GeneratedNode"},create(t){return i({kind:"GeneratedNode",...t})},createWithExpression(t){return i({kind:"GeneratedNode",always:!0,expression:t})},cloneWith(t,e){return i({...t,...e})}});var gn=i({is(t){return t.kind==="DefaultValueNode"},create(t){return i({kind:"DefaultValueNode",defaultValue:t})}});function Ot(t){if(wn.includes(t))return t;throw new Error(`invalid OnModifyForeignAction ${t}`)}var Ie=class t{#e;constructor(e){this.#e=e}autoIncrement(){return new t(v.cloneWith(this.#e,{autoIncrement:!0}))}identity(){return new t(v.cloneWith(this.#e,{identity:!0}))}primaryKey(){return new t(v.cloneWith(this.#e,{primaryKey:!0}))}references(e){let r=te(e);if(!r.table||nt.is(r.column))throw new Error(`invalid call references('${e}'). The reference must have format table.column or schema.table.column`);return new t(v.cloneWith(this.#e,{references:gt.create(r.table,[r.column])}))}onDelete(e){if(!this.#e.references)throw new Error("on delete constraint can only be added for foreign keys");return new t(v.cloneWith(this.#e,{references:gt.cloneWithOnDelete(this.#e.references,Ot(e))}))}onUpdate(e){if(!this.#e.references)throw new Error("on update constraint can only be added for foreign keys");return new t(v.cloneWith(this.#e,{references:gt.cloneWithOnUpdate(this.#e.references,Ot(e))}))}unique(){return new t(v.cloneWith(this.#e,{unique:!0}))}notNull(){return new t(v.cloneWith(this.#e,{notNull:!0}))}unsigned(){return new t(v.cloneWith(this.#e,{unsigned:!0}))}defaultTo(e){return new t(v.cloneWith(this.#e,{defaultTo:gn.create(Ir(e))}))}check(e){return new t(v.cloneWith(this.#e,{check:wt.create(e.toOperationNode())}))}generatedAlwaysAs(e){return new t(v.cloneWith(this.#e,{generated:Gt.createWithExpression(e.toOperationNode())}))}generatedAlwaysAsIdentity(){return new t(v.cloneWith(this.#e,{generated:Gt.create({identity:!0,always:!0})}))}generatedByDefaultAsIdentity(){return new t(v.cloneWith(this.#e,{generated:Gt.create({identity:!0,byDefault:!0})}))}stored(){if(!this.#e.generated)throw new Error("stored() can only be called after generatedAlwaysAs");return new t(v.cloneWith(this.#e,{generated:Gt.cloneWith(this.#e.generated,{stored:!0})}))}modifyFront(e){return new t(v.cloneWithFrontModifier(this.#e,e.toOperationNode()))}nullsNotDistinct(){return new t(v.cloneWith(this.#e,{nullsNotDistinct:!0}))}ifNotExists(){return new t(v.cloneWith(this.#e,{ifNotExists:!0}))}modifyEnd(e){return new t(v.cloneWithEndModifier(this.#e,e.toOperationNode()))}$call(e){return e(this)}toOperationNode(){return this.#e}};var _i=i({is(t){return t.kind==="ModifyColumnNode"},create(t){return i({kind:"ModifyColumnNode",column:t})}});var ye=i({is(t){return t.kind==="ForeignKeyConstraintNode"},create(t,e,r,o){return i({kind:"ForeignKeyConstraintNode",columns:t,references:gt.create(e,r),name:o?d.create(o):void 0})},cloneWith(t,e){return i({...t,...e})}});var bt=class t{#e;constructor(e){this.#e=e}onDelete(e){return new t(ye.cloneWith(this.#e,{onDelete:Ot(e)}))}onUpdate(e){return new t(ye.cloneWith(this.#e,{onUpdate:Ot(e)}))}deferrable(){return new t(ye.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(ye.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(ye.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(ye.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};var Ct=i({is(t){return t.kind==="AddConstraintNode"},create(t){return i({kind:"AddConstraintNode",constraint:t})}});var Ee=i({is(t){return t.kind==="UniqueConstraintNode"},create(t,e,r){return i({kind:"UniqueConstraintNode",columns:i(t.map(m.create)),name:e?d.create(e):void 0,nullsNotDistinct:r})},cloneWith(t,e){return i({...t,...e})}});var vt=i({is(t){return t.kind==="DropConstraintNode"},create(t){return i({kind:"DropConstraintNode",constraintName:d.create(t)})},cloneWith(t,e){return i({...t,...e})}});var Et=i({is(t){return t.kind==="AlterColumnNode"},create(t,e,r){return i({kind:"AlterColumnNode",column:m.create(t),[e]:r})}});var Yt=class{#e;constructor(e){this.#e=e}setDataType(e){return new Ze(Et.create(this.#e,"dataType",Ne(e)))}setDefault(e){return new Ze(Et.create(this.#e,"setDefault",Ir(e)))}dropDefault(){return new Ze(Et.create(this.#e,"dropDefault",!0))}setNotNull(){return new Ze(Et.create(this.#e,"setNotNull",!0))}dropNotNull(){return new Ze(Et.create(this.#e,"dropNotNull",!0))}$call(e){return e(this)}},Ze=class{#e;constructor(e){this.#e=e}toOperationNode(){return this.#e}};var Be=class{#e;constructor(e){this.#e=i(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())}};var Br=class t{#e;constructor(e){this.#e=i(e)}onDelete(e){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.onDelete(e)})}onUpdate(e){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.onUpdate(e)})}deferrable(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.deferrable()})}notDeferrable(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.notDeferrable()})}initiallyDeferred(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.initiallyDeferred()})}initiallyImmediate(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.initiallyImmediate()})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(f.cloneWithTableProps(this.#e.node,{addConstraint:Ct.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())}};var Ht=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:f.cloneWithTableProps(this.#e.node,{dropConstraint:vt.cloneWith(this.#e.node.dropConstraint,{ifExists:!0})})})}cascade(){return new t({...this.#e,node:f.cloneWithTableProps(this.#e.node,{dropConstraint:vt.cloneWith(this.#e.node.dropConstraint,{modifier:"cascade"})})})}restrict(){return new t({...this.#e,node:f.cloneWithTableProps(this.#e.node,{dropConstraint:vt.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())}};var qe=i({is(t){return t.kind==="PrimaryKeyConstraintNode"},create(t,e){return i({kind:"PrimaryKeyConstraintNode",columns:i(t.map(m.create)),name:e?d.create(e):void 0})},cloneWith(t,e){return i({...t,...e})}});var je=i({is(t){return t.kind==="AddIndexNode"},create(t){return i({kind:"AddIndexNode",name:d.create(t)})},cloneWith(t,e){return i({...t,...e})},cloneWithColumns(t,e){return i({...t,columns:[...t.columns||[],...e]})}});var qr=class t{#e;constructor(e){this.#e=i(e)}unique(){return new t({...this.#e,node:f.cloneWithTableProps(this.#e.node,{addIndex:je.cloneWith(this.#e.node.addIndex,{unique:!0})})})}column(e){return new t({...this.#e,node:f.cloneWithTableProps(this.#e.node,{addIndex:je.cloneWithColumns(this.#e.node.addIndex,[at(e)])})})}columns(e){return new t({...this.#e,node:f.cloneWithTableProps(this.#e.node,{addIndex:je.cloneWithColumns(this.#e.node.addIndex,e.map(at))})})}expression(e){return new t({...this.#e,node:f.cloneWithTableProps(this.#e.node,{addIndex:je.cloneWithColumns(this.#e.node.addIndex,[e.toOperationNode()])})})}using(e){return new t({...this.#e,node:f.cloneWithTableProps(this.#e.node,{addIndex:je.cloneWith(this.#e.node.addIndex,{using:g.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())}};var At=class t{#e;constructor(e){this.#e=e}nullsNotDistinct(){return new t(Ee.cloneWith(this.#e,{nullsNotDistinct:!0}))}deferrable(){return new t(Ee.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(Ee.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(Ee.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(Ee.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};var Tt=class t{#e;constructor(e){this.#e=e}deferrable(){return new t(qe.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(qe.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(qe.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(qe.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};var Wt=class{#e;constructor(e){this.#e=e}$call(e){return e(this)}toOperationNode(){return this.#e}};var On=i({is(t){return t.kind==="RenameConstraintNode"},create(t,e){return i({kind:"RenameConstraintNode",oldName:d.create(t),newName:d.create(e)})}});var Dr=class{#e;constructor(e){this.#e=i(e)}renameTo(e){return new Be({...this.#e,node:f.cloneWithTableProps(this.#e.node,{renameTo:N(e)})})}setSchema(e){return new Be({...this.#e,node:f.cloneWithTableProps(this.#e.node,{setSchema:d.create(e)})})}alterColumn(e,r){let o=r(new Yt(e));return new _e({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new _e({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,Xi.create(e))})}renameColumn(e,r){return new _e({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,Zi.create(e,r))})}addColumn(e,r,o=j){let n=o(new Ie(v.create(e,Ne(r))));return new _e({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,Hi.create(n.toOperationNode()))})}modifyColumn(e,r,o=j){let n=o(new Ie(v.create(e,Ne(r))));return new _e({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,_i.create(n.toOperationNode()))})}addUniqueConstraint(e,r,o=j){let n=o(new At(Ee.create(r,e)));return new Be({...this.#e,node:f.cloneWithTableProps(this.#e.node,{addConstraint:Ct.create(n.toOperationNode())})})}addCheckConstraint(e,r,o=j){let n=o(new Wt(wt.create(r.toOperationNode(),e)));return new Be({...this.#e,node:f.cloneWithTableProps(this.#e.node,{addConstraint:Ct.create(n.toOperationNode())})})}addForeignKeyConstraint(e,r,o,n,a=j){let p=a(new bt(ye.create(r.map(m.create),N(o),n.map(m.create),e)));return new Br({...this.#e,constraintBuilder:p})}addPrimaryKeyConstraint(e,r,o=j){let n=o(new Tt(qe.create(r,e)));return new Be({...this.#e,node:f.cloneWithTableProps(this.#e.node,{addConstraint:Ct.create(n.toOperationNode())})})}dropConstraint(e){return new Ht({...this.#e,node:f.cloneWithTableProps(this.#e.node,{dropConstraint:vt.create(e)})})}renameConstraint(e,r){return new Ht({...this.#e,node:f.cloneWithTableProps(this.#e.node,{renameConstraint:On.create(e,r)})})}addIndex(e){return new qr({...this.#e,node:f.cloneWithTableProps(this.#e.node,{addIndex:je.create(e)})})}dropIndex(e){return new Be({...this.#e,node:f.cloneWithTableProps(this.#e.node,{dropIndex:Pe.create(e)})})}$call(e){return e(this)}},_e=class t{#e;constructor(e){this.#e=i(e)}alterColumn(e,r){let o=r(new Yt(e));return new t({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new t({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,Xi.create(e))})}renameColumn(e,r){return new t({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,Zi.create(e,r))})}addColumn(e,r,o=j){let n=o(new Ie(v.create(e,Ne(r))));return new t({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,Hi.create(n.toOperationNode()))})}modifyColumn(e,r,o=j){let n=o(new Ie(v.create(e,Ne(r))));return new t({...this.#e,node:f.cloneWithColumnAlteration(this.#e.node,_i.create(n.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())}};var kt=class extends Ve{transformPrimitiveValueList(e){return Oe.create(e.values.map(W.createImmediate))}transformValue(e){return W.createImmediate(e.value)}};var Lr=class t{#e;constructor(e){this.#e=i(e)}ifNotExists(){return new t({...this.#e,node:de.cloneWith(this.#e.node,{ifNotExists:!0})})}unique(){return new t({...this.#e,node:de.cloneWith(this.#e.node,{unique:!0})})}nullsNotDistinct(){return new t({...this.#e,node:de.cloneWith(this.#e.node,{nullsNotDistinct:!0})})}on(e){return new t({...this.#e,node:de.cloneWith(this.#e.node,{table:N(e)})})}column(e){return new t({...this.#e,node:de.cloneWithColumns(this.#e.node,[at(e)])})}columns(e){return new t({...this.#e,node:de.cloneWithColumns(this.#e.node,e.map(at))})}expression(e){return new t({...this.#e,node:de.cloneWithColumns(this.#e.node,[e.toOperationNode()])})}using(e){return new t({...this.#e,node:de.cloneWith(this.#e.node,{using:g.createWithSql(e)})})}where(...e){let r=new kt;return new t({...this.#e,node:u.cloneWithWhere(this.#e.node,r.transformNode(b(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())}};var Qr=class t{#e;constructor(e){this.#e=i(e)}ifNotExists(){return new t({...this.#e,node:er.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())}};function bn(t){if(Ro.includes(t))return t;throw new Error(`invalid OnCommitAction ${t}`)}var Pr=class t{#e;constructor(e){this.#e=i(e)}temporary(){return new t({...this.#e,node:J.cloneWith(this.#e.node,{temporary:!0})})}onCommit(e){return new t({...this.#e,node:J.cloneWith(this.#e.node,{onCommit:bn(e)})})}ifNotExists(){return new t({...this.#e,node:J.cloneWith(this.#e.node,{ifNotExists:!0})})}addColumn(e,r,o=j){let n=o(new Ie(v.create(e,Ne(r))));return new t({...this.#e,node:J.cloneWithColumn(this.#e.node,n.toOperationNode())})}addPrimaryKeyConstraint(e,r,o=j){let n=o(new Tt(qe.create(r,e)));return new t({...this.#e,node:J.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addUniqueConstraint(e,r,o=j){let n=o(new At(Ee.create(r,e)));return new t({...this.#e,node:J.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addCheckConstraint(e,r,o=j){let n=o(new Wt(wt.create(r.toOperationNode(),e)));return new t({...this.#e,node:J.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addForeignKeyConstraint(e,r,o,n,a=j){let p=a(new bt(ye.create(r.map(m.create),N(o),n.map(m.create),e)));return new t({...this.#e,node:J.cloneWithConstraint(this.#e.node,p.toOperationNode())})}modifyFront(e){return new t({...this.#e,node:J.cloneWithFrontModifier(this.#e.node,e.toOperationNode())})}modifyEnd(e){return new t({...this.#e,node:J.cloneWithEndModifier(this.#e.node,e.toOperationNode())})}as(e){return new t({...this.#e,node:J.cloneWith(this.#e.node,{selectQuery:Z(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())}};var Mr=class t{#e;constructor(e){this.#e=i(e)}on(e){return new t({...this.#e,node:Pe.cloneWith(this.#e.node,{table:N(e)})})}ifExists(){return new t({...this.#e,node:Pe.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:Pe.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())}};var Fr=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:Pt.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:Pt.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())}};var zr=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:Mt.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:Mt.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())}};var xe=i({is(t){return t.kind==="CreateViewNode"},create(t){return i({kind:"CreateViewNode",name:$.create(t)})},cloneWith(t,e){return i({...t,...e})}});var Ur=class{#e=new kt;transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}transformResult(e){return Promise.resolve(e.result)}};var Vr=class t{#e;constructor(e){this.#e=i(e)}temporary(){return new t({...this.#e,node:xe.cloneWith(this.#e.node,{temporary:!0})})}materialized(){return new t({...this.#e,node:xe.cloneWith(this.#e.node,{materialized:!0})})}ifNotExists(){return new t({...this.#e,node:xe.cloneWith(this.#e.node,{ifNotExists:!0})})}orReplace(){return new t({...this.#e,node:xe.cloneWith(this.#e.node,{orReplace:!0})})}columns(e){return new t({...this.#e,node:xe.cloneWith(this.#e.node,{columns:e.map(xi)})})}as(e){let r=e.withPlugin(new Ur).toOperationNode();return new t({...this.#e,node:xe.cloneWith(this.#e.node,{as:r})})}$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())}};var St=i({is(t){return t.kind==="DropViewNode"},create(t){return i({kind:"DropViewNode",name:$.create(t)})},cloneWith(t,e){return i({...t,...e})}});var Jr=class t{#e;constructor(e){this.#e=i(e)}materialized(){return new t({...this.#e,node:St.cloneWith(this.#e.node,{materialized:!0})})}ifExists(){return new t({...this.#e,node:St.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:St.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())}};var $r=i({is(t){return t.kind==="CreateTypeNode"},create(t){return i({kind:"CreateTypeNode",name:t})},cloneWithEnum(t,e){return i({...t,enum:Oe.create(e.map(W.createImmediate))})}});var jr=class t{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}asEnum(e){return new t({...this.#e,node:$r.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())}};var Kr=i({is(t){return t.kind==="DropTypeNode"},create(t){return i({kind:"DropTypeNode",name:t})},cloneWith(t,e){return i({...t,...e})}});var Gr=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:Kr.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())}};function eo(t){let e=".";if(t.includes(e)){let r=t.split(e).map(ls);if(r.length===2)return $.createWithSchema(r[0],r[1]);throw new Error(`invalid schemable identifier ${t}`)}else return $.create(t)}function ls(t){return t.trim()}var Rt=i({is(t){return t.kind==="RefreshMaterializedViewNode"},create(t){return i({kind:"RefreshMaterializedViewNode",name:$.create(t)})},cloneWith(t,e){return i({...t,...e})}});var Yr=class t{#e;constructor(e){this.#e=i(e)}concurrently(){return new t({...this.#e,node:Rt.cloneWith(this.#e.node,{concurrently:!0,withNoData:!1})})}withData(){return new t({...this.#e,node:Rt.cloneWith(this.#e.node,{withNoData:!1})})}withNoData(){return new t({...this.#e,node:Rt.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())}};var Hr=class t{#e;constructor(e){this.#e=e}createTable(e){return new Pr({queryId:y(),executor:this.#e,node:J.create(N(e))})}dropTable(e){return new zr({queryId:y(),executor:this.#e,node:Mt.create(N(e))})}createIndex(e){return new Lr({queryId:y(),executor:this.#e,node:de.create(e)})}dropIndex(e){return new Mr({queryId:y(),executor:this.#e,node:Pe.create(e)})}createSchema(e){return new Qr({queryId:y(),executor:this.#e,node:er.create(e)})}dropSchema(e){return new Fr({queryId:y(),executor:this.#e,node:Pt.create(e)})}alterTable(e){return new Dr({queryId:y(),executor:this.#e,node:f.create(N(e))})}createView(e){return new Vr({queryId:y(),executor:this.#e,node:xe.create(e)})}refreshMaterializedView(e){return new Yr({queryId:y(),executor:this.#e,node:Rt.create(e)})}dropView(e){return new Jr({queryId:y(),executor:this.#e,node:St.create(e)})}createType(e){return new jr({queryId:y(),executor:this.#e,node:$r.create(eo(e))})}dropType(e){return new Gr({queryId:y(),executor:this.#e,node:Kr.create(eo(e))})}withPlugin(e){return new t(this.#e.withPlugin(e))}withoutPlugins(){return new t(this.#e.withoutPlugins())}withSchema(e){return new t(this.#e.withPluginAtFront(new pe(e)))}};var Xr=class{ref(e){return new ir(e)}table(e){return new Rr(e)}};var Zr=class{#e;constructor(e){this.#e=e}async provideConnection(e){let r=await this.#e.acquireConnection();try{return await e(r)}finally{await this.#e.releaseConnection(r)}}};var _r=class t extends lt{#e;#t;#r;constructor(e,r,o,n=[]){super(n),this.#e=e,this.#t=r,this.#r=o}get adapter(){return this.#t}compileQuery(e,r){return this.#e.compileQuery(e,r)}provideConnection(e){return this.#r.provideConnection(e)}withPlugins(e){return new t(this.#e,this.#t,this.#r,[...this.plugins,...e])}withPlugin(e){return new t(this.#e,this.#t,this.#r,[...this.plugins,e])}withPluginAtFront(e){return new t(this.#e,this.#t,this.#r,[e,...this.plugins])}withConnectionProvider(e){return new t(this.#e,this.#t,e,[...this.plugins])}withoutPlugins(){return new t(this.#e,this.#t,this.#r,[])}};function ei(){return typeof performance<"u"&&T(performance.now)?performance.now():Date.now()}var ti=class{#e;#t;#r;#i;#n;#a=new WeakSet;constructor(e,r){this.#i=!1,this.#e=e,this.#t=r}async init(){if(this.#n)throw new Error("driver has already been destroyed");this.#r||(this.#r=this.#e.init().then(()=>{this.#i=!0}).catch(e=>(this.#r=void 0,Promise.reject(e)))),await this.#r}async acquireConnection(){if(this.#n)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.#p()&&this.#o(e),this.#a.add(e)),e}async releaseConnection(e){await this.#e.releaseConnection(e)}beginTransaction(e,r){return this.#e.beginTransaction(e,r)}commitTransaction(e){return this.#e.commitTransaction(e)}rollbackTransaction(e){return this.#e.rollbackTransaction(e)}savepoint(e,r,o){if(this.#e.savepoint)return this.#e.savepoint(e,r,o);throw new Error("The `savepoint` method is not supported by this driver")}rollbackToSavepoint(e,r,o){if(this.#e.rollbackToSavepoint)return this.#e.rollbackToSavepoint(e,r,o);throw new Error("The `rollbackToSavepoint` method is not supported by this driver")}releaseSavepoint(e,r,o){if(this.#e.releaseSavepoint)return this.#e.releaseSavepoint(e,r,o);throw new Error("The `releaseSavepoint` method is not supported by this driver")}async destroy(){this.#r&&(await this.#r,this.#n||(this.#n=this.#e.destroy().catch(e=>(this.#n=void 0,Promise.reject(e)))),await this.#n)}#p(){return this.#t.isLevelEnabled("query")||this.#t.isLevelEnabled("error")}#o(e){let r=e.executeQuery,o=e.streamQuery,n=this;e.executeQuery=async a=>{let p,c=ei();try{return await r.call(e,a)}catch(l){throw p=l,await n.#s(l,a,c),l}finally{p||await n.#u(a,c)}},e.streamQuery=async function*(a,p){let c,l=ei();try{for await(let h of o.call(e,a,p))yield h}catch(h){throw c=h,await n.#s(h,a,l),h}finally{c||await n.#u(a,l,!0)}}}async#s(e,r,o){await this.#t.error(()=>({level:"error",error:e,query:r,queryDurationMillis:this.#d(o)}))}async#u(e,r,o=!1){await this.#t.query(()=>({level:"query",isStream:o,query:e,queryDurationMillis:this.#d(r)}))}#d(e){return ei()-e}};var fs=()=>{},It=class{#e;#t;constructor(e){this.#e=e}async provideConnection(e){for(;this.#t;)await this.#t.catch(fs);return this.#t=this.#r(e).finally(()=>{this.#t=void 0}),this.#t}async#r(e){return await e(this.#e)}};var Ns=["read only","read write"],ys=["read uncommitted","read committed","repeatable read","serializable","snapshot"];function to(t){if(t.accessMode&&!Ns.includes(t.accessMode))throw new Error(`invalid transaction access mode ${t.accessMode}`);if(t.isolationLevel&&!ys.includes(t.isolationLevel))throw new Error(`invalid transaction isolation level ${t.isolationLevel}`)}var NE=i(["query","error"]),ri=class{#e;#t;constructor(e){T(e)?(this.#t=e,this.#e=i({query:!0,error:!0})):(this.#t=xs,this.#e=i({query:e.includes("query"),error:e.includes("error")}))}isLevelEnabled(e){return this.#e[e]}async query(e){this.#e.query&&await this.#t(e())}async error(e){this.#e.error&&await this.#t(e())}};function xs(t){if(t.level==="query"){let e=`kysely:query:${t.isStream?"stream:":""}`;console.log(`${e} ${t.query.sql}`),console.log(`${e} duration: ${t.queryDurationMillis.toFixed(1)}ms`)}else t.level==="error"&&(t.error instanceof Error?console.error(`kysely:error: ${t.error.stack??t.error.message}`):console.error(`kysely:error: ${JSON.stringify({error:t.error,query:t.query.sql,queryDurationMillis:t.queryDurationMillis})}`))}function Cn(t){return M(t)&&T(t.compile)}Symbol.asyncDispose??=Symbol("Symbol.asyncDispose");var Bt=class t extends ft{#e;constructor(e){let r,o;if(ws(e))r={executor:e.executor},o={...e};else{let n=e.dialect,a=n.createDriver(),p=n.createQueryCompiler(),c=n.createAdapter(),l=new ri(e.log??[]),h=new ti(a,l),q=new Zr(h),I=new _r(p,c,q,e.plugins??[]);r={executor:I},o={config:e,executor:I,dialect:n,driver:h}}super(r),this.#e=i(o)}get schema(){return new Hr(this.#e.executor)}get dynamic(){return new Xr}get introspection(){return this.#e.dialect.createIntrospector(this.withoutPlugins())}case(e){return new yt({node:ne.create(_(e)?void 0:Z(e))})}get fn(){return Wr()}transaction(){return new io({...this.#e})}startTransaction(){return new oo({...this.#e})}connection(){return new ro({...this.#e})}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new pe(e))})}withTables(){return new t({...this.#e})}async destroy(){await this.#e.driver.destroy()}get isTransaction(){return!1}getExecutor(){return this.#e.executor}executeQuery(e,r){r!==void 0&&ge("Passing `queryId` in `db.executeQuery` is deprecated and will result in a compile-time error in the future.");let o=Cn(e)?e.compile():e;return this.getExecutor().executeQuery(o)}async[Symbol.asyncDispose](){await this.destroy()}},ii=class t extends Bt{#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 t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new pe(e))})}withTables(){return new t({...this.#e})}};function ws(t){return M(t)&&M(t.config)&&M(t.driver)&&M(t.executor)&&M(t.dialect)}var ro=class{#e;constructor(e){this.#e=i(e)}async execute(e){return this.#e.executor.provideConnection(async r=>{let o=this.#e.executor.withConnectionProvider(new It(r)),n=new Bt({...this.#e,executor:o});return await e(n)})}},io=class t{#e;constructor(e){this.#e=i(e)}setAccessMode(e){return new t({...this.#e,accessMode:e})}setIsolationLevel(e){return new t({...this.#e,isolationLevel:e})}async execute(e){let{isolationLevel:r,accessMode:o,...n}=this.#e,a={isolationLevel:r,accessMode:o};return to(a),this.#e.executor.provideConnection(async p=>{let c=this.#e.executor.withConnectionProvider(new It(p)),l=new ii({...n,executor:c}),h=!1;try{await this.#e.driver.beginTransaction(p,a),h=!0;let q=await e(l);return await this.#e.driver.commitTransaction(p),q}catch(q){throw h&&await this.#e.driver.rollbackTransaction(p),q}})}},oo=class t{#e;constructor(e){this.#e=i(e)}setAccessMode(e){return new t({...this.#e,accessMode:e})}setIsolationLevel(e){return new t({...this.#e,isolationLevel:e})}async execute(){let{isolationLevel:e,accessMode:r,...o}=this.#e,n={isolationLevel:e,accessMode:r};to(n);let a=await br(this.#e.executor);return await this.#e.driver.beginTransaction(a.connection,n),new no({...o,connection:a,executor:this.#e.executor.withConnectionProvider(new It(a.connection))})}},no=class t extends ii{#e;#t;#r;constructor(e){let r={isCommitted:!1,isRolledBack:!1};e={...e,executor:new so(e.executor,r)};let{connection:o,...n}=e;super(n),this.#e=i(e),this.#r=r;let a=y();this.#t=p=>e.executor.compileQuery(p,a)}get isCommitted(){return this.#r.isCommitted}get isRolledBack(){return this.#r.isRolledBack}commit(){return tt(this.#r),new et(async()=>{await this.#e.driver.commitTransaction(this.#e.connection.connection),this.#r.isCommitted=!0,this.#e.connection.release()})}rollback(){return tt(this.#r),new et(async()=>{await this.#e.driver.rollbackTransaction(this.#e.connection.connection),this.#r.isRolledBack=!0,this.#e.connection.release()})}savepoint(e){return tt(this.#r),new et(async()=>(await this.#e.driver.savepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}rollbackToSavepoint(e){return tt(this.#r),new et(async()=>(await this.#e.driver.rollbackToSavepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}releaseSavepoint(e){return tt(this.#r),new et(async()=>(await this.#e.driver.releaseSavepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new pe(e))})}withTables(){return new t({...this.#e})}},et=class{#e;constructor(e){this.#e=e}async execute(){return await this.#e()}};function tt(t){if(t.isCommitted)throw new Error("Transaction is already committed");if(t.isRolledBack)throw new Error("Transaction is already rolled back")}var so=class t{#e;#t;constructor(e,r){e instanceof t?this.#e=e.#e:this.#e=e,this.#t=r}get adapter(){return this.#e.adapter}get plugins(){return this.#e.plugins}transformQuery(e,r){return this.#e.transformQuery(e,r)}compileQuery(e,r){return this.#e.compileQuery(e,r)}provideConnection(e){return this.#e.provideConnection(e)}executeQuery(e){return tt(this.#t),this.#e.executeQuery(e)}stream(e,r){return tt(this.#t),this.#e.stream(e,r)}withConnectionProvider(e){return new t(this.#e.withConnectionProvider(e),this.#t)}withPlugin(e){return new t(this.#e.withPlugin(e),this.#t)}withPlugins(e){return new t(this.#e.withPlugins(e),this.#t)}withPluginAtFront(e){return new t(this.#e.withPluginAtFront(e),this.#t)}withoutPlugins(){return new t(this.#e.withoutPlugins(),this.#t)}};var ao=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}get isRawBuilder(){return!0}as(e){return new uo(this,e)}$castTo(){return new t({...this.#e})}$notNull(){return new t(this.#e)}withPlugin(e){return new t({...this.#e,plugins:this.#e.plugins!==void 0?i([...this.#e.plugins,e]):i([e])})}toOperationNode(){return this.#r(this.#t())}compile(e){return this.#i(this.#t(e))}async execute(e){let r=this.#t(e);return r.executeQuery(this.#i(r))}#t(e){let r=e!==void 0?e.getExecutor():Je;return this.#e.plugins!==void 0?r.withPlugins(this.#e.plugins):r}#r(e){return e.transformQuery(this.#e.rawNode,this.#e.queryId)}#i(e){return e.compileQuery(this.#r(e),this.#e.queryId)}};function De(t){return new ao(t)}var uo=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}get rawBuilder(){return this.#e}toOperationNode(){return B.create(this.#e.toOperationNode(),C(this.#t)?this.#t.toOperationNode():d.create(this.#t))}};var A=Object.assign((t,...e)=>De({queryId:y(),rawNode:g.create(t,e?.map(vn)??[])}),{ref(t){return De({queryId:y(),rawNode:g.createWithChild(te(t))})},val(t){return De({queryId:y(),rawNode:g.createWithChild(O(t))})},value(t){return this.val(t)},table(t){return De({queryId:y(),rawNode:g.createWithChild(N(t))})},id(...t){let e=new Array(t.length+1).fill(".");return e[0]="",e[e.length-1]="",De({queryId:y(),rawNode:g.create(e,t.map(d.create))})},lit(t){return De({queryId:y(),rawNode:g.createWithChild(W.createImmediate(t))})},literal(t){return this.lit(t)},raw(t){return De({queryId:y(),rawNode:g.createWithSql(t)})},join(t,e=A`, `){let r=new Array(Math.max(2*t.length-1,0)),o=e.toOperationNode();for(let n=0;n<t.length;++n)r[2*n]=vn(t[n]),n!==t.length-1&&(r[2*n+1]=o);return De({queryId:y(),rawNode:g.createWithChildren(r)})}});function vn(t){return C(t)?t.toOperationNode():O(t)}var oi=class{nodeStack=[];get parentNode(){return this.nodeStack[this.nodeStack.length-2]}#e=i({AliasNode:this.visitAlias.bind(this),ColumnNode:this.visitColumn.bind(this),IdentifierNode:this.visitIdentifier.bind(this),SchemableIdentifierNode:this.visitSchemableIdentifier.bind(this),RawNode:this.visitRaw.bind(this),ReferenceNode:this.visitReference.bind(this),SelectQueryNode:this.visitSelectQuery.bind(this),SelectionNode:this.visitSelection.bind(this),TableNode:this.visitTable.bind(this),FromNode:this.visitFrom.bind(this),SelectAllNode:this.visitSelectAll.bind(this),AndNode:this.visitAnd.bind(this),OrNode:this.visitOr.bind(this),ValueNode:this.visitValue.bind(this),ValueListNode:this.visitValueList.bind(this),PrimitiveValueListNode:this.visitPrimitiveValueList.bind(this),ParensNode:this.visitParens.bind(this),JoinNode:this.visitJoin.bind(this),OperatorNode:this.visitOperator.bind(this),WhereNode:this.visitWhere.bind(this),InsertQueryNode:this.visitInsertQuery.bind(this),DeleteQueryNode:this.visitDeleteQuery.bind(this),ReturningNode:this.visitReturning.bind(this),CreateTableNode:this.visitCreateTable.bind(this),AddColumnNode:this.visitAddColumn.bind(this),ColumnDefinitionNode:this.visitColumnDefinition.bind(this),DropTableNode:this.visitDropTable.bind(this),DataTypeNode:this.visitDataType.bind(this),OrderByNode:this.visitOrderBy.bind(this),OrderByItemNode:this.visitOrderByItem.bind(this),GroupByNode:this.visitGroupBy.bind(this),GroupByItemNode:this.visitGroupByItem.bind(this),UpdateQueryNode:this.visitUpdateQuery.bind(this),ColumnUpdateNode:this.visitColumnUpdate.bind(this),LimitNode:this.visitLimit.bind(this),OffsetNode:this.visitOffset.bind(this),OnConflictNode:this.visitOnConflict.bind(this),OnDuplicateKeyNode:this.visitOnDuplicateKey.bind(this),CreateIndexNode:this.visitCreateIndex.bind(this),DropIndexNode:this.visitDropIndex.bind(this),ListNode:this.visitList.bind(this),PrimaryKeyConstraintNode:this.visitPrimaryKeyConstraint.bind(this),UniqueConstraintNode:this.visitUniqueConstraint.bind(this),ReferencesNode:this.visitReferences.bind(this),CheckConstraintNode:this.visitCheckConstraint.bind(this),WithNode:this.visitWith.bind(this),CommonTableExpressionNode:this.visitCommonTableExpression.bind(this),CommonTableExpressionNameNode:this.visitCommonTableExpressionName.bind(this),HavingNode:this.visitHaving.bind(this),CreateSchemaNode:this.visitCreateSchema.bind(this),DropSchemaNode:this.visitDropSchema.bind(this),AlterTableNode:this.visitAlterTable.bind(this),DropColumnNode:this.visitDropColumn.bind(this),RenameColumnNode:this.visitRenameColumn.bind(this),AlterColumnNode:this.visitAlterColumn.bind(this),ModifyColumnNode:this.visitModifyColumn.bind(this),AddConstraintNode:this.visitAddConstraint.bind(this),DropConstraintNode:this.visitDropConstraint.bind(this),RenameConstraintNode:this.visitRenameConstraint.bind(this),ForeignKeyConstraintNode:this.visitForeignKeyConstraint.bind(this),CreateViewNode:this.visitCreateView.bind(this),RefreshMaterializedViewNode:this.visitRefreshMaterializedView.bind(this),DropViewNode:this.visitDropView.bind(this),GeneratedNode:this.visitGenerated.bind(this),DefaultValueNode:this.visitDefaultValue.bind(this),OnNode:this.visitOn.bind(this),ValuesNode:this.visitValues.bind(this),SelectModifierNode:this.visitSelectModifier.bind(this),CreateTypeNode:this.visitCreateType.bind(this),DropTypeNode:this.visitDropType.bind(this),ExplainNode:this.visitExplain.bind(this),DefaultInsertValueNode:this.visitDefaultInsertValue.bind(this),AggregateFunctionNode:this.visitAggregateFunction.bind(this),OverNode:this.visitOver.bind(this),PartitionByNode:this.visitPartitionBy.bind(this),PartitionByItemNode:this.visitPartitionByItem.bind(this),SetOperationNode:this.visitSetOperation.bind(this),BinaryOperationNode:this.visitBinaryOperation.bind(this),UnaryOperationNode:this.visitUnaryOperation.bind(this),UsingNode:this.visitUsing.bind(this),FunctionNode:this.visitFunction.bind(this),CaseNode:this.visitCase.bind(this),WhenNode:this.visitWhen.bind(this),JSONReferenceNode:this.visitJSONReference.bind(this),JSONPathNode:this.visitJSONPath.bind(this),JSONPathLegNode:this.visitJSONPathLeg.bind(this),JSONOperatorChainNode:this.visitJSONOperatorChain.bind(this),TupleNode:this.visitTuple.bind(this),MergeQueryNode:this.visitMergeQuery.bind(this),MatchedNode:this.visitMatched.bind(this),AddIndexNode:this.visitAddIndex.bind(this),CastNode:this.visitCast.bind(this),FetchNode:this.visitFetch.bind(this),TopNode:this.visitTop.bind(this),OutputNode:this.visitOutput.bind(this),OrActionNode:this.visitOrAction.bind(this),CollateNode:this.visitCollate.bind(this)});visitNode=e=>{this.nodeStack.push(e),this.#e[e.kind](e),this.nodeStack.pop()}};var gs=/'/g,ni=class extends oi{#e="";#t=[];get numParameters(){return this.#t.length}compileQuery(e,r){return this.#e="",this.#t=[],this.nodeStack.splice(0,this.nodeStack.length),this.visitNode(e),i({query:e,queryId:r,sql:this.getSql(),parameters:[...this.#t]})}getSql(){return this.#e}visitSelectQuery(e){let r=this.parentNode!==void 0&&!ie.is(this.parentNode)&&!k.is(this.parentNode)&&!J.is(this.parentNode)&&!xe.is(this.parentNode)&&!Ar.is(this.parentNode);this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append("select"),e.distinctOn&&(this.append(" "),this.compileDistinctOn(e.distinctOn)),e.frontModifiers?.length&&(this.append(" "),this.compileList(e.frontModifiers," ")),e.top&&(this.append(" "),this.visitNode(e.top)),e.selections&&(this.append(" "),this.compileList(e.selections)),e.from&&(this.append(" "),this.visitNode(e.from)),e.joins&&(this.append(" "),this.compileList(e.joins," ")),e.where&&(this.append(" "),this.visitNode(e.where)),e.groupBy&&(this.append(" "),this.visitNode(e.groupBy)),e.having&&(this.append(" "),this.visitNode(e.having)),e.setOperations&&(this.append(" "),this.compileList(e.setOperations," ")),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),e.limit&&(this.append(" "),this.visitNode(e.limit)),e.offset&&(this.append(" "),this.visitNode(e.offset)),e.fetch&&(this.append(" "),this.visitNode(e.fetch)),e.endModifiers?.length&&(this.append(" "),this.compileList(this.sortSelectModifiers([...e.endModifiers])," ")),r&&this.append(")")}visitFrom(e){this.append("from "),this.compileList(e.froms)}visitSelection(e){this.visitNode(e.selection)}visitColumn(e){this.visitNode(e.column)}compileDistinctOn(e){this.append("distinct on ("),this.compileList(e),this.append(")")}compileList(e,r=", "){let o=e.length-1;for(let n=0;n<=o;n++)this.visitNode(e[n]),n<o&&this.append(r)}visitWhere(e){this.append("where "),this.visitNode(e.where)}visitHaving(e){this.append("having "),this.visitNode(e.having)}visitInsertQuery(e){let r=this.parentNode!==void 0&&!ie.is(this.parentNode)&&!g.is(this.parentNode)&&!ae.is(this.parentNode);this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append(e.replace?"replace":"insert"),e.ignore&&(ge("`InsertQueryNode.ignore` is deprecated. Use `InsertQueryNode.orAction` instead."),this.append(" ignore")),e.orAction&&(this.append(" "),this.visitNode(e.orAction)),e.top&&(this.append(" "),this.visitNode(e.top)),e.into&&(this.append(" into "),this.visitNode(e.into)),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.output&&(this.append(" "),this.visitNode(e.output)),e.values&&(this.append(" "),this.visitNode(e.values)),e.defaultValues&&(this.append(" "),this.append("default values")),e.onConflict&&(this.append(" "),this.visitNode(e.onConflict)),e.onDuplicateKey&&(this.append(" "),this.visitNode(e.onDuplicateKey)),e.returning&&(this.append(" "),this.visitNode(e.returning)),r&&this.append(")"),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitValues(e){this.append("values "),this.compileList(e.values)}visitDeleteQuery(e){let r=this.parentNode!==void 0&&!ie.is(this.parentNode)&&!g.is(this.parentNode);this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append("delete "),e.top&&(this.visitNode(e.top),this.append(" ")),this.visitNode(e.from),e.output&&(this.append(" "),this.visitNode(e.output)),e.using&&(this.append(" "),this.visitNode(e.using)),e.joins&&(this.append(" "),this.compileList(e.joins," ")),e.where&&(this.append(" "),this.visitNode(e.where)),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),e.limit&&(this.append(" "),this.visitNode(e.limit)),e.returning&&(this.append(" "),this.visitNode(e.returning)),r&&this.append(")"),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitReturning(e){this.append("returning "),this.compileList(e.selections)}visitAlias(e){this.visitNode(e.node),this.append(" as "),this.visitNode(e.alias)}visitReference(e){e.table&&(this.visitNode(e.table),this.append(".")),this.visitNode(e.column)}visitSelectAll(e){this.append("*")}visitIdentifier(e){this.append(this.getLeftIdentifierWrapper()),this.compileUnwrappedIdentifier(e),this.append(this.getRightIdentifierWrapper())}compileUnwrappedIdentifier(e){if(!E(e.name))throw new Error("a non-string identifier was passed to compileUnwrappedIdentifier.");this.append(this.sanitizeIdentifier(e.name))}visitAnd(e){this.visitNode(e.left),this.append(" and "),this.visitNode(e.right)}visitOr(e){this.visitNode(e.left),this.append(" or "),this.visitNode(e.right)}visitValue(e){e.immediate?this.appendImmediateValue(e.value):this.appendValue(e.value)}visitValueList(e){this.append("("),this.compileList(e.values),this.append(")")}visitTuple(e){this.append("("),this.compileList(e.values),this.append(")")}visitPrimitiveValueList(e){this.append("(");let{values:r}=e;for(let o=0;o<r.length;++o)this.appendValue(r[o]),o!==r.length-1&&this.append(", ");this.append(")")}visitParens(e){this.append("("),this.visitNode(e.node),this.append(")")}visitJoin(e){this.append(bs[e.joinType]),this.append(" "),this.visitNode(e.table),e.on&&(this.append(" "),this.visitNode(e.on))}visitOn(e){this.append("on "),this.visitNode(e.on)}visitRaw(e){let{sqlFragments:r,parameters:o}=e;for(let n=0;n<r.length;++n)this.append(r[n]),o.length>n&&this.visitNode(o[n])}visitOperator(e){this.append(e.operator)}visitTable(e){this.visitNode(e.table)}visitSchemableIdentifier(e){e.schema&&(this.visitNode(e.schema),this.append(".")),this.visitNode(e.identifier)}visitCreateTable(e){this.append("create "),e.frontModifiers&&e.frontModifiers.length>0&&(this.compileList(e.frontModifiers," "),this.append(" ")),e.temporary&&this.append("temporary "),this.append("table "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.table),e.selectQuery?(this.append(" as "),this.visitNode(e.selectQuery)):(this.append(" ("),this.compileList([...e.columns,...e.constraints??[]]),this.append(")"),e.onCommit&&(this.append(" on commit "),this.append(e.onCommit)),e.endModifiers&&e.endModifiers.length>0&&(this.append(" "),this.compileList(e.endModifiers," ")))}visitColumnDefinition(e){e.ifNotExists&&this.append("if not exists "),this.visitNode(e.column),this.append(" "),this.visitNode(e.dataType),e.unsigned&&this.append(" unsigned"),e.frontModifiers&&e.frontModifiers.length>0&&(this.append(" "),this.compileList(e.frontModifiers," ")),e.generated&&(this.append(" "),this.visitNode(e.generated)),e.identity&&this.append(" identity"),e.defaultTo&&(this.append(" "),this.visitNode(e.defaultTo)),e.notNull&&this.append(" not null"),e.unique&&this.append(" unique"),e.nullsNotDistinct&&this.append(" nulls not distinct"),e.primaryKey&&this.append(" primary key"),e.autoIncrement&&(this.append(" "),this.append(this.getAutoIncrement())),e.references&&(this.append(" "),this.visitNode(e.references)),e.check&&(this.append(" "),this.visitNode(e.check)),e.endModifiers&&e.endModifiers.length>0&&(this.append(" "),this.compileList(e.endModifiers," "))}getAutoIncrement(){return"auto_increment"}visitReferences(e){this.append("references "),this.visitNode(e.table),this.append(" ("),this.compileList(e.columns),this.append(")"),e.onDelete&&(this.append(" on delete "),this.append(e.onDelete)),e.onUpdate&&(this.append(" on update "),this.append(e.onUpdate))}visitDropTable(e){this.append("drop table "),e.ifExists&&this.append("if exists "),this.visitNode(e.table),e.cascade&&this.append(" cascade")}visitDataType(e){this.append(e.dataType)}visitOrderBy(e){this.append("order by "),this.compileList(e.items)}visitOrderByItem(e){this.visitNode(e.orderBy),e.collation&&(this.append(" "),this.visitNode(e.collation)),e.direction&&(this.append(" "),this.visitNode(e.direction)),e.nulls&&(this.append(" nulls "),this.append(e.nulls))}visitGroupBy(e){this.append("group by "),this.compileList(e.items)}visitGroupByItem(e){this.visitNode(e.groupBy)}visitUpdateQuery(e){let r=this.parentNode!==void 0&&!ie.is(this.parentNode)&&!g.is(this.parentNode)&&!ae.is(this.parentNode);if(this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append("update "),e.top&&(this.visitNode(e.top),this.append(" ")),e.table&&(this.visitNode(e.table),this.append(" ")),this.append("set "),e.updates&&this.compileList(e.updates),e.output&&(this.append(" "),this.visitNode(e.output)),e.from&&(this.append(" "),this.visitNode(e.from)),e.joins){if(!e.from)throw new Error("Joins in an update query are only supported as a part of a PostgreSQL 'update set from join' query. If you want to create a MySQL 'update join set' query, see https://kysely.dev/docs/examples/update/my-sql-joins");this.append(" "),this.compileList(e.joins," ")}e.where&&(this.append(" "),this.visitNode(e.where)),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),e.limit&&(this.append(" "),this.visitNode(e.limit)),e.returning&&(this.append(" "),this.visitNode(e.returning)),r&&this.append(")"),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitColumnUpdate(e){this.visitNode(e.column),this.append(" = "),this.visitNode(e.value)}visitLimit(e){this.append("limit "),this.visitNode(e.limit)}visitOffset(e){this.append("offset "),this.visitNode(e.offset)}visitOnConflict(e){this.append("on conflict"),e.columns?(this.append(" ("),this.compileList(e.columns),this.append(")")):e.constraint?(this.append(" on constraint "),this.visitNode(e.constraint)):e.indexExpression&&(this.append(" ("),this.visitNode(e.indexExpression),this.append(")")),e.indexWhere&&(this.append(" "),this.visitNode(e.indexWhere)),e.doNothing===!0?this.append(" do nothing"):e.updates&&(this.append(" do update set "),this.compileList(e.updates),e.updateWhere&&(this.append(" "),this.visitNode(e.updateWhere)))}visitOnDuplicateKey(e){this.append("on duplicate key update "),this.compileList(e.updates)}visitCreateIndex(e){this.append("create "),e.unique&&this.append("unique "),this.append("index "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.name),e.table&&(this.append(" on "),this.visitNode(e.table)),e.using&&(this.append(" using "),this.visitNode(e.using)),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.nullsNotDistinct&&this.append(" nulls not distinct"),e.where&&(this.append(" "),this.visitNode(e.where))}visitDropIndex(e){this.append("drop index "),e.ifExists&&this.append("if exists "),this.visitNode(e.name),e.table&&(this.append(" on "),this.visitNode(e.table)),e.cascade&&this.append(" cascade")}visitCreateSchema(e){this.append("create schema "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.schema)}visitDropSchema(e){this.append("drop schema "),e.ifExists&&this.append("if exists "),this.visitNode(e.schema),e.cascade&&this.append(" cascade")}visitPrimaryKeyConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("primary key ("),this.compileList(e.columns),this.append(")"),this.buildDeferrable(e)}buildDeferrable(e){e.deferrable!==void 0&&(e.deferrable?this.append(" deferrable"):this.append(" not deferrable")),e.initiallyDeferred!==void 0&&(e.initiallyDeferred?this.append(" initially deferred"):this.append(" initially immediate"))}visitUniqueConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("unique"),e.nullsNotDistinct&&this.append(" nulls not distinct"),this.append(" ("),this.compileList(e.columns),this.append(")"),this.buildDeferrable(e)}visitCheckConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("check ("),this.visitNode(e.expression),this.append(")")}visitForeignKeyConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("foreign key ("),this.compileList(e.columns),this.append(") "),this.visitNode(e.references),e.onDelete&&(this.append(" on delete "),this.append(e.onDelete)),e.onUpdate&&(this.append(" on update "),this.append(e.onUpdate)),this.buildDeferrable(e)}visitList(e){this.compileList(e.items)}visitWith(e){this.append("with "),e.recursive&&this.append("recursive "),this.compileList(e.expressions)}visitCommonTableExpression(e){this.visitNode(e.name),this.append(" as "),Ke(e.materialized)&&(e.materialized||this.append("not "),this.append("materialized ")),this.visitNode(e.expression)}visitCommonTableExpressionName(e){this.visitNode(e.table),e.columns&&(this.append("("),this.compileList(e.columns),this.append(")"))}visitAlterTable(e){this.append("alter table "),this.visitNode(e.table),this.append(" "),e.renameTo&&(this.append("rename to "),this.visitNode(e.renameTo)),e.setSchema&&(this.append("set schema "),this.visitNode(e.setSchema)),e.addConstraint&&this.visitNode(e.addConstraint),e.dropConstraint&&this.visitNode(e.dropConstraint),e.renameConstraint&&this.visitNode(e.renameConstraint),e.columnAlterations&&this.compileColumnAlterations(e.columnAlterations),e.addIndex&&this.visitNode(e.addIndex),e.dropIndex&&this.visitNode(e.dropIndex)}visitAddColumn(e){this.append("add column "),this.visitNode(e.column)}visitRenameColumn(e){this.append("rename column "),this.visitNode(e.column),this.append(" to "),this.visitNode(e.renameTo)}visitDropColumn(e){this.append("drop column "),this.visitNode(e.column)}visitAlterColumn(e){this.append("alter column "),this.visitNode(e.column),this.append(" "),e.dataType&&(this.announcesNewColumnDataType()&&this.append("type "),this.visitNode(e.dataType),e.dataTypeExpression&&(this.append("using "),this.visitNode(e.dataTypeExpression))),e.setDefault&&(this.append("set default "),this.visitNode(e.setDefault)),e.dropDefault&&this.append("drop default"),e.setNotNull&&this.append("set not null"),e.dropNotNull&&this.append("drop not null")}visitModifyColumn(e){this.append("modify column "),this.visitNode(e.column)}visitAddConstraint(e){this.append("add "),this.visitNode(e.constraint)}visitDropConstraint(e){this.append("drop constraint "),e.ifExists&&this.append("if exists "),this.visitNode(e.constraintName),e.modifier==="cascade"?this.append(" cascade"):e.modifier==="restrict"&&this.append(" restrict")}visitRenameConstraint(e){this.append("rename constraint "),this.visitNode(e.oldName),this.append(" to "),this.visitNode(e.newName)}visitSetOperation(e){this.append(e.operator),this.append(" "),e.all&&this.append("all "),this.visitNode(e.expression)}visitCreateView(e){this.append("create "),e.orReplace&&this.append("or replace "),e.materialized&&this.append("materialized "),e.temporary&&this.append("temporary "),this.append("view "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.name),this.append(" "),e.columns&&(this.append("("),this.compileList(e.columns),this.append(") ")),e.as&&(this.append("as "),this.visitNode(e.as))}visitRefreshMaterializedView(e){this.append("refresh materialized view "),e.concurrently&&this.append("concurrently "),this.visitNode(e.name),e.withNoData?this.append(" with no data"):this.append(" with data")}visitDropView(e){this.append("drop "),e.materialized&&this.append("materialized "),this.append("view "),e.ifExists&&this.append("if exists "),this.visitNode(e.name),e.cascade&&this.append(" cascade")}visitGenerated(e){this.append("generated "),e.always&&this.append("always "),e.byDefault&&this.append("by default "),this.append("as "),e.identity&&this.append("identity"),e.expression&&(this.append("("),this.visitNode(e.expression),this.append(")")),e.stored&&this.append(" stored")}visitDefaultValue(e){this.append("default "),this.visitNode(e.defaultValue)}visitSelectModifier(e){e.rawModifier?this.visitNode(e.rawModifier):this.append(Os[e.modifier]),e.of&&(this.append(" of "),this.compileList(e.of,", "))}visitCreateType(e){this.append("create type "),this.visitNode(e.name),e.enum&&(this.append(" as enum "),this.visitNode(e.enum))}visitDropType(e){this.append("drop type "),e.ifExists&&this.append("if exists "),this.visitNode(e.name)}visitExplain(e){this.append("explain"),(e.options||e.format)&&(this.append(" "),this.append(this.getLeftExplainOptionsWrapper()),e.options&&(this.visitNode(e.options),e.format&&this.append(this.getExplainOptionsDelimiter())),e.format&&(this.append("format"),this.append(this.getExplainOptionAssignment()),this.append(e.format)),this.append(this.getRightExplainOptionsWrapper()))}visitDefaultInsertValue(e){this.append("default")}visitAggregateFunction(e){this.append(e.func),this.append("("),e.distinct&&this.append("distinct "),this.compileList(e.aggregated),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),this.append(")"),e.withinGroup&&(this.append(" within group ("),this.visitNode(e.withinGroup),this.append(")")),e.filter&&(this.append(" filter("),this.visitNode(e.filter),this.append(")")),e.over&&(this.append(" "),this.visitNode(e.over))}visitOver(e){this.append("over("),e.partitionBy&&(this.visitNode(e.partitionBy),e.orderBy&&this.append(" ")),e.orderBy&&this.visitNode(e.orderBy),this.append(")")}visitPartitionBy(e){this.append("partition by "),this.compileList(e.items)}visitPartitionByItem(e){this.visitNode(e.partitionBy)}visitBinaryOperation(e){this.visitNode(e.leftOperand),this.append(" "),this.visitNode(e.operator),this.append(" "),this.visitNode(e.rightOperand)}visitUnaryOperation(e){this.visitNode(e.operator),this.isMinusOperator(e.operator)||this.append(" "),this.visitNode(e.operand)}isMinusOperator(e){return ee.is(e)&&e.operator==="-"}visitUsing(e){this.append("using "),this.compileList(e.tables)}visitFunction(e){this.append(e.func),this.append("("),this.compileList(e.arguments),this.append(")")}visitCase(e){this.append("case"),e.value&&(this.append(" "),this.visitNode(e.value)),e.when&&(this.append(" "),this.compileList(e.when," ")),e.else&&(this.append(" else "),this.visitNode(e.else)),this.append(" end"),e.isStatement&&this.append(" case")}visitWhen(e){this.append("when "),this.visitNode(e.condition),e.result&&(this.append(" then "),this.visitNode(e.result))}visitJSONReference(e){this.visitNode(e.reference),this.visitNode(e.traversal)}visitJSONPath(e){e.inOperator&&this.visitNode(e.inOperator),this.append("'$");for(let r of e.pathLegs)this.visitNode(r);this.append("'")}visitJSONPathLeg(e){let r=e.type==="ArrayLocation";this.append(r?"[":"."),this.append(String(e.value)),r&&this.append("]")}visitJSONOperatorChain(e){for(let r=0,o=e.values.length;r<o;r++)r===o-1?this.visitNode(e.operator):this.append("->"),this.visitNode(e.values[r])}visitMergeQuery(e){e.with&&(this.visitNode(e.with),this.append(" ")),this.append("merge "),e.top&&(this.visitNode(e.top),this.append(" ")),this.append("into "),this.visitNode(e.into),e.using&&(this.append(" "),this.visitNode(e.using)),e.whens&&(this.append(" "),this.compileList(e.whens," ")),e.returning&&(this.append(" "),this.visitNode(e.returning)),e.output&&(this.append(" "),this.visitNode(e.output)),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitMatched(e){e.not&&this.append("not "),this.append("matched"),e.bySource&&this.append(" by source")}visitAddIndex(e){this.append("add "),e.unique&&this.append("unique "),this.append("index "),this.visitNode(e.name),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.using&&(this.append(" using "),this.visitNode(e.using))}visitCast(e){this.append("cast("),this.visitNode(e.expression),this.append(" as "),this.visitNode(e.dataType),this.append(")")}visitFetch(e){this.append("fetch next "),this.visitNode(e.rowCount),this.append(` rows ${e.modifier}`)}visitOutput(e){this.append("output "),this.compileList(e.selections)}visitTop(e){this.append(`top(${e.expression})`),e.modifiers&&this.append(` ${e.modifiers}`)}visitOrAction(e){this.append(e.action)}visitCollate(e){this.append("collate "),this.visitNode(e.collation)}append(e){this.#e+=e}appendValue(e){this.addParameter(e),this.append(this.getCurrentParameterPlaceholder())}getLeftIdentifierWrapper(){return'"'}getRightIdentifierWrapper(){return'"'}getCurrentParameterPlaceholder(){return"$"+this.numParameters}getLeftExplainOptionsWrapper(){return"("}getExplainOptionAssignment(){return" "}getExplainOptionsDelimiter(){return", "}getRightExplainOptionsWrapper(){return")"}sanitizeIdentifier(e){let r=this.getLeftIdentifierWrapper(),o=this.getRightIdentifierWrapper(),n="";for(let a of e)n+=a,a===r?n+=r:a===o&&(n+=o);return n}sanitizeStringLiteral(e){return e.replace(gs,"''")}addParameter(e){this.#t.push(e)}appendImmediateValue(e){if(E(e))this.appendStringLiteral(e);else if(Qe(e)||Ke(e)||ot(e))this.append(e.toString());else if(it(e))this.append("null");else if(So(e))this.appendImmediateValue(e.toISOString());else throw new Error(`invalid immediate value ${e}`)}appendStringLiteral(e){this.append("'"),this.append(this.sanitizeStringLiteral(e)),this.append("'")}sortSelectModifiers(e){return e.sort((r,o)=>r.modifier&&o.modifier?En[r.modifier]-En[o.modifier]:1),i(e)}compileColumnAlterations(e){this.compileList(e)}announcesNewColumnDataType(){return!0}},Os=i({ForKeyShare:"for key share",ForNoKeyUpdate:"for no key update",ForUpdate:"for update",ForShare:"for share",NoWait:"nowait",SkipLocked:"skip locked",Distinct:"distinct"}),En=i({ForKeyShare:1,ForNoKeyUpdate:1,ForUpdate:1,ForShare:1,NoWait:2,SkipLocked:2,Distinct:0}),bs=i({InnerJoin:"inner join",LeftJoin:"left join",RightJoin:"right join",FullJoin:"full join",CrossJoin:"cross join",LateralInnerJoin:"inner join lateral",LateralLeftJoin:"left join lateral",LateralCrossJoin:"cross join lateral",OuterApply:"outer apply",CrossApply:"cross apply",Using:"using"});var si=class{async init(){}async acquireConnection(){return new po}async beginTransaction(){}async commitTransaction(){}async rollbackTransaction(){}async releaseConnection(){}async destroy(){}async releaseSavepoint(){}async rollbackToSavepoint(){}async savepoint(){}},po=class{async executeQuery(){return{rows:[]}}async*streamQuery(){}};var ai=class{get supportsCreateIfNotExists(){return!0}get supportsTransactionalDdl(){return!1}get supportsReturning(){return!1}get supportsOutput(){return!1}};var Cs=/`/g,ui=class extends ni{getCurrentParameterPlaceholder(){return"?"}getLeftExplainOptionsWrapper(){return""}getExplainOptionAssignment(){return"="}getExplainOptionsDelimiter(){return" "}getRightExplainOptionsWrapper(){return""}getLeftIdentifierWrapper(){return"`"}getRightIdentifierWrapper(){return"`"}sanitizeIdentifier(e){return e.replace(Cs,"``")}visitCreateIndex(e){this.append("create "),e.unique&&this.append("unique "),this.append("index "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.name),e.using&&(this.append(" using "),this.visitNode(e.using)),e.table&&(this.append(" on "),this.visitNode(e.table)),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.where&&(this.append(" "),this.visitNode(e.where))}};var An="ea586330-2c93-47c8-908d-981d9d270f9d",vs=60*60,pi=class extends ai{get supportsTransactionalDdl(){return!1}get supportsReturning(){return!1}async acquireMigrationLock(e,r){await A`select get_lock(${A.lit(An)}, ${A.lit(vs)})`.execute(e)}async releaseMigrationLock(e,r){await A`select release_lock(${A.lit(An)})`.execute(e)}};function kn(t){return new Bt({dialect:{createAdapter:()=>new t.Adapter,createDriver:()=>new si,createIntrospector:()=>null,createQueryCompiler:()=>new t.QueryCompiler},plugins:[...t.noParameters?[new co]:[]]})}var co=class{#e=new mo;transformQuery(e){return this.#e.transformNode(e.node)}transformResult(e){return Promise.resolve(e.result)}},mo=class extends Ve{transformPrimitiveValueList(e){return Oe.create(e.values.map(W.createImmediate))}transformValue(e){return{...super.transformValue(e),immediate:!0}}};function Ae(t,e){let r=t.compile();return{parameters:r.parameters,sql:r.sql,transformations:e?.transformations}}function Xt(t,e){let r=Es(t,e);return o=>o.where(n=>n.or(r.map(a=>n.and(a.map(([p,c])=>n(p,c===null?"is":Array.isArray(c)?"in":"=",c))))))}function Sn(t,e){let r={};for(let o of Object.values(e)){let{isInPrimaryKey:n,name:a}=o;n&&(r[a]=t[a]??null)}return r}function Es(t,e){let r=[],o=[],n=G();for(let c of t){let l=[];for(let h of Object.values(e)){let{isInPrimaryKey:q,name:I}=h;q&&(c===t.at(0)&&r.push(n.ref(I)),l.push(lo(c[I]??null,h)))}o.push(r.length===1?l.at(0):Tn(l))}let a=r.length===1?r.at(0):Tn(r),p=o.length===1?o.at(0):o;return[[[a,p]]]}function Tn(t){return A`(${A.join(t,A`, `)})`}function ho(t,e,r){return()=>Array.isArray(e)?e.map(o=>Wn(o,r)):Wn(e,r)}function Wn(t,e){return Object.keys(t).length===0?{[Object.keys(e).at(0)]:A`default`}:Object.entries(t).reduce((r,[o,n])=>({...r,[o]:lo(n,e[o])}),{})}function lo(t,e){let{datatype:r}=e,o=G();return t===null?o.lit(null):r.isNative?o.val(t):o.cast(o.val(t),A.id(r.schema,r.name))}function fo(t,e){if(t.length===0)return n=>n.lit(!0);let r=[],o=[];for(let n=0;n<t.length;n++)o.push(As(t[n],e)),(n===t.length-1||t[n].after==="or")&&(r.push(o),o=[]);return n=>{let a=r.map(p=>n.and(p.map(c=>c(n))));return n.or(a)}}function As(t,e){return t.kind==="ColumnFilter"?r=>{let{column:o,operator:n,value:a}=t,p=e[o];return r(p.datatype.group==="raw"?r.cast(o,"text"):o,n,lo(a,p))}:fo(t.filters,e)}var Rn={bigint:{group:"numeric"},binary:{group:"string"},bit:{group:"raw"},blob:{group:"string"},char:{group:"string"},"char binary":{group:"string"},date:{group:"datetime"},datetime:{group:"datetime"},dec:{group:"numeric"},decimal:{group:"numeric"},double:{group:"numeric"},"double precision":{group:"numeric"},enum:{group:"enum"},fixed:{group:"numeric"},float:{group:"numeric"},geometry:{group:"raw"},geometrycollection:{group:"raw"},int:{group:"numeric"},integer:{group:"numeric"},json:{group:"json"},linestring:{group:"raw"},long:{group:"string"},"long varchar":{group:"string"},longblob:{group:"string"},longtext:{group:"string"},longvarbinary:{group:"string"},longvarchar:{group:"string"},mediumblob:{group:"string"},mediumint:{group:"numeric"},mediumtext:{group:"string"},multilinestring:{group:"raw"},multipoint:{group:"raw"},multipolygon:{group:"raw"},numeric:{group:"numeric"},point:{group:"raw"},polygon:{group:"raw"},real:{group:"numeric"},set:{group:"raw"},smallint:{group:"numeric"},text:{group:"string"},time:{group:"time"},timestamp:{group:"datetime"},tinyblob:{group:"string"},tinyint:{group:"numeric"},tinytext:{group:"string"},varbinary:{group:"string"},varchar:{group:"string"},"varchar binary":{group:"string"},vector:{group:"raw"},year:{group:"numeric"}};function Te(t){return kn({...t,Adapter:pi,QueryCompiler:ui})}function No(t,e){let{rows:r,table:{columns:o,name:n}}=t,a=Te(e);return Ae(a.deleteFrom(n).$call(Xt(r,o)).$castTo())}function Zt(t,e){let{rows:r,table:{columns:o,name:n}}=t,a=Te(e);return Ae(a.insertInto(n).values(ho("insert",r,o)).$castTo())}function di(t,e){let{criteria:r,table:{columns:o,name:n}}=t,a=Te(e);return Ae(a.selectFrom(n).$call(Xt(r,o)).select(Object.keys(o)).select(In().as("__ps_inserted_at__")))}function yo(t,e){let{changes:r,row:o,table:{columns:n,name:a}}=t,p=Te(e);return Ae(p.selectFrom(a).$call(Xt([{...o,...r}],n)).select(Object.keys(n)).select(In().as("__ps_updated_at__")))}function xo(t,e){let{filter:r={after:"and",filters:[],kind:"FilterGroup"},pageIndex:o,pageSize:n,sortOrder:a,table:{columns:p,name:c}}=t,l=Te(e),h=fo(r.filters,p),q=l.selectFrom(c).where(h).select(I=>I.cast(I.fn.coalesce(I.fn.countAll(),A.lit(0)),"char").as("value"));return Ae(l.with("count",()=>q).selectFrom([c,"count"]).where(h).select(Object.keys(p)).select(A.ref("count.value").as("__ps_count__")).$call(I=>a.reduce((H,U)=>H.orderBy(U.column,U.direction),I)).limit(n).offset(A.lit(BigInt(o)*BigInt(n))))}function Ts(){return[]}function wo(t,e){let{changes:r,row:o,table:{columns:n,name:a,schema:p}}=t,c=Te(e);return Ae(c.withSchema(p).updateTable(a).set(ho("update",r,n)).$call(Xt([o],n)).$castTo())}function In(){return A`cast(unix_timestamp(now(3)) * 1000 as unsigned)`}function Bn(t,e){let r=[];for(let{selection:o}of t.selections??[])if(We.is(o)&&m.is(o.column))r.push(go(o.column.column.name),Oo(e,o.column.column.name));else if(m.is(o))r.push(go(o.column.name),Oo(e,o.column.name));else if(B.is(o)&&d.is(o.alias))r.push(go(o.alias.name),Oo(e,o.alias.name));else throw new Error("can't extract column names from the select query node");return r}function go(t){return new x(W.createImmediate(t))}function Oo(t,e){return new x(We.create(m.create(e),K.create(t)))}function qn(t){return A`(select cast(coalesce(json_arrayagg(json_object(${A.join(Ws(t.toOperationNode(),"agg"))})), '[]') as json) from ${t} as agg)`}function Ws(t,e){try{return Bn(t,e)}catch{throw new Error("MySQL jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.")}}function bo(t){return Ae(Te(t).selectFrom("information_schema.tables as t").where("t.TABLE_SCHEMA","=",A`database()`).where("t.TABLE_TYPE","in",["BASE TABLE","VIEW"]).select(["t.TABLE_SCHEMA as schema","t.TABLE_NAME as name","t.TABLE_TYPE as type"]).$narrowType().select(e=>qn(e.selectFrom("information_schema.columns as c").leftJoin("information_schema.KEY_COLUMN_USAGE as kcu",r=>r.onRef("kcu.TABLE_SCHEMA","=","c.TABLE_SCHEMA").onRef("kcu.TABLE_NAME","=","c.TABLE_NAME").onRef("kcu.COLUMN_NAME","=","c.COLUMN_NAME").on("kcu.POSITION_IN_UNIQUE_CONSTRAINT","is not",null)).whereRef("c.TABLE_SCHEMA","=","t.TABLE_SCHEMA").whereRef("c.TABLE_NAME","=","t.TABLE_NAME").select(["c.COLUMN_NAME as name","c.COLUMN_TYPE as datatype","c.ORDINAL_POSITION as position","kcu.REFERENCED_TABLE_NAME as fk_table","kcu.REFERENCED_COLUMN_NAME as fk_column"]).select(r=>[r("c.EXTRA","=","auto_increment").as("autoincrement"),r("c.EXTRA","in",["on update CURRENT_TIMESTAMP","STORED GENERATED","VIRTUAL GENERATED"]).as("computed"),r("c.COLUMN_KEY","=","PRI").as("pk"),r("c.IS_NULLABLE","=","YES").as("nullable")])).as("columns")).orderBy("t.TABLE_SCHEMA").orderBy("t.TABLE_NAME").orderBy("t.TABLE_TYPE"))}function Co(){return[{columns:[{autoincrement:1,computed:0,datatype:"int",fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"binary(16)",fk_column:null,fk_table:null,name:"uuid",nullable:1,pk:0,position:2},{autoincrement:0,computed:0,datatype:"varchar(255)",fk_column:null,fk_table:null,name:"name",nullable:1,pk:0,position:3},{autoincrement:0,computed:1,datatype:"text",fk_column:null,fk_table:null,name:"id_name",nullable:1,pk:0,position:4}],name:"animals",schema:"studio",type:"BASE TABLE"},{columns:[{autoincrement:1,computed:0,datatype:"int",fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"timestamp",fk_column:null,fk_table:null,name:"created_at",nullable:1,pk:0,position:2},{autoincrement:0,computed:0,datatype:"enum('admin','maintainer','member')",fk_column:null,fk_table:null,name:"role",nullable:0,pk:0,position:3},{autoincrement:0,computed:0,datatype:"int",fk_column:"id",fk_table:"animals",name:"animal_id",nullable:1,pk:0,position:4}],name:"users",schema:"studio",type:"BASE TABLE"}]}function vo(t){let e=Te(t),r=A`@@session.time_zone`;return Ae(e.selectNoFrom(e.case().when(r,"=","SYSTEM").then(A`@@system_time_zone`).else(r).end().as("timezone")).$narrowType())}function Eo(){return[{timezone:"UTC"}]}function ks(t){let{executor:e,...r}=t;return{async delete(o,n){try{let a=No(o,r),[p]=await e.execute(a,n);return p?R({error:p,query:a}):[null,{...o,query:a}]}catch(a){return R({error:a})}},async insert(o,n){try{let{rows:a,table:p}=o,{columns:c}=p,l=Object.values(c).find(S=>S.isAutoincrement),h=a.map(S=>Sn(S,c)),q=h.some(S=>{let D=Object.values(S);return D.length===0||D.some(se=>se==null)});if(!l&&q)return R({error:new Error("Cannot proceed with the insertion, some rows cannot be refetched after insertion."),query:Zt(o,r)});if(!q){let S=Zt(o,r),D=di({criteria:h,table:p},r),se=[S,D],[[_t],qt]=await e.executeSequence(se,n),rt=ci(se);if(_t)return R({error:_t,query:rt});let[Dt,Lt]=qt;return Dt?R({error:new Error("Failed to refetch inserted rows - please refresh.",{cause:Dt}),query:rt}):[null,{rows:Lt,query:rt}]}let I=await Promise.all(a.map(async S=>{let D=Zt({rows:[S],table:p},r),[se,_t]=await e.execute(D,n);if(se)return R({error:se,query:D});let{name:qt}=l,rt=S[qt]||_t[0]?.insertId;if(!rt)return R({error:new Error("Could not determine value for autoincrement column to refetch inserted row."),query:D});let Dt=di({criteria:[{[qt]:rt}],table:{...p,columns:Object.values(c).reduce((To,Wo)=>{let{name:ko}=Wo;return To[ko]={...Wo,isInPrimaryKey:ko===qt},To},{})}},r),[Lt,Ln]=await e.execute(Dt,n),mi=ci([D,Dt]);if(Lt)return console.error("Error refetching inserted row:",Lt),R({error:new Error("Failed to refetch inserted row - please refresh.",{cause:Lt}),query:mi});let[Ao]=Ln;return Ao?[null,{row:Ao,query:mi}]:R({error:new Error("Refetch query returned no results for inserted row."),query:mi})})),H=[],U=null,Le=[];for(let S=0;S<I.length;S++){let[D,se]=I[S];D?(Le.push([S,D]),D.query&&(U=U?ci([U,D.query]):D.query)):(H.push(se.row),se.query&&(U=U?ci([U,se.query]):se.query))}return Le.length>0?R({error:new AggregateError(Le.map(([,S])=>S),`Row${Le.length>1?"s":""} ${Le.map(([S])=>S).join(", ")} could not be inserted or refetched.`),query:U}):[null,{rows:H,query:U}]}catch(a){return R({error:a})}},async introspect(o){try{let n=bo(t),a=vo(t),[[p,c],[l,h]]=await Promise.all([e.execute(n,o),e.execute(a,o)]);if(p)return R({error:p,query:n});if(l)return R({error:l,query:a});let q=h[0]?.timezone;return q?[null,Dn({query:n,tables:c,timezone:q})]:R({error:new Error("Timezone not found"),query:a})}catch(n){return R({error:n})}},async query(o,n){try{let a=xo(o,r),[p,c]=await e.execute(a,n);return p?R({error:p,query:a}):[null,{filteredRowCount:c[0]?.__ps_count__||"0",rows:c,query:a}]}catch(a){return R({error:a})}},async update(o,n){try{let a=wo(o,r),p=yo(o,r),[[c],l]=await e.executeSequence([a,p],n);if(c)return R({error:c,query:a});let[h,q]=l;if(h)return R({error:h,query:a});let[I]=q;return I?[null,{row:I,query:a}]:R({error:new Error("Updated row not found"),query:a})}catch(a){return R({error:a})}}}}function Dn(t){let{query:e,tables:r,timezone:o}=t;return r.reduce((n,a)=>{let{schemas:p}=n,{columns:c,name:l,schema:h}=a,q=c.sort((I,H)=>I.position-H.position).reduce((I,H)=>{let{datatype:U,name:Le}=H,S=U.indexOf("("),D=(S>-1?U.substring(0,S):U).trim().toLowerCase();return{...I,[Le]:{datatype:{...Rn[D]||{group:"raw"},isArray:!1,isNative:!0,name:D,options:D==="enum"?U.slice(6,-2).split("','"):[],schema:h},fkColumn:H.fk_column,fkSchema:h,fkTable:H.fk_table,isAutoincrement:!!H.autoincrement,isComputed:!!H.computed,isInPrimaryKey:!!H.pk,name:Le,nullable:!!H.nullable,schema:h,table:l}}},{});return p[h]===void 0&&(p[h]={name:h,tables:{}}),p[h].tables[l]={columns:q,name:l,schema:h},n},{filterOperators:Ss,query:e,schemas:{},timezone:o})}var Ss=["=","!=",">",">=","<","<=","is","is not","like","not like"];function Rs(){let t=Co(),[{timezone:e}]=Eo();return Dn({tables:t,timezone:e,query:{parameters:[],sql:"<mocked>"}})}function ci(t){let[e,r]=t;return{parameters:e.parameters.concat(r.parameters),sql:`${e.sql};
|
|
2
|
+
${r.sql}`}}function Is(t){return{parameters:[t],sql:"kill ?"}}
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vZGF0YS9teXNxbC1jb3JlL2luZGV4LnRzIiwgIi4uLy4uLy4uL2RhdGEvYWRhcHRlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3V0aWwvb2JqZWN0LXV0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXNjaGVtYS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXRhYmxlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtdGFibGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS90YWJsZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZXhwcmVzc2lvbi9leHByZXNzaW9uLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LW1vZGlmaWVyLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29yLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvam9pbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYmluYXJ5LW9wZXJhdGlvbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LWFsbC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9keW5hbWljL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcmRlci1ieS1pdGVtLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbGxhdGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvb3JkZXItYnktaXRlbS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9sb2ctb25jZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9qc29uLXJlZmVyZW5jZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvanNvbi1vcGVyYXRvci1jaGFpbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3ByaW1pdGl2ZS12YWx1ZS1saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3JkZXItYnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3BhcnRpdGlvbi1ieS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3Zlci1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZnJvbS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZ3JvdXAtYnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2hhdmluZy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS91cGRhdGUtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3VzaW5nLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWxldGUtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3doZXJlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yZXR1cm5pbmctbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2V4cGxhaW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3doZW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21lcmdlLXF1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vdXRwdXQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvam9pbi1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcGFydGl0aW9uLWJ5LWl0ZW0tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9wYXJ0aXRpb24tYnktcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vdmVyLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3Rpb24tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdmFsdWVzLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LWluc2VydC12YWx1ZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2luc2VydC12YWx1ZXMtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY29sdW1uLXVwZGF0ZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3VwZGF0ZS1zZXQtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb24tZHVwbGljYXRlLWtleS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9pbnNlcnQtcmVzdWx0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9uby1yZXN1bHQtZXJyb3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vbi1jb25mbGljdC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vbi1jb25mbGljdC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdG9wLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvdG9wLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29yLWFjdGlvbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9pbnNlcnQtcXVlcnktYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvZGVsZXRlLXJlc3VsdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2xpbWl0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2RlbGV0ZS1xdWVyeS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci91cGRhdGUtcmVzdWx0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci91cGRhdGUtcXVlcnktYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5hbWUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2N0ZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3dpdGgtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvd2l0aC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9yYW5kb20tc3RyaW5nLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9xdWVyeS1pZC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXRyYW5zZm9ybWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21hdGNoZWQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9tZXJnZS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2RlZmVycmVkLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9wcm92aWRlLWNvbnRyb2xsZWQtY29ubmVjdGlvbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWV4ZWN1dG9yL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9tZXJnZS1yZXN1bHQuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL21lcmdlLXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1jcmVhdG9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3BhcnNlLXV0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2pvaW4tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb2Zmc2V0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9ncm91cC1ieS1pdGVtLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvZ3JvdXAtYnktcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2V0LW9wZXJhdGlvbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3NldC1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9mZXRjaC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2ZldGNoLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZ2dyZWdhdGUtZnVuY3Rpb24tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Z1bmN0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS91bmFyeS1vcGVyYXRpb24tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci91bmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9jYXNlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbGVnLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2pzb24tcGF0aC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdHVwbGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2RhdGEtdHlwZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jYXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9leHByZXNzaW9uLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2R5bmFtaWMvZHluYW1pYy10YWJsZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FkZC1jb2x1bW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kcm9wLWNvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVuYW1lLWNvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlcy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2RlZmF1bHQtdmFsdWUtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZ2VuZXJhdGVkLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LXZhbHVlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvb24tbW9kaWZ5LWFjdGlvbi1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY29sdW1uLWRlZmluaXRpb24tYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21vZGlmeS1jb2x1bW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWx0ZXItY29sdW1uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItY29sdW1uLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtZXhlY3V0b3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYWRkLWZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9hbHRlci10YWJsZS1kcm9wLWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2FsdGVyLXRhYmxlLWFkZC1pbmRleC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NoZWNrLWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3JlbmFtZS1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BsdWdpbi9pbW1lZGlhdGUtdmFsdWUvaW1tZWRpYXRlLXZhbHVlLXRyYW5zZm9ybWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS1pbmRleC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS1zY2hlbWEtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9vbi1jb21taXQtYWN0aW9uLXBhcnNlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS10YWJsZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3AtaW5kZXgtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9kcm9wLXNjaGVtYS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3AtdGFibGUtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY3JlYXRlLXZpZXctYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3Atdmlldy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3Atdmlldy1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9jcmVhdGUtdHlwZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC10eXBlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvZHJvcC10eXBlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvaWRlbnRpZmllci1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL3NjaGVtYS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2R5bmFtaWMvZHluYW1pYy5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RyaXZlci9kZWZhdWx0LWNvbm5lY3Rpb24tcHJvdmlkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1leGVjdXRvci9kZWZhdWx0LXF1ZXJ5LWV4ZWN1dG9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9wZXJmb3JtYW5jZS1ub3cuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvcnVudGltZS1kcml2ZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvc2luZ2xlLWNvbm5lY3Rpb24tcHJvdmlkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvZHJpdmVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9sb2cuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2NvbXBpbGFibGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9reXNlbHkuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9yYXctYnVpbGRlci9yYXctYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3Jhdy1idWlsZGVyL3NxbC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXZpc2l0b3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1jb21waWxlci9kZWZhdWx0LXF1ZXJ5LWNvbXBpbGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZHJpdmVyL2R1bW15LWRyaXZlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RpYWxlY3QvZGlhbGVjdC1hZGFwdGVyLWJhc2UuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kaWFsZWN0L215c3FsL215c3FsLXF1ZXJ5LWNvbXBpbGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZGlhbGVjdC9teXNxbC9teXNxbC1hZGFwdGVyLmpzIiwgIi4uLy4uLy4uL2RhdGEvcXVlcnkudHMiLCAiLi4vLi4vLi4vZGF0YS9teXNxbC1jb3JlL2RhdGF0eXBlLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9idWlsZGVyLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9kbWwudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2pzb24tb2JqZWN0LWFyZ3MuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9oZWxwZXJzL215c3FsLmpzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9pbnRyb3NwZWN0aW9uLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9hZGFwdGVyLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS91dGlsaXR5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9hZGFwdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kbWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludHJvc3BlY3Rpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxpdHlcIjtcbiIsICJpbXBvcnQgdHlwZSB7IEV4ZWN1dG9yIH0gZnJvbSBcIi4vZXhlY3V0b3JcIjtcbmltcG9ydCB0eXBlIHsgUXVlcnkgfSBmcm9tIFwiLi9xdWVyeVwiO1xuaW1wb3J0IHR5cGUgeyBCaWdJbnRTdHJpbmcsIEVpdGhlciwgTnVtZXJpY1N0cmluZyB9IGZyb20gXCIuL3R5cGUtdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyUmVxdWlyZW1lbnRzIHtcbiAgZXhlY3V0b3I6IEV4ZWN1dG9yO1xuICBub1BhcmFtZXRlcnM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXIge1xuICAvKipcbiAgICogVGhlIHNjaGVtYSBzdHVkaW8gd2lsbCBjaG9vc2UgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogZS5nLiBgcHVibGljYCBmb3IgUG9zdGdyZVNRTFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFNjaGVtYT86IHN0cmluZztcblxuICAvKipcbiAgICogSW50cm9zcGVjdHMgdGhlIGRhdGFiYXNlIGFuZCByZXR1cm5zIHN0cnVjdHVyZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjaGVtYXMsIHRhYmxlcywgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBpbnRyb3NwZWN0aW9uIHJlcXVlc3QuXG4gICAqL1xuICBpbnRyb3NwZWN0KG9wdGlvbnM6IEFkYXB0ZXJJbnRyb3NwZWN0T3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckludHJvc3BlY3RSZXN1bHQ+PjtcblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBzdHJ1Y3R1cmVkIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlLlxuICAgKi9cbiAgcXVlcnkoZGV0YWlsczogQWRhcHRlclF1ZXJ5RGV0YWlscywgb3B0aW9uczogQWRhcHRlclF1ZXJ5T3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclF1ZXJ5UmVzdWx0Pj47XG5cbiAgLyoqXG4gICAqIEluc2VydHMgYSBzaW5nbGUgcm93IGludG8gdGhlIGRhdGFiYXNlLlxuICAgKi9cbiAgaW5zZXJ0KFxuICAgIGRldGFpbHM6IEFkYXB0ZXJJbnNlcnREZXRhaWxzLFxuICAgIG9wdGlvbnM6IEFkYXB0ZXJJbnNlcnRPcHRpb25zLFxuICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJJbnNlcnRSZXN1bHQ+PjtcblxuICAvKipcbiAgICogVXBkYXRlcyBhIGdpdmVuIHJvdyBpbiB0aGUgZGF0YWJhc2Ugd2l0aCBnaXZlbiBjaGFuZ2VzLlxuICAgKi9cbiAgdXBkYXRlKFxuICAgIGRldGFpbHM6IEFkYXB0ZXJVcGRhdGVEZXRhaWxzLFxuICAgIG9wdGlvbnM6IEFkYXB0ZXJVcGRhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJVcGRhdGVSZXN1bHQ+PjtcblxuICAvKipcbiAgICogRGVsZXRlcyBnaXZlbiByb3dzIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgKi9cbiAgZGVsZXRlKFxuICAgIGRldGFpbHM6IEFkYXB0ZXJEZWxldGVEZXRhaWxzLFxuICAgIG9wdGlvbnM6IEFkYXB0ZXJEZWxldGVPcHRpb25zLFxuICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJEZWxldGVSZXN1bHQ+Pjtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZVxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyQmFzZU9wdGlvbnMge31cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZVxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVySW50cm9zcGVjdE9wdGlvbnMgZXh0ZW5kcyBBZGFwdGVyQmFzZU9wdGlvbnMge31cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyUXVlcnlPcHRpb25zIGV4dGVuZHMgQWRhcHRlckJhc2VPcHRpb25zIHtcbiAgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJJbnNlcnRPcHRpb25zIGV4dGVuZHMgQWRhcHRlckJhc2VPcHRpb25zIHt9XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlclVwZGF0ZU9wdGlvbnMgZXh0ZW5kcyBBZGFwdGVyQmFzZU9wdGlvbnMge31cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZVxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyRGVsZXRlT3B0aW9ucyBleHRlbmRzIEFkYXB0ZXJCYXNlT3B0aW9ucyB7fVxuXG50eXBlIFNjaGVtYU5hbWUgPSBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckludHJvc3BlY3RSZXN1bHQge1xuICBzY2hlbWFzOiBSZWNvcmQ8U2NoZW1hTmFtZSwgU2NoZW1hPjtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgZmlsdGVyT3BlcmF0b3JzOiBGaWx0ZXJPcGVyYXRvcltdO1xuICBxdWVyeTogUXVlcnk7XG59XG5cbnR5cGUgVGFibGVOYW1lID0gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFibGVzOiBSZWNvcmQ8VGFibGVOYW1lLCBUYWJsZT47XG59XG5cbnR5cGUgQ29sdW1uTmFtZSA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZSB7XG4gIGNvbHVtbnM6IFJlY29yZDxDb2x1bW5OYW1lLCBDb2x1bW4+O1xuICBuYW1lOiBUYWJsZU5hbWU7XG4gIHNjaGVtYTogU2NoZW1hTmFtZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW4ge1xuICBkYXRhdHlwZTogRGF0YVR5cGU7XG4gIGZrQ29sdW1uOiBDb2x1bW5OYW1lIHwgbnVsbDtcbiAgZmtTY2hlbWE6IFNjaGVtYU5hbWUgfCBudWxsO1xuICBma1RhYmxlOiBUYWJsZU5hbWUgfCBudWxsO1xuICBpc0F1dG9pbmNyZW1lbnQ6IGJvb2xlYW47XG4gIGlzQ29tcHV0ZWQ6IGJvb2xlYW47XG4gIGlzSW5QcmltYXJ5S2V5OiBib29sZWFuO1xuICBuYW1lOiBDb2x1bW5OYW1lO1xuICBudWxsYWJsZTogYm9vbGVhbjtcbiAgc2NoZW1hOiBTY2hlbWFOYW1lO1xuICB0YWJsZTogVGFibGVOYW1lO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUeXBlIHtcbiAgLyoqXG4gICAqIFRoZSBkYXRhYmFzZS1zcGVjaWZpYyBhZmZpbml0eS90eXBlLlxuICAgKlxuICAgKiBlLmcuIGluIFNRTGl0ZSwgZGF0YXR5cGVzIGNhbiBiZSBhbnl0aGluZy4gVGhleSBhcmUgcmVkdWNlZCB0byBhZmZpbml0eSB2aWEgc3RyaW5nIG1hdGNoaW5nIHJ1bGVzLlxuICAgKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9zcWxpdGUub3JnL2RhdGF0eXBlMy5odG1sI2RldGVybWluYXRpb25fb2ZfY29sdW1uX2FmZmluaXR5fVxuICAgKi9cbiAgYWZmaW5pdHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc2ltcGxpZmljYXRpb24vbm9ybWFsaXphdGlvbiBmb3IgVUkgdXNhZ2UuXG4gICAqXG4gICAqIGUuZy4gdmFyY2hhciBhbmQgY2hhciBhcmUgc3RyaW5ncy5cbiAgICovXG4gIGdyb3VwOiBEYXRhVHlwZUdyb3VwO1xuXG4gIC8qKlxuICAgKiBJcyB0aGlzIGEgbmF0aXZlIGFycmF5IHR5cGU/XG4gICAqL1xuICBpc0FycmF5OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJcyBhIG5hdGl2ZSBkYXRhYmFzZSBkYXRhdHlwZSBvciBhIHVzZXItZGVmaW5lZCBkYXRhdHlwZT9cbiAgICpcbiAgICogZS5nLiBQb3N0Z3JlU1FMIGVudW1zIGFyZSB1c2VyLWRlZmluZWQgZGF0YXR5cGVzLCBidXQgYGludDRgIGlzIGEgbmF0aXZlIGRhdGF0eXBlLlxuICAgKi9cbiAgaXNOYXRpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdpbGwgYmUgZGlzcGxheWVkIGFzLWlzLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbnVtIHZhbHVlcyBmb3IgZW51bSB0eXBlcy5cbiAgICovXG4gIG9wdGlvbnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NoZW1hIHRoZSBkYXRhdHlwZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgc2NoZW1hOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIERhdGFUeXBlR3JvdXAgPSBcInN0cmluZ1wiIHwgXCJkYXRldGltZVwiIHwgXCJib29sZWFuXCIgfCBcImVudW1cIiB8IFwidGltZVwiIHwgXCJyYXdcIiB8IFwibnVtZXJpY1wiIHwgXCJqc29uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlclF1ZXJ5RGV0YWlscyB7XG4gIC8qKlxuICAgKiBaZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBwYWdlIHRvIGZldGNoLlxuICAgKi9cbiAgcGFnZUluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2ggZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqL1xuICBwYWdlU2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGZvciB0aGUgcXVlcnkuXG4gICAqL1xuICBzb3J0T3JkZXI6IFNvcnRPcmRlckl0ZW1bXTtcblxuICAvKipcbiAgICogVGhlIHRhYmxlIHRvIHNlbGVjdCBmcm9tLlxuICAgKi9cbiAgdGFibGU6IFRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsdGVyIHRvIGJlIGFwcGxpZWQuXG4gICAqL1xuICBmaWx0ZXI/OiBGaWx0ZXJHcm91cDtcbn1cblxuZXhwb3J0IHR5cGUgRmlsdGVyT3BlcmF0b3IgPVxuICB8IFwiPVwiXG4gIHwgXCIhPVwiXG4gIHwgXCI+XCJcbiAgfCBcIj49XCJcbiAgfCBcIjxcIlxuICB8IFwiPD1cIlxuICB8IFwiaXNcIlxuICB8IFwiaXMgbm90XCJcbiAgfCBcImxpa2VcIlxuICB8IFwibm90IGxpa2VcIlxuICB8IFwiaWxpa2VcIlxuICB8IFwibm90IGlsaWtlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uRmlsdGVyIHtcbiAga2luZDogXCJDb2x1bW5GaWx0ZXJcIjtcbiAgY29sdW1uOiBzdHJpbmc7XG4gIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcjtcbiAgdmFsdWU6IHVua25vd247XG4gIGFmdGVyOiBcImFuZFwiIHwgXCJvclwiO1xuICBpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyb3VwIHtcbiAga2luZDogXCJGaWx0ZXJHcm91cFwiO1xuICBmaWx0ZXJzOiAoQ29sdW1uRmlsdGVyIHwgRmlsdGVyR3JvdXApW107XG4gIGFmdGVyOiBcImFuZFwiIHwgXCJvclwiO1xuICBpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRPcmRlckl0ZW0ge1xuICAvKipcbiAgICogVGhlIGNvbHVtbiB0byBzb3J0IGJ5LlxuICAgKi9cbiAgY29sdW1uOiBDb2x1bW5OYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aW9uIHRvIHNvcnQgdGhlIGNvbHVtbiBieS5cbiAgICovXG4gIGRpcmVjdGlvbjogU29ydERpcmVjdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgU29ydERpcmVjdGlvbiA9IFwiYXNjXCIgfCBcImRlc2NcIjtcblxuZXhwb3J0IGNsYXNzIEFkYXB0ZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcXVlcnk/OiBRdWVyeTx1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyUXVlcnlSZXN1bHQge1xuICAvKipcbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiByb3dzIHRoZSBxdWVyeSB3b3VsZCByZXR1cm4gaWYgbm90IGxpbWl0ZWQuXG4gICAqXG4gICAqIElmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNvdW50aW5nIHJvd3MsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBgSW5maW5pdHlgLlxuICAgKi9cbiAgZmlsdGVyZWRSb3dDb3VudDogbnVtYmVyIHwgYmlnaW50IHwgTnVtZXJpY1N0cmluZyB8IEJpZ0ludFN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvd3MgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgcm93czogUmVjb3JkPENvbHVtbk5hbWUsIHVua25vd24+W107XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRlZCBxdWVyeSBzdHJpbmcuXG4gICAqL1xuICBxdWVyeTogUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckluc2VydERldGFpbHMge1xuICAvKipcbiAgICogVGhlIHRhYmxlIHRvIGluc2VydCBpbnRvLlxuICAgKi9cbiAgdGFibGU6IFRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWVzIHRvIGluc2VydCBpbnRvIHRoZSB0YWJsZS5cbiAgICogLSBUaGUga2V5cyBzaG91bGQgbWF0Y2ggdGhlIGNvbHVtbiBuYW1lcyBpbiB0aGUgdGFibGUuXG4gICAqIC0gVGhlIHZhbHVlcyBzaG91bGQgYmUgdGhlIHZhbHVlcyB0byBpbnNlcnQgaW50byB0aGUgdGFibGUuXG4gICAqL1xuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJJbnNlcnRSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGZyZXNobHkgaW5zZXJ0ZWQgcm93IGRhdGEuXG4gICAqL1xuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0ZWQgcXVlcnkgc3RyaW5nLlxuICAgKi9cbiAgcXVlcnk6IFF1ZXJ5PHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJVcGRhdGVEZXRhaWxzIHtcbiAgLyoqXG4gICAqIENoYW5nZXMgdG8gYXBwbHkgdG8gdGhlIHJvdy5cbiAgICovXG4gIGNoYW5nZXM6IFJlY29yZDxDb2x1bW5OYW1lLCB1bmtub3duPjtcblxuICAvKipcbiAgICogVGhlIHJvdyB0byB1cGRhdGUuXG4gICAqL1xuICByb3c6IFJlY29yZDxDb2x1bW5OYW1lLCB1bmtub3duPjtcblxuICAvKipcbiAgICogVGhlIHRhYmxlIHRvIHVwZGF0ZSBpbi5cbiAgICovXG4gIHRhYmxlOiBUYWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyVXBkYXRlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIHJvdyBkYXRhLlxuICAgKi9cbiAgcm93OiBSZWNvcmQ8Q29sdW1uTmFtZSwgdW5rbm93bj4gJiB7XG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgY2hhbmdlcyB3ZXJlIGFwcGxpZWQgaW4gZGF0YWJhc2UgdGltZS5cbiAgICAgKi9cbiAgICBfX3BzX3VwZGF0ZWRfYXRfXzogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcbiAgfTtcblxuICAvLyBUT0RPOiB0dXJuIHRoaXMgaW50byBhIGxpc3QuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0ZWQgcXVlcnkgc3RyaW5nLlxuICAgKi9cbiAgcXVlcnk6IFF1ZXJ5PHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJEZWxldGVEZXRhaWxzIHtcbiAgLyoqXG4gICAqIFRoZSByb3dzIHRvIGRlbGV0ZS5cbiAgICovXG4gIHJvd3M6IFJlY29yZDxDb2x1bW5OYW1lLCB1bmtub3duPltdO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgdG8gZGVsZXRlIGZyb20uXG4gICAqL1xuICB0YWJsZTogVGFibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckRlbGV0ZVJlc3VsdCB7XG4gIHJvd3M6IFJlY29yZDxDb2x1bW5OYW1lLCB1bmtub3duPltdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0ZWQgcXVlcnkgc3RyaW5nLlxuICAgKi9cbiAgcXVlcnk6IFF1ZXJ5PHVua25vd24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWRhcHRlckVycm9yKGFyZ3M6IHsgZXJyb3I6IEVycm9yOyBxdWVyeT86IFF1ZXJ5PHVua25vd24+IH0pIHtcbiAgY29uc3QgeyBlcnJvciwgcXVlcnkgfSA9IGFyZ3M7XG5cbiAgY29uc3QgYWRhcHRlckVycm9yID0gZXJyb3IgYXMgQWRhcHRlckVycm9yO1xuXG4gIGFkYXB0ZXJFcnJvci5xdWVyeSA9IHF1ZXJ5O1xuXG4gIHJldHVybiBbYWRhcHRlckVycm9yXSBhcyBbQWRhcHRlckVycm9yXTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb2JqZWN0LXV0aWxzLmQudHNcIiAvPlxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSB8fCBpc1N0cmluZyhvYmopIHx8IGlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iai5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9iaikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgfHwgb2JqID09PSB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4ob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdib29sZWFuJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bGwob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUob2JqKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIERhdGU7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaWdJbnQob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdiaWdpbnQnO1xufVxuLy8gRG9uJ3QgY2hhbmdlIHRoZSByZXR1cm5kIHR5cGUgdG8gYG9iaiBpcyBCdWZmZXJgIHRvIG5vdCBjcmVhdGUgYVxuLy8gaGFyZCBkZXBlbmRlbmN5IHRvIG5vZGUuXG5leHBvcnQgZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIEJ1ZmZlci5pc0J1ZmZlcihvYmopO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5QnVmZmVyT3JWaWV3KG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICAgIGlmICghaXNPYmplY3Qob2JqKSB8fCBnZXRUYWcob2JqKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBwcm90byA9IG9iajtcbiAgICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSAhPT0gbnVsbCkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gcHJvdG87XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdChhcnIpIHtcbiAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmcmVlemUob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUob2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5KGFyZykge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoYXJnKSkge1xuICAgICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFthcmddO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBhc1JlYWRvbmx5QXJyYXkoYXJnKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheShhcmcpKSB7XG4gICAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZnJlZXplKFthcmddKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNSZWFkb25seUFycmF5KGFyZykge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9vcChvYmopIHtcbiAgICByZXR1cm4gb2JqO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmUob2JqMSwgb2JqMikge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkob2JqMSkgJiYgaXNSZWFkb25seUFycmF5KG9iajIpKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlQXJyYXlzKG9iajEsIG9iajIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdChvYmoxKSAmJiBpc09iamVjdChvYmoyKSkge1xuICAgICAgICByZXR1cm4gY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMik7XG4gICAgfVxuICAgIHJldHVybiBvYmoxID09PSBvYmoyO1xufVxuZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnIxLCBhcnIyKSB7XG4gICAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyMS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoIWNvbXBhcmUoYXJyMVtpXSwgYXJyMltpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBpZiAoaXNCdWZmZXIob2JqMSkgJiYgaXNCdWZmZXIob2JqMikpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVCdWZmZXJzKG9iajEsIG9iajIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0RhdGUob2JqMSkgJiYgaXNEYXRlKG9iajIpKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlRGF0ZXMob2JqMSwgb2JqMik7XG4gICAgfVxuICAgIHJldHVybiBjb21wYXJlR2VuZXJpY09iamVjdHMob2JqMSwgb2JqMik7XG59XG5mdW5jdGlvbiBjb21wYXJlQnVmZmVycyhidWYxLCBidWYyKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGJ1ZjEsIGJ1ZjIpID09PSAwO1xufVxuZnVuY3Rpb24gY29tcGFyZURhdGVzKGRhdGUxLCBkYXRlMikge1xuICAgIHJldHVybiBkYXRlMS5nZXRUaW1lKCkgPT09IGRhdGUyLmdldFRpbWUoKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVHZW5lcmljT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgY29uc3Qga2V5czEgPSBPYmplY3Qua2V5cyhvYmoxKTtcbiAgICBjb25zdCBrZXlzMiA9IE9iamVjdC5rZXlzKG9iajIpO1xuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMxKSB7XG4gICAgICAgIGlmICghY29tcGFyZShvYmoxW2tleV0sIG9iajJba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmZ1bmN0aW9uIGdldFRhZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJ1tvYmplY3QgVW5kZWZpbmVkXScgOiAnW29iamVjdCBOdWxsXSc7XG4gICAgfVxuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBbHRlclRhYmxlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWx0ZXJUYWJsZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FsdGVyVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFRhYmxlUHJvcHMobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbihub2RlLCBjb2x1bW5BbHRlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGNvbHVtbkFsdGVyYXRpb25zOiBub2RlLmNvbHVtbkFsdGVyYXRpb25zXG4gICAgICAgICAgICAgICAgPyBbLi4ubm9kZS5jb2x1bW5BbHRlcmF0aW9ucywgY29sdW1uQWx0ZXJhdGlvbl1cbiAgICAgICAgICAgICAgICA6IFtjb2x1bW5BbHRlcmF0aW9uXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pZGVudGlmaWVyLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSWRlbnRpZmllck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0lkZW50aWZpZXJOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0lkZW50aWZpZXJOb2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLWluZGV4LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVJbmRleE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NyZWF0ZUluZGV4Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW5zKG5vZGUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgY29sdW1uczogWy4uLihub2RlLmNvbHVtbnMgfHwgW10pLCAuLi5jb2x1bW5zXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtc2NoZW1hLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVTY2hlbWFOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDcmVhdGVTY2hlbWFOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzY2hlbWEsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVTY2hlbWFOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKHNjaGVtYSksXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGNyZWF0ZVNjaGVtYSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlU2NoZW1hLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS10YWJsZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNvbnN0IE9OX0NPTU1JVF9BQ1RJT05TID0gWydwcmVzZXJ2ZSByb3dzJywgJ2RlbGV0ZSByb3dzJywgJ2Ryb3AnXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVUYWJsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NyZWF0ZVRhYmxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgY29sdW1uczogZnJlZXplKFtdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW4oY3JlYXRlVGFibGUsIGNvbHVtbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVRhYmxlLFxuICAgICAgICAgICAgY29sdW1uczogZnJlZXplKFsuLi5jcmVhdGVUYWJsZS5jb2x1bW5zLCBjb2x1bW5dKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb25zdHJhaW50KGNyZWF0ZVRhYmxlLCBjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVGFibGUsXG4gICAgICAgICAgICBjb25zdHJhaW50czogY3JlYXRlVGFibGUuY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uY3JlYXRlVGFibGUuY29uc3RyYWludHMsIGNvbnN0cmFpbnRdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFtjb25zdHJhaW50XSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRnJvbnRNb2RpZmllcihjcmVhdGVUYWJsZSwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUYWJsZSxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiBjcmVhdGVUYWJsZS5mcm9udE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5jcmVhdGVUYWJsZS5mcm9udE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFttb2RpZmllcl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEVuZE1vZGlmaWVyKGNyZWF0ZVRhYmxlLCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVRhYmxlLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiBjcmVhdGVUYWJsZS5lbmRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uY3JlYXRlVGFibGUuZW5kTW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW21vZGlmaWVyXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGNyZWF0ZVRhYmxlLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUYWJsZSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1NjaGVtYWJsZUlkZW50aWZpZXJOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NjaGVtYWJsZUlkZW50aWZpZXJOb2RlJyxcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShpZGVudGlmaWVyKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoU2NoZW1hKHNjaGVtYSwgaWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTY2hlbWFibGVJZGVudGlmaWVyTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICAgICAgaWRlbnRpZmllcjogSWRlbnRpZmllck5vZGUuY3JlYXRlKGlkZW50aWZpZXIpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtaW5kZXgtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEcm9wSW5kZXhOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wSW5kZXhOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcEluZGV4Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGUobmFtZSksXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BJbmRleCwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wSW5kZXgsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXNjaGVtYS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFNjaGVtYU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BTY2hlbWFOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzY2hlbWEsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wU2NoZW1hTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wU2NoZW1hLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wU2NoZW1hLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtdGFibGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEcm9wVGFibGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wVGFibGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BJbmRleCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZHJvcEluZGV4LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsaWFzLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQWxpYXNOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBbGlhc05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5vZGUsIGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FsaWFzTm9kZScsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdGFibGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBUYWJsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1RhYmxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGUodGFibGUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhTY2hlbWEoc2NoZW1hLCB0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZVdpdGhTY2hlbWEoc2NoZW1hLCB0YWJsZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3BlcmF0aW9uLW5vZGUtc291cmNlLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNPYmplY3QgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaikge1xuICAgIHJldHVybiBpc09iamVjdChvYmopICYmIGlzRnVuY3Rpb24ob2JqLnRvT3BlcmF0aW9uTm9kZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2V4cHJlc3Npb24uZC50c1wiIC8+XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc0V4cHJlc3Npb24ob2JqKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgJ2V4cHJlc3Npb25UeXBlJyBpbiBvYmogJiYgaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBbGlhc2VkRXhwcmVzc2lvbihvYmopIHtcbiAgICByZXR1cm4gKGlzT2JqZWN0KG9iaikgJiZcbiAgICAgICAgJ2V4cHJlc3Npb24nIGluIG9iaiAmJlxuICAgICAgICBpc1N0cmluZyhvYmouYWxpYXMpICYmXG4gICAgICAgIGlzT3BlcmF0aW9uTm9kZVNvdXJjZShvYmopKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2VsZWN0LW1vZGlmaWVyLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0TW9kaWZpZXJOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdTZWxlY3RNb2RpZmllck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG1vZGlmaWVyLCBvZikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RNb2RpZmllck5vZGUnLFxuICAgICAgICAgICAgbW9kaWZpZXIsXG4gICAgICAgICAgICBvZixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoRXhwcmVzc2lvbihtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RNb2RpZmllck5vZGUnLFxuICAgICAgICAgICAgcmF3TW9kaWZpZXI6IG1vZGlmaWVyLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FuZC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFuZE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FuZE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FuZE5vZGUnLFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3JOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09yTm9kZScsXG4gICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgcmlnaHQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuL2FuZC1ub2RlLmpzJztcbmltcG9ydCB7IE9yTm9kZSB9IGZyb20gJy4vb3Itbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbk5vZGUnLFxuICAgICAgICAgICAgb246IGZpbHRlcixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcGVyYXRpb24ob25Ob2RlLCBvcGVyYXRvciwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub25Ob2RlLFxuICAgICAgICAgICAgb246IG9wZXJhdG9yID09PSAnQW5kJ1xuICAgICAgICAgICAgICAgID8gQW5kTm9kZS5jcmVhdGUob25Ob2RlLm9uLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBPck5vZGUuY3JlYXRlKG9uTm9kZS5vbiwgb3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qb2luLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBPbk5vZGUgfSBmcm9tICcuL29uLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEpvaW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKb2luTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoam9pblR5cGUsIHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pvaW5Ob2RlJyxcbiAgICAgICAgICAgIGpvaW5UeXBlLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBvbjogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhPbihqb2luVHlwZSwgdGFibGUsIG9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pvaW5Ob2RlJyxcbiAgICAgICAgICAgIGpvaW5UeXBlLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBvbjogT25Ob2RlLmNyZWF0ZShvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT24oam9pbk5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmpvaW5Ob2RlLFxuICAgICAgICAgICAgb246IGpvaW5Ob2RlLm9uXG4gICAgICAgICAgICAgICAgPyBPbk5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKGpvaW5Ob2RlLm9uLCAnQW5kJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogT25Ob2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2JpbmFyeS1vcGVyYXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBCaW5hcnlPcGVyYXRpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdCaW5hcnlPcGVyYXRpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShsZWZ0T3BlcmFuZCwgb3BlcmF0b3IsIHJpZ2h0T3BlcmFuZCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdCaW5hcnlPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIGxlZnRPcGVyYW5kLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICByaWdodE9wZXJhbmQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3BlcmF0b3Itbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY29uc3QgQ09NUEFSSVNPTl9PUEVSQVRPUlMgPSBbXG4gICAgJz0nLFxuICAgICc9PScsXG4gICAgJyE9JyxcbiAgICAnPD4nLFxuICAgICc+JyxcbiAgICAnPj0nLFxuICAgICc8JyxcbiAgICAnPD0nLFxuICAgICdpbicsXG4gICAgJ25vdCBpbicsXG4gICAgJ2lzJyxcbiAgICAnaXMgbm90JyxcbiAgICAnbGlrZScsXG4gICAgJ25vdCBsaWtlJyxcbiAgICAnbWF0Y2gnLFxuICAgICdpbGlrZScsXG4gICAgJ25vdCBpbGlrZScsXG4gICAgJ0A+JyxcbiAgICAnPEAnLFxuICAgICdeQCcsXG4gICAgJyYmJyxcbiAgICAnPycsXG4gICAgJz8mJyxcbiAgICAnP3wnLFxuICAgICchPCcsXG4gICAgJyE+JyxcbiAgICAnPD0+JyxcbiAgICAnIX4nLFxuICAgICd+JyxcbiAgICAnfionLFxuICAgICchfionLFxuICAgICdAQCcsXG4gICAgJ0BAQCcsXG4gICAgJyEhJyxcbiAgICAnPC0+JyxcbiAgICAncmVnZXhwJyxcbiAgICAnaXMgZGlzdGluY3QgZnJvbScsXG4gICAgJ2lzIG5vdCBkaXN0aW5jdCBmcm9tJyxcbl07XG5leHBvcnQgY29uc3QgQVJJVEhNRVRJQ19PUEVSQVRPUlMgPSBbXG4gICAgJysnLFxuICAgICctJyxcbiAgICAnKicsXG4gICAgJy8nLFxuICAgICclJyxcbiAgICAnXicsXG4gICAgJyYnLFxuICAgICd8JyxcbiAgICAnIycsXG4gICAgJzw8JyxcbiAgICAnPj4nLFxuXTtcbmV4cG9ydCBjb25zdCBKU09OX09QRVJBVE9SUyA9IFsnLT4nLCAnLT4+J107XG5leHBvcnQgY29uc3QgQklOQVJZX09QRVJBVE9SUyA9IFtcbiAgICAuLi5DT01QQVJJU09OX09QRVJBVE9SUyxcbiAgICAuLi5BUklUSE1FVElDX09QRVJBVE9SUyxcbiAgICAnJiYnLFxuICAgICd8fCcsXG5dO1xuZXhwb3J0IGNvbnN0IFVOQVJZX0ZJTFRFUl9PUEVSQVRPUlMgPSBbJ2V4aXN0cycsICdub3QgZXhpc3RzJ107XG5leHBvcnQgY29uc3QgVU5BUllfT1BFUkFUT1JTID0gWydub3QnLCAnLScsIC4uLlVOQVJZX0ZJTFRFUl9PUEVSQVRPUlNdO1xuZXhwb3J0IGNvbnN0IE9QRVJBVE9SUyA9IFtcbiAgICAuLi5CSU5BUllfT1BFUkFUT1JTLFxuICAgIC4uLkpTT05fT1BFUkFUT1JTLFxuICAgIC4uLlVOQVJZX09QRVJBVE9SUyxcbiAgICAnYmV0d2VlbicsXG4gICAgJ2JldHdlZW4gc3ltbWV0cmljJyxcbl07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3BlcmF0b3JOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPcGVyYXRvck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9wZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09wZXJhdG9yTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlcmF0b3Iob3ApIHtcbiAgICByZXR1cm4gaXNTdHJpbmcob3ApICYmIE9QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaW5hcnlPcGVyYXRvcihvcCkge1xuICAgIHJldHVybiBpc1N0cmluZyhvcCkgJiYgQklOQVJZX09QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21wYXJpc29uT3BlcmF0b3Iob3ApIHtcbiAgICByZXR1cm4gaXNTdHJpbmcob3ApICYmIENPTVBBUklTT05fT1BFUkFUT1JTLmluY2x1ZGVzKG9wKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FyaXRobWV0aWNPcGVyYXRvcihvcCkge1xuICAgIHJldHVybiBpc1N0cmluZyhvcCkgJiYgQVJJVEhNRVRJQ19PUEVSQVRPUlMuaW5jbHVkZXMob3ApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNPTk9wZXJhdG9yKG9wKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKG9wKSAmJiBKU09OX09QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbHVtbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtYWxsLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0QWxsTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2VsZWN0QWxsTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdEFsbE5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZmVyZW5jZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgU2VsZWN0QWxsTm9kZSB9IGZyb20gJy4vc2VsZWN0LWFsbC1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZWZlcmVuY2VOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZWZlcmVuY2VOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1JlZmVyZW5jZU5vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlU2VsZWN0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1JlZmVyZW5jZU5vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBjb2x1bW46IFNlbGVjdEFsbE5vZGUuY3JlYXRlKCksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIHtcbiAgICAjZHluYW1pY1JlZmVyZW5jZTtcbiAgICBnZXQgZHluYW1pY1JlZmVyZW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2R5bmFtaWNSZWZlcmVuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICpcbiAgICAgKiBUaGlzIG5lZWRzIHRvIGJlIGhlcmUganVzdCBzbyB0aGF0IHRoZSB0eXBpbmdzIHdvcmsuIFdpdGhvdXQgdGhpc1xuICAgICAqIHRoZSBnZW5lcmF0ZWQgLmQudHMgZmlsZSBjb250YWlucyBubyByZWZlcmVuY2UgdG8gdGhlIHR5cGUgcGFyYW0gUlxuICAgICAqIHdoaWNoIGNhdXNlcyB0aGlzIHR5cGUgdG8gYmUgZXF1YWwgdG8gRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIgd2l0aFxuICAgICAqIGFueSBSLlxuICAgICAqL1xuICAgIGdldCByZWZUeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2UpIHtcbiAgICAgICAgdGhpcy4jZHluYW1pY1JlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gcGFyc2VTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uKHRoaXMuI2R5bmFtaWNSZWZlcmVuY2UpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyKG9iaikge1xuICAgIHJldHVybiAoaXNPYmplY3Qob2JqKSAmJlxuICAgICAgICBpc09wZXJhdGlvbk5vZGVTb3VyY2Uob2JqKSAmJlxuICAgICAgICBpc1N0cmluZyhvYmouZHluYW1pY1JlZmVyZW5jZSkpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcmRlci1ieS1pdGVtLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3JkZXJCeUl0ZW1Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPcmRlckJ5SXRlbU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9yZGVyQnksIGRpcmVjdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcmRlckJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmF3LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmF3Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUmF3Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc3FsRnJhZ21lbnRzLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1Jhd05vZGUnLFxuICAgICAgICAgICAgc3FsRnJhZ21lbnRzOiBmcmVlemUoc3FsRnJhZ21lbnRzKSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IGZyZWV6ZShwYXJhbWV0ZXJzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoU3FsKHNxbCkge1xuICAgICAgICByZXR1cm4gUmF3Tm9kZS5jcmVhdGUoW3NxbF0sIFtdKTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhDaGlsZChjaGlsZCkge1xuICAgICAgICByZXR1cm4gUmF3Tm9kZS5jcmVhdGUoWycnLCAnJ10sIFtjaGlsZF0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBSYXdOb2RlLmNyZWF0ZShuZXcgQXJyYXkoY2hpbGRyZW4ubGVuZ3RoICsgMSkuZmlsbCgnJyksIGNoaWxkcmVuKTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbGxhdGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbGxhdGVOb2RlID0ge1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbGxhdGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2xsYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ29sbGF0ZU5vZGUnLFxuICAgICAgICAgICAgY29sbGF0aW9uOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29sbGF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn07XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yZGVyLWJ5LWl0ZW0tYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbGxhdGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sbGF0ZS1ub2RlLmpzJztcbmltcG9ydCB7IE9yZGVyQnlJdGVtTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29yZGVyLWJ5LWl0ZW0tbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIE9yZGVyQnlJdGVtQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgZGVzY2AgdG8gdGhlIGBvcmRlciBieWAgaXRlbS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgYXNjfSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIGRlc2MoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IE9yZGVyQnlJdGVtTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogUmF3Tm9kZS5jcmVhdGVXaXRoU3FsKCdkZXNjJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYGFzY2AgdG8gdGhlIGBvcmRlciBieWAgaXRlbS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgZGVzY30gZm9yIHRoZSBvcHBvc2l0ZS5cbiAgICAgKi9cbiAgICBhc2MoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IE9yZGVyQnlJdGVtTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogUmF3Tm9kZS5jcmVhdGVXaXRoU3FsKCdhc2MnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgbnVsbHMgbGFzdGAgdG8gdGhlIGBvcmRlciBieWAgaXRlbS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgYW5kIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgbnVsbHNGaXJzdH0gZm9yIHRoZSBvcHBvc2l0ZS5cbiAgICAgKi9cbiAgICBudWxsc0xhc3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IE9yZGVyQnlJdGVtTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwgeyBudWxsczogJ2xhc3QnIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgbnVsbHMgZmlyc3RgIHRvIHRoZSBgb3JkZXIgYnlgIGl0ZW0uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIGFuZCBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIG51bGxzTGFzdH0gZm9yIHRoZSBvcHBvc2l0ZS5cbiAgICAgKi9cbiAgICBudWxsc0ZpcnN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IE9yZGVyQnlJdGVtQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBPcmRlckJ5SXRlbU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgbnVsbHM6ICdmaXJzdCcgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBjb2xsYXRlIDxjb2xsYXRpb25OYW1lPmAgdG8gdGhlIGBvcmRlciBieWAgaXRlbS5cbiAgICAgKi9cbiAgICBjb2xsYXRlKGNvbGxhdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IE9yZGVyQnlJdGVtQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBPcmRlckJ5SXRlbU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBjb2xsYXRpb246IENvbGxhdGVOb2RlLmNyZWF0ZShjb2xsYXRpb24pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5ub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbG9nLW9uY2UuZC50c1wiIC8+XG5jb25zdCBMT0dHRURfTUVTU0FHRVMgPSBuZXcgU2V0KCk7XG4vKipcbiAqIFVzZSBmb3Igc3lzdGVtLWxldmVsIGxvZ2dpbmcsIHN1Y2ggYXMgZGVwcmVjYXRpb24gbWVzc2FnZXMuXG4gKiBMb2dzIGEgbWVzc2FnZSBhbmQgZW5zdXJlcyBpdCB3b24ndCBiZSBsb2dnZWQgYWdhaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dPbmNlKG1lc3NhZ2UpIHtcbiAgICBpZiAoTE9HR0VEX01FU1NBR0VTLmhhcyhtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIExPR0dFRF9NRVNTQUdFUy5hZGQobWVzc2FnZSk7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yZGVyLWJ5LXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIsIH0gZnJvbSAnLi4vZHluYW1pYy9keW5hbWljLXJlZmVyZW5jZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgeyBPcmRlckJ5SXRlbU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcmRlci1ieS1pdGVtLW5vZGUuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IE9yZGVyQnlJdGVtQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvb3JkZXItYnktaXRlbS1idWlsZGVyLmpzJztcbmltcG9ydCB7IGxvZ09uY2UgfSBmcm9tICcuLi91dGlsL2xvZy1vbmNlLmpzJztcbmltcG9ydCB7IGlzRXhwcmVzc2lvbk9yRmFjdG9yeSwgcGFyc2VFeHByZXNzaW9uLCB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTdHJpbmdSZWZlcmVuY2UsIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc09yZGVyQnlEaXJlY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgPT09ICdhc2MnIHx8IHRoaW5nID09PSAnZGVzYyc7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcmRlckJ5KGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIFtwYXJzZU9yZGVyQnlJdGVtKGFyZ3NbMF0sIGFyZ3NbMV0pXTtcbiAgICB9XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IFtvcmRlckJ5XSA9IGFyZ3M7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9yZGVyQnkpKSB7XG4gICAgICAgICAgICBsb2dPbmNlKCdvcmRlckJ5KGFycmF5KSBpcyBkZXByZWNhdGVkLCB1c2UgbXVsdGlwbGUgb3JkZXJCeSBjYWxscyBpbnN0ZWFkLicpO1xuICAgICAgICAgICAgcmV0dXJuIG9yZGVyQnkubWFwKChpdGVtKSA9PiBwYXJzZU9yZGVyQnlJdGVtKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3BhcnNlT3JkZXJCeUl0ZW0ob3JkZXJCeSldO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBhdCBvcmRlciBieSEgZXhwZWN0ZWQgMS0yLCByZWNlaXZlZCAke2FyZ3MubGVuZ3RofWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3JkZXJCeUl0ZW0oZXhwciwgbW9kaWZpZXJzKSB7XG4gICAgY29uc3QgcGFyc2VkUmVmID0gcGFyc2VPcmRlckJ5RXhwcmVzc2lvbihleHByKTtcbiAgICBpZiAoT3JkZXJCeUl0ZW1Ob2RlLmlzKHBhcnNlZFJlZikpIHtcbiAgICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc3BlY2lmeSBkaXJlY3Rpb24gdHdpY2UhJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZFJlZjtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlT3JkZXJCeVdpdGhNb2RpZmllcnMocGFyc2VkUmVmLCBtb2RpZmllcnMpO1xufVxuZnVuY3Rpb24gcGFyc2VPcmRlckJ5RXhwcmVzc2lvbihleHByKSB7XG4gICAgaWYgKGlzRXhwcmVzc2lvbk9yRmFjdG9yeShleHByKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uKGV4cHIpO1xuICAgIH1cbiAgICBpZiAoaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlcihleHByKSkge1xuICAgICAgICByZXR1cm4gZXhwci50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgY29uc3QgW3JlZiwgZGlyZWN0aW9uXSA9IGV4cHIuc3BsaXQoJyAnKTtcbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgIGxvZ09uY2UoXCJgb3JkZXJCeSgnY29sdW1uIGFzYycpYCBpcyBkZXByZWNhdGVkLiBVc2UgYG9yZGVyQnkoJ2NvbHVtbicsICdhc2MnKWAgaW5zdGVhZC5cIik7XG4gICAgICAgIHJldHVybiBwYXJzZU9yZGVyQnlXaXRoTW9kaWZpZXJzKHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZiksIGRpcmVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZShleHByKTtcbn1cbmZ1bmN0aW9uIHBhcnNlT3JkZXJCeVdpdGhNb2RpZmllcnMoZXhwciwgbW9kaWZpZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBtb2RpZmllcnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghaXNPcmRlckJ5RGlyZWN0aW9uKG1vZGlmaWVycykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcmRlciBieSBkaXJlY3Rpb246ICR7bW9kaWZpZXJzfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPcmRlckJ5SXRlbU5vZGUuY3JlYXRlKGV4cHIsIFJhd05vZGUuY3JlYXRlV2l0aFNxbChtb2RpZmllcnMpKTtcbiAgICB9XG4gICAgaWYgKGlzRXhwcmVzc2lvbihtb2RpZmllcnMpKSB7XG4gICAgICAgIGxvZ09uY2UoXCJgb3JkZXJCeSguLi4sIGV4cHIpYCBpcyBkZXByZWNhdGVkLiBVc2UgYG9yZGVyQnkoLi4uLCAnYXNjJylgIG9yIGBvcmRlckJ5KC4uLiwgKG9iKSA9PiAuLi4pYCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgcmV0dXJuIE9yZGVyQnlJdGVtTm9kZS5jcmVhdGUoZXhwciwgbW9kaWZpZXJzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICB9XG4gICAgY29uc3Qgbm9kZSA9IE9yZGVyQnlJdGVtTm9kZS5jcmVhdGUoZXhwcik7XG4gICAgaWYgKCFtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJldHVybiBtb2RpZmllcnMobmV3IE9yZGVyQnlJdGVtQnVpbGRlcih7IG5vZGUgfSkpLnRvT3BlcmF0aW9uTm9kZSgpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qc29uLXJlZmVyZW5jZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05SZWZlcmVuY2VOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKU09OUmVmZXJlbmNlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUocmVmZXJlbmNlLCB0cmF2ZXJzYWwpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTlJlZmVyZW5jZU5vZGUnLFxuICAgICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgICAgdHJhdmVyc2FsLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFRyYXZlcnNhbChub2RlLCB0cmF2ZXJzYWwpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgdHJhdmVyc2FsLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pzb24tb3BlcmF0b3ItY2hhaW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBKU09OT3BlcmF0b3JDaGFpbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0pTT05PcGVyYXRvckNoYWluTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob3BlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yLFxuICAgICAgICAgICAgdmFsdWVzOiBmcmVlemUoW10pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFZhbHVlKG5vZGUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKFsuLi5ub2RlLnZhbHVlcywgdmFsdWVdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qc29uLXBhdGgtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBKU09OUGF0aE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0pTT05QYXRoTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaW5PcGVyYXRvcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUGF0aE5vZGUnLFxuICAgICAgICAgICAgaW5PcGVyYXRvcixcbiAgICAgICAgICAgIHBhdGhMZWdzOiBmcmVlemUoW10pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aExlZyhqc29uUGF0aE5vZGUsIHBhdGhMZWcpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5qc29uUGF0aE5vZGUsXG4gICAgICAgICAgICBwYXRoTGVnczogZnJlZXplKFsuLi5qc29uUGF0aE5vZGUucGF0aExlZ3MsIHBhdGhMZWddKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yZWZlcmVuY2UtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgUmVmZXJlbmNlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlZmVyZW5jZS1ub2RlLmpzJztcbmltcG9ydCB7IFRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3RhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNSZWFkb25seUFycmF5LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiwgaXNFeHByZXNzaW9uT3JGYWN0b3J5LCB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcmRlckJ5RGlyZWN0aW9uLCBwYXJzZU9yZGVyQnksIH0gZnJvbSAnLi9vcmRlci1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgT3BlcmF0b3JOb2RlLCBpc0pTT05PcGVyYXRvciwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRvci1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05SZWZlcmVuY2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1yZWZlcmVuY2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OT3BlcmF0b3JDaGFpbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLW9wZXJhdG9yLWNoYWluLW5vZGUuanMnO1xuaW1wb3J0IHsgSlNPTlBhdGhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbihleHApIHtcbiAgICBpZiAoaXNTdHJpbmcoZXhwKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmdSZWZlcmVuY2UoZXhwKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cC50b09wZXJhdGlvbk5vZGUoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QoYXJnKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheShhcmcpKSB7XG4gICAgICAgIHJldHVybiBhcmcubWFwKChpdCkgPT4gcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGl0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW3BhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihhcmcpXTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc0V4cHJlc3Npb25PckZhY3RvcnkoZXhwKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uKGV4cCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUpTT05SZWZlcmVuY2UocmVmLCBvcCkge1xuICAgIGNvbnN0IHJlZmVyZW5jZU5vZGUgPSBwYXJzZVN0cmluZ1JlZmVyZW5jZShyZWYpO1xuICAgIGlmIChpc0pTT05PcGVyYXRvcihvcCkpIHtcbiAgICAgICAgcmV0dXJuIEpTT05SZWZlcmVuY2VOb2RlLmNyZWF0ZShyZWZlcmVuY2VOb2RlLCBKU09OT3BlcmF0b3JDaGFpbk5vZGUuY3JlYXRlKE9wZXJhdG9yTm9kZS5jcmVhdGUob3ApKSk7XG4gICAgfVxuICAgIGNvbnN0IG9wV2l0aG91dExhc3RDaGFyID0gb3Auc2xpY2UoMCwgLTEpO1xuICAgIGlmIChpc0pTT05PcGVyYXRvcihvcFdpdGhvdXRMYXN0Q2hhcikpIHtcbiAgICAgICAgcmV0dXJuIEpTT05SZWZlcmVuY2VOb2RlLmNyZWF0ZShyZWZlcmVuY2VOb2RlLCBKU09OUGF0aE5vZGUuY3JlYXRlKE9wZXJhdG9yTm9kZS5jcmVhdGUob3BXaXRob3V0TGFzdENoYXIpKSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBKU09OIG9wZXJhdG9yOiAke29wfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZikge1xuICAgIGNvbnN0IENPTFVNTl9TRVBBUkFUT1IgPSAnLic7XG4gICAgaWYgKCFyZWYuaW5jbHVkZXMoQ09MVU1OX1NFUEFSQVRPUikpIHtcbiAgICAgICAgcmV0dXJuIFJlZmVyZW5jZU5vZGUuY3JlYXRlKENvbHVtbk5vZGUuY3JlYXRlKHJlZikpO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IHJlZi5zcGxpdChDT0xVTU5fU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGVBbmRTY2hlbWEocGFydHMpO1xuICAgIH1cbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZShwYXJ0cyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBjb2x1bW4gcmVmZXJlbmNlICR7cmVmfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWxpYXNlZFN0cmluZ1JlZmVyZW5jZShyZWYpIHtcbiAgICBjb25zdCBBTElBU19TRVBBUkFUT1IgPSAnIGFzICc7XG4gICAgaWYgKHJlZi5pbmNsdWRlcyhBTElBU19TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5SZWYsIGFsaWFzXSA9IHJlZi5zcGxpdChBTElBU19TRVBBUkFUT1IpLm1hcCh0cmltKTtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUocGFyc2VTdHJpbmdSZWZlcmVuY2UoY29sdW1uUmVmKSwgSWRlbnRpZmllck5vZGUuY3JlYXRlKGFsaWFzKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb2x1bW5OYW1lKGNvbHVtbikge1xuICAgIHJldHVybiBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3JkZXJlZENvbHVtbk5hbWUoY29sdW1uKSB7XG4gICAgY29uc3QgT1JERVJfU0VQQVJBVE9SID0gJyAnO1xuICAgIGlmIChjb2x1bW4uaW5jbHVkZXMoT1JERVJfU0VQQVJBVE9SKSkge1xuICAgICAgICBjb25zdCBbY29sdW1uTmFtZSwgb3JkZXJdID0gY29sdW1uLnNwbGl0KE9SREVSX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICBpZiAoIWlzT3JkZXJCeURpcmVjdGlvbihvcmRlcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcmRlciBkaXJlY3Rpb24gXCIke29yZGVyfVwiIG5leHQgdG8gXCIke2NvbHVtbk5hbWV9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VPcmRlckJ5KFtjb2x1bW5OYW1lLCBvcmRlcl0pWzBdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlQ29sdW1uTmFtZShjb2x1bW4pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nUmVmZXJlbmNlV2l0aFRhYmxlQW5kU2NoZW1hKHBhcnRzKSB7XG4gICAgY29uc3QgW3NjaGVtYSwgdGFibGUsIGNvbHVtbl0gPSBwYXJ0cztcbiAgICByZXR1cm4gUmVmZXJlbmNlTm9kZS5jcmVhdGUoQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSwgVGFibGVOb2RlLmNyZWF0ZVdpdGhTY2hlbWEoc2NoZW1hLCB0YWJsZSkpO1xufVxuZnVuY3Rpb24gcGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGUocGFydHMpIHtcbiAgICBjb25zdCBbdGFibGUsIGNvbHVtbl0gPSBwYXJ0cztcbiAgICByZXR1cm4gUmVmZXJlbmNlTm9kZS5jcmVhdGUoQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSwgVGFibGVOb2RlLmNyZWF0ZSh0YWJsZSkpO1xufVxuZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcHJpbWl0aXZlLXZhbHVlLWxpc3Qtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdQcmltaXRpdmVWYWx1ZUxpc3ROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZShbLi4udmFsdWVzXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdmFsdWUtbGlzdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbHVlTGlzdE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1ZhbHVlTGlzdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZUxpc3ROb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKHZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdmFsdWUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBWYWx1ZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1ZhbHVlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVmFsdWVOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZUltbWVkaWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdmFsdWUtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ByaW1pdGl2ZS12YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVMaXN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLWxpc3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IGlzQm9vbGVhbiwgaXNOdWxsLCBpc051bWJlciwgaXNSZWFkb25seUFycmF5LCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiwgaXNFeHByZXNzaW9uT3JGYWN0b3J5LCB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWVFeHByZXNzaW9uT3JMaXN0KGFyZykge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoYXJnKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZUV4cHJlc3Npb25MaXN0KGFyZyk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVZhbHVlRXhwcmVzc2lvbihhcmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWVFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc0V4cHJlc3Npb25PckZhY3RvcnkoZXhwKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uKGV4cCk7XG4gICAgfVxuICAgIHJldHVybiBWYWx1ZU5vZGUuY3JlYXRlKGV4cCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gaXNOdW1iZXIodmFsdWUpIHx8IGlzQm9vbGVhbih2YWx1ZSkgfHwgaXNOdWxsKHZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICghaXNTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zYWZlIGltbWVkaWF0ZSB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUodmFsdWUpO1xufVxuZnVuY3Rpb24gcGFyc2VWYWx1ZUV4cHJlc3Npb25MaXN0KGFyZykge1xuICAgIGlmIChhcmcuc29tZShpc0V4cHJlc3Npb25PckZhY3RvcnkpKSB7XG4gICAgICAgIHJldHVybiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZShhcmcubWFwKChpdCkgPT4gcGFyc2VWYWx1ZUV4cHJlc3Npb24oaXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlLmNyZWF0ZShhcmcpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wYXJlbnMtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQYXJlbnNOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdQYXJlbnNOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1BhcmVuc05vZGUnLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IEJpbmFyeU9wZXJhdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9iaW5hcnktb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNCb29sZWFuLCBpc051bGwsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IE9wZXJhdG9yTm9kZSwgT1BFUkFUT1JTLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uLCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlRXhwcmVzc2lvbiwgcGFyc2VWYWx1ZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG5pbXBvcnQgeyBBbmROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYW5kLW5vZGUuanMnO1xuaW1wb3J0IHsgUGFyZW5zTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzJztcbmltcG9ydCB7IE9yTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29yLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVmFsdWVFeHByZXNzaW9uKGFyZ3NbMF0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24obGVmdCwgb3BlcmF0b3IsIHJpZ2h0KSB7XG4gICAgaWYgKGlzSXNPcGVyYXRvcihvcGVyYXRvcikgJiYgbmVlZHNJc09wZXJhdG9yKHJpZ2h0KSkge1xuICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGxlZnQpLCBwYXJzZU9wZXJhdG9yKG9wZXJhdG9yKSwgVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZShyaWdodCkpO1xuICAgIH1cbiAgICByZXR1cm4gQmluYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGxlZnQpLCBwYXJzZU9wZXJhdG9yKG9wZXJhdG9yKSwgcGFyc2VWYWx1ZUV4cHJlc3Npb25Pckxpc3QocmlnaHQpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxlZnQsIG9wZXJhdG9yLCByaWdodCkge1xuICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24obGVmdCksIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpLCBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24ocmlnaHQpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpbHRlck9iamVjdChvYmosIGNvbWJpbmF0b3IpIHtcbiAgICByZXR1cm4gcGFyc2VGaWx0ZXJMaXN0KE9iamVjdC5lbnRyaWVzKG9iailcbiAgICAgICAgLmZpbHRlcigoWywgdl0pID0+ICFpc1VuZGVmaW5lZCh2KSlcbiAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uKGssIG5lZWRzSXNPcGVyYXRvcih2KSA/ICdpcycgOiAnPScsIHYpKSwgY29tYmluYXRvcik7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGaWx0ZXJMaXN0KGxpc3QsIGNvbWJpbmF0b3IsIHdpdGhQYXJlbnMgPSB0cnVlKSB7XG4gICAgY29uc3QgY29tYmluZSA9IGNvbWJpbmF0b3IgPT09ICdhbmQnID8gQW5kTm9kZS5jcmVhdGUgOiBPck5vZGUuY3JlYXRlO1xuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUoVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSgxKSwgT3BlcmF0b3JOb2RlLmNyZWF0ZSgnPScpLCBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKGNvbWJpbmF0b3IgPT09ICdhbmQnID8gMSA6IDApKTtcbiAgICB9XG4gICAgbGV0IG5vZGUgPSB0b09wZXJhdGlvbk5vZGUobGlzdFswXSk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIG5vZGUgPSBjb21iaW5lKG5vZGUsIHRvT3BlcmF0aW9uTm9kZShsaXN0W2ldKSk7XG4gICAgfVxuICAgIGlmIChsaXN0Lmxlbmd0aCA+IDEgJiYgd2l0aFBhcmVucykge1xuICAgICAgICByZXR1cm4gUGFyZW5zTm9kZS5jcmVhdGUobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xufVxuZnVuY3Rpb24gaXNJc09wZXJhdG9yKG9wZXJhdG9yKSB7XG4gICAgcmV0dXJuIG9wZXJhdG9yID09PSAnaXMnIHx8IG9wZXJhdG9yID09PSAnaXMgbm90Jztcbn1cbmZ1bmN0aW9uIG5lZWRzSXNPcGVyYXRvcih2YWx1ZSkge1xuICAgIHJldHVybiBpc051bGwodmFsdWUpIHx8IGlzQm9vbGVhbih2YWx1ZSk7XG59XG5mdW5jdGlvbiBwYXJzZU9wZXJhdG9yKG9wZXJhdG9yKSB7XG4gICAgaWYgKGlzU3RyaW5nKG9wZXJhdG9yKSAmJiBPUEVSQVRPUlMuaW5jbHVkZXMob3BlcmF0b3IpKSB7XG4gICAgICAgIHJldHVybiBPcGVyYXRvck5vZGUuY3JlYXRlKG9wZXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKGlzT3BlcmF0aW9uTm9kZVNvdXJjZShvcGVyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3BlcmF0b3IgJHtKU09OLnN0cmluZ2lmeShvcGVyYXRvcil9YCk7XG59XG5mdW5jdGlvbiB0b09wZXJhdGlvbk5vZGUobm9kZU9yU291cmNlKSB7XG4gICAgcmV0dXJuIGlzT3BlcmF0aW9uTm9kZVNvdXJjZShub2RlT3JTb3VyY2UpXG4gICAgICAgID8gbm9kZU9yU291cmNlLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgIDogbm9kZU9yU291cmNlO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcmRlci1ieS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9yZGVyQnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPcmRlckJ5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT3JkZXJCeU5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IGZyZWV6ZShbLi4uaXRlbXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJdGVtcyhvcmRlckJ5LCBpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm9yZGVyQnksXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKFsuLi5vcmRlckJ5Lml0ZW1zLCAuLi5pdGVtc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BhcnRpdGlvbi1ieS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFBhcnRpdGlvbkJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUGFydGl0aW9uQnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQYXJ0aXRpb25CeU5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IGZyZWV6ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSXRlbXMocGFydGl0aW9uQnksIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ucGFydGl0aW9uQnksXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKFsuLi5wYXJ0aXRpb25CeS5pdGVtcywgLi4uaXRlbXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vdmVyLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBPcmRlckJ5Tm9kZSB9IGZyb20gJy4vb3JkZXItYnktbm9kZS5qcyc7XG5pbXBvcnQgeyBQYXJ0aXRpb25CeU5vZGUgfSBmcm9tICcuL3BhcnRpdGlvbi1ieS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPdmVyTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3Zlck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPdmVyTm9kZScsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKG92ZXJOb2RlLCBpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm92ZXJOb2RlLFxuICAgICAgICAgICAgb3JkZXJCeTogb3Zlck5vZGUub3JkZXJCeVxuICAgICAgICAgICAgICAgID8gT3JkZXJCeU5vZGUuY2xvbmVXaXRoSXRlbXMob3Zlck5vZGUub3JkZXJCeSwgaXRlbXMpXG4gICAgICAgICAgICAgICAgOiBPcmRlckJ5Tm9kZS5jcmVhdGUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFBhcnRpdGlvbkJ5SXRlbXMob3Zlck5vZGUsIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub3Zlck5vZGUsXG4gICAgICAgICAgICBwYXJ0aXRpb25CeTogb3Zlck5vZGUucGFydGl0aW9uQnlcbiAgICAgICAgICAgICAgICA/IFBhcnRpdGlvbkJ5Tm9kZS5jbG9uZVdpdGhJdGVtcyhvdmVyTm9kZS5wYXJ0aXRpb25CeSwgaXRlbXMpXG4gICAgICAgICAgICAgICAgOiBQYXJ0aXRpb25CeU5vZGUuY3JlYXRlKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mcm9tLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRnJvbU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Zyb21Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmcm9tcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGcm9tTm9kZScsXG4gICAgICAgICAgICBmcm9tczogZnJlZXplKGZyb21zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGcm9tcyhmcm9tLCBmcm9tcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmZyb20sXG4gICAgICAgICAgICBmcm9tczogZnJlZXplKFsuLi5mcm9tLmZyb21zLCAuLi5mcm9tc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2dyb3VwLWJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgR3JvdXBCeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0dyb3VwQnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHcm91cEJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJdGVtcyhncm91cEJ5LCBpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmdyb3VwQnksXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKFsuLi5ncm91cEJ5Lml0ZW1zLCAuLi5pdGVtc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2hhdmluZy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQW5kTm9kZSB9IGZyb20gJy4vYW5kLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi9vci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBIYXZpbmdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdIYXZpbmdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSGF2aW5nTm9kZScsXG4gICAgICAgICAgICBoYXZpbmc6IGZpbHRlcixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcGVyYXRpb24oaGF2aW5nTm9kZSwgb3BlcmF0b3IsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmhhdmluZ05vZGUsXG4gICAgICAgICAgICBoYXZpbmc6IG9wZXJhdG9yID09PSAnQW5kJ1xuICAgICAgICAgICAgICAgID8gQW5kTm9kZS5jcmVhdGUoaGF2aW5nTm9kZS5oYXZpbmcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IE9yTm9kZS5jcmVhdGUoaGF2aW5nTm9kZS5oYXZpbmcsIG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaW5zZXJ0LXF1ZXJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSW5zZXJ0UXVlcnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdJbnNlcnRRdWVyeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGludG8sIHdpdGhOb2RlLCByZXBsYWNlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0luc2VydFF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBpbnRvLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgICAgICByZXBsYWNlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhvdXRJbnRvKCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdJbnNlcnRRdWVyeU5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChpbnNlcnRRdWVyeSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5pbnNlcnRRdWVyeSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2xpc3Qtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBMaXN0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnTGlzdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0xpc3ROb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VwZGF0ZS1xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgRnJvbU5vZGUgfSBmcm9tICcuL2Zyb20tbm9kZS5qcyc7XG5pbXBvcnQgeyBMaXN0Tm9kZSB9IGZyb20gJy4vbGlzdC1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVcGRhdGVRdWVyeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1VwZGF0ZVF1ZXJ5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGVzLCB3aXRoTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVcGRhdGVRdWVyeU5vZGUnLFxuICAgICAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB1c2UgdGhlIHJhdyB0YWJsZSBub2RlIHdoZW4gdGhlcmUncyBvbmx5IG9uZSB0YWJsZVxuICAgICAgICAgICAgLy8gYW5kIGRvbid0IHJlbmFtZSB0aGUgcHJvcGVydHkgdG8gc29tZXRoaW5nIGxpa2UgYHRhYmxlc2AuXG4gICAgICAgICAgICB0YWJsZTogdGFibGVzLmxlbmd0aCA9PT0gMSA/IHRhYmxlc1swXSA6IExpc3ROb2RlLmNyZWF0ZSh0YWJsZXMpLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aG91dFRhYmxlKCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVcGRhdGVRdWVyeU5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb21JdGVtcyh1cGRhdGVRdWVyeSwgZnJvbUl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4udXBkYXRlUXVlcnksXG4gICAgICAgICAgICBmcm9tOiB1cGRhdGVRdWVyeS5mcm9tXG4gICAgICAgICAgICAgICAgPyBGcm9tTm9kZS5jbG9uZVdpdGhGcm9tcyh1cGRhdGVRdWVyeS5mcm9tLCBmcm9tSXRlbXMpXG4gICAgICAgICAgICAgICAgOiBGcm9tTm9kZS5jcmVhdGUoZnJvbUl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVcGRhdGVzKHVwZGF0ZVF1ZXJ5LCB1cGRhdGVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4udXBkYXRlUXVlcnksXG4gICAgICAgICAgICB1cGRhdGVzOiB1cGRhdGVRdWVyeS51cGRhdGVzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnVwZGF0ZVF1ZXJ5LnVwZGF0ZXMsIC4uLnVwZGF0ZXNdKVxuICAgICAgICAgICAgICAgIDogdXBkYXRlcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhMaW1pdCh1cGRhdGVRdWVyeSwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi51cGRhdGVRdWVyeSxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VzaW5nLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVXNpbmdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdVc2luZ05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVc2luZ05vZGUnLFxuICAgICAgICAgICAgdGFibGVzOiBmcmVlemUodGFibGVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUYWJsZXModXNpbmcsIHRhYmxlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnVzaW5nLFxuICAgICAgICAgICAgdGFibGVzOiBmcmVlemUoWy4uLnVzaW5nLnRhYmxlcywgLi4udGFibGVzXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGVsZXRlLXF1ZXJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBGcm9tTm9kZSB9IGZyb20gJy4vZnJvbS1ub2RlLmpzJztcbmltcG9ydCB7IFVzaW5nTm9kZSB9IGZyb20gJy4vdXNpbmctbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuL3F1ZXJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERlbGV0ZVF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRGVsZXRlUXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmcm9tSXRlbXMsIHdpdGhOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0RlbGV0ZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBmcm9tOiBGcm9tTm9kZS5jcmVhdGUoZnJvbUl0ZW1zKSxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIC8vIFRPRE86IHJlbW92ZSBpbiB2MC4yOVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBgUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnlgIGluc3RlYWQuXG4gICAgICovXG4gICAgY2xvbmVXaXRoT3JkZXJCeUl0ZW1zOiAobm9kZSwgaXRlbXMpID0+IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXMobm9kZSwgaXRlbXMpLFxuICAgIC8vIFRPRE86IHJlbW92ZSBpbiB2MC4yOVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBgUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnlgIGluc3RlYWQuXG4gICAgICovXG4gICAgY2xvbmVXaXRob3V0T3JkZXJCeTogKG5vZGUpID0+IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5KG5vZGUpLFxuICAgIGNsb25lV2l0aExpbWl0KGRlbGV0ZU5vZGUsIGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZGVsZXRlTm9kZSxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dExpbWl0KGRlbGV0ZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kZWxldGVOb2RlLFxuICAgICAgICAgICAgbGltaXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVc2luZyhkZWxldGVOb2RlLCB0YWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kZWxldGVOb2RlLFxuICAgICAgICAgICAgdXNpbmc6IGRlbGV0ZU5vZGUudXNpbmcgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gVXNpbmdOb2RlLmNsb25lV2l0aFRhYmxlcyhkZWxldGVOb2RlLnVzaW5nLCB0YWJsZXMpXG4gICAgICAgICAgICAgICAgOiBVc2luZ05vZGUuY3JlYXRlKHRhYmxlcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vd2hlcmUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuL2FuZC1ub2RlLmpzJztcbmltcG9ydCB7IE9yTm9kZSB9IGZyb20gJy4vb3Itbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV2hlcmVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdXaGVyZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdXaGVyZU5vZGUnLFxuICAgICAgICAgICAgd2hlcmU6IGZpbHRlcixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcGVyYXRpb24od2hlcmVOb2RlLCBvcGVyYXRvciwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ud2hlcmVOb2RlLFxuICAgICAgICAgICAgd2hlcmU6IG9wZXJhdG9yID09PSAnQW5kJ1xuICAgICAgICAgICAgICAgID8gQW5kTm9kZS5jcmVhdGUod2hlcmVOb2RlLndoZXJlLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBPck5vZGUuY3JlYXRlKHdoZXJlTm9kZS53aGVyZSwgb3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yZXR1cm5pbmctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZXR1cm5pbmdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZXR1cm5pbmdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzZWxlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1JldHVybmluZ05vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uczogZnJlZXplKHNlbGVjdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFNlbGVjdGlvbnMocmV0dXJuaW5nLCBzZWxlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ucmV0dXJuaW5nLFxuICAgICAgICAgICAgc2VsZWN0aW9uczogcmV0dXJuaW5nLnNlbGVjdGlvbnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4ucmV0dXJuaW5nLnNlbGVjdGlvbnMsIC4uLnNlbGVjdGlvbnNdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKHNlbGVjdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2V4cGxhaW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBFeHBsYWluTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRXhwbGFpbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdFeHBsYWluTm9kZScsXG4gICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3doZW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBXaGVuTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnV2hlbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdXaGVuTm9kZScsXG4gICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoUmVzdWx0KHdoZW5Ob2RlLCByZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi53aGVuTm9kZSxcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9tZXJnZS1xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuL3doZW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTWVyZ2VRdWVyeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ01lcmdlUXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpbnRvLCB3aXRoTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdNZXJnZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBpbnRvLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVXNpbmcobWVyZ2VOb2RlLCB1c2luZykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm1lcmdlTm9kZSxcbiAgICAgICAgICAgIHVzaW5nLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFdoZW4obWVyZ2VOb2RlLCB3aGVuKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubWVyZ2VOb2RlLFxuICAgICAgICAgICAgd2hlbnM6IG1lcmdlTm9kZS53aGVuc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5tZXJnZU5vZGUud2hlbnMsIHdoZW5dKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFt3aGVuXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVGhlbihtZXJnZU5vZGUsIHRoZW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5tZXJnZU5vZGUsXG4gICAgICAgICAgICB3aGVuczogbWVyZ2VOb2RlLndoZW5zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoW1xuICAgICAgICAgICAgICAgICAgICAuLi5tZXJnZU5vZGUud2hlbnMuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgICAgICAgICBXaGVuTm9kZS5jbG9uZVdpdGhSZXN1bHQobWVyZ2VOb2RlLndoZW5zW21lcmdlTm9kZS53aGVucy5sZW5ndGggLSAxXSwgdGhlbiksXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vdXRwdXQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPdXRwdXROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPdXRwdXROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzZWxlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ091dHB1dE5vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uczogZnJlZXplKHNlbGVjdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFNlbGVjdGlvbnMob3V0cHV0LCBzZWxlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub3V0cHV0LFxuICAgICAgICAgICAgc2VsZWN0aW9uczogb3V0cHV0LnNlbGVjdGlvbnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4ub3V0cHV0LnNlbGVjdGlvbnMsIC4uLnNlbGVjdGlvbnNdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKHNlbGVjdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3F1ZXJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBJbnNlcnRRdWVyeU5vZGUgfSBmcm9tICcuL2luc2VydC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5Tm9kZSB9IGZyb20gJy4vc2VsZWN0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlOb2RlIH0gZnJvbSAnLi91cGRhdGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBEZWxldGVRdWVyeU5vZGUgfSBmcm9tICcuL2RlbGV0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFdoZXJlTm9kZSB9IGZyb20gJy4vd2hlcmUtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBSZXR1cm5pbmdOb2RlIH0gZnJvbSAnLi9yZXR1cm5pbmctbm9kZS5qcyc7XG5pbXBvcnQgeyBFeHBsYWluTm9kZSB9IGZyb20gJy4vZXhwbGFpbi1ub2RlLmpzJztcbmltcG9ydCB7IE1lcmdlUXVlcnlOb2RlIH0gZnJvbSAnLi9tZXJnZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IE91dHB1dE5vZGUgfSBmcm9tICcuL291dHB1dC1ub2RlLmpzJztcbmltcG9ydCB7IE9yZGVyQnlOb2RlIH0gZnJvbSAnLi9vcmRlci1ieS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIChTZWxlY3RRdWVyeU5vZGUuaXMobm9kZSkgfHxcbiAgICAgICAgICAgIEluc2VydFF1ZXJ5Tm9kZS5pcyhub2RlKSB8fFxuICAgICAgICAgICAgVXBkYXRlUXVlcnlOb2RlLmlzKG5vZGUpIHx8XG4gICAgICAgICAgICBEZWxldGVRdWVyeU5vZGUuaXMobm9kZSkgfHxcbiAgICAgICAgICAgIE1lcmdlUXVlcnlOb2RlLmlzKG5vZGUpKTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEVuZE1vZGlmaWVyKG5vZGUsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogbm9kZS5lbmRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4ubm9kZS5lbmRNb2RpZmllcnMsIG1vZGlmaWVyXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShbbW9kaWZpZXJdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhXaGVyZShub2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgd2hlcmU6IG5vZGUud2hlcmVcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24obm9kZS53aGVyZSwgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhKb2luKG5vZGUsIGpvaW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgam9pbnM6IG5vZGUuam9pbnMgPyBmcmVlemUoWy4uLm5vZGUuam9pbnMsIGpvaW5dKSA6IGZyZWV6ZShbam9pbl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFJldHVybmluZyhub2RlLCBzZWxlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHJldHVybmluZzogbm9kZS5yZXR1cm5pbmdcbiAgICAgICAgICAgICAgICA/IFJldHVybmluZ05vZGUuY2xvbmVXaXRoU2VsZWN0aW9ucyhub2RlLnJldHVybmluZywgc2VsZWN0aW9ucylcbiAgICAgICAgICAgICAgICA6IFJldHVybmluZ05vZGUuY3JlYXRlKHNlbGVjdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dFJldHVybmluZyhub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHJldHVybmluZzogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dFdoZXJlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgd2hlcmU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFeHBsYWluKG5vZGUsIGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBleHBsYWluOiBFeHBsYWluTm9kZS5jcmVhdGUoZm9ybWF0LCBvcHRpb25zPy50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVG9wKG5vZGUsIHRvcCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB0b3AsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3V0cHV0KG5vZGUsIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgb3V0cHV0OiBub2RlLm91dHB1dFxuICAgICAgICAgICAgICAgID8gT3V0cHV0Tm9kZS5jbG9uZVdpdGhTZWxlY3Rpb25zKG5vZGUub3V0cHV0LCBzZWxlY3Rpb25zKVxuICAgICAgICAgICAgICAgIDogT3V0cHV0Tm9kZS5jcmVhdGUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKG5vZGUsIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIG9yZGVyQnk6IG5vZGUub3JkZXJCeVxuICAgICAgICAgICAgICAgID8gT3JkZXJCeU5vZGUuY2xvbmVXaXRoSXRlbXMobm9kZS5vcmRlckJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IE9yZGVyQnlOb2RlLmNyZWF0ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0T3JkZXJCeShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIG9yZGVyQnk6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEZyb21Ob2RlIH0gZnJvbSAnLi9mcm9tLW5vZGUuanMnO1xuaW1wb3J0IHsgR3JvdXBCeU5vZGUgfSBmcm9tICcuL2dyb3VwLWJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgSGF2aW5nTm9kZSB9IGZyb20gJy4vaGF2aW5nLW5vZGUuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi9xdWVyeS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3RRdWVyeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1NlbGVjdFF1ZXJ5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUod2l0aE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0UXVlcnlOb2RlJyxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZUZyb20oZnJvbUl0ZW1zLCB3aXRoTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RRdWVyeU5vZGUnLFxuICAgICAgICAgICAgZnJvbTogRnJvbU5vZGUuY3JlYXRlKGZyb21JdGVtcyksXG4gICAgICAgICAgICAuLi4od2l0aE5vZGUgJiYgeyB3aXRoOiB3aXRoTm9kZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhTZWxlY3Rpb25zKHNlbGVjdCwgc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IHNlbGVjdC5zZWxlY3Rpb25zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnNlbGVjdC5zZWxlY3Rpb25zLCAuLi5zZWxlY3Rpb25zXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhEaXN0aW5jdE9uKHNlbGVjdCwgZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBkaXN0aW5jdE9uOiBzZWxlY3QuZGlzdGluY3RPblxuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5zZWxlY3QuZGlzdGluY3RPbiwgLi4uZXhwcmVzc2lvbnNdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKGV4cHJlc3Npb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGcm9udE1vZGlmaWVyKHNlbGVjdCwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogc2VsZWN0LmZyb250TW9kaWZpZXJzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnNlbGVjdC5mcm9udE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFttb2RpZmllcl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIC8vIFRPRE86IHJlbW92ZSBpbiB2MC4yOVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBgUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnlgIGluc3RlYWQuXG4gICAgICovXG4gICAgY2xvbmVXaXRoT3JkZXJCeUl0ZW1zOiAobm9kZSwgaXRlbXMpID0+IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXMobm9kZSwgaXRlbXMpLFxuICAgIGNsb25lV2l0aEdyb3VwQnlJdGVtcyhzZWxlY3ROb2RlLCBpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBncm91cEJ5OiBzZWxlY3ROb2RlLmdyb3VwQnlcbiAgICAgICAgICAgICAgICA/IEdyb3VwQnlOb2RlLmNsb25lV2l0aEl0ZW1zKHNlbGVjdE5vZGUuZ3JvdXBCeSwgaXRlbXMpXG4gICAgICAgICAgICAgICAgOiBHcm91cEJ5Tm9kZS5jcmVhdGUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aExpbWl0KHNlbGVjdE5vZGUsIGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9mZnNldChzZWxlY3ROb2RlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZldGNoKHNlbGVjdE5vZGUsIGZldGNoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIGZldGNoLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEhhdmluZyhzZWxlY3ROb2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgaGF2aW5nOiBzZWxlY3ROb2RlLmhhdmluZ1xuICAgICAgICAgICAgICAgID8gSGF2aW5nTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24oc2VsZWN0Tm9kZS5oYXZpbmcsICdBbmQnLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBIYXZpbmdOb2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFNldE9wZXJhdGlvbnMoc2VsZWN0Tm9kZSwgc2V0T3BlcmF0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBzZXRPcGVyYXRpb25zOiBzZWxlY3ROb2RlLnNldE9wZXJhdGlvbnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uc2VsZWN0Tm9kZS5zZXRPcGVyYXRpb25zLCAuLi5zZXRPcGVyYXRpb25zXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShbLi4uc2V0T3BlcmF0aW9uc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dFNlbGVjdGlvbnMoc2VsZWN0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0aW9uczogW10sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0TGltaXQoc2VsZWN0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICAgICAgbGltaXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRPZmZzZXQoc2VsZWN0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICAgICAgb2Zmc2V0OiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhvdXRPcmRlckJ5OiAobm9kZSkgPT4gUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkobm9kZSksXG4gICAgY2xvbmVXaXRob3V0R3JvdXBCeShzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBncm91cEJ5OiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vam9pbi1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgSm9pbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qb2luLW5vZGUuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBKb2luQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgb24oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IEpvaW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgam9pbk5vZGU6IEpvaW5Ob2RlLmNsb25lV2l0aE9uKHRoaXMuI3Byb3BzLmpvaW5Ob2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgV2hlcmVJbnRlcmZhY2Uud2hlcmVSZWZ9IGJ1dCBhZGRzIGFuIGl0ZW0gdG8gdGhlIGpvaW4nc1xuICAgICAqIGBvbmAgY2xhdXNlIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIFdoZXJlSW50ZXJmYWNlLndoZXJlUmVmfSBmb3IgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuXG4gICAgICovXG4gICAgb25SZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSm9pbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBqb2luTm9kZTogSm9pbk5vZGUuY2xvbmVXaXRoT24odGhpcy4jcHJvcHMuam9pbk5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBvbiB0cnVlYC5cbiAgICAgKi9cbiAgICBvblRydWUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSm9pbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBqb2luTm9kZTogSm9pbk5vZGUuY2xvbmVXaXRoT24odGhpcy4jcHJvcHMuam9pbk5vZGUsIFJhd05vZGUuY3JlYXRlV2l0aFNxbCgndHJ1ZScpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuam9pbk5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wYXJ0aXRpb24tYnktaXRlbS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFBhcnRpdGlvbkJ5SXRlbU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1BhcnRpdGlvbkJ5SXRlbU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHBhcnRpdGlvbkJ5KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1BhcnRpdGlvbkJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgcGFydGl0aW9uQnksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcGFydGl0aW9uLWJ5LXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IFBhcnRpdGlvbkJ5SXRlbU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wYXJ0aXRpb24tYnktaXRlbS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFydGl0aW9uQnkocGFydGl0aW9uQnkpIHtcbiAgICByZXR1cm4gcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0KHBhcnRpdGlvbkJ5KS5tYXAoUGFydGl0aW9uQnlJdGVtTm9kZS5jcmVhdGUpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vdmVyLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBPdmVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL292ZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlUGFydGl0aW9uQnksIH0gZnJvbSAnLi4vcGFyc2VyL3BhcnRpdGlvbi1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIE92ZXJCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPdmVyQnVpbGRlcih7XG4gICAgICAgICAgICBvdmVyTm9kZTogT3Zlck5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKHRoaXMuI3Byb3BzLm92ZXJOb2RlLCBwYXJzZU9yZGVyQnkoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJPcmRlckJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IE92ZXJCdWlsZGVyKHtcbiAgICAgICAgICAgIG92ZXJOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeSh0aGlzLiNwcm9wcy5vdmVyTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXJ0aXRpb25CeShwYXJ0aXRpb25CeSkge1xuICAgICAgICByZXR1cm4gbmV3IE92ZXJCdWlsZGVyKHtcbiAgICAgICAgICAgIG92ZXJOb2RlOiBPdmVyTm9kZS5jbG9uZVdpdGhQYXJ0aXRpb25CeUl0ZW1zKHRoaXMuI3Byb3BzLm92ZXJOb2RlLCBwYXJzZVBhcnRpdGlvbkJ5KHBhcnRpdGlvbkJ5KSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm92ZXJOb2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2VsZWN0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBSZWZlcmVuY2VOb2RlIH0gZnJvbSAnLi9yZWZlcmVuY2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBTZWxlY3RBbGxOb2RlIH0gZnJvbSAnLi9zZWxlY3QtYWxsLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1NlbGVjdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVNlbGVjdEFsbCgpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0aW9uTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb246IFNlbGVjdEFsbE5vZGUuY3JlYXRlKCksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlU2VsZWN0QWxsRnJvbVRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdGlvbk5vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiBSZWZlcmVuY2VOb2RlLmNyZWF0ZVNlbGVjdEFsbCh0YWJsZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2VsZWN0LXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzRnVuY3Rpb24sIGlzUmVhZG9ubHlBcnJheSwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IGlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIsIH0gZnJvbSAnLi4vZHluYW1pYy9keW5hbWljLXJlZmVyZW5jZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IHBhcnNlQWxpYXNlZEV4cHJlc3Npb24sIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbikge1xuICAgIGlmIChpc0Z1bmN0aW9uKHNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbihleHByZXNzaW9uQnVpbGRlcigpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUmVhZG9ubHlBcnJheShzZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24ubWFwKChpdCkgPT4gcGFyc2VTZWxlY3RFeHByZXNzaW9uKGl0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW3BhcnNlU2VsZWN0RXhwcmVzc2lvbihzZWxlY3Rpb24pXTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZVNlbGVjdEV4cHJlc3Npb24oc2VsZWN0aW9uKSB7XG4gICAgaWYgKGlzU3RyaW5nKHNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvbk5vZGUuY3JlYXRlKHBhcnNlQWxpYXNlZFN0cmluZ1JlZmVyZW5jZShzZWxlY3Rpb24pKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlcihzZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb25Ob2RlLmNyZWF0ZShzZWxlY3Rpb24udG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvbk5vZGUuY3JlYXRlKHBhcnNlQWxpYXNlZEV4cHJlc3Npb24oc2VsZWN0aW9uKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSB7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgICByZXR1cm4gW1NlbGVjdGlvbk5vZGUuY3JlYXRlU2VsZWN0QWxsKCldO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRhYmxlKSkge1xuICAgICAgICByZXR1cm4gdGFibGUubWFwKHBhcnNlU2VsZWN0QWxsQXJnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbcGFyc2VTZWxlY3RBbGxBcmcodGFibGUpXTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZVNlbGVjdEFsbEFyZyh0YWJsZSkge1xuICAgIGlmIChpc1N0cmluZyh0YWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvbk5vZGUuY3JlYXRlU2VsZWN0QWxsRnJvbVRhYmxlKHBhcnNlVGFibGUodGFibGUpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZhbHVlIHNlbGVjdEFsbCBleHByZXNzaW9uOiAke0pTT04uc3RyaW5naWZ5KHRhYmxlKX1gKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdmFsdWVzLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVmFsdWVzTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVmFsdWVzTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlc05vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiBmcmVlemUodmFsdWVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LWluc2VydC12YWx1ZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRJbnNlcnRWYWx1ZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0RlZmF1bHRJbnNlcnRWYWx1ZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbnNlcnQtdmFsdWVzLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcHJpbWl0aXZlLXZhbHVlLWxpc3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSwgaXNGdW5jdGlvbiwgaXNSZWFkb25seUFycmF5LCBpc1VuZGVmaW5lZCwgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlRXhwcmVzc2lvbiB9IGZyb20gJy4vdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IFZhbHVlc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0V4cHJlc3Npb25PckZhY3RvcnkgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IERlZmF1bHRJbnNlcnRWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LWluc2VydC12YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi1idWlsZGVyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUluc2VydEV4cHJlc3Npb24oYXJnKSB7XG4gICAgY29uc3Qgb2JqZWN0T3JMaXN0ID0gaXNGdW5jdGlvbihhcmcpID8gYXJnKGV4cHJlc3Npb25CdWlsZGVyKCkpIDogYXJnO1xuICAgIGNvbnN0IGxpc3QgPSBpc1JlYWRvbmx5QXJyYXkob2JqZWN0T3JMaXN0KVxuICAgICAgICA/IG9iamVjdE9yTGlzdFxuICAgICAgICA6IGZyZWV6ZShbb2JqZWN0T3JMaXN0XSk7XG4gICAgcmV0dXJuIHBhcnNlSW5zZXJ0Q29sdW1uc0FuZFZhbHVlcyhsaXN0KTtcbn1cbmZ1bmN0aW9uIHBhcnNlSW5zZXJ0Q29sdW1uc0FuZFZhbHVlcyhyb3dzKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IHBhcnNlQ29sdW1uTmFtZXNBbmRJbmRleGVzKHJvd3MpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGZyZWV6ZShbLi4uY29sdW1ucy5rZXlzKCldLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpLFxuICAgICAgICBWYWx1ZXNOb2RlLmNyZWF0ZShyb3dzLm1hcCgocm93KSA9PiBwYXJzZVJvd1ZhbHVlcyhyb3csIGNvbHVtbnMpKSksXG4gICAgXTtcbn1cbmZ1bmN0aW9uIHBhcnNlQ29sdW1uTmFtZXNBbmRJbmRleGVzKHJvd3MpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgY29uc3QgY29scyA9IE9iamVjdC5rZXlzKHJvdyk7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHMpIHtcbiAgICAgICAgICAgIGlmICghY29sdW1ucy5oYXMoY29sKSAmJiByb3dbY29sXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5zZXQoY29sLCBjb2x1bW5zLnNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5zO1xufVxuZnVuY3Rpb24gcGFyc2VSb3dWYWx1ZXMocm93LCBjb2x1bW5zKSB7XG4gICAgY29uc3Qgcm93Q29sdW1ucyA9IE9iamVjdC5rZXlzKHJvdyk7XG4gICAgY29uc3Qgcm93VmFsdWVzID0gQXJyYXkuZnJvbSh7XG4gICAgICAgIGxlbmd0aDogY29sdW1ucy5zaXplLFxuICAgIH0pO1xuICAgIGxldCBoYXNVbmRlZmluZWRPckNvbXBsZXhDb2x1bW5zID0gZmFsc2U7XG4gICAgbGV0IGluZGV4ZWRSb3dDb2x1bW5zID0gcm93Q29sdW1ucy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBjb2wgb2Ygcm93Q29sdW1ucykge1xuICAgICAgICBjb25zdCBjb2x1bW5JZHggPSBjb2x1bW5zLmdldChjb2wpO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQoY29sdW1uSWR4KSkge1xuICAgICAgICAgICAgaW5kZXhlZFJvd0NvbHVtbnMtLTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbF07XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgaXNFeHByZXNzaW9uT3JGYWN0b3J5KHZhbHVlKSkge1xuICAgICAgICAgICAgaGFzVW5kZWZpbmVkT3JDb21wbGV4Q29sdW1ucyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcm93VmFsdWVzW2NvbHVtbklkeF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgaGFzTWlzc2luZ0NvbHVtbnMgPSBpbmRleGVkUm93Q29sdW1ucyA8IGNvbHVtbnMuc2l6ZTtcbiAgICBpZiAoaGFzTWlzc2luZ0NvbHVtbnMgfHwgaGFzVW5kZWZpbmVkT3JDb21wbGV4Q29sdW1ucykge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlLmNyZWF0ZSgpO1xuICAgICAgICByZXR1cm4gVmFsdWVMaXN0Tm9kZS5jcmVhdGUocm93VmFsdWVzLm1hcCgoaXQpID0+IGlzVW5kZWZpbmVkKGl0KSA/IGRlZmF1bHRWYWx1ZSA6IHBhcnNlVmFsdWVFeHByZXNzaW9uKGl0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZS5jcmVhdGUocm93VmFsdWVzKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29sdW1uLXVwZGF0ZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbHVtblVwZGF0ZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbHVtblVwZGF0ZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbiwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uVXBkYXRlTm9kZScsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91cGRhdGUtc2V0LXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5VcGRhdGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLXVwZGF0ZS1ub2RlLmpzJztcbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlRXhwcmVzc2lvbiB9IGZyb20gJy4vdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiwgfSBmcm9tICcuL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXBkYXRlKC4uLmFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIENvbHVtblVwZGF0ZU5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihhcmdzWzBdKSwgcGFyc2VWYWx1ZUV4cHJlc3Npb24oYXJnc1sxXSkpLFxuICAgICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uKGFyZ3NbMF0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXBkYXRlT2JqZWN0RXhwcmVzc2lvbih1cGRhdGUpIHtcbiAgICBjb25zdCB1cGRhdGVPYmogPSBpc0Z1bmN0aW9uKHVwZGF0ZSkgPyB1cGRhdGUoZXhwcmVzc2lvbkJ1aWxkZXIoKSkgOiB1cGRhdGU7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHVwZGF0ZU9iailcbiAgICAgICAgLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIHJldHVybiBDb2x1bW5VcGRhdGVOb2RlLmNyZWF0ZShDb2x1bW5Ob2RlLmNyZWF0ZShrZXkpLCBwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZSkpO1xuICAgIH0pO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vbi1kdXBsaWNhdGUta2V5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT25EdXBsaWNhdGVLZXlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPbkR1cGxpY2F0ZUtleU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHVwZGF0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT25EdXBsaWNhdGVLZXlOb2RlJyxcbiAgICAgICAgICAgIHVwZGF0ZXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaW5zZXJ0LXJlc3VsdC5kLnRzXCIgLz5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBhbiBpbnNlcnQgcXVlcnkuXG4gKlxuICogSWYgdGhlIHRhYmxlIGhhcyBhbiBhdXRvIGluY3JlbWVudGluZyBwcmltYXJ5IGtleSB7QGxpbmsgaW5zZXJ0SWR9IHdpbGwgaG9sZFxuICogdGhlIGdlbmVyYXRlZCBpZCBvbiBkaWFsZWN0cyB0aGF0IHN1cHBvcnQgaXQuIEZvciBleGFtcGxlIFBvc3RncmVTUUwgZG9lc24ndFxuICogcmV0dXJuIHRoZSBpZCBieSBkZWZhdWx0IGFuZCB7QGxpbmsgaW5zZXJ0SWR9IGlzIHVuZGVmaW5lZC4gT24gUG9zdGdyZVNRTCB5b3VcbiAqIG5lZWQgdG8gdXNlIHtAbGluayBSZXR1cm5pbmdJbnRlcmZhY2UucmV0dXJuaW5nfSBvciB7QGxpbmsgUmV0dXJuaW5nSW50ZXJmYWNlLnJldHVybmluZ0FsbH1cbiAqIHRvIGdldCBvdXQgdGhlIGluc2VydGVkIGlkLlxuICpcbiAqIHtAbGluayBudW1JbnNlcnRlZE9yVXBkYXRlZFJvd3N9IGhvbGRzIHRoZSBudW1iZXIgb2YgKGFjdHVhbGx5KSBpbnNlcnRlZCByb3dzLlxuICogT24gTXlTUUwsIHVwZGF0ZWQgcm93cyBhcmUgY291bnRlZCB0d2ljZSB3aGVuIHVzaW5nIGBvbiBkdXBsaWNhdGUga2V5IHVwZGF0ZWAuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB0eXBlIHsgTmV3UGVyc29uIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBpbnNlcnRQZXJzb24ocGVyc29uOiBOZXdQZXJzb24pIHtcbiAqICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAqICAgICAudmFsdWVzKHBlcnNvbilcbiAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICpcbiAqICAgY29uc29sZS5sb2cocmVzdWx0Lmluc2VydElkKSAvLyByZWxldmFudCBvbiBNeVNRTFxuICogICBjb25zb2xlLmxvZyhyZXN1bHQubnVtSW5zZXJ0ZWRPclVwZGF0ZWRSb3dzKSAvLyBhbHdheXMgcmVsZXZhbnRcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSW5zZXJ0UmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0byBpbmNyZW1lbnRpbmcgcHJpbWFyeSBrZXkgb2YgdGhlIGluc2VydGVkIHJvdy5cbiAgICAgKlxuICAgICAqIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVuZGVmaW5lZCB3aGVuIHRoZSBxdWVyeSBjb250YWlucyBhbiBgb24gY29uZmxpY3RgXG4gICAgICogY2xhdXNlIHRoYXQgbWFrZXMgdGhlIHF1ZXJ5IHN1Y2NlZWQgZXZlbiB3aGVuIG5vdGhpbmcgZ2V0cyBpbnNlcnRlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYWx3YXlzIHVuZGVmaW5lZCBvbiBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgdGhhdFxuICAgICAqIGRvbid0IHJldHVybiB0aGUgaW5zZXJ0ZWQgaWQgYnkgZGVmYXVsdC4gT24gdGhvc2UgZGlhbGVjdHMgeW91IG5lZWRcbiAgICAgKiB0byB1c2UgdGhlIHtAbGluayBSZXR1cm5pbmdJbnRlcmZhY2UucmV0dXJuaW5nIHwgcmV0dXJuaW5nfSBtZXRob2QuXG4gICAgICovXG4gICAgaW5zZXJ0SWQ7XG4gICAgLyoqXG4gICAgICogQWZmZWN0ZWQgcm93cyBjb3VudC5cbiAgICAgKi9cbiAgICBudW1JbnNlcnRlZE9yVXBkYXRlZFJvd3M7XG4gICAgY29uc3RydWN0b3IoaW5zZXJ0SWQsIG51bUluc2VydGVkT3JVcGRhdGVkUm93cykge1xuICAgICAgICB0aGlzLmluc2VydElkID0gaW5zZXJ0SWQ7XG4gICAgICAgIHRoaXMubnVtSW5zZXJ0ZWRPclVwZGF0ZWRSb3dzID0gbnVtSW5zZXJ0ZWRPclVwZGF0ZWRSb3dzO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbm8tcmVzdWx0LWVycm9yLmQudHNcIiAvPlxuZXhwb3J0IGNsYXNzIE5vUmVzdWx0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogVGhlIG9wZXJhdGlvbiBub2RlIHRyZWUgb2YgdGhlIHF1ZXJ5IHRoYXQgd2FzIGV4ZWN1dGVkLlxuICAgICAqL1xuICAgIG5vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICBzdXBlcignbm8gcmVzdWx0Jyk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGZuKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmbiwgJ3Byb3RvdHlwZScpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vbi1jb25mbGljdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgV2hlcmVOb2RlIH0gZnJvbSAnLi93aGVyZS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPbkNvbmZsaWN0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT25Db25mbGljdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbkNvbmZsaWN0Tm9kZScsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEluZGV4V2hlcmUobm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGluZGV4V2hlcmU6IG5vZGUuaW5kZXhXaGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLmluZGV4V2hlcmUsICdBbmQnLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSW5kZXhPcldoZXJlKG5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBpbmRleFdoZXJlOiBub2RlLmluZGV4V2hlcmVcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24obm9kZS5pbmRleFdoZXJlLCAnT3InLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVXBkYXRlV2hlcmUobm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHVwZGF0ZVdoZXJlOiBub2RlLnVwZGF0ZVdoZXJlXG4gICAgICAgICAgICAgICAgPyBXaGVyZU5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKG5vZGUudXBkYXRlV2hlcmUsICdBbmQnLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVXBkYXRlT3JXaGVyZShub2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgdXBkYXRlV2hlcmU6IG5vZGUudXBkYXRlV2hlcmVcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24obm9kZS51cGRhdGVXaGVyZSwgJ09yJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogV2hlcmVOb2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dEluZGV4V2hlcmUobm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBpbmRleFdoZXJlOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0VXBkYXRlV2hlcmUobm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB1cGRhdGVXaGVyZTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLWNvbmZsaWN0LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgT25Db25mbGljdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vbi1jb25mbGljdC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVXBkYXRlT2JqZWN0RXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdXBkYXRlLXNldC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIE9uQ29uZmxpY3RCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGEgc2luZ2xlIGNvbHVtbiBhcyB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBjb2x1bW5zfSwge0BsaW5rIGNvbnN0cmFpbnR9IGFuZCB7QGxpbmsgZXhwcmVzc2lvbn1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBjb2x1bW4oY29sdW1uKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbk5vZGUgPSBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pO1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLmNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLmNvbHVtbnMsIGNvbHVtbk5vZGVdKVxuICAgICAgICAgICAgICAgICAgICA6IGZyZWV6ZShbY29sdW1uTm9kZV0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGEgbGlzdCBvZiBjb2x1bW5zIGFzIHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGNvbHVtbn0sIHtAbGluayBjb25zdHJhaW50fSBhbmQge0BsaW5rIGV4cHJlc3Npb259XG4gICAgICogbWV0aG9kcyBmb3IgYWx0ZXJuYXRpdmUgd2F5cyB0byBzcGVjaWZ5IHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICovXG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbk5vZGVzID0gY29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLmNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLmNvbHVtbnMsIC4uLmNvbHVtbk5vZGVzXSlcbiAgICAgICAgICAgICAgICAgICAgOiBmcmVlemUoY29sdW1uTm9kZXMpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGEgc3BlY2lmaWMgY29uc3RyYWludCBieSBuYW1lIGFzIHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGNvbHVtbn0sIHtAbGluayBjb2x1bW5zfSBhbmQge0BsaW5rIGV4cHJlc3Npb259XG4gICAgICogbWV0aG9kcyBmb3IgYWx0ZXJuYXRpdmUgd2F5cyB0byBzcGVjaWZ5IHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICovXG4gICAgY29uc3RyYWludChjb25zdHJhaW50TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQ6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShjb25zdHJhaW50TmFtZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYW4gZXhwcmVzc2lvbiBhcyB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCBpZiB0aGUgdW5pcXVlIGluZGV4IGlzIGFuIGV4cHJlc3Npb24gaW5kZXguXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGNvbHVtbn0sIHtAbGluayBjb2x1bW5zfSBhbmQge0BsaW5rIGNvbnN0cmFpbnR9XG4gICAgICogbWV0aG9kcyBmb3IgYWx0ZXJuYXRpdmUgd2F5cyB0byBzcGVjaWZ5IHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICovXG4gICAgZXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgaW5kZXhFeHByZXNzaW9uOiBleHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aGVyZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoSW5kZXhXaGVyZSh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aGVyZVJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhJbmRleFdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJXaGVyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhvdXRJbmRleFdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIFwiZG8gbm90aGluZ1wiIGNvbmZsaWN0IGFjdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBpZCA9IDFcbiAgICAgKiBjb25zdCBmaXJzdF9uYW1lID0gJ0pvaG4nXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcdTAwQTBmaXJzdF9uYW1lLCBpZCB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuY29sdW1uKCdpZCcpXG4gICAgICogICAgIC5kb05vdGhpbmcoKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwiaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMilcbiAgICAgKiBvbiBjb25mbGljdCAoXCJpZFwiKSBkbyBub3RoaW5nXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZG9Ob3RoaW5nKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3REb05vdGhpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwge1xuICAgICAgICAgICAgICAgIGRvTm90aGluZzogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJkbyB1cGRhdGUgc2V0XCIgY29uZmxpY3QgYWN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGlkID0gMVxuICAgICAqIGNvbnN0IGZpcnN0X25hbWUgPSAnSm9obidcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1x1MDBBMGZpcnN0X25hbWUsIGlkIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ2lkJylcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHsgZmlyc3RfbmFtZSB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwiaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMilcbiAgICAgKiBvbiBjb25mbGljdCAoXCJpZFwiKVxuICAgICAqIGRvIHVwZGF0ZSBzZXQgXCJmaXJzdF9uYW1lXCIgPSAkM1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gdGhlIG5leHQgZXhhbXBsZSB3ZSB1c2UgdGhlIGByZWZgIG1ldGhvZCB0byByZWZlcmVuY2VcbiAgICAgKiBjb2x1bW5zIG9mIHRoZSB2aXJ0dWFsIHRhYmxlIGBleGNsdWRlZGAgaW4gYSB0eXBlLXNhZmUgd2F5XG4gICAgICogdG8gY3JlYXRlIGFuIHVwc2VydCBvcGVyYXRpb246XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgTmV3UGVyc29uIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHVwc2VydFBlcnNvbihwZXJzb246IE5ld1BlcnNvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAqICAgYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgICAgLnZhbHVlcyhwZXJzb24pXG4gICAgICogICAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgICAuY29sdW1uKCdpZCcpXG4gICAgICogICAgICAgLmRvVXBkYXRlU2V0KChlYikgPT4gKHtcbiAgICAgKiAgICAgICAgIGZpcnN0X25hbWU6IGViLnJlZignZXhjbHVkZWQuZmlyc3RfbmFtZScpLFxuICAgICAqICAgICAgICAgbGFzdF9uYW1lOiBlYi5yZWYoJ2V4Y2x1ZGVkLmxhc3RfbmFtZScpXG4gICAgICogICAgICAgfSlcbiAgICAgKiAgICAgKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyKVxuICAgICAqIG9uIGNvbmZsaWN0IChcImlkXCIpXG4gICAgICogZG8gdXBkYXRlIHNldFxuICAgICAqICBcImZpcnN0X25hbWVcIiA9IGV4Y2x1ZGVkLlwiZmlyc3RfbmFtZVwiLFxuICAgICAqICBcImxhc3RfbmFtZVwiID0gZXhjbHVkZWQuXCJsYXN0X25hbWVcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRvVXBkYXRlU2V0KHVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RVcGRhdGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwge1xuICAgICAgICAgICAgICAgIHVwZGF0ZXM6IHBhcnNlVXBkYXRlT2JqZWN0RXhwcmVzc2lvbih1cGRhdGUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE9uQ29uZmxpY3REb05vdGhpbmdCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0VXBkYXRlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhVcGRhdGVXaGVyZSh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGEgd2hlcmUgY29uZGl0aW9uIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgV2hlcmVJbnRlcmZhY2Uud2hlcmVSZWZ9IGZvciBtb3JlIGluZm8uXG4gICAgICovXG4gICAgd2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoVXBkYXRlV2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RVcGRhdGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aG91dFVwZGF0ZVdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMub25Db25mbGljdE5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi90b3Atbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBUb3BOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdUb3BOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVG9wTm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgbW9kaWZpZXJzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3RvcC1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBUb3BOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdG9wLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNCaWdJbnQsIGlzTnVtYmVyLCBpc1VuZGVmaW5lZCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICBpZiAoIWlzTnVtYmVyKGV4cHJlc3Npb24pICYmICFpc0JpZ0ludChleHByZXNzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdG9wIGV4cHJlc3Npb246ICR7ZXhwcmVzc2lvbn1gKTtcbiAgICB9XG4gICAgaWYgKCFpc1VuZGVmaW5lZChtb2RpZmllcnMpICYmICFpc1RvcE1vZGlmaWVycyhtb2RpZmllcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0b3AgbW9kaWZpZXJzOiAke21vZGlmaWVyc31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFRvcE5vZGUuY3JlYXRlKGV4cHJlc3Npb24sIG1vZGlmaWVycyk7XG59XG5mdW5jdGlvbiBpc1RvcE1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgICByZXR1cm4gKG1vZGlmaWVycyA9PT0gJ3BlcmNlbnQnIHx8XG4gICAgICAgIG1vZGlmaWVycyA9PT0gJ3dpdGggdGllcycgfHxcbiAgICAgICAgbW9kaWZpZXJzID09PSAncGVyY2VudCB3aXRoIHRpZXMnKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3ItYWN0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3JBY3Rpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPckFjdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGFjdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPckFjdGlvbk5vZGUnLFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2luc2VydC1xdWVyeS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgcGFyc2VTZWxlY3RBcmcsIHBhcnNlU2VsZWN0QWxsLCB9IGZyb20gJy4uL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlSW5zZXJ0RXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvaW5zZXJ0LXZhbHVlcy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL3VwZGF0ZS1zZXQtcGFyc2VyLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE9uRHVwbGljYXRlS2V5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29uLWR1cGxpY2F0ZS1rZXktbm9kZS5qcyc7XG5pbXBvcnQgeyBJbnNlcnRSZXN1bHQgfSBmcm9tICcuL2luc2VydC1yZXN1bHQuanMnO1xuaW1wb3J0IHsgaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IsIE5vUmVzdWx0RXJyb3IsIH0gZnJvbSAnLi9uby1yZXN1bHQtZXJyb3IuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgT25Db25mbGljdEJ1aWxkZXIsIH0gZnJvbSAnLi9vbi1jb25mbGljdC1idWlsZGVyLmpzJztcbmltcG9ydCB7IE9uQ29uZmxpY3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb24tY29uZmxpY3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmltcG9ydCB7IE9yQWN0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29yLWFjdGlvbi1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBJbnNlcnRRdWVyeUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlcyB0byBpbnNlcnQgZm9yIGFuIHtAbGluayBLeXNlbHkuaW5zZXJ0SW50byB8IGluc2VydH0gcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgY29sdW1uIG5hbWVzIGFuZCB2YWx1ZXMgYXJlXG4gICAgICogdmFsdWVzIHRvIGluc2VydC4gSW4gYWRkaXRpb24gdG8gdGhlIGNvbHVtbidzIHR5cGUsIHRoZSB2YWx1ZXMgY2FuIGJlXG4gICAgICogcmF3IHtAbGluayBzcWx9IHNuaXBwZXRzIG9yIHNlbGVjdCBxdWVyaWVzLlxuICAgICAqXG4gICAgICogWW91IG11c3QgcHJvdmlkZSBhbGwgZmllbGRzIHlvdSBoYXZlbid0IGV4cGxpY2l0bHkgbWFya2VkIGFzIG51bGxhYmxlXG4gICAgICogb3Igb3B0aW9uYWwgdXNpbmcge0BsaW5rIEdlbmVyYXRlZH0gb3Ige0BsaW5rIENvbHVtblR5cGV9LlxuICAgICAqXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiBhbiBgaW5zZXJ0YCBxdWVyeSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSW5zZXJ0UmVzdWx0fS4gVGhlXG4gICAgICoge0BsaW5rIEluc2VydFJlc3VsdC5pbnNlcnRJZCB8IGluc2VydElkfSBmaWVsZCBob2xkcyB0aGUgYXV0byBpbmNyZW1lbnRlZCBwcmltYXJ5XG4gICAgICoga2V5IGlmIHRoZSBkYXRhYmFzZSByZXR1cm5lZCBvbmUuXG4gICAgICpcbiAgICAgKiBPbiBQb3N0Z3JlU1FMIGFuZCBzb21lIG90aGVyIGRpYWxlY3RzLCB5b3UgbmVlZCB0byBjYWxsIGByZXR1cm5pbmdgIHRvIGdldFxuICAgICAqIHNvbWV0aGluZyBvdXQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBleHByZXNzaW9ufSBtZXRob2QgZm9yIGluc2VydGluZyB0aGUgcmVzdWx0IG9mIGEgc2VsZWN0XG4gICAgICogcXVlcnkgb3IgYW55IG90aGVyIGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJpbnNlcnRcIiwgXCJTaW5nbGUgcm93XCIsIDEwKSAtLT5cbiAgICAgKlxuICAgICAqIEluc2VydCBhIHNpbmdsZSByb3c6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJyxcbiAgICAgKiAgICAgYWdlOiA0MFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKlxuICAgICAqIC8vIGBpbnNlcnRJZGAgaXMgb25seSBhdmFpbGFibGUgb24gZGlhbGVjdHMgdGhhdFxuICAgICAqIC8vIGF1dG9tYXRpY2FsbHkgcmV0dXJuIHRoZSBpZCBvZiB0aGUgaW5zZXJ0ZWQgcm93XG4gICAgICogLy8gc3VjaCBhcyBNeVNRTCBhbmQgU1FMaXRlLiBPbiBQb3N0Z3JlU1FMLCBmb3IgZXhhbXBsZSxcbiAgICAgKiAvLyB5b3UgbmVlZCB0byBhZGQgYSBgcmV0dXJuaW5nYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5IHRvXG4gICAgICogLy8gZ2V0IGFueXRoaW5nIG91dC4gU2VlIHRoZSBcInJldHVybmluZyBkYXRhXCIgZXhhbXBsZS5cbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQuaW5zZXJ0SWQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gYHBlcnNvbmAgKGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBhZ2VgKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiaW5zZXJ0XCIsIFwiTXVsdGlwbGUgcm93c1wiLCAyMCkgLS0+XG4gICAgICpcbiAgICAgKiBPbiBkaWFsZWN0cyB0aGF0IHN1cHBvcnQgaXQgKGZvciBleGFtcGxlIFBvc3RncmVTUUwpIHlvdSBjYW4gaW5zZXJ0IG11bHRpcGxlXG4gICAgICogcm93cyBieSBwcm92aWRpbmcgYW4gYXJyYXkuIE5vdGUgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIG9uY2UgYWdhaW4gdmVyeVxuICAgICAqIGRpYWxlY3Qtc3BlY2lmaWMuIFNvbWUgZGF0YWJhc2VzIG1heSBvbmx5IHJldHVybiB0aGUgaWQgb2YgdGhlICpsYXN0KiBpbnNlcnRlZFxuICAgICAqIHJvdyBhbmQgc29tZSByZXR1cm4gbm90aGluZyBhdCBhbGwgdW5sZXNzIHlvdSBjYWxsIGByZXR1cm5pbmdgLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKFt7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICBhZ2U6IDQwLFxuICAgICAqICAgfSwge1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnQXJub2xkJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnU2Nod2FyemVuZWdnZXInLFxuICAgICAqICAgICBhZ2U6IDcwLFxuICAgICAqICAgfV0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJhZ2VcIikgdmFsdWVzICgoJDEsICQyLCAkMyksICgkNCwgJDUsICQ2KSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJpbnNlcnRcIiwgXCJSZXR1cm5pbmcgZGF0YVwiLCAzMCkgLS0+XG4gICAgICpcbiAgICAgKiBPbiBzdXBwb3J0ZWQgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIHlvdSBuZWVkIHRvIGNoYWluIGByZXR1cm5pbmdgIHRvIHRoZSBxdWVyeSB0byBnZXRcbiAgICAgKiB0aGUgaW5zZXJ0ZWQgcm93J3MgY29sdW1ucyAob3IgYW55IG90aGVyIGV4cHJlc3Npb24pIGFzIHRoZSByZXR1cm4gdmFsdWUuIGByZXR1cm5pbmdgXG4gICAgICogd29ya3MganVzdCBsaWtlIGBzZWxlY3RgLiBSZWZlciB0byBgc2VsZWN0YCBtZXRob2QncyBleGFtcGxlcyBhbmQgZG9jdW1lbnRhdGlvbiBmb3JcbiAgICAgKiBtb3JlIGluZm8uXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJyxcbiAgICAgKiAgICAgYWdlOiA0MCxcbiAgICAgKiAgIH0pXG4gICAgICogICAucmV0dXJuaW5nKFsnaWQnLCAnZmlyc3RfbmFtZSBhcyBuYW1lJ10pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiYWdlXCIpIHZhbHVlcyAoJDEsICQyLCAkMykgcmV0dXJuaW5nIFwiaWRcIiwgXCJmaXJzdF9uYW1lXCIgYXMgXCJuYW1lXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJpbnNlcnRcIiwgXCJDb21wbGV4IHZhbHVlc1wiLCA0MCkgLS0+XG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBwcmltaXRpdmVzLCB0aGUgdmFsdWVzIGNhbiBhbHNvIGJlIGFyYml0cmFyeSBleHByZXNzaW9ucy5cbiAgICAgKiBZb3UgY2FuIGJ1aWxkIHRoZSBleHByZXNzaW9ucyBieSB1c2luZyBhIGNhbGxiYWNrIGFuZCBjYWxsaW5nIHRoZSBtZXRob2RzXG4gICAgICogb24gdGhlIGV4cHJlc3Npb24gYnVpbGRlciBwYXNzZWQgdG8gaXQ6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGFuaSA9IFwiQW5pXCJcbiAgICAgKiBjb25zdCBzdG9uID0gXCJzdG9uXCJcbiAgICAgKlxuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoKHsgcmVmLCBzZWxlY3RGcm9tLCBmbiB9KSA9PiAoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6IHNxbDxzdHJpbmc+YGNvbmNhdCgke2FuaX0sICR7c3Rvbn0pYCxcbiAgICAgKiAgICAgbWlkZGxlX25hbWU6IHJlZignZmlyc3RfbmFtZScpLFxuICAgICAqICAgICBhZ2U6IHNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgICAgLnNlbGVjdChmbi5hdmc8bnVtYmVyPignYWdlJykuYXMoJ2F2Z19hZ2UnKSksXG4gICAgICogICB9KSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFxuICAgICAqICAgXCJmaXJzdF9uYW1lXCIsXG4gICAgICogICBcImxhc3RfbmFtZVwiLFxuICAgICAqICAgXCJtaWRkbGVfbmFtZVwiLFxuICAgICAqICAgXCJhZ2VcIlxuICAgICAqIClcbiAgICAgKiB2YWx1ZXMgKFxuICAgICAqICAgJDEsXG4gICAgICogICBjb25jYXQoJDIsICQzKSxcbiAgICAgKiAgIFwiZmlyc3RfbmFtZVwiLFxuICAgICAqICAgKHNlbGVjdCBhdmcoXCJhZ2VcIikgYXMgXCJhdmdfYWdlXCIgZnJvbSBcInBlcnNvblwiKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyB1c2UgdGhlIGNhbGxiYWNrIHZlcnNpb24gb2Ygc3VicXVlcmllcyBvciByYXcgZXhwcmVzc2lvbnM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLndpdGgoJ2plbm5pZmVyJywgKGRiKSA9PiBkYlxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKZW5uaWZlcicpXG4gICAgICogICAuc2VsZWN0KFsnaWQnLCAnZmlyc3RfbmFtZScsICdnZW5kZXInXSlcbiAgICAgKiAgIC5saW1pdCgxKVxuICAgICAqICkuaW5zZXJ0SW50bygncGV0JykudmFsdWVzKChlYikgPT4gKHtcbiAgICAgKiAgIG93bmVyX2lkOiBlYi5zZWxlY3RGcm9tKCdqZW5uaWZlcicpLnNlbGVjdCgnaWQnKSxcbiAgICAgKiAgIG5hbWU6IGViLnNlbGVjdEZyb20oJ2plbm5pZmVyJykuc2VsZWN0KCdmaXJzdF9uYW1lJyksXG4gICAgICogICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiB9KSlcbiAgICAgKiAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB3aXRoIFwiamVubmlmZXJcIiBhcyAoXG4gICAgICogICBzZWxlY3QgXCJpZFwiLCBcImZpcnN0X25hbWVcIiwgXCJnZW5kZXJcIlxuICAgICAqICAgZnJvbSBcInBlcnNvblwiXG4gICAgICogICB3aGVyZSBcImZpcnN0X25hbWVcIiA9ICQxXG4gICAgICogICBsaW1pdCAkMlxuICAgICAqIClcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm93bmVyX2lkXCIsIFwibmFtZVwiLCBcInNwZWNpZXNcIilcbiAgICAgKiB2YWx1ZXMgKFxuICAgICAqICAoc2VsZWN0IFwiaWRcIiBmcm9tIFwiamVubmlmZXJcIiksXG4gICAgICogIChzZWxlY3QgXCJmaXJzdF9uYW1lXCIgZnJvbSBcImplbm5pZmVyXCIpLFxuICAgICAqICAkM1xuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB2YWx1ZXMoaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5zLCB2YWx1ZXNdID0gcGFyc2VJbnNlcnRFeHByZXNzaW9uKGluc2VydCk7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb2x1bW5zIHRvIGluc2VydC5cbiAgICAgKlxuICAgICAqIFRoZSB7QGxpbmsgdmFsdWVzfSBtZXRob2Qgc2V0cyBib3RoIHRoZSBjb2x1bW5zIGFuZCB0aGUgdmFsdWVzIGFuZCB0aGlzIG1ldGhvZFxuICAgICAqIGlzIG5vdCBuZWVkZWQuIEJ1dCBpZiB5b3UgYXJlIHVzaW5nIHRoZSB7QGxpbmsgZXhwcmVzc2lvbn0gbWV0aG9kLCB5b3UgY2FuIHVzZVxuICAgICAqIHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgY29sdW1ucyB0byBpbnNlcnQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZSddKVxuICAgICAqICAgLmV4cHJlc3Npb24oKGViKSA9PiBlYi5zZWxlY3RGcm9tKCdwZXQnKS5zZWxlY3QoJ3BldC5uYW1lJykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIilcbiAgICAgKiBzZWxlY3QgXCJwZXRcIi5cIm5hbWVcIiBmcm9tIFwicGV0XCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogZnJlZXplKGNvbHVtbnMubWFwKENvbHVtbk5vZGUuY3JlYXRlKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydCBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbi4gRm9yIGV4YW1wbGUgdGhlIHJlc3VsdCBvZiBhIHNlbGVjdCBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImluc2VydFwiLCBcIkluc2VydCBzdWJxdWVyeVwiLCA1MCkgLS0+XG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGNyZWF0ZSBhbiBgSU5TRVJUIElOVE8gU0VMRUNUIEZST01gIHF1ZXJ5IHVzaW5nIHRoZSBgZXhwcmVzc2lvbmAgbWV0aG9kLlxuICAgICAqIFRoaXMgQVBJIGRvZXNuJ3QgZm9sbG93IG91ciBXWVNJV1lHIHByaW5jaXBsZXMgYW5kIG1pZ2h0IGJlIGEgYml0IGRpZmZpY3VsdCB0b1xuICAgICAqIHJlbWVtYmVyLiBUaGUgcmVhc29ucyBmb3IgdGhpcyBkZXNpZ24gc3RlbSBmcm9tIGltcGxlbWVudGF0aW9uIGRpZmZpY3VsdGllcy5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnYWdlJ10pXG4gICAgICogICAuZXhwcmVzc2lvbigoZWIpID0+IGViXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdwZXQnKVxuICAgICAqICAgICAuc2VsZWN0KChlYikgPT4gW1xuICAgICAqICAgICAgICdwZXQubmFtZScsXG4gICAgICogICAgICAgZWIudmFsKCdQZXRzb24nKS5hcygnbGFzdF9uYW1lJyksXG4gICAgICogICAgICAgZWIubGl0KDcpLmFzKCdhZ2UnKSxcbiAgICAgKiAgICAgXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImFnZVwiKVxuICAgICAqIHNlbGVjdCBcInBldFwiLlwibmFtZVwiLCAkMSBhcyBcImxhc3RfbmFtZVwiLCA3IGFzIFwiYWdlIGZyb20gXCJwZXRcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGV4cHJlc3Npb24oZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBgaW5zZXJ0IGludG8gXCJwZXJzb25cIiBkZWZhdWx0IHZhbHVlc2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5kZWZhdWx0VmFsdWVzKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgZGVmYXVsdCB2YWx1ZXNcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkZWZhdWx0VmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ21hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsYC0tIFRoaXMgaXMgYSBjb21tZW50YClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBgcGVyc29uYCAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpXG4gICAgICogdmFsdWVzICg/LCA/LCA/KSAtLSBUaGlzIGlzIGEgY29tbWVudFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgaWdub3JlIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTXlTUUwuXG4gICAgICpcbiAgICAgKiBUbyBhdm9pZCBhIGZvb3RndW4sIHdoZW4gaW52b2tlZCB3aXRoIHRoZSBTUUxpdGUgZGlhbGVjdCwgdGhpcyBtZXRob2Qgd2lsbFxuICAgICAqIGJlIGhhbmRsZWQgbGlrZSB7QGxpbmsgb3JJZ25vcmV9LiBTZWUgYWxzbywge0BsaW5rIG9yQWJvcnR9LCB7QGxpbmsgb3JGYWlsfSxcbiAgICAgKiB7QGxpbmsgb3JSZXBsYWNlfSwgYW5kIHtAbGluayBvclJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqIElmIHlvdSB1c2UgdGhlIGlnbm9yZSBtb2RpZmllciwgaWdub3JhYmxlIGVycm9ycyB0aGF0IG9jY3VyIHdoaWxlIGV4ZWN1dGluZyB0aGVcbiAgICAgKiBpbnNlcnQgc3RhdGVtZW50IGFyZSBpZ25vcmVkLiBGb3IgZXhhbXBsZSwgd2l0aG91dCBpZ25vcmUsIGEgcm93IHRoYXQgZHVwbGljYXRlc1xuICAgICAqIGFuIGV4aXN0aW5nIHVuaXF1ZSBpbmRleCBvciBwcmltYXJ5IGtleSB2YWx1ZSBpbiB0aGUgdGFibGUgY2F1c2VzIGEgZHVwbGljYXRlLWtleVxuICAgICAqIGVycm9yIGFuZCB0aGUgc3RhdGVtZW50IGlzIGFib3J0ZWQuIFdpdGggaWdub3JlLCB0aGUgcm93IGlzIGRpc2NhcmRlZCBhbmQgbm8gZXJyb3JcbiAgICAgKiBvY2N1cnMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5pZ25vcmUoKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGlnbm9yZSBpbnRvIGBwZXJzb25gIChgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgZ2VuZGVyYCkgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFNRTGl0ZSk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgb3IgaWdub3JlIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpZ25vcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9yQWN0aW9uOiBPckFjdGlvbk5vZGUuY3JlYXRlKCdpZ25vcmUnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgb3IgaWdub3JlIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLlxuICAgICAqXG4gICAgICogVG8gYXZvaWQgYSBmb290Z3VuLCB3aGVuIGludm9rZWQgd2l0aCB0aGUgTXlTUUwgZGlhbGVjdCwgdGhpcyBtZXRob2Qgd2lsbFxuICAgICAqIGJlIGhhbmRsZWQgbGlrZSB7QGxpbmsgaWdub3JlfS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvLCB7QGxpbmsgb3JBYm9ydH0sIHtAbGluayBvckZhaWx9LCB7QGxpbmsgb3JSZXBsYWNlfSwgYW5kIHtAbGluayBvclJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLm9ySWdub3JlKClcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ2ZlbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFNRTGl0ZSk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgb3IgaWdub3JlIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaWdub3JlIGludG8gYHBlcnNvbmAgKGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBnZW5kZXJgKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb3JJZ25vcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9yQWN0aW9uOiBPckFjdGlvbk5vZGUuY3JlYXRlKCdpZ25vcmUnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgb3IgYWJvcnQgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbywge0BsaW5rIG9ySWdub3JlfSwge0BsaW5rIG9yRmFpbH0sIHtAbGluayBvclJlcGxhY2V9LCBhbmQge0BsaW5rIG9yUm9sbGJhY2t9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAub3JBYm9ydCgpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIGFib3J0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvckFib3J0KCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvckFjdGlvbjogT3JBY3Rpb25Ob2RlLmNyZWF0ZSgnYWJvcnQnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgb3IgZmFpbCBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvLCB7QGxpbmsgb3JJZ25vcmV9LCB7QGxpbmsgb3JBYm9ydH0sIHtAbGluayBvclJlcGxhY2V9LCBhbmQge0BsaW5rIG9yUm9sbGJhY2t9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAub3JGYWlsKClcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ2ZlbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFNRTGl0ZSk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgb3IgZmFpbCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb3JGYWlsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvckFjdGlvbjogT3JBY3Rpb25Ob2RlLmNyZWF0ZSgnZmFpbCcpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBvciByZXBsYWNlIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLlxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIHVzZSB7QGxpbmsgS3lzZWx5LnJlcGxhY2VJbnRvfSB0byBhY2hpZXZlIHRoZSBzYW1lIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvLCB7QGxpbmsgb3JJZ25vcmV9LCB7QGxpbmsgb3JBYm9ydH0sIHtAbGluayBvckZhaWx9LCBhbmQge0BsaW5rIG9yUm9sbGJhY2t9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAub3JSZXBsYWNlKClcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ2ZlbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFNRTGl0ZSk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgb3IgcmVwbGFjZSBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb3JSZXBsYWNlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvckFjdGlvbjogT3JBY3Rpb25Ob2RlLmNyZWF0ZSgncmVwbGFjZScpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBvciByb2xsYmFjayBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvLCB7QGxpbmsgb3JJZ25vcmV9LCB7QGxpbmsgb3JBYm9ydH0sIHtAbGluayBvckZhaWx9LCBhbmQge0BsaW5rIG9yUmVwbGFjZX0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5vclJvbGxiYWNrKClcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ2ZlbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFNRTGl0ZSk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgb3Igcm9sbGJhY2sgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9yUm9sbGJhY2soKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9yQWN0aW9uOiBPckFjdGlvbk5vZGUuY3JlYXRlKCdyb2xsYmFjaycpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCB0b3AgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBgdG9wYCBjbGF1c2UgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE1TIFNRTCBTZXJ2ZXIuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIEluc2VydCB0aGUgZmlyc3QgNSByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1KVxuICAgICAqICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJywgJ2dlbmRlciddKVxuICAgICAqICAgLmV4cHJlc3Npb24oXG4gICAgICogICAgIChlYikgPT4gZWIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0KFsnbmFtZScsIHNxbC5saXQoJ290aGVyJykuYXMoJ2dlbmRlcicpXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCB0b3AoNSkgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJnZW5kZXJcIikgc2VsZWN0IFwibmFtZVwiLCAnb3RoZXInIGFzIFwiZ2VuZGVyXCIgZnJvbSBcInBldFwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbnNlcnQgdGhlIGZpcnN0IDUwIHBlcmNlbnQgb2Ygcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC50b3AoNTAsICdwZXJjZW50JylcbiAgICAgKiAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdnZW5kZXInXSlcbiAgICAgKiAgIC5leHByZXNzaW9uKFxuICAgICAqICAgICAoZWIpID0+IGViLnNlbGVjdEZyb20oJ3BldCcpLnNlbGVjdChbJ25hbWUnLCBzcWwubGl0KCdvdGhlcicpLmFzKCdnZW5kZXInKV0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgdG9wKDUwKSBwZXJjZW50IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHNlbGVjdCBcIm5hbWVcIiwgJ290aGVyJyBhcyBcImdlbmRlclwiIGZyb20gXCJwZXRcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhUb3AodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYG9uIGNvbmZsaWN0YCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogYG9uIGNvbmZsaWN0YCBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBhbmQgU1FMaXRlLiBPbiBNeVNRTFxuICAgICAqIHlvdSBjYW4gdXNlIHtAbGluayBpZ25vcmV9IGFuZCB7QGxpbmsgb25EdXBsaWNhdGVLZXlVcGRhdGV9IHRvIGFjaGlldmUgc2ltaWxhciByZXN1bHRzLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgb3duZXJfaWQ6IDMsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuY29sdW1uKCduYW1lJylcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHsgc3BlY2llczogJ2hhbXN0ZXInIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm5hbWVcIiwgXCJzcGVjaWVzXCIsIFwib3duZXJfaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogb24gY29uZmxpY3QgKFwibmFtZVwiKVxuICAgICAqIGRvIHVwZGF0ZSBzZXQgXCJzcGVjaWVzXCIgPSAkNFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiBwcm92aWRlIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJhaW50IGluc3RlYWQgb2YgYSBjb2x1bW4gbmFtZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICBvd25lcl9pZDogMyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb25zdHJhaW50KCdwZXRfbmFtZV9rZXknKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoeyBzcGVjaWVzOiAnaGFtc3RlcicgfSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGV0XCIgKFwibmFtZVwiLCBcInNwZWNpZXNcIiwgXCJvd25lcl9pZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyLCAkMylcbiAgICAgKiBvbiBjb25mbGljdCBvbiBjb25zdHJhaW50IFwicGV0X25hbWVfa2V5XCJcbiAgICAgKiBkbyB1cGRhdGUgc2V0IFwic3BlY2llc1wiID0gJDRcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGFuIGV4cHJlc3Npb24gYXMgdGhlIGNvbmZsaWN0IHRhcmdldCBpbiBjYXNlXG4gICAgICogdGhlIHVuaXF1ZSBpbmRleCBpcyBhbiBleHByZXNzaW9uIGluZGV4OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgIG93bmVyX2lkOiAzLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmV4cHJlc3Npb24oc3FsPHN0cmluZz5gbG93ZXIobmFtZSlgKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoeyBzcGVjaWVzOiAnaGFtc3RlcicgfSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGV0XCIgKFwibmFtZVwiLCBcInNwZWNpZXNcIiwgXCJvd25lcl9pZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyLCAkMylcbiAgICAgKiBvbiBjb25mbGljdCAobG93ZXIobmFtZSkpXG4gICAgICogZG8gdXBkYXRlIHNldCBcInNwZWNpZXNcIiA9ICQ0XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFkZCBhIGZpbHRlciBmb3IgdGhlIHVwZGF0ZSBzdGF0ZW1lbnQgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgIG93bmVyX2lkOiAzLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignbmFtZScpXG4gICAgICogICAgIC5kb1VwZGF0ZVNldCh7IHNwZWNpZXM6ICdoYW1zdGVyJyB9KVxuICAgICAqICAgICAud2hlcmUoJ2V4Y2x1ZGVkLm5hbWUnLCAnIT0nLCAnQ2F0dG8nKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJuYW1lXCIsIFwic3BlY2llc1wiLCBcIm93bmVyX2lkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIG9uIGNvbmZsaWN0IChcIm5hbWVcIilcbiAgICAgKiBkbyB1cGRhdGUgc2V0IFwic3BlY2llc1wiID0gJDRcbiAgICAgKiB3aGVyZSBcImV4Y2x1ZGVkXCIuXCJuYW1lXCIgIT0gJDVcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gY3JlYXRlIGFuIGBvbiBjb25mbGljdCBkbyBub3RoaW5nYCBjbGF1c2VzIGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICBvd25lcl9pZDogMyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ25hbWUnKVxuICAgICAqICAgICAuZG9Ob3RoaW5nKClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGV0XCIgKFwibmFtZVwiLCBcInNwZWNpZXNcIiwgXCJvd25lcl9pZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyLCAkMylcbiAgICAgKiBvbiBjb25mbGljdCAoXCJuYW1lXCIpIGRvIG5vdGhpbmdcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gcmVmZXIgdG8gdGhlIGNvbHVtbnMgb2YgdGhlIHZpcnR1YWwgYGV4Y2x1ZGVkYCB0YWJsZVxuICAgICAqIGluIGEgdHlwZS1zYWZlIHdheSB1c2luZyBhIGNhbGxiYWNrIGFuZCB0aGUgYHJlZmAgbWV0aG9kIG9mXG4gICAgICogYEV4cHJlc3Npb25CdWlsZGVyYDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBpZDogMSxcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25Db25mbGljdChvYyA9PiBvY1xuICAgICAqICAgICAuY29sdW1uKCdpZCcpXG4gICAgICogICAgIC5kb1VwZGF0ZVNldCh7XG4gICAgICogICAgICAgZmlyc3RfbmFtZTogKGViKSA9PiBlYi5yZWYoJ2V4Y2x1ZGVkLmZpcnN0X25hbWUnKSxcbiAgICAgKiAgICAgICBsYXN0X25hbWU6IChlYikgPT4gZWIucmVmKCdleGNsdWRlZC5sYXN0X25hbWUnKVxuICAgICAqICAgICB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJpZFwiLCBcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMsICQ0KVxuICAgICAqIG9uIGNvbmZsaWN0IChcImlkXCIpXG4gICAgICogZG8gdXBkYXRlIHNldFxuICAgICAqICBcImZpcnN0X25hbWVcIiA9IFwiZXhjbHVkZWRcIi5cImZpcnN0X25hbWVcIixcbiAgICAgKiAgXCJsYXN0X25hbWVcIiA9IFwiZXhjbHVkZWRcIi5cImxhc3RfbmFtZVwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb25Db25mbGljdChjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvbkNvbmZsaWN0OiBjYWxsYmFjayhuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY3JlYXRlKCksXG4gICAgICAgICAgICAgICAgfSkpLnRvT3BlcmF0aW9uTm9kZSgpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBvbiBkdXBsaWNhdGUga2V5IHVwZGF0ZWAgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogSWYgeW91IHNwZWNpZnkgYG9uIGR1cGxpY2F0ZSBrZXkgdXBkYXRlYCwgYW5kIGEgcm93IGlzIGluc2VydGVkIHRoYXQgd291bGQgY2F1c2VcbiAgICAgKiBhIGR1cGxpY2F0ZSB2YWx1ZSBpbiBhIHVuaXF1ZSBpbmRleCBvciBwcmltYXJ5IGtleSwgYW4gdXBkYXRlIG9mIHRoZSBvbGQgcm93IG9jY3Vycy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBpbXBsZW1lbnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTXlTUUwuIE9uIG1vc3QgZGlhbGVjdHMgeW91IHNob3VsZFxuICAgICAqIHVzZSB7QGxpbmsgb25Db25mbGljdH0gaW5zdGVhZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgaWQ6IDEsXG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uRHVwbGljYXRlS2V5VXBkYXRlKHsgdXBkYXRlZF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gYHBlcnNvbmAgKGBpZGAsIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBnZW5kZXJgKVxuICAgICAqIHZhbHVlcyAoPywgPywgPywgPylcbiAgICAgKiBvbiBkdXBsaWNhdGUga2V5IHVwZGF0ZSBgdXBkYXRlZF9hdGAgPSA/XG4gICAgICogYGBgXG4gICAgICovXG4gICAgb25EdXBsaWNhdGVLZXlVcGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9uRHVwbGljYXRlS2V5OiBPbkR1cGxpY2F0ZUtleU5vZGUuY3JlYXRlKHBhcnNlVXBkYXRlT2JqZWN0RXhwcmVzc2lvbih1cGRhdGUpKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nQWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXRBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBgcmV0dXJuaW5nYCBjbGF1c2VzIGZyb20gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHsgZmlyc3RfbmFtZTogJ0phbWVzJywgbGFzdF9uYW1lOiAnU21pdGgnLCBnZW5kZXI6ICdtYWxlJyB9KVxuICAgICAqICAgLnJldHVybmluZyhbJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgIC5jbGVhclJldHVybmluZygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY2xlYXJSZXR1cm5pbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0UmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gY29uZGl0aW9uYWxseSBjYWxsIGEgbWV0aG9kIG9uIGB0aGlzYCwgc2VlXG4gICAgICogdGhlIHtAbGluayAkaWZ9IG1ldGhvZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVGhlIG5leHQgZXhhbXBsZSB1c2VzIGEgaGVscGVyIGZ1bmN0aW9uIGBsb2dgIHRvIGxvZyBhIHF1ZXJ5OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IENvbXBpbGFibGUgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBsb2c8VCBleHRlbmRzIENvbXBpbGFibGU+KHFiOiBUKTogVCB7XG4gICAgICogICBjb25zb2xlLmxvZyhxYi5jb21waWxlKCkpXG4gICAgICogICByZXR1cm4gcWJcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7IGZpcnN0X25hbWU6ICdKb2huJywgbGFzdF9uYW1lOiAnRG9lJywgZ2VuZGVyOiAnbWFsZScgfSlcbiAgICAgKiAgIC4kY2FsbChsb2cpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBgZnVuYyh0aGlzKWAgaWYgYGNvbmRpdGlvbmAgaXMgdHJ1ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGVzcGVjaWFsbHkgaGFuZHkgd2l0aCBvcHRpb25hbCBzZWxlY3RzLiBBbnkgYHJldHVybmluZ2Agb3IgYHJldHVybmluZ0FsbGBcbiAgICAgKiBtZXRob2QgY2FsbHMgYWRkIGNvbHVtbnMgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZSBvdXRwdXQgdHlwZSB3aGVuIGNhbGxlZCBpbnNpZGVcbiAgICAgKiB0aGUgYGZ1bmNgIGNhbGxiYWNrLiBUaGlzIGlzIGJlY2F1c2Ugd2UgY2FuJ3Qga25vdyBpZiB0aG9zZSBzZWxlY3Rpb25zIHdlcmUgYWN0dWFsbHlcbiAgICAgKiBtYWRlIGJlZm9yZSBydW5uaW5nIHRoZSBjb2RlLlxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIGNhbGwgYW55IG90aGVyIG1ldGhvZHMgaW5zaWRlIHRoZSBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IE5ld1BlcnNvbiB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBpbnNlcnRQZXJzb24odmFsdWVzOiBOZXdQZXJzb24sIHJldHVybkxhc3ROYW1lOiBib29sZWFuKSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXModmFsdWVzKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgICAuJGlmKHJldHVybkxhc3ROYW1lLCAocWIpID0+IHFiLnJldHVybmluZygnbGFzdF9uYW1lJykpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW55IHNlbGVjdGlvbnMgYWRkZWQgaW5zaWRlIHRoZSBgaWZgIGNhbGxiYWNrIHdpbGwgYmUgYWRkZWQgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZVxuICAgICAqIG91dHB1dCB0eXBlIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgdGhlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseSBtYWRlIGJlZm9yZSBydW5uaW5nXG4gICAgICogdGhlIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYGluc2VydFBlcnNvbmAgZnVuY3Rpb24gaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFByb21pc2U8e1xuICAgICAqICAgaWQ6IG51bWJlclxuICAgICAqICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gICAgICogICBsYXN0X25hbWU/OiBzdHJpbmdcbiAgICAgKiB9PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRpZihjb25kaXRpb24sIGZ1bmMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgSW5zZXJ0UXVlcnlCdWlsZGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmFycm93cyAocGFydHMgb2YpIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdHJpZXMgdG8gYmUgYXMgdHlwZS1zYWZlIGFzIHBvc3NpYmxlLCBidXQgaW4gc29tZSBjYXNlcyB3ZSBoYXZlIHRvIG1ha2VcbiAgICAgKiBjb21wcm9taXNlcyBmb3IgYmV0dGVyIG1haW50YWluYWJpbGl0eSBhbmQgY29tcGlsYXRpb24gcGVyZm9ybWFuY2UuIEF0IHByZXNlbnQsXG4gICAgICogS3lzZWx5IGRvZXNuJ3QgbmFycm93IHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkgYmFzZWQgb24ge0BsaW5rIHZhbHVlc30gaW5wdXRcbiAgICAgKiB3aGVuIHVzaW5nIHtAbGluayByZXR1cm5pbmd9IG9yIHtAbGluayByZXR1cm5pbmdBbGx9LlxuICAgICAqXG4gICAgICogVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyB2ZXJ5IHVzZWZ1bCBmb3IgdGhlc2Ugc2l0dWF0aW9ucywgYXMgaXQgcmVtb3ZlcyB1bm5jZXNzYXJ5XG4gICAgICogcnVudGltZSBhc3NlcnRpb24vZ3VhcmQgY29kZS4gSXRzIGlucHV0IHR5cGUgaXMgbGltaXRlZCB0byB0aGUgb3V0cHV0IHR5cGVcbiAgICAgKiBvZiB0aGUgcXVlcnksIHNvIHlvdSBjYW4ndCBhZGQgYSBjb2x1bW4gdGhhdCBkb2Vzbid0IGV4aXN0LCBvciBjaGFuZ2UgYSBjb2x1bW4nc1xuICAgICAqIHR5cGUgdG8gc29tZXRoaW5nIHRoYXQgZG9lc24ndCBleGlzdCBpbiBpdHMgdW5pb24gdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVHVybiB0aGlzIGNvZGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdtYWxlJyxcbiAgICAgKiAgICAgbnVsbGFibGVfY29sdW1uOiAnaGVsbCB5ZWFoISdcbiAgICAgKiAgIH0pXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBpZiAoaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uKSkge1xuICAgICAqICAgZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbjogUGVyc29uKTogcGVyc29uIGlzIFBlcnNvbiAmIHsgbnVsbGFibGVfY29sdW1uOiBzdHJpbmcgfSB7XG4gICAgICogICByZXR1cm4gcGVyc29uLm51bGxhYmxlX2NvbHVtbiAhPSBudWxsXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW50byB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IE5vdE51bGwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnbWFsZScsXG4gICAgICogICAgIG51bGxhYmxlX2NvbHVtbjogJ2hlbGwgeWVhaCEnXG4gICAgICogICB9KVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuJG5hcnJvd1R5cGU8eyBudWxsYWJsZV9jb2x1bW46IE5vdE51bGwgfT4oKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkbmFycm93VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NlcnRzIHRoYXQgcXVlcnkncyBvdXRwdXQgcm93IHR5cGUgZXF1YWxzIHRoZSBnaXZlbiB0eXBlIGBUYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNpbXBsaWZ5IGV4Y2Vzc2l2ZWx5IGNvbXBsZXggdHlwZXMgdG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5XG4gICAgICogYW5kIG11Y2ggZmFzdGVyLlxuICAgICAqXG4gICAgICogS3lzZWx5IHVzZXMgY29tcGxleCB0eXBlIG1hZ2ljIHRvIGFjaGlldmUgaXRzIHR5cGUgc2FmZXR5LiBUaGlzIGNvbXBsZXhpdHkgaXMgc29tZXRpbWVzIHRvbyBtdWNoXG4gICAgICogZm9yIFR5cGVTY3JpcHQgYW5kIHlvdSBnZXQgZXJyb3JzIGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGVycm9yIFRTMjU4OTogVHlwZSBpbnN0YW50aWF0aW9uIGlzIGV4Y2Vzc2l2ZWx5IGRlZXAgYW5kIHBvc3NpYmx5IGluZmluaXRlLlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gdGhlc2UgY2FzZSB5b3UgY2FuIG9mdGVuIHVzZSB0aGlzIG1ldGhvZCB0byBoZWxwIFR5cGVTY3JpcHQgYSBsaXR0bGUgYml0LiBXaGVuIHlvdSB1c2UgdGhpc1xuICAgICAqIG1ldGhvZCB0byBhc3NlcnQgdGhlIG91dHB1dCB0eXBlIG9mIGEgcXVlcnksIEt5c2VseSBjYW4gZHJvcCB0aGUgY29tcGxleCBvdXRwdXQgdHlwZSB0aGF0XG4gICAgICogY29uc2lzdHMgb2YgbXVsdGlwbGUgbmVzdGVkIGhlbHBlciB0eXBlcyBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBzaW1wbGUgYXNzZXJ0ZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIFVzaW5nIHRoaXMgbWV0aG9kIGRvZXNuJ3QgcmVkdWNlIHR5cGUgc2FmZXR5IGF0IGFsbC4gWW91IGhhdmUgdG8gcGFzcyBpbiBhIHR5cGUgdGhhdCBpc1xuICAgICAqIHN0cnVjdHVyYWxseSBlcXVhbCB0byB0aGUgY3VycmVudCB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgTmV3UGVyc29uLCBOZXdQZXQsIFNwZWNpZXMgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0UGVyc29uQW5kUGV0KHBlcnNvbjogTmV3UGVyc29uLCBwZXQ6IE9taXQ8TmV3UGV0LCAnb3duZXJfaWQnPikge1xuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC53aXRoKCduZXdfcGVyc29uJywgKHFiKSA9PiBxYlxuICAgICAqICAgICAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAgIC52YWx1ZXMocGVyc29uKVxuICAgICAqICAgICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgICAgICAuJGFzc2VydFR5cGU8eyBpZDogbnVtYmVyIH0+KClcbiAgICAgKiAgICAgKVxuICAgICAqICAgICAud2l0aCgnbmV3X3BldCcsIChxYikgPT4gcWJcbiAgICAgKiAgICAgICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgICAgICAudmFsdWVzKChlYikgPT4gKHtcbiAgICAgKiAgICAgICAgIG93bmVyX2lkOiBlYi5zZWxlY3RGcm9tKCduZXdfcGVyc29uJykuc2VsZWN0KCdpZCcpLFxuICAgICAqICAgICAgICAgLi4ucGV0XG4gICAgICogICAgICAgfSkpXG4gICAgICogICAgICAgLnJldHVybmluZyhbJ25hbWUgYXMgcGV0X25hbWUnLCAnc3BlY2llcyddKVxuICAgICAqICAgICAgIC4kYXNzZXJ0VHlwZTx7IHBldF9uYW1lOiBzdHJpbmcsIHNwZWNpZXM6IFNwZWNpZXMgfT4oKVxuICAgICAqICAgICApXG4gICAgICogICAgIC5zZWxlY3RGcm9tKFsnbmV3X3BlcnNvbicsICduZXdfcGV0J10pXG4gICAgICogICAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkYXNzZXJ0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIEluc2VydFF1ZXJ5QnVpbGRlciBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaW5zdGFsbGVkLlxuICAgICAqL1xuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiByb3dzLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBleGVjdXRlVGFrZUZpcnN0fSBhbmQge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93fSBtZXRob2RzLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICBjb25zdCB7IGFkYXB0ZXIgfSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGNvbXBpbGVkUXVlcnkucXVlcnk7XG4gICAgICAgIGlmICgocXVlcnkucmV0dXJuaW5nICYmIGFkYXB0ZXIuc3VwcG9ydHNSZXR1cm5pbmcpIHx8XG4gICAgICAgICAgICAocXVlcnkub3V0cHV0ICYmIGFkYXB0ZXIuc3VwcG9ydHNPdXRwdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBJbnNlcnRSZXN1bHQocmVzdWx0Lmluc2VydElkLCByZXN1bHQubnVtQWZmZWN0ZWRSb3dzID8/IEJpZ0ludCgwKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHVuZGVmaW5lZCBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdCgpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdGhyb3dzIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vUmVzdWx0RXJyb3J9IGlzIHRocm93biwgYnV0IHlvdSBjYW5cbiAgICAgKiBwcm92aWRlIGEgY3VzdG9tIGVycm9yIGNsYXNzLCBvciBjYWxsYmFjayBhcyB0aGUgb25seSBhcmd1bWVudCB0byB0aHJvdyBhIGRpZmZlcmVudFxuICAgICAqIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjaHVua1NpemUgPSAxMDApIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLiNwcm9wcy5leGVjdXRvci5zdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHN0cmVhbSkge1xuICAgICAgICAgICAgeWllbGQqIGl0ZW0ucm93cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBleHBsYWluKGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEV4cGxhaW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBmb3JtYXQsIG9wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1aWxkZXIuZXhlY3V0ZSgpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGVsZXRlLXJlc3VsdC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBEZWxldGVSZXN1bHQge1xuICAgIG51bURlbGV0ZWRSb3dzO1xuICAgIGNvbnN0cnVjdG9yKG51bURlbGV0ZWRSb3dzKSB7XG4gICAgICAgIHRoaXMubnVtRGVsZXRlZFJvd3MgPSBudW1EZWxldGVkUm93cztcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2xpbWl0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTGltaXROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdMaW1pdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0xpbWl0Tm9kZScsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWxldGUtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IHBhcnNlSm9pbiwgfSBmcm9tICcuLi9wYXJzZXIvam9pbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgcGFyc2VTZWxlY3RBbGwsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgTm9SZXN1bHRFcnJvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBEZWxldGVSZXN1bHQgfSBmcm9tICcuL2RlbGV0ZS1yZXN1bHQuanMnO1xuaW1wb3J0IHsgRGVsZXRlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZGVsZXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgTGltaXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbGltaXQtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZU9yZGVyQnksIH0gZnJvbSAnLi4vcGFyc2VyL29yZGVyLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVG9wIH0gZnJvbSAnLi4vcGFyc2VyL3RvcC1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIERlbGV0ZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aGVyZVJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGEgYGRlbGV0ZSBmcm9tYCBxdWVyeSBpbnRvIGEgYGRlbGV0ZSB0b3AgZnJvbWAgcXVlcnkuXG4gICAgICpcbiAgICAgKiBgdG9wYCBjbGF1c2UgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE1TIFNRTCBTZXJ2ZXIuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIERlbGV0ZSB0aGUgZmlyc3QgNSByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUpXG4gICAgICogICAud2hlcmUoJ2FnZScsICc+JywgMTgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIHRvcCg1KSBmcm9tIFwicGVyc29uXCIgd2hlcmUgXCJhZ2VcIiA+IEAxXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBEZWxldGUgdGhlIGZpcnN0IDUwJSBvZiByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUwLCAncGVyY2VudCcpXG4gICAgICogICAud2hlcmUoJ2FnZScsICc+JywgMTgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIHRvcCg1MCkgcGVyY2VudCBmcm9tIFwicGVyc29uXCIgd2hlcmUgXCJhZ2VcIiA+IEAxXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXNpbmcodGFibGVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBEZWxldGVRdWVyeU5vZGUuY2xvbmVXaXRoVXNpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCh0YWJsZXMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlubmVySm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdJbm5lckpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgbGVmdEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignTGVmdEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgcmlnaHRKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ1JpZ2h0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBmdWxsSm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdGdWxsSm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICAjam9pbihqb2luVHlwZSwgYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEpvaW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUpvaW4oam9pblR5cGUsIGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZyhzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXQoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGByZXR1cm5pbmdgIGNsYXVzZXMgZnJvbSB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuZGVsZXRlRnJvbSgncGV0JylcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLndoZXJlKCduYW1lJywgJz0nLCAnTWF4JylcbiAgICAgKiAgIC5jbGVhclJldHVybmluZygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIFwicGV0XCIgd2hlcmUgXCJuYW1lXCIgPSBcIk1heFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY2xlYXJSZXR1cm5pbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0UmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGBsaW1pdGAgY2xhdXNlIGZyb20gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmRlbGV0ZUZyb20oJ3BldCcpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC53aGVyZSgnbmFtZScsICc9JywgJ01heCcpXG4gICAgICogICAubGltaXQoNSlcbiAgICAgKiAgIC5jbGVhckxpbWl0KClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIGZyb20gXCJwZXRcIiB3aGVyZSBcIm5hbWVcIiA9IFwiTWF4XCIgcmV0dXJuaW5nICpcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjbGVhckxpbWl0KCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogRGVsZXRlUXVlcnlOb2RlLmNsb25lV2l0aG91dExpbWl0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU9yZGVyQnkoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJPcmRlckJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaW1pdCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogQSBsaW1pdCBjbGF1c2UgaW4gYSBkZWxldGUgcXVlcnkgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0c1xuICAgICAqIGxpa2UgTXlTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIERlbGV0ZSA1IG9sZGVzdCBpdGVtcyBpbiBhIHRhYmxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oJ3BldCcpXG4gICAgICogICAub3JkZXJCeSgnY3JlYXRlZF9hdCcpXG4gICAgICogICAubGltaXQoNSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBgcGV0YCBvcmRlciBieSBgY3JlYXRlZF9hdGAgbGltaXQgP1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBEZWxldGVRdWVyeU5vZGUuY2xvbmVXaXRoTGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBMaW1pdE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKGxpbWl0KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKb2huJylcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsYC0tIFRoaXMgaXMgYSBjb21tZW50YClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBgcGVyc29uYFxuICAgICAqIHdoZXJlIGBmaXJzdF9uYW1lYCA9IFwiSm9oblwiIC0tIFRoaXMgaXMgYSBjb21tZW50XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gY29uZGl0aW9uYWxseSBjYWxsIGEgbWV0aG9kIG9uIGB0aGlzYCwgc2VlXG4gICAgICogdGhlIHtAbGluayAkaWZ9IG1ldGhvZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVGhlIG5leHQgZXhhbXBsZSB1c2VzIGEgaGVscGVyIGZ1bmN0aW9uIGBsb2dgIHRvIGxvZyBhIHF1ZXJ5OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IENvbXBpbGFibGUgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBsb2c8VCBleHRlbmRzIENvbXBpbGFibGU+KHFiOiBUKTogVCB7XG4gICAgICogICBjb25zb2xlLmxvZyhxYi5jb21waWxlKCkpXG4gICAgICogICByZXR1cm4gcWJcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLiRjYWxsKGxvZylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGBmdW5jKHRoaXMpYCBpZiBgY29uZGl0aW9uYCBpcyB0cnVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXNwZWNpYWxseSBoYW5keSB3aXRoIG9wdGlvbmFsIHNlbGVjdHMuIEFueSBgcmV0dXJuaW5nYCBvciBgcmV0dXJuaW5nQWxsYFxuICAgICAqIG1ldGhvZCBjYWxscyBhZGQgY29sdW1ucyBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlIG91dHB1dCB0eXBlIHdoZW4gY2FsbGVkIGluc2lkZVxuICAgICAqIHRoZSBgZnVuY2AgY2FsbGJhY2suIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRob3NlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseVxuICAgICAqIG1hZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVBlcnNvbihpZDogbnVtYmVyLCByZXR1cm5MYXN0TmFtZTogYm9vbGVhbikge1xuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAud2hlcmUoJ2lkJywgJz0nLCBpZClcbiAgICAgKiAgICAgLnJldHVybmluZyhbJ2lkJywgJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgICAgLiRpZihyZXR1cm5MYXN0TmFtZSwgKHFiKSA9PiBxYi5yZXR1cm5pbmcoJ2xhc3RfbmFtZScpKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFueSBzZWxlY3Rpb25zIGFkZGVkIGluc2lkZSB0aGUgYGlmYCBjYWxsYmFjayB3aWxsIGJlIGFkZGVkIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGVcbiAgICAgKiBvdXRwdXQgdHlwZSBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIHRoZSBzZWxlY3Rpb25zIHdlcmUgYWN0dWFsbHkgbWFkZSBiZWZvcmUgcnVubmluZ1xuICAgICAqIHRoZSBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGBkZWxldGVQZXJzb25gIGZ1bmN0aW9uIGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBQcm9taXNlPHtcbiAgICAgKiAgIGlkOiBudW1iZXJcbiAgICAgKiAgIGZpcnN0X25hbWU6IHN0cmluZ1xuICAgICAqICAgbGFzdF9uYW1lPzogc3RyaW5nXG4gICAgICogfT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkaWYoY29uZGl0aW9uLCBmdW5jKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYERlbGV0ZVF1ZXJ5QnVpbGRlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgKHBhcnRzIG9mKSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogS3lzZWx5IHRyaWVzIHRvIGJlIGFzIHR5cGUtc2FmZSBhcyBwb3NzaWJsZSwgYnV0IGluIHNvbWUgY2FzZXMgd2UgaGF2ZSB0byBtYWtlXG4gICAgICogY29tcHJvbWlzZXMgZm9yIGJldHRlciBtYWludGFpbmFiaWxpdHkgYW5kIGNvbXBpbGF0aW9uIHBlcmZvcm1hbmNlLiBBdCBwcmVzZW50LFxuICAgICAqIEt5c2VseSBkb2Vzbid0IG5hcnJvdyB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5IHdoZW4gdXNpbmcge0BsaW5rIHdoZXJlfSBhbmQge0BsaW5rIHJldHVybmluZ30gb3Ige0BsaW5rIHJldHVybmluZ0FsbH0uXG4gICAgICpcbiAgICAgKiBUaGlzIHV0aWxpdHkgbWV0aG9kIGlzIHZlcnkgdXNlZnVsIGZvciB0aGVzZSBzaXR1YXRpb25zLCBhcyBpdCByZW1vdmVzIHVubmNlc3NhcnlcbiAgICAgKiBydW50aW1lIGFzc2VydGlvbi9ndWFyZCBjb2RlLiBJdHMgaW5wdXQgdHlwZSBpcyBsaW1pdGVkIHRvIHRoZSBvdXRwdXQgdHlwZVxuICAgICAqIG9mIHRoZSBxdWVyeSwgc28geW91IGNhbid0IGFkZCBhIGNvbHVtbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIG9yIGNoYW5nZSBhIGNvbHVtbidzXG4gICAgICogdHlwZSB0byBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0IGluIGl0cyB1bmlvbiB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUdXJuIHRoaXMgY29kZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC53aGVyZSgnaWQnLCAnPScsIDMpXG4gICAgICogICAud2hlcmUoJ251bGxhYmxlX2NvbHVtbicsICdpcyBub3QnLCBudWxsKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogaWYgKGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbikpIHtcbiAgICAgKiAgIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc1dpdGhOb051bGxWYWx1ZShwZXJzb246IFBlcnNvbik6IHBlcnNvbiBpcyBQZXJzb24gJiB7IG51bGxhYmxlX2NvbHVtbjogc3RyaW5nIH0ge1xuICAgICAqICAgcmV0dXJuIHBlcnNvbi5udWxsYWJsZV9jb2x1bW4gIT0gbnVsbFxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEludG8gdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOb3ROdWxsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC53aGVyZSgnaWQnLCAnPScsIDMpXG4gICAgICogICAud2hlcmUoJ251bGxhYmxlX2NvbHVtbicsICdpcyBub3QnLCBudWxsKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuJG5hcnJvd1R5cGU8eyBudWxsYWJsZV9jb2x1bW46IE5vdE51bGwgfT4oKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkbmFycm93VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NlcnRzIHRoYXQgcXVlcnkncyBvdXRwdXQgcm93IHR5cGUgZXF1YWxzIHRoZSBnaXZlbiB0eXBlIGBUYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNpbXBsaWZ5IGV4Y2Vzc2l2ZWx5IGNvbXBsZXggdHlwZXMgdG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5XG4gICAgICogYW5kIG11Y2ggZmFzdGVyLlxuICAgICAqXG4gICAgICogS3lzZWx5IHVzZXMgY29tcGxleCB0eXBlIG1hZ2ljIHRvIGFjaGlldmUgaXRzIHR5cGUgc2FmZXR5LiBUaGlzIGNvbXBsZXhpdHkgaXMgc29tZXRpbWVzIHRvbyBtdWNoXG4gICAgICogZm9yIFR5cGVTY3JpcHQgYW5kIHlvdSBnZXQgZXJyb3JzIGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGVycm9yIFRTMjU4OTogVHlwZSBpbnN0YW50aWF0aW9uIGlzIGV4Y2Vzc2l2ZWx5IGRlZXAgYW5kIHBvc3NpYmx5IGluZmluaXRlLlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gdGhlc2UgY2FzZSB5b3UgY2FuIG9mdGVuIHVzZSB0aGlzIG1ldGhvZCB0byBoZWxwIFR5cGVTY3JpcHQgYSBsaXR0bGUgYml0LiBXaGVuIHlvdSB1c2UgdGhpc1xuICAgICAqIG1ldGhvZCB0byBhc3NlcnQgdGhlIG91dHB1dCB0eXBlIG9mIGEgcXVlcnksIEt5c2VseSBjYW4gZHJvcCB0aGUgY29tcGxleCBvdXRwdXQgdHlwZSB0aGF0XG4gICAgICogY29uc2lzdHMgb2YgbXVsdGlwbGUgbmVzdGVkIGhlbHBlciB0eXBlcyBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBzaW1wbGUgYXNzZXJ0ZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIFVzaW5nIHRoaXMgbWV0aG9kIGRvZXNuJ3QgcmVkdWNlIHR5cGUgc2FmZXR5IGF0IGFsbC4gWW91IGhhdmUgdG8gcGFzcyBpbiBhIHR5cGUgdGhhdCBpc1xuICAgICAqIHN0cnVjdHVyYWxseSBlcXVhbCB0byB0aGUgY3VycmVudCB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgU3BlY2llcyB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkZWxldGVQZXJzb25BbmRQZXRzKHBlcnNvbklkOiBudW1iZXIpIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAud2l0aCgnZGVsZXRlZF9wZXJzb24nLCAocWIpID0+IHFiXG4gICAgICogICAgICAgIC5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAgICAud2hlcmUoJ2lkJywgJz0nLCBwZXJzb25JZClcbiAgICAgKiAgICAgICAgLnJldHVybmluZygnZmlyc3RfbmFtZScpXG4gICAgICogICAgICAgIC4kYXNzZXJ0VHlwZTx7IGZpcnN0X25hbWU6IHN0cmluZyB9PigpXG4gICAgICogICAgIClcbiAgICAgKiAgICAgLndpdGgoJ2RlbGV0ZWRfcGV0cycsIChxYikgPT4gcWJcbiAgICAgKiAgICAgICAuZGVsZXRlRnJvbSgncGV0JylcbiAgICAgKiAgICAgICAud2hlcmUoJ293bmVyX2lkJywgJz0nLCBwZXJzb25JZClcbiAgICAgKiAgICAgICAucmV0dXJuaW5nKFsnbmFtZSBhcyBwZXRfbmFtZScsICdzcGVjaWVzJ10pXG4gICAgICogICAgICAgLiRhc3NlcnRUeXBlPHsgcGV0X25hbWU6IHN0cmluZywgc3BlY2llczogU3BlY2llcyB9PigpXG4gICAgICogICAgIClcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oWydkZWxldGVkX3BlcnNvbicsICdkZWxldGVkX3BldHMnXSlcbiAgICAgKiAgICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAgIC5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGFzc2VydFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBEZWxldGVRdWVyeUJ1aWxkZXIgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygcm93cy5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdH0gYW5kIHtAbGluayBleGVjdXRlVGFrZUZpcnN0T3JUaHJvd30gbWV0aG9kcy5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgeyBhZGFwdGVyIH0gPSB0aGlzLiNwcm9wcy5leGVjdXRvcjtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBjb21waWxlZFF1ZXJ5LnF1ZXJ5O1xuICAgICAgICBpZiAoKHF1ZXJ5LnJldHVybmluZyAmJiBhZGFwdGVyLnN1cHBvcnRzUmV0dXJuaW5nKSB8fFxuICAgICAgICAgICAgKHF1ZXJ5Lm91dHB1dCAmJiBhZGFwdGVyLnN1cHBvcnRzT3V0cHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbmV3IERlbGV0ZVJlc3VsdChyZXN1bHQubnVtQWZmZWN0ZWRSb3dzID8/IEJpZ0ludCgwKSldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHRocm93cyBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0IGFuIGluc3RhbmNlIG9mIHtAbGluayBOb1Jlc3VsdEVycm9yfSBpcyB0aHJvd24sIGJ1dCB5b3UgY2FuXG4gICAgICogcHJvdmlkZSBhIGN1c3RvbSBlcnJvciBjbGFzcywgb3IgY2FsbGJhY2sgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhyb3cgYSBkaWZmZXJlbnRcbiAgICAgKiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW0oY2h1bmtTaXplID0gMTAwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy4jcHJvcHMuZXhlY3V0b3Iuc3RyZWFtKGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSk7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBzdHJlYW0pIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtLnJvd3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwbGFpbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFeHBsYWluKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgZm9ybWF0LCBvcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmV4ZWN1dGUoKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VwZGF0ZS1yZXN1bHQuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgVXBkYXRlUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgdGhlIHVwZGF0ZSBxdWVyeSB1cGRhdGVkIChldmVuIGlmIG5vdCBjaGFuZ2VkKS5cbiAgICAgKi9cbiAgICBudW1VcGRhdGVkUm93cztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgdGhlIHVwZGF0ZSBxdWVyeSBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogVGhpcyBpcyAqKm9wdGlvbmFsKiogYW5kIG9ubHkgc3VwcG9ydGVkIGluIGRpYWxlY3RzIHN1Y2ggYXMgTXlTUUwuXG4gICAgICogWW91IHdvdWxkIHByb2JhYmx5IHVzZSB7QGxpbmsgbnVtVXBkYXRlZFJvd3N9IGluIG1vc3QgY2FzZXMuXG4gICAgICovXG4gICAgbnVtQ2hhbmdlZFJvd3M7XG4gICAgY29uc3RydWN0b3IobnVtVXBkYXRlZFJvd3MsIG51bUNoYW5nZWRSb3dzKSB7XG4gICAgICAgIHRoaXMubnVtVXBkYXRlZFJvd3MgPSBudW1VcGRhdGVkUm93cztcbiAgICAgICAgdGhpcy5udW1DaGFuZ2VkUm93cyA9IG51bUNoYW5nZWRSb3dzO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXBkYXRlLXF1ZXJ5LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBwYXJzZUpvaW4sIH0gZnJvbSAnLi4vcGFyc2VyL2pvaW4tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBcmcsIHBhcnNlU2VsZWN0QWxsLCB9IGZyb20gJy4uL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdXBkYXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VVcGRhdGUsIH0gZnJvbSAnLi4vcGFyc2VyL3VwZGF0ZS1zZXQtcGFyc2VyLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFVwZGF0ZVJlc3VsdCB9IGZyb20gJy4vdXBkYXRlLXJlc3VsdC5qcyc7XG5pbXBvcnQgeyBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgTm9SZXN1bHRFcnJvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IExpbWl0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2xpbWl0LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUb3AgfSBmcm9tICcuLi9wYXJzZXIvdG9wLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZU9yZGVyQnksIH0gZnJvbSAnLi4vcGFyc2VyL29yZGVyLWJ5LXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgVXBkYXRlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB3aGVyZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoV2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyV2hlcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0V2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYHVwZGF0ZWAgcXVlcnkgaW50byBhIGB1cGRhdGUgdG9wYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIGB0b3BgIGNsYXVzZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBmaXJzdCByb3c6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCgxKVxuICAgICAqICAgLnNldCh7IGZpcnN0X25hbWU6ICdGb28nIH0pXG4gICAgICogICAud2hlcmUoJ2FnZScsICc+JywgMTgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogdXBkYXRlIHRvcCgxKSBcInBlcnNvblwiIHNldCBcImZpcnN0X25hbWVcIiA9IEAxIHdoZXJlIFwiYWdlXCIgPiBAMlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSA1MCUgZmlyc3Qgcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUwLCAncGVyY2VudCcpXG4gICAgICogICAuc2V0KHsgZmlyc3RfbmFtZTogJ0ZvbycgfSlcbiAgICAgKiAgIC53aGVyZSgnYWdlJywgJz4nLCAxOClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgdG9wKDUwKSBwZXJjZW50IFwicGVyc29uXCIgc2V0IFwiZmlyc3RfbmFtZVwiID0gQDEgd2hlcmUgXCJhZ2VcIiA+IEAyXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnJvbShmcm9tKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBVcGRhdGVRdWVyeU5vZGUuY2xvbmVXaXRoRnJvbUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QoZnJvbSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5uZXJKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0lubmVySm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBsZWZ0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMZWZ0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICByaWdodEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignUmlnaHRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGZ1bGxKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0Z1bGxKb2luJywgYXJncyk7XG4gICAgfVxuICAgICNqb2luKGpvaW5UeXBlLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoSm9pbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlSm9pbihqb2luVHlwZSwgYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VPcmRlckJ5KGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT3JkZXJCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGltaXQgY2xhdXNlIHRvIHRoZSB1cGRhdGUgcXVlcnkgZm9yIHN1cHBvcnRlZCBkYXRhYmFzZXMsIHN1Y2ggYXMgTXlTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFVwZGF0ZSB0aGUgZmlyc3QgMiByb3dzIGluIHRoZSAncGVyc29uJyB0YWJsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQoeyBmaXJzdF9uYW1lOiAnRm9vJyB9KVxuICAgICAqICAgLmxpbWl0KDIpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogdXBkYXRlIGBwZXJzb25gIHNldCBgZmlyc3RfbmFtZWAgPSA/IGxpbWl0ID9cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBsaW1pdChsaW1pdCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogVXBkYXRlUXVlcnlOb2RlLmNsb25lV2l0aExpbWl0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgTGltaXROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihsaW1pdCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBVcGRhdGVRdWVyeU5vZGUuY2xvbmVXaXRoVXBkYXRlcyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVXBkYXRlKC4uLmFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZyhzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXQoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgYWdlOiAzOSB9KVxuICAgICAqICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSm9obicpXG4gICAgICogICAubW9kaWZ5RW5kKHNxbC5yYXcoJy0tIFRoaXMgaXMgYSBjb21tZW50JykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogdXBkYXRlIGBwZXJzb25gXG4gICAgICogc2V0IGBhZ2VgID0gMzlcbiAgICAgKiB3aGVyZSBgZmlyc3RfbmFtZWAgPSBcIkpvaG5cIiAtLSBUaGlzIGlzIGEgY29tbWVudFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBgcmV0dXJuaW5nYCBjbGF1c2VzIGZyb20gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuc2V0KHsgYWdlOiAzOSB9KVxuICAgICAqICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSm9obicpXG4gICAgICogICAuY2xlYXJSZXR1cm5pbmcoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgXCJwZXJzb25cIiBzZXQgXCJhZ2VcIiA9IDM5IHdoZXJlIFwiZmlyc3RfbmFtZVwiID0gXCJKb2huXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjbGVhclJldHVybmluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBjb25kaXRpb25hbGx5IGNhbGwgYSBtZXRob2Qgb24gYHRoaXNgLCBzZWVcbiAgICAgKiB0aGUge0BsaW5rICRpZn0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgbmV4dCBleGFtcGxlIHVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gYGxvZ2AgdG8gbG9nIGEgcXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgQ29tcGlsYWJsZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFBlcnNvblVwZGF0ZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBsb2c8VCBleHRlbmRzIENvbXBpbGFibGU+KHFiOiBUKTogVCB7XG4gICAgICogICBjb25zb2xlLmxvZyhxYi5jb21waWxlKCkpXG4gICAgICogICByZXR1cm4gcWJcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICogICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogfSBzYXRpc2ZpZXMgUGVyc29uVXBkYXRlXG4gICAgICpcbiAgICAgKiBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQodmFsdWVzKVxuICAgICAqICAgLiRjYWxsKGxvZylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGBmdW5jKHRoaXMpYCBpZiBgY29uZGl0aW9uYCBpcyB0cnVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXNwZWNpYWxseSBoYW5keSB3aXRoIG9wdGlvbmFsIHNlbGVjdHMuIEFueSBgcmV0dXJuaW5nYCBvciBgcmV0dXJuaW5nQWxsYFxuICAgICAqIG1ldGhvZCBjYWxscyBhZGQgY29sdW1ucyBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlIG91dHB1dCB0eXBlIHdoZW4gY2FsbGVkIGluc2lkZVxuICAgICAqIHRoZSBgZnVuY2AgY2FsbGJhY2suIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRob3NlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseVxuICAgICAqIG1hZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uVXBkYXRlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVBlcnNvbihpZDogbnVtYmVyLCB1cGRhdGVzOiBQZXJzb25VcGRhdGUsIHJldHVybkxhc3ROYW1lOiBib29sZWFuKSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgICAuc2V0KHVwZGF0ZXMpXG4gICAgICogICAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgICAuJGlmKHJldHVybkxhc3ROYW1lLCAocWIpID0+IHFiLnJldHVybmluZygnbGFzdF9uYW1lJykpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW55IHNlbGVjdGlvbnMgYWRkZWQgaW5zaWRlIHRoZSBgaWZgIGNhbGxiYWNrIHdpbGwgYmUgYWRkZWQgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZVxuICAgICAqIG91dHB1dCB0eXBlIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgdGhlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseSBtYWRlIGJlZm9yZSBydW5uaW5nXG4gICAgICogdGhlIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYHVwZGF0ZVBlcnNvbmAgZnVuY3Rpb24gaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFByb21pc2U8e1xuICAgICAqICAgaWQ6IG51bWJlclxuICAgICAqICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gICAgICogICBsYXN0X25hbWU/OiBzdHJpbmdcbiAgICAgKiB9PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRpZihjb25kaXRpb24sIGZ1bmMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgVXBkYXRlUXVlcnlCdWlsZGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmFycm93cyAocGFydHMgb2YpIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdHJpZXMgdG8gYmUgYXMgdHlwZS1zYWZlIGFzIHBvc3NpYmxlLCBidXQgaW4gc29tZSBjYXNlcyB3ZSBoYXZlIHRvIG1ha2VcbiAgICAgKiBjb21wcm9taXNlcyBmb3IgYmV0dGVyIG1haW50YWluYWJpbGl0eSBhbmQgY29tcGlsYXRpb24gcGVyZm9ybWFuY2UuIEF0IHByZXNlbnQsXG4gICAgICogS3lzZWx5IGRvZXNuJ3QgbmFycm93IHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkgYmFzZWQgb24ge0BsaW5rIHNldH0gaW5wdXRcbiAgICAgKiB3aGVuIHVzaW5nIHtAbGluayB3aGVyZX0gYW5kL29yIHtAbGluayByZXR1cm5pbmd9IG9yIHtAbGluayByZXR1cm5pbmdBbGx9LlxuICAgICAqXG4gICAgICogVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyB2ZXJ5IHVzZWZ1bCBmb3IgdGhlc2Ugc2l0dWF0aW9ucywgYXMgaXQgcmVtb3ZlcyB1bm5jZXNzYXJ5XG4gICAgICogcnVudGltZSBhc3NlcnRpb24vZ3VhcmQgY29kZS4gSXRzIGlucHV0IHR5cGUgaXMgbGltaXRlZCB0byB0aGUgb3V0cHV0IHR5cGVcbiAgICAgKiBvZiB0aGUgcXVlcnksIHNvIHlvdSBjYW4ndCBhZGQgYSBjb2x1bW4gdGhhdCBkb2Vzbid0IGV4aXN0LCBvciBjaGFuZ2UgYSBjb2x1bW4nc1xuICAgICAqIHR5cGUgdG8gc29tZXRoaW5nIHRoYXQgZG9lc24ndCBleGlzdCBpbiBpdHMgdW5pb24gdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVHVybiB0aGlzIGNvZGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IGlkID0gMVxuICAgICAqIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgZGVsZXRlZF9hdDogbm93IH0pXG4gICAgICogICAud2hlcmUoJ2lkJywgJz0nLCBpZClcbiAgICAgKiAgIC53aGVyZSgnbnVsbGFibGVfY29sdW1uJywgJ2lzIG5vdCcsIG51bGwpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBpZiAoaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uKSkge1xuICAgICAqICAgZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbjogUGVyc29uKTogcGVyc29uIGlzIFBlcnNvbiAmIHsgbnVsbGFibGVfY29sdW1uOiBzdHJpbmcgfSB7XG4gICAgICogICByZXR1cm4gcGVyc29uLm51bGxhYmxlX2NvbHVtbiAhPSBudWxsXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW50byB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IE5vdE51bGwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBpZCA9IDFcbiAgICAgKiBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGRlbGV0ZWRfYXQ6IG5vdyB9KVxuICAgICAqICAgLndoZXJlKCdpZCcsICc9JywgaWQpXG4gICAgICogICAud2hlcmUoJ251bGxhYmxlX2NvbHVtbicsICdpcyBub3QnLCBudWxsKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuJG5hcnJvd1R5cGU8eyBkZWxldGVkX2F0OiBEYXRlOyBudWxsYWJsZV9jb2x1bW46IE5vdE51bGwgfT4oKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkbmFycm93VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NlcnRzIHRoYXQgcXVlcnkncyBvdXRwdXQgcm93IHR5cGUgZXF1YWxzIHRoZSBnaXZlbiB0eXBlIGBUYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNpbXBsaWZ5IGV4Y2Vzc2l2ZWx5IGNvbXBsZXggdHlwZXMgdG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5XG4gICAgICogYW5kIG11Y2ggZmFzdGVyLlxuICAgICAqXG4gICAgICogS3lzZWx5IHVzZXMgY29tcGxleCB0eXBlIG1hZ2ljIHRvIGFjaGlldmUgaXRzIHR5cGUgc2FmZXR5LiBUaGlzIGNvbXBsZXhpdHkgaXMgc29tZXRpbWVzIHRvbyBtdWNoXG4gICAgICogZm9yIFR5cGVTY3JpcHQgYW5kIHlvdSBnZXQgZXJyb3JzIGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGVycm9yIFRTMjU4OTogVHlwZSBpbnN0YW50aWF0aW9uIGlzIGV4Y2Vzc2l2ZWx5IGRlZXAgYW5kIHBvc3NpYmx5IGluZmluaXRlLlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gdGhlc2UgY2FzZSB5b3UgY2FuIG9mdGVuIHVzZSB0aGlzIG1ldGhvZCB0byBoZWxwIFR5cGVTY3JpcHQgYSBsaXR0bGUgYml0LiBXaGVuIHlvdSB1c2UgdGhpc1xuICAgICAqIG1ldGhvZCB0byBhc3NlcnQgdGhlIG91dHB1dCB0eXBlIG9mIGEgcXVlcnksIEt5c2VseSBjYW4gZHJvcCB0aGUgY29tcGxleCBvdXRwdXQgdHlwZSB0aGF0XG4gICAgICogY29uc2lzdHMgb2YgbXVsdGlwbGUgbmVzdGVkIGhlbHBlciB0eXBlcyBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBzaW1wbGUgYXNzZXJ0ZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIFVzaW5nIHRoaXMgbWV0aG9kIGRvZXNuJ3QgcmVkdWNlIHR5cGUgc2FmZXR5IGF0IGFsbC4gWW91IGhhdmUgdG8gcGFzcyBpbiBhIHR5cGUgdGhhdCBpc1xuICAgICAqIHN0cnVjdHVyYWxseSBlcXVhbCB0byB0aGUgY3VycmVudCB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uVXBkYXRlLCBQZXRVcGRhdGUsIFNwZWNpZXMgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0ge1xuICAgICAqICAgaWQ6IDEsXG4gICAgICogICBnZW5kZXI6ICdvdGhlcicsXG4gICAgICogfSBzYXRpc2ZpZXMgUGVyc29uVXBkYXRlXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXQgPSB7XG4gICAgICogICBuYW1lOiAnRmx1ZmZ5JyxcbiAgICAgKiB9IHNhdGlzZmllcyBQZXRVcGRhdGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAud2l0aCgndXBkYXRlZF9wZXJzb24nLCAocWIpID0+IHFiXG4gICAgICogICAgIC51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgICAgLnNldChwZXJzb24pXG4gICAgICogICAgIC53aGVyZSgnaWQnLCAnPScsIHBlcnNvbi5pZClcbiAgICAgKiAgICAgLnJldHVybmluZygnZmlyc3RfbmFtZScpXG4gICAgICogICAgIC4kYXNzZXJ0VHlwZTx7IGZpcnN0X25hbWU6IHN0cmluZyB9PigpXG4gICAgICogICApXG4gICAgICogICAud2l0aCgndXBkYXRlZF9wZXQnLCAocWIpID0+IHFiXG4gICAgICogICAgIC51cGRhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgICAgLnNldChwZXQpXG4gICAgICogICAgIC53aGVyZSgnb3duZXJfaWQnLCAnPScsIHBlcnNvbi5pZClcbiAgICAgKiAgICAgLnJldHVybmluZyhbJ25hbWUgYXMgcGV0X25hbWUnLCAnc3BlY2llcyddKVxuICAgICAqICAgICAuJGFzc2VydFR5cGU8eyBwZXRfbmFtZTogc3RyaW5nLCBzcGVjaWVzOiBTcGVjaWVzIH0+KClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5zZWxlY3RGcm9tKFsndXBkYXRlZF9wZXJzb24nLCAndXBkYXRlZF9wZXQnXSlcbiAgICAgKiAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkYXNzZXJ0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIFVwZGF0ZVF1ZXJ5QnVpbGRlciBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaW5zdGFsbGVkLlxuICAgICAqL1xuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiByb3dzLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBleGVjdXRlVGFrZUZpcnN0fSBhbmQge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93fSBtZXRob2RzLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICBjb25zdCB7IGFkYXB0ZXIgfSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGNvbXBpbGVkUXVlcnkucXVlcnk7XG4gICAgICAgIGlmICgocXVlcnkucmV0dXJuaW5nICYmIGFkYXB0ZXIuc3VwcG9ydHNSZXR1cm5pbmcpIHx8XG4gICAgICAgICAgICAocXVlcnkub3V0cHV0ICYmIGFkYXB0ZXIuc3VwcG9ydHNPdXRwdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBVcGRhdGVSZXN1bHQocmVzdWx0Lm51bUFmZmVjdGVkUm93cyA/PyBCaWdJbnQoMCksIHJlc3VsdC5udW1DaGFuZ2VkUm93cyksXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHVuZGVmaW5lZCBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdCgpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdGhyb3dzIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vUmVzdWx0RXJyb3J9IGlzIHRocm93biwgYnV0IHlvdSBjYW5cbiAgICAgKiBwcm92aWRlIGEgY3VzdG9tIGVycm9yIGNsYXNzLCBvciBjYWxsYmFjayBhcyB0aGUgb25seSBhcmd1bWVudCB0byB0aHJvdyBhIGRpZmZlcmVudFxuICAgICAqIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjaHVua1NpemUgPSAxMDApIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLiNwcm9wcy5leGVjdXRvci5zdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHN0cmVhbSkge1xuICAgICAgICAgICAgeWllbGQqIGl0ZW0ucm93cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBleHBsYWluKGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEV4cGxhaW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBmb3JtYXQsIG9wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1aWxkZXIuZXhlY3V0ZSgpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29tbW9uLXRhYmxlLWV4cHJlc3Npb24tbmFtZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4vY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi90YWJsZS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlTmFtZSwgY29sdW1uTmFtZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IFRhYmxlTm9kZS5jcmVhdGUodGFibGVOYW1lKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbk5hbWVzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoY29sdW1uTmFtZXMubWFwKENvbHVtbk5vZGUuY3JlYXRlKSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZScsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3RlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29tbW9uLXRhYmxlLWV4cHJlc3Npb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQ1RFQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGNvbW1vbiB0YWJsZSBleHByZXNzaW9uIG1hdGVyaWFsaXplZC5cbiAgICAgKi9cbiAgICBtYXRlcmlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ1RFQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBjb21tb24gdGFibGUgZXhwcmVzc2lvbiBub3QgbWF0ZXJpYWxpemVkLlxuICAgICAqL1xuICAgIG5vdE1hdGVyaWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDVEVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplZDogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aXRoLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29tbW9uLXRhYmxlLWV4cHJlc3Npb24tbmFtZS1ub2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5Q3JlYXRvciB9IGZyb20gJy4vcGFyc2UtdXRpbHMuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENURUJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2N0ZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbihuYW1lT3JCdWlsZGVyQ2FsbGJhY2ssIGV4cHJlc3Npb24pIHtcbiAgICBjb25zdCBleHByZXNzaW9uTm9kZSA9IGV4cHJlc3Npb24oY3JlYXRlUXVlcnlDcmVhdG9yKCkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKG5hbWVPckJ1aWxkZXJDYWxsYmFjaykpIHtcbiAgICAgICAgcmV0dXJuIG5hbWVPckJ1aWxkZXJDYWxsYmFjayhjdGVCdWlsZGVyRmFjdG9yeShleHByZXNzaW9uTm9kZSkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZS5jcmVhdGUocGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lKG5hbWVPckJ1aWxkZXJDYWxsYmFjayksIGV4cHJlc3Npb25Ob2RlKTtcbn1cbmZ1bmN0aW9uIGN0ZUJ1aWxkZXJGYWN0b3J5KGV4cHJlc3Npb25Ob2RlKSB7XG4gICAgcmV0dXJuIChuYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ1RFQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlLmNyZWF0ZShwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobmFtZSksIGV4cHJlc3Npb25Ob2RlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZShuYW1lKSB7XG4gICAgaWYgKG5hbWUuaW5jbHVkZXMoJygnKSkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoL1tcXChcXCldLyk7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gcGFydHNbMF07XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBwYXJ0c1sxXS5zcGxpdCgnLCcpLm1hcCgoaXQpID0+IGl0LnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZS5jcmVhdGUodGFibGUsIGNvbHVtbnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlLmNyZWF0ZShuYW1lKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3dpdGgtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBXaXRoTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnV2l0aE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGV4cHJlc3Npb24sIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdXaXRoTm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uczogZnJlZXplKFtleHByZXNzaW9uXSksXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRXhwcmVzc2lvbih3aXRoTm9kZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLndpdGhOb2RlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbnM6IGZyZWV6ZShbLi4ud2l0aE5vZGUuZXhwcmVzc2lvbnMsIGV4cHJlc3Npb25dKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yYW5kb20tc3RyaW5nLmQudHNcIiAvPlxuY29uc3QgQ0hBUlMgPSBbXG4gICAgJ0EnLFxuICAgICdCJyxcbiAgICAnQycsXG4gICAgJ0QnLFxuICAgICdFJyxcbiAgICAnRicsXG4gICAgJ0cnLFxuICAgICdIJyxcbiAgICAnSScsXG4gICAgJ0onLFxuICAgICdLJyxcbiAgICAnTCcsXG4gICAgJ00nLFxuICAgICdOJyxcbiAgICAnTycsXG4gICAgJ1AnLFxuICAgICdRJyxcbiAgICAnUicsXG4gICAgJ1MnLFxuICAgICdUJyxcbiAgICAnVScsXG4gICAgJ1YnLFxuICAgICdXJyxcbiAgICAnWCcsXG4gICAgJ1knLFxuICAgICdaJyxcbiAgICAnYScsXG4gICAgJ2InLFxuICAgICdjJyxcbiAgICAnZCcsXG4gICAgJ2UnLFxuICAgICdmJyxcbiAgICAnZycsXG4gICAgJ2gnLFxuICAgICdpJyxcbiAgICAnaicsXG4gICAgJ2snLFxuICAgICdsJyxcbiAgICAnbScsXG4gICAgJ24nLFxuICAgICdvJyxcbiAgICAncCcsXG4gICAgJ3EnLFxuICAgICdyJyxcbiAgICAncycsXG4gICAgJ3QnLFxuICAgICd1JyxcbiAgICAndicsXG4gICAgJ3cnLFxuICAgICd4JyxcbiAgICAneScsXG4gICAgJ3onLFxuICAgICcwJyxcbiAgICAnMScsXG4gICAgJzInLFxuICAgICczJyxcbiAgICAnNCcsXG4gICAgJzUnLFxuICAgICc2JyxcbiAgICAnNycsXG4gICAgJzgnLFxuICAgICc5Jyxcbl07XG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nKGxlbmd0aCkge1xuICAgIGxldCBjaGFycyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY2hhcnMgKz0gcmFuZG9tQ2hhcigpO1xuICAgIH1cbiAgICByZXR1cm4gY2hhcnM7XG59XG5mdW5jdGlvbiByYW5kb21DaGFyKCkge1xuICAgIHJldHVybiBDSEFSU1t+fihNYXRoLnJhbmRvbSgpICogQ0hBUlMubGVuZ3RoKV07XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3F1ZXJ5LWlkLmQudHNcIiAvPlxuaW1wb3J0IHsgcmFuZG9tU3RyaW5nIH0gZnJvbSAnLi9yYW5kb20tc3RyaW5nLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdWVyeUlkKCkge1xuICAgIHJldHVybiBuZXcgTGF6eVF1ZXJ5SWQoKTtcbn1cbmNsYXNzIExhenlRdWVyeUlkIHtcbiAgICAjcXVlcnlJZDtcbiAgICBnZXQgcXVlcnlJZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI3F1ZXJ5SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy4jcXVlcnlJZCA9IHJhbmRvbVN0cmluZyg4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jcXVlcnlJZDtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29wZXJhdGlvbi1ub2RlLXRyYW5zZm9ybWVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcmVxdWlyZUFsbFByb3BzIH0gZnJvbSAnLi4vdXRpbC9yZXF1aXJlLWFsbC1wcm9wcy5qcyc7XG4vKipcbiAqIFRyYW5zZm9ybXMgYW4gb3BlcmF0aW9uIG5vZGUgdHJlZSBpbnRvIGFub3RoZXIgb25lLlxuICpcbiAqIEt5c2VseSBxdWVyaWVzIGFyZSBleHByZXNzZWQgaW50ZXJuYWxseSBhcyBhIHRyZWUgb2Ygb2JqZWN0cyAob3BlcmF0aW9uIG5vZGVzKS5cbiAqIGBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXJgIHRha2VzIHN1Y2ggYSB0cmVlIGFzIGl0cyBpbnB1dCBhbmQgcmV0dXJucyBhXG4gKiB0cmFuc2Zvcm1lZCBkZWVwIGNvcHkgb2YgaXQuIEJ5IGRlZmF1bHQgdGhlIGBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXJgXG4gKiBkb2VzIG5vdGhpbmcuIFlvdSBuZWVkIHRvIG92ZXJyaWRlIG9uZSBvciBtb3JlIG1ldGhvZHMgdG8gbWFrZSBpdCBkb1xuICogc29tZXRoaW5nLlxuICpcbiAqIFRoZXJlJ3MgYSBtZXRob2QgZm9yIGVhY2ggbm9kZSB0eXBlLiBGb3IgZXhhbXBsZSBpZiB5b3UnZCBsaWtlIHRvIGNvbnZlcnRcbiAqIGVhY2ggaWRlbnRpZmllciAodGFibGUgbmFtZSwgY29sdW1uIG5hbWUsIGFsaWFzIGV0Yy4pIGZyb20gY2FtZWxDYXNlIHRvXG4gKiBzbmFrZV9jYXNlLCB5b3UnZCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyB0eXBlIElkZW50aWZpZXJOb2RlLCBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIgfSBmcm9tICdreXNlbHknXG4gKiBpbXBvcnQgc25ha2VDYXNlIGZyb20gJ2xvZGFzaC9zbmFrZUNhc2UnXG4gKlxuICogY2xhc3MgQ2FtZWxDYXNlVHJhbnNmb3JtZXIgZXh0ZW5kcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICogICBvdmVycmlkZSB0cmFuc2Zvcm1JZGVudGlmaWVyKG5vZGU6IElkZW50aWZpZXJOb2RlKTogSWRlbnRpZmllck5vZGUge1xuICogICAgIG5vZGUgPSBzdXBlci50cmFuc2Zvcm1JZGVudGlmaWVyKG5vZGUpXG4gKlxuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi5ub2RlLFxuICogICAgICAgbmFtZTogc25ha2VDYXNlKG5vZGUubmFtZSksXG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKlxuICogY29uc3QgdHJhbnNmb3JtZXIgPSBuZXcgQ2FtZWxDYXNlVHJhbnNmb3JtZXIoKVxuICpcbiAqIGNvbnN0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXSlcbiAqXG4gKiBjb25zdCB0cmVlID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtTm9kZShxdWVyeS50b09wZXJhdGlvbk5vZGUoKSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIHtcbiAgICBub2RlU3RhY2sgPSBbXTtcbiAgICAjdHJhbnNmb3JtZXJzID0gZnJlZXplKHtcbiAgICAgICAgQWxpYXNOb2RlOiB0aGlzLnRyYW5zZm9ybUFsaWFzLmJpbmQodGhpcyksXG4gICAgICAgIENvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIElkZW50aWZpZXJOb2RlOiB0aGlzLnRyYW5zZm9ybUlkZW50aWZpZXIuYmluZCh0aGlzKSxcbiAgICAgICAgU2NoZW1hYmxlSWRlbnRpZmllck5vZGU6IHRoaXMudHJhbnNmb3JtU2NoZW1hYmxlSWRlbnRpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBSYXdOb2RlOiB0aGlzLnRyYW5zZm9ybVJhdy5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZlcmVuY2VOb2RlOiB0aGlzLnRyYW5zZm9ybVJlZmVyZW5jZS5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3RRdWVyeU5vZGU6IHRoaXMudHJhbnNmb3JtU2VsZWN0UXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1TZWxlY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgVGFibGVOb2RlOiB0aGlzLnRyYW5zZm9ybVRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIEZyb21Ob2RlOiB0aGlzLnRyYW5zZm9ybUZyb20uYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0QWxsTm9kZTogdGhpcy50cmFuc2Zvcm1TZWxlY3RBbGwuYmluZCh0aGlzKSxcbiAgICAgICAgQW5kTm9kZTogdGhpcy50cmFuc2Zvcm1BbmQuYmluZCh0aGlzKSxcbiAgICAgICAgT3JOb2RlOiB0aGlzLnRyYW5zZm9ybU9yLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTm9kZTogdGhpcy50cmFuc2Zvcm1WYWx1ZS5iaW5kKHRoaXMpLFxuICAgICAgICBWYWx1ZUxpc3ROb2RlOiB0aGlzLnRyYW5zZm9ybVZhbHVlTGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlOiB0aGlzLnRyYW5zZm9ybVByaW1pdGl2ZVZhbHVlTGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJlbnNOb2RlOiB0aGlzLnRyYW5zZm9ybVBhcmVucy5iaW5kKHRoaXMpLFxuICAgICAgICBKb2luTm9kZTogdGhpcy50cmFuc2Zvcm1Kb2luLmJpbmQodGhpcyksXG4gICAgICAgIE9wZXJhdG9yTm9kZTogdGhpcy50cmFuc2Zvcm1PcGVyYXRvci5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVyZU5vZGU6IHRoaXMudHJhbnNmb3JtV2hlcmUuYmluZCh0aGlzKSxcbiAgICAgICAgSW5zZXJ0UXVlcnlOb2RlOiB0aGlzLnRyYW5zZm9ybUluc2VydFF1ZXJ5LmJpbmQodGhpcyksXG4gICAgICAgIERlbGV0ZVF1ZXJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1EZWxldGVRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBSZXR1cm5pbmdOb2RlOiB0aGlzLnRyYW5zZm9ybVJldHVybmluZy5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVUYWJsZU5vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgQWRkQ29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1BZGRDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uRGVmaW5pdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtQ29sdW1uRGVmaW5pdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVGFibGVOb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBEYXRhVHlwZU5vZGU6IHRoaXMudHJhbnNmb3JtRGF0YVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgT3JkZXJCeU5vZGU6IHRoaXMudHJhbnNmb3JtT3JkZXJCeS5iaW5kKHRoaXMpLFxuICAgICAgICBPcmRlckJ5SXRlbU5vZGU6IHRoaXMudHJhbnNmb3JtT3JkZXJCeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgR3JvdXBCeU5vZGU6IHRoaXMudHJhbnNmb3JtR3JvdXBCeS5iaW5kKHRoaXMpLFxuICAgICAgICBHcm91cEJ5SXRlbU5vZGU6IHRoaXMudHJhbnNmb3JtR3JvdXBCeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgVXBkYXRlUXVlcnlOb2RlOiB0aGlzLnRyYW5zZm9ybVVwZGF0ZVF1ZXJ5LmJpbmQodGhpcyksXG4gICAgICAgIENvbHVtblVwZGF0ZU5vZGU6IHRoaXMudHJhbnNmb3JtQ29sdW1uVXBkYXRlLmJpbmQodGhpcyksXG4gICAgICAgIExpbWl0Tm9kZTogdGhpcy50cmFuc2Zvcm1MaW1pdC5iaW5kKHRoaXMpLFxuICAgICAgICBPZmZzZXROb2RlOiB0aGlzLnRyYW5zZm9ybU9mZnNldC5iaW5kKHRoaXMpLFxuICAgICAgICBPbkNvbmZsaWN0Tm9kZTogdGhpcy50cmFuc2Zvcm1PbkNvbmZsaWN0LmJpbmQodGhpcyksXG4gICAgICAgIE9uRHVwbGljYXRlS2V5Tm9kZTogdGhpcy50cmFuc2Zvcm1PbkR1cGxpY2F0ZUtleS5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVJbmRleE5vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcEluZGV4Tm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgTGlzdE5vZGU6IHRoaXMudHJhbnNmb3JtTGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtUHJpbWFyeUtleUNvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgVW5pcXVlQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtVW5pcXVlQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZlcmVuY2VzTm9kZTogdGhpcy50cmFuc2Zvcm1SZWZlcmVuY2VzLmJpbmQodGhpcyksXG4gICAgICAgIENoZWNrQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtQ2hlY2tDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFdpdGhOb2RlOiB0aGlzLnRyYW5zZm9ybVdpdGguYmluZCh0aGlzKSxcbiAgICAgICAgQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZTogdGhpcy50cmFuc2Zvcm1Db21tb25UYWJsZUV4cHJlc3Npb24uYmluZCh0aGlzKSxcbiAgICAgICAgQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGU6IHRoaXMudHJhbnNmb3JtQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZS5iaW5kKHRoaXMpLFxuICAgICAgICBIYXZpbmdOb2RlOiB0aGlzLnRyYW5zZm9ybUhhdmluZy5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVTY2hlbWFOb2RlOiB0aGlzLnRyYW5zZm9ybUNyZWF0ZVNjaGVtYS5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wU2NoZW1hTm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wU2NoZW1hLmJpbmQodGhpcyksXG4gICAgICAgIEFsdGVyVGFibGVOb2RlOiB0aGlzLnRyYW5zZm9ybUFsdGVyVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcENvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcENvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBSZW5hbWVDb2x1bW5Ob2RlOiB0aGlzLnRyYW5zZm9ybVJlbmFtZUNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBBbHRlckNvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtQWx0ZXJDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgTW9kaWZ5Q29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1Nb2RpZnlDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQWRkQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtQWRkQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcENvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgUmVuYW1lQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtUmVuYW1lQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBGb3JlaWduS2V5Q29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtRm9yZWlnbktleUNvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgQ3JlYXRlVmlld05vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGU6IHRoaXMudHJhbnNmb3JtUmVmcmVzaE1hdGVyaWFsaXplZFZpZXcuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcFZpZXdOb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BWaWV3LmJpbmQodGhpcyksXG4gICAgICAgIEdlbmVyYXRlZE5vZGU6IHRoaXMudHJhbnNmb3JtR2VuZXJhdGVkLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRWYWx1ZU5vZGU6IHRoaXMudHJhbnNmb3JtRGVmYXVsdFZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIE9uTm9kZTogdGhpcy50cmFuc2Zvcm1Pbi5iaW5kKHRoaXMpLFxuICAgICAgICBWYWx1ZXNOb2RlOiB0aGlzLnRyYW5zZm9ybVZhbHVlcy5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3RNb2RpZmllck5vZGU6IHRoaXMudHJhbnNmb3JtU2VsZWN0TW9kaWZpZXIuYmluZCh0aGlzKSxcbiAgICAgICAgQ3JlYXRlVHlwZU5vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVHlwZU5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcFR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgRXhwbGFpbk5vZGU6IHRoaXMudHJhbnNmb3JtRXhwbGFpbi5iaW5kKHRoaXMpLFxuICAgICAgICBEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlOiB0aGlzLnRyYW5zZm9ybURlZmF1bHRJbnNlcnRWYWx1ZS5iaW5kKHRoaXMpLFxuICAgICAgICBBZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtQWdncmVnYXRlRnVuY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgT3Zlck5vZGU6IHRoaXMudHJhbnNmb3JtT3Zlci5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJ0aXRpb25CeU5vZGU6IHRoaXMudHJhbnNmb3JtUGFydGl0aW9uQnkuYmluZCh0aGlzKSxcbiAgICAgICAgUGFydGl0aW9uQnlJdGVtTm9kZTogdGhpcy50cmFuc2Zvcm1QYXJ0aXRpb25CeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgU2V0T3BlcmF0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1TZXRPcGVyYXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgQmluYXJ5T3BlcmF0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1CaW5hcnlPcGVyYXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgVW5hcnlPcGVyYXRpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybVVuYXJ5T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFVzaW5nTm9kZTogdGhpcy50cmFuc2Zvcm1Vc2luZy5iaW5kKHRoaXMpLFxuICAgICAgICBGdW5jdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtRnVuY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgQ2FzZU5vZGU6IHRoaXMudHJhbnNmb3JtQ2FzZS5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVuTm9kZTogdGhpcy50cmFuc2Zvcm1XaGVuLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05SZWZlcmVuY2VOb2RlOiB0aGlzLnRyYW5zZm9ybUpTT05SZWZlcmVuY2UuYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTlBhdGhOb2RlOiB0aGlzLnRyYW5zZm9ybUpTT05QYXRoLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05QYXRoTGVnTm9kZTogdGhpcy50cmFuc2Zvcm1KU09OUGF0aExlZy5iaW5kKHRoaXMpLFxuICAgICAgICBKU09OT3BlcmF0b3JDaGFpbk5vZGU6IHRoaXMudHJhbnNmb3JtSlNPTk9wZXJhdG9yQ2hhaW4uYmluZCh0aGlzKSxcbiAgICAgICAgVHVwbGVOb2RlOiB0aGlzLnRyYW5zZm9ybVR1cGxlLmJpbmQodGhpcyksXG4gICAgICAgIE1lcmdlUXVlcnlOb2RlOiB0aGlzLnRyYW5zZm9ybU1lcmdlUXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgTWF0Y2hlZE5vZGU6IHRoaXMudHJhbnNmb3JtTWF0Y2hlZC5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRJbmRleE5vZGU6IHRoaXMudHJhbnNmb3JtQWRkSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgQ2FzdE5vZGU6IHRoaXMudHJhbnNmb3JtQ2FzdC5iaW5kKHRoaXMpLFxuICAgICAgICBGZXRjaE5vZGU6IHRoaXMudHJhbnNmb3JtRmV0Y2guYmluZCh0aGlzKSxcbiAgICAgICAgVG9wTm9kZTogdGhpcy50cmFuc2Zvcm1Ub3AuYmluZCh0aGlzKSxcbiAgICAgICAgT3V0cHV0Tm9kZTogdGhpcy50cmFuc2Zvcm1PdXRwdXQuYmluZCh0aGlzKSxcbiAgICAgICAgT3JBY3Rpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybU9yQWN0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIENvbGxhdGVOb2RlOiB0aGlzLnRyYW5zZm9ybUNvbGxhdGUuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICB0cmFuc2Zvcm1Ob2RlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGVTdGFjay5wdXNoKG5vZGUpO1xuICAgICAgICBjb25zdCBvdXQgPSB0aGlzLnRyYW5zZm9ybU5vZGVJbXBsKG5vZGUsIHF1ZXJ5SWQpO1xuICAgICAgICB0aGlzLm5vZGVTdGFjay5wb3AoKTtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZShvdXQpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ob2RlSW1wbChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lcnNbbm9kZS5raW5kXShub2RlLCBxdWVyeUlkKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTm9kZUxpc3QobGlzdCwgcXVlcnlJZCkge1xuICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcmVlemUobGlzdC5tYXAoKG5vZGUpID0+IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLCBxdWVyeUlkKSkpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TZWxlY3RRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdFF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBmcm9tOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5mcm9tLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5zZWxlY3Rpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRpc3RpbmN0T246IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5kaXN0aW5jdE9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGpvaW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuam9pbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZ3JvdXBCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZ3JvdXBCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmZyb250TW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBsaW1pdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGltaXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vZmZzZXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2l0aDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2l0aCwgcXVlcnlJZCksXG4gICAgICAgICAgICBoYXZpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmhhdmluZywgcXVlcnlJZCksXG4gICAgICAgICAgICBleHBsYWluOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHBsYWluLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNldE9wZXJhdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5zZXRPcGVyYXRpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGZldGNoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5mZXRjaCwgcXVlcnlJZCksXG4gICAgICAgICAgICB0b3A6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRvcCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TZWxlY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2VsZWN0aW9uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWxpYXMobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbGlhc05vZGUnLFxuICAgICAgICAgICAgbm9kZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubm9kZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBhbGlhczogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuYWxpYXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVGFibGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUZyb20obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGcm9tTm9kZScsXG4gICAgICAgICAgICBmcm9tczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmZyb21zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlZmVyZW5jZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlZmVyZW5jZU5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFuZChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FuZE5vZGUnLFxuICAgICAgICAgICAgbGVmdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGVmdCwgcXVlcnlJZCksXG4gICAgICAgICAgICByaWdodDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmlnaHQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3Iobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPck5vZGUnLFxuICAgICAgICAgICAgbGVmdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGVmdCwgcXVlcnlJZCksXG4gICAgICAgICAgICByaWdodDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmlnaHQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVmFsdWVMaXN0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVmFsdWVMaXN0Tm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS52YWx1ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUGFyZW5zKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUGFyZW5zTm9kZScsXG4gICAgICAgICAgICBub2RlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5ub2RlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUpvaW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKb2luTm9kZScsXG4gICAgICAgICAgICBqb2luVHlwZTogbm9kZS5qb2luVHlwZSxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub24sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmF3KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmF3Tm9kZScsXG4gICAgICAgICAgICBzcWxGcmFnbWVudHM6IGZyZWV6ZShbLi4ubm9kZS5zcWxGcmFnbWVudHNdKSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5wYXJhbWV0ZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVdoZXJlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnV2hlcmVOb2RlJyxcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aGVyZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1JbnNlcnRRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0luc2VydFF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBpbnRvOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pbnRvLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHZhbHVlczogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudmFsdWVzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJldHVybmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmV0dXJuaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9uQ29uZmxpY3Q6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9uQ29uZmxpY3QsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb25EdXBsaWNhdGVLZXk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9uRHVwbGljYXRlS2V5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlnbm9yZTogbm9kZS5pZ25vcmUsXG4gICAgICAgICAgICBvckFjdGlvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JBY3Rpb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVwbGFjZTogbm9kZS5yZXBsYWNlLFxuICAgICAgICAgICAgZXhwbGFpbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwbGFpbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWVzOiBub2RlLmRlZmF1bHRWYWx1ZXMsXG4gICAgICAgICAgICB0b3A6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRvcCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvdXRwdXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm91dHB1dCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1WYWx1ZXMobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZXNOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnZhbHVlcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1EZWxldGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0RlbGV0ZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBmcm9tOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5mcm9tLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVzaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51c2luZywgcXVlcnlJZCksXG4gICAgICAgICAgICBqb2luczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmpvaW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICByZXR1cm5pbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJldHVybmluZywgcXVlcnlJZCksXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2l0aDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2l0aCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGxpbWl0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5saW1pdCwgcXVlcnlJZCksXG4gICAgICAgICAgICBleHBsYWluOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHBsYWluLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3V0cHV0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJldHVybmluZyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JldHVybmluZ05vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnNlbGVjdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ3JlYXRlVGFibGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29uc3RyYWludHMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdGVtcG9yYXJ5OiBub2RlLnRlbXBvcmFyeSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICAgICAgb25Db21taXQ6IG5vZGUub25Db21taXQsXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmZyb250TW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBzZWxlY3RRdWVyeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2VsZWN0UXVlcnksIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29sdW1uRGVmaW5pdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtbkRlZmluaXRpb25Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kYXRhVHlwZSwgcXVlcnlJZCksXG4gICAgICAgICAgICByZWZlcmVuY2VzOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZWZlcmVuY2VzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHByaW1hcnlLZXk6IG5vZGUucHJpbWFyeUtleSxcbiAgICAgICAgICAgIGF1dG9JbmNyZW1lbnQ6IG5vZGUuYXV0b0luY3JlbWVudCxcbiAgICAgICAgICAgIHVuaXF1ZTogbm9kZS51bmlxdWUsXG4gICAgICAgICAgICBub3ROdWxsOiBub2RlLm5vdE51bGwsXG4gICAgICAgICAgICB1bnNpZ25lZDogbm9kZS51bnNpZ25lZCxcbiAgICAgICAgICAgIGRlZmF1bHRUbzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZGVmYXVsdFRvLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNoZWNrOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jaGVjaywgcXVlcnlJZCksXG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmdlbmVyYXRlZCwgcXVlcnlJZCksXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmZyb250TW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiBub2RlLm51bGxzTm90RGlzdGluY3QsXG4gICAgICAgICAgICBpZGVudGl0eTogbm9kZS5pZGVudGl0eSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWRkQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWRkQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wVGFibGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgICAgIGNhc2NhZGU6IG5vZGUuY2FzY2FkZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9yZGVyQnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcmRlckJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLml0ZW1zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9yZGVyQnlJdGVtKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT3JkZXJCeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kaXJlY3Rpb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sbGF0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2xsYXRpb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbnVsbHM6IG5vZGUubnVsbHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Hcm91cEJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnR3JvdXBCeU5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5pdGVtcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Hcm91cEJ5SXRlbShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0dyb3VwQnlJdGVtTm9kZScsXG4gICAgICAgICAgICBncm91cEJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5ncm91cEJ5LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVVwZGF0ZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVXBkYXRlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBmcm9tOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5mcm9tLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGpvaW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuam9pbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS51cGRhdGVzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJldHVybmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmV0dXJuaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGV4cGxhaW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cGxhaW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxpbWl0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3V0cHV0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29sdW1uVXBkYXRlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uVXBkYXRlTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudmFsdWUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTGltaXQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdMaW1pdE5vZGUnLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxpbWl0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9mZnNldChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09mZnNldE5vZGUnLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vZmZzZXQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT25Db25mbGljdChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09uQ29uZmxpY3ROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbnN0cmFpbnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaW5kZXhFeHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pbmRleEV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaW5kZXhXaGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaW5kZXhXaGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB1cGRhdGVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudXBkYXRlcywgcXVlcnlJZCksXG4gICAgICAgICAgICB1cGRhdGVXaGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudXBkYXRlV2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZG9Ob3RoaW5nOiBub2RlLmRvTm90aGluZyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9uRHVwbGljYXRlS2V5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT25EdXBsaWNhdGVLZXlOb2RlJyxcbiAgICAgICAgICAgIHVwZGF0ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS51cGRhdGVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNyZWF0ZUluZGV4KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVuaXF1ZTogbm9kZS51bmlxdWUsXG4gICAgICAgICAgICB1c2luZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudXNpbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgICAgICB3aGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogbm9kZS5udWxsc05vdERpc3RpbmN0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTGlzdChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0xpc3ROb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuaXRlbXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcEluZGV4KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcEluZGV4Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgICAgIGNhc2NhZGU6IG5vZGUuY2FzY2FkZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVByaW1hcnlLZXlDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGVmZXJyYWJsZTogbm9kZS5kZWZlcnJhYmxlLFxuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IG5vZGUuaW5pdGlhbGx5RGVmZXJyZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1VbmlxdWVDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVW5pcXVlQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiBub2RlLm51bGxzTm90RGlzdGluY3QsXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiBub2RlLmRlZmVycmFibGUsXG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogbm9kZS5pbml0aWFsbHlEZWZlcnJlZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUZvcmVpZ25LZXlDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRm9yZWlnbktleUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlZmVyZW5jZXMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBvbkRlbGV0ZTogbm9kZS5vbkRlbGV0ZSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBub2RlLm9uVXBkYXRlLFxuICAgICAgICAgICAgZGVmZXJyYWJsZTogbm9kZS5kZWZlcnJhYmxlLFxuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IG5vZGUuaW5pdGlhbGx5RGVmZXJyZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TZXRPcGVyYXRpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZXRPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBub2RlLm9wZXJhdG9yLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBhbGw6IG5vZGUuYWxsLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVmZXJlbmNlcyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlZmVyZW5jZXNOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBvbkRlbGV0ZTogbm9kZS5vbkRlbGV0ZSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBub2RlLm9uVXBkYXRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ2hlY2tDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ2hlY2tDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtV2l0aChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1dpdGhOb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZXhwcmVzc2lvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVjdXJzaXZlOiBub2RlLnJlY3Vyc2l2ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbW1vblRhYmxlRXhwcmVzc2lvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IG5vZGUubWF0ZXJpYWxpemVkLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Db21tb25UYWJsZUV4cHJlc3Npb25OYW1lKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUhhdmluZyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0hhdmluZ05vZGUnLFxuICAgICAgICAgICAgaGF2aW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5oYXZpbmcsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ3JlYXRlU2NoZW1hKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlU2NoZW1hTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNjaGVtYSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZk5vdEV4aXN0czogbm9kZS5pZk5vdEV4aXN0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BTY2hlbWEobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wU2NoZW1hTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNjaGVtYSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgICAgIGNhc2NhZGU6IG5vZGUuY2FzY2FkZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFsdGVyVGFibGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbHRlclRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVuYW1lVG86IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlbmFtZVRvLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNldFNjaGVtYTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2V0U2NoZW1hLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbkFsdGVyYXRpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1uQWx0ZXJhdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYWRkQ29uc3RyYWludDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuYWRkQ29uc3RyYWludCwgcXVlcnlJZCksXG4gICAgICAgICAgICBkcm9wQ29uc3RyYWludDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZHJvcENvbnN0cmFpbnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVuYW1lQ29uc3RyYWludDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVuYW1lQ29uc3RyYWludCwgcXVlcnlJZCksXG4gICAgICAgICAgICBhZGRJbmRleDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuYWRkSW5kZXgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZHJvcEluZGV4OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kcm9wSW5kZXgsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcENvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlbmFtZUNvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlbmFtZUNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVuYW1lVG86IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlbmFtZVRvLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFsdGVyQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWx0ZXJDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kYXRhVHlwZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBkYXRhVHlwZUV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRhdGFUeXBlRXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBzZXREZWZhdWx0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zZXREZWZhdWx0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRyb3BEZWZhdWx0OiBub2RlLmRyb3BEZWZhdWx0LFxuICAgICAgICAgICAgc2V0Tm90TnVsbDogbm9kZS5zZXROb3ROdWxsLFxuICAgICAgICAgICAgZHJvcE5vdE51bGw6IG5vZGUuZHJvcE5vdE51bGwsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Nb2RpZnlDb2x1bW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdNb2RpZnlDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFkZENvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb25zdHJhaW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb25zdHJhaW50LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnROYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb25zdHJhaW50TmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgICAgIG1vZGlmaWVyOiBub2RlLm1vZGlmaWVyLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVuYW1lQ29uc3RyYWludChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlbmFtZUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIG9sZE5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9sZE5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmV3TmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmV3TmFtZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DcmVhdGVWaWV3KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB0ZW1wb3Jhcnk6IG5vZGUudGVtcG9yYXJ5LFxuICAgICAgICAgICAgb3JSZXBsYWNlOiBub2RlLm9yUmVwbGFjZSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiBub2RlLm1hdGVyaWFsaXplZCxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFzOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5hcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZWZyZXNoTWF0ZXJpYWxpemVkVmlldyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbmN1cnJlbnRseTogbm9kZS5jb25jdXJyZW50bHksXG4gICAgICAgICAgICB3aXRoTm9EYXRhOiBub2RlLndpdGhOb0RhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wVmlldyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BWaWV3Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiBub2RlLm1hdGVyaWFsaXplZCxcbiAgICAgICAgICAgIGNhc2NhZGU6IG5vZGUuY2FzY2FkZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUdlbmVyYXRlZChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0dlbmVyYXRlZE5vZGUnLFxuICAgICAgICAgICAgYnlEZWZhdWx0OiBub2RlLmJ5RGVmYXVsdCxcbiAgICAgICAgICAgIGFsd2F5czogbm9kZS5hbHdheXMsXG4gICAgICAgICAgICBpZGVudGl0eTogbm9kZS5pZGVudGl0eSxcbiAgICAgICAgICAgIHN0b3JlZDogbm9kZS5zdG9yZWQsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURlZmF1bHRWYWx1ZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0RlZmF1bHRWYWx1ZU5vZGUnLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kZWZhdWx0VmFsdWUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbk5vZGUnLFxuICAgICAgICAgICAgb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNlbGVjdE1vZGlmaWVyKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0TW9kaWZpZXJOb2RlJyxcbiAgICAgICAgICAgIG1vZGlmaWVyOiBub2RlLm1vZGlmaWVyLFxuICAgICAgICAgICAgcmF3TW9kaWZpZXI6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJhd01vZGlmaWVyLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9mOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUub2YsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ3JlYXRlVHlwZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVR5cGVOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW51bTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZW51bSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wVHlwZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BUeXBlTm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRXhwbGFpbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0V4cGxhaW5Ob2RlJyxcbiAgICAgICAgICAgIGZvcm1hdDogbm9kZS5mb3JtYXQsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcHRpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNjaGVtYWJsZUlkZW50aWZpZXIobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTY2hlbWFibGVJZGVudGlmaWVyTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNjaGVtYSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pZGVudGlmaWVyLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFnZ3JlZ2F0ZUZ1bmN0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWdncmVnYXRlRnVuY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGZ1bmM6IG5vZGUuZnVuYyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZWQ6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5hZ2dyZWdhdGVkLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRpc3RpbmN0OiBub2RlLmRpc3RpbmN0LFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoaW5Hcm91cDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2l0aGluR3JvdXAsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZmlsdGVyOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5maWx0ZXIsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3ZlcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3ZlciwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PdmVyKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT3Zlck5vZGUnLFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICBwYXJ0aXRpb25CeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucGFydGl0aW9uQnksIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUGFydGl0aW9uQnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQYXJ0aXRpb25CeU5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5pdGVtcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1QYXJ0aXRpb25CeUl0ZW0obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQYXJ0aXRpb25CeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIHBhcnRpdGlvbkJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5wYXJ0aXRpb25CeSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1CaW5hcnlPcGVyYXRpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdCaW5hcnlPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIGxlZnRPcGVyYW5kOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5sZWZ0T3BlcmFuZCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvcGVyYXRvcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3BlcmF0b3IsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmlnaHRPcGVyYW5kOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yaWdodE9wZXJhbmQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVW5hcnlPcGVyYXRpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVbmFyeU9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3I6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9wZXJhdG9yLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9wZXJhbmQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9wZXJhbmQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVXNpbmcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVc2luZ05vZGUnLFxuICAgICAgICAgICAgdGFibGVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudGFibGVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUZ1bmN0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRnVuY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGZ1bmM6IG5vZGUuZnVuYyxcbiAgICAgICAgICAgIGFyZ3VtZW50czogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmFyZ3VtZW50cywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DYXNlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ2FzZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnZhbHVlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdoZW46IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS53aGVuLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVsc2U6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmVsc2UsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaXNTdGF0ZW1lbnQ6IG5vZGUuaXNTdGF0ZW1lbnQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1XaGVuKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnV2hlbk5vZGUnLFxuICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb25kaXRpb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVzdWx0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZXN1bHQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSlNPTlJlZmVyZW5jZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0pTT05SZWZlcmVuY2VOb2RlJyxcbiAgICAgICAgICAgIHJlZmVyZW5jZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVmZXJlbmNlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRyYXZlcnNhbDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudHJhdmVyc2FsLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUpTT05QYXRoKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTlBhdGhOb2RlJyxcbiAgICAgICAgICAgIGluT3BlcmF0b3I6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmluT3BlcmF0b3IsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcGF0aExlZ3M6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5wYXRoTGVncywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1KU09OUGF0aExlZyhub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUGF0aExlZ05vZGUnLFxuICAgICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1KU09OT3BlcmF0b3JDaGFpbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0pTT05PcGVyYXRvckNoYWluTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3BlcmF0b3IsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudmFsdWVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVR1cGxlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVHVwbGVOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnZhbHVlcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1NZXJnZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnTWVyZ2VRdWVyeU5vZGUnLFxuICAgICAgICAgICAgaW50bzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaW50bywgcXVlcnlJZCksXG4gICAgICAgICAgICB1c2luZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudXNpbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS53aGVucywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBvdXRwdXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm91dHB1dCwgcXVlcnlJZCksXG4gICAgICAgICAgICByZXR1cm5pbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJldHVybmluZywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1NYXRjaGVkKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ01hdGNoZWROb2RlJyxcbiAgICAgICAgICAgIG5vdDogbm9kZS5ub3QsXG4gICAgICAgICAgICBieVNvdXJjZTogbm9kZS5ieVNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFkZEluZGV4KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWRkSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdW5pcXVlOiBub2RlLnVuaXF1ZSxcbiAgICAgICAgICAgIHVzaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51c2luZywgcXVlcnlJZCksXG4gICAgICAgICAgICBpZk5vdEV4aXN0czogbm9kZS5pZk5vdEV4aXN0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNhc3Qobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDYXN0Tm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kYXRhVHlwZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1GZXRjaChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0ZldGNoTm9kZScsXG4gICAgICAgICAgICByb3dDb3VudDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucm93Q291bnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbW9kaWZpZXI6IG5vZGUubW9kaWZpZXIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ub3Aobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVG9wTm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uOiBub2RlLmV4cHJlc3Npb24sXG4gICAgICAgICAgICBtb2RpZmllcnM6IG5vZGUubW9kaWZpZXJzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3V0cHV0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT3V0cHV0Tm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuc2VsZWN0aW9ucywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1EYXRhVHlwZShub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TZWxlY3RBbGwobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSWRlbnRpZmllcihub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1WYWx1ZShub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1QcmltaXRpdmVWYWx1ZUxpc3Qobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3BlcmF0b3Iobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRGVmYXVsdEluc2VydFZhbHVlKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9yQWN0aW9uKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbGxhdGUobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBMaXN0Tm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL2xpc3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS10cmFuc2Zvcm1lci5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi8uLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vLyBUaGlzIG9iamVjdCBleGlzdCBvbmx5IHNvIHRoYXQgd2UgZ2V0IGEgdHlwZSBlcnJvciB3aGVuIGEgbmV3IFJvb3RPcGVyYXRpb25Ob2RlXG4vLyBpcyBhZGRlZC4gSWYgeW91IGdldCBhIHR5cGUgZXJyb3IgaGVyZSwgbWFrZSBzdXJlIHRvIGFkZCB0aGUgbmV3IHJvb3Qgbm9kZSBhbmRcbi8vIGhhbmRsZSBpdCBjb3JyZWN0bHkgaW4gdGhlIHRyYW5zZm9ybWVyLlxuLy9cbi8vIERPIE5PVCBSRUZBQ1RPUiBUSElTIEVWRU4gSUYgSVQgU0VFTVMgVVNFTEVTUyBUTyBZT1UhXG5jb25zdCBST09UX09QRVJBVElPTl9OT0RFUyA9IGZyZWV6ZSh7XG4gICAgQWx0ZXJUYWJsZU5vZGU6IHRydWUsXG4gICAgQ3JlYXRlSW5kZXhOb2RlOiB0cnVlLFxuICAgIENyZWF0ZVNjaGVtYU5vZGU6IHRydWUsXG4gICAgQ3JlYXRlVGFibGVOb2RlOiB0cnVlLFxuICAgIENyZWF0ZVR5cGVOb2RlOiB0cnVlLFxuICAgIENyZWF0ZVZpZXdOb2RlOiB0cnVlLFxuICAgIFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZTogdHJ1ZSxcbiAgICBEZWxldGVRdWVyeU5vZGU6IHRydWUsXG4gICAgRHJvcEluZGV4Tm9kZTogdHJ1ZSxcbiAgICBEcm9wU2NoZW1hTm9kZTogdHJ1ZSxcbiAgICBEcm9wVGFibGVOb2RlOiB0cnVlLFxuICAgIERyb3BUeXBlTm9kZTogdHJ1ZSxcbiAgICBEcm9wVmlld05vZGU6IHRydWUsXG4gICAgSW5zZXJ0UXVlcnlOb2RlOiB0cnVlLFxuICAgIFJhd05vZGU6IHRydWUsXG4gICAgU2VsZWN0UXVlcnlOb2RlOiB0cnVlLFxuICAgIFVwZGF0ZVF1ZXJ5Tm9kZTogdHJ1ZSxcbiAgICBNZXJnZVF1ZXJ5Tm9kZTogdHJ1ZSxcbn0pO1xuY29uc3QgU0NIRU1BTEVTU19GVU5DVElPTlMgPSB7XG4gICAganNvbl9hZ2c6IHRydWUsXG4gICAgdG9fanNvbjogdHJ1ZSxcbn07XG5leHBvcnQgY2xhc3MgV2l0aFNjaGVtYVRyYW5zZm9ybWVyIGV4dGVuZHMgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIHtcbiAgICAjc2NoZW1hO1xuICAgICNzY2hlbWFibGVJZHMgPSBuZXcgU2V0KCk7XG4gICAgI2N0ZXMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI3NjaGVtYSA9IHNjaGVtYTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTm9kZUltcGwobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICBpZiAoIXRoaXMuI2lzUm9vdE9wZXJhdGlvbk5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci50cmFuc2Zvcm1Ob2RlSW1wbChub2RlLCBxdWVyeUlkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdGVzID0gdGhpcy4jY29sbGVjdENURXMobm9kZSk7XG4gICAgICAgIGZvciAoY29uc3QgY3RlIG9mIGN0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI2N0ZXMuYWRkKGN0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVzID0gdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkcyhub2RlKTtcbiAgICAgICAgZm9yIChjb25zdCB0YWJsZSBvZiB0YWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI3NjaGVtYWJsZUlkcy5hZGQodGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gc3VwZXIudHJhbnNmb3JtTm9kZUltcGwobm9kZSwgcXVlcnlJZCk7XG4gICAgICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLiNzY2hlbWFibGVJZHMuZGVsZXRlKHRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGN0ZSBvZiBjdGVzKSB7XG4gICAgICAgICAgICB0aGlzLiNjdGVzLmRlbGV0ZShjdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2NoZW1hYmxlSWRlbnRpZmllcihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gc3VwZXIudHJhbnNmb3JtU2NoZW1hYmxlSWRlbnRpZmllcihub2RlLCBxdWVyeUlkKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkLnNjaGVtYSB8fCAhdGhpcy4jc2NoZW1hYmxlSWRzLmhhcyhub2RlLmlkZW50aWZpZXIubmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udHJhbnNmb3JtZWQsXG4gICAgICAgICAgICBzY2hlbWE6IElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNzY2hlbWEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZWZlcmVuY2VzKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBzdXBlci50cmFuc2Zvcm1SZWZlcmVuY2VzKG5vZGUsIHF1ZXJ5SWQpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWQudGFibGUudGFibGUuc2NoZW1hKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRyYW5zZm9ybWVkLFxuICAgICAgICAgICAgdGFibGU6IFRhYmxlTm9kZS5jcmVhdGVXaXRoU2NoZW1hKHRoaXMuI3NjaGVtYSwgdHJhbnNmb3JtZWQudGFibGUudGFibGUuaWRlbnRpZmllci5uYW1lKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWdncmVnYXRlRnVuY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3VwZXIudHJhbnNmb3JtQWdncmVnYXRlRnVuY3Rpb24oeyAuLi5ub2RlLCBhZ2dyZWdhdGVkOiBbXSB9LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZWQ6IHRoaXMuI3RyYW5zZm9ybVRhYmxlQXJnc1dpdGhvdXRTY2hlbWFzKG5vZGUsIHF1ZXJ5SWQsICdhZ2dyZWdhdGVkJyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHRyYW5zZm9ybUZ1bmN0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN1cGVyLnRyYW5zZm9ybUZ1bmN0aW9uKHsgLi4ubm9kZSwgYXJndW1lbnRzOiBbXSB9LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogdGhpcy4jdHJhbnNmb3JtVGFibGVBcmdzV2l0aG91dFNjaGVtYXMobm9kZSwgcXVlcnlJZCwgJ2FyZ3VtZW50cycpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAjdHJhbnNmb3JtVGFibGVBcmdzV2l0aG91dFNjaGVtYXMobm9kZSwgcXVlcnlJZCwgYXJnc0tleSkge1xuICAgICAgICByZXR1cm4gU0NIRU1BTEVTU19GVU5DVElPTlNbbm9kZS5mdW5jXVxuICAgICAgICAgICAgPyBub2RlW2FyZ3NLZXldLm1hcCgoYXJnKSA9PiAhVGFibGVOb2RlLmlzKGFyZykgfHwgYXJnLnRhYmxlLnNjaGVtYVxuICAgICAgICAgICAgICAgID8gdGhpcy50cmFuc2Zvcm1Ob2RlKGFyZywgcXVlcnlJZClcbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYXJnLFxuICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1JZGVudGlmaWVyKGFyZy50YWJsZS5pZGVudGlmaWVyLCBxdWVyeUlkKSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGVbYXJnc0tleV0sIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICAjaXNSb290T3BlcmF0aW9uTm9kZShub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgaW4gUk9PVF9PUEVSQVRJT05fTk9ERVM7XG4gICAgfVxuICAgICNjb2xsZWN0U2NoZW1hYmxlSWRzKG5vZGUpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hYmxlSWRzID0gbmV3IFNldCgpO1xuICAgICAgICBpZiAoJ25hbWUnIGluIG5vZGUgJiYgbm9kZS5uYW1lICYmIFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmlzKG5vZGUubmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZChub2RlLm5hbWUsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdmcm9tJyBpbiBub2RlICYmIG5vZGUuZnJvbSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmcm9tIG9mIG5vZGUuZnJvbS5mcm9tcykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKGZyb20sIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdpbnRvJyBpbiBub2RlICYmIG5vZGUuaW50bykge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIobm9kZS5pbnRvLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgndGFibGUnIGluIG5vZGUgJiYgbm9kZS50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIobm9kZS50YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2pvaW5zJyBpbiBub2RlICYmIG5vZGUuam9pbnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgam9pbiBvZiBub2RlLmpvaW5zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIoam9pbi50YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ3VzaW5nJyBpbiBub2RlICYmIG5vZGUudXNpbmcpIHtcbiAgICAgICAgICAgIGlmIChKb2luTm9kZS5pcyhub2RlLnVzaW5nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKG5vZGUudXNpbmcudGFibGUsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihub2RlLnVzaW5nLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2hlbWFibGVJZHM7XG4gICAgfVxuICAgICNjb2xsZWN0Q1RFcyhub2RlKSB7XG4gICAgICAgIGNvbnN0IGN0ZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGlmICgnd2l0aCcgaW4gbm9kZSAmJiBub2RlLndpdGgpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RDVEVJZHMobm9kZS53aXRoLCBjdGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3RlcztcbiAgICB9XG4gICAgI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKG5vZGUsIHNjaGVtYWJsZUlkcykge1xuICAgICAgICBpZiAoVGFibGVOb2RlLmlzKG5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWQobm9kZS50YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBbGlhc05vZGUuaXMobm9kZSkgJiYgVGFibGVOb2RlLmlzKG5vZGUubm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZChub2RlLm5vZGUudGFibGUsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoTGlzdE5vZGUuaXMobm9kZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFibGUgb2Ygbm9kZS5pdGVtcykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKHRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICNjb2xsZWN0U2NoZW1hYmxlSWQobm9kZSwgc2NoZW1hYmxlSWRzKSB7XG4gICAgICAgIGNvbnN0IGlkID0gbm9kZS5pZGVudGlmaWVyLm5hbWU7XG4gICAgICAgIGlmICghdGhpcy4jc2NoZW1hYmxlSWRzLmhhcyhpZCkgJiYgIXRoaXMuI2N0ZXMuaGFzKGlkKSkge1xuICAgICAgICAgICAgc2NoZW1hYmxlSWRzLmFkZChpZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2NvbGxlY3RDVEVJZHMobm9kZSwgY3Rlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2Ygbm9kZS5leHByZXNzaW9ucykge1xuICAgICAgICAgICAgY29uc3QgY3RlSWQgPSBleHByLm5hbWUudGFibGUudGFibGUuaWRlbnRpZmllci5uYW1lO1xuICAgICAgICAgICAgaWYgKCF0aGlzLiNjdGVzLmhhcyhjdGVJZCkpIHtcbiAgICAgICAgICAgICAgICBjdGVzLmFkZChjdGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3dpdGgtc2NoZW1hLXBsdWdpbi5kLnRzXCIgLz5cbmltcG9ydCB7IFdpdGhTY2hlbWFUcmFuc2Zvcm1lciB9IGZyb20gJy4vd2l0aC1zY2hlbWEtdHJhbnNmb3JtZXIuanMnO1xuZXhwb3J0IGNsYXNzIFdpdGhTY2hlbWFQbHVnaW4ge1xuICAgICN0cmFuc2Zvcm1lcjtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgdGhpcy4jdHJhbnNmb3JtZXIgPSBuZXcgV2l0aFNjaGVtYVRyYW5zZm9ybWVyKHNjaGVtYSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVF1ZXJ5KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zZm9ybWVyLnRyYW5zZm9ybU5vZGUoYXJncy5ub2RlLCBhcmdzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyB0cmFuc2Zvcm1SZXN1bHQoYXJncykge1xuICAgICAgICByZXR1cm4gYXJncy5yZXN1bHQ7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9tYXRjaGVkLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTWF0Y2hlZE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ01hdGNoZWROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShub3QsIGJ5U291cmNlID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnTWF0Y2hlZE5vZGUnLFxuICAgICAgICAgICAgbm90LFxuICAgICAgICAgICAgYnlTb3VyY2UsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWVyZ2UtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgTWF0Y2hlZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9tYXRjaGVkLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS93aGVuLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZUZpbHRlckxpc3QsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXJnZVdoZW4odHlwZSwgYXJncywgcmVmUmlnaHQpIHtcbiAgICByZXR1cm4gV2hlbk5vZGUuY3JlYXRlKHBhcnNlRmlsdGVyTGlzdChbXG4gICAgICAgIE1hdGNoZWROb2RlLmNyZWF0ZSghdHlwZS5pc01hdGNoZWQsIHR5cGUuYnlTb3VyY2UpLFxuICAgICAgICAuLi4oYXJncyAmJiBhcmdzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIGFyZ3MubGVuZ3RoID09PSAzICYmIHJlZlJpZ2h0XG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICA6IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncyksXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICBdLCAnYW5kJywgZmFsc2UpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1lcmdlVGhlbihyZXN1bHQpIHtcbiAgICBpZiAoaXNTdHJpbmcocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gUmF3Tm9kZS5jcmVhdGUoW3Jlc3VsdF0sIFtdKTtcbiAgICB9XG4gICAgaWYgKGlzT3BlcmF0aW9uTm9kZVNvdXJjZShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmVycmVkLmQudHNcIiAvPlxuZXhwb3J0IGNsYXNzIERlZmVycmVkIHtcbiAgICAjcHJvbWlzZTtcbiAgICAjcmVzb2x2ZTtcbiAgICAjcmVqZWN0O1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICAgICAgdGhpcy4jcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb21pc2U7XG4gICAgfVxuICAgIHJlc29sdmUgPSAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuI3Jlc29sdmUpIHtcbiAgICAgICAgICAgIHRoaXMuI3Jlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZWplY3QgPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNyZWplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuI3JlamVjdChyZWFzb24pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcHJvdmlkZS1jb250cm9sbGVkLWNvbm5lY3Rpb24uZC50c1wiIC8+XG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vZGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbihjb25uZWN0aW9uUHJvdmlkZXIpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uRGVmZXIgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBjb25zdCBjb25uZWN0aW9uUmVsZWFzZURlZmVyID0gbmV3IERlZmVycmVkKCk7XG4gICAgY29ubmVjdGlvblByb3ZpZGVyXG4gICAgICAgIC5wcm92aWRlQ29ubmVjdGlvbihhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICBjb25uZWN0aW9uRGVmZXIucmVzb2x2ZShjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNvbm5lY3Rpb25SZWxlYXNlRGVmZXIucHJvbWlzZTtcbiAgICB9KVxuICAgICAgICAuY2F0Y2goKGV4KSA9PiBjb25uZWN0aW9uRGVmZXIucmVqZWN0KGV4KSk7XG4gICAgLy8gQ3JlYXRlIGNvbXBvc2l0ZSBvZiB0aGUgY29ubmVjdGlvbiBhbmQgdGhlIHJlbGVhc2UgbWV0aG9kIGluc3RlYWQgb2ZcbiAgICAvLyBtb2RpZnlpbmcgdGhlIGNvbm5lY3Rpb24gb3IgY3JlYXRpbmcgYSBuZXcgbmVzdGluZyBgRGF0YWJhc2VDb25uZWN0aW9uYC5cbiAgICAvLyBUaGlzIHdheSB3ZSBkb24ndCBhY2NpZGVudGFsbHkgb3ZlcnJpZGUgYW55IG1ldGhvZHMgb2YgM3JkIHBhcnR5XG4gICAgLy8gY29ubmVjdGlvbnMgYW5kIGRvbid0IHJldHVybiB3cmFwcGVkIGNvbm5lY3Rpb25zIHRvIGRyaXZlcnMgdGhhdFxuICAgIC8vIGV4cGVjdCBhIGNlcnRhaW4gc3BlY2lmaWMgY29ubmVjdGlvbiBjbGFzcy5cbiAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgY29ubmVjdGlvbjogYXdhaXQgY29ubmVjdGlvbkRlZmVyLnByb21pc2UsXG4gICAgICAgIHJlbGVhc2U6IGNvbm5lY3Rpb25SZWxlYXNlRGVmZXIucmVzb2x2ZSxcbiAgICB9KTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcXVlcnktZXhlY3V0b3ItYmFzZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbiB9IGZyb20gJy4uL3V0aWwvcHJvdmlkZS1jb250cm9sbGVkLWNvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgbG9nT25jZSB9IGZyb20gJy4uL3V0aWwvbG9nLW9uY2UuanMnO1xuY29uc3QgTk9fUExVR0lOUyA9IGZyZWV6ZShbXSk7XG5leHBvcnQgY2xhc3MgUXVlcnlFeGVjdXRvckJhc2Uge1xuICAgICNwbHVnaW5zO1xuICAgIGNvbnN0cnVjdG9yKHBsdWdpbnMgPSBOT19QTFVHSU5TKSB7XG4gICAgICAgIHRoaXMuI3BsdWdpbnMgPSBwbHVnaW5zO1xuICAgIH1cbiAgICBnZXQgcGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BsdWdpbnM7XG4gICAgfVxuICAgIHRyYW5zZm9ybVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy4jcGx1Z2lucykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWROb2RlID0gcGx1Z2luLnRyYW5zZm9ybVF1ZXJ5KHsgbm9kZSwgcXVlcnlJZCB9KTtcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gYSBydW50aW1lIGNoZWNrIGhlcmUuIFRoZXJlIGlzIG5vIGdvb2Qgd2F5XG4gICAgICAgICAgICAvLyB0byB3cml0ZSB0eXBlcyB0aGF0IGVuZm9yY2UgdGhpcyBjb25zdHJhaW50LlxuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVkTm9kZS5raW5kID09PSBub2RlLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gdHJhbnNmb3JtZWROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFtcbiAgICAgICAgICAgICAgICAgICAgYEt5c2VseVBsdWdpbi50cmFuc2Zvcm1RdWVyeSBtdXN0IHJldHVybiBhIG5vZGVgLFxuICAgICAgICAgICAgICAgICAgICBgb2YgdGhlIHNhbWUga2luZCB0aGF0IHdhcyBnaXZlbiB0byBpdC5gLFxuICAgICAgICAgICAgICAgICAgICBgVGhlIHBsdWdpbiB3YXMgZ2l2ZW4gYSAke25vZGUua2luZH1gLFxuICAgICAgICAgICAgICAgICAgICBgYnV0IGl0IHJldHVybmVkIGEgJHt0cmFuc2Zvcm1lZE5vZGUua2luZH1gLFxuICAgICAgICAgICAgICAgIF0uam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvdmlkZUNvbm5lY3Rpb24oYXN5bmMgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICAgICAgaWYgKCdudW1VcGRhdGVkT3JEZWxldGVkUm93cycgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgbG9nT25jZSgna3lzZWx5Ondhcm5pbmc6IG91dGRhdGVkIGRyaXZlci9wbHVnaW4gZGV0ZWN0ZWQhIGBRdWVyeVJlc3VsdC5udW1VcGRhdGVkT3JEZWxldGVkUm93c2AgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBgUXVlcnlSZXN1bHQubnVtQWZmZWN0ZWRSb3dzYC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiN0cmFuc2Zvcm1SZXN1bHQocmVzdWx0LCBjb21waWxlZFF1ZXJ5LnF1ZXJ5SWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpIHtcbiAgICAgICAgY29uc3QgeyBjb25uZWN0aW9uLCByZWxlYXNlIH0gPSBhd2FpdCBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24odGhpcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHJlc3VsdCBvZiBjb25uZWN0aW9uLnN0cmVhbVF1ZXJ5KGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBhd2FpdCB0aGlzLiN0cmFuc2Zvcm1SZXN1bHQocmVzdWx0LCBjb21waWxlZFF1ZXJ5LnF1ZXJ5SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jICN0cmFuc2Zvcm1SZXN1bHQocmVzdWx0LCBxdWVyeUlkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuI3BsdWdpbnMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHBsdWdpbi50cmFuc2Zvcm1SZXN1bHQoeyByZXN1bHQsIHF1ZXJ5SWQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL25vb3AtcXVlcnktZXhlY3V0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBRdWVyeUV4ZWN1dG9yQmFzZSB9IGZyb20gJy4vcXVlcnktZXhlY3V0b3ItYmFzZS5qcyc7XG4vKipcbiAqIEEge0BsaW5rIFF1ZXJ5RXhlY3V0b3J9IHN1YmNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiB5b3UgZG9uJ3RcbiAqIGhhdmUgYSB7QGxpbmsgUXVlcnlDb21waWxlcn0sIHtAbGluayBDb25uZWN0aW9uUHJvdmlkZXJ9IG9yIGFueVxuICogb3RoZXIgbmVlZGVkIHRoaW5ncyB0byBhY3R1YWxseSBleGVjdXRlIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb29wUXVlcnlFeGVjdXRvciBleHRlbmRzIFF1ZXJ5RXhlY3V0b3JCYXNlIHtcbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIHF1ZXJ5IGNhbm5vdCBiZSBjb21waWxlZCB0byBTUUwnKTtcbiAgICB9XG4gICAgY29tcGlsZVF1ZXJ5KCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgcXVlcnkgY2Fubm90IGJlIGNvbXBpbGVkIHRvIFNRTCcpO1xuICAgIH1cbiAgICBwcm92aWRlQ29ubmVjdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIHF1ZXJ5IGNhbm5vdCBiZSBleGVjdXRlZCcpO1xuICAgIH1cbiAgICB3aXRoQ29ubmVjdGlvblByb3ZpZGVyKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgcXVlcnkgY2Fubm90IGhhdmUgYSBjb25uZWN0aW9uIHByb3ZpZGVyJyk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFF1ZXJ5RXhlY3V0b3IoWy4uLnRoaXMucGx1Z2lucywgcGx1Z2luXSk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW5zKHBsdWdpbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wUXVlcnlFeGVjdXRvcihbLi4udGhpcy5wbHVnaW5zLCAuLi5wbHVnaW5zXSk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW5BdEZyb250KHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IE5vb3BRdWVyeUV4ZWN1dG9yKFtwbHVnaW4sIC4uLnRoaXMucGx1Z2luc10pO1xuICAgIH1cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wUXVlcnlFeGVjdXRvcihbXSk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IE5PT1BfUVVFUllfRVhFQ1VUT1IgPSBuZXcgTm9vcFF1ZXJ5RXhlY3V0b3IoKTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWVyZ2UtcmVzdWx0LmQudHNcIiAvPlxuZXhwb3J0IGNsYXNzIE1lcmdlUmVzdWx0IHtcbiAgICBudW1DaGFuZ2VkUm93cztcbiAgICBjb25zdHJ1Y3RvcihudW1DaGFuZ2VkUm93cykge1xuICAgICAgICB0aGlzLm51bUNoYW5nZWRSb3dzID0gbnVtQ2hhbmdlZFJvd3M7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9tZXJnZS1xdWVyeS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgSW5zZXJ0UXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgTWVyZ2VRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9tZXJnZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdXBkYXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VJbnNlcnRFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9pbnNlcnQtdmFsdWVzLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUpvaW4sIH0gZnJvbSAnLi4vcGFyc2VyL2pvaW4tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlTWVyZ2VUaGVuLCBwYXJzZU1lcmdlV2hlbiB9IGZyb20gJy4uL3BhcnNlci9tZXJnZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBbGwsIHBhcnNlU2VsZWN0QXJnLCB9IGZyb20gJy4uL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVG9wIH0gZnJvbSAnLi4vcGFyc2VyL3RvcC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTk9PUF9RVUVSWV9FWEVDVVRPUiB9IGZyb20gJy4uL3F1ZXJ5LWV4ZWN1dG9yL25vb3AtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgTWVyZ2VSZXN1bHQgfSBmcm9tICcuL21lcmdlLXJlc3VsdC5qcyc7XG5pbXBvcnQgeyBOb1Jlc3VsdEVycm9yLCBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3VwZGF0ZS1xdWVyeS1idWlsZGVyLmpzJztcbmV4cG9ydCBjbGFzcyBNZXJnZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGV0Lm93bmVyX2lkJywgJ3BlcnNvbi5pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLm1vZGlmeUVuZChzcWwucmF3KCctLSB0aGlzIGlzIGEgY29tbWVudCcpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiIHVzaW5nIFwicGV0XCIgb24gXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIiB3aGVuIG1hdGNoZWQgdGhlbiBkZWxldGUgLS0gdGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhIGBtZXJnZSBpbnRvYCBxdWVyeSB0byBhbiBgbWVyZ2UgdG9wIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogYHRvcGAgY2xhdXNlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNUyBTUUwgU2VydmVyLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBBZmZlY3QgNSBtYXRjaGVkIHJvd3MgYXQgbW9zdDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1KVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgdG9wKDUpIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFmZmVjdCA1MCUgb2YgbWF0Y2hlZCByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUwLCAncGVyY2VudCcpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRlbGV0ZSgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSB0b3AoNTApIHBlcmNlbnQgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIGRlbGV0ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXNpbmcoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBNZXJnZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhVc2luZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlSm9pbignVXNpbmcnLCBhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmcoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nQWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXQub3duZXJfaWQnLCAncGVyc29uLmlkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRlbGV0ZSgpXG4gICAgICogICAubW9kaWZ5RW5kKHNxbC5yYXcoJy0tIHRoaXMgaXMgYSBjb21tZW50JykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCIgdXNpbmcgXCJwZXRcIiBvbiBcInBldFwiLlwib3duZXJfaWRcIiA9IFwicGVyc29uXCIuXCJpZFwiIHdoZW4gbWF0Y2hlZCB0aGVuIGRlbGV0ZSAtLSB0aGlzIGlzIGEgY29tbWVudFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIE1lcmdlUXVlcnlCdWlsZGVyLnRvcH0uXG4gICAgICovXG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2ltcGxlIGB3aGVuIG1hdGNoZWRgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBGb3IgYSBgd2hlbiBtYXRjaGVkYCBjbGF1c2Ugd2l0aCBhbiBgYW5kYCBjb25kaXRpb24sIHNlZSB7QGxpbmsgd2hlbk1hdGNoZWRBbmR9LlxuICAgICAqXG4gICAgICogRm9yIGEgc2ltcGxlIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2UsIHNlZSB7QGxpbmsgd2hlbk5vdE1hdGNoZWR9LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbm90IG1hdGNoZWRgIGNsYXVzZSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbiwgc2VlIHtAbGluayB3aGVuTm90TWF0Y2hlZEFuZH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIGRlbGV0ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHdoZW5NYXRjaGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk1hdGNoZWQoW10pO1xuICAgIH1cbiAgICB3aGVuTWF0Y2hlZEFuZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3aGVuTWF0Y2hlZChhcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlIHRvIHRoZSBxdWVyeSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbi4gQnV0IHVubGlrZVxuICAgICAqIHtAbGluayB3aGVuTWF0Y2hlZEFuZH0sIHRoaXMgbWV0aG9kIGFjY2VwdHMgYSBjb2x1bW4gcmVmZXJlbmNlIGFzIHRoZSAzcmQgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIHtAbGluayBTZWxlY3RRdWVyeUJ1aWxkZXIud2hlcmVSZWZ9LCBzbyBzZWUgdGhlIGRvY3VtZW50YXRpb25cbiAgICAgKiBmb3IgdGhhdCBtZXRob2QgZm9yIG1vcmUgZXhhbXBsZXMuXG4gICAgICovXG4gICAgd2hlbk1hdGNoZWRBbmRSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3aGVuTWF0Y2hlZChbbGhzLCBvcCwgcmhzXSwgdHJ1ZSk7XG4gICAgfVxuICAgICN3aGVuTWF0Y2hlZChhcmdzLCByZWZSaWdodCkge1xuICAgICAgICByZXR1cm4gbmV3IE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBNZXJnZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVuKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VNZXJnZVdoZW4oeyBpc01hdGNoZWQ6IHRydWUgfSwgYXJncywgcmVmUmlnaHQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzaW1wbGUgYHdoZW4gbm90IG1hdGNoZWRgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBGb3IgYSBgd2hlbiBub3QgbWF0Y2hlZGAgY2xhdXNlIHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLCBzZWUge0BsaW5rIHdoZW5Ob3RNYXRjaGVkQW5kfS5cbiAgICAgKlxuICAgICAqIEZvciBhIHNpbXBsZSBgd2hlbiBtYXRjaGVkYCBjbGF1c2UsIHNlZSB7QGxpbmsgd2hlbk1hdGNoZWR9LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlIHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLCBzZWUge0BsaW5rIHdoZW5NYXRjaGVkQW5kfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTm90TWF0Y2hlZCgpXG4gICAgICogICAudGhlbkluc2VydFZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG5vdCBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIGluc2VydCAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIpIHZhbHVlcyAoJDEsICQyKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHdoZW5Ob3RNYXRjaGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoW10pO1xuICAgIH1cbiAgICB3aGVuTm90TWF0Y2hlZEFuZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3aGVuTm90TWF0Y2hlZChhcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYHdoZW4gbm90IG1hdGNoZWRgIGNsYXVzZSB0byB0aGUgcXVlcnkgd2l0aCBhbiBgYW5kYCBjb25kaXRpb24uIEJ1dCB1bmxpa2VcbiAgICAgKiB7QGxpbmsgd2hlbk5vdE1hdGNoZWRBbmR9LCB0aGlzIG1ldGhvZCBhY2NlcHRzIGEgY29sdW1uIHJlZmVyZW5jZSBhcyB0aGUgM3JkIGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogVW5saWtlIHtAbGluayB3aGVuTWF0Y2hlZEFuZFJlZn0sIHlvdSBjYW5ub3QgcmVmZXJlbmNlIGNvbHVtbnMgZnJvbSB0aGUgdGFyZ2V0IHRhYmxlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB7QGxpbmsgU2VsZWN0UXVlcnlCdWlsZGVyLndoZXJlUmVmfSwgc28gc2VlIHRoZSBkb2N1bWVudGF0aW9uXG4gICAgICogZm9yIHRoYXQgbWV0aG9kIGZvciBtb3JlIGV4YW1wbGVzLlxuICAgICAqL1xuICAgIHdoZW5Ob3RNYXRjaGVkQW5kUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoW2xocywgb3AsIHJoc10sIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2ltcGxlIGB3aGVuIG5vdCBtYXRjaGVkIGJ5IHNvdXJjZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFN1cHBvcnRlZCBpbiBNUyBTUUwgU2VydmVyLlxuICAgICAqXG4gICAgICogU2ltaWxhciB0byB7QGxpbmsgd2hlbk5vdE1hdGNoZWR9LCBidXQgcmV0dXJucyBhIHtAbGluayBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcn0uXG4gICAgICovXG4gICAgd2hlbk5vdE1hdGNoZWRCeVNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtdLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIHdoZW5Ob3RNYXRjaGVkQnlTb3VyY2VBbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoYXJncywgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBgd2hlbiBub3QgbWF0Y2hlZCBieSBzb3VyY2VgIGNsYXVzZSB0byB0aGUgcXVlcnkgd2l0aCBhbiBgYW5kYCBjb25kaXRpb24uXG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIHtAbGluayB3aGVuTm90TWF0Y2hlZEFuZFJlZn0sIGJ1dCB5b3UgY2FuIHJlZmVyZW5jZSBjb2x1bW5zIGZyb21cbiAgICAgKiB0aGUgdGFyZ2V0IHRhYmxlLCBhbmQgbm90IGZyb20gc291cmNlIHRhYmxlIGFuZCByZXR1cm5zIGEge0BsaW5rIE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyfS5cbiAgICAgKi9cbiAgICB3aGVuTm90TWF0Y2hlZEJ5U291cmNlQW5kUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoW2xocywgb3AsIHJoc10sIHRydWUsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm5pbmcoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nQWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICN3aGVuTm90TWF0Y2hlZChhcmdzLCByZWZSaWdodCA9IGZhbHNlLCBieVNvdXJjZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFdoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlV2hlbih7IGlzTWF0Y2hlZDogZmFsc2UsIGJ5U291cmNlIH0sIGFyZ3MsIHJlZlJpZ2h0KSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IEJ1aWxkZXIgPSBieVNvdXJjZVxuICAgICAgICAgICAgPyBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgOiBOb3RNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcjtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbmRpdGlvbmFsbHkgY2FsbCBhIG1ldGhvZCBvbiBgdGhpc2AsIHNlZVxuICAgICAqIHRoZSB7QGxpbmsgJGlmfSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFRoZSBuZXh0IGV4YW1wbGUgdXNlcyBhIGhlbHBlciBmdW5jdGlvbiBgbG9nYCB0byBsb2cgYSBxdWVyeTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBDb21waWxhYmxlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogZnVuY3Rpb24gbG9nPFQgZXh0ZW5kcyBDb21waWxhYmxlPihxYjogVCk6IFQge1xuICAgICAqICAgY29uc29sZS5sb2cocWIuY29tcGlsZSgpKVxuICAgICAqICAgcmV0dXJuIHFiXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgZmlyc3RfbmFtZTogJ0pvaG4nIH0pXG4gICAgICogICAuJGNhbGwobG9nKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgYGZ1bmModGhpcylgIGlmIGBjb25kaXRpb25gIGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlc3BlY2lhbGx5IGhhbmR5IHdpdGggb3B0aW9uYWwgc2VsZWN0cy4gQW55IGByZXR1cm5pbmdgIG9yIGByZXR1cm5pbmdBbGxgXG4gICAgICogbWV0aG9kIGNhbGxzIGFkZCBjb2x1bW5zIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGUgb3V0cHV0IHR5cGUgd2hlbiBjYWxsZWQgaW5zaWRlXG4gICAgICogdGhlIGBmdW5jYCBjYWxsYmFjay4gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhvc2Ugc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5XG4gICAgICogbWFkZSBiZWZvcmUgcnVubmluZyB0aGUgY29kZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBjYWxsIGFueSBvdGhlciBtZXRob2RzIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb25VcGRhdGUgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGVyc29uKGlkOiBudW1iZXIsIHVwZGF0ZXM6IFBlcnNvblVwZGF0ZSwgcmV0dXJuTGFzdE5hbWU6IGJvb2xlYW4pIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAgIC5zZXQodXBkYXRlcylcbiAgICAgKiAgICAgLndoZXJlKCdpZCcsICc9JywgaWQpXG4gICAgICogICAgIC5yZXR1cm5pbmcoWydpZCcsICdmaXJzdF9uYW1lJ10pXG4gICAgICogICAgIC4kaWYocmV0dXJuTGFzdE5hbWUsIChxYikgPT4gcWIucmV0dXJuaW5nKCdsYXN0X25hbWUnKSlcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbnkgc2VsZWN0aW9ucyBhZGRlZCBpbnNpZGUgdGhlIGBpZmAgY2FsbGJhY2sgd2lsbCBiZSBhZGRlZCBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlXG4gICAgICogb3V0cHV0IHR5cGUgc2luY2Ugd2UgY2FuJ3Qga25vdyBpZiB0aGUgc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5IG1hZGUgYmVmb3JlIHJ1bm5pbmdcbiAgICAgKiB0aGUgY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBgdXBkYXRlUGVyc29uYCBmdW5jdGlvbiBpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogUHJvbWlzZTx7XG4gICAgICogICBpZDogbnVtYmVyXG4gICAgICogICBmaXJzdF9uYW1lOiBzdHJpbmdcbiAgICAgKiAgIGxhc3RfbmFtZT86IHN0cmluZ1xuICAgICAqIH0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGlmKGNvbmRpdGlvbiwgZnVuYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHJvd3MuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3R9IGFuZCB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3d9IG1ldGhvZHMuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSk7XG4gICAgICAgIGNvbnN0IHsgYWRhcHRlciB9ID0gdGhpcy4jcHJvcHMuZXhlY3V0b3I7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gY29tcGlsZWRRdWVyeS5xdWVyeTtcbiAgICAgICAgaWYgKChxdWVyeS5yZXR1cm5pbmcgJiYgYWRhcHRlci5zdXBwb3J0c1JldHVybmluZykgfHxcbiAgICAgICAgICAgIChxdWVyeS5vdXRwdXQgJiYgYWRhcHRlci5zdXBwb3J0c091dHB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25ldyBNZXJnZVJlc3VsdChyZXN1bHQubnVtQWZmZWN0ZWRSb3dzKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHVuZGVmaW5lZCBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdCgpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdGhyb3dzIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vUmVzdWx0RXJyb3J9IGlzIHRocm93biwgYnV0IHlvdSBjYW5cbiAgICAgKiBwcm92aWRlIGEgY3VzdG9tIGVycm9yIGNsYXNzLCBvciBjYWxsYmFjayBhcyB0aGUgb25seSBhcmd1bWVudCB0byB0aHJvdyBhIGRpZmZlcmVudFxuICAgICAqIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBgZGVsZXRlYCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUbyBwZXJmb3JtIHRoZSBgZG8gbm90aGluZ2AgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5Eb05vdGhpbmd9LlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYHVwZGF0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5VcGRhdGV9IG9yIHtAbGluayB0aGVuVXBkYXRlU2V0fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRlbGV0ZSgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgZGVsZXRlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdGhlbkRlbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKCdkZWxldGUnKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYGRvIG5vdGhpbmdgIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgc3VwcG9ydGVkIGluIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiBUbyBwZXJmb3JtIHRoZSBgZGVsZXRlYCBhY3Rpb24sIHNlZSB7QGxpbmsgdGhlbkRlbGV0ZX0uXG4gICAgICpcbiAgICAgKiBUbyBwZXJmb3JtIHRoZSBgdXBkYXRlYCBhY3Rpb24sIHNlZSB7QGxpbmsgdGhlblVwZGF0ZX0gb3Ige0BsaW5rIHRoZW5VcGRhdGVTZXR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRG9Ob3RoaW5nKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkbyBub3RoaW5nXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdGhlbkRvTm90aGluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKCdkbyBub3RoaW5nJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBhbiBgdXBkYXRlYCBvcGVyYXRpb24gd2l0aCBhIGZ1bGwtZmxlZGdlZCB7QGxpbmsgVXBkYXRlUXVlcnlCdWlsZGVyfS5cbiAgICAgKiBUaGlzIGlzIGhhbmR5IHdoZW4gbXVsdGlwbGUgYHNldGAgaW52b2NhdGlvbnMgYXJlIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEZvciBhIHNob3J0aGFuZCB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kLCBzZWUge0BsaW5rIHRoZW5VcGRhdGVTZXR9LlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRlbGV0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5EZWxldGV9LlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRvIG5vdGhpbmdgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuRG9Ob3RoaW5nfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlblVwZGF0ZSgodWIpID0+IHViXG4gICAgICogICAgIC5zZXQoc3FsYG1ldGFkYXRhWydoYXNfcGV0cyddYCwgJ1knKVxuICAgICAqICAgICAuc2V0KHtcbiAgICAgKiAgICAgICB1cGRhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICogICAgIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgdXBkYXRlIHNldCBtZXRhZGF0YVsnaGFzX3BldHMnXSA9ICQxLCBcInVwZGF0ZWRfYXRcIiA9ICQyXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdGhlblVwZGF0ZShzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKHNldChuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBxdWVyeUlkOiB0aGlzLiNwcm9wcy5xdWVyeUlkLFxuICAgICAgICAgICAgICAgIGV4ZWN1dG9yOiBOT09QX1FVRVJZX0VYRUNVVE9SLFxuICAgICAgICAgICAgICAgIHF1ZXJ5Tm9kZTogVXBkYXRlUXVlcnlOb2RlLmNyZWF0ZVdpdGhvdXRUYWJsZSgpLFxuICAgICAgICAgICAgfSkpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0aGVuVXBkYXRlU2V0KC4uLmFyZ3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBub3Qgc3VyZSBob3cgdG8gdHlwZSB0aGlzIHNvIGl0IHdvbid0IGNvbXBsYWluIGFib3V0IHNldCguLi5hcmdzKS5cbiAgICAgICAgcmV0dXJuIHRoaXMudGhlblVwZGF0ZSgodWIpID0+IHViLnNldCguLi5hcmdzKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE5vdE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYGRvIG5vdGhpbmdgIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgc3VwcG9ydGVkIGluIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiBUbyBwZXJmb3JtIHRoZSBgaW5zZXJ0YCBhY3Rpb24sIHNlZSB7QGxpbmsgdGhlbkluc2VydFZhbHVlc30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk5vdE1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5Eb05vdGhpbmcoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBub3QgbWF0Y2hlZCB0aGVuXG4gICAgICogICBkbyBub3RoaW5nXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdGhlbkRvTm90aGluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKCdkbyBub3RoaW5nJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhlbkluc2VydFZhbHVlcyhpbnNlcnQpIHtcbiAgICAgICAgY29uc3QgW2NvbHVtbnMsIHZhbHVlc10gPSBwYXJzZUluc2VydEV4cHJlc3Npb24oaW5zZXJ0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgoSW5zZXJ0UXVlcnlOb2RlLmNyZWF0ZVdpdGhvdXRJbnRvKCksIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIH0pKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcXVlcnktY3JlYXRvci5kLnRzXCIgLz5cbmltcG9ydCB7IGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciwgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnlCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL2luc2VydC1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5QnVpbGRlciB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9kZWxldGUtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvdXBkYXRlLXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRGVsZXRlUXVlcnlOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS9kZWxldGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeU5vZGUgfSBmcm9tICcuL29wZXJhdGlvbi1ub2RlL2luc2VydC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5Tm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS91cGRhdGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCwgcGFyc2VBbGlhc2VkVGFibGUsIH0gZnJvbSAnLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uLCB9IGZyb20gJy4vcGFyc2VyL3dpdGgtcGFyc2VyLmpzJztcbmltcG9ydCB7IFdpdGhOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS93aXRoLW5vZGUuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlJZCB9IGZyb20gJy4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBXaXRoU2NoZW1hUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4vd2l0aC1zY2hlbWEvd2l0aC1zY2hlbWEtcGx1Z2luLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBcmcsIH0gZnJvbSAnLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBNZXJnZVF1ZXJ5QnVpbGRlciB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9tZXJnZS1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IE1lcmdlUXVlcnlOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS9tZXJnZS1xdWVyeS1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBRdWVyeUNyZWF0b3Ige1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgc2VsZWN0YCBxdWVyeSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gdGFibGUgb3IgdGFibGVzLlxuICAgICAqXG4gICAgICogVGhlIHRhYmxlcyBwYXNzZWQgdG8gdGhpcyBtZXRob2QgYXJlIGJ1aWx0IGFzIHRoZSBxdWVyeSdzIGBmcm9tYCBjbGF1c2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIHNlbGVjdCBxdWVyeSBmb3Igb25lIHRhYmxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3RBbGwoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0ICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBzZWxlY3QgcXVlcnkgZm9yIG9uZSB0YWJsZSB3aXRoIGFuIGFsaWFzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwZXJzb25zID0gYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uIGFzIHAnKVxuICAgICAqICAgLnNlbGVjdChbJ3AuaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocGVyc29uc1swXS5pZClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcInBcIi5cImlkXCIsIFwiZmlyc3RfbmFtZVwiIGZyb20gXCJwZXJzb25cIiBhcyBcInBcIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgc2VsZWN0IHF1ZXJ5IGZyb20gYSBzdWJxdWVyeTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcGVyc29ucyA9IGF3YWl0IGRiLnNlbGVjdEZyb20oXG4gICAgICogICAgIChlYikgPT4gZWIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KCdwZXJzb24uaWQgYXMgaWRlbnRpZmllcicpLmFzKCdwJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5zZWxlY3QoJ3AuaWRlbnRpZmllcicpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwZXJzb25zWzBdLmlkZW50aWZpZXIpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwXCIuXCJpZGVudGlmaWVyXCIsXG4gICAgICogZnJvbSAoXG4gICAgICogICBzZWxlY3QgXCJwZXJzb25cIi5cImlkXCIgYXMgXCJpZGVudGlmaWVyXCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogKSBhcyBwXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBzZWxlY3QgcXVlcnkgZnJvbSByYXcgc3FsOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGl0ZW1zID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKHNxbDx7IG9uZTogbnVtYmVyIH0+YChzZWxlY3QgMSBhcyBvbmUpYC5hcygncScpKVxuICAgICAqICAgLnNlbGVjdCgncS5vbmUnKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coaXRlbXNbMF0ub25lKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicVwiLlwib25lXCIsXG4gICAgICogZnJvbSAoXG4gICAgICogICBzZWxlY3QgMSBhcyBvbmVcbiAgICAgKiApIGFzIHFcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFdoZW4geW91IHVzZSB0aGUgYHNxbGAgdGFnIHlvdSBuZWVkIHRvIGFsc28gcHJvdmlkZSB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlXG4gICAgICogcmF3IHNuaXBwZXQgLyBxdWVyeSBzbyB0aGF0IEt5c2VseSBjYW4gZmlndXJlIG91dCB3aGF0IGNvbHVtbnMgYXJlXG4gICAgICogYXZhaWxhYmxlIGZvciB0aGUgcmVzdCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGUgYHNlbGVjdEZyb21gIG1ldGhvZCBhbHNvIGFjY2VwdHMgYW4gYXJyYXkgZm9yIG11bHRpcGxlIHRhYmxlcy4gQWxsXG4gICAgICogdGhlIGFib3ZlIGV4YW1wbGVzIGNhbiBhbHNvIGJlIHVzZWQgaW4gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgaXRlbXMgPSBhd2FpdCBkYi5zZWxlY3RGcm9tKFtcbiAgICAgKiAgICAgJ3BlcnNvbiBhcyBwJyxcbiAgICAgKiAgICAgZGIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0KCdwZXQuc3BlY2llcycpLmFzKCdhJyksXG4gICAgICogICAgIHNxbDx7IG9uZTogbnVtYmVyIH0+YChzZWxlY3QgMSBhcyBvbmUpYC5hcygncScpXG4gICAgICogICBdKVxuICAgICAqICAgLnNlbGVjdChbJ3AuaWQnLCAnYS5zcGVjaWVzJywgJ3Eub25lJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwXCIuaWQsIFwiYVwiLlwic3BlY2llc1wiLCBcInFcIi5cIm9uZVwiXG4gICAgICogZnJvbVxuICAgICAqICAgXCJwZXJzb25cIiBhcyBcInBcIixcbiAgICAgKiAgIChzZWxlY3QgXCJwZXRcIi5cInNwZWNpZXNcIiBmcm9tIFwicGV0XCIpIGFzIGEsXG4gICAgICogICAoc2VsZWN0IDEgYXMgb25lKSBhcyBcInFcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHNlbGVjdEZyb20oZnJvbSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNyZWF0ZUZyb20ocGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QoZnJvbSksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNlbGVjdE5vRnJvbShzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZWxlY3Rpb25zKFNlbGVjdFF1ZXJ5Tm9kZS5jcmVhdGUodGhpcy4jcHJvcHMud2l0aE5vZGUpLCBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIHF1ZXJ5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbnNlcnRSZXN1bHR9LiB7QGxpbmsgSW5zZXJ0UmVzdWx0fVxuICAgICAqIGhhcyB0aGUge0BsaW5rIEluc2VydFJlc3VsdC5pbnNlcnRJZCB8IGluc2VydElkfSBmaWVsZCB0aGF0IGhvbGRzIHRoZSBhdXRvIGluY3JlbWVudGVkIGlkIG9mXG4gICAgICogdGhlIGluc2VydGVkIHJvdyBpZiB0aGUgZGIgcmV0dXJuZWQgb25lLlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgSW5zZXJ0UXVlcnlCdWlsZGVyLnZhbHVlcyB8IHZhbHVlc30gbWV0aG9kIGZvciBtb3JlIGluZm8gYW5kIGV4YW1wbGVzLiBBbHNvIHNlZVxuICAgICAqIHRoZSB7QGxpbmsgUmV0dXJuaW5nSW50ZXJmYWNlLnJldHVybmluZyB8IHJldHVybmluZ30gbWV0aG9kIGZvciBhIHdheSB0byByZXR1cm4gY29sdW1uc1xuICAgICAqIG9uIHN1cHBvcnRlZCBkYXRhYmFzZXMgbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJ1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5pbnNlcnRJZClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNvbWUgZGF0YWJhc2VzIGxpa2UgUG9zdGdyZVNRTCBzdXBwb3J0IHRoZSBgcmV0dXJuaW5nYCBtZXRob2Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHsgaWQgfSA9IGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJ1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaW5zZXJ0SW50byh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jcmVhdGUocGFyc2VUYWJsZSh0YWJsZSksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBcInJlcGxhY2UgaW50b1wiIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTXlTUUwgb3IgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2ltaWxhciB0byBNeVNRTCdzIHtAbGluayBJbnNlcnRRdWVyeUJ1aWxkZXIub25EdXBsaWNhdGVLZXlVcGRhdGV9IHRoYXQgZGVsZXRlc1xuICAgICAqIGFuZCBpbnNlcnRzIHZhbHVlcyBvbiBjb2xsaXNpb24gaW5zdGVhZCBvZiB1cGRhdGluZyBleGlzdGluZyByb3dzLlxuICAgICAqXG4gICAgICogQW4gYWxpYXMgb2YgU1FMaXRlJ3Mge0BsaW5rIEluc2VydFF1ZXJ5QnVpbGRlci5vclJlcGxhY2V9LlxuICAgICAqXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIHF1ZXJ5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbnNlcnRSZXN1bHR9LiB7QGxpbmsgSW5zZXJ0UmVzdWx0fVxuICAgICAqIGhhcyB0aGUge0BsaW5rIEluc2VydFJlc3VsdC5pbnNlcnRJZCB8IGluc2VydElkfSBmaWVsZCB0aGF0IGhvbGRzIHRoZSBhdXRvIGluY3JlbWVudGVkIGlkIG9mXG4gICAgICogdGhlIGluc2VydGVkIHJvdyBpZiB0aGUgZGIgcmV0dXJuZWQgb25lLlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgSW5zZXJ0UXVlcnlCdWlsZGVyLnZhbHVlcyB8IHZhbHVlc30gbWV0aG9kIGZvciBtb3JlIGluZm8gYW5kIGV4YW1wbGVzLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAucmVwbGFjZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbidcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0Lmluc2VydElkKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHJlcGxhY2UgaW50byBgcGVyc29uYCAoYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCkgdmFsdWVzICg/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlcGxhY2VJbnRvKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSwgdGhpcy4jcHJvcHMud2l0aE5vZGUsIHRydWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZX0gbWV0aG9kIGZvciBleGFtcGxlcyBvbiBob3cgdG8gc3BlY2lmeVxuICAgICAqIGEgd2hlcmUgY2xhdXNlIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHF1ZXJ5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBEZWxldGVSZXN1bHR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiZGVsZXRlXCIsIFwiU2luZ2xlIHJvd1wiLCAxMCkgLS0+XG4gICAgICpcbiAgICAgKiBEZWxldGUgYSBzaW5nbGUgcm93OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAud2hlcmUoJ3BlcnNvbi5pZCcsICc9JywgMSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5udW1EZWxldGVkUm93cylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIFwicGVyc29uXCIgd2hlcmUgXCJwZXJzb25cIi5cImlkXCIgPSAkMVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU29tZSBkYXRhYmFzZXMgc3VjaCBhcyBNeVNRTCBzdXBwb3J0IGRlbGV0aW5nIGZyb20gbXVsdGlwbGUgdGFibGVzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oWydwZXJzb24nLCAncGV0J10pXG4gICAgICogICAudXNpbmcoJ3BlcnNvbicpXG4gICAgICogICAuaW5uZXJKb2luKCdwZXQnLCAncGV0Lm93bmVyX2lkJywgJ3BlcnNvbi5pZCcpXG4gICAgICogICAud2hlcmUoJ3BlcnNvbi5pZCcsICc9JywgMSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBgcGVyc29uYCwgYHBldGBcbiAgICAgKiB1c2luZyBgcGVyc29uYFxuICAgICAqIGlubmVyIGpvaW4gYHBldGAgb24gYHBldGAuYG93bmVyX2lkYCA9IGBwZXJzb25gLmBpZGBcbiAgICAgKiB3aGVyZSBgcGVyc29uYC5gaWRgID0gP1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRlbGV0ZUZyb20oZnJvbSkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IERlbGV0ZVF1ZXJ5Tm9kZS5jcmVhdGUocGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QoZnJvbSksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gdXBkYXRlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgVXBkYXRlUXVlcnlCdWlsZGVyLndoZXJlfSBtZXRob2QgZm9yIGV4YW1wbGVzIG9uIGhvdyB0byBzcGVjaWZ5XG4gICAgICogYSB3aGVyZSBjbGF1c2UgZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgVXBkYXRlUXVlcnlCdWlsZGVyLnNldH0gbWV0aG9kIGZvciBleGFtcGxlcyBvbiBob3cgdG9cbiAgICAgKiBzcGVjaWZ5IHRoZSB1cGRhdGVzLlxuICAgICAqXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcXVlcnkgaXMgYW4ge0BsaW5rIFVwZGF0ZVJlc3VsdH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQoeyBmaXJzdF9uYW1lOiAnSmVubmlmZXInIH0pXG4gICAgICogICAud2hlcmUoJ3BlcnNvbi5pZCcsICc9JywgMSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5udW1VcGRhdGVkUm93cylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB1cGRhdGVUYWJsZSh0YWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBVcGRhdGVRdWVyeU5vZGUuY3JlYXRlKHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KHRhYmxlcyksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtZXJnZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHF1ZXJ5IGlzIGEge0BsaW5rIE1lcmdlUmVzdWx0fS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIE1lcmdlUXVlcnlCdWlsZGVyLnVzaW5nfSBtZXRob2QgZm9yIGV4YW1wbGVzIG9uIGhvdyB0byBzcGVjaWZ5XG4gICAgICogdGhlIG90aGVyIHRhYmxlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwibWVyZ2VcIiwgXCJTb3VyY2Ugcm93IGV4aXN0ZW5jZVwiLCAxMCkgLS0+XG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSB0YXJnZXQgY29sdW1uIGJhc2VkIG9uIHRoZSBleGlzdGVuY2Ugb2YgYSBzb3VyY2Ugcm93OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLm1lcmdlSW50bygncGVyc29uIGFzIHRhcmdldCcpXG4gICAgICogICAudXNpbmcoJ3BldCBhcyBzb3VyY2UnLCAnc291cmNlLm93bmVyX2lkJywgJ3RhcmdldC5pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWRBbmQoJ3RhcmdldC5oYXNfcGV0cycsICchPScsICdZJylcbiAgICAgKiAgIC50aGVuVXBkYXRlU2V0KHsgaGFzX3BldHM6ICdZJyB9KVxuICAgICAqICAgLndoZW5Ob3RNYXRjaGVkQnlTb3VyY2VBbmQoJ3RhcmdldC5oYXNfcGV0cycsICc9JywgJ1knKVxuICAgICAqICAgLnRoZW5VcGRhdGVTZXQoeyBoYXNfcGV0czogJ04nIH0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0Lm51bUNoYW5nZWRSb3dzKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIlxuICAgICAqIG9uIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgYW5kIFwiaGFzX3BldHNcIiAhPSAkMVxuICAgICAqIHRoZW4gdXBkYXRlIHNldCBcImhhc19wZXRzXCIgPSAkMlxuICAgICAqIHdoZW4gbm90IG1hdGNoZWQgYnkgc291cmNlIGFuZCBcImhhc19wZXRzXCIgPSAkM1xuICAgICAqIHRoZW4gdXBkYXRlIHNldCBcImhhc19wZXRzXCIgPSAkNFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcIm1lcmdlXCIsIFwiVGVtcG9yYXJ5IGNoYW5nZXMgdGFibGVcIiwgMjApIC0tPlxuICAgICAqXG4gICAgICogTWVyZ2UgbmV3IGVudHJpZXMgZnJvbSBhIHRlbXBvcmFyeSBjaGFuZ2VzIHRhYmxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLm1lcmdlSW50bygnd2luZSBhcyB0YXJnZXQnKVxuICAgICAqICAgLnVzaW5nKFxuICAgICAqICAgICAnd2luZV9zdG9ja19jaGFuZ2UgYXMgc291cmNlJyxcbiAgICAgKiAgICAgJ3NvdXJjZS53aW5lX25hbWUnLFxuICAgICAqICAgICAndGFyZ2V0Lm5hbWUnLFxuICAgICAqICAgKVxuICAgICAqICAgLndoZW5Ob3RNYXRjaGVkQW5kKCdzb3VyY2Uuc3RvY2tfZGVsdGEnLCAnPicsIDApXG4gICAgICogICAudGhlbkluc2VydFZhbHVlcygoeyByZWYgfSkgPT4gKHtcbiAgICAgKiAgICAgbmFtZTogcmVmKCdzb3VyY2Uud2luZV9uYW1lJyksXG4gICAgICogICAgIHN0b2NrOiByZWYoJ3NvdXJjZS5zdG9ja19kZWx0YScpLFxuICAgICAqICAgfSkpXG4gICAgICogICAud2hlbk1hdGNoZWRBbmQoXG4gICAgICogICAgIChlYikgPT4gZWIoJ3RhcmdldC5zdG9jaycsICcrJywgZWIucmVmKCdzb3VyY2Uuc3RvY2tfZGVsdGEnKSksXG4gICAgICogICAgICc+JyxcbiAgICAgKiAgICAgMCxcbiAgICAgKiAgIClcbiAgICAgKiAgIC50aGVuVXBkYXRlU2V0KCdzdG9jaycsIChlYikgPT5cbiAgICAgKiAgICAgZWIoJ3RhcmdldC5zdG9jaycsICcrJywgZWIucmVmKCdzb3VyY2Uuc3RvY2tfZGVsdGEnKSksXG4gICAgICogICApXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJ3aW5lXCIgYXMgXCJ0YXJnZXRcIlxuICAgICAqIHVzaW5nIFwid2luZV9zdG9ja19jaGFuZ2VcIiBhcyBcInNvdXJjZVwiXG4gICAgICogb24gXCJzb3VyY2VcIi5cIndpbmVfbmFtZVwiID0gXCJ0YXJnZXRcIi5cIm5hbWVcIlxuICAgICAqIHdoZW4gbm90IG1hdGNoZWQgYW5kIFwic291cmNlXCIuXCJzdG9ja19kZWx0YVwiID4gJDFcbiAgICAgKiB0aGVuIGluc2VydCAoXCJuYW1lXCIsIFwic3RvY2tcIikgdmFsdWVzIChcInNvdXJjZVwiLlwid2luZV9uYW1lXCIsIFwic291cmNlXCIuXCJzdG9ja19kZWx0YVwiKVxuICAgICAqIHdoZW4gbWF0Y2hlZCBhbmQgXCJ0YXJnZXRcIi5cInN0b2NrXCIgKyBcInNvdXJjZVwiLlwic3RvY2tfZGVsdGFcIiA+ICQyXG4gICAgICogdGhlbiB1cGRhdGUgc2V0IFwic3RvY2tcIiA9IFwidGFyZ2V0XCIuXCJzdG9ja1wiICsgXCJzb3VyY2VcIi5cInN0b2NrX2RlbHRhXCJcbiAgICAgKiB3aGVuIG1hdGNoZWRcbiAgICAgKiB0aGVuIGRlbGV0ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1lcmdlSW50byh0YXJnZXRUYWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY3JlYXRlKHBhcnNlQWxpYXNlZFRhYmxlKHRhcmdldFRhYmxlKSwgdGhpcy4jcHJvcHMud2l0aE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGB3aXRoYCBxdWVyeSAoQ29tbW9uIFRhYmxlIEV4cHJlc3Npb24pLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiY3RlXCIsIFwiU2ltcGxlIHNlbGVjdHNcIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogQ29tbW9uIHRhYmxlIGV4cHJlc3Npb25zIChDVEUpIGFyZSBhIGdyZWF0IHdheSB0byBtb2R1bGFyaXplIGNvbXBsZXggcXVlcmllcy5cbiAgICAgKiBFc3NlbnRpYWxseSB0aGV5IGFsbG93IHlvdSB0byBydW4gbXVsdGlwbGUgc2VwYXJhdGUgcXVlcmllcyB3aXRoaW4gYVxuICAgICAqIHNpbmdsZSByb3VuZHRyaXAgdG8gdGhlIERCLlxuICAgICAqXG4gICAgICogU2luY2UgQ1RFcyBhcmUgYSBwYXJ0IG9mIHRoZSBtYWluIHF1ZXJ5LCBxdWVyeSBvcHRpbWl6ZXJzIGluc2lkZSBEQlxuICAgICAqIGVuZ2luZXMgYXJlIGFibGUgdG8gb3B0aW1pemUgdGhlIG92ZXJhbGwgcXVlcnkuIEZvciBleGFtcGxlLCBwb3N0Z3Jlc1xuICAgICAqIGlzIGFibGUgdG8gaW5saW5lIHRoZSBDVEVzIGluc2lkZSB0aGUgdXNpbmcgcXVlcmllcyBpZiBpdCBkZWNpZGVzIGl0J3NcbiAgICAgKiBmYXN0ZXIuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAvLyBDcmVhdGUgYSBDVEUgY2FsbGVkIGBqZW5uaWZlcnNgIHRoYXQgc2VsZWN0cyBhbGxcbiAgICAgKiAgIC8vIHBlcnNvbnMgbmFtZWQgJ0plbm5pZmVyJy5cbiAgICAgKiAgIC53aXRoKCdqZW5uaWZlcnMnLCAoZGIpID0+IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKZW5uaWZlcicpXG4gICAgICogICAgIC5zZWxlY3QoWydpZCcsICdhZ2UnXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC8vIFNlbGVjdCBhbGwgcm93cyBmcm9tIHRoZSBgamVubmlmZXJzYCBDVEUgYW5kXG4gICAgICogICAvLyBmdXJ0aGVyIGZpbHRlciBpdC5cbiAgICAgKiAgIC53aXRoKCdhZHVsdF9qZW5uaWZlcnMnLCAoZGIpID0+IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdqZW5uaWZlcnMnKVxuICAgICAqICAgICAud2hlcmUoJ2FnZScsICc+JywgMTgpXG4gICAgICogICAgIC5zZWxlY3QoWydpZCcsICdhZ2UnXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC8vIEZpbmFsbHkgc2VsZWN0IGFsbCBhZHVsdCBqZW5uaWZlcnMgdGhhdCBhcmVcbiAgICAgKiAgIC8vIGFsc28geW91bmdlciB0aGFuIDYwLlxuICAgICAqICAgLnNlbGVjdEZyb20oJ2FkdWx0X2plbm5pZmVycycpXG4gICAgICogICAud2hlcmUoJ2FnZScsICc8JywgNjApXG4gICAgICogICAuc2VsZWN0QWxsKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJjdGVcIiwgXCJJbnNlcnRzLCB1cGRhdGVzIGFuZCBkZWxldGlvbnNcIiwgMjApIC0tPlxuICAgICAqXG4gICAgICogU29tZSBkYXRhYmFzZXMgbGlrZSBwb3N0Z3JlcyBhbHNvIGFsbG93IHlvdSB0byBydW4gb3RoZXIgcXVlcmllcyB0aGFuIHNlbGVjdHNcbiAgICAgKiBpbiBDVEVzLiBPbiB0aGVzZSBkYXRhYmFzZXMgQ1RFcyBhcmUgZXh0cmVtZWx5IHBvd2VyZnVsOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLndpdGgoJ25ld19wZXJzb24nLCAoZGIpID0+IGRiXG4gICAgICogICAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICAgIGFnZTogMzUsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC53aXRoKCduZXdfcGV0JywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgbmFtZTogJ0RvZ2dvJyxcbiAgICAgKiAgICAgICBzcGVjaWVzOiAnZG9nJyxcbiAgICAgKiAgICAgICBpc19mYXZvcml0ZTogdHJ1ZSxcbiAgICAgKiAgICAgICAvLyBVc2UgdGhlIGlkIG9mIHRoZSBwZXJzb24gd2UganVzdCBpbnNlcnRlZC5cbiAgICAgKiAgICAgICBvd25lcl9pZDogZGJcbiAgICAgKiAgICAgICAgIC5zZWxlY3RGcm9tKCduZXdfcGVyc29uJylcbiAgICAgKiAgICAgICAgIC5zZWxlY3QoJ2lkJylcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgKVxuICAgICAqICAgLnNlbGVjdEZyb20oWyduZXdfcGVyc29uJywgJ25ld19wZXQnXSlcbiAgICAgKiAgIC5zZWxlY3QoW1xuICAgICAqICAgICAnbmV3X3BlcnNvbi5pZCBhcyBwZXJzb25faWQnLFxuICAgICAqICAgICAnbmV3X3BldC5pZCBhcyBwZXRfaWQnXG4gICAgICogICBdKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIENURSBuYW1lIGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgY29sdW1uIG5hbWVzIGluIGFkZGl0aW9uIHRvXG4gICAgICogYSBuYW1lLiBJbiB0aGF0IGNhc2UgS3lzZWx5IHJlcXVpcmVzIHRoZSBleHByZXNzaW9uIHRvIHJldHVuXG4gICAgICogcm93cyB3aXRoIHRoZSBzYW1lIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAud2l0aCgnamVubmlmZXJzKGlkLCBhZ2UpJywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSmVubmlmZXInKVxuICAgICAqICAgICAvLyBUaGlzIGlzIG9rIHNpbmNlIHdlIHJldHVybiBjb2x1bW5zIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgLy8gbmFtZXMgYXMgc3BlY2lmaWVkIGJ5IGBqZW5uaWZlcnMoaWQsIGFnZSlgLlxuICAgICAqICAgICAuc2VsZWN0KFsnaWQnLCAnYWdlJ10pXG4gICAgICogICApXG4gICAgICogICAuc2VsZWN0RnJvbSgnamVubmlmZXJzJylcbiAgICAgKiAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBhbHNvIGJlIGEgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBpcyBwYXNzZWRcbiAgICAgKiBhIGBDVEVCdWlsZGVyYCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgQ1RFOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLndpdGgoXG4gICAgICogICAgIChjdGUpID0+IGN0ZSgnamVubmlmZXJzJykubWF0ZXJpYWxpemVkKCksXG4gICAgICogICAgIChkYikgPT4gZGJcbiAgICAgKiAgICAgICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKZW5uaWZlcicpXG4gICAgICogICAgICAgLnNlbGVjdChbJ2lkJywgJ2FnZSddKVxuICAgICAqICAgKVxuICAgICAqICAgLnNlbGVjdEZyb20oJ2plbm5pZmVycycpXG4gICAgICogICAuc2VsZWN0QWxsKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aXRoKG5hbWVPckJ1aWxkZXIsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgY29uc3QgY3RlID0gcGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb24obmFtZU9yQnVpbGRlciwgZXhwcmVzc2lvbik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgd2l0aE5vZGU6IHRoaXMuI3Byb3BzLndpdGhOb2RlXG4gICAgICAgICAgICAgICAgPyBXaXRoTm9kZS5jbG9uZVdpdGhFeHByZXNzaW9uKHRoaXMuI3Byb3BzLndpdGhOb2RlLCBjdGUpXG4gICAgICAgICAgICAgICAgOiBXaXRoTm9kZS5jcmVhdGUoY3RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZWN1cnNpdmUgYHdpdGhgIHF1ZXJ5IChDb21tb24gVGFibGUgRXhwcmVzc2lvbikuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgcmVjdXJzaXZlbmVzcyBpcyBhIHByb3BlcnR5IG9mIHRoZSB3aG9sZSBgd2l0aGAgc3RhdGVtZW50LlxuICAgICAqIFlvdSBjYW5ub3QgaGF2ZSByZWN1cnNpdmUgYW5kIG5vbi1yZWN1cnNpdmUgQ1RFcyBpbiBhIHNhbWUgYHdpdGhgIHN0YXRlbWVudC5cbiAgICAgKiBUaGVyZWZvcmUgdGhlIHJlY3Vyc2l2ZW5lc3MgaXMgZGV0ZXJtaW5lZCBieSB0aGUgKipmaXJzdCoqIGB3aXRoYCBvclxuICAgICAqIGB3aXRoUmVjdXNpdmVgIGNhbGwgeW91IG1ha2UuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayB3aXRofSBtZXRob2QgZm9yIGV4YW1wbGVzIGFuZCBtb3JlIGRvY3VtZW50YXRpb24uXG4gICAgICovXG4gICAgd2l0aFJlY3Vyc2l2ZShuYW1lT3JCdWlsZGVyLCBleHByZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGN0ZSA9IHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uKG5hbWVPckJ1aWxkZXIsIGV4cHJlc3Npb24pO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5Q3JlYXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHdpdGhOb2RlOiB0aGlzLiNwcm9wcy53aXRoTm9kZVxuICAgICAgICAgICAgICAgID8gV2l0aE5vZGUuY2xvbmVXaXRoRXhwcmVzc2lvbih0aGlzLiNwcm9wcy53aXRoTm9kZSwgY3RlKVxuICAgICAgICAgICAgICAgIDogV2l0aE5vZGUuY3JlYXRlKGN0ZSwgeyByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHF1ZXJ5IGNyZWF0b3IgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5Q3JlYXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHF1ZXJ5IGNyZWF0b3IgaW5zdGFuY2Ugd2l0aG91dCBhbnkgcGx1Z2lucy5cbiAgICAgKi9cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aG91dFBsdWdpbnMoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNjaGVtYSB0byBiZSB1c2VkIGZvciBhbGwgdGFibGUgcmVmZXJlbmNlcyB0aGF0IGRvbid0IGV4cGxpY2l0bHlcbiAgICAgKiBzcGVjaWZ5IGEgc2NoZW1hLlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IGFmZmVjdHMgdGhlIHF1ZXJ5IGNyZWF0ZWQgdGhyb3VnaCB0aGUgYnVpbGRlciByZXR1cm5lZCBmcm9tXG4gICAgICogdGhpcyBtZXRob2QgYW5kIGRvZXNuJ3QgbW9kaWZ5IHRoZSBgZGJgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogU2VlIFt0aGlzIHJlY2lwZV0oaHR0cHM6Ly9naXRodWIuY29tL2t5c2VseS1vcmcva3lzZWx5L2Jsb2IvbWFzdGVyL3NpdGUvZG9jcy9yZWNpcGVzLzAwMDctc2NoZW1hcy5tZClcbiAgICAgKiBmb3IgYSBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLndpdGhTY2hlbWEoJ21hbW1hbHMnKVxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BldCcpXG4gICAgICogICAuc2VsZWN0QWxsKClcbiAgICAgKiAgIC5pbm5lckpvaW4oJ3B1YmxpYy5wZXJzb24nLCAncHVibGljLnBlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0ICogZnJvbSBcIm1hbW1hbHNcIi5cInBldFwiXG4gICAgICogaW5uZXIgam9pbiBcInB1YmxpY1wiLlwicGVyc29uXCJcbiAgICAgKiBvbiBcInB1YmxpY1wiLlwicGVyc29uXCIuXCJpZFwiID0gXCJtYW1tYWxzXCIuXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGB3aXRoU2NoZW1hYCBpcyBzbWFydCBlbm91Z2ggdG8gbm90IGFkZCBzY2hlbWEgZm9yIGFsaWFzZXMsXG4gICAgICogY29tbW9uIHRhYmxlIGV4cHJlc3Npb25zIG9yIG90aGVyIHBsYWNlcyB3aGVyZSB0aGUgc2NoZW1hXG4gICAgICogZG9lc24ndCBiZWxvbmcgdG86XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLndpdGhTY2hlbWEoJ21hbW1hbHMnKVxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BldCBhcyBwJylcbiAgICAgKiAgIC5zZWxlY3QoJ3AubmFtZScpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwXCIuXCJuYW1lXCIgZnJvbSBcIm1hbW1hbHNcIi5cInBldFwiIGFzIFwicFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgd2l0aFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQobmV3IFdpdGhTY2hlbWFQbHVnaW4oc2NoZW1hKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcGFyc2UtdXRpbHMuZC50c1wiIC8+XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBPdmVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL292ZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBKb2luQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvam9pbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IE92ZXJCdWlsZGVyIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9vdmVyLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyIGFzIG5ld1NlbGVjdFF1ZXJ5QnVpbGRlciwgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL3NlbGVjdC1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFF1ZXJ5Q3JlYXRvciB9IGZyb20gJy4uL3F1ZXJ5LWNyZWF0b3IuanMnO1xuaW1wb3J0IHsgTk9PUF9RVUVSWV9FWEVDVVRPUiB9IGZyb20gJy4uL3F1ZXJ5LWV4ZWN1dG9yL25vb3AtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlJZCB9IGZyb20gJy4uL3V0aWwvcXVlcnktaWQuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb24sIHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4vdGFibGUtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIG5ld1NlbGVjdFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgZXhlY3V0b3I6IE5PT1BfUVVFUllfRVhFQ1VUT1IsXG4gICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNyZWF0ZUZyb20ocGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QoW10pKSxcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdWVyeUNyZWF0b3IoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICBleGVjdXRvcjogTk9PUF9RVUVSWV9FWEVDVVRPUixcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKb2luQnVpbGRlcihqb2luVHlwZSwgdGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEpvaW5CdWlsZGVyKHtcbiAgICAgICAgam9pbk5vZGU6IEpvaW5Ob2RlLmNyZWF0ZShqb2luVHlwZSwgcGFyc2VUYWJsZUV4cHJlc3Npb24odGFibGUpKSxcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPdmVyQnVpbGRlcigpIHtcbiAgICByZXR1cm4gbmV3IE92ZXJCdWlsZGVyKHtcbiAgICAgICAgb3Zlck5vZGU6IE92ZXJOb2RlLmNyZWF0ZSgpLFxuICAgIH0pO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qb2luLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IEpvaW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvam9pbi1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24gfSBmcm9tICcuL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUpvaW5CdWlsZGVyIH0gZnJvbSAnLi9wYXJzZS11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlRXhwcmVzc2lvbiwgfSBmcm9tICcuL3RhYmxlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VKb2luKGpvaW5UeXBlLCBhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVNpbmdsZU9uSm9pbihqb2luVHlwZSwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUNhbGxiYWNrSm9pbihqb2luVHlwZSwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBwYXJzZU9ubGVzc0pvaW4oam9pblR5cGUsIGFyZ3NbMF0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZUNhbGxiYWNrSm9pbihqb2luVHlwZSwgZnJvbSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlSm9pbkJ1aWxkZXIoam9pblR5cGUsIGZyb20pKS50b09wZXJhdGlvbk5vZGUoKTtcbn1cbmZ1bmN0aW9uIHBhcnNlU2luZ2xlT25Kb2luKGpvaW5UeXBlLCBmcm9tLCBsaHNDb2x1bW4sIHJoc0NvbHVtbikge1xuICAgIHJldHVybiBKb2luTm9kZS5jcmVhdGVXaXRoT24oam9pblR5cGUsIHBhcnNlVGFibGVFeHByZXNzaW9uKGZyb20pLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxoc0NvbHVtbiwgJz0nLCByaHNDb2x1bW4pKTtcbn1cbmZ1bmN0aW9uIHBhcnNlT25sZXNzSm9pbihqb2luVHlwZSwgZnJvbSkge1xuICAgIHJldHVybiBKb2luTm9kZS5jcmVhdGUoam9pblR5cGUsIHBhcnNlVGFibGVFeHByZXNzaW9uKGZyb20pKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb2Zmc2V0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT2Zmc2V0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT2Zmc2V0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09mZnNldE5vZGUnLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2dyb3VwLWJ5LWl0ZW0tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBHcm91cEJ5SXRlbU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0dyb3VwQnlJdGVtTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZ3JvdXBCeSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHcm91cEJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgZ3JvdXBCeSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9ncm91cC1ieS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBHcm91cEJ5SXRlbU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9ncm91cC1ieS1pdGVtLW5vZGUuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR3JvdXBCeShncm91cEJ5KSB7XG4gICAgZ3JvdXBCeSA9IGlzRnVuY3Rpb24oZ3JvdXBCeSkgPyBncm91cEJ5KGV4cHJlc3Npb25CdWlsZGVyKCkpIDogZ3JvdXBCeTtcbiAgICByZXR1cm4gcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0KGdyb3VwQnkpLm1hcChHcm91cEJ5SXRlbU5vZGUuY3JlYXRlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2V0LW9wZXJhdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFNldE9wZXJhdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1NldE9wZXJhdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9wZXJhdG9yLCBleHByZXNzaW9uLCBhbGwpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2V0T3BlcmF0aW9uTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICBhbGwsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2V0LW9wZXJhdGlvbi1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBjcmVhdGVFeHByZXNzaW9uQnVpbGRlciwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBTZXRPcGVyYXRpb25Ob2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NldC1vcGVyYXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc1JlYWRvbmx5QXJyYXkgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24gfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNldE9wZXJhdGlvbnMob3BlcmF0b3IsIGV4cHJlc3Npb24sIGFsbCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uKGNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyKCkpO1xuICAgIH1cbiAgICBpZiAoIWlzUmVhZG9ubHlBcnJheShleHByZXNzaW9uKSkge1xuICAgICAgICBleHByZXNzaW9uID0gW2V4cHJlc3Npb25dO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcmVzc2lvbi5tYXAoKGV4cHIpID0+IFNldE9wZXJhdGlvbk5vZGUuY3JlYXRlKG9wZXJhdG9yLCBwYXJzZUV4cHJlc3Npb24oZXhwciksIGFsbCkpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHByZXNzaW9uLXdyYXBwZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBQYXJlbnNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcGFyZW5zLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25XcmFwcGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEV4cHJlc3Npb25XcmFwcGVyKHRoaXMsIGFsaWFzKTtcbiAgICB9XG4gICAgb3IoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE9yV3JhcHBlcihPck5vZGUuY3JlYXRlKHRoaXMuI25vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKTtcbiAgICB9XG4gICAgYW5kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmRXcmFwcGVyKEFuZE5vZGUuY3JlYXRlKHRoaXMuI25vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgRXhwcmVzc2lvbldyYXBwZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT21pdCBudWxsIGZyb20gdGhlIGV4cHJlc3Npb24ncyB0eXBlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIGluIGNhc2VzIHdoZXJlIHlvdSBrbm93IGFuIGV4cHJlc3Npb24gY2FuJ3QgYmVcbiAgICAgKiBudWxsLCBidXQgS3lzZWx5IGlzIHVuYWJsZSB0byBpbmZlciBpdC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgYHRoaXNgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJG5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFsaWFzZWRFeHByZXNzaW9uV3JhcHBlciB7XG4gICAgI2V4cHI7XG4gICAgI2FsaWFzO1xuICAgIGNvbnN0cnVjdG9yKGV4cHIsIGFsaWFzKSB7XG4gICAgICAgIHRoaXMuI2V4cHIgPSBleHByO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4cHI7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsaWFzO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHRoaXMuI2V4cHIudG9PcGVyYXRpb25Ob2RlKCksIGlzT3BlcmF0aW9uTm9kZVNvdXJjZSh0aGlzLiNhbGlhcylcbiAgICAgICAgICAgID8gdGhpcy4jYWxpYXMudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgICAgIDogSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE9yV3JhcHBlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb25UeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBhcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IEFsaWFzZWRFeHByZXNzaW9uV3JhcHBlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcldyYXBwZXIoT3JOb2RlLmNyZWF0ZSh0aGlzLiNub2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYE9yV3JhcHBlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9yV3JhcHBlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gUGFyZW5zTm9kZS5jcmVhdGUodGhpcy4jbm9kZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFuZFdyYXBwZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIodGhpcywgYWxpYXMpO1xuICAgIH1cbiAgICBhbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IEFuZFdyYXBwZXIoQW5kTm9kZS5jcmVhdGUodGhpcy4jbm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBBbmRXcmFwcGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5kV3JhcHBlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gUGFyZW5zTm9kZS5jcmVhdGUodGhpcy4jbm9kZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mZXRjaC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi92YWx1ZS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBGZXRjaE5vZGUgPSB7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRmV0Y2hOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShyb3dDb3VudCwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6ICdGZXRjaE5vZGUnLFxuICAgICAgICAgICAgcm93Q291bnQ6IFZhbHVlTm9kZS5jcmVhdGUocm93Q291bnQpLFxuICAgICAgICAgICAgbW9kaWZpZXIsXG4gICAgICAgIH07XG4gICAgfSxcbn07XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ZldGNoLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IEZldGNoTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZldGNoLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNCaWdJbnQsIGlzTnVtYmVyIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmV0Y2gocm93Q291bnQsIG1vZGlmaWVyKSB7XG4gICAgaWYgKCFpc051bWJlcihyb3dDb3VudCkgJiYgIWlzQmlnSW50KHJvd0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmV0Y2ggcm93IGNvdW50OiAke3Jvd0NvdW50fWApO1xuICAgIH1cbiAgICBpZiAoIWlzRmV0Y2hNb2RpZmllcihtb2RpZmllcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZldGNoIG1vZGlmaWVyOiAke21vZGlmaWVyfWApO1xuICAgIH1cbiAgICByZXR1cm4gRmV0Y2hOb2RlLmNyZWF0ZShyb3dDb3VudCwgbW9kaWZpZXIpO1xufVxuZnVuY3Rpb24gaXNGZXRjaE1vZGlmaWVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnb25seScgfHwgdmFsdWUgPT09ICd3aXRoIHRpZXMnO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0TW9kaWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LW1vZGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VKb2luLCB9IGZyb20gJy4uL3BhcnNlci9qb2luLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgcGFyc2VTZWxlY3RBbGwsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4uL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTGltaXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbGltaXQtbm9kZS5qcyc7XG5pbXBvcnQgeyBPZmZzZXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb2Zmc2V0LW5vZGUuanMnO1xuaW1wb3J0IHsgYXNBcnJheSwgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VHcm91cEJ5IH0gZnJvbSAnLi4vcGFyc2VyL2dyb3VwLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgTm9SZXN1bHRFcnJvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNldE9wZXJhdGlvbnMsIH0gZnJvbSAnLi4vcGFyc2VyL3NldC1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUZldGNoIH0gZnJvbSAnLi4vcGFyc2VyL2ZldGNoLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmNsYXNzIFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IGlzU2VsZWN0UXVlcnlCdWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhdmluZyguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aEhhdmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGF2aW5nUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhIYXZpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VsZWN0KHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZWxlY3Rpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXN0aW5jdE9uKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhEaXN0aW5jdE9uKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0KHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbW9kaWZ5RnJvbnQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRnJvbnRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGVXaXRoRXhwcmVzc2lvbihtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZVdpdGhFeHByZXNzaW9uKG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRnJvbnRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0Rpc3RpbmN0JykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yVXBkYXRlKG9mKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnRm9yVXBkYXRlJywgb2YgPyBhc0FycmF5KG9mKS5tYXAocGFyc2VUYWJsZSkgOiB1bmRlZmluZWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvclNoYXJlKG9mKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnRm9yU2hhcmUnLCBvZiA/IGFzQXJyYXkob2YpLm1hcChwYXJzZVRhYmxlKSA6IHVuZGVmaW5lZCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yS2V5U2hhcmUob2YpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdGb3JLZXlTaGFyZScsIG9mID8gYXNBcnJheShvZikubWFwKHBhcnNlVGFibGUpIDogdW5kZWZpbmVkKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3JOb0tleVVwZGF0ZShvZikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0Zvck5vS2V5VXBkYXRlJywgb2YgPyBhc0FycmF5KG9mKS5tYXAocGFyc2VUYWJsZSkgOiB1bmRlZmluZWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNraXBMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnU2tpcExvY2tlZCcpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vV2FpdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdOb1dhaXQnKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZWxlY3RBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2VsZWN0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbm5lckpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignSW5uZXJKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGxlZnRKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xlZnRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIHJpZ2h0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdSaWdodEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgZnVsbEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignRnVsbEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgY3Jvc3NKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0Nyb3NzSm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBpbm5lckpvaW5MYXRlcmFsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xhdGVyYWxJbm5lckpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgbGVmdEpvaW5MYXRlcmFsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xhdGVyYWxMZWZ0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBjcm9zc0pvaW5MYXRlcmFsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xhdGVyYWxDcm9zc0pvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgY3Jvc3NBcHBseSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdDcm9zc0FwcGx5JywgYXJncyk7XG4gICAgfVxuICAgIG91dGVyQXBwbHkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignT3V0ZXJBcHBseScsIGFyZ3MpO1xuICAgIH1cbiAgICAjam9pbihqb2luVHlwZSwgYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhKb2luKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VKb2luKGpvaW5UeXBlLCBhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VPcmRlckJ5KGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdyb3VwQnkoZ3JvdXBCeSkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhHcm91cEJ5SXRlbXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUdyb3VwQnkoZ3JvdXBCeSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGltaXQobGltaXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoTGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBMaW1pdE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKGxpbWl0KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb2Zmc2V0KG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPZmZzZXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBPZmZzZXROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihvZmZzZXQpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmZXRjaChyb3dDb3VudCwgbW9kaWZpZXIgPSAnb25seScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRmV0Y2godGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUZldGNoKHJvd0NvdW50LCBtb2RpZmllcikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhUb3AodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygndW5pb24nLCBleHByZXNzaW9uLCBmYWxzZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdW5pb25BbGwoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCd1bmlvbicsIGV4cHJlc3Npb24sIHRydWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludGVyc2VjdChleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNldE9wZXJhdGlvbnModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNldE9wZXJhdGlvbnMoJ2ludGVyc2VjdCcsIGV4cHJlc3Npb24sIGZhbHNlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnRlcnNlY3RBbGwoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCdpbnRlcnNlY3QnLCBleHByZXNzaW9uLCB0cnVlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBleGNlcHQoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCdleGNlcHQnLCBleHByZXNzaW9uLCBmYWxzZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXhjZXB0QWxsKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygnZXhjZXB0JywgZXhwcmVzc2lvbiwgdHJ1ZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIGNsZWFyU2VsZWN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRTZWxlY3Rpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJMaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRob3V0TGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPZmZzZXQodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT3JkZXJCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJHcm91cEJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRHcm91cEJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAkaWYoY29uZGl0aW9uLCBmdW5jKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgICRuYXJyb3dUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAkYXNzZXJ0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgJGFzVHVwbGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgfVxuICAgICRhc1NjYWxhcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjaHVua1NpemUgPSAxMDApIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLiNwcm9wcy5leGVjdXRvci5zdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHN0cmVhbSkge1xuICAgICAgICAgICAgeWllbGQqIGl0ZW0ucm93cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBleHBsYWluKGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFeHBsYWluKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgZm9ybWF0LCBvcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmV4ZWN1dGUoKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKHByb3BzKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHByb3BzKTtcbn1cbi8qKlxuICoge0BsaW5rIFNlbGVjdFF1ZXJ5QnVpbGRlcn0gd2l0aCBhbiBhbGlhcy4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHtAbGluayBTZWxlY3RRdWVyeUJ1aWxkZXIuYXN9LlxuICovXG5jbGFzcyBBbGlhc2VkU2VsZWN0UXVlcnlCdWlsZGVySW1wbCB7XG4gICAgI3F1ZXJ5QnVpbGRlcjtcbiAgICAjYWxpYXM7XG4gICAgY29uc3RydWN0b3IocXVlcnlCdWlsZGVyLCBhbGlhcykge1xuICAgICAgICB0aGlzLiNxdWVyeUJ1aWxkZXIgPSBxdWVyeUJ1aWxkZXI7XG4gICAgICAgIHRoaXMuI2FsaWFzID0gYWxpYXM7XG4gICAgfVxuICAgIGdldCBleHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcXVlcnlCdWlsZGVyO1xuICAgIH1cbiAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbGlhcztcbiAgICB9XG4gICAgZ2V0IGlzQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4jcXVlcnlCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgV2hlcmVOb2RlIH0gZnJvbSAnLi93aGVyZS1ub2RlLmpzJztcbmltcG9ydCB7IE9yZGVyQnlOb2RlIH0gZnJvbSAnLi9vcmRlci1ieS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoYWdncmVnYXRlRnVuY3Rpb24sIGFnZ3JlZ2F0ZWQgPSBbXSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZ2dyZWdhdGVGdW5jdGlvbk5vZGUnLFxuICAgICAgICAgICAgZnVuYzogYWdncmVnYXRlRnVuY3Rpb24sXG4gICAgICAgICAgICBhZ2dyZWdhdGVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aERpc3RpbmN0KGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSxcbiAgICAgICAgICAgIGRpc3RpbmN0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9yZGVyQnkoYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBvcmRlckl0ZW1zLCB3aXRoaW5Hcm91cCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSB3aXRoaW5Hcm91cCA/ICd3aXRoaW5Hcm91cCcgOiAnb3JkZXJCeSc7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uYWdncmVnYXRlRnVuY3Rpb25Ob2RlLFxuICAgICAgICAgICAgW3Byb3BdOiBhZ2dyZWdhdGVGdW5jdGlvbk5vZGVbcHJvcF1cbiAgICAgICAgICAgICAgICA/IE9yZGVyQnlOb2RlLmNsb25lV2l0aEl0ZW1zKGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZVtwcm9wXSwgb3JkZXJJdGVtcylcbiAgICAgICAgICAgICAgICA6IE9yZGVyQnlOb2RlLmNyZWF0ZShvcmRlckl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGaWx0ZXIoYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsXG4gICAgICAgICAgICBmaWx0ZXI6IGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5maWx0ZXJcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24oYWdncmVnYXRlRnVuY3Rpb25Ob2RlLmZpbHRlciwgJ0FuZCcsIGZpbHRlcilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUoZmlsdGVyKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPckZpbHRlcihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSxcbiAgICAgICAgICAgIGZpbHRlcjogYWdncmVnYXRlRnVuY3Rpb25Ob2RlLmZpbHRlclxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUuZmlsdGVyLCAnT3InLCBmaWx0ZXIpXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKGZpbHRlciksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3ZlcihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIG92ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsXG4gICAgICAgICAgICBvdmVyLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Z1bmN0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRnVuY3Rpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdGdW5jdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZ1bmMsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRnVuY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWdncmVnYXRlLWZ1bmN0aW9uLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZ2dyZWdhdGUtZnVuY3Rpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZU92ZXJCdWlsZGVyIH0gZnJvbSAnLi4vcGFyc2VyL3BhcnNlLXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb25UeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFsaWFzZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBzbGFwcGluZyBgYXMgXCJ0aGVfYWxpYXNcImAgdG8gdGhlIGVuZCBvZiB0aGUgU1FMLFxuICAgICAqIHRoaXMgbWV0aG9kIGFsc28gcHJvdmlkZXMgc3RyaWN0IHR5cGluZzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChcbiAgICAgKiAgICAgKGViKSA9PiBlYi5mbi5jb3VudDxudW1iZXI+KCdpZCcpLmFzKCdwZXJzb25fY291bnQnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIC8vIGBwZXJzb25fY291bnQ6IG51bWJlcmAgZmllbGQgZXhpc3RzIGluIHRoZSByZXN1bHQgdHlwZS5cbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQucGVyc29uX2NvdW50KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGNvdW50KFwiaWRcIikgYXMgXCJwZXJzb25fY291bnRcIlxuICAgICAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBgZGlzdGluY3RgIGNsYXVzZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoKGViKSA9PlxuICAgICAqICAgICBlYi5mbi5jb3VudDxudW1iZXI+KCdmaXJzdF9uYW1lJykuZGlzdGluY3QoKS5hcygnZmlyc3RfbmFtZV9jb3VudCcpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGNvdW50KGRpc3RpbmN0IFwiZmlyc3RfbmFtZVwiKSBhcyBcImZpcnN0X25hbWVfY291bnRcIlxuICAgICAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRpc3RpbmN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNsb25lV2l0aERpc3RpbmN0KHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBwYXJzZU9yZGVyQnkoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJPcmRlckJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhpbkdyb3VwT3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoT3JkZXJCeSh0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSwgdHJ1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmaWx0ZXJXaGVyZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoRmlsdGVyKHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgYGZpbHRlcmAgY2xhdXNlIHdpdGggYSBuZXN0ZWQgYHdoZXJlYCBjbGF1c2UgYWZ0ZXIgdGhlIGZ1bmN0aW9uLCB3aGVyZVxuICAgICAqIGJvdGggc2lkZXMgb2YgdGhlIG9wZXJhdG9yIGFyZSByZWZlcmVuY2VzIHRvIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIHtAbGluayBXaGVyZUludGVyZmFjZX0ncyBgd2hlcmVSZWZgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogQ291bnQgcGVvcGxlIHdpdGggc2FtZSBmaXJzdCBhbmQgbGFzdCBuYW1lcyB2ZXJzdXMgZ2VuZXJhbCBwdWJsaWM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICogICAgIGViLmZuXG4gICAgICogICAgICAgLmNvdW50PG51bWJlcj4oJ2lkJylcbiAgICAgKiAgICAgICAuZmlsdGVyV2hlcmVSZWYoJ2ZpcnN0X25hbWUnLCAnPScsICdsYXN0X25hbWUnKVxuICAgICAqICAgICAgIC5hcygncmVwZWF0X25hbWVfY291bnQnKSxcbiAgICAgKiAgICAgZWIuZm4uY291bnQ8bnVtYmVyPignaWQnKS5hcygndG90YWxfY291bnQnKSxcbiAgICAgKiAgIF0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0XG4gICAgICogICBjb3VudChcImlkXCIpIGZpbHRlcih3aGVyZSBcImZpcnN0X25hbWVcIiA9IFwibGFzdF9uYW1lXCIpIGFzIFwicmVwZWF0X25hbWVfY291bnRcIixcbiAgICAgKiAgIGNvdW50KFwiaWRcIikgYXMgXCJ0b3RhbF9jb3VudFwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZmlsdGVyV2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoRmlsdGVyKHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYG92ZXJgIGNsYXVzZSAod2luZG93IGZ1bmN0aW9ucykgYWZ0ZXIgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoXG4gICAgICogICAgIChlYikgPT4gZWIuZm4uYXZnPG51bWJlcj4oJ2FnZScpLm92ZXIoKS5hcygnYXZlcmFnZV9hZ2UnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGF2ZyhcImFnZVwiKSBvdmVyKCkgYXMgXCJhdmVyYWdlX2FnZVwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbHNvIHN1cHBvcnRzIHBhc3NpbmcgYSBjYWxsYmFjayB0aGF0IHJldHVybnMgYW4gb3ZlciBidWlsZGVyLFxuICAgICAqIGFsbG93aW5nIHRvIGFkZCBwYXJ0aXRpb24gYnkgYW5kIHNvcnQgYnkgY2xhdXNlcyBpbnNpZGUgb3Zlci5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChcbiAgICAgKiAgICAgKGViKSA9PiBlYi5mbi5hdmc8bnVtYmVyPignYWdlJykub3ZlcihcbiAgICAgKiAgICAgICBvYiA9PiBvYi5wYXJ0aXRpb25CeSgnbGFzdF9uYW1lJykub3JkZXJCeSgnZmlyc3RfbmFtZScsICdhc2MnKVxuICAgICAqICAgICApLmFzKCdhdmVyYWdlX2FnZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgYXZnKFwiYWdlXCIpIG92ZXIocGFydGl0aW9uIGJ5IFwibGFzdF9uYW1lXCIgb3JkZXIgYnkgXCJmaXJzdF9uYW1lXCIgYXNjKSBhcyBcImF2ZXJhZ2VfYWdlXCJcbiAgICAgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvdmVyKG92ZXIpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZU92ZXJCdWlsZGVyKCk7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoT3Zlcih0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIChvdmVyID8gb3ZlcihidWlsZGVyKSA6IGJ1aWxkZXIpLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FzdHMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIGdpdmVuIHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9taXQgbnVsbCBmcm9tIHRoZSBleHByZXNzaW9uJ3MgdHlwZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB5b3Uga25vdyBhbiBleHByZXNzaW9uIGNhbid0IGJlXG4gICAgICogbnVsbCwgYnV0IEt5c2VseSBpcyB1bmFibGUgdG8gaW5mZXIgaXQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIGB0aGlzYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTtcbiAgICB9XG59XG4vKipcbiAqIHtAbGluayBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXJ9IHdpdGggYW4gYWxpYXMuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB7QGxpbmsgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyLmFzfS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFsaWFzZWRBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIge1xuICAgICNhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXI7XG4gICAgI2FsaWFzO1xuICAgIGNvbnN0cnVjdG9yKGFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyID0gYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcjtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4jYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Z1bmN0aW9uLW1vZHVsZS5kLnRzXCIgLz5cbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgQWdncmVnYXRlRnVuY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWdncmVnYXRlLWZ1bmN0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZnVuY3Rpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBbGwgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uTW9kdWxlKCkge1xuICAgIGNvbnN0IGZuID0gKG5hbWUsIGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihGdW5jdGlvbk5vZGUuY3JlYXRlKG5hbWUsIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChhcmdzID8/IFtdKSkpO1xuICAgIH07XG4gICAgY29uc3QgYWdnID0gKG5hbWUsIGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY3JlYXRlKG5hbWUsIGFyZ3MgPyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QoYXJncykgOiB1bmRlZmluZWQpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGZuLCB7XG4gICAgICAgIGFnZyxcbiAgICAgICAgYXZnKGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGFnZygnYXZnJywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBjb2FsZXNjZSguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmbignY29hbGVzY2UnLCB2YWx1ZXMpO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ2NvdW50JywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudEFsbCh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNyZWF0ZSgnY291bnQnLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1heChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ21heCcsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWluKGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGFnZygnbWluJywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBzdW0oY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gYWdnKCdzdW0nLCBbY29sdW1uXSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFueShjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmbignYW55JywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBqc29uQWdnKHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY3JlYXRlKCdqc29uX2FnZycsIFtcbiAgICAgICAgICAgICAgICAgICAgaXNTdHJpbmcodGFibGUpID8gcGFyc2VUYWJsZSh0YWJsZSkgOiB0YWJsZS50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB0b0pzb24odGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoRnVuY3Rpb25Ob2RlLmNyZWF0ZSgndG9fanNvbicsIFtcbiAgICAgICAgICAgICAgICBpc1N0cmluZyh0YWJsZSkgPyBwYXJzZVRhYmxlKHRhYmxlKSA6IHRhYmxlLnRvT3BlcmF0aW9uTm9kZSgpLFxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91bmFyeS1vcGVyYXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVbmFyeU9wZXJhdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1VuYXJ5T3BlcmF0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob3BlcmF0b3IsIG9wZXJhbmQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVW5hcnlPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yLFxuICAgICAgICAgICAgb3BlcmFuZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91bmFyeS1vcGVyYXRpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgT3BlcmF0b3JOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBVbmFyeU9wZXJhdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS91bmFyeS1vcGVyYXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24sIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV4aXN0cyhvcGVyYW5kKSB7XG4gICAgcmV0dXJuIHBhcnNlVW5hcnlPcGVyYXRpb24oJ2V4aXN0cycsIG9wZXJhbmQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTm90RXhpc3RzKG9wZXJhbmQpIHtcbiAgICByZXR1cm4gcGFyc2VVbmFyeU9wZXJhdGlvbignbm90IGV4aXN0cycsIG9wZXJhbmQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5hcnlPcGVyYXRpb24ob3BlcmF0b3IsIG9wZXJhbmQpIHtcbiAgICByZXR1cm4gVW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShPcGVyYXRvck5vZGUuY3JlYXRlKG9wZXJhdG9yKSwgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKG9wZXJhbmQpKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY2FzZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuL3doZW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ2FzZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Nhc2VOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDYXNlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhXaGVuKGNhc2VOb2RlLCB3aGVuKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY2FzZU5vZGUsXG4gICAgICAgICAgICB3aGVuOiBmcmVlemUoY2FzZU5vZGUud2hlbiA/IFsuLi5jYXNlTm9kZS53aGVuLCB3aGVuXSA6IFt3aGVuXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVGhlbihjYXNlTm9kZSwgdGhlbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNhc2VOb2RlLFxuICAgICAgICAgICAgd2hlbjogY2FzZU5vZGUud2hlblxuICAgICAgICAgICAgICAgID8gZnJlZXplKFtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2FzZU5vZGUud2hlbi5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICAgICAgICAgIFdoZW5Ob2RlLmNsb25lV2l0aFJlc3VsdChjYXNlTm9kZS53aGVuW2Nhc2VOb2RlLndoZW4ubGVuZ3RoIC0gMV0sIHRoZW4pLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGNhc2VOb2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNhc2VOb2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY2FzZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgRXhwcmVzc2lvbldyYXBwZXIgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24td3JhcHBlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDYXNlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Nhc2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBXaGVuTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3doZW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBpc1NhZmVJbW1lZGlhdGVWYWx1ZSwgcGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUsIHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIENhc2VCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB3aGVuKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXNlVGhlbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jbG9uZVdpdGhXaGVuKHRoaXMuI3Byb3BzLm5vZGUsIFdoZW5Ob2RlLmNyZWF0ZShwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDYXNlVGhlbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRoZW4odmFsdWVFeHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZVdoZW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ2FzZU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5ub2RlLCBpc1NhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgPyBwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgOiBwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZUV4cHJlc3Npb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENhc2VXaGVuQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZVRoZW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ2FzZU5vZGUuY2xvbmVXaXRoV2hlbih0aGlzLiNwcm9wcy5ub2RlLCBXaGVuTm9kZS5jcmVhdGUocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSh2YWx1ZUV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXNlRW5kQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZWxzZTogaXNTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWVFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlRXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZUV4cHJlc3Npb24pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbmQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgZW5kQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihDYXNlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwgeyBpc1N0YXRlbWVudDogdHJ1ZSB9KSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENhc2VFbmRCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBlbmQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgZW5kQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihDYXNlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwgeyBpc1N0YXRlbWVudDogdHJ1ZSB9KSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qc29uLXBhdGgtbGVnLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSlNPTlBhdGhMZWdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKU09OUGF0aExlZ05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pTT05QYXRoTGVnTm9kZScsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1wYXRoLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05PcGVyYXRvckNoYWluTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tb3BlcmF0b3ItY2hhaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aExlZ05vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLWxlZy1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05QYXRoTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05SZWZlcmVuY2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1yZWZlcmVuY2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgSlNPTlBhdGhCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgYW4gZWxlbWVudCBvZiBhIEpTT04gYXJyYXkgaW4gYSBzcGVjaWZpYyBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIFNpbmNlIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIGFuIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBnaXZlbiBhcnJheSBsb2NhdGlvbiwgdGhlXG4gICAgICogcmVzdWx0aW5nIHR5cGUgaXMgYWx3YXlzIG51bGxhYmxlLiBJZiB5b3UncmUgc3VyZSB0aGUgZWxlbWVudCBleGlzdHMsIHlvdVxuICAgICAqIHNob3VsZCB1c2Uge0BsaW5rIFNlbGVjdFF1ZXJ5QnVpbGRlci4kYXNzZXJ0VHlwZX0gdG8gbmFycm93IHRoZSB0eXBlIHNhZmVseS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvIHtAbGluayBrZXl9IHRvIGFjY2VzcyBwcm9wZXJ0aWVzIG9mIEpTT04gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChlYiA9PlxuICAgICAqICAgICBlYi5yZWYoJ25pY2tuYW1lcycsICctPicpLmF0KDApLmFzKCdwcmltYXJ5X25pY2tuYW1lJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcIm5pY2tuYW1lc1wiLT4wIGFzIFwicHJpbWFyeV9uaWNrbmFtZVwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqYGBgXG4gICAgICpcbiAgICAgKiBDb21iaW5lZCB3aXRoIHtAbGluayBrZXl9OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZignZXhwZXJpZW5jZScsICctPicpLmF0KDApLmtleSgncm9sZScpLmFzKCdmaXJzdF9yb2xlJylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJleHBlcmllbmNlXCItPjAtPidyb2xlJyBhcyBcImZpcnN0X3JvbGVcIiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gdXNlIGAnbGFzdCdgIHRvIGFjY2VzcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBpbiBNeVNRTDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ25pY2tuYW1lcycsICctPiQnKS5hdCgnbGFzdCcpLmFzKCdsYXN0X25pY2tuYW1lJylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGBuaWNrbmFtZXNgLT4nJFtsYXN0XScgYXMgYGxhc3Rfbmlja25hbWVgIGZyb20gYHBlcnNvbmBcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE9yIGAnIy0xJ2AgaW4gU1FMaXRlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZignbmlja25hbWVzJywgJy0+PiQnKS5hdCgnIy0xJykuYXMoJ2xhc3Rfbmlja25hbWUnKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwibmlja25hbWVzXCItPj4nJFsjLTFdJyBhcyBgbGFzdF9uaWNrbmFtZWAgZnJvbSBgcGVyc29uYFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF0KGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVCdWlsZGVyV2l0aFBhdGhMZWcoJ0FycmF5TG9jYXRpb24nLCBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjY2VzcyBhIHByb3BlcnR5IG9mIGEgSlNPTiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBJZiBhIGZpZWxkIGlzIG9wdGlvbmFsLCB0aGUgcmVzdWx0aW5nIHR5cGUgd2lsbCBiZSBudWxsYWJsZS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvIHtAbGluayBhdH0gdG8gYWNjZXNzIGVsZW1lbnRzIG9mIEpTT04gYXJyYXlzLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdChlYiA9PlxuICAgICAqICAgZWIucmVmKCdhZGRyZXNzJywgJy0+Jykua2V5KCdjaXR5JykuYXMoJ2NpdHknKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcImFkZHJlc3NcIi0+J2NpdHknIGFzIFwiY2l0eVwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogR29pbmcgZGVlcGVyOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZigncHJvZmlsZScsICctPiQnKS5rZXkoJ3dlYnNpdGUnKS5rZXkoJ3VybCcpLmFzKCd3ZWJzaXRlX3VybCcpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBgcHJvZmlsZWAtPickLndlYnNpdGUudXJsJyBhcyBgd2Vic2l0ZV91cmxgIGZyb20gYHBlcnNvbmBcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIENvbWJpbmVkIHdpdGgge0BsaW5rIGF0fTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ3Byb2ZpbGUnLCAnLT4nKS5rZXkoJ2FkZHJlc3NlcycpLmF0KDApLmtleSgnY2l0eScpLmFzKCdjaXR5JylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwcm9maWxlXCItPidhZGRyZXNzZXMnLT4wLT4nY2l0eScgYXMgXCJjaXR5XCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAga2V5KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlQnVpbGRlcldpdGhQYXRoTGVnKCdNZW1iZXInLCBrZXkpO1xuICAgIH1cbiAgICAjY3JlYXRlQnVpbGRlcldpdGhQYXRoTGVnKGxlZ1R5cGUsIHZhbHVlKSB7XG4gICAgICAgIGlmIChKU09OUmVmZXJlbmNlTm9kZS5pcyh0aGlzLiNub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIoSlNPTlJlZmVyZW5jZU5vZGUuY2xvbmVXaXRoVHJhdmVyc2FsKHRoaXMuI25vZGUsIEpTT05QYXRoTm9kZS5pcyh0aGlzLiNub2RlLnRyYXZlcnNhbClcbiAgICAgICAgICAgICAgICA/IEpTT05QYXRoTm9kZS5jbG9uZVdpdGhMZWcodGhpcy4jbm9kZS50cmF2ZXJzYWwsIEpTT05QYXRoTGVnTm9kZS5jcmVhdGUobGVnVHlwZSwgdmFsdWUpKVxuICAgICAgICAgICAgICAgIDogSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlLmNsb25lV2l0aFZhbHVlKHRoaXMuI25vZGUudHJhdmVyc2FsLCBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHZhbHVlKSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyYXZlcnNlZEpTT05QYXRoQnVpbGRlcihKU09OUGF0aE5vZGUuY2xvbmVXaXRoTGVnKHRoaXMuI25vZGUsIEpTT05QYXRoTGVnTm9kZS5jcmVhdGUobGVnVHlwZSwgdmFsdWUpKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRyYXZlcnNlZEpTT05QYXRoQnVpbGRlciBleHRlbmRzIEpTT05QYXRoQnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICBzdXBlcihub2RlKTtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkSlNPTlBhdGhCdWlsZGVyKHRoaXMsIGFsaWFzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUganNvbiBwYXRoLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBKU09OUGF0aEJ1aWxkZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgICRub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYXZlcnNlZEpTT05QYXRoQnVpbGRlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbm9kZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWxpYXNlZEpTT05QYXRoQnVpbGRlciB7XG4gICAgI2pzb25QYXRoO1xuICAgICNhbGlhcztcbiAgICBjb25zdHJ1Y3Rvcihqc29uUGF0aCwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4janNvblBhdGggPSBqc29uUGF0aDtcbiAgICAgICAgdGhpcy4jYWxpYXMgPSBhbGlhcztcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqc29uUGF0aDtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4janNvblBhdGgudG9PcGVyYXRpb25Ob2RlKCksIGlzT3BlcmF0aW9uTm9kZVNvdXJjZSh0aGlzLiNhbGlhcylcbiAgICAgICAgICAgID8gdGhpcy4jYWxpYXMudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgICAgIDogSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi90dXBsZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFR1cGxlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVHVwbGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVHVwbGVOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKHZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGF0YS10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5jb25zdCBTSU1QTEVfQ09MVU1OX0RBVEFfVFlQRVMgPSBbXG4gICAgJ3ZhcmNoYXInLFxuICAgICdjaGFyJyxcbiAgICAndGV4dCcsXG4gICAgJ2ludGVnZXInLFxuICAgICdpbnQyJyxcbiAgICAnaW50NCcsXG4gICAgJ2ludDgnLFxuICAgICdzbWFsbGludCcsXG4gICAgJ2JpZ2ludCcsXG4gICAgJ2Jvb2xlYW4nLFxuICAgICdyZWFsJyxcbiAgICAnZG91YmxlIHByZWNpc2lvbicsXG4gICAgJ2Zsb2F0NCcsXG4gICAgJ2Zsb2F0OCcsXG4gICAgJ2RlY2ltYWwnLFxuICAgICdudW1lcmljJyxcbiAgICAnYmluYXJ5JyxcbiAgICAnYnl0ZWEnLFxuICAgICdkYXRlJyxcbiAgICAnZGF0ZXRpbWUnLFxuICAgICd0aW1lJyxcbiAgICAndGltZXR6JyxcbiAgICAndGltZXN0YW1wJyxcbiAgICAndGltZXN0YW1wdHonLFxuICAgICdzZXJpYWwnLFxuICAgICdiaWdzZXJpYWwnLFxuICAgICd1dWlkJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb25iJyxcbiAgICAnYmxvYicsXG4gICAgJ3ZhcmJpbmFyeScsXG4gICAgJ2ludDRyYW5nZScsXG4gICAgJ2ludDRtdWx0aXJhbmdlJyxcbiAgICAnaW50OHJhbmdlJyxcbiAgICAnaW50OG11bHRpcmFuZ2UnLFxuICAgICdudW1yYW5nZScsXG4gICAgJ251bW11bHRpcmFuZ2UnLFxuICAgICd0c3JhbmdlJyxcbiAgICAndHNtdWx0aXJhbmdlJyxcbiAgICAndHN0enJhbmdlJyxcbiAgICAndHN0em11bHRpcmFuZ2UnLFxuICAgICdkYXRlcmFuZ2UnLFxuICAgICdkYXRlbXVsdGlyYW5nZScsXG5dO1xuY29uc3QgQ09MVU1OX0RBVEFfVFlQRV9SRUdFWCA9IFtcbiAgICAvXnZhcmNoYXJcXChcXGQrXFwpJC8sXG4gICAgL15jaGFyXFwoXFxkK1xcKSQvLFxuICAgIC9eZGVjaW1hbFxcKFxcZCssIFxcZCtcXCkkLyxcbiAgICAvXm51bWVyaWNcXChcXGQrLCBcXGQrXFwpJC8sXG4gICAgL15iaW5hcnlcXChcXGQrXFwpJC8sXG4gICAgL15kYXRldGltZVxcKFxcZCtcXCkkLyxcbiAgICAvXnRpbWVcXChcXGQrXFwpJC8sXG4gICAgL150aW1ldHpcXChcXGQrXFwpJC8sXG4gICAgL150aW1lc3RhbXBcXChcXGQrXFwpJC8sXG4gICAgL150aW1lc3RhbXB0elxcKFxcZCtcXCkkLyxcbiAgICAvXnZhcmJpbmFyeVxcKFxcZCtcXCkkLyxcbl07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGF0YVR5cGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEYXRhVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0RhdGFUeXBlTm9kZScsXG4gICAgICAgICAgICBkYXRhVHlwZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sdW1uRGF0YVR5cGUoZGF0YVR5cGUpIHtcbiAgICBpZiAoU0lNUExFX0NPTFVNTl9EQVRBX1RZUEVTLmluY2x1ZGVzKGRhdGFUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENPTFVNTl9EQVRBX1RZUEVfUkVHRVguc29tZSgocikgPT4gci50ZXN0KGRhdGFUeXBlKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGF0YS10eXBlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IERhdGFUeXBlTm9kZSwgaXNDb2x1bW5EYXRhVHlwZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kYXRhLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSB7XG4gICAgaWYgKGlzT3BlcmF0aW9uTm9kZVNvdXJjZShkYXRhVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFUeXBlLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBpZiAoaXNDb2x1bW5EYXRhVHlwZShkYXRhVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIERhdGFUeXBlTm9kZS5jcmVhdGUoZGF0YVR5cGUpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgY29sdW1uIGRhdGEgdHlwZSAke0pTT04uc3RyaW5naWZ5KGRhdGFUeXBlKX1gKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY2FzdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENhc3ROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDYXN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZXhwcmVzc2lvbiwgZGF0YVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ2FzdE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGRhdGFUeXBlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2V4cHJlc3Npb24tYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciwgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL3NlbGVjdC1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0LCBwYXJzZVRhYmxlLCB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgV2l0aFNjaGVtYVBsdWdpbiB9IGZyb20gJy4uL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlJZCB9IGZyb20gJy4uL3V0aWwvcXVlcnktaWQuanMnO1xuaW1wb3J0IHsgY3JlYXRlRnVuY3Rpb25Nb2R1bGUsIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMnO1xuaW1wb3J0IHsgcGFyc2VKU09OUmVmZXJlbmNlLCBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24sIHBhcnNlU3RyaW5nUmVmZXJlbmNlLCB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlRmlsdGVyTGlzdCwgcGFyc2VGaWx0ZXJPYmplY3QsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24sIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IFBhcmVuc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wYXJlbnMtbm9kZS5qcyc7XG5pbXBvcnQgeyBFeHByZXNzaW9uV3JhcHBlciB9IGZyb20gJy4vZXhwcmVzc2lvbi13cmFwcGVyLmpzJztcbmltcG9ydCB7IE9wZXJhdG9yTm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRvci1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVW5hcnlPcGVyYXRpb24gfSBmcm9tICcuLi9wYXJzZXIvdW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSwgcGFyc2VWYWx1ZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBOT09QX1FVRVJZX0VYRUNVVE9SIH0gZnJvbSAnLi4vcXVlcnktZXhlY3V0b3Ivbm9vcC1xdWVyeS1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBDYXNlQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvY2FzZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENhc2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzJztcbmltcG9ydCB7IGlzUmVhZG9ubHlBcnJheSwgaXNVbmRlZmluZWQgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aEJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2pzb24tcGF0aC1idWlsZGVyLmpzJztcbmltcG9ydCB7IEJpbmFyeU9wZXJhdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9iaW5hcnktb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgQW5kTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FuZC1ub2RlLmpzJztcbmltcG9ydCB7IFR1cGxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3R1cGxlLW5vZGUuanMnO1xuaW1wb3J0IHsgSlNPTlBhdGhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgQ2FzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jYXN0LW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyKGV4ZWN1dG9yID0gTk9PUF9RVUVSWV9FWEVDVVRPUikge1xuICAgIGZ1bmN0aW9uIGJpbmFyeShsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1bmFyeShvcCwgZXhwcikge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlVW5hcnlPcGVyYXRpb24ob3AsIGV4cHIpKTtcbiAgICB9XG4gICAgY29uc3QgZWIgPSBPYmplY3QuYXNzaWduKGJpbmFyeSwge1xuICAgICAgICBmbjogdW5kZWZpbmVkLFxuICAgICAgICBlYjogdW5kZWZpbmVkLFxuICAgICAgICBzZWxlY3RGcm9tKHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICAgICAgZXhlY3V0b3IsXG4gICAgICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY3JlYXRlRnJvbShwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCh0YWJsZSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNhc2UocmVmZXJlbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENhc2VCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jcmVhdGUoaXNVbmRlZmluZWQocmVmZXJlbmNlKVxuICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA6IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihyZWZlcmVuY2UpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZWYocmVmZXJlbmNlLCBvcCkge1xuICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKG9wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmZXJlbmNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEpTT05QYXRoQnVpbGRlcihwYXJzZUpTT05SZWZlcmVuY2UocmVmZXJlbmNlLCBvcCkpO1xuICAgICAgICB9LFxuICAgICAgICBqc29uUGF0aCgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTlBhdGhCdWlsZGVyKEpTT05QYXRoTm9kZS5jcmVhdGUoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHRhYmxlKHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlVGFibGUodGFibGUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlVmFsdWVFeHByZXNzaW9uKHZhbHVlKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZlR1cGxlKC4uLnZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihUdXBsZU5vZGUuY3JlYXRlKHZhbHVlcy5tYXAocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKSkpO1xuICAgICAgICB9LFxuICAgICAgICB0dXBsZSguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoVHVwbGVOb2RlLmNyZWF0ZSh2YWx1ZXMubWFwKHBhcnNlVmFsdWVFeHByZXNzaW9uKSkpO1xuICAgICAgICB9LFxuICAgICAgICBsaXQodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgdW5hcnksXG4gICAgICAgIG5vdChleHByKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5hcnkoJ25vdCcsIGV4cHIpO1xuICAgICAgICB9LFxuICAgICAgICBleGlzdHMoZXhwcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuYXJ5KCdleGlzdHMnLCBleHByKTtcbiAgICAgICAgfSxcbiAgICAgICAgbmVnKGV4cHIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmFyeSgnLScsIGV4cHIpO1xuICAgICAgICB9LFxuICAgICAgICBiZXR3ZWVuKGV4cHIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQmluYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGV4cHIpLCBPcGVyYXRvck5vZGUuY3JlYXRlKCdiZXR3ZWVuJyksIEFuZE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKHN0YXJ0KSwgcGFyc2VWYWx1ZUV4cHJlc3Npb24oZW5kKSkpKTtcbiAgICAgICAgfSxcbiAgICAgICAgYmV0d2VlblN5bW1ldHJpYyhleHByLCBzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihleHByKSwgT3BlcmF0b3JOb2RlLmNyZWF0ZSgnYmV0d2VlbiBzeW1tZXRyaWMnKSwgQW5kTm9kZS5jcmVhdGUocGFyc2VWYWx1ZUV4cHJlc3Npb24oc3RhcnQpLCBwYXJzZVZhbHVlRXhwcmVzc2lvbihlbmQpKSkpO1xuICAgICAgICB9LFxuICAgICAgICBhbmQoZXhwcnMpIHtcbiAgICAgICAgICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoZXhwcnMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZUZpbHRlckxpc3QoZXhwcnMsICdhbmQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlRmlsdGVyT2JqZWN0KGV4cHJzLCAnYW5kJykpO1xuICAgICAgICB9LFxuICAgICAgICBvcihleHBycykge1xuICAgICAgICAgICAgaWYgKGlzUmVhZG9ubHlBcnJheShleHBycykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlRmlsdGVyTGlzdChleHBycywgJ29yJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZUZpbHRlck9iamVjdChleHBycywgJ29yJykpO1xuICAgICAgICB9LFxuICAgICAgICBwYXJlbnMoLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncyk7XG4gICAgICAgICAgICBpZiAoUGFyZW5zTm9kZS5pcyhub2RlKSkge1xuICAgICAgICAgICAgICAgIC8vIE5vIGRvdWJsZSB3cmFwcGluZy5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihQYXJlbnNOb2RlLmNyZWF0ZShub2RlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhc3QoZXhwciwgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzdE5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihleHByKSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRXhwcmVzc2lvbkJ1aWxkZXIoZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQobmV3IFdpdGhTY2hlbWFQbHVnaW4oc2NoZW1hKSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIGViLmZuID0gY3JlYXRlRnVuY3Rpb25Nb2R1bGUoKTtcbiAgICBlYi5lYiA9IGViO1xuICAgIHJldHVybiBlYjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHByZXNzaW9uQnVpbGRlcihfKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2V4cHJlc3Npb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNBbGlhc2VkRXhwcmVzc2lvbiwgaXNFeHByZXNzaW9uLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzT3BlcmF0aW9uTm9kZVNvdXJjZShleHApKSB7XG4gICAgICAgIHJldHVybiBleHAudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24oZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwKGV4cHJlc3Npb25CdWlsZGVyKCkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShleHApfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWxpYXNlZEV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzT3BlcmF0aW9uTm9kZVNvdXJjZShleHApKSB7XG4gICAgICAgIHJldHVybiBleHAudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24oZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwKGV4cHJlc3Npb25CdWlsZGVyKCkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYWxpYXNlZCBleHByZXNzaW9uOiAke0pTT04uc3RyaW5naWZ5KGV4cCl9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHByZXNzaW9uT3JGYWN0b3J5KG9iaikge1xuICAgIHJldHVybiBpc0V4cHJlc3Npb24ob2JqKSB8fCBpc0FsaWFzZWRFeHByZXNzaW9uKG9iaikgfHwgaXNGdW5jdGlvbihvYmopO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9keW5hbWljLXRhYmxlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNUYWJsZUJ1aWxkZXIge1xuICAgICN0YWJsZTtcbiAgICBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0YWJsZTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICAgICAgdGhpcy4jdGFibGUgPSB0YWJsZTtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlcih0aGlzLiN0YWJsZSwgYWxpYXMpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciB7XG4gICAgI3RhYmxlO1xuICAgICNhbGlhcztcbiAgICBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0YWJsZTtcbiAgICB9XG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRhYmxlLCBhbGlhcykge1xuICAgICAgICB0aGlzLiN0YWJsZSA9IHRhYmxlO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHBhcnNlVGFibGUodGhpcy4jdGFibGUpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlcihvYmopIHtcbiAgICByZXR1cm4gKGlzT2JqZWN0KG9iaikgJiZcbiAgICAgICAgaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaikgJiZcbiAgICAgICAgaXNTdHJpbmcob2JqLnRhYmxlKSAmJlxuICAgICAgICBpc1N0cmluZyhvYmouYWxpYXMpKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdGFibGUtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNSZWFkb25seUFycmF5LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZUFsaWFzZWRFeHByZXNzaW9uLCB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciwgfSBmcm9tICcuLi9keW5hbWljL2R5bmFtaWMtdGFibGUtYnVpbGRlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QodGFibGUpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KHRhYmxlKSkge1xuICAgICAgICByZXR1cm4gdGFibGUubWFwKChpdCkgPT4gcGFyc2VUYWJsZUV4cHJlc3Npb24oaXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbcGFyc2VUYWJsZUV4cHJlc3Npb24odGFibGUpXTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUYWJsZUV4cHJlc3Npb24odGFibGUpIHtcbiAgICBpZiAoaXNTdHJpbmcodGFibGUpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUFsaWFzZWRUYWJsZSh0YWJsZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIodGFibGUpKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZUFsaWFzZWRFeHByZXNzaW9uKHRhYmxlKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBbGlhc2VkVGFibGUoZnJvbSkge1xuICAgIGNvbnN0IEFMSUFTX1NFUEFSQVRPUiA9ICcgYXMgJztcbiAgICBpZiAoZnJvbS5pbmNsdWRlcyhBTElBU19TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IFt0YWJsZSwgYWxpYXNdID0gZnJvbS5zcGxpdChBTElBU19TRVBBUkFUT1IpLm1hcCh0cmltKTtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUocGFyc2VUYWJsZSh0YWJsZSksIElkZW50aWZpZXJOb2RlLmNyZWF0ZShhbGlhcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVGFibGUoZnJvbSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFibGUoZnJvbSkge1xuICAgIGNvbnN0IFNDSEVNQV9TRVBBUkFUT1IgPSAnLic7XG4gICAgaWYgKGZyb20uaW5jbHVkZXMoU0NIRU1BX1NFUEFSQVRPUikpIHtcbiAgICAgICAgY29uc3QgW3NjaGVtYSwgdGFibGVdID0gZnJvbS5zcGxpdChTQ0hFTUFfU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgICAgIHJldHVybiBUYWJsZU5vZGUuY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIHRhYmxlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBUYWJsZU5vZGUuY3JlYXRlKGZyb20pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FkZC1jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZGRDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBZGRDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWRkQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29sdW1uLWRlZmluaXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb2x1bW5EZWZpbml0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29sdW1uRGVmaW5pdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbiwgZGF0YVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uRGVmaW5pdGlvbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLFxuICAgICAgICAgICAgZGF0YVR5cGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRnJvbnRNb2RpZmllcihub2RlLCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogbm9kZS5mcm9udE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5ub2RlLmZyb250TW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBbbW9kaWZpZXJdLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEVuZE1vZGlmaWVyKG5vZGUsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogbm9kZS5lbmRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4ubm9kZS5lbmRNb2RpZmllcnMsIG1vZGlmaWVyXSlcbiAgICAgICAgICAgICAgICA6IFttb2RpZmllcl0sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcENvbHVtbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlbmFtZS1jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZW5hbWVDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZW5hbWVDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZW5hbWVDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgICAgIHJlbmFtZVRvOiBDb2x1bW5Ob2RlLmNyZWF0ZShuZXdDb2x1bW4pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NoZWNrLWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENoZWNrQ29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NoZWNrQ29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGV4cHJlc3Npb24sIGNvbnN0cmFpbnROYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NoZWNrQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIG5hbWU6IGNvbnN0cmFpbnROYW1lID8gSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yZWZlcmVuY2VzLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY29uc3QgT05fTU9ESUZZX0ZPUkVJR05fQUNUSU9OUyA9IFtcbiAgICAnbm8gYWN0aW9uJyxcbiAgICAncmVzdHJpY3QnLFxuICAgICdjYXNjYWRlJyxcbiAgICAnc2V0IG51bGwnLFxuICAgICdzZXQgZGVmYXVsdCcsXG5dO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJlZmVyZW5jZXNOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZWZlcmVuY2VzTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlc05vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBjb2x1bW5zOiBmcmVlemUoWy4uLmNvbHVtbnNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPbkRlbGV0ZShyZWZlcmVuY2VzLCBvbkRlbGV0ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnJlZmVyZW5jZXMsXG4gICAgICAgICAgICBvbkRlbGV0ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPblVwZGF0ZShyZWZlcmVuY2VzLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnJlZmVyZW5jZXMsXG4gICAgICAgICAgICBvblVwZGF0ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LXZhbHVlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24odmFsdWUpIHtcbiAgICByZXR1cm4gaXNPcGVyYXRpb25Ob2RlU291cmNlKHZhbHVlKVxuICAgICAgICA/IHZhbHVlLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgIDogVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSh2YWx1ZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2dlbmVyYXRlZC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmVyYXRlZE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0dlbmVyYXRlZE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHZW5lcmF0ZWROb2RlJyxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoRXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0dlbmVyYXRlZE5vZGUnLFxuICAgICAgICAgICAgYWx3YXlzOiB0cnVlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LXZhbHVlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFZhbHVlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRGVmYXVsdFZhbHVlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0RlZmF1bHRWYWx1ZU5vZGUnLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLW1vZGlmeS1hY3Rpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgT05fTU9ESUZZX0ZPUkVJR05fQUNUSU9OUywgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZWZlcmVuY2VzLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uKGFjdGlvbikge1xuICAgIGlmIChPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TLmluY2x1ZGVzKGFjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIE9uTW9kaWZ5Rm9yZWlnbkFjdGlvbiAke2FjdGlvbn1gKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29sdW1uLWRlZmluaXRpb24tYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENoZWNrQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jaGVjay1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgUmVmZXJlbmNlc05vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlcy1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdEFsbE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3QtYWxsLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VTdHJpbmdSZWZlcmVuY2UgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9kZWZhdWx0LXZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBHZW5lcmF0ZWROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZ2VuZXJhdGVkLW5vZGUuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2RlZmF1bHQtdmFsdWUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbiB9IGZyb20gJy4uL3BhcnNlci9vbi1tb2RpZnktYWN0aW9uLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYGF1dG9faW5jcmVtZW50YCBvciBgYXV0b2luY3JlbWVudGAgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uXG4gICAgICogZGVwZW5kaW5nIG9uIHRoZSBkaWFsZWN0LlxuICAgICAqXG4gICAgICogU29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgZG9uJ3Qgc3VwcG9ydCB0aGlzLiBPbiBQb3N0Z3JlU1FMXG4gICAgICogeW91IGNhbiB1c2UgdGhlIGBzZXJpYWxgIG9yIGBiaWdzZXJpYWxgIGRhdGEgdHlwZSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wuYXV0b0luY3JlbWVudCgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5IGF1dG9faW5jcmVtZW50XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF1dG9JbmNyZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBjb2x1bW4gYW4gaWRlbnRpdHkgY29sdW1uLlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBNUyBTUUwgU2VydmVyIChNU1NRTCkuXG4gICAgICpcbiAgICAgKiBGb3IgUG9zdGdyZVNRTCdzIGBnZW5lcmF0ZWQgYWx3YXlzIGFzIGlkZW50aXR5YCB1c2Uge0BsaW5rIGdlbmVyYXRlZEFsd2F5c0FzSWRlbnRpdHl9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wuaWRlbnRpdHkoKS5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVNTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGVyc29uXCIgKFxuICAgICAqICAgXCJpZFwiIGludGVnZXIgaWRlbnRpdHkgcHJpbWFyeSBrZXlcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaWRlbnRpdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgaWRlbnRpdHk6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgY29sdW1uIHRoZSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXkgdXNlIHRoZVxuICAgICAqIHtAbGluayBDcmVhdGVUYWJsZUJ1aWxkZXIuYWRkUHJpbWFyeUtleUNvbnN0cmFpbnR9IG1ldGhvZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5XG4gICAgICogKVxuICAgICAqL1xuICAgIHByaW1hcnlLZXkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgcHJpbWFyeUtleTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmb3JlaWduIGtleSBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogSWYgeW91ciBkYXRhYmFzZSBlbmdpbmUgZG9lc24ndCBzdXBwb3J0IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGluIHRoZVxuICAgICAqIGNvbHVtbiBkZWZpbml0aW9uIChsaWtlIE15U1FMIDUpIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHRhYmxlIGxldmVsXG4gICAgICoge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH0gbWV0aG9kIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZCcsICdpbnRlZ2VyJywgKGNvbCkgPT4gY29sLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGV0XCIgKFxuICAgICAqICAgXCJvd25lcl9pZFwiIGludGVnZXIgcmVmZXJlbmNlcyBcInBlcnNvblwiIChcImlkXCIpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlZmVyZW5jZXMocmVmKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBwYXJzZVN0cmluZ1JlZmVyZW5jZShyZWYpO1xuICAgICAgICBpZiAoIXJlZmVyZW5jZXMudGFibGUgfHwgU2VsZWN0QWxsTm9kZS5pcyhyZWZlcmVuY2VzLmNvbHVtbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBjYWxsIHJlZmVyZW5jZXMoJyR7cmVmfScpLiBUaGUgcmVmZXJlbmNlIG11c3QgaGF2ZSBmb3JtYXQgdGFibGUuY29sdW1uIG9yIHNjaGVtYS50YWJsZS5jb2x1bW5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzTm9kZS5jcmVhdGUocmVmZXJlbmNlcy50YWJsZSwgW1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMuY29sdW1uLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBgb24gZGVsZXRlYCBjb25zdHJhaW50IGZvciB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLlxuICAgICAqXG4gICAgICogSWYgeW91ciBkYXRhYmFzZSBlbmdpbmUgZG9lc24ndCBzdXBwb3J0IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGluIHRoZVxuICAgICAqIGNvbHVtbiBkZWZpbml0aW9uIChsaWtlIE15U1FMIDUpIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHRhYmxlIGxldmVsXG4gICAgICoge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH0gbWV0aG9kIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKFxuICAgICAqICAgICAnb3duZXJfaWQnLFxuICAgICAqICAgICAnaW50ZWdlcicsXG4gICAgICogICAgIChjb2wpID0+IGNvbC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKS5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXRcIiAoXG4gICAgICogICBcIm93bmVyX2lkXCIgaW50ZWdlciByZWZlcmVuY2VzIFwicGVyc29uXCIgKFwiaWRcIikgb24gZGVsZXRlIGNhc2NhZGVcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb25EZWxldGUob25EZWxldGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNub2RlLnJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb24gZGVsZXRlIGNvbnN0cmFpbnQgY2FuIG9ubHkgYmUgYWRkZWQgZm9yIGZvcmVpZ24ga2V5cycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNOb2RlLmNsb25lV2l0aE9uRGVsZXRlKHRoaXMuI25vZGUucmVmZXJlbmNlcywgcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24ob25EZWxldGUpKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGBvbiB1cGRhdGVgIGNvbnN0cmFpbnQgZm9yIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBJZiB5b3VyIGRhdGFiYXNlIGVuZ2luZSBkb2Vzbid0IHN1cHBvcnQgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgaW4gdGhlXG4gICAgICogY29sdW1uIGRlZmluaXRpb24gKGxpa2UgTXlTUUwgNSkgeW91IG5lZWQgdG8gY2FsbCB0aGUgdGFibGUgbGV2ZWxcbiAgICAgKiB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50fSBtZXRob2QgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oXG4gICAgICogICAgICdvd25lcl9pZCcsXG4gICAgICogICAgICdpbnRlZ2VyJyxcbiAgICAgKiAgICAgKGNvbCkgPT4gY29sLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpLm9uVXBkYXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBldFwiIChcbiAgICAgKiAgIFwib3duZXJfaWRcIiBpbnRlZ2VyIHJlZmVyZW5jZXMgXCJwZXJzb25cIiAoXCJpZFwiKSBvbiB1cGRhdGUgY2FzY2FkZVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvblVwZGF0ZShvblVwZGF0ZSkge1xuICAgICAgICBpZiAoIXRoaXMuI25vZGUucmVmZXJlbmNlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbiB1cGRhdGUgY29uc3RyYWludCBjYW4gb25seSBiZSBhZGRlZCBmb3IgZm9yZWlnbiBrZXlzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgcmVmZXJlbmNlczogUmVmZXJlbmNlc05vZGUuY2xvbmVXaXRoT25VcGRhdGUodGhpcy4jbm9kZS5yZWZlcmVuY2VzLCBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbihvblVwZGF0ZSkpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB1bmlxdWUgY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2VtYWlsJywgJ3ZhcmNoYXIoMjU1KScsIGNvbCA9PiBjb2wudW5pcXVlKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBlbWFpbGAgdmFyY2hhcigyNTUpIHVuaXF1ZVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB1bmlxdWUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgdW5pcXVlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGBub3QgbnVsbGAgY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcigyNTUpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBmaXJzdF9uYW1lYCB2YXJjaGFyKDI1NSkgbm90IG51bGxcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbm90TnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBub3ROdWxsOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGB1bnNpZ25lZGAgbW9kaWZpZXIgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIE15U1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignYWdlJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnVuc2lnbmVkKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBhZ2VgIGludGVnZXIgdW5zaWduZWRcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdW5zaWduZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgdW5zaWduZWQ6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZGVmYXVsdCB2YWx1ZSBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignbnVtYmVyX29mX2xlZ3MnLCAnaW50ZWdlcicsIChjb2wpID0+IGNvbC5kZWZhdWx0VG8oNCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXRgIChcbiAgICAgKiAgIGBudW1iZXJfb2ZfbGVnc2AgaW50ZWdlciBkZWZhdWx0IDRcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBWYWx1ZXMgcGFzc2VkIHRvIGBkZWZhdWx0VG9gIGFyZSBpbnRlcnByZXRlZCBhcyB2YWx1ZSBsaXRlcmFscyBieSBkZWZhdWx0LiBZb3UgY2FuIGRlZmluZVxuICAgICAqIGFuIGFyYml0cmFyeSBTUUwgZXhwcmVzc2lvbiB1c2luZyB0aGUge0BsaW5rIHNxbH0gdGVtcGxhdGUgdGFnOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbihcbiAgICAgKiAgICAgJ2NyZWF0ZWRfYXQnLFxuICAgICAqICAgICAndGltZXN0YW1wJyxcbiAgICAgKiAgICAgKGNvbCkgPT4gY29sLmRlZmF1bHRUbyhzcWxgQ1VSUkVOVF9USU1FU1RBTVBgKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGV0YCAoXG4gICAgICogICBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIGRlZmF1bHQgQ1VSUkVOVF9USU1FU1RBTVBcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZGVmYXVsdFRvKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGRlZmF1bHRUbzogRGVmYXVsdFZhbHVlTm9kZS5jcmVhdGUocGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uKHZhbHVlKSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNoZWNrIGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ251bWJlcl9vZl9sZWdzJywgJ2ludGVnZXInLCAoY29sKSA9PlxuICAgICAqICAgICBjb2wuY2hlY2soc3FsYG51bWJlcl9vZl9sZWdzIDwgNWApXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXRgIChcbiAgICAgKiAgIGBudW1iZXJfb2ZfbGVnc2AgaW50ZWdlciBjaGVjayAobnVtYmVyX29mX2xlZ3MgPCA1KVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVjayhleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGNoZWNrOiBDaGVja0NvbnN0cmFpbnROb2RlLmNyZWF0ZShleHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgY29sdW1uIGEgZ2VuZXJhdGVkIGNvbHVtbiB1c2luZyBhIGBnZW5lcmF0ZWQgYWx3YXlzIGFzYCBzdGF0ZW1lbnQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2Z1bGxfbmFtZScsICd2YXJjaGFyKDI1NSknLFxuICAgICAqICAgICAoY29sKSA9PiBjb2wuZ2VuZXJhdGVkQWx3YXlzQXMoc3FsYGNvbmNhdChmaXJzdF9uYW1lLCAnICcsIGxhc3RfbmFtZSlgKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgZnVsbF9uYW1lYCB2YXJjaGFyKDI1NSkgZ2VuZXJhdGVkIGFsd2F5cyBhcyAoY29uY2F0KGZpcnN0X25hbWUsICcgJywgbGFzdF9uYW1lKSlcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2VuZXJhdGVkQWx3YXlzQXMoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZE5vZGUuY3JlYXRlV2l0aEV4cHJlc3Npb24oZXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYGdlbmVyYXRlZCBhbHdheXMgYXMgaWRlbnRpdHlgIHNwZWNpZmllci5cbiAgICAgKlxuICAgICAqIFRoaXMgb25seSB3b3JrcyBvbiBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTC5cbiAgICAgKlxuICAgICAqIEZvciBNUyBTUUwgU2VydmVyIChNU1NRTCkncyBpZGVudGl0eSBjb2x1bW4gdXNlIHtAbGluayBpZGVudGl0eX0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5nZW5lcmF0ZWRBbHdheXNBc0lkZW50aXR5KCkucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGVyc29uXCIgKFxuICAgICAqICAgXCJpZFwiIGludGVnZXIgZ2VuZXJhdGVkIGFsd2F5cyBhcyBpZGVudGl0eSBwcmltYXJ5IGtleVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRBbHdheXNBc0lkZW50aXR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZE5vZGUuY3JlYXRlKHsgaWRlbnRpdHk6IHRydWUsIGFsd2F5czogdHJ1ZSB9KSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgYXMgaWRlbnRpdHlgIHNwZWNpZmllciBvbiBzdXBwb3J0ZWQgZGlhbGVjdHMuXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiBGb3IgTVMgU1FMIFNlcnZlciAoTVNTUUwpJ3MgaWRlbnRpdHkgY29sdW1uIHVzZSB7QGxpbmsgaWRlbnRpdHl9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wuZ2VuZXJhdGVkQnlEZWZhdWx0QXNJZGVudGl0eSgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiaWRcIiBpbnRlZ2VyIGdlbmVyYXRlZCBieSBkZWZhdWx0IGFzIGlkZW50aXR5IHByaW1hcnkga2V5XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdlbmVyYXRlZEJ5RGVmYXVsdEFzSWRlbnRpdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkTm9kZS5jcmVhdGUoeyBpZGVudGl0eTogdHJ1ZSwgYnlEZWZhdWx0OiB0cnVlIH0pLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgZ2VuZXJhdGVkIGNvbHVtbiBzdG9yZWQgaW5zdGVhZCBvZiB2aXJ0dWFsLiBUaGlzIG1ldGhvZCBjYW4gb25seVxuICAgICAqIGJlIHVzZWQgd2l0aCB7QGxpbmsgZ2VuZXJhdGVkQWx3YXlzQXN9XG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmdWxsX25hbWUnLCAndmFyY2hhcigyNTUpJywgKGNvbCkgPT4gY29sXG4gICAgICogICAgIC5nZW5lcmF0ZWRBbHdheXNBcyhzcWxgY29uY2F0KGZpcnN0X25hbWUsICcgJywgbGFzdF9uYW1lKWApXG4gICAgICogICAgIC5zdG9yZWQoKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgZnVsbF9uYW1lYCB2YXJjaGFyKDI1NSkgZ2VuZXJhdGVkIGFsd2F5cyBhcyAoY29uY2F0KGZpcnN0X25hbWUsICcgJywgbGFzdF9uYW1lKSkgc3RvcmVkXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHN0b3JlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNub2RlLmdlbmVyYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdG9yZWQoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgZ2VuZXJhdGVkQWx3YXlzQXMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUuZ2VuZXJhdGVkLCB7XG4gICAgICAgICAgICAgICAgc3RvcmVkOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHJpZ2h0IGFmdGVyIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKFxuICAgICAqICAgICAnZmlyc3RfbmFtZScsXG4gICAgICogICAgICd2YXJjaGFyKDM2KScsXG4gICAgICogICAgIChjb2wpID0+IGNvbC5tb2RpZnlGcm9udChzcWxgY29sbGF0ZSB1dGY4bWI0X2dlbmVyYWxfY2lgKS5ub3ROdWxsKClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5LFxuICAgICAqICAgYGZpcnN0X25hbWVgIHZhcmNoYXIoMzYpIGNvbGxhdGUgdXRmOG1iNF9nZW5lcmFsX2NpIG5vdCBudWxsXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUZyb250KG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoRnJvbnRNb2RpZmllcih0aGlzLiNub2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBub3QgZGlzdGluY3RgIHNwZWNpZmllci5cbiAgICAgKiBTaG91bGQgYmUgdXNlZCB3aXRoIGB1bmlxdWVgIGNvbnN0cmFpbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoMzApJywgY29sID0+IGNvbC51bmlxdWUoKS5udWxsc05vdERpc3RpbmN0KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXJzb25cIiAoXG4gICAgICogICBcImlkXCIgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIFwiZmlyc3RfbmFtZVwiIHZhcmNoYXIoMzApIHVuaXF1ZSBudWxscyBub3QgZGlzdGluY3RcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbnVsbHNOb3REaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBudWxsc05vdERpc3RpbmN0OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgaWYgbm90IGV4aXN0c2Agc3BlY2lmaWVyLiBUaGlzIG9ubHkgd29ya3MgZm9yIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2VtYWlsJywgJ3ZhcmNoYXIoMjU1KScsIGNvbCA9PiBjb2wudW5pcXVlKCkuaWZOb3RFeGlzdHMoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGFsdGVyIHRhYmxlIFwicGVyc29uXCIgYWRkIGNvbHVtbiBpZiBub3QgZXhpc3RzIFwiZW1haWxcIiB2YXJjaGFyKDI1NSkgdW5pcXVlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaWZOb3RFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgaWZOb3RFeGlzdHM6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgY29sdW1uIGRlZmluaXRpb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKFxuICAgICAqICAgICAnYWdlJyxcbiAgICAgKiAgICAgJ2ludGVnZXInLFxuICAgICAqICAgICBjb2wgPT4gY29sLnVuc2lnbmVkKClcbiAgICAgKiAgICAgICAubm90TnVsbCgpXG4gICAgICogICAgICAgLm1vZGlmeUVuZChzcWxgY29tbWVudCAke3NxbC5saXQoJ2l0IGlzIG5vdCBwb2xpdGUgdG8gYXNrIGEgd29tYW4gaGVyIGFnZScpfWApXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBpZGAgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIGBhZ2VgIGludGVnZXIgdW5zaWduZWQgbm90IG51bGwgY29tbWVudCAnaXQgaXMgbm90IHBvbGl0ZSB0byBhc2sgYSB3b21hbiBoZXIgYWdlJ1xuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNub2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9tb2RpZnktY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTW9kaWZ5Q29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnTW9kaWZ5Q29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ01vZGlmeUNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgUmVmZXJlbmNlc05vZGUgfSBmcm9tICcuL3JlZmVyZW5jZXMtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRm9yZWlnbktleUNvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdGb3JlaWduS2V5Q29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNvdXJjZUNvbHVtbnMsIHRhcmdldFRhYmxlLCB0YXJnZXRDb2x1bW5zLCBjb25zdHJhaW50TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGb3JlaWduS2V5Q29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogc291cmNlQ29sdW1ucyxcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNOb2RlLmNyZWF0ZSh0YXJnZXRUYWJsZSwgdGFyZ2V0Q29sdW1ucyksXG4gICAgICAgICAgICBuYW1lOiBjb25zdHJhaW50TmFtZSA/IElkZW50aWZpZXJOb2RlLmNyZWF0ZShjb25zdHJhaW50TmFtZSkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbiB9IGZyb20gJy4uL3BhcnNlci9vbi1tb2RpZnktYWN0aW9uLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICBvbkRlbGV0ZShvbkRlbGV0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIG9uRGVsZXRlOiBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbihvbkRlbGV0ZSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgb25VcGRhdGUob25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBvblVwZGF0ZTogcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24ob25VcGRhdGUpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGRlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgbm90RGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5SW1tZWRpYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hZGQtY29uc3RyYWludC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFkZENvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBZGRDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb25zdHJhaW50LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VuaXF1ZS1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVbmlxdWVDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVW5pcXVlQ29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lLCBudWxsc05vdERpc3RpbmN0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VuaXF1ZUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpLFxuICAgICAgICAgICAgbmFtZTogY29uc3RyYWludE5hbWUgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEcm9wQ29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnROYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wQ29uc3RyYWludCwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wQ29uc3RyYWludCxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLWNvbHVtbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4vY29sdW1uLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFsdGVyQ29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWx0ZXJDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FsdGVyQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbiksXG4gICAgICAgICAgICBbcHJvcF06IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLWNvbHVtbi1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWx0ZXJDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9kZWZhdWx0LXZhbHVlLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJDb2x1bW5CdWlsZGVyIHtcbiAgICAjY29sdW1uO1xuICAgIGNvbnN0cnVjdG9yKGNvbHVtbikge1xuICAgICAgICB0aGlzLiNjb2x1bW4gPSBjb2x1bW47XG4gICAgfVxuICAgIHNldERhdGFUeXBlKGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdkYXRhVHlwZScsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdzZXREZWZhdWx0JywgcGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uKHZhbHVlKSkpO1xuICAgIH1cbiAgICBkcm9wRGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlcmVkQ29sdW1uQnVpbGRlcihBbHRlckNvbHVtbk5vZGUuY3JlYXRlKHRoaXMuI2NvbHVtbiwgJ2Ryb3BEZWZhdWx0JywgdHJ1ZSkpO1xuICAgIH1cbiAgICBzZXROb3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyZWRDb2x1bW5CdWlsZGVyKEFsdGVyQ29sdW1uTm9kZS5jcmVhdGUodGhpcy4jY29sdW1uLCAnc2V0Tm90TnVsbCcsIHRydWUpKTtcbiAgICB9XG4gICAgZHJvcE5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdkcm9wTm90TnVsbCcsIHRydWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbn1cbi8qKlxuICogQWxsb3dzIHVzIHRvIGZvcmNlIGNvbnN1bWVycyB0byBkbyBleGFjdGx5IG9uZSBhbHRlcmF0aW9uIHRvIGEgY29sdW1uLlxuICpcbiAqIE9uZSBjYW5ub3QgZG8gbm8gYWx0ZXJhdGlvbnM6XG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IGRiLnNjaGVtYVxuICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAqIC8vICAuZXhlY3V0ZSgpIC8vIFByb3BlcnR5ICdleGVjdXRlJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdBbHRlcmVkQ29sdW1uQnVpbGRlcicuXG4gKiBgYGBcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgZGIuc2NoZW1hXG4gKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICogLy8gIC5hbHRlckNvbHVtbignYWdlJywgKGFjKSA9PiBhYykgLy8gVHlwZSAnQWx0ZXJDb2x1bW5CdWlsZGVyJyBpcyBub3QgYXNzaWduYWJsZSB0byB0eXBlICdBbHRlcmVkQ29sdW1uQnVpbGRlcicuXG4gKiAvLyAgLmV4ZWN1dGUoKVxuICogYGBgXG4gKlxuICogT25lIGNhbm5vdCBkbyBtdWx0aXBsZSBhbHRlcmF0aW9uczpcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgZGIuc2NoZW1hXG4gKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICogLy8gIC5hbHRlckNvbHVtbignYWdlJywgKGFjKSA9PiBhYy5kcm9wTm90TnVsbCgpLnNldE5vdE51bGwoKSkgLy8gUHJvcGVydHkgJ3NldE5vdE51bGwnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0FsdGVyZWRDb2x1bW5CdWlsZGVyJy5cbiAqIC8vICAuZXhlY3V0ZSgpXG4gKiBgYGBcbiAqXG4gKiBXaGljaCB3b3VsZCBub3cgdGhyb3cgYSBjb21waWxhdGlvbiBlcnJvciwgaW5zdGVhZCBvZiBhIHJ1bnRpbWUgZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbHRlcmVkQ29sdW1uQnVpbGRlciB7XG4gICAgI2FsdGVyQ29sdW1uTm9kZTtcbiAgICBjb25zdHJ1Y3RvcihhbHRlckNvbHVtbk5vZGUpIHtcbiAgICAgICAgdGhpcy4jYWx0ZXJDb2x1bW5Ob2RlID0gYWx0ZXJDb2x1bW5Ob2RlO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbHRlckNvbHVtbk5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1leGVjdXRvci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlRXhlY3V0b3Ige1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtYWRkLWZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZENvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWRkLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIG9uRGVsZXRlKG9uRGVsZXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5vbkRlbGV0ZShvbkRlbGV0ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvblVwZGF0ZShvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcjogdGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIub25VcGRhdGUob25VcGRhdGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLmRlZmVycmFibGUoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5ub3REZWZlcnJhYmxlKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsbHlEZWZlcnJlZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLmluaXRpYWxseURlZmVycmVkKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsbHlJbW1lZGlhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5pbml0aWFsbHlJbW1lZGlhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkoQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICBhZGRDb25zdHJhaW50OiBBZGRDb25zdHJhaW50Tm9kZS5jcmVhdGUodGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1kcm9wLWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsdGVyVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgaWZFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuZHJvcENvbnN0cmFpbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuZHJvcENvbnN0cmFpbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXI6ICdjYXNjYWRlJyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzdHJpY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuZHJvcENvbnN0cmFpbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXI6ICdyZXN0cmljdCcsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wcmltYXJ5LWtleS1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1ByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpLFxuICAgICAgICAgICAgbmFtZTogY29uc3RyYWludE5hbWUgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHsgLi4ubm9kZSwgLi4ucHJvcHMgfSk7XG4gICAgfSxcbn0pO1xuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgYSB0eXBvIGluIHRoZSBjb2RlYmFzZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZX0gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFByaW1hcnlDb25zdHJhaW50Tm9kZSA9IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWRkLWluZGV4LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZGRJbmRleE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FkZEluZGV4Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW5zKG5vZGUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgY29sdW1uczogWy4uLihub2RlLmNvbHVtbnMgfHwgW10pLCAuLi5jb2x1bW5zXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1hZGQtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZSwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGluZGV4IHVuaXF1ZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZEluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogICAudW5pcXVlKClcbiAgICAgKiAgIC5jb2x1bW4oJ2VtYWlsJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgdW5pcXVlIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9pbmRleGAgKGBlbWFpbGApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdW5pcXVlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgaW5kZXguXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB7QGxpbmsgY29sdW1uc30gZm9yIGFkZGluZyBtdWx0aXBsZSBjb2x1bW5zIGF0IG9uY2Ugb3Ige0BsaW5rIGV4cHJlc3Npb259XG4gICAgICogZm9yIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAuY29sdW1uKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgIC5jb2x1bW4oJ2FnZSBkZXNjJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgaW5kZXggYHBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhgIChgZmlyc3RfbmFtZWAsIGBhZ2VgIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZS5hZGRJbmRleCwgW1xuICAgICAgICAgICAgICAgICAgICBwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKGNvbHVtbiksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbn0gZm9yIGFkZGluZyBhIHNpbmdsZSBjb2x1bW4gb3Ige0BsaW5rIGV4cHJlc3Npb259IGZvclxuICAgICAqIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnYWdlIGRlc2MnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgaW5kZXggYHBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhgIChgZmlyc3RfbmFtZWAsIGBhZ2VgIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZEluZGV4OiBBZGRJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCBjb2x1bW5zLm1hcChwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbiBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfaW5kZXgnKVxuICAgICAqICAgLmV4cHJlc3Npb24oc3FsPGJvb2xlYW4+YChmaXJzdF9uYW1lIDwgJ1NhbWknKWApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgYWRkIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9pbmRleGAgKChmaXJzdF9uYW1lIDwgJ1NhbWknKSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBleHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkSW5kZXg6IEFkZEluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUuYWRkSW5kZXgsIFtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXNpbmcoaW5kZXhUeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZEluZGV4OiBBZGRJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuYWRkSW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgdXNpbmc6IFJhd05vZGUuY3JlYXRlV2l0aFNxbChpbmRleFR5cGUpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdW5pcXVlLWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBub3QgZGlzdGluY3RgIHRvIHRoZSB1bmlxdWUgY29uc3RyYWludCBkZWZpbml0aW9uXG4gICAgICpcbiAgICAgKiBTdXBwb3J0ZWQgYnkgUG9zdGdyZVNRTCBkaWFsZWN0IG9ubHlcbiAgICAgKi9cbiAgICBudWxsc05vdERpc3RpbmN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlcihVbmlxdWVDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBudWxsc05vdERpc3RpbmN0OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgZGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgZGVmZXJyYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBpbml0aWFsbHlJbW1lZGlhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcHJpbWFyeS1rZXktY29uc3RyYWludC1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIGRlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgbm90RGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIoUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5SW1tZWRpYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlcihQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgQ2hlY2tDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmVuYW1lLWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJlbmFtZUNvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZW5hbWVDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob2xkTmFtZSwgbmV3TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZW5hbWVDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBvbGROYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUob2xkTmFtZSksXG4gICAgICAgICAgICBuZXdOYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUobmV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbHRlci10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLWRlZmluaXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgUmVuYW1lQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlbmFtZS1jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIG5vb3AgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlciwgfSBmcm9tICcuL2NvbHVtbi1kZWZpbml0aW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgTW9kaWZ5Q29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL21vZGlmeS1jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQWRkQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgRHJvcENvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQWx0ZXJDb2x1bW5CdWlsZGVyLCB9IGZyb20gJy4vYWx0ZXItY29sdW1uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZUV4ZWN1dG9yIH0gZnJvbSAnLi9hbHRlci10YWJsZS1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1hZGQtZm9yZWlnbi1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVEcm9wQ29uc3RyYWludEJ1aWxkZXIgfSBmcm9tICcuL2FsdGVyLXRhYmxlLWRyb3AtY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFkZEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIgfSBmcm9tICcuL2FsdGVyLXRhYmxlLWFkZC1pbmRleC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciwgfSBmcm9tICcuL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IENoZWNrQ29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUmVuYW1lQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZW5hbWUtY29uc3RyYWludC1ub2RlLmpzJztcbi8qKlxuICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGBhbHRlciB0YWJsZWAgcXVlcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgcmVuYW1lVG8obmV3VGFibGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgcmVuYW1lVG86IHBhcnNlVGFibGUobmV3VGFibGVOYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0U2NoZW1hKG5ld1NjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHNldFNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5ld1NjaGVtYSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFsdGVyQ29sdW1uKGNvbHVtbiwgYWx0ZXJhdGlvbikge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYWx0ZXJhdGlvbihuZXcgQWx0ZXJDb2x1bW5CdWlsZGVyKGNvbHVtbikpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBEcm9wQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb2x1bW4oY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBSZW5hbWVDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGRhdGFUeXBlLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jcmVhdGUoY29sdW1uTmFtZSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIEFkZENvbHVtbk5vZGUuY3JlYXRlKGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUNvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBNb2RpZnlDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRVbmlxdWVDb25zdHJhaW50fVxuICAgICAqL1xuICAgIGFkZFVuaXF1ZUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCB1bmlxdWVDb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZENvbnN0cmFpbnQ6IEFkZENvbnN0cmFpbnROb2RlLmNyZWF0ZSh1bmlxdWVDb25zdHJhaW50QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZENoZWNrQ29uc3RyYWludH1cbiAgICAgKi9cbiAgICBhZGRDaGVja0NvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNoZWNrRXhwcmVzc2lvbiwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGNvbnN0cmFpbnRCdWlsZGVyID0gYnVpbGQobmV3IENoZWNrQ29uc3RyYWludEJ1aWxkZXIoQ2hlY2tDb25zdHJhaW50Tm9kZS5jcmVhdGUoY2hlY2tFeHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRDb25zdHJhaW50OiBBZGRDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH1cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50fSB0aGlzIG1ldGhvZCByZXR1cm5zXG4gICAgICogdGhlIGNvbnN0cmFpbnQgYnVpbGRlciBhbmQgZG9lc24ndCB0YWtlIGEgY2FsbGJhY2sgYXMgdGhlIGxhc3QgYXJndW1lbnQuIFRoaXNcbiAgICAgKiBpcyBiZWNhdXNlIHlvdSBjYW4gb25seSBhZGQgb25lIGNvbHVtbiBwZXIgYEFMVEVSIFRBQkxFYCBxdWVyeS5cbiAgICAgKi9cbiAgICBhZGRGb3JlaWduS2V5Q29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY29sdW1ucywgdGFyZ2V0VGFibGUsIHRhcmdldENvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIHBhcnNlVGFibGUodGFyZ2V0VGFibGUpLCB0YXJnZXRDb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZFByaW1hcnlLZXlDb25zdHJhaW50fVxuICAgICAqL1xuICAgIGFkZFByaW1hcnlLZXlDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkQ29uc3RyYWludDogQWRkQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZHJvcENvbnN0cmFpbnQ6IERyb3BDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb25zdHJhaW50KG9sZE5hbWUsIG5ld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgcmVuYW1lQ29uc3RyYWludDogUmVuYW1lQ29uc3RyYWludE5vZGUuY3JlYXRlKG9sZE5hbWUsIG5ld05hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBpbmRleCB0byB0YWJsZS5cbiAgICAgKlxuICAgICAqICAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkSW5kZXgoJ3BlcnNvbl9lbWFpbF9pbmRleCcpXG4gICAgICogICAuY29sdW1uKCdlbWFpbCcpXG4gICAgICogICAudW5pcXVlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgdW5pcXVlIGluZGV4IGBwZXJzb25fZW1haWxfaW5kZXhgIChgZW1haWxgKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZEluZGV4KGluZGV4TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRyb3AgaW5kZXggZnJvbSB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zY2hlbWEuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5kcm9wSW5kZXgoJ3BlcnNvbl9lbWFpbF9pbmRleCcpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgZHJvcCBpbmRleCBgdGVzdF9maXJzdF9uYW1lX2luZGV4YFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BJbmRleChpbmRleE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBkcm9wSW5kZXg6IERyb3BJbmRleE5vZGUuY3JlYXRlKGluZGV4TmFtZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLiRjYWxsfVxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGFsdGVyQ29sdW1uKGNvbHVtbiwgYWx0ZXJhdGlvbikge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYWx0ZXJhdGlvbihuZXcgQWx0ZXJDb2x1bW5CdWlsZGVyKGNvbHVtbikpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBEcm9wQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb2x1bW4oY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBSZW5hbWVDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGRhdGFUeXBlLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jcmVhdGUoY29sdW1uTmFtZSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIEFkZENvbHVtbk5vZGUuY3JlYXRlKGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUNvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBNb2RpZnlDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ltbWVkaWF0ZS12YWx1ZS10cmFuc2Zvcm1lci5kLnRzXCIgLz5cbmltcG9ydCB7IE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXRyYW5zZm9ybWVyLmpzJztcbmltcG9ydCB7IFZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG4vKipcbiAqIFRyYW5zZm9ybXMgYWxsIFZhbHVlTm9kZXMgdG8gaW1tZWRpYXRlLlxuICpcbiAqIFdBUk5JTkchIFRoaXMgc2hvdWxkIG5ldmVyIGJlIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuIFVzZXJzIHNob3VsZCBuZXZlciB1c2UgdGhpcy5cbiAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciBleHRlbmRzIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB7XG4gICAgdHJhbnNmb3JtUHJpbWl0aXZlVmFsdWVMaXN0KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZhbHVlTGlzdE5vZGUuY3JlYXRlKG5vZGUudmFsdWVzLm1hcChWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVZhbHVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUobm9kZS52YWx1ZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENyZWF0ZUluZGV4Tm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtaW5kZXgtbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZSwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS10cmFuc2Zvcm1lci5qcyc7XG5leHBvcnQgY2xhc3MgQ3JlYXRlSW5kZXhCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImlmIG5vdCBleGlzdHNcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIElmIHRoZSBpbmRleCBhbHJlYWR5IGV4aXN0cywgbm8gZXJyb3IgaXMgdGhyb3duIGlmIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZk5vdEV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGluZGV4IHVuaXF1ZS5cbiAgICAgKi9cbiAgICB1bmlxdWUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBub3QgZGlzdGluY3RgIHNwZWNpZmllciB0byBpbmRleC5cbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogIC5vbigncGVyc29uJylcbiAgICAgKiAgLmNvbHVtbignZmlyc3RfbmFtZScpXG4gICAgICogIC5udWxsc05vdERpc3RpbmN0KClcbiAgICAgKiAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfaW5kZXhcIlxuICAgICAqIG9uIFwidGVzdFwiIChcImZpcnN0X25hbWVcIilcbiAgICAgKiBudWxscyBub3QgZGlzdGluY3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbnVsbHNOb3REaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIHRhYmxlIGZvciB0aGUgaW5kZXguXG4gICAgICovXG4gICAgb24odGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcGFyc2VUYWJsZSh0YWJsZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2x1bW4gdG8gdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbnN9IGZvciBhZGRpbmcgbXVsdGlwbGUgY29sdW1ucyBhdCBvbmNlIG9yIHtAbGluayBleHByZXNzaW9ufVxuICAgICAqIGZvciBzcGVjaWZ5aW5nIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgICAgICAgLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4JylcbiAgICAgKiAgICAgICAgIC5vbigncGVyc29uJylcbiAgICAgKiAgICAgICAgIC5jb2x1bW4oJ2ZpcnN0X25hbWUnKVxuICAgICAqICAgICAgICAgLmNvbHVtbignYWdlIGRlc2MnKVxuICAgICAqICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleFwiIG9uIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImFnZVwiIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUsIFtcbiAgICAgICAgICAgICAgICBwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKGNvbHVtbiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbn0gZm9yIGFkZGluZyBhIHNpbmdsZSBjb2x1bW4gb3Ige0BsaW5rIGV4cHJlc3Npb259IGZvclxuICAgICAqIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAgICAgICAuY3JlYXRlSW5kZXgoJ3BlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXgnKVxuICAgICAqICAgICAgICAgLm9uKCdwZXJzb24nKVxuICAgICAqICAgICAgICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJywgJ2FnZSBkZXNjJ10pXG4gICAgICogICAgICAgICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgaW5kZXggXCJwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4XCIgb24gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwiYWdlXCIgZGVzYylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLCBjb2x1bW5zLm1hcChwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24gZm9yIHRoZSBpbmRleC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogICAub24oJ3BlcnNvbicpXG4gICAgICogICAuZXhwcmVzc2lvbihzcWxgZmlyc3RfbmFtZSBDT0xMQVRFIFwiZmlfRklcImApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgaW5kZXggXCJwZXJzb25fZmlyc3RfbmFtZV9pbmRleFwiIG9uIFwicGVyc29uXCIgKGZpcnN0X25hbWUgQ09MTEFURSBcImZpX0ZJXCIpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZSwgW1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVzaW5nKGluZGV4VHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHVzaW5nOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoaW5kZXhUeXBlKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyKCk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLm5vZGUsIHRyYW5zZm9ybWVyLnRyYW5zZm9ybU5vZGUocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSwgdGhpcy4jcHJvcHMucXVlcnlJZCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS1zY2hlbWEtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENyZWF0ZVNjaGVtYU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtc2NoZW1hLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIENyZWF0ZVNjaGVtYUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmTm90RXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVNjaGVtYUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVTY2hlbWFOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IGlmTm90RXhpc3RzOiB0cnVlIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLWNvbW1pdC1hY3Rpb24tcGFyc2UuZC50c1wiIC8+XG5pbXBvcnQgeyBPTl9DT01NSVRfQUNUSU9OUywgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPbkNvbW1pdEFjdGlvbihhY3Rpb24pIHtcbiAgICBpZiAoT05fQ09NTUlUX0FDVElPTlMuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgT25Db21taXRBY3Rpb24gJHthY3Rpb259YCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS10YWJsZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tZGVmaW5pdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IENyZWF0ZVRhYmxlTm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlciB9IGZyb20gJy4vY29sdW1uLWRlZmluaXRpb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIG5vb3AgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciwgfSBmcm9tICcuL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wcmltYXJ5LWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgVW5pcXVlQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS91bmlxdWUtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IENoZWNrQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jaGVjay1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VPbkNvbW1pdEFjdGlvbiB9IGZyb20gJy4uL3BhcnNlci9vbi1jb21taXQtYWN0aW9uLXBhcnNlLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciwgfSBmcm9tICcuL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnLi4vcGFyc2VyL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciwgfSBmcm9tICcuL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vY2hlY2stY29uc3RyYWludC1idWlsZGVyLmpzJztcbi8qKlxuICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGBjcmVhdGUgdGFibGVgIHF1ZXJ5LlxuICovXG5leHBvcnQgY2xhc3MgQ3JlYXRlVGFibGVCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcInRlbXBvcmFyeVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHRhYmxlLlxuICAgICAqL1xuICAgIHRlbXBvcmFyeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0ZW1wb3Jhcnk6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gXCJvbiBjb21taXRcIiBzdGF0ZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGVtcG9yYXJ5IHRhYmxlcyBvbiBzdXBwb3J0ZWQgZGF0YWJhc2VzXG4gICAgICogbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqL1xuICAgIG9uQ29tbWl0KG9uQ29tbWl0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgb25Db21taXQ6IHBhcnNlT25Db21taXRBY3Rpb24ob25Db21taXQpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImlmIG5vdCBleGlzdHNcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbm8gZXJyb3IgaXMgdGhyb3duIGlmIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZk5vdEV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCAoY29sKSA9PiBjb2wuYXV0b0luY3JlbWVudCgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig1MCknLCAoY29sKSA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoMjU1KScpXG4gICAgICogICAuYWRkQ29sdW1uKCdiYW5rX2JhbGFuY2UnLCAnbnVtZXJpYyg4LCAyKScpXG4gICAgICogICAvLyBZb3UgY2FuIHNwZWNpZnkgYW55IGRhdGEgdHlwZSB1c2luZyB0aGUgYHNxbGAgdGFnIGlmIHRoZSB0eXBlc1xuICAgICAqICAgLy8gZG9uJ3QgaW5jbHVkZSBpdC5cbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2RhdGEnLCBzcWxgYW55X3R5cGVfaGVyZWApXG4gICAgICogICAuYWRkQ29sdW1uKCdwYXJlbnRfaWQnLCAnaW50ZWdlcicsIChjb2wpID0+XG4gICAgICogICAgIGNvbC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKS5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBXaXRoIHRoaXMgbWV0aG9kLCBpdCdzIG9uY2UgYWdhaW4gZ29vZCB0byByZW1lbWJlciB0aGF0IEt5c2VseSBqdXN0IGJ1aWxkcyB0aGVcbiAgICAgKiBxdWVyeSBhbmQgZG9lc24ndCBwcm92aWRlIHRoZSBzYW1lIEFQSSBmb3IgYWxsIGRhdGFiYXNlcy4gRm9yIGV4YW1wbGUsIHNvbWVcbiAgICAgKiBkYXRhYmFzZXMgbGlrZSBvbGRlciBNeVNRTCBkb24ndCBzdXBwb3J0IHRoZSBgcmVmZXJlbmNlc2Agc3RhdGVtZW50IGluIHRoZVxuICAgICAqIGNvbHVtbiBkZWZpbml0aW9uLiBJbnN0ZWFkIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIG5lZWQgdG8gYmUgZGVmaW5lZCBpbiB0aGVcbiAgICAgKiBgY3JlYXRlIHRhYmxlYCBxdWVyeS4gU2VlIHRoZSBuZXh0IGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIChjb2wpID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdwYXJlbnRfaWQnLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoXG4gICAgICogICAgICdwZXJzb25fcGFyZW50X2lkX2ZrJyxcbiAgICAgKiAgICAgWydwYXJlbnRfaWQnXSxcbiAgICAgKiAgICAgJ3BlcnNvbicsXG4gICAgICogICAgIFsnaWQnXSxcbiAgICAgKiAgICAgKGNiKSA9PiBjYi5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbm90aGVyIGdvb2QgZXhhbXBsZSBpcyB0aGF0IFBvc3RncmVTUUwgZG9lc24ndCBzdXBwb3J0IHRoZSBgYXV0b19pbmNyZW1lbnRgXG4gICAgICoga2V5d29yZCBhbmQgeW91IG5lZWQgdG8gZGVmaW5lIGFuIGF1dG9pbmNyZW1lbnRpbmcgY29sdW1uIGZvciBleGFtcGxlIHVzaW5nXG4gICAgICogYHNlcmlhbGA6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnc2VyaWFsJywgKGNvbCkgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhZGRDb2x1bW4oY29sdW1uTmFtZSwgZGF0YVR5cGUsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb2x1bW5CdWlsZGVyID0gYnVpbGQobmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNyZWF0ZShjb2x1bW5OYW1lLCBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aENvbHVtbih0aGlzLiNwcm9wcy5ub2RlLCBjb2x1bW5CdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBwcmltYXJ5IGtleSBjb25zdHJhaW50IGZvciBvbmUgb3IgbW9yZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkUHJpbWFyeUtleUNvbnN0cmFpbnQoJ3ByaW1hcnlfa2V5JywgWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZFByaW1hcnlLZXlDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aENvbnN0cmFpbnQodGhpcy4jcHJvcHMubm9kZSwgY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHVuaXF1ZSBjb25zdHJhaW50IGZvciBvbmUgb3IgbW9yZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkVW5pcXVlQ29uc3RyYWludChcbiAgICAgKiAgICAgJ2ZpcnN0X25hbWVfbGFzdF9uYW1lX3VuaXF1ZScsXG4gICAgICogICAgIFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gZGlhbGVjdHMgc3VjaCBhcyBQb3N0Z3JlU1FMIHlvdSBjYW4gc3BlY2lmeSBgbnVsbHMgbm90IGRpc3RpbmN0YCBhcyBmb2xsb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig2NCknKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRVbmlxdWVDb25zdHJhaW50KFxuICAgICAqICAgICAnZmlyc3RfbmFtZV9sYXN0X25hbWVfdW5pcXVlJyxcbiAgICAgKiAgICAgWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddLFxuICAgICAqICAgICAoY2IpID0+IGNiLm51bGxzTm90RGlzdGluY3QoKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZFVuaXF1ZUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCB1bmlxdWVDb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIHVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjaGVjayBjb25zdHJhaW50LlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgnYW5pbWFsJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ251bWJlcl9vZl9sZWdzJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZENoZWNrQ29uc3RyYWludCgnY2hlY2tfbGVncycsIHNxbGBudW1iZXJfb2ZfbGVncyA8IDVgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZENoZWNrQ29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY2hlY2tFeHByZXNzaW9uLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgQ2hlY2tDb25zdHJhaW50QnVpbGRlcihDaGVja0NvbnN0cmFpbnROb2RlLmNyZWF0ZShjaGVja0V4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIGNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmb3JlaWduIGtleSBjb25zdHJhaW50LlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZCcsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5hZGRGb3JlaWduS2V5Q29uc3RyYWludChcbiAgICAgKiAgICAgJ293bmVyX2lkX2ZvcmVpZ24nLFxuICAgICAqICAgICBbJ293bmVyX2lkJ10sXG4gICAgICogICAgICdwZXJzb24nLFxuICAgICAqICAgICBbJ2lkJ10sXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBZGQgY29uc3RyYWludCBmb3IgbXVsdGlwbGUgY29sdW1uczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZDEnLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZDInLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoXG4gICAgICogICAgICdvd25lcl9pZF9mb3JlaWduJyxcbiAgICAgKiAgICAgWydvd25lcl9pZDEnLCAnb3duZXJfaWQyJ10sXG4gICAgICogICAgICdwZXJzb24nLFxuICAgICAqICAgICBbJ2lkMScsICdpZDInXSxcbiAgICAgKiAgICAgKGNiKSA9PiBjYi5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIHRhcmdldFRhYmxlLCB0YXJnZXRDb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIHBhcnNlVGFibGUodGFyZ2V0VGFibGUpLCB0YXJnZXRDb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVlcnkgX19hZnRlcl9fIHRoZSBgY3JlYXRlYCBrZXl3b3JkLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIHRlbXBvcmFyeX0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAubW9kaWZ5RnJvbnQoc3FsYGdsb2JhbCB0ZW1wb3JhcnlgKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDY0KScsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZXMpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGdsb2JhbCB0ZW1wb3JhcnkgdGFibGUgXCJwZXJzb25cIiAoXG4gICAgICogICBcImlkXCIgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIFwiZmlyc3RfbmFtZVwiIHZhcmNoYXIoNjQpIG5vdCBudWxsLFxuICAgICAqICAgXCJsYXN0X25hbWVcIiB2YXJjaGFyKDY0KSBub3QgbnVsbFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlGcm9udChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhGcm9udE1vZGlmaWVyKHRoaXMuI3Byb3BzLm5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHtAbGluayBvbkNvbW1pdH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcig2NCknLCBjb2wgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsYGNvbGxhdGUgdXRmOF91bmljb2RlX2NpYClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5LFxuICAgICAqICAgYGZpcnN0X25hbWVgIHZhcmNoYXIoNjQpIG5vdCBudWxsLFxuICAgICAqICAgYGxhc3RfbmFtZWAgdmFyY2hhcig2NCkgbm90IG51bGxcbiAgICAgKiApIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLm5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyB0byBjcmVhdGUgdGFibGUgZnJvbSBgc2VsZWN0YCBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgnY29weScpXG4gICAgICogICAudGVtcG9yYXJ5KClcbiAgICAgKiAgIC5hcyhkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0ZW1wb3JhcnkgdGFibGUgXCJjb3B5XCIgYXNcbiAgICAgKiBzZWxlY3QgXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXMoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHNlbGVjdFF1ZXJ5OiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgndGVzdCcpXG4gICAgICogICAuJGNhbGwoKGJ1aWxkZXIpID0+IGJ1aWxkZXIuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgcmV1c2FibGUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCB3aXRoIGEgYnVpbGRlci5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgdHlwZSBDcmVhdGVUYWJsZUJ1aWxkZXIsIHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGFkZERlZmF1bHRDb2x1bW5zID0gKGN0YjogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgICAqICAgcmV0dXJuIGN0YlxuICAgICAqICAgICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgKGNvbCkgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgICAgLmFkZENvbHVtbignY3JlYXRlZF9hdCcsICdkYXRlJywgKGNvbCkgPT5cbiAgICAgKiAgICAgICBjb2wubm90TnVsbCgpLmRlZmF1bHRUbyhzcWxgbm93KClgKVxuICAgICAqICAgICApXG4gICAgICogICAgIC5hZGRDb2x1bW4oJ3VwZGF0ZWRfYXQnLCAnZGF0ZScsIChjb2wpID0+XG4gICAgICogICAgICAgY29sLm5vdE51bGwoKS5kZWZhdWx0VG8oc3FsYG5vdygpYClcbiAgICAgKiAgICAgKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCd0ZXN0JylcbiAgICAgKiAgIC4kY2FsbChhZGREZWZhdWx0Q29sdW1ucylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BJbmRleE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLWluZGV4LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BJbmRleEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgdGFibGUgdGhlIGluZGV4IHdhcyBjcmVhdGVkIGZvci4gVGhpcyBpcyBub3QgbmVlZGVkXG4gICAgICogaW4gYWxsIGRpYWxlY3RzLlxuICAgICAqL1xuICAgIG9uKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcGFyc2VUYWJsZSh0YWJsZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1zY2hlbWEtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BTY2hlbWFOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgRHJvcFNjaGVtYUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BTY2hlbWFCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFNjaGVtYU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZkV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2FzY2FkZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BTY2hlbWFOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtdGFibGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BUYWJsZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXZpZXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVWaWV3Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlVmlld05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVWaWV3LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uZC50c1wiIC8+XG5pbXBvcnQgeyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi9pbW1lZGlhdGUtdmFsdWUtdHJhbnNmb3JtZXIuanMnO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIGFsbCBWYWx1ZU5vZGVzIHRvIGltbWVkaWF0ZS5cbiAqXG4gKiBXQVJOSU5HISBUaGlzIHNob3VsZCBuZXZlciBiZSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLiBVc2VycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMuXG4gKiBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlci5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEltbWVkaWF0ZVZhbHVlUGx1Z2luIHtcbiAgICAjdHJhbnNmb3JtZXIgPSBuZXcgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lcigpO1xuICAgIHRyYW5zZm9ybVF1ZXJ5KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zZm9ybWVyLnRyYW5zZm9ybU5vZGUoYXJncy5ub2RlLCBhcmdzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZXN1bHQoYXJncykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFyZ3MucmVzdWx0KTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS12aWV3LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VDb2x1bW5OYW1lIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgSW1tZWRpYXRlVmFsdWVQbHVnaW4gfSBmcm9tICcuLi9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uanMnO1xuZXhwb3J0IGNsYXNzIENyZWF0ZVZpZXdCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcInRlbXBvcmFyeVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHZpZXcuXG4gICAgICovXG4gICAgdGVtcG9yYXJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0ZW1wb3Jhcnk6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1hdGVyaWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmx5IGltcGxlbWVudGVkIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuIE9uIG1vc3QgZGlhbGVjdHMsIHVzZSB7QGxpbmsgb3JSZXBsYWNlfS5cbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZOb3RFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9yUmVwbGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgb3JSZXBsYWNlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogY29sdW1ucy5tYXAocGFyc2VDb2x1bW5OYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2VsZWN0IHF1ZXJ5IG9yIGEgYHZhbHVlc2Agc3RhdGVtZW50IHRoYXQgY3JlYXRlcyB0aGUgdmlldy5cbiAgICAgKlxuICAgICAqIFdBUk5JTkchXG4gICAgICogU29tZSBkaWFsZWN0cyBkb24ndCBzdXBwb3J0IHBhcmFtZXRlcml6ZWQgcXVlcmllcyBpbiBEREwgc3RhdGVtZW50cyBhbmQgdGhlcmVmb3JlXG4gICAgICogdGhlIHF1ZXJ5IG9yIHJhdyB7QGxpbmsgc3FsIH0gZXhwcmVzc2lvbiBwYXNzZWQgaGVyZSBpcyBpbnRlcnBvbGF0ZWQgaW50byBhIHNpbmdsZVxuICAgICAqIHN0cmluZyBvcGVuaW5nIGFuIFNRTCBpbmplY3Rpb24gdnVsbmVyYWJpbGl0eS4gRE8gTk9UIHBhc3MgdW5jaGVja2VkIHVzZXIgaW5wdXRcbiAgICAgKiBpbnRvIHRoZSBxdWVyeSBvciByYXcgZXhwcmVzc2lvbiBwYXNzZWQgdG8gdGhpcyBtZXRob2QhXG4gICAgICovXG4gICAgYXMocXVlcnkpIHtcbiAgICAgICAgY29uc3QgcXVlcnlOb2RlID0gcXVlcnlcbiAgICAgICAgICAgIC53aXRoUGx1Z2luKG5ldyBJbW1lZGlhdGVWYWx1ZVBsdWdpbigpKVxuICAgICAgICAgICAgLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhczogcXVlcnlOb2RlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC12aWV3LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFZpZXdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wVmlld05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoZHJvcFZpZXcsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRyb3BWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3Atdmlldy1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgRHJvcFZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC12aWV3LW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BWaWV3QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgbWF0ZXJpYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWZFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi92YWx1ZS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVUeXBlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVHlwZU5vZGUnLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFbnVtKGNyZWF0ZVR5cGUsIHZhbHVlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVR5cGUsXG4gICAgICAgICAgICBlbnVtOiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZSh2YWx1ZXMubWFwKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtdHlwZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVHlwZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdHlwZS1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBDcmVhdGVUeXBlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW51bSB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNjaGVtYS5jcmVhdGVUeXBlKCdzcGVjaWVzJykuYXNFbnVtKFsnY2F0JywgJ2RvZycsICdmcm9nJ10pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXNFbnVtKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVHlwZU5vZGUuY2xvbmVXaXRoRW51bSh0aGlzLiNwcm9wcy5ub2RlLCB2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFR5cGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFR5cGVOb2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BUeXBlLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wVHlwZSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXR5cGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BUeXBlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtdHlwZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEcm9wVHlwZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUeXBlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BUeXBlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaWRlbnRpZmllci1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2NoZW1hYmxlSWRlbnRpZmllcihpZCkge1xuICAgIGNvbnN0IFNDSEVNQV9TRVBBUkFUT1IgPSAnLic7XG4gICAgaWYgKGlkLmluY2x1ZGVzKFNDSEVNQV9TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gaWQuc3BsaXQoU0NIRU1BX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlV2l0aFNjaGVtYShwYXJ0c1swXSwgcGFydHNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHNjaGVtYWJsZSBpZGVudGlmaWVyICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGUoaWQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVWaWV3LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImNvbmN1cnJlbnRseVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gcmVmcmVzaCB0aGUgdmlldyB3aXRob3V0IGxvY2tpbmcgb3V0IGNvbmN1cnJlbnQgc2VsZWN0cyBvbiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcuXG4gICAgICpcbiAgICAgKiBXQVJOSU5HIVxuICAgICAqIFRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGUgXCJ3aXRoIG5vIGRhdGFcIiBtb2RpZmllci5cbiAgICAgKi9cbiAgICBjb25jdXJyZW50bHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY29uY3VycmVudGx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHdpdGhOb0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcIndpdGggZGF0YVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogSWYgc3BlY2lmaWVkIChvciBkZWZhdWx0cykgdGhlIGJhY2tpbmcgcXVlcnkgaXMgZXhlY3V0ZWQgdG8gcHJvdmlkZSB0aGUgbmV3IGRhdGEsIGFuZCB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgaXMgbGVmdCBpbiBhIHNjYW5uYWJsZSBzdGF0ZVxuICAgICAqL1xuICAgIHdpdGhEYXRhKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHdpdGhOb0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcIndpdGggbm8gZGF0YVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogSWYgc3BlY2lmaWVkLCBubyBuZXcgZGF0YSBpcyBnZW5lcmF0ZWQgYW5kIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyBpcyBsZWZ0IGluIGFuIHVuc2Nhbm5hYmxlIHN0YXRlLlxuICAgICAqXG4gICAgICogV0FSTklORyFcbiAgICAgKiBUaGlzIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhlIFwiY29uY3VycmVudGx5XCIgbW9kaWZpZXIuXG4gICAgICovXG4gICAgd2l0aE5vRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB3aXRoTm9EYXRhOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmN1cnJlbnRseTogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zY2hlbWEuZC50c1wiIC8+XG5pbXBvcnQgeyBBbHRlclRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLWluZGV4LW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlU2NoZW1hTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IERyb3BTY2hlbWFOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZUluZGV4QnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLWluZGV4LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQ3JlYXRlU2NoZW1hQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXNjaGVtYS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXRhYmxlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRHJvcEluZGV4QnVpbGRlciB9IGZyb20gJy4vZHJvcC1pbmRleC1idWlsZGVyLmpzJztcbmltcG9ydCB7IERyb3BTY2hlbWFCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXNjaGVtYS1idWlsZGVyLmpzJztcbmltcG9ydCB7IERyb3BUYWJsZUJ1aWxkZXIgfSBmcm9tICcuL2Ryb3AtdGFibGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBXaXRoU2NoZW1hUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3QnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXZpZXctYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcFZpZXdCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXZpZXctYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXZpZXctbm9kZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUeXBlQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXR5cGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wVHlwZUJ1aWxkZXIgfSBmcm9tICcuL2Ryb3AtdHlwZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZVR5cGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wVHlwZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIgfSBmcm9tICcuLi9wYXJzZXIvaWRlbnRpZmllci1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIH0gZnJvbSAnLi9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1ub2RlLmpzJztcbi8qKlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgYnVpbGRpbmcgZGF0YWJhc2Ugc2NoZW1hLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hTW9kdWxlIHtcbiAgICAjZXhlY3V0b3I7XG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHRhYmxlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIG5ldyB0YWJsZSB3aXRoIGNvbHVtbnMgYGlkYCwgYGZpcnN0X25hbWVgLFxuICAgICAqIGBsYXN0X25hbWVgIGFuZCBgZ2VuZGVyYDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkuYXV0b0luY3JlbWVudCgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcicsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignZ2VuZGVyJywgJ3ZhcmNoYXInKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSB0YWJsZSB3aXRoIGEgZm9yZWlnbiBrZXkuIE5vdCBhbGwgZGF0YWJhc2VcbiAgICAgKiBlbmdpbmVzIHN1cHBvcnQgY29sdW1uLWxldmVsIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbnMuXG4gICAgICogRm9yIGV4YW1wbGUgaWYgeW91IGFyZSB1c2luZyBNeVNRTCA1Llggc2VlIHRoZSBuZXh0IGV4YW1wbGUgYWZ0ZXJcbiAgICAgKiB0aGlzIG9uZS5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkuYXV0b0luY3JlbWVudCgpKVxuICAgICAqICAgLmFkZENvbHVtbignb3duZXJfaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2xcbiAgICAgKiAgICAgLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpXG4gICAgICogICAgIC5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIGV4YW1wbGUgYWRkcyBhIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZm9yIGEgY29sdW1ucyBqdXN0XG4gICAgICogbGlrZSB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IHVzaW5nIGEgdGFibGUtbGV2ZWwgc3RhdGVtZW50LlxuICAgICAqIE9uIE15U1FMIDUuWCB5b3UgbmVlZCB0byBkZWZpbmUgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgbGlrZVxuICAgICAqIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpLmF1dG9JbmNyZW1lbnQoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ293bmVyX2lkJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50KFxuICAgICAqICAgICAncGV0X293bmVyX2lkX2ZvcmVpZ24nLCBbJ293bmVyX2lkJ10sICdwZXJzb24nLCBbJ2lkJ10sXG4gICAgICogICAgIChjb25zdHJhaW50KSA9PiBjb25zdHJhaW50Lm9uRGVsZXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVUYWJsZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wVGFibGVOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaW5kZXguXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlSW5kZXgoJ3BlcnNvbl9mdWxsX25hbWVfdW5pcXVlX2luZGV4JylcbiAgICAgKiAgIC5vbigncGVyc29uJylcbiAgICAgKiAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVJbmRleChpbmRleE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcCBhbiBpbmRleC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wSW5kZXgoJ3BlcnNvbl9mdWxsX25hbWVfdW5pcXVlX2luZGV4JylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkcm9wSW5kZXgoaW5kZXhOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHNjaGVtYS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVTY2hlbWEoJ3NvbWVfc2NoZW1hJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVTY2hlbWFOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcCBhIHNjaGVtYS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wU2NoZW1hKCdzb21lX3NjaGVtYScpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wU2NoZW1hTm9kZS5jcmVhdGUoc2NoZW1hKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsdGVyIGEgdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hbHRlckNvbHVtbignZmlyc3RfbmFtZScsIChhYykgPT4gYWMuc2V0RGF0YVR5cGUoJ3RleHQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhbHRlclRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB2aWV3LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVZpZXcoJ2RvZ3MnKVxuICAgICAqICAgLm9yUmVwbGFjZSgpXG4gICAgICogICAuYXMoZGIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0QWxsKCkud2hlcmUoJ3NwZWNpZXMnLCAnPScsICdkb2cnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVWaWV3KHZpZXdOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY3JlYXRlKHZpZXdOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggYSBtYXRlcmlhbGl6ZWQgdmlldy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5yZWZyZXNoTWF0ZXJpYWxpemVkVmlldygnbXlfdmlldycpXG4gICAgICogICAuY29uY3VycmVudGx5KClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWZyZXNoTWF0ZXJpYWxpemVkVmlldyh2aWV3TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUuY3JlYXRlKHZpZXdOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB2aWV3LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmRyb3BWaWV3KCdkb2dzJylcbiAgICAgKiAgIC5pZkV4aXN0cygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFZpZXcodmlld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNyZWF0ZSh2aWV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgdHlwZS5cbiAgICAgKlxuICAgICAqIE9ubHkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgaGF2ZSB1c2VyLWRlZmluZWQgdHlwZXMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVHlwZSgnc3BlY2llcycpXG4gICAgICogICAuYXNFbnVtKFsnZG9nJywgJ2NhdCcsICdmcm9nJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY3JlYXRlVHlwZSh0eXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVR5cGVOb2RlLmNyZWF0ZShwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIodHlwZU5hbWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB0eXBlLlxuICAgICAqXG4gICAgICogT25seSBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBoYXZlIHVzZXItZGVmaW5lZCB0eXBlcy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wVHlwZSgnc3BlY2llcycpXG4gICAgICogICAuaWZFeGlzdHMoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BUeXBlKHR5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IERyb3BUeXBlTm9kZS5jcmVhdGUocGFyc2VTY2hlbWFibGVJZGVudGlmaWVyKHR5cGVOYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHNjaGVtYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFNjaGVtYU1vZHVsZSh0aGlzLiNleGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHNjaGVtYSBtb2R1bGUgIHdpdGhvdXQgYW55IHBsdWdpbnMuXG4gICAgICovXG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI2V4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIFF1ZXJ5Q3JlYXRvci53aXRoU2NoZW1hfVxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2R5bmFtaWMuZC50c1wiIC8+XG5pbXBvcnQgeyBEeW5hbWljUmVmZXJlbmNlQnVpbGRlciB9IGZyb20gJy4vZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEeW5hbWljVGFibGVCdWlsZGVyIH0gZnJvbSAnLi9keW5hbWljLXRhYmxlLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNNb2R1bGUge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkeW5hbWljIHJlZmVyZW5jZSB0byBhIGNvbHVtbiB0aGF0IGlzIG5vdCBrbm93IGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKlxuICAgICAqIEt5c2VseSBpcyBidWlsdCBpbiBhIHdheSB0aGF0IGJ5IGRlZmF1bHQgeW91IGNhbid0IHJlZmVyIHRvIHRhYmxlcyBvciBjb2x1bW5zXG4gICAgICogdGhhdCBhcmUgbm90IGFjdHVhbGx5IHZpc2libGUgaW4gdGhlIGN1cnJlbnQgcXVlcnkgYW5kIGNvbnRleHQuIFRoaXMgaXMgYWxsXG4gICAgICogZG9uZSBieSBUeXBlU2NyaXB0IGF0IGNvbXBpbGUgdGltZSwgd2hpY2ggbWVhbnMgdGhhdCB5b3UgbmVlZCB0byBrbm93IHRoZVxuICAgICAqIGNvbHVtbnMgYW5kIHRhYmxlcyBhdCBjb21waWxlIHRpbWUuIFRoaXMgaXMgbm90IGFsd2F5cyB0aGUgY2FzZSBvZiBjb3Vyc2UuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIGluIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBjb2x1bW4gbmFtZXNcbiAgICAgKiBjb21lIGZyb20gdGhlIHVzZXIgaW5wdXQgb3IgYXJlIG5vdCBvdGhlcndpc2Uga25vd24gYXQgY29tcGlsZSB0aW1lLlxuICAgICAqXG4gICAgICogV0FSTklORyEgVW5saWtlIHZhbHVlcywgY29sdW1uIG5hbWVzIGFyZSBub3QgZXNjYXBlZCBieSB0aGUgZGF0YWJhc2UgZW5naW5lXG4gICAgICogb3IgS3lzZWx5IGFuZCBpZiB5b3UgcGFzcyBpbiB1bmNoZWNrZWQgY29sdW1uIG5hbWVzIHVzaW5nIHRoaXMgbWV0aG9kLCB5b3VcbiAgICAgKiBjcmVhdGUgYW4gU1FMIGluamVjdGlvbiB2dWxuZXJhYmlsaXR5LiBBbHdheXMgX19hbHdheXNfXyB2YWxpZGF0ZSB0aGUgdXNlclxuICAgICAqIGlucHV0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogVGhlcmUgYXJlIGNvdXBsZSBvZiBleGFtcGxlcyBiZWxvdyBmb3Igc29tZSB1c2UgY2FzZXMsIGJ1dCB5b3UgY2FuIHBhc3NcbiAgICAgKiBgcmVmYCB0byBvdGhlciBtZXRob2RzIGFzIHdlbGwuIElmIHRoZSB0eXBlcyBhbGxvdyB5b3UgdG8gcGFzcyBhIGByZWZgXG4gICAgICogdmFsdWUgdG8gc29tZSBwbGFjZSwgaXQgc2hvdWxkIHdvcmsuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIEZpbHRlciBieSBhIGNvbHVtbiBub3Qga25vdyBhdCBjb21waWxlIHRpbWU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHNvbWVRdWVyeShmaWx0ZXJDb2x1bW46IHN0cmluZywgZmlsdGVyVmFsdWU6IHN0cmluZykge1xuICAgICAqICAgY29uc3QgeyByZWYgfSA9IGRiLmR5bmFtaWNcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAuc2VsZWN0QWxsKClcbiAgICAgKiAgICAgLndoZXJlKHJlZihmaWx0ZXJDb2x1bW4pLCAnPScsIGZpbHRlclZhbHVlKVxuICAgICAqICAgICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogc29tZVF1ZXJ5KCdmaXJzdF9uYW1lJywgJ0Fybm9sZCcpXG4gICAgICogc29tZVF1ZXJ5KCdwZXJzb24ubGFzdF9uYW1lJywgJ0FuaXN0b24nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogT3JkZXIgYnkgYSBjb2x1bW4gbm90IGtub3cgYXQgY29tcGlsZSB0aW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBzb21lUXVlcnkob3JkZXJCeTogc3RyaW5nKSB7XG4gICAgICogICBjb25zdCB7IHJlZiB9ID0gZGIuZHluYW1pY1xuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgIC5zZWxlY3QoJ3BlcnNvbi5maXJzdF9uYW1lIGFzIGZuJylcbiAgICAgKiAgICAgLm9yZGVyQnkocmVmKG9yZGVyQnkpKVxuICAgICAqICAgICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogc29tZVF1ZXJ5KCdmbicpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGlzIGV4YW1wbGUgd2UgYWRkIHNlbGVjdGlvbnMgZHluYW1pY2FsbHk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHsgcmVmIH0gPSBkYi5keW5hbWljXG4gICAgICpcbiAgICAgKiAvLyBTb21lIGNvbHVtbiBuYW1lIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBWYWx1ZSBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLlxuICAgICAqIGNvbnN0IGNvbHVtbkZyb21Vc2VySW5wdXQ6IFBvc3NpYmxlQ29sdW1ucyA9ICdiaXJ0aGRhdGUnO1xuICAgICAqXG4gICAgICogLy8gQSB0eXBlIHRoYXQgbGlzdHMgYWxsIHBvc3NpYmxlIHZhbHVlcyBgY29sdW1uRnJvbVVzZXJJbnB1dGAgY2FuIGhhdmUuXG4gICAgICogLy8gWW91IGNhbiB1c2UgYGtleW9mIFBlcnNvbmAgaWYgYW55IGNvbHVtbiBvZiBhbiBpbnRlcmZhY2UgaXMgYWxsb3dlZC5cbiAgICAgKiB0eXBlIFBvc3NpYmxlQ29sdW1ucyA9ICdsYXN0X25hbWUnIHwgJ2ZpcnN0X25hbWUnIHwgJ2JpcnRoZGF0ZSdcbiAgICAgKlxuICAgICAqIGNvbnN0IFtwZXJzb25dID0gYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoW1xuICAgICAqICAgICByZWY8UG9zc2libGVDb2x1bW5zPihjb2x1bW5Gcm9tVXNlcklucHV0KSxcbiAgICAgKiAgICAgJ2lkJ1xuICAgICAqICAgXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIC8vIFRoZSByZXN1bHRpbmcgdHlwZSBjb250YWlucyBhbGwgYFBvc3NpYmxlQ29sdW1uc2AgYXMgb3B0aW9uYWwgZmllbGRzXG4gICAgICogLy8gYmVjYXVzZSB3ZSBjYW5ub3Qga25vdyB3aGljaCBmaWVsZCB3YXMgYWN0dWFsbHkgc2VsZWN0ZWQgYmVmb3JlXG4gICAgICogLy8gcnVubmluZyB0aGUgY29kZS5cbiAgICAgKiBjb25zdCBsYXN0TmFtZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IHBlcnNvbj8ubGFzdF9uYW1lXG4gICAgICogY29uc3QgZmlyc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwZXJzb24/LmZpcnN0X25hbWVcbiAgICAgKiBjb25zdCBiaXJ0aERhdGU6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkID0gcGVyc29uPy5iaXJ0aGRhdGVcbiAgICAgKlxuICAgICAqIC8vIFRoZSByZXN1bHQgdHlwZSBhbHNvIGNvbnRhaW5zIHRoZSBjb21waWxlIHRpbWUgc2VsZWN0aW9uIGBpZGAuXG4gICAgICogcGVyc29uPy5pZFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlZihyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljUmVmZXJlbmNlQnVpbGRlcihyZWZlcmVuY2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGFibGUgcmVmZXJlbmNlIHRvIGEgdGFibGUgdGhhdCdzIG5vdCBmdWxseSBrbm93biBhdCBjb21waWxlIHRpbWUuXG4gICAgICpcbiAgICAgKiBUaGUgdHlwZSBgVGAgaXMgYWxsb3dlZCB0byBiZSBhIHVuaW9uIG9mIG11bHRpcGxlIHRhYmxlcy5cbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJzZWxlY3RcIiwgXCJHZW5lcmljIGZpbmQgcXVlcnlcIiwgMTMwKSAtLT5cbiAgICAgKlxuICAgICAqIEEgZ2VuZXJpYyB0eXBlLXNhZmUgaGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kaW5nIGEgcm93IGJ5IGEgY29sdW1uIHZhbHVlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBTZWxlY3RUeXBlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBnZXRSb3dCeUNvbHVtbjxcbiAgICAgKiAgIFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSxcbiAgICAgKiAgIEMgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZVtUXSAmIHN0cmluZyxcbiAgICAgKiAgIFYgZXh0ZW5kcyBTZWxlY3RUeXBlPERhdGFiYXNlW1RdW0NdPixcbiAgICAgKiA+KHQ6IFQsIGM6IEMsIHY6IFYpIHtcbiAgICAgKiAgIC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBkeW5hbWljIG1vZHVsZSBzaW5jZSB0aGUgdGFibGUgbmFtZVxuICAgICAqICAgLy8gaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKiAgIGNvbnN0IHsgdGFibGUsIHJlZiB9ID0gZGIuZHluYW1pY1xuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20odGFibGUodCkuYXMoJ3QnKSlcbiAgICAgKiAgICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAgIC53aGVyZShyZWYoYyksICc9JywgdilcbiAgICAgKiAgICAgLm9yZGVyQnkoJ3QuaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGdldFJvd0J5Q29sdW1uKCdwZXJzb24nLCAnZmlyc3RfbmFtZScsICdBcm5vbGQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHluYW1pY1RhYmxlQnVpbGRlcih0YWJsZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LWNvbm5lY3Rpb24tcHJvdmlkZXIuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciB7XG4gICAgI2RyaXZlcjtcbiAgICBjb25zdHJ1Y3Rvcihkcml2ZXIpIHtcbiAgICAgICAgdGhpcy4jZHJpdmVyID0gZHJpdmVyO1xuICAgIH1cbiAgICBhc3luYyBwcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcikge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy4jZHJpdmVyLmFjcXVpcmVDb25uZWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY29uc3VtZXIoY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkcml2ZXIucmVsZWFzZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtcXVlcnktZXhlY3V0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBRdWVyeUV4ZWN1dG9yQmFzZSB9IGZyb20gJy4vcXVlcnktZXhlY3V0b3ItYmFzZS5qcyc7XG5leHBvcnQgY2xhc3MgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IgZXh0ZW5kcyBRdWVyeUV4ZWN1dG9yQmFzZSB7XG4gICAgI2NvbXBpbGVyO1xuICAgICNhZGFwdGVyO1xuICAgICNjb25uZWN0aW9uUHJvdmlkZXI7XG4gICAgY29uc3RydWN0b3IoY29tcGlsZXIsIGFkYXB0ZXIsIGNvbm5lY3Rpb25Qcm92aWRlciwgcGx1Z2lucyA9IFtdKSB7XG4gICAgICAgIHN1cGVyKHBsdWdpbnMpO1xuICAgICAgICB0aGlzLiNjb21waWxlciA9IGNvbXBpbGVyO1xuICAgICAgICB0aGlzLiNhZGFwdGVyID0gYWRhcHRlcjtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyID0gY29ubmVjdGlvblByb3ZpZGVyO1xuICAgIH1cbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FkYXB0ZXI7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb21waWxlci5jb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIucHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IodGhpcy4jY29tcGlsZXIsIHRoaXMuI2FkYXB0ZXIsIHRoaXMuI2Nvbm5lY3Rpb25Qcm92aWRlciwgWy4uLnRoaXMucGx1Z2lucywgLi4ucGx1Z2luc10pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRRdWVyeUV4ZWN1dG9yKHRoaXMuI2NvbXBpbGVyLCB0aGlzLiNhZGFwdGVyLCB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIsIFsuLi50aGlzLnBsdWdpbnMsIHBsdWdpbl0pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luQXRGcm9udChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyLCBbcGx1Z2luLCAuLi50aGlzLnBsdWdpbnNdKTtcbiAgICB9XG4gICAgd2l0aENvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgY29ubmVjdGlvblByb3ZpZGVyLCBbLi4udGhpcy5wbHVnaW5zXSk7XG4gICAgfVxuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRRdWVyeUV4ZWN1dG9yKHRoaXMuI2NvbXBpbGVyLCB0aGlzLiNhZGFwdGVyLCB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIsIFtdKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BlcmZvcm1hbmNlLW5vdy5kLnRzXCIgLz5cbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3coKSB7XG4gICAgaWYgKHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNGdW5jdGlvbihwZXJmb3JtYW5jZS5ub3cpKSB7XG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcnVudGltZS1kcml2ZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBwZXJmb3JtYW5jZU5vdyB9IGZyb20gJy4uL3V0aWwvcGVyZm9ybWFuY2Utbm93LmpzJztcbi8qKlxuICogQSBzbWFsbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgRHJpdmVyfSB0aGF0IG1ha2VzIHN1cmUgdGhlIGRyaXZlciBpc1xuICogaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IGlzIHVzZWQsIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIGRlc3Ryb3llZFxuICogb25jZSBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRHJpdmVyIHtcbiAgICAjZHJpdmVyO1xuICAgICNsb2c7XG4gICAgI2luaXRQcm9taXNlO1xuICAgICNpbml0RG9uZTtcbiAgICAjZGVzdHJveVByb21pc2U7XG4gICAgI2Nvbm5lY3Rpb25zID0gbmV3IFdlYWtTZXQoKTtcbiAgICBjb25zdHJ1Y3Rvcihkcml2ZXIsIGxvZykge1xuICAgICAgICB0aGlzLiNpbml0RG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNkcml2ZXIgPSBkcml2ZXI7XG4gICAgICAgIHRoaXMuI2xvZyA9IGxvZztcbiAgICB9XG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Rlc3Ryb3lQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RyaXZlciBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy4jaW5pdFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuI2luaXRQcm9taXNlID0gdGhpcy4jZHJpdmVyXG4gICAgICAgICAgICAgICAgLmluaXQoKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNpbml0RG9uZSA9IHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaW5pdFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNpbml0UHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgYWNxdWlyZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLiNkZXN0cm95UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkcml2ZXIgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2luaXREb25lKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy4jZHJpdmVyLmFjcXVpcmVDb25uZWN0aW9uKCk7XG4gICAgICAgIGlmICghdGhpcy4jY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jbmVlZHNMb2dnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGRMb2dnaW5nKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH1cbiAgICBhc3luYyByZWxlYXNlQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2RyaXZlci5yZWxlYXNlQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgYmVnaW5UcmFuc2FjdGlvbihjb25uZWN0aW9uLCBzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLmJlZ2luVHJhbnNhY3Rpb24oY29ubmVjdGlvbiwgc2V0dGluZ3MpO1xuICAgIH1cbiAgICBjb21taXRUcmFuc2FjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkcml2ZXIuY29tbWl0VHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHJvbGxiYWNrVHJhbnNhY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHNhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RyaXZlci5zYXZlcG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkcml2ZXIuc2F2ZXBvaW50KGNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIGNvbXBpbGVRdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHNhdmVwb2ludGAgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXInKTtcbiAgICB9XG4gICAgcm9sbGJhY2tUb1NhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RyaXZlci5yb2xsYmFja1RvU2F2ZXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgcm9sbGJhY2tUb1NhdmVwb2ludGAgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXInKTtcbiAgICB9XG4gICAgcmVsZWFzZVNhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RyaXZlci5yZWxlYXNlU2F2ZXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnJlbGVhc2VTYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgcmVsZWFzZVNhdmVwb2ludGAgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXInKTtcbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNpbml0UHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2luaXRQcm9taXNlO1xuICAgICAgICBpZiAoIXRoaXMuI2Rlc3Ryb3lQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNkZXN0cm95UHJvbWlzZSA9IHRoaXMuI2RyaXZlci5kZXN0cm95KCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rlc3Ryb3lQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy4jZGVzdHJveVByb21pc2U7XG4gICAgfVxuICAgICNuZWVkc0xvZ2dpbmcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jbG9nLmlzTGV2ZWxFbmFibGVkKCdxdWVyeScpIHx8IHRoaXMuI2xvZy5pc0xldmVsRW5hYmxlZCgnZXJyb3InKSk7XG4gICAgfVxuICAgIC8vIFRoaXMgbWV0aG9kIG1vbmtleSBwYXRjaGVzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uJ3MgZXhlY3V0ZVF1ZXJ5IG1ldGhvZFxuICAgIC8vIGJ5IGFkZGluZyBsb2dnaW5nIGNvZGUgYXJvdW5kIGl0LiBNb25rZXkgcGF0Y2hpbmcgaXMgbm90IHByZXR0eSwgYnV0IGl0J3NcbiAgICAvLyB0aGUgYmVzdCBvcHRpb24gaW4gdGhpcyBjYXNlLlxuICAgICNhZGRMb2dnaW5nKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZXhlY3V0ZVF1ZXJ5ID0gY29ubmVjdGlvbi5leGVjdXRlUXVlcnk7XG4gICAgICAgIGNvbnN0IHN0cmVhbVF1ZXJ5ID0gY29ubmVjdGlvbi5zdHJlYW1RdWVyeTtcbiAgICAgICAgY29uc3QgZGlzID0gdGhpcztcbiAgICAgICAgY29ubmVjdGlvbi5leGVjdXRlUXVlcnkgPSBhc3luYyAoY29tcGlsZWRRdWVyeSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNhdWdodEVycm9yO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVRdWVyeS5jYWxsKGNvbm5lY3Rpb24sIGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ0Vycm9yKGVycm9yLCBjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYXVnaHRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ1F1ZXJ5KGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25uZWN0aW9uLnN0cmVhbVF1ZXJ5ID0gYXN5bmMgZnVuY3Rpb24qIChjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpIHtcbiAgICAgICAgICAgIGxldCBjYXVnaHRFcnJvcjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcmVzdWx0IG9mIHN0cmVhbVF1ZXJ5LmNhbGwoY29ubmVjdGlvbiwgY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ0Vycm9yKGVycm9yLCBjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYXVnaHRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ1F1ZXJ5KGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyAjbG9nRXJyb3IoZXJyb3IsIGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNsb2cuZXJyb3IoKCkgPT4gKHtcbiAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBxdWVyeTogY29tcGlsZWRRdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5RHVyYXRpb25NaWxsaXM6IHRoaXMuI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzKHN0YXJ0VGltZSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgYXN5bmMgI2xvZ1F1ZXJ5KGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSwgaXNTdHJlYW0gPSBmYWxzZSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNsb2cucXVlcnkoKCkgPT4gKHtcbiAgICAgICAgICAgIGxldmVsOiAncXVlcnknLFxuICAgICAgICAgICAgaXNTdHJlYW0sXG4gICAgICAgICAgICBxdWVyeTogY29tcGlsZWRRdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5RHVyYXRpb25NaWxsaXM6IHRoaXMuI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzKHN0YXJ0VGltZSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzKHN0YXJ0VGltZSkge1xuICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2VOb3coKSAtIHN0YXJ0VGltZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NpbmdsZS1jb25uZWN0aW9uLXByb3ZpZGVyLmQudHNcIiAvPlxuY29uc3QgaWdub3JlRXJyb3IgPSAoKSA9PiB7IH07XG5leHBvcnQgY2xhc3MgU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyIHtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjcnVubmluZ1Byb21pc2U7XG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgcHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuI3J1bm5pbmdQcm9taXNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5uaW5nUHJvbWlzZS5jYXRjaChpZ25vcmVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYCNydW5uaW5nUHJvbWlzZWAgbXVzdCBiZSBzZXQgdG8gdW5kZWZpbmVkIGJlZm9yZSBpdCdzXG4gICAgICAgIC8vIHJlc29sdmVkIG9yIHJlamVjdGVkLiBPdGhlcndpc2UgdGhlIHdoaWxlIGxvb3AgYWJvdmVcbiAgICAgICAgLy8gd2lsbCBtaXNiZWhhdmUuXG4gICAgICAgIHRoaXMuI3J1bm5pbmdQcm9taXNlID0gdGhpcy4jcnVuKGNvbnN1bWVyKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3J1bm5pbmdQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3J1bm5pbmdQcm9taXNlO1xuICAgIH1cbiAgICAvLyBSdW4gdGhlIHJ1bm5lciBpbiBhbiBhc3luYyBmdW5jdGlvbiB0byBtYWtlIHN1cmUgaXQgZG9lc24ndFxuICAgIC8vIHRocm93IHN5bmNocm9ub3VzIGVycm9ycy5cbiAgICBhc3luYyAjcnVuKHJ1bm5lcikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVubmVyKHRoaXMuI2Nvbm5lY3Rpb24pO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJpdmVyLmQudHNcIiAvPlxuZXhwb3J0IGNvbnN0IFRSQU5TQUNUSU9OX0FDQ0VTU19NT0RFUyA9IFsncmVhZCBvbmx5JywgJ3JlYWQgd3JpdGUnXTtcbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTID0gW1xuICAgICdyZWFkIHVuY29tbWl0dGVkJyxcbiAgICAncmVhZCBjb21taXR0ZWQnLFxuICAgICdyZXBlYXRhYmxlIHJlYWQnLFxuICAgICdzZXJpYWxpemFibGUnLFxuICAgICdzbmFwc2hvdCcsXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncykge1xuICAgIGlmIChzZXR0aW5ncy5hY2Nlc3NNb2RlICYmXG4gICAgICAgICFUUkFOU0FDVElPTl9BQ0NFU1NfTU9ERVMuaW5jbHVkZXMoc2V0dGluZ3MuYWNjZXNzTW9kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRyYW5zYWN0aW9uIGFjY2VzcyBtb2RlICR7c2V0dGluZ3MuYWNjZXNzTW9kZX1gKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLmlzb2xhdGlvbkxldmVsICYmXG4gICAgICAgICFUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTLmluY2x1ZGVzKHNldHRpbmdzLmlzb2xhdGlvbkxldmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsICR7c2V0dGluZ3MuaXNvbGF0aW9uTGV2ZWx9YCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9sb2cuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUsIGlzRnVuY3Rpb24gfSBmcm9tICcuL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY29uc3QgTE9HX0xFVkVMUyA9IGZyZWV6ZShbJ3F1ZXJ5JywgJ2Vycm9yJ10pO1xuZXhwb3J0IGNsYXNzIExvZyB7XG4gICAgI2xldmVscztcbiAgICAjbG9nZ2VyO1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICB0aGlzLiNsb2dnZXIgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLiNsZXZlbHMgPSBmcmVlemUoe1xuICAgICAgICAgICAgICAgIHF1ZXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNsb2dnZXIgPSBkZWZhdWx0TG9nZ2VyO1xuICAgICAgICAgICAgdGhpcy4jbGV2ZWxzID0gZnJlZXplKHtcbiAgICAgICAgICAgICAgICBxdWVyeTogY29uZmlnLmluY2x1ZGVzKCdxdWVyeScpLFxuICAgICAgICAgICAgICAgIGVycm9yOiBjb25maWcuaW5jbHVkZXMoJ2Vycm9yJyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0xldmVsRW5hYmxlZChsZXZlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGV2ZWxzW2xldmVsXTtcbiAgICB9XG4gICAgYXN5bmMgcXVlcnkoZ2V0RXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2xldmVscy5xdWVyeSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jbG9nZ2VyKGdldEV2ZW50KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGVycm9yKGdldEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLiNsZXZlbHMuZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2xvZ2dlcihnZXRFdmVudCgpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGRlZmF1bHRMb2dnZXIoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQubGV2ZWwgPT09ICdxdWVyeScpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gYGt5c2VseTpxdWVyeToke2V2ZW50LmlzU3RyZWFtID8gJ3N0cmVhbTonIDogJyd9YDtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fSAke2V2ZW50LnF1ZXJ5LnNxbH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fSBkdXJhdGlvbjogJHtldmVudC5xdWVyeUR1cmF0aW9uTWlsbGlzLnRvRml4ZWQoMSl9bXNgKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQubGV2ZWwgPT09ICdlcnJvcicpIHtcbiAgICAgICAgaWYgKGV2ZW50LmVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGt5c2VseTplcnJvcjogJHtldmVudC5lcnJvci5zdGFjayA/PyBldmVudC5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihga3lzZWx5OmVycm9yOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXZlbnQuZXJyb3IsXG4gICAgICAgICAgICAgICAgcXVlcnk6IGV2ZW50LnF1ZXJ5LnNxbCxcbiAgICAgICAgICAgICAgICBxdWVyeUR1cmF0aW9uTWlsbGlzOiBldmVudC5xdWVyeUR1cmF0aW9uTWlsbGlzLFxuICAgICAgICAgICAgfSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbXBpbGFibGUuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBpbGFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzRnVuY3Rpb24odmFsdWUuY29tcGlsZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2t5c2VseS5kLnRzXCIgLz5cbmltcG9ydCB7IFNjaGVtYU1vZHVsZSB9IGZyb20gJy4vc2NoZW1hL3NjaGVtYS5qcyc7XG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlIH0gZnJvbSAnLi9keW5hbWljL2R5bmFtaWMuanMnO1xuaW1wb3J0IHsgRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciB9IGZyb20gJy4vZHJpdmVyL2RlZmF1bHQtY29ubmVjdGlvbi1wcm92aWRlci5qcyc7XG5pbXBvcnQgeyBRdWVyeUNyZWF0b3IgfSBmcm9tICcuL3F1ZXJ5LWNyZWF0b3IuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IgfSBmcm9tICcuL3F1ZXJ5LWV4ZWN1dG9yL2RlZmF1bHQtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBpc09iamVjdCwgaXNVbmRlZmluZWQgfSBmcm9tICcuL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJ1bnRpbWVEcml2ZXIgfSBmcm9tICcuL2RyaXZlci9ydW50aW1lLWRyaXZlci5qcyc7XG5pbXBvcnQgeyBTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIgfSBmcm9tICcuL2RyaXZlci9zaW5nbGUtY29ubmVjdGlvbi1wcm92aWRlci5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3MsIH0gZnJvbSAnLi9kcml2ZXIvZHJpdmVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUZ1bmN0aW9uTW9kdWxlLCB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMnO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi91dGlsL2xvZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IGlzQ29tcGlsYWJsZSB9IGZyb20gJy4vdXRpbC9jb21waWxhYmxlLmpzJztcbmltcG9ydCB7IENhc2VCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL2Nhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDYXNlTm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiB9IGZyb20gJy4vcGFyc2VyL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IFdpdGhTY2hlbWFQbHVnaW4gfSBmcm9tICcuL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uLCB9IGZyb20gJy4vdXRpbC9wcm92aWRlLWNvbnRyb2xsZWQtY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBsb2dPbmNlIH0gZnJvbSAnLi91dGlsL2xvZy1vbmNlLmpzJztcbi8vIEB0cy1pZ25vcmVcblN5bWJvbC5hc3luY0Rpc3Bvc2UgPz89IFN5bWJvbCgnU3ltYm9sLmFzeW5jRGlzcG9zZScpO1xuLyoqXG4gKiBUaGUgbWFpbiBLeXNlbHkgY2xhc3MuXG4gKlxuICogWW91IHNob3VsZCBjcmVhdGUgb25lIGluc3RhbmNlIG9mIGBLeXNlbHlgIHBlciBkYXRhYmFzZSB1c2luZyB0aGUge0BsaW5rIEt5c2VseX1cbiAqIGNvbnN0cnVjdG9yLiBFYWNoIGBLeXNlbHlgIGluc3RhbmNlIG1haW50YWlucyBpdHMgb3duIGNvbm5lY3Rpb24gcG9vbC5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBUaGlzIGV4YW1wbGUgYXNzdW1lcyB5b3VyIGRhdGFiYXNlIGhhcyBhIFwicGVyc29uXCIgdGFibGU6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCAqIGFzIFNxbGl0ZSBmcm9tICdiZXR0ZXItc3FsaXRlMydcbiAqIGltcG9ydCB7XHUwMEEwdHlwZSBHZW5lcmF0ZWQsIEt5c2VseSwgU3FsaXRlRGlhbGVjdCB9IGZyb20gJ2t5c2VseSdcbiAqXG4gKiBpbnRlcmZhY2UgRGF0YWJhc2Uge1xuICogICBwZXJzb246IHtcbiAqICAgICBpZDogR2VuZXJhdGVkPG51bWJlcj5cbiAqICAgICBmaXJzdF9uYW1lOiBzdHJpbmdcbiAqICAgICBsYXN0X25hbWU6IHN0cmluZyB8IG51bGxcbiAqICAgfVxuICogfVxuICpcbiAqIGNvbnN0IGRiID0gbmV3IEt5c2VseTxEYXRhYmFzZT4oe1xuICogICBkaWFsZWN0OiBuZXcgU3FsaXRlRGlhbGVjdCh7XG4gKiAgICAgZGF0YWJhc2U6IG5ldyBTcWxpdGUoJzptZW1vcnk6JyksXG4gKiAgIH0pXG4gKiB9KVxuICogYGBgXG4gKlxuICogQHR5cGVQYXJhbSBEQiAtIFRoZSBkYXRhYmFzZSBpbnRlcmZhY2UgdHlwZS4gS2V5cyBvZiB0aGlzIHR5cGUgbXVzdCBiZSB0YWJsZSBuYW1lc1xuICogICAgaW4gdGhlIGRhdGFiYXNlIGFuZCB2YWx1ZXMgbXVzdCBiZSBpbnRlcmZhY2VzIHRoYXQgZGVzY3JpYmUgdGhlIHJvd3MgaW4gdGhvc2VcbiAqICAgIHRhYmxlcy4gU2VlIHRoZSBleGFtcGxlcyBhYm92ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEt5c2VseSBleHRlbmRzIFF1ZXJ5Q3JlYXRvciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICAgICAgbGV0IHN1cGVyUHJvcHM7XG4gICAgICAgIGxldCBwcm9wcztcbiAgICAgICAgaWYgKGlzS3lzZWx5UHJvcHMoYXJncykpIHtcbiAgICAgICAgICAgIHN1cGVyUHJvcHMgPSB7IGV4ZWN1dG9yOiBhcmdzLmV4ZWN1dG9yIH07XG4gICAgICAgICAgICBwcm9wcyA9IHsgLi4uYXJncyB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGlhbGVjdCA9IGFyZ3MuZGlhbGVjdDtcbiAgICAgICAgICAgIGNvbnN0IGRyaXZlciA9IGRpYWxlY3QuY3JlYXRlRHJpdmVyKCk7XG4gICAgICAgICAgICBjb25zdCBjb21waWxlciA9IGRpYWxlY3QuY3JlYXRlUXVlcnlDb21waWxlcigpO1xuICAgICAgICAgICAgY29uc3QgYWRhcHRlciA9IGRpYWxlY3QuY3JlYXRlQWRhcHRlcigpO1xuICAgICAgICAgICAgY29uc3QgbG9nID0gbmV3IExvZyhhcmdzLmxvZyA/PyBbXSk7XG4gICAgICAgICAgICBjb25zdCBydW50aW1lRHJpdmVyID0gbmV3IFJ1bnRpbWVEcml2ZXIoZHJpdmVyLCBsb2cpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblByb3ZpZGVyID0gbmV3IERlZmF1bHRDb25uZWN0aW9uUHJvdmlkZXIocnVudGltZURyaXZlcik7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRvciA9IG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcihjb21waWxlciwgYWRhcHRlciwgY29ubmVjdGlvblByb3ZpZGVyLCBhcmdzLnBsdWdpbnMgPz8gW10pO1xuICAgICAgICAgICAgc3VwZXJQcm9wcyA9IHsgZXhlY3V0b3IgfTtcbiAgICAgICAgICAgIHByb3BzID0ge1xuICAgICAgICAgICAgICAgIGNvbmZpZzogYXJncyxcbiAgICAgICAgICAgICAgICBleGVjdXRvcixcbiAgICAgICAgICAgICAgICBkaWFsZWN0LFxuICAgICAgICAgICAgICAgIGRyaXZlcjogcnVudGltZURyaXZlcixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoc3VwZXJQcm9wcyk7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFNjaGVtYU1vZHVsZX0gbW9kdWxlIGZvciBidWlsZGluZyBkYXRhYmFzZSBzY2hlbWEuXG4gICAgICovXG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFNb2R1bGUodGhpcy4jcHJvcHMuZXhlY3V0b3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgdGhlIHtAbGluayBEeW5hbWljTW9kdWxlfSBtb2R1bGUuXG4gICAgICpcbiAgICAgKiBUaGUge0BsaW5rIER5bmFtaWNNb2R1bGV9IG1vZHVsZSBjYW4gYmUgdXNlZCB0byBieXBhc3Mgc3RyaWN0IHR5cGluZyBhbmRcbiAgICAgKiBwYXNzaW5nIGluIGR5bmFtaWMgdmFsdWVzIGZvciB0aGUgcXVlcmllcy5cbiAgICAgKi9cbiAgICBnZXQgZHluYW1pYygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljTW9kdWxlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgRGF0YWJhc2VJbnRyb3NwZWN0b3IgfCBkYXRhYmFzZSBpbnRyb3NwZWN0b3J9LlxuICAgICAqL1xuICAgIGdldCBpbnRyb3NwZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZGlhbGVjdC5jcmVhdGVJbnRyb3NwZWN0b3IodGhpcy53aXRob3V0UGx1Z2lucygpKTtcbiAgICB9XG4gICAgY2FzZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IENhc2VCdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNyZWF0ZShpc1VuZGVmaW5lZCh2YWx1ZSkgPyB1bmRlZmluZWQgOiBwYXJzZUV4cHJlc3Npb24odmFsdWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgRnVuY3Rpb25Nb2R1bGV9IHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgc29tZXdoYXQgdHlwZS1zYWZlIGZ1bmN0aW9uXG4gICAgICogY2FsbHMuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHsgY291bnQgfSA9IGRiLmZuXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLmlubmVySm9pbigncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLnNlbGVjdChbXG4gICAgICogICAgICdpZCcsXG4gICAgICogICAgIGNvdW50KCdwZXQuaWQnKS5hcygncGVyc29uX2NvdW50JyksXG4gICAgICogICBdKVxuICAgICAqICAgLmdyb3VwQnkoJ3BlcnNvbi5pZCcpXG4gICAgICogICAuaGF2aW5nKGNvdW50KCdwZXQuaWQnKSwgJz4nLCAxMClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcInBlcnNvblwiLlwiaWRcIiwgY291bnQoXCJwZXRcIi5cImlkXCIpIGFzIFwicGVyc29uX2NvdW50XCJcbiAgICAgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBpbm5lciBqb2luIFwicGV0XCIgb24gXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIlxuICAgICAqIGdyb3VwIGJ5IFwicGVyc29uXCIuXCJpZFwiXG4gICAgICogaGF2aW5nIGNvdW50KFwicGV0XCIuXCJpZFwiKSA+ICQxXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBXaHkgXCJzb21ld2hhdFwiIHR5cGUtc2FmZT8gQmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FsbHMgYXJlIG5vdCBib3VuZCB0byB0aGVcbiAgICAgKiBjdXJyZW50IHF1ZXJ5IGNvbnRleHQuIFRoZXkgYWxsb3cgeW91IHRvIHJlZmVyZW5jZSBjb2x1bW5zIGFuZCB0YWJsZXMgdGhhdFxuICAgICAqIGFyZSBub3QgaW4gdGhlIGN1cnJlbnQgcXVlcnkuIEUuZy4gcmVtb3ZlIHRoZSBgaW5uZXJKb2luYCBmcm9tIHRoZSBwcmV2aW91c1xuICAgICAqIHF1ZXJ5IGFuZCBUeXBlU2NyaXB0IHdvbid0IGV2ZW4gY29tcGxhaW4uXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBtYWtlIHRoZSBmdW5jdGlvbiBjYWxscyBmdWxseSB0eXBlLXNhZmUsIHlvdSBjYW4gdXNlIHRoZVxuICAgICAqIHtAbGluayBFeHByZXNzaW9uQnVpbGRlci5mbn0gZ2V0dGVyIGZvciBhIHF1ZXJ5IGNvbnRleHQtYXdhcmUsIHN0cmljdGVyIHtAbGluayBGdW5jdGlvbk1vZHVsZX0uXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAuaW5uZXJKb2luKCdwZXQnLCAncGV0Lm93bmVyX2lkJywgJ3BlcnNvbi5pZCcpXG4gICAgICogICAuc2VsZWN0KChlYikgPT4gW1xuICAgICAqICAgICAncGVyc29uLmlkJyxcbiAgICAgKiAgICAgZWIuZm4uY291bnQoJ3BldC5pZCcpLmFzKCdwZXRfY291bnQnKVxuICAgICAqICAgXSlcbiAgICAgKiAgIC5ncm91cEJ5KCdwZXJzb24uaWQnKVxuICAgICAqICAgLmhhdmluZygoZWIpID0+IGViLmZuLmNvdW50KCdwZXQuaWQnKSwgJz4nLCAxMClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgZm4oKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbk1vZHVsZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlcn0gdGhhdCBjYW4gYmUgdXNlZCB0byBydW4gcXVlcmllcyBpbnNpZGUgYSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgVHJhbnNhY3Rpb25CdWlsZGVyfSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHRyYW5zYWN0aW9uLiBUaGVcbiAgICAgKiB7QGxpbmsgVHJhbnNhY3Rpb25CdWlsZGVyLmV4ZWN1dGV9IG1ldGhvZCBjYW4gdGhlbiBiZSBjYWxsZWQgdG8gcnVuIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiB7QGxpbmsgVHJhbnNhY3Rpb25CdWlsZGVyLmV4ZWN1dGV9IHRha2VzIGEgZnVuY3Rpb24gdGhhdCBpcyBydW4gaW5zaWRlIHRoZVxuICAgICAqIHRyYW5zYWN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbixcbiAgICAgKiAxLiB0aGUgZXhjZXB0aW9uIGlzIGNhdWdodCxcbiAgICAgKiAyLiB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2ssIGFuZFxuICAgICAqIDMuIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGFnYWluLlxuICAgICAqIE90aGVyd2lzZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlIHwgZXhlY3V0ZX1cbiAgICAgKiBtZXRob2QgZ2V0cyB0aGUgdHJhbnNhY3Rpb24gb2JqZWN0IGFzIGl0cyBvbmx5IGFyZ3VtZW50LiBUaGUgdHJhbnNhY3Rpb24gaXNcbiAgICAgKiBvZiB0eXBlIHtAbGluayBUcmFuc2FjdGlvbn0gd2hpY2ggaW5oZXJpdHMge0BsaW5rIEt5c2VseX0uIEFueSBxdWVyeVxuICAgICAqIHN0YXJ0ZWQgdGhyb3VnaCB0aGUgdHJhbnNhY3Rpb24gb2JqZWN0IGlzIGV4ZWN1dGVkIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUbyBydW4gYSBjb250cm9sbGVkIHRyYW5zYWN0aW9uLCBhbGxvd2luZyB5b3UgdG8gY29tbWl0IGFuZCByb2xsYmFjayBtYW51YWxseSxcbiAgICAgKiB1c2Uge0BsaW5rIHN0YXJ0VHJhbnNhY3Rpb259IGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJ0cmFuc2FjdGlvbnNcIiwgXCJTaW1wbGUgdHJhbnNhY3Rpb25cIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogVGhpcyBleGFtcGxlIGluc2VydHMgdHdvIHJvd3MgaW4gYSB0cmFuc2FjdGlvbi4gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBpbnNpZGVcbiAgICAgKiB0aGUgY2FsbGJhY2sgcGFzc2VkIHRvIHRoZSBgZXhlY3V0ZWAgbWV0aG9kLFxuICAgICAqIDEuIHRoZSBleGNlcHRpb24gaXMgY2F1Z2h0LFxuICAgICAqIDIuIHRoZSB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjaywgYW5kXG4gICAgICogMy4gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24gYWdhaW4uXG4gICAgICogT3RoZXJ3aXNlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGNhdHRvID0gYXdhaXQgZGIudHJhbnNhY3Rpb24oKS5leGVjdXRlKGFzeW5jICh0cngpID0+IHtcbiAgICAgKiAgIGNvbnN0IGplbm5pZmVyID0gYXdhaXQgdHJ4Lmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgICAgYWdlOiA0MCxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgdHJ4Lmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIG93bmVyX2lkOiBqZW5uaWZlci5pZCxcbiAgICAgKiAgICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICAgIGlzX2Zhdm9yaXRlOiBmYWxzZSxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2V0dGluZyB0aGUgaXNvbGF0aW9uIGxldmVsOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAudHJhbnNhY3Rpb24oKVxuICAgICAqICAgLnNldElzb2xhdGlvbkxldmVsKCdzZXJpYWxpemFibGUnKVxuICAgICAqICAgLmV4ZWN1dGUoYXN5bmMgKHRyeCkgPT4ge1xuICAgICAqICAgICBhd2FpdCBkb1N0dWZmKHRyeClcbiAgICAgKiAgIH0pXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1N0dWZmKGt5c2VseTogdHlwZW9mIGRiKSB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcn0gdGhhdCBjYW4gYmUgdXNlZCB0byBydW4gcXVlcmllcyBpbnNpZGUgYSBjb250cm9sbGVkIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogVGhlIHJldHVybmVkIHtAbGluayBDb250cm9sbGVkVHJhbnNhY3Rpb25CdWlsZGVyfSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIFRoZSB7QGxpbmsgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlfSBtZXRob2QgY2FuIHRoZW4gYmUgY2FsbGVkXG4gICAgICogdG8gc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGFuZCByZXR1cm4gYSB7QGxpbmsgQ29udHJvbGxlZFRyYW5zYWN0aW9ufS5cbiAgICAgKlxuICAgICAqIEEge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbn0gYWxsb3dzIHlvdSB0byBjb21taXQgYW5kIHJvbGxiYWNrIG1hbnVhbGx5LFxuICAgICAqIGV4ZWN1dGUgc2F2ZXBvaW50IGNvbW1hbmRzLiBJdCBleHRlbmRzIHtAbGluayBUcmFuc2FjdGlvbn0gd2hpY2ggZXh0ZW5kcyB7QGxpbmsgS3lzZWx5fSxcbiAgICAgKiBzbyB5b3UgY2FuIHJ1biBxdWVyaWVzIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uIE9uY2UgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZCxcbiAgICAgKiBvciByb2xsZWQgYmFjaywgaXQgY2FuJ3QgYmUgdXNlZCBhbnltb3JlIC0gYWxsIHF1ZXJpZXMgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKiBUaGlzIGlzIHRvIHByZXZlbnQgYWNjaWRlbnRhbGx5IHJ1bm5pbmcgcXVlcmllcyBvdXRzaWRlIHRoZSB0cmFuc2FjdGlvbiAtIHdoZXJlXG4gICAgICogYXRvbWljaXR5IGlzIG5vdCBndWFyYW50ZWVkIGFueW1vcmUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJ0cmFuc2FjdGlvbnNcIiwgXCJDb250cm9sbGVkIHRyYW5zYWN0aW9uXCIsIDExKSAtLT5cbiAgICAgKlxuICAgICAqIEEgY29udHJvbGxlZCB0cmFuc2FjdGlvbiBhbGxvd3MgeW91IHRvIGNvbW1pdCBhbmQgcm9sbGJhY2sgbWFudWFsbHksIGV4ZWN1dGVcbiAgICAgKiBzYXZlcG9pbnQgY29tbWFuZHMsIGFuZCBxdWVyaWVzIGluIGdlbmVyYWwuXG4gICAgICpcbiAgICAgKiBJbiB0aGlzIGV4YW1wbGUgd2Ugc3RhcnQgYSB0cmFuc2FjdGlvbiwgdXNlIGl0IHRvIGluc2VydCB0d28gcm93cyBhbmQgdGhlbiBjb21taXRcbiAgICAgKiB0aGUgdHJhbnNhY3Rpb24uIElmIGFuIGVycm9yIGlzIHRocm93biwgd2UgY2F0Y2ggaXQgYW5kIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGNvbnN0IGplbm5pZmVyID0gYXdhaXQgdHJ4Lmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgICAgYWdlOiA0MCxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICBjb25zdCBjYXR0byA9IGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBvd25lcl9pZDogamVubmlmZXIuaWQsXG4gICAgICogICAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgICBpc19mYXZvcml0ZTogZmFsc2UsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICBhd2FpdCB0cnguY29tbWl0KCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiAgIC8vIC4uLlxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cngucm9sbGJhY2soKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwidHJhbnNhY3Rpb25zXCIsIFwiQ29udHJvbGxlZCB0cmFuc2FjdGlvbiAvdyBzYXZlcG9pbnRzXCIsIDEyKSAtLT5cbiAgICAgKlxuICAgICAqIEEgY29udHJvbGxlZCB0cmFuc2FjdGlvbiBhbGxvd3MgeW91IHRvIGNvbW1pdCBhbmQgcm9sbGJhY2sgbWFudWFsbHksIGV4ZWN1dGVcbiAgICAgKiBzYXZlcG9pbnQgY29tbWFuZHMsIGFuZCBxdWVyaWVzIGluIGdlbmVyYWwuXG4gICAgICpcbiAgICAgKiBJbiB0aGlzIGV4YW1wbGUgd2Ugc3RhcnQgYSB0cmFuc2FjdGlvbiwgaW5zZXJ0IGEgcGVyc29uLCBjcmVhdGUgYSBzYXZlcG9pbnQsXG4gICAgICogdHJ5IGluc2VydGluZyBhIHRveSBhbmQgYSBwZXQsIGFuZCBpZiBhbiBlcnJvciBpcyB0aHJvd24sIHdlIHJvbGxiYWNrIHRvIHRoZVxuICAgICAqIHNhdmVwb2ludC4gRXZlbnR1YWxseSB3ZSByZWxlYXNlIHRoZSBzYXZlcG9pbnQsIGluc2VydCBhbiBhdWRpdCByZWNvcmQgYW5kXG4gICAgICogY29tbWl0IHRoZSB0cmFuc2FjdGlvbi4gSWYgYW4gZXJyb3IgaXMgdGhyb3duLCB3ZSBjYXRjaCBpdCBhbmQgcm9sbGJhY2sgdGhlXG4gICAgICogdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBjb25zdCBqZW5uaWZlciA9IGF3YWl0IHRyeFxuICAgICAqICAgICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJyxcbiAgICAgKiAgICAgICBhZ2U6IDQwLFxuICAgICAqICAgICB9KVxuICAgICAqICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiAgIGNvbnN0IHRyeEFmdGVySmVubmlmZXIgPSBhd2FpdCB0cnguc2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICB0cnkge1xuICAgICAqICAgICBjb25zdCBjYXR0byA9IGF3YWl0IHRyeEFmdGVySmVubmlmZXJcbiAgICAgKiAgICAgICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICAgIG93bmVyX2lkOiBqZW5uaWZlci5pZCxcbiAgICAgKiAgICAgICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgICB9KVxuICAgICAqICAgICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXJcbiAgICAgKiAgICAgICAuaW5zZXJ0SW50bygndG95JylcbiAgICAgKiAgICAgICAudmFsdWVzKHsgbmFtZTogJ0JvbmUnLCBwcmljZTogMS45OSwgcGV0X2lkOiBjYXR0by5pZCB9KVxuICAgICAqICAgICAgIC5leGVjdXRlKClcbiAgICAgKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucm9sbGJhY2tUb1NhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4QWZ0ZXJKZW5uaWZlci5yZWxlYXNlU2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICBhd2FpdCB0cnguaW5zZXJ0SW50bygnYXVkaXQnKS52YWx1ZXMoeyBhY3Rpb246ICdhZGRlZCBKZW5uaWZlcicgfSkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeC5jb21taXQoKS5leGVjdXRlKClcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHN0YXJ0VHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIGt5c2VseSBpbnN0YW5jZSBib3VuZCB0byBhIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuY29ubmVjdGlvbigpXG4gICAgICogICAuZXhlY3V0ZShhc3luYyAoZGIpID0+IHtcbiAgICAgKiAgICAgLy8gYGRiYCBpcyBhbiBpbnN0YW5jZSBvZiBgS3lzZWx5YCB0aGF0J3MgYm91bmQgdG8gYSBzaW5nbGVcbiAgICAgKiAgICAgLy8gZGF0YWJhc2UgY29ubmVjdGlvbi4gQWxsIHF1ZXJpZXMgZXhlY3V0ZWQgdGhyb3VnaCBgZGJgIHVzZVxuICAgICAqICAgICAvLyB0aGUgc2FtZSBjb25uZWN0aW9uLlxuICAgICAqICAgICBhd2FpdCBkb1N0dWZmKGRiKVxuICAgICAqICAgfSlcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU3R1ZmYoa3lzZWx5OiB0eXBlb2YgZGIpIHtcbiAgICAgKiAgIC8vIC4uLlxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25CdWlsZGVyKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgS3lzZWx5IGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBLeXNlbHkoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBLeXNlbHkgaW5zdGFuY2Ugd2l0aG91dCBhbnkgcGx1Z2lucy5cbiAgICAgKi9cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBLeXNlbHkoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aG91dFBsdWdpbnMoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBLeXNlbHkgaW5zdGFuY2Ugd2l0aCB0YWJsZXMgYWRkZWQgdG8gaXRzXG4gICAgICogZGF0YWJhc2UgdHlwZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgbW9kaWZpZXMgdGhlIHR5cGVzIGFuZCBkb2Vzbid0IGFmZmVjdCBhbnkgb2YgdGhlXG4gICAgICogZXhlY3V0ZWQgcXVlcmllcyBpbiBhbnkgd2F5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgYWRkcyBhbmQgdXNlcyBhIHRlbXBvcmFyeSB0YWJsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3RlbXBfdGFibGUnKVxuICAgICAqICAgLnRlbXBvcmFyeSgpXG4gICAgICogICAuYWRkQ29sdW1uKCdzb21lX2NvbHVtbicsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHRlbXBEYiA9IGRiLndpdGhUYWJsZXM8e1xuICAgICAqICAgdGVtcF90YWJsZToge1xuICAgICAqICAgICBzb21lX2NvbHVtbjogbnVtYmVyXG4gICAgICogICB9XG4gICAgICogfT4oKVxuICAgICAqXG4gICAgICogYXdhaXQgdGVtcERiXG4gICAgICogICAuaW5zZXJ0SW50bygndGVtcF90YWJsZScpXG4gICAgICogICAudmFsdWVzKHsgc29tZV9jb2x1bW46IDEwMCB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHdpdGhUYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYW5kIGRpc2Nvbm5lY3RzIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogWW91IG5lZWQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGFyZSBkb25lIHVzaW5nIHRoZSBgS3lzZWx5YCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBgS3lzZWx5YCBpbnN0YW5jZSBpcyBhIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIHVzZSBgZGIgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbmAuXG4gICAgICovXG4gICAgZ2V0IGlzVHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRFeGVjdXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIGdpdmVuIGNvbXBpbGVkIHF1ZXJ5IG9yIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9reXNlbHktb3JnL2t5c2VseS9ibG9iL21hc3Rlci9zaXRlL2RvY3MvcmVjaXBlcy8wMDA0LXNwbGl0dGluZy1xdWVyeS1idWlsZGluZy1hbmQtZXhlY3V0aW9uLm1kI2V4ZWN1dGUtY29tcGlsZWQtcXVlcmllcyBzcGxpdHRpbmcgYnVpbGQsIGNvbXBpbGUgYW5kIGV4ZWN1dGUgY29kZSByZWNpcGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIGV4ZWN1dGVRdWVyeShxdWVyeSwgXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW4gdGhlIGZ1dHVyZS4gZGVwcmVjYXRlZCBpbiAgMC4yOC54XG4gICAgcXVlcnlJZCkge1xuICAgICAgICBpZiAocXVlcnlJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2dPbmNlKCdQYXNzaW5nIGBxdWVyeUlkYCBpbiBgZGIuZXhlY3V0ZVF1ZXJ5YCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGNvbXBpbGUtdGltZSBlcnJvciBpbiB0aGUgZnV0dXJlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSBpc0NvbXBpbGFibGUocXVlcnkpID8gcXVlcnkuY29tcGlsZSgpIDogcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgIH1cbiAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEt5c2VseSB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBwcm9wcztcbiAgICB9XG4gICAgLy8gVGhlIHJldHVybiB0eXBlIGlzIGB0cnVlYCBpbnN0ZWFkIG9mIGBib29sZWFuYCB0byBtYWtlIEt5c2VseTxEQj5cbiAgICAvLyB1bmFzc2lnbmFibGUgdG8gVHJhbnNhY3Rpb248REI+IHdoaWxlIGFsbG93aW5nIGFzc2lnbm1lbnQgdGhlXG4gICAgLy8gb3RoZXIgd2F5IGFyb3VuZC5cbiAgICBnZXQgaXNUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRyYW5zYWN0aW9uKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIHRyYW5zYWN0aW9uIG1ldGhvZCBmb3IgYSBUcmFuc2FjdGlvbiBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIGNvbm5lY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0aGUgY29ubmVjdGlvbiBtZXRob2QgZm9yIGEgVHJhbnNhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgICBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIGRlc3Ryb3kgbWV0aG9kIGZvciBhIFRyYW5zYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRob3V0UGx1Z2lucygpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhUYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oeyAuLi50aGlzLiNwcm9wcyB9KTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNLeXNlbHlQcm9wcyhvYmopIHtcbiAgICByZXR1cm4gKGlzT2JqZWN0KG9iaikgJiZcbiAgICAgICAgaXNPYmplY3Qob2JqLmNvbmZpZykgJiZcbiAgICAgICAgaXNPYmplY3Qob2JqLmRyaXZlcikgJiZcbiAgICAgICAgaXNPYmplY3Qob2JqLmV4ZWN1dG9yKSAmJlxuICAgICAgICBpc09iamVjdChvYmouZGlhbGVjdCkpO1xufVxuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5wcm92aWRlQ29ubmVjdGlvbihhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoQ29ubmVjdGlvblByb3ZpZGVyKG5ldyBTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvbikpO1xuICAgICAgICAgICAgY29uc3QgZGIgPSBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgICAgICBleGVjdXRvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGRiKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgc2V0QWNjZXNzTW9kZShhY2Nlc3NNb2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWNjZXNzTW9kZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldElzb2xhdGlvbkxldmVsKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgaXNvbGF0aW9uTGV2ZWwsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHsgaXNvbGF0aW9uTGV2ZWwsIGFjY2Vzc01vZGUsIC4uLmt5c2VseVByb3BzIH0gPSB0aGlzLiNwcm9wcztcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7IGlzb2xhdGlvbkxldmVsLCBhY2Nlc3NNb2RlIH07XG4gICAgICAgIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5wcm92aWRlQ29ubmVjdGlvbihhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoQ29ubmVjdGlvblByb3ZpZGVyKG5ldyBTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvbikpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgICAgIC4uLmt5c2VseVByb3BzLFxuICAgICAgICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25CZWd1biA9IGZhbHNlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuYmVnaW5UcmFuc2FjdGlvbihjb25uZWN0aW9uLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25CZWd1biA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2FsbGJhY2sodHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5jb21taXRUcmFuc2FjdGlvbihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uQmVndW4pIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgc2V0QWNjZXNzTW9kZShhY2Nlc3NNb2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFjY2Vzc01vZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRJc29sYXRpb25MZXZlbChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBpc29sYXRpb25MZXZlbCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IHsgaXNvbGF0aW9uTGV2ZWwsIGFjY2Vzc01vZGUsIC4uLnByb3BzIH0gPSB0aGlzLiNwcm9wcztcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7IGlzb2xhdGlvbkxldmVsLCBhY2Nlc3NNb2RlIH07XG4gICAgICAgIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24odGhpcy4jcHJvcHMuZXhlY3V0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuYmVnaW5UcmFuc2FjdGlvbihjb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNldHRpbmdzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIobmV3IFNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uLmNvbm5lY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbnRyb2xsZWRUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uIHtcbiAgICAjcHJvcHM7XG4gICAgI2NvbXBpbGVRdWVyeTtcbiAgICAjc3RhdGU7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7IGlzQ29tbWl0dGVkOiBmYWxzZSwgaXNSb2xsZWRCYWNrOiBmYWxzZSB9O1xuICAgICAgICBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcihwcm9wcy5leGVjdXRvciwgc3RhdGUpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGNvbm5lY3Rpb24sIC4uLnRyYW5zYWN0aW9uUHJvcHMgfSA9IHByb3BzO1xuICAgICAgICBzdXBlcih0cmFuc2FjdGlvblByb3BzKTtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgICAgICB0aGlzLiNzdGF0ZSA9IHN0YXRlO1xuICAgICAgICBjb25zdCBxdWVyeUlkID0gY3JlYXRlUXVlcnlJZCgpO1xuICAgICAgICB0aGlzLiNjb21waWxlUXVlcnkgPSAobm9kZSkgPT4gcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICBnZXQgaXNDb21taXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0ZS5pc0NvbW1pdHRlZDtcbiAgICB9XG4gICAgZ2V0IGlzUm9sbGVkQmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlLmlzUm9sbGVkQmFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIHJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cngpXG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeC5jb21taXQoKS5leGVjdXRlKClcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9Tb21ldGhpbmcoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbW1pdCgpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5jb21taXRUcmFuc2FjdGlvbih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUuaXNDb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy4jcHJvcHMuY29ubmVjdGlvbi5yZWxlYXNlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgY29tbWl0fSBhbmQge0BsaW5rIHJvbGxiYWNrVG9TYXZlcG9pbnR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGRvU29tZXRoaW5nKHRyeClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4LmNvbW1pdCgpLmV4ZWN1dGUoKVxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cngucm9sbGJhY2soKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcm9sbGJhY2soKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWFuZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIucm9sbGJhY2tUcmFuc2FjdGlvbih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUuaXNSb2xsZWRCYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24ucmVsZWFzZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNhdmVwb2ludCB3aXRoIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgcm9sbGJhY2tUb1NhdmVwb2ludH0gYW5kIHtAbGluayByZWxlYXNlU2F2ZXBvaW50fS5cbiAgICAgKlxuICAgICAqIEZvciBhIHR5cGUtc2FmZSBleHBlcmllbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgZnJvbSBub3cgb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG4gICAgICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnggPSBhd2FpdCBkYi5zdGFydFRyYW5zYWN0aW9uKCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBhd2FpdCBpbnNlcnRKZW5uaWZlcih0cngpXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnhBZnRlckplbm5pZmVyID0gYXdhaXQgdHJ4LnNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cnhBZnRlckplbm5pZmVyKVxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0SmVubmlmZXIoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU29tZXRoaW5nKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzYXZlcG9pbnQoc2F2ZXBvaW50TmFtZSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnNhdmVwb2ludD8uKHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24uY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgdGhpcy4jY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRvIGEgc2F2ZXBvaW50IHdpdGggYSBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBzYXZlcG9pbnR9IGFuZCB7QGxpbmsgcmVsZWFzZVNhdmVwb2ludH0uXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCB1c2UgdGhlIHNhbWUgaW5zdGFuY2UgcmV0dXJuZWQgYnkge0BsaW5rIHNhdmVwb2ludH0sIG9yXG4gICAgICogZXNjYXBlIHRoZSB0eXBlLWNoZWNrIGJ5IHVzaW5nIGBhcyBhbnlgLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogYXdhaXQgaW5zZXJ0SmVubmlmZXIodHJ4KVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4QWZ0ZXJKZW5uaWZlciA9IGF3YWl0IHRyeC5zYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgYXdhaXQgZG9Tb21ldGhpbmcodHJ4QWZ0ZXJKZW5uaWZlcilcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4QWZ0ZXJKZW5uaWZlci5yb2xsYmFja1RvU2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydEplbm5pZmVyKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcm9sbGJhY2tUb1NhdmVwb2ludChzYXZlcG9pbnROYW1lKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWFuZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIucm9sbGJhY2tUb1NhdmVwb2ludD8uKHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24uY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgdGhpcy4jY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBhIHNhdmVwb2ludCB3aXRoIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgc2F2ZXBvaW50fSBhbmQge0BsaW5rIHJvbGxiYWNrVG9TYXZlcG9pbnR9LlxuICAgICAqXG4gICAgICogWW91IG11c3QgdXNlIHRoZSBzYW1lIGluc3RhbmNlIHJldHVybmVkIGJ5IHtAbGluayBzYXZlcG9pbnR9LCBvclxuICAgICAqIGVzY2FwZSB0aGUgdHlwZS1jaGVjayBieSB1c2luZyBgYXMgYW55YC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGF3YWl0IGluc2VydEplbm5pZmVyKHRyeClcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeEFmdGVySmVubmlmZXIgPSBhd2FpdCB0cnguc2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGRvU29tZXRoaW5nKHRyeEFmdGVySmVubmlmZXIpXG4gICAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgKiAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucm9sbGJhY2tUb1NhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJlbGVhc2VTYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBhd2FpdCBkb1NvbWV0aGluZ0Vsc2UodHJ4KVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0SmVubmlmZXIoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU29tZXRoaW5nKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZ0Vsc2Uoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlbGVhc2VTYXZlcG9pbnQoc2F2ZXBvaW50TmFtZSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnJlbGVhc2VTYXZlcG9pbnQ/Lih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIHRoaXMuI2NvbXBpbGVRdWVyeSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhUYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbW1hbmQge1xuICAgICNjYjtcbiAgICBjb25zdHJ1Y3RvcihjYikge1xuICAgICAgICB0aGlzLiNjYiA9IGNiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY29tbWFuZC5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jY2IoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2soc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuaXNDb21taXR0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBpcyBhbHJlYWR5IGNvbW1pdHRlZCcpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuaXNSb2xsZWRCYWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaXMgYWxyZWFkeSByb2xsZWQgYmFjaycpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXhlY3V0b3Igd3JhcHBlciB0aGF0IGFzc2VydHMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc3RhdGUgaXMgbm90IGNvbW1pdHRlZFxuICogb3Igcm9sbGVkIGJhY2sgd2hlbiBhIHF1ZXJ5IGlzIGV4ZWN1dGVkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvciB7XG4gICAgI2V4ZWN1dG9yO1xuICAgICNzdGF0ZTtcbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvciwgc3RhdGUpIHtcbiAgICAgICAgaWYgKGV4ZWN1dG9yIGluc3RhbmNlb2YgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuI2V4ZWN1dG9yID0gZXhlY3V0b3IuI2V4ZWN1dG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzdGF0ZSA9IHN0YXRlO1xuICAgIH1cbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLmFkYXB0ZXI7XG4gICAgfVxuICAgIGdldCBwbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IucGx1Z2lucztcbiAgICB9XG4gICAgdHJhbnNmb3JtUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5jb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5wcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcik7XG4gICAgfVxuICAgIGV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSk7XG4gICAgfVxuICAgIHN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpO1xuICAgIH1cbiAgICB3aXRoQ29ubmVjdGlvblByb3ZpZGVyKGNvbm5lY3Rpb25Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvblByb3ZpZGVyKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IodGhpcy4jZXhlY3V0b3Iud2l0aFBsdWdpbnMocGx1Z2lucyksIHRoaXMuI3N0YXRlKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IodGhpcy4jZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcih0aGlzLiNleGVjdXRvci53aXRob3V0UGx1Z2lucygpLCB0aGlzLiNzdGF0ZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yYXctYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgTk9PUF9RVUVSWV9FWEVDVVRPUiB9IGZyb20gJy4uL3F1ZXJ5LWV4ZWN1dG9yL25vb3AtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmNsYXNzIFJhd0J1aWxkZXJJbXBsIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBpc1Jhd0J1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IEFsaWFzZWRSYXdCdWlsZGVySW1wbCh0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmF3QnVpbGRlckltcGwoeyAuLi50aGlzLiNwcm9wcyB9KTtcbiAgICB9XG4gICAgJG5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmF3QnVpbGRlckltcGwodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFJhd0J1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcGx1Z2luczogdGhpcy4jcHJvcHMucGx1Z2lucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnRoaXMuI3Byb3BzLnBsdWdpbnMsIHBsdWdpbl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW3BsdWdpbl0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdG9PcGVyYXRpb25Ob2RlKHRoaXMuI2dldEV4ZWN1dG9yKCkpO1xuICAgIH1cbiAgICBjb21waWxlKGV4ZWN1dG9yUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGUodGhpcy4jZ2V0RXhlY3V0b3IoZXhlY3V0b3JQcm92aWRlcikpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKGV4ZWN1dG9yUHJvdmlkZXIpIHtcbiAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLiNnZXRFeGVjdXRvcihleGVjdXRvclByb3ZpZGVyKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLiNjb21waWxlKGV4ZWN1dG9yKSk7XG4gICAgfVxuICAgICNnZXRFeGVjdXRvcihleGVjdXRvclByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dG9yID0gZXhlY3V0b3JQcm92aWRlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGV4ZWN1dG9yUHJvdmlkZXIuZ2V0RXhlY3V0b3IoKVxuICAgICAgICAgICAgOiBOT09QX1FVRVJZX0VYRUNVVE9SO1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMucGx1Z2lucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGV4ZWN1dG9yLndpdGhQbHVnaW5zKHRoaXMuI3Byb3BzLnBsdWdpbnMpXG4gICAgICAgICAgICA6IGV4ZWN1dG9yO1xuICAgIH1cbiAgICAjdG9PcGVyYXRpb25Ob2RlKGV4ZWN1dG9yKSB7XG4gICAgICAgIHJldHVybiBleGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5yYXdOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgI2NvbXBpbGUoZXhlY3V0b3IpIHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLiN0b09wZXJhdGlvbk5vZGUoZXhlY3V0b3IpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmF3QnVpbGRlcihwcm9wcykge1xuICAgIHJldHVybiBuZXcgUmF3QnVpbGRlckltcGwocHJvcHMpO1xufVxuY2xhc3MgQWxpYXNlZFJhd0J1aWxkZXJJbXBsIHtcbiAgICAjcmF3QnVpbGRlcjtcbiAgICAjYWxpYXM7XG4gICAgY29uc3RydWN0b3IocmF3QnVpbGRlciwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jcmF3QnVpbGRlciA9IHJhd0J1aWxkZXI7XG4gICAgICAgIHRoaXMuI2FsaWFzID0gYWxpYXM7XG4gICAgfVxuICAgIGdldCBleHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmF3QnVpbGRlcjtcbiAgICB9XG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIGdldCByYXdCdWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmF3QnVpbGRlcjtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZSh0aGlzLiNyYXdCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpLCBpc09wZXJhdGlvbk5vZGVTb3VyY2UodGhpcy4jYWxpYXMpXG4gICAgICAgICAgICA/IHRoaXMuI2FsaWFzLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgICAgICA6IElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNhbGlhcykpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc3FsLmQudHNcIiAvPlxuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlU3RyaW5nUmVmZXJlbmNlIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24gfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5SWQgfSBmcm9tICcuLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJhd0J1aWxkZXIgfSBmcm9tICcuL3Jhdy1idWlsZGVyLmpzJztcbmV4cG9ydCBjb25zdCBzcWwgPSBPYmplY3QuYXNzaWduKChzcWxGcmFnbWVudHMsIC4uLnBhcmFtZXRlcnMpID0+IHtcbiAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgcmF3Tm9kZTogUmF3Tm9kZS5jcmVhdGUoc3FsRnJhZ21lbnRzLCBwYXJhbWV0ZXJzPy5tYXAocGFyc2VQYXJhbWV0ZXIpID8/IFtdKSxcbiAgICB9KTtcbn0sIHtcbiAgICByZWYoY29sdW1uUmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aENoaWxkKHBhcnNlU3RyaW5nUmVmZXJlbmNlKGNvbHVtblJlZmVyZW5jZSkpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHZhbCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhDaGlsZChwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZSkpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbCh2YWx1ZSk7XG4gICAgfSxcbiAgICB0YWJsZSh0YWJsZVJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhDaGlsZChwYXJzZVRhYmxlKHRhYmxlUmVmZXJlbmNlKSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgaWQoLi4uaWRzKSB7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50cyA9IG5ldyBBcnJheShpZHMubGVuZ3RoICsgMSkuZmlsbCgnLicpO1xuICAgICAgICBmcmFnbWVudHNbMF0gPSAnJztcbiAgICAgICAgZnJhZ21lbnRzW2ZyYWdtZW50cy5sZW5ndGggLSAxXSA9ICcnO1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZShmcmFnbWVudHMsIGlkcy5tYXAoSWRlbnRpZmllck5vZGUuY3JlYXRlKSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgbGl0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aENoaWxkKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUodmFsdWUpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBsaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpdCh2YWx1ZSk7XG4gICAgfSxcbiAgICByYXcoc3FsKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aFNxbChzcWwpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGpvaW4oYXJyYXksIHNlcGFyYXRvciA9IHNxbCBgLCBgKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5KE1hdGgubWF4KDIgKiBhcnJheS5sZW5ndGggLSAxLCAwKSk7XG4gICAgICAgIGNvbnN0IHNlcCA9IHNlcGFyYXRvci50b09wZXJhdGlvbk5vZGUoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbm9kZXNbMiAqIGldID0gcGFyc2VQYXJhbWV0ZXIoYXJyYXlbaV0pO1xuICAgICAgICAgICAgaWYgKGkgIT09IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBub2Rlc1syICogaSArIDFdID0gc2VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aENoaWxkcmVuKG5vZGVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuZnVuY3Rpb24gcGFyc2VQYXJhbWV0ZXIocGFyYW0pIHtcbiAgICBpZiAoaXNPcGVyYXRpb25Ob2RlU291cmNlKHBhcmFtKSkge1xuICAgICAgICByZXR1cm4gcGFyYW0udG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVZhbHVlRXhwcmVzc2lvbihwYXJhbSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29wZXJhdGlvbi1ub2RlLXZpc2l0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uTm9kZVZpc2l0b3Ige1xuICAgIG5vZGVTdGFjayA9IFtdO1xuICAgIGdldCBwYXJlbnROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlU3RhY2tbdGhpcy5ub2RlU3RhY2subGVuZ3RoIC0gMl07XG4gICAgfVxuICAgICN2aXNpdG9ycyA9IGZyZWV6ZSh7XG4gICAgICAgIEFsaWFzTm9kZTogdGhpcy52aXNpdEFsaWFzLmJpbmQodGhpcyksXG4gICAgICAgIENvbHVtbk5vZGU6IHRoaXMudmlzaXRDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgSWRlbnRpZmllck5vZGU6IHRoaXMudmlzaXRJZGVudGlmaWVyLmJpbmQodGhpcyksXG4gICAgICAgIFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlOiB0aGlzLnZpc2l0U2NoZW1hYmxlSWRlbnRpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBSYXdOb2RlOiB0aGlzLnZpc2l0UmF3LmJpbmQodGhpcyksXG4gICAgICAgIFJlZmVyZW5jZU5vZGU6IHRoaXMudmlzaXRSZWZlcmVuY2UuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0UXVlcnlOb2RlOiB0aGlzLnZpc2l0U2VsZWN0UXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0aW9uTm9kZTogdGhpcy52aXNpdFNlbGVjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBUYWJsZU5vZGU6IHRoaXMudmlzaXRUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBGcm9tTm9kZTogdGhpcy52aXNpdEZyb20uYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0QWxsTm9kZTogdGhpcy52aXNpdFNlbGVjdEFsbC5iaW5kKHRoaXMpLFxuICAgICAgICBBbmROb2RlOiB0aGlzLnZpc2l0QW5kLmJpbmQodGhpcyksXG4gICAgICAgIE9yTm9kZTogdGhpcy52aXNpdE9yLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTm9kZTogdGhpcy52aXNpdFZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTGlzdE5vZGU6IHRoaXMudmlzaXRWYWx1ZUxpc3QuYmluZCh0aGlzKSxcbiAgICAgICAgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZTogdGhpcy52aXNpdFByaW1pdGl2ZVZhbHVlTGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJlbnNOb2RlOiB0aGlzLnZpc2l0UGFyZW5zLmJpbmQodGhpcyksXG4gICAgICAgIEpvaW5Ob2RlOiB0aGlzLnZpc2l0Sm9pbi5iaW5kKHRoaXMpLFxuICAgICAgICBPcGVyYXRvck5vZGU6IHRoaXMudmlzaXRPcGVyYXRvci5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVyZU5vZGU6IHRoaXMudmlzaXRXaGVyZS5iaW5kKHRoaXMpLFxuICAgICAgICBJbnNlcnRRdWVyeU5vZGU6IHRoaXMudmlzaXRJbnNlcnRRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBEZWxldGVRdWVyeU5vZGU6IHRoaXMudmlzaXREZWxldGVRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBSZXR1cm5pbmdOb2RlOiB0aGlzLnZpc2l0UmV0dXJuaW5nLmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVRhYmxlTm9kZTogdGhpcy52aXNpdENyZWF0ZVRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIEFkZENvbHVtbk5vZGU6IHRoaXMudmlzaXRBZGRDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uRGVmaW5pdGlvbk5vZGU6IHRoaXMudmlzaXRDb2x1bW5EZWZpbml0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BUYWJsZU5vZGU6IHRoaXMudmlzaXREcm9wVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRGF0YVR5cGVOb2RlOiB0aGlzLnZpc2l0RGF0YVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgT3JkZXJCeU5vZGU6IHRoaXMudmlzaXRPcmRlckJ5LmJpbmQodGhpcyksXG4gICAgICAgIE9yZGVyQnlJdGVtTm9kZTogdGhpcy52aXNpdE9yZGVyQnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgIEdyb3VwQnlOb2RlOiB0aGlzLnZpc2l0R3JvdXBCeS5iaW5kKHRoaXMpLFxuICAgICAgICBHcm91cEJ5SXRlbU5vZGU6IHRoaXMudmlzaXRHcm91cEJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBVcGRhdGVRdWVyeU5vZGU6IHRoaXMudmlzaXRVcGRhdGVRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBDb2x1bW5VcGRhdGVOb2RlOiB0aGlzLnZpc2l0Q29sdW1uVXBkYXRlLmJpbmQodGhpcyksXG4gICAgICAgIExpbWl0Tm9kZTogdGhpcy52aXNpdExpbWl0LmJpbmQodGhpcyksXG4gICAgICAgIE9mZnNldE5vZGU6IHRoaXMudmlzaXRPZmZzZXQuYmluZCh0aGlzKSxcbiAgICAgICAgT25Db25mbGljdE5vZGU6IHRoaXMudmlzaXRPbkNvbmZsaWN0LmJpbmQodGhpcyksXG4gICAgICAgIE9uRHVwbGljYXRlS2V5Tm9kZTogdGhpcy52aXNpdE9uRHVwbGljYXRlS2V5LmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZUluZGV4Tm9kZTogdGhpcy52aXNpdENyZWF0ZUluZGV4LmJpbmQodGhpcyksXG4gICAgICAgIERyb3BJbmRleE5vZGU6IHRoaXMudmlzaXREcm9wSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgTGlzdE5vZGU6IHRoaXMudmlzaXRMaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdFByaW1hcnlLZXlDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFVuaXF1ZUNvbnN0cmFpbnROb2RlOiB0aGlzLnZpc2l0VW5pcXVlQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZlcmVuY2VzTm9kZTogdGhpcy52aXNpdFJlZmVyZW5jZXMuYmluZCh0aGlzKSxcbiAgICAgICAgQ2hlY2tDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdENoZWNrQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBXaXRoTm9kZTogdGhpcy52aXNpdFdpdGguYmluZCh0aGlzKSxcbiAgICAgICAgQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZTogdGhpcy52aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZTogdGhpcy52aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUuYmluZCh0aGlzKSxcbiAgICAgICAgSGF2aW5nTm9kZTogdGhpcy52aXNpdEhhdmluZy5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVTY2hlbWFOb2RlOiB0aGlzLnZpc2l0Q3JlYXRlU2NoZW1hLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BTY2hlbWFOb2RlOiB0aGlzLnZpc2l0RHJvcFNjaGVtYS5iaW5kKHRoaXMpLFxuICAgICAgICBBbHRlclRhYmxlTm9kZTogdGhpcy52aXNpdEFsdGVyVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcENvbHVtbk5vZGU6IHRoaXMudmlzaXREcm9wQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIFJlbmFtZUNvbHVtbk5vZGU6IHRoaXMudmlzaXRSZW5hbWVDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQWx0ZXJDb2x1bW5Ob2RlOiB0aGlzLnZpc2l0QWx0ZXJDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgTW9kaWZ5Q29sdW1uTm9kZTogdGhpcy52aXNpdE1vZGlmeUNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdEFkZENvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcENvbnN0cmFpbnROb2RlOiB0aGlzLnZpc2l0RHJvcENvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgUmVuYW1lQ29uc3RyYWludE5vZGU6IHRoaXMudmlzaXRSZW5hbWVDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdEZvcmVpZ25LZXlDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVZpZXdOb2RlOiB0aGlzLnZpc2l0Q3JlYXRlVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGU6IHRoaXMudmlzaXRSZWZyZXNoTWF0ZXJpYWxpemVkVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVmlld05vZGU6IHRoaXMudmlzaXREcm9wVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBHZW5lcmF0ZWROb2RlOiB0aGlzLnZpc2l0R2VuZXJhdGVkLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRWYWx1ZU5vZGU6IHRoaXMudmlzaXREZWZhdWx0VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgT25Ob2RlOiB0aGlzLnZpc2l0T24uYmluZCh0aGlzKSxcbiAgICAgICAgVmFsdWVzTm9kZTogdGhpcy52aXNpdFZhbHVlcy5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3RNb2RpZmllck5vZGU6IHRoaXMudmlzaXRTZWxlY3RNb2RpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVUeXBlTm9kZTogdGhpcy52aXNpdENyZWF0ZVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcFR5cGVOb2RlOiB0aGlzLnZpc2l0RHJvcFR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgRXhwbGFpbk5vZGU6IHRoaXMudmlzaXRFeHBsYWluLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRJbnNlcnRWYWx1ZU5vZGU6IHRoaXMudmlzaXREZWZhdWx0SW5zZXJ0VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgQWdncmVnYXRlRnVuY3Rpb25Ob2RlOiB0aGlzLnZpc2l0QWdncmVnYXRlRnVuY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgT3Zlck5vZGU6IHRoaXMudmlzaXRPdmVyLmJpbmQodGhpcyksXG4gICAgICAgIFBhcnRpdGlvbkJ5Tm9kZTogdGhpcy52aXNpdFBhcnRpdGlvbkJ5LmJpbmQodGhpcyksXG4gICAgICAgIFBhcnRpdGlvbkJ5SXRlbU5vZGU6IHRoaXMudmlzaXRQYXJ0aXRpb25CeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgU2V0T3BlcmF0aW9uTm9kZTogdGhpcy52aXNpdFNldE9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBCaW5hcnlPcGVyYXRpb25Ob2RlOiB0aGlzLnZpc2l0QmluYXJ5T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFVuYXJ5T3BlcmF0aW9uTm9kZTogdGhpcy52aXNpdFVuYXJ5T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFVzaW5nTm9kZTogdGhpcy52aXNpdFVzaW5nLmJpbmQodGhpcyksXG4gICAgICAgIEZ1bmN0aW9uTm9kZTogdGhpcy52aXNpdEZ1bmN0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIENhc2VOb2RlOiB0aGlzLnZpc2l0Q2FzZS5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVuTm9kZTogdGhpcy52aXNpdFdoZW4uYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTlJlZmVyZW5jZU5vZGU6IHRoaXMudmlzaXRKU09OUmVmZXJlbmNlLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05QYXRoTm9kZTogdGhpcy52aXNpdEpTT05QYXRoLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05QYXRoTGVnTm9kZTogdGhpcy52aXNpdEpTT05QYXRoTGVnLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05PcGVyYXRvckNoYWluTm9kZTogdGhpcy52aXNpdEpTT05PcGVyYXRvckNoYWluLmJpbmQodGhpcyksXG4gICAgICAgIFR1cGxlTm9kZTogdGhpcy52aXNpdFR1cGxlLmJpbmQodGhpcyksXG4gICAgICAgIE1lcmdlUXVlcnlOb2RlOiB0aGlzLnZpc2l0TWVyZ2VRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBNYXRjaGVkTm9kZTogdGhpcy52aXNpdE1hdGNoZWQuYmluZCh0aGlzKSxcbiAgICAgICAgQWRkSW5kZXhOb2RlOiB0aGlzLnZpc2l0QWRkSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgQ2FzdE5vZGU6IHRoaXMudmlzaXRDYXN0LmJpbmQodGhpcyksXG4gICAgICAgIEZldGNoTm9kZTogdGhpcy52aXNpdEZldGNoLmJpbmQodGhpcyksXG4gICAgICAgIFRvcE5vZGU6IHRoaXMudmlzaXRUb3AuYmluZCh0aGlzKSxcbiAgICAgICAgT3V0cHV0Tm9kZTogdGhpcy52aXNpdE91dHB1dC5iaW5kKHRoaXMpLFxuICAgICAgICBPckFjdGlvbk5vZGU6IHRoaXMudmlzaXRPckFjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb2xsYXRlTm9kZTogdGhpcy52aXNpdENvbGxhdGUuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICB2aXNpdE5vZGUgPSAobm9kZSkgPT4ge1xuICAgICAgICB0aGlzLm5vZGVTdGFjay5wdXNoKG5vZGUpO1xuICAgICAgICB0aGlzLiN2aXNpdG9yc1tub2RlLmtpbmRdKG5vZGUpO1xuICAgICAgICB0aGlzLm5vZGVTdGFjay5wb3AoKTtcbiAgICB9O1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LXF1ZXJ5LWNvbXBpbGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ3JlYXRlVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uTm9kZVZpc2l0b3IgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS12aXNpdG9yLmpzJztcbmltcG9ydCB7IE9wZXJhdG9yTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgUGFyZW5zTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIGlzU3RyaW5nLCBpc051bWJlciwgaXNCb29sZWFuLCBpc051bGwsIGlzRGF0ZSwgaXNCaWdJbnQsIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdmlldy1ub2RlLmpzJztcbmltcG9ydCB7IFNldE9wZXJhdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZXQtb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS93aGVuLW5vZGUuanMnO1xuaW1wb3J0IHsgbG9nT25jZSB9IGZyb20gJy4uL3V0aWwvbG9nLW9uY2UuanMnO1xuY29uc3QgTElUX1dSQVBfUkVHRVggPSAvJy9nO1xuZXhwb3J0IGNsYXNzIERlZmF1bHRRdWVyeUNvbXBpbGVyIGV4dGVuZHMgT3BlcmF0aW9uTm9kZVZpc2l0b3Ige1xuICAgICNzcWwgPSAnJztcbiAgICAjcGFyYW1ldGVycyA9IFtdO1xuICAgIGdldCBudW1QYXJhbWV0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGFyYW1ldGVycy5sZW5ndGg7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHRoaXMuI3NxbCA9ICcnO1xuICAgICAgICB0aGlzLiNwYXJhbWV0ZXJzID0gW107XG4gICAgICAgIHRoaXMubm9kZVN0YWNrLnNwbGljZSgwLCB0aGlzLm5vZGVTdGFjay5sZW5ndGgpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlKTtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBxdWVyeTogbm9kZSxcbiAgICAgICAgICAgIHF1ZXJ5SWQsXG4gICAgICAgICAgICBzcWw6IHRoaXMuZ2V0U3FsKCksXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbLi4udGhpcy4jcGFyYW1ldGVyc10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRTcWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzcWw7XG4gICAgfVxuICAgIHZpc2l0U2VsZWN0UXVlcnkobm9kZSkge1xuICAgICAgICBjb25zdCB3cmFwSW5QYXJlbnMgPSB0aGlzLnBhcmVudE5vZGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIVBhcmVuc05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIUluc2VydFF1ZXJ5Tm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhQ3JlYXRlVGFibGVOb2RlLmlzKHRoaXMucGFyZW50Tm9kZSkgJiZcbiAgICAgICAgICAgICFDcmVhdGVWaWV3Tm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhU2V0T3BlcmF0aW9uTm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlID09PSB1bmRlZmluZWQgJiYgbm9kZS5leHBsYWluKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cGxhaW4pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JhcEluUGFyZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndpdGgpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2l0aCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdzZWxlY3QnKTtcbiAgICAgICAgaWYgKG5vZGUuZGlzdGluY3RPbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZURpc3RpbmN0T24obm9kZS5kaXN0aW5jdE9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mcm9udE1vZGlmaWVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmZyb250TW9kaWZpZXJzLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnRvcCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZWxlY3Rpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnNlbGVjdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmZyb20pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmpvaW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmpvaW5zLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aGVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZ3JvdXBCeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZ3JvdXBCeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuaGF2aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5oYXZpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnNldE9wZXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuc2V0T3BlcmF0aW9ucywgJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vcmRlckJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vcmRlckJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5saW1pdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGltaXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9mZnNldCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mZXRjaCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZmV0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVuZE1vZGlmaWVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdCh0aGlzLnNvcnRTZWxlY3RNb2RpZmllcnMoWy4uLm5vZGUuZW5kTW9kaWZpZXJzXSksICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEZyb20obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZnJvbSAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmZyb21zKTtcbiAgICB9XG4gICAgdmlzaXRTZWxlY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNlbGVjdGlvbik7XG4gICAgfVxuICAgIHZpc2l0Q29sdW1uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICBjb21waWxlRGlzdGluY3RPbihleHByZXNzaW9ucykge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZGlzdGluY3Qgb24gKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KGV4cHJlc3Npb25zKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgY29tcGlsZUxpc3Qobm9kZXMsIHNlcGFyYXRvciA9ICcsICcpIHtcbiAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gbm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGFzdEluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGVzW2ldKTtcbiAgICAgICAgICAgIGlmIChpIDwgbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFdoZXJlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3doZXJlICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndoZXJlKTtcbiAgICB9XG4gICAgdmlzaXRIYXZpbmcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnaGF2aW5nICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmhhdmluZyk7XG4gICAgfVxuICAgIHZpc2l0SW5zZXJ0UXVlcnkobm9kZSkge1xuICAgICAgICBjb25zdCB3cmFwSW5QYXJlbnMgPSB0aGlzLnBhcmVudE5vZGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIVBhcmVuc05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIVJhd05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIVdoZW5Ob2RlLmlzKHRoaXMucGFyZW50Tm9kZSk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUgPT09IHVuZGVmaW5lZCAmJiBub2RlLmV4cGxhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwbGFpbik7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwSW5QYXJlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5yZXBsYWNlID8gJ3JlcGxhY2UnIDogJ2luc2VydCcpO1xuICAgICAgICAvLyBUT0RPOiByZW1vdmUgaW4gMC4yOS5cbiAgICAgICAgaWYgKG5vZGUuaWdub3JlKSB7XG4gICAgICAgICAgICBsb2dPbmNlKCdgSW5zZXJ0UXVlcnlOb2RlLmlnbm9yZWAgaXMgZGVwcmVjYXRlZC4gVXNlIGBJbnNlcnRRdWVyeU5vZGUub3JBY3Rpb25gIGluc3RlYWQuJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGlnbm9yZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vckFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudG9wKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50b3ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmludG8pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgaW50byAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaW50byk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm91dHB1dCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS52YWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZGVmYXVsdFZhbHVlcykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkZWZhdWx0IHZhbHVlcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9uQ29uZmxpY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9uQ29uZmxpY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9uRHVwbGljYXRlS2V5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vbkR1cGxpY2F0ZUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmV0dXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXR1cm5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwSW5QYXJlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZW5kTW9kaWZpZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCAnICcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0VmFsdWVzKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3ZhbHVlcyAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnZhbHVlcyk7XG4gICAgfVxuICAgIHZpc2l0RGVsZXRlUXVlcnkobm9kZSkge1xuICAgICAgICBjb25zdCB3cmFwSW5QYXJlbnMgPSB0aGlzLnBhcmVudE5vZGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIVBhcmVuc05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIVJhd05vZGUuaXModGhpcy5wYXJlbnROb2RlKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSA9PT0gdW5kZWZpbmVkICYmIG5vZGUuZXhwbGFpbikge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHBsYWluKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aXRoKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndpdGgpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnZGVsZXRlICcpO1xuICAgICAgICBpZiAobm9kZS50b3ApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5mcm9tKTtcbiAgICAgICAgaWYgKG5vZGUub3V0cHV0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuam9pbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuam9pbnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlcmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndoZXJlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vcmRlckJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vcmRlckJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5saW1pdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGltaXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnJldHVybmluZykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmV0dXJuaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JhcEluUGFyZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVuZE1vZGlmaWVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJldHVybmluZyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdyZXR1cm5pbmcgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5zZWxlY3Rpb25zKTtcbiAgICB9XG4gICAgdmlzaXRBbGlhcyhub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubm9kZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgYXMgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuYWxpYXMpO1xuICAgIH1cbiAgICB2aXNpdFJlZmVyZW5jZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdFNlbGVjdEFsbChfKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcqJyk7XG4gICAgfVxuICAgIHZpc2l0SWRlbnRpZmllcihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0TGVmdElkZW50aWZpZXJXcmFwcGVyKCkpO1xuICAgICAgICB0aGlzLmNvbXBpbGVVbndyYXBwZWRJZGVudGlmaWVyKG5vZGUpO1xuICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldFJpZ2h0SWRlbnRpZmllcldyYXBwZXIoKSk7XG4gICAgfVxuICAgIGNvbXBpbGVVbndyYXBwZWRJZGVudGlmaWVyKG5vZGUpIHtcbiAgICAgICAgaWYgKCFpc1N0cmluZyhub2RlLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Egbm9uLXN0cmluZyBpZGVudGlmaWVyIHdhcyBwYXNzZWQgdG8gY29tcGlsZVVud3JhcHBlZElkZW50aWZpZXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQodGhpcy5zYW5pdGl6ZUlkZW50aWZpZXIobm9kZS5uYW1lKSk7XG4gICAgfVxuICAgIHZpc2l0QW5kKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5sZWZ0KTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBhbmQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmlnaHQpO1xuICAgIH1cbiAgICB2aXNpdE9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5sZWZ0KTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBvciAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yaWdodCk7XG4gICAgfVxuICAgIHZpc2l0VmFsdWUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5pbW1lZGlhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kSW1tZWRpYXRlVmFsdWUobm9kZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZFZhbHVlKG5vZGUudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0VmFsdWVMaXN0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnZhbHVlcyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0VHVwbGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUudmFsdWVzKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRQcmltaXRpdmVWYWx1ZUxpc3Qobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICBjb25zdCB7IHZhbHVlcyB9ID0gbm9kZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kVmFsdWUodmFsdWVzW2ldKTtcbiAgICAgICAgICAgIGlmIChpICE9PSB2YWx1ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0UGFyZW5zKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5ub2RlKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRKb2luKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoSk9JTl9UWVBFX1NRTFtub2RlLmpvaW5UeXBlXSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICBpZiAobm9kZS5vbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0T24obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb24gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub24pO1xuICAgIH1cbiAgICB2aXNpdFJhdyhub2RlKSB7XG4gICAgICAgIGNvbnN0IHsgc3FsRnJhZ21lbnRzLCBwYXJhbWV0ZXJzOiBwYXJhbXMgfSA9IG5vZGU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3FsRnJhZ21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChzcWxGcmFnbWVudHNbaV0pO1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiBpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUocGFyYW1zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdE9wZXJhdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vcGVyYXRvcik7XG4gICAgfVxuICAgIHZpc2l0VGFibGUobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICB9XG4gICAgdmlzaXRTY2hlbWFibGVJZGVudGlmaWVyKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNjaGVtYSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaWRlbnRpZmllcik7XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlVGFibGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY3JlYXRlICcpO1xuICAgICAgICBpZiAobm9kZS5mcm9udE1vZGlmaWVycyAmJiBub2RlLmZyb250TW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5mcm9udE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudGVtcG9yYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgndGVtcG9yYXJ5ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd0YWJsZSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZOb3RFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBub3QgZXhpc3RzICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICBpZiAobm9kZS5zZWxlY3RRdWVyeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuc2VsZWN0UXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KFsuLi5ub2RlLmNvbHVtbnMsIC4uLihub2RlLmNvbnN0cmFpbnRzID8/IFtdKV0pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgICAgIGlmIChub2RlLm9uQ29tbWl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiBjb21taXQgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vbkNvbW1pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnMgJiYgbm9kZS5lbmRNb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENvbHVtbkRlZmluaXRpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5pZk5vdEV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIG5vdCBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmRhdGFUeXBlKTtcbiAgICAgICAgaWYgKG5vZGUudW5zaWduZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgdW5zaWduZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mcm9udE1vZGlmaWVycyAmJiBub2RlLmZyb250TW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5nZW5lcmF0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlkZW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGlkZW50aXR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZGVmYXVsdFRvKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kZWZhdWx0VG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm5vdE51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbm90IG51bGwnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS51bmlxdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgdW5pcXVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubnVsbHNOb3REaXN0aW5jdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBudWxscyBub3QgZGlzdGluY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5wcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHByaW1hcnkga2V5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuYXV0b0luY3JlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0QXV0b0luY3JlbWVudCgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5yZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZWZlcmVuY2VzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGVjaykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVuZE1vZGlmaWVycyAmJiBub2RlLmVuZE1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBdXRvSW5jcmVtZW50KCkge1xuICAgICAgICByZXR1cm4gJ2F1dG9faW5jcmVtZW50JztcbiAgICB9XG4gICAgdmlzaXRSZWZlcmVuY2VzKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3JlZmVyZW5jZXMgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICBpZiAobm9kZS5vbkRlbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiBkZWxldGUgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChub2RlLm9uRGVsZXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vblVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiB1cGRhdGUgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChub2RlLm9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BUYWJsZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIHRhYmxlICcpO1xuICAgICAgICBpZiAobm9kZS5pZkV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgaWYgKG5vZGUuY2FzY2FkZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBjYXNjYWRlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREYXRhVHlwZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5vZGUuZGF0YVR5cGUpO1xuICAgIH1cbiAgICB2aXNpdE9yZGVyQnkobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb3JkZXIgYnkgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5pdGVtcyk7XG4gICAgfVxuICAgIHZpc2l0T3JkZXJCeUl0ZW0obm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICBpZiAobm9kZS5jb2xsYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbGxhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kaXJlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm51bGxzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG51bGxzICcpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5udWxscyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRHcm91cEJ5KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2dyb3VwIGJ5ICcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuaXRlbXMpO1xuICAgIH1cbiAgICB2aXNpdEdyb3VwQnlJdGVtKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5ncm91cEJ5KTtcbiAgICB9XG4gICAgdmlzaXRVcGRhdGVRdWVyeShub2RlKSB7XG4gICAgICAgIGNvbnN0IHdyYXBJblBhcmVucyA9IHRoaXMucGFyZW50Tm9kZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhUGFyZW5zTm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhUmF3Tm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhV2hlbk5vZGUuaXModGhpcy5wYXJlbnROb2RlKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSA9PT0gdW5kZWZpbmVkICYmIG5vZGUuZXhwbGFpbikge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHBsYWluKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aXRoKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndpdGgpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgndXBkYXRlICcpO1xuICAgICAgICBpZiAobm9kZS50b3ApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnc2V0ICcpO1xuICAgICAgICBpZiAobm9kZS51cGRhdGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUudXBkYXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3V0cHV0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmZyb20pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmpvaW5zKSB7XG4gICAgICAgICAgICBpZiAoIW5vZGUuZnJvbSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkpvaW5zIGluIGFuIHVwZGF0ZSBxdWVyeSBhcmUgb25seSBzdXBwb3J0ZWQgYXMgYSBwYXJ0IG9mIGEgUG9zdGdyZVNRTCAndXBkYXRlIHNldCBmcm9tIGpvaW4nIHF1ZXJ5LiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBNeVNRTCAndXBkYXRlIGpvaW4gc2V0JyBxdWVyeSwgc2VlIGh0dHBzOi8va3lzZWx5LmRldi9kb2NzL2V4YW1wbGVzL3VwZGF0ZS9teS1zcWwtam9pbnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmpvaW5zLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aGVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3JkZXJCeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3JkZXJCeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5yZXR1cm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJldHVybmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRDb2x1bW5VcGRhdGUobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbHVtbik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgPSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS52YWx1ZSk7XG4gICAgfVxuICAgIHZpc2l0TGltaXQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnbGltaXQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGltaXQpO1xuICAgIH1cbiAgICB2aXNpdE9mZnNldChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdvZmZzZXQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub2Zmc2V0KTtcbiAgICB9XG4gICAgdmlzaXRPbkNvbmZsaWN0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ29uIGNvbmZsaWN0Jyk7XG4gICAgICAgIGlmIChub2RlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgKCcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb24gY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29uc3RyYWludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5pbmRleEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgKCcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5pbmRleEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5pbmRleFdoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5pbmRleFdoZXJlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5kb05vdGhpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgZG8gbm90aGluZycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUudXBkYXRlcykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBkbyB1cGRhdGUgc2V0ICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnVwZGF0ZXMpO1xuICAgICAgICAgICAgaWYgKG5vZGUudXBkYXRlV2hlcmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudXBkYXRlV2hlcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0T25EdXBsaWNhdGVLZXkobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb24gZHVwbGljYXRlIGtleSB1cGRhdGUgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS51cGRhdGVzKTtcbiAgICB9XG4gICAgdmlzaXRDcmVhdGVJbmRleChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjcmVhdGUgJyk7XG4gICAgICAgIGlmIChub2RlLnVuaXF1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ3VuaXF1ZSAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnaW5kZXggJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHVzaW5nICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm51bGxzTm90RGlzdGluY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbnVsbHMgbm90IGRpc3RpbmN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlcmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndoZXJlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BJbmRleChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGluZGV4ICcpO1xuICAgICAgICBpZiAobm9kZS5pZkV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNhc2NhZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgY2FzY2FkZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlU2NoZW1hKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2NyZWF0ZSBzY2hlbWEgJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNjaGVtYSk7XG4gICAgfVxuICAgIHZpc2l0RHJvcFNjaGVtYShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIHNjaGVtYSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5zY2hlbWEpO1xuICAgICAgICBpZiAobm9kZS5jYXNjYWRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGNhc2NhZGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFByaW1hcnlLZXlDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2NvbnN0cmFpbnQgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgncHJpbWFyeSBrZXkgKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIHRoaXMuYnVpbGREZWZlcnJhYmxlKG5vZGUpO1xuICAgIH1cbiAgICBidWlsZERlZmVycmFibGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5kZWZlcnJhYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmRlZmVycmFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGRlZmVycmFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbm90IGRlZmVycmFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5pbml0aWFsbHlEZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pbml0aWFsbHlEZWZlcnJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgaW5pdGlhbGx5IGRlZmVycmVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGluaXRpYWxseSBpbW1lZGlhdGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFVuaXF1ZUNvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd1bmlxdWUnKTtcbiAgICAgICAgaWYgKG5vZGUubnVsbHNOb3REaXN0aW5jdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBudWxscyBub3QgZGlzdGluY3QnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB0aGlzLmJ1aWxkRGVmZXJyYWJsZShub2RlKTtcbiAgICB9XG4gICAgdmlzaXRDaGVja0NvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjaGVjayAoJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0Rm9yZWlnbktleUNvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdmb3JlaWduIGtleSAoJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJykgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmVmZXJlbmNlcyk7XG4gICAgICAgIGlmIChub2RlLm9uRGVsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG9uIGRlbGV0ZSAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUub25EZWxldGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9uVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG9uIHVwZGF0ZSAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUub25VcGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVpbGREZWZlcnJhYmxlKG5vZGUpO1xuICAgIH1cbiAgICB2aXNpdExpc3Qobm9kZSkge1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuaXRlbXMpO1xuICAgIH1cbiAgICB2aXNpdFdpdGgobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnd2l0aCAnKTtcbiAgICAgICAgaWYgKG5vZGUucmVjdXJzaXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgncmVjdXJzaXZlICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5leHByZXNzaW9ucyk7XG4gICAgfVxuICAgIHZpc2l0Q29tbW9uVGFibGVFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyAnKTtcbiAgICAgICAgaWYgKGlzQm9vbGVhbihub2RlLm1hdGVyaWFsaXplZCkpIHtcbiAgICAgICAgICAgIGlmICghbm9kZS5tYXRlcmlhbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnbm90ICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ21hdGVyaWFsaXplZCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICB2aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRBbHRlclRhYmxlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2FsdGVyIHRhYmxlICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgaWYgKG5vZGUucmVuYW1lVG8pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdyZW5hbWUgdG8gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJlbmFtZVRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZXRTY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdzZXQgc2NoZW1hICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5zZXRTY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFkZENvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuYWRkQ29uc3RyYWludCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcENvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZHJvcENvbnN0cmFpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnJlbmFtZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmVuYW1lQ29uc3RyYWludCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1uQWx0ZXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUNvbHVtbkFsdGVyYXRpb25zKG5vZGUuY29sdW1uQWx0ZXJhdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFkZEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmFkZEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5kcm9wSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZHJvcEluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEFkZENvbHVtbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdhZGQgY29sdW1uICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbHVtbik7XG4gICAgfVxuICAgIHZpc2l0UmVuYW1lQ29sdW1uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3JlbmFtZSBjb2x1bW4gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sdW1uKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyB0byAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZW5hbWVUbyk7XG4gICAgfVxuICAgIHZpc2l0RHJvcENvbHVtbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdEFsdGVyQ29sdW1uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2FsdGVyIGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICBpZiAobm9kZS5kYXRhVHlwZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5ub3VuY2VzTmV3Q29sdW1uRGF0YVR5cGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd0eXBlICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZSk7XG4gICAgICAgICAgICBpZiAobm9kZS5kYXRhVHlwZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgndXNpbmcgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZUV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnNldERlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdzZXQgZGVmYXVsdCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuc2V0RGVmYXVsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcERlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGRlZmF1bHQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZXROb3ROdWxsKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnc2V0IG5vdCBudWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcE5vdE51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIG5vdCBudWxsJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRNb2RpZnlDb2x1bW4obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnbW9kaWZ5IGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdEFkZENvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnYWRkICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICB2aXNpdERyb3BDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Ryb3AgY29uc3RyYWludCAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb25zdHJhaW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlLm1vZGlmaWVyID09PSAnY2FzY2FkZScpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgY2FzY2FkZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubW9kaWZpZXIgPT09ICdyZXN0cmljdCcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgcmVzdHJpY3QnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJlbmFtZUNvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgncmVuYW1lIGNvbnN0cmFpbnQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub2xkTmFtZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgdG8gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmV3TmFtZSk7XG4gICAgfVxuICAgIHZpc2l0U2V0T3BlcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vcGVyYXRvcik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIGlmIChub2RlLmFsbCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2FsbCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICB2aXNpdENyZWF0ZVZpZXcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY3JlYXRlICcpO1xuICAgICAgICBpZiAobm9kZS5vclJlcGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdvciByZXBsYWNlICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm1hdGVyaWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ21hdGVyaWFsaXplZCAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS50ZW1wb3JhcnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd0ZW1wb3JhcnkgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ3ZpZXcgJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICBpZiAobm9kZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJykgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuYXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdhcyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuYXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0UmVmcmVzaE1hdGVyaWFsaXplZFZpZXcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgncmVmcmVzaCBtYXRlcmlhbGl6ZWQgdmlldyAnKTtcbiAgICAgICAgaWYgKG5vZGUuY29uY3VycmVudGx5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uY3VycmVudGx5ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgIGlmIChub2RlLndpdGhOb0RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgd2l0aCBubyBkYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHdpdGggZGF0YScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0RHJvcFZpZXcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZHJvcCAnKTtcbiAgICAgICAgaWYgKG5vZGUubWF0ZXJpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnbWF0ZXJpYWxpemVkICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd2aWV3ICcpO1xuICAgICAgICBpZiAobm9kZS5pZkV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS5jYXNjYWRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGNhc2NhZGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEdlbmVyYXRlZChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdnZW5lcmF0ZWQgJyk7XG4gICAgICAgIGlmIChub2RlLmFsd2F5cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2Fsd2F5cyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5ieURlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdieSBkZWZhdWx0ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdhcyAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWRlbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZGVudGl0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zdG9yZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgc3RvcmVkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREZWZhdWx0VmFsdWUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZGVmYXVsdCAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgICB2aXNpdFNlbGVjdE1vZGlmaWVyKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUucmF3TW9kaWZpZXIpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmF3TW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoU0VMRUNUX01PRElGSUVSX1NRTFtub2RlLm1vZGlmaWVyXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub2YpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb2YgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUub2YsICcsICcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlVHlwZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjcmVhdGUgdHlwZSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKG5vZGUuZW51bSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyBlbnVtICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5lbnVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BUeXBlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Ryb3AgdHlwZSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICB9XG4gICAgdmlzaXRFeHBsYWluKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2V4cGxhaW4nKTtcbiAgICAgICAgaWYgKG5vZGUub3B0aW9ucyB8fCBub2RlLmZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0TGVmdEV4cGxhaW5PcHRpb25zV3JhcHBlcigpKTtcbiAgICAgICAgICAgIGlmIChub2RlLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEV4cGxhaW5PcHRpb25zRGVsaW1pdGVyKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLmZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdmb3JtYXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEV4cGxhaW5PcHRpb25Bc3NpZ25tZW50KCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUuZm9ybWF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0UmlnaHRFeHBsYWluT3B0aW9uc1dyYXBwZXIoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREZWZhdWx0SW5zZXJ0VmFsdWUoXykge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZGVmYXVsdCcpO1xuICAgIH1cbiAgICB2aXNpdEFnZ3JlZ2F0ZUZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5mdW5jKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgaWYgKG5vZGUuZGlzdGluY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkaXN0aW5jdCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuYWdncmVnYXRlZCk7XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIGlmIChub2RlLndpdGhpbkdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHdpdGhpbiBncm91cCAoJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndpdGhpbkdyb3VwKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGZpbHRlcignKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZmlsdGVyKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3Zlcikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3Zlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRPdmVyKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ292ZXIoJyk7XG4gICAgICAgIGlmIChub2RlLnBhcnRpdGlvbkJ5KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnBhcnRpdGlvbkJ5KTtcbiAgICAgICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3JkZXJCeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRQYXJ0aXRpb25CeShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdwYXJ0aXRpb24gYnkgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5pdGVtcyk7XG4gICAgfVxuICAgIHZpc2l0UGFydGl0aW9uQnlJdGVtKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5wYXJ0aXRpb25CeSk7XG4gICAgfVxuICAgIHZpc2l0QmluYXJ5T3BlcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5sZWZ0T3BlcmFuZCk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3BlcmF0b3IpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJpZ2h0T3BlcmFuZCk7XG4gICAgfVxuICAgIHZpc2l0VW5hcnlPcGVyYXRpb24obm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wZXJhdG9yKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzTWludXNPcGVyYXRvcihub2RlLm9wZXJhdG9yKSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wZXJhbmQpO1xuICAgIH1cbiAgICBpc01pbnVzT3BlcmF0b3Iobm9kZSkge1xuICAgICAgICByZXR1cm4gT3BlcmF0b3JOb2RlLmlzKG5vZGUpICYmIG5vZGUub3BlcmF0b3IgPT09ICctJztcbiAgICB9XG4gICAgdmlzaXRVc2luZyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCd1c2luZyAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnRhYmxlcyk7XG4gICAgfVxuICAgIHZpc2l0RnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChub2RlLmZ1bmMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRDYXNlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Nhc2UnKTtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aGVuKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLndoZW4sICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZWxzZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBlbHNlICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5lbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnIGVuZCcpO1xuICAgICAgICBpZiAobm9kZS5pc1N0YXRlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBjYXNlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRXaGVuKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3doZW4gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTtcbiAgICAgICAgaWYgKG5vZGUucmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHRoZW4gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRKU09OUmVmZXJlbmNlKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZWZlcmVuY2UpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRyYXZlcnNhbCk7XG4gICAgfVxuICAgIHZpc2l0SlNPTlBhdGgobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5pbk9wZXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmluT3BlcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKFwiJyRcIik7XG4gICAgICAgIGZvciAoY29uc3QgcGF0aExlZyBvZiBub2RlLnBhdGhMZWdzKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShwYXRoTGVnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZChcIidcIik7XG4gICAgfVxuICAgIHZpc2l0SlNPTlBhdGhMZWcobm9kZSkge1xuICAgICAgICBjb25zdCBpc0FycmF5TG9jYXRpb24gPSBub2RlLnR5cGUgPT09ICdBcnJheUxvY2F0aW9uJztcbiAgICAgICAgdGhpcy5hcHBlbmQoaXNBcnJheUxvY2F0aW9uID8gJ1snIDogJy4nKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoU3RyaW5nKG5vZGUudmFsdWUpKTtcbiAgICAgICAgaWYgKGlzQXJyYXlMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ10nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEpTT05PcGVyYXRvckNoYWluKG5vZGUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG5vZGUudmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3BlcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJy0+Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRNZXJnZVF1ZXJ5KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ21lcmdlICcpO1xuICAgICAgICBpZiAobm9kZS50b3ApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ2ludG8gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaW50byk7XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUud2hlbnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmV0dXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXR1cm5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm91dHB1dCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRNYXRjaGVkKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm90KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnbm90ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdtYXRjaGVkJyk7XG4gICAgICAgIGlmIChub2RlLmJ5U291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGJ5IHNvdXJjZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0QWRkSW5kZXgobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnYWRkICcpO1xuICAgICAgICBpZiAobm9kZS51bmlxdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd1bmlxdWUgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ2luZGV4ICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudXNpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgdXNpbmcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnVzaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENhc3Qobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY2FzdCgnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0RmV0Y2gobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZmV0Y2ggbmV4dCAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yb3dDb3VudCk7XG4gICAgICAgIHRoaXMuYXBwZW5kKGAgcm93cyAke25vZGUubW9kaWZpZXJ9YCk7XG4gICAgfVxuICAgIHZpc2l0T3V0cHV0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ291dHB1dCAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnNlbGVjdGlvbnMpO1xuICAgIH1cbiAgICB2aXNpdFRvcChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGB0b3AoJHtub2RlLmV4cHJlc3Npb259KWApO1xuICAgICAgICBpZiAobm9kZS5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKGAgJHtub2RlLm1vZGlmaWVyc31gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdE9yQWN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5hY3Rpb24pO1xuICAgIH1cbiAgICB2aXNpdENvbGxhdGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY29sbGF0ZSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2xsYXRpb24pO1xuICAgIH1cbiAgICBhcHBlbmQoc3RyKSB7XG4gICAgICAgIHRoaXMuI3NxbCArPSBzdHI7XG4gICAgfVxuICAgIGFwcGVuZFZhbHVlKHBhcmFtZXRlcikge1xuICAgICAgICB0aGlzLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpO1xuICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEN1cnJlbnRQYXJhbWV0ZXJQbGFjZWhvbGRlcigpKTtcbiAgICB9XG4gICAgZ2V0TGVmdElkZW50aWZpZXJXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJ1wiJztcbiAgICB9XG4gICAgZ2V0UmlnaHRJZGVudGlmaWVyV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICdcIic7XG4gICAgfVxuICAgIGdldEN1cnJlbnRQYXJhbWV0ZXJQbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuICckJyArIHRoaXMubnVtUGFyYW1ldGVycztcbiAgICB9XG4gICAgZ2V0TGVmdEV4cGxhaW5PcHRpb25zV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICcoJztcbiAgICB9XG4gICAgZ2V0RXhwbGFpbk9wdGlvbkFzc2lnbm1lbnQoKSB7XG4gICAgICAgIHJldHVybiAnICc7XG4gICAgfVxuICAgIGdldEV4cGxhaW5PcHRpb25zRGVsaW1pdGVyKCkge1xuICAgICAgICByZXR1cm4gJywgJztcbiAgICB9XG4gICAgZ2V0UmlnaHRFeHBsYWluT3B0aW9uc1dyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiAnKSc7XG4gICAgfVxuICAgIHNhbml0aXplSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gICAgICAgIGNvbnN0IGxlZnRXcmFwID0gdGhpcy5nZXRMZWZ0SWRlbnRpZmllcldyYXBwZXIoKTtcbiAgICAgICAgY29uc3QgcmlnaHRXcmFwID0gdGhpcy5nZXRSaWdodElkZW50aWZpZXJXcmFwcGVyKCk7XG4gICAgICAgIGxldCBzYW5pdGl6ZWQgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHNhbml0aXplZCArPSBjO1xuICAgICAgICAgICAgaWYgKGMgPT09IGxlZnRXcmFwKSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkICs9IGxlZnRXcmFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gcmlnaHRXcmFwKSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkICs9IHJpZ2h0V3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2FuaXRpemVkO1xuICAgIH1cbiAgICBzYW5pdGl6ZVN0cmluZ0xpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoTElUX1dSQVBfUkVHRVgsIFwiJydcIik7XG4gICAgfVxuICAgIGFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpIHtcbiAgICAgICAgdGhpcy4jcGFyYW1ldGVycy5wdXNoKHBhcmFtZXRlcik7XG4gICAgfVxuICAgIGFwcGVuZEltbWVkaWF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kU3RyaW5nTGl0ZXJhbCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNOdW1iZXIodmFsdWUpIHx8IGlzQm9vbGVhbih2YWx1ZSkgfHwgaXNCaWdJbnQodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc051bGwodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnbnVsbCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kSW1tZWRpYXRlVmFsdWUodmFsdWUudG9JU09TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW1tZWRpYXRlIHZhbHVlICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwZW5kU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChcIidcIik7XG4gICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuc2FuaXRpemVTdHJpbmdMaXRlcmFsKHZhbHVlKSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKFwiJ1wiKTtcbiAgICB9XG4gICAgc29ydFNlbGVjdE1vZGlmaWVycyhhcnIpIHtcbiAgICAgICAgYXJyLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm1vZGlmaWVyICYmIHJpZ2h0Lm1vZGlmaWVyXG4gICAgICAgICAgICA/IFNFTEVDVF9NT0RJRklFUl9QUklPUklUWVtsZWZ0Lm1vZGlmaWVyXSAtXG4gICAgICAgICAgICAgICAgU0VMRUNUX01PRElGSUVSX1BSSU9SSVRZW3JpZ2h0Lm1vZGlmaWVyXVxuICAgICAgICAgICAgOiAxKTtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZShhcnIpO1xuICAgIH1cbiAgICBjb21waWxlQ29sdW1uQWx0ZXJhdGlvbnMoY29sdW1uQWx0ZXJhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChjb2x1bW5BbHRlcmF0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRpYWxlY3QgYWRkcyBhIFwidHlwZVwiIGtleXdvcmQgYmVmb3JlIGEgY29sdW1uJ3MgbmV3IGRhdGFcbiAgICAgKiB0eXBlIGluIGFuIEFMVEVSIFRBQkxFIHN0YXRlbWVudC5cbiAgICAgKi9cbiAgICBhbm5vdW5jZXNOZXdDb2x1bW5EYXRhVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuY29uc3QgU0VMRUNUX01PRElGSUVSX1NRTCA9IGZyZWV6ZSh7XG4gICAgRm9yS2V5U2hhcmU6ICdmb3Iga2V5IHNoYXJlJyxcbiAgICBGb3JOb0tleVVwZGF0ZTogJ2ZvciBubyBrZXkgdXBkYXRlJyxcbiAgICBGb3JVcGRhdGU6ICdmb3IgdXBkYXRlJyxcbiAgICBGb3JTaGFyZTogJ2ZvciBzaGFyZScsXG4gICAgTm9XYWl0OiAnbm93YWl0JyxcbiAgICBTa2lwTG9ja2VkOiAnc2tpcCBsb2NrZWQnLFxuICAgIERpc3RpbmN0OiAnZGlzdGluY3QnLFxufSk7XG5jb25zdCBTRUxFQ1RfTU9ESUZJRVJfUFJJT1JJVFkgPSBmcmVlemUoe1xuICAgIEZvcktleVNoYXJlOiAxLFxuICAgIEZvck5vS2V5VXBkYXRlOiAxLFxuICAgIEZvclVwZGF0ZTogMSxcbiAgICBGb3JTaGFyZTogMSxcbiAgICBOb1dhaXQ6IDIsXG4gICAgU2tpcExvY2tlZDogMixcbiAgICBEaXN0aW5jdDogMCxcbn0pO1xuY29uc3QgSk9JTl9UWVBFX1NRTCA9IGZyZWV6ZSh7XG4gICAgSW5uZXJKb2luOiAnaW5uZXIgam9pbicsXG4gICAgTGVmdEpvaW46ICdsZWZ0IGpvaW4nLFxuICAgIFJpZ2h0Sm9pbjogJ3JpZ2h0IGpvaW4nLFxuICAgIEZ1bGxKb2luOiAnZnVsbCBqb2luJyxcbiAgICBDcm9zc0pvaW46ICdjcm9zcyBqb2luJyxcbiAgICBMYXRlcmFsSW5uZXJKb2luOiAnaW5uZXIgam9pbiBsYXRlcmFsJyxcbiAgICBMYXRlcmFsTGVmdEpvaW46ICdsZWZ0IGpvaW4gbGF0ZXJhbCcsXG4gICAgTGF0ZXJhbENyb3NzSm9pbjogJ2Nyb3NzIGpvaW4gbGF0ZXJhbCcsXG4gICAgT3V0ZXJBcHBseTogJ291dGVyIGFwcGx5JyxcbiAgICBDcm9zc0FwcGx5OiAnY3Jvc3MgYXBwbHknLFxuICAgIFVzaW5nOiAndXNpbmcnLFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2R1bW15LWRyaXZlci5kLnRzXCIgLz5cbi8qKlxuICogQSBkcml2ZXIgdGhhdCBkb2VzIGFic29sdXRlbHkgbm90aGluZy5cbiAqXG4gKiBZb3UgY2FuIHVzZSB0aGlzIHRvIGNyZWF0ZSBLeXNlbHkgaW5zdGFuY2VzIHNvbGVseSBmb3IgYnVpbGRpbmcgcXVlcmllc1xuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgS3lzZWx5IGluc3RhbmNlIGZvciBidWlsZGluZyBwb3N0Z3JlcyBxdWVyaWVzOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1xuICogICBEdW1teURyaXZlcixcbiAqICAgS3lzZWx5LFxuICogICBQb3N0Z3Jlc0FkYXB0ZXIsXG4gKiAgIFBvc3RncmVzSW50cm9zcGVjdG9yLFxuICogICBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXJcbiAqIH0gZnJvbSAna3lzZWx5J1xuICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gKlxuICogY29uc3QgZGIgPSBuZXcgS3lzZWx5PERhdGFiYXNlPih7XG4gKiAgIGRpYWxlY3Q6IHtcbiAqICAgICBjcmVhdGVBZGFwdGVyOiAoKSA9PiBuZXcgUG9zdGdyZXNBZGFwdGVyKCksXG4gKiAgICAgY3JlYXRlRHJpdmVyOiAoKSA9PiBuZXcgRHVtbXlEcml2ZXIoKSxcbiAqICAgICBjcmVhdGVJbnRyb3NwZWN0b3I6IChkYjogS3lzZWx5PGFueT4pID0+IG5ldyBQb3N0Z3Jlc0ludHJvc3BlY3RvcihkYiksXG4gKiAgICAgY3JlYXRlUXVlcnlDb21waWxlcjogKCkgPT4gbmV3IFBvc3RncmVzUXVlcnlDb21waWxlcigpLFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICpcbiAqIFlvdSBjYW4gdXNlIGl0IHRvIGJ1aWxkIGEgcXVlcnkgYW5kIGNvbXBpbGUgaXQgdG8gU1FMIGJ1dCB0cnlpbmcgdG9cbiAqIGV4ZWN1dGUgdGhlIHF1ZXJ5IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHsgc3FsIH0gPSBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3RBbGwoKS5jb21waWxlKClcbiAqIGNvbnNvbGUubG9nKHNxbCkgLy8gc2VsZWN0ICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIER1bW15RHJpdmVyIHtcbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIGFjcXVpcmVDb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IER1bW15Q29ubmVjdGlvbigpO1xuICAgIH1cbiAgICBhc3luYyBiZWdpblRyYW5zYWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIGNvbW1pdFRyYW5zYWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJvbGxiYWNrVHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgcmVsZWFzZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbiAgICBhc3luYyByZWxlYXNlU2F2ZXBvaW50KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJvbGxiYWNrVG9TYXZlcG9pbnQoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgc2F2ZXBvaW50KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxufVxuY2xhc3MgRHVtbXlDb25uZWN0aW9uIHtcbiAgICBhc3luYyBleGVjdXRlUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb3dzOiBbXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbVF1ZXJ5KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kaWFsZWN0LWFkYXB0ZXItYmFzZS5kLnRzXCIgLz5cbi8qKlxuICogQSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBgRGlhbGVjdEFkYXB0ZXJgIHdpdGggc2Vuc2libGUgZGVmYXVsdCB2YWx1ZXMuXG4gKiBUaGlyZC1wYXJ0eSBkaWFsZWN0cyBjYW4gZXh0ZW5kIHRoaXMgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgdGhlIGBEaWFsZWN0QWRhcHRlcmBcbiAqIGludGVyZmFjZSBmcm9tIHNjcmF0Y2guIFRoYXQgd2F5IGFsbCBuZXcgc2V0dGluZ3Mgd2lsbCBnZXQgZGVmYXVsdCB2YWx1ZXMgd2hlblxuICogdGhleSBhcmUgYWRkZWQgYW5kIHRoZXJlIHdpbGwgYmUgbGVzcyBicmVha2luZyBjaGFuZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgRGlhbGVjdEFkYXB0ZXJCYXNlIHtcbiAgICBnZXQgc3VwcG9ydHNDcmVhdGVJZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c1RyYW5zYWN0aW9uYWxEZGwoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IHN1cHBvcnRzUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c091dHB1dCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbXlzcWwtcXVlcnktY29tcGlsZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEZWZhdWx0UXVlcnlDb21waWxlciB9IGZyb20gJy4uLy4uL3F1ZXJ5LWNvbXBpbGVyL2RlZmF1bHQtcXVlcnktY29tcGlsZXIuanMnO1xuY29uc3QgSURfV1JBUF9SRUdFWCA9IC9gL2c7XG5leHBvcnQgY2xhc3MgTXlzcWxRdWVyeUNvbXBpbGVyIGV4dGVuZHMgRGVmYXVsdFF1ZXJ5Q29tcGlsZXIge1xuICAgIGdldEN1cnJlbnRQYXJhbWV0ZXJQbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuICc/JztcbiAgICB9XG4gICAgZ2V0TGVmdEV4cGxhaW5PcHRpb25zV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBnZXRFeHBsYWluT3B0aW9uQXNzaWdubWVudCgpIHtcbiAgICAgICAgcmV0dXJuICc9JztcbiAgICB9XG4gICAgZ2V0RXhwbGFpbk9wdGlvbnNEZWxpbWl0ZXIoKSB7XG4gICAgICAgIHJldHVybiAnICc7XG4gICAgfVxuICAgIGdldFJpZ2h0RXhwbGFpbk9wdGlvbnNXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGdldExlZnRJZGVudGlmaWVyV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICdgJztcbiAgICB9XG4gICAgZ2V0UmlnaHRJZGVudGlmaWVyV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICdgJztcbiAgICB9XG4gICAgc2FuaXRpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXIucmVwbGFjZShJRF9XUkFQX1JFR0VYLCAnYGAnKTtcbiAgICB9XG4gICAgdmlzaXRDcmVhdGVJbmRleChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjcmVhdGUgJyk7XG4gICAgICAgIGlmIChub2RlLnVuaXF1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ3VuaXF1ZSAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnaW5kZXggJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS51c2luZykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyB1c2luZyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudXNpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG9uICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aGVyZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL215c3FsLWFkYXB0ZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBzcWwgfSBmcm9tICcuLi8uLi9yYXctYnVpbGRlci9zcWwuanMnO1xuaW1wb3J0IHsgRGlhbGVjdEFkYXB0ZXJCYXNlIH0gZnJvbSAnLi4vZGlhbGVjdC1hZGFwdGVyLWJhc2UuanMnO1xuY29uc3QgTE9DS19JRCA9ICdlYTU4NjMzMC0yYzkzLTQ3YzgtOTA4ZC05ODFkOWQyNzBmOWQnO1xuY29uc3QgTE9DS19USU1FT1VUX1NFQ09ORFMgPSA2MCAqIDYwO1xuZXhwb3J0IGNsYXNzIE15c3FsQWRhcHRlciBleHRlbmRzIERpYWxlY3RBZGFwdGVyQmFzZSB7XG4gICAgZ2V0IHN1cHBvcnRzVHJhbnNhY3Rpb25hbERkbCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBnZXQgc3VwcG9ydHNSZXR1cm5pbmcoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXN5bmMgYWNxdWlyZU1pZ3JhdGlvbkxvY2soZGIsIF9vcHQpIHtcbiAgICAgICAgLy8gS3lzZWx5IHVzZXMgYSBzaW5nbGUgY29ubmVjdGlvbiB0byBydW4gdGhlIG1pZ3JhdGlvbnMuIEJlY2F1c2Ugb2YgdGhhdCwgd2VcbiAgICAgICAgLy8gY2FuIHRha2UgYSBsb2NrIHVzaW5nIGBnZXRfbG9ja2AuIExvY2tzIGFjcXVpcmVkIHVzaW5nIGBnZXRfbG9ja2AgZ2V0XG4gICAgICAgIC8vIHJlbGVhc2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkIChzZXNzaW9uIGVuZHMpIG9yIHdoZW4gdGhlIGxvY2tcbiAgICAgICAgLy8gaXMgcmVsZWFzZWQgdXNpbmcgYHJlbGVhc2VfbG9ja2AuIFRoaXMgd2F5IHdlIGtub3cgdGhhdCB0aGUgbG9jayBpcyBlaXRoZXJcbiAgICAgICAgLy8gcmVsZWFzZWQgYnkgdXMgYWZ0ZXIgc3VjY2Vzc2Z1bGwgb3IgZmFpbGVkIG1pZ3JhdGlvbnMgT1IgaXQncyByZWxlYXNlZCBieVxuICAgICAgICAvLyBNeVNRTCBpZiB0aGUgcHJvY2VzcyBnZXRzIGtpbGxlZCBmb3Igc29tZSByZWFzb24uXG4gICAgICAgIGF3YWl0IHNxbCBgc2VsZWN0IGdldF9sb2NrKCR7c3FsLmxpdChMT0NLX0lEKX0sICR7c3FsLmxpdChMT0NLX1RJTUVPVVRfU0VDT05EUyl9KWAuZXhlY3V0ZShkYik7XG4gICAgfVxuICAgIGFzeW5jIHJlbGVhc2VNaWdyYXRpb25Mb2NrKGRiLCBfb3B0KSB7XG4gICAgICAgIGF3YWl0IHNxbCBgc2VsZWN0IHJlbGVhc2VfbG9jaygke3NxbC5saXQoTE9DS19JRCl9KWAuZXhlY3V0ZShkYik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgQ29tcGlsYWJsZSxcbiAgdHlwZSBEaWFsZWN0QWRhcHRlcixcbiAgRHVtbXlEcml2ZXIsXG4gIHR5cGUgRXhwcmVzc2lvbixcbiAgdHlwZSBFeHByZXNzaW9uQnVpbGRlcixcbiAgZXhwcmVzc2lvbkJ1aWxkZXIsXG4gIHR5cGUgRXhwcmVzc2lvbldyYXBwZXIsXG4gIHR5cGUgSW5zZXJ0T2JqZWN0LFxuICBLeXNlbHksXG4gIHR5cGUgS3lzZWx5UGx1Z2luLFxuICBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIsXG4gIHR5cGUgUGx1Z2luVHJhbnNmb3JtUXVlcnlBcmdzLFxuICB0eXBlIFBsdWdpblRyYW5zZm9ybVJlc3VsdEFyZ3MsXG4gIHR5cGUgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSxcbiAgdHlwZSBRdWVyeUNvbXBpbGVyLFxuICB0eXBlIFF1ZXJ5UmVzdWx0IGFzIEt5c2VseVF1ZXJ5UmVzdWx0LFxuICB0eXBlIFJvb3RPcGVyYXRpb25Ob2RlLFxuICBzcWwsXG4gIHR5cGUgU3FsQm9vbCxcbiAgdHlwZSBVbmtub3duUm93LFxuICB0eXBlIFVwZGF0ZU9iamVjdCxcbiAgVmFsdWVMaXN0Tm9kZSxcbiAgVmFsdWVOb2RlLFxuICB0eXBlIFdoZXJlSW50ZXJmYWNlLFxufSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB0eXBlIHsgQ29sdW1uLCBDb2x1bW5GaWx0ZXIsIEZpbHRlckdyb3VwLCBUYWJsZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVyUmVxdWlyZW1lbnRzIHtcbiAgQWRhcHRlcjogeyBuZXcgKCk6IERpYWxlY3RBZGFwdGVyIH07XG4gIG5vUGFyYW1ldGVycz86IGJvb2xlYW47XG4gIFF1ZXJ5Q29tcGlsZXI6IHsgbmV3ICgpOiBRdWVyeUNvbXBpbGVyIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZGVyPERCPihyZXF1aXJlbWVudHM6IEJ1aWxkZXJSZXF1aXJlbWVudHMpOiBLeXNlbHk8REI+IHtcbiAgcmV0dXJuIG5ldyBLeXNlbHkoe1xuICAgIGRpYWxlY3Q6IHtcbiAgICAgIGNyZWF0ZUFkYXB0ZXI6ICgpID0+IG5ldyByZXF1aXJlbWVudHMuQWRhcHRlcigpLFxuICAgICAgY3JlYXRlRHJpdmVyOiAoKSA9PiBuZXcgRHVtbXlEcml2ZXIoKSxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB3ZSBkb24ndCBuZWVkIGJ1aWx0LWluIGludHJvc3BlY3Rpb24gaW4gdGhpcyBjYXNlXG4gICAgICBjcmVhdGVJbnRyb3NwZWN0b3I6ICgpID0+IG51bGwsXG4gICAgICBjcmVhdGVRdWVyeUNvbXBpbGVyOiAoKSA9PiBuZXcgcmVxdWlyZW1lbnRzLlF1ZXJ5Q29tcGlsZXIoKSxcbiAgICB9LFxuICAgIHBsdWdpbnM6IFsuLi4ocmVxdWlyZW1lbnRzLm5vUGFyYW1ldGVycyA/IFtuZXcgSW1tZWRpYXRlVmFsdWVQbHVnaW4oKV0gOiBbXSldLFxuICB9KTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiB0aGF0IHRyYW5zZm9ybXMgYWxsIHZhbHVlcyB0byBpbW1lZGlhdGUgdmFsdWVzLiBUaGlzIG1lYW5zIHRoZWlyIGluamVjdGVkIGludG8gdGhlIFNRTCBzdHJpbmcgaW5zdGVhZCBvZiBwb3B1bGF0aW5nIHRoZSBwYXJhbWV0ZXJzIGFycmF5LlxuICogSW4gc29tZSBzaXR1YXRpb25zLCBhIGRhdGFiYXNlIGRyaXZlciBtaWdodCBub3Qgc3VwcG9ydCBwYXJhbWV0ZXJzLCBhbmQgdGhpcyBwbHVnaW4gY2FuIGJlIHVzZWQgdG8gd29yayBhcm91bmQgdGhhdC5cbiAqL1xuY2xhc3MgSW1tZWRpYXRlVmFsdWVQbHVnaW4gaW1wbGVtZW50cyBLeXNlbHlQbHVnaW4ge1xuICByZWFkb25seSAjdHJhbnNmb3JtZXIgPSBuZXcgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lcigpO1xuXG4gIHRyYW5zZm9ybVF1ZXJ5KGFyZ3M6IFBsdWdpblRyYW5zZm9ybVF1ZXJ5QXJncyk6IFJvb3RPcGVyYXRpb25Ob2RlIHtcbiAgICByZXR1cm4gdGhpcy4jdHJhbnNmb3JtZXIudHJhbnNmb3JtTm9kZShhcmdzLm5vZGUpO1xuICB9XG5cbiAgdHJhbnNmb3JtUmVzdWx0KGFyZ3M6IFBsdWdpblRyYW5zZm9ybVJlc3VsdEFyZ3MpOiBQcm9taXNlPEt5c2VseVF1ZXJ5UmVzdWx0PFVua25vd25Sb3c+PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcmdzLnJlc3VsdCk7XG4gIH1cbn1cblxuY2xhc3MgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciBleHRlbmRzIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSB0cmFuc2Zvcm1QcmltaXRpdmVWYWx1ZUxpc3Qobm9kZTogUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSk6IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUge1xuICAgIHJldHVybiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZShub2RlLnZhbHVlcy5tYXAoVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSkpIGFzIG5ldmVyO1xuICB9XG5cbiAgb3ZlcnJpZGUgdHJhbnNmb3JtVmFsdWUobm9kZTogVmFsdWVOb2RlKTogVmFsdWVOb2RlIHtcbiAgICByZXR1cm4geyAuLi5zdXBlci50cmFuc2Zvcm1WYWx1ZShub2RlKSwgaW1tZWRpYXRlOiB0cnVlIH07XG4gIH1cbn1cblxuZGVjbGFyZSBjb25zdCBxdWVyeVR5cGU6IHVuaXF1ZSBzeW1ib2w7XG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBbcXVlcnlUeXBlXT86IFQ7XG4gIHBhcmFtZXRlcnM6IHJlYWRvbmx5IHVua25vd25bXTtcbiAgc3FsOiBzdHJpbmc7XG4gIHRyYW5zZm9ybWF0aW9ucz86IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIFwianNvbi1wYXJzZVwiPj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc1F1ZXJ5PFQ+KHF1ZXJ5OiBzdHJpbmcgfCBRdWVyeTx1bmtub3duPik6IFF1ZXJ5PFQ+IHtcbiAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7IHBhcmFtZXRlcnM6IFtdLCBzcWw6IHF1ZXJ5IH0gYXMgbmV2ZXI7XG4gIH1cblxuICByZXR1cm4gcXVlcnkgYXMgbmV2ZXI7XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5UmVzdWx0PFQ+ID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgVCBleHRlbmRzIFF1ZXJ5PGluZmVyIFI+ID8gUltdIDogVCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gUXVlcnk8aW5mZXIgUj4gPyBSW10gOiBuZXZlcjtcblxuZXhwb3J0IGludGVyZmFjZSBDb21waWxlT3B0aW9uczxUPiB7XG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgb2YgY29sdW1uIG5hbWVzIHRvIHRyYW5zZm9ybWF0aW9ucyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSByZXN1bHQuXG4gICAqIEN1cnJlbnRseSBzdXBwb3J0ZWQgdHJhbnNmb3JtYXRpb24gaXMgXCJqc29uLXBhcnNlXCIsIHdoaWNoIHBhcnNlcyBhIEpTT04gc3RyaW5nIGludG8gYW4gb2JqZWN0LlxuICAgKi9cbiAgdHJhbnNmb3JtYXRpb25zPzogUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgXCJqc29uLXBhcnNlXCI+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGU8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgY29tcGlsZWFibGU6IENvbXBpbGFibGU8VD4sXG4gIG9wdGlvbnM/OiBDb21waWxlT3B0aW9uczxUPixcbik6IFF1ZXJ5PFQ+IHtcbiAgY29uc3QgY29tcGlsZWRRdWVyeSA9IGNvbXBpbGVhYmxlLmNvbXBpbGUoKTtcblxuICByZXR1cm4ge1xuICAgIHBhcmFtZXRlcnM6IGNvbXBpbGVkUXVlcnkucGFyYW1ldGVycyxcbiAgICBzcWw6IGNvbXBpbGVkUXVlcnkuc3FsLFxuICAgIHRyYW5zZm9ybWF0aW9uczogb3B0aW9ucz8udHJhbnNmb3JtYXRpb25zLFxuICB9O1xufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBmaWx0ZXIgdG8gdGhlIGdpdmVuIHJvd3MgYmFzZWQgb24gdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgb2YgdGhlIHRhYmxlLlxuICpcbiAqIEBleGFtcGxlIGRiLnNlbGVjdEZyb20oXCJ1c2Vyc1wiKS4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSkuc2VsZWN0QWxsKClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sIGNvbHVtbnM6IFRhYmxlW1wiY29sdW1uc1wiXSkge1xuICBjb25zdCByb3dGaWx0ZXJzID0gaW5mZXJSb3dGaWx0ZXJzKHJvd3MsIGNvbHVtbnMpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHJldHVybiA8UUIgZXh0ZW5kcyBXaGVyZUludGVyZmFjZTxhbnksIGFueT4+KHFiOiBRQik6IFFCID0+XG4gICAgcWIud2hlcmUoKGViKSA9PiB7XG4gICAgICByZXR1cm4gZWIub3IoXG4gICAgICAgIHJvd0ZpbHRlcnMubWFwKChyb3dGaWx0ZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4gZWIuYW5kKFxuICAgICAgICAgICAgcm93RmlsdGVyLm1hcCgoW2NvbHVtbk5hbWUsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgICAgZWIoY29sdW1uTmFtZSwgdmFsdWUgPT09IG51bGwgPyBcImlzXCIgOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFwiaW5cIiA6IFwiPVwiLCB2YWx1ZSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KSBhcyBuZXZlcjtcbn1cblxuLyoqXG4gKiBQYXJ0IG9mIGEgZmlsdGVyIHRoYXQgcHJlZGljdHMgYSBtYXRjaC5cbiAqIGllLiAuLi4gV0hFUkUgJENvbHVtTmFtZSA9ICRWYWx1ZSAuLi5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgUm93RmlsdGVyUHJlZGljYXRlID0gW0NvbHVtbk5hbWU6IHN0cmluZyB8IEV4cHJlc3Npb248YW55PiwgVmFsdWU6IHVua25vd25dO1xuXG4vKipcbiAqIEEgcm93IGZpbHRlciBpcyBjb21wcmlzZWQgb2Ygb25lIG9yIG1vcmUgcHJlZGljYXRlcy5cbiAqL1xudHlwZSBSb3dGaWx0ZXIgPSBSb3dGaWx0ZXJQcmVkaWNhdGVbXTtcblxuLyoqXG4gKiBSb3cgZmlsdGVycyBpcyBzaW1wbHkgYSBzZXQgb2YgbXVsdGlwbGUge0BsaW5rIFJvd0ZpbHRlcn0uXG4gKi9cbnR5cGUgUm93RmlsdGVycyA9IFJvd0ZpbHRlcltdO1xuXG4vKipcbiAqIEluZmVycyB0aGUgZmlsdGVyIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgZ2l2ZW4gcm93XG4gKiBpbmRpdmlkdWFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckZpbHRlck9iamVjdChyb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBjb2x1bW5zOiBUYWJsZVtcImNvbHVtbnNcIl0pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGZpbHRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBPYmplY3QudmFsdWVzKGNvbHVtbnMpKSB7XG4gICAgY29uc3QgeyBpc0luUHJpbWFyeUtleSwgbmFtZTogY29sdW1uTmFtZSB9ID0gY29sdW1uO1xuXG4gICAgaWYgKCFpc0luUHJpbWFyeUtleSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZmlsdGVyW2NvbHVtbk5hbWVdID0gcm93W2NvbHVtbk5hbWVdID8/IG51bGw7XG4gIH1cblxuICByZXR1cm4gZmlsdGVyO1xufVxuXG4vKipcbiAqIEluZmVycyB0aGUgZmlsdGVyIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIHVuaXF1ZWx5IGlkZW50aWZ5IG11bHRpcGxlIHJvd3NcbiAqIGluZGl2aWR1YWxseS5cbiAqXG4gKiBFbGVnYW50bHkgaW5mZXJzIHRoZSBiZXN0IHBvc3NpYmxlIHN0YXRlbWVudCB0byBmaWx0ZXIgd2l0aC5cbiAqIFRPRE86IGludHJvc3BlY3QgcHJpbWFyeSBrZXkgb3JkaW5hbCBudW1iZXJzIHNvIHRoZSB0dXBsZSBpcyBpbiB0aGUgY29ycmVjdCBvcmRlci5cbiAqIFRPRE86IGlmIHdlIGV2ZXIgc3VwcG9ydCBNU1NRTCwgd2UnbGwgbmVlZCB0byBkcm9wIHRvIGR1bWIgKC4uLiBhbmQgLi4uKSBvciAoLi4uIGFuZCAuLi4pIGxpa2UgaW4gdGhlIG9sZCB3YXkganVzdCBmb3IgTVNTUUwuXG4gKlxuICogRm9yIHNpbmdsZSBjb2x1bW4gcHJpbWFyeSBrZXk6XG4gKlxuICogMS4gaWYgb25seSAxIHJvdzogY29sID0gdmFsdWVcbiAqIDIuIGlmIG11bHRpcGxlIHJvd3M6IGNvbCBJTiAodmFsdWUxLCB2YWx1ZTIsIC4uLilcbiAqXG4gKiBGb3IgY29tcG9zaXRlIHByaW1hcnkga2V5OlxuICpcbiAqIDEuIGlmIG9ubHkgMSByb3c6IChjb2wxLCBjb2wyLCAuLi4pID0gKHZhbHVlMSwgdmFsdWUyLCAuLi4pXG4gKiAyLiBpZiBtdWx0aXBsZSByb3dzOiAoY29sMSwgY29sMiwgLi4uKSBJTiAoKHZhbHVlMWEsIHZhbHVlMmEsIC4uLiksICh2YWx1ZTFiLCB2YWx1ZTJiLCAuLi4pLCAuLi4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZlclJvd0ZpbHRlcnMocm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSwgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdKTogUm93RmlsdGVycyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IHJlZnM6IEV4cHJlc3Npb25XcmFwcGVyPGFueSwgYW55LCBhbnk+W10gPSBbXTtcbiAgY29uc3QgdmFsdWVzOiB1bmtub3duW10gPSBbXTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCBlYiA9IGV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PigpO1xuXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBjb25zdCB2YWx1ZXNGb3JSb3c6IHVua25vd25bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyhjb2x1bW5zKSkge1xuICAgICAgY29uc3QgeyBpc0luUHJpbWFyeUtleSwgbmFtZTogY29sdW1uTmFtZSB9ID0gY29sdW1uO1xuXG4gICAgICBpZiAoIWlzSW5QcmltYXJ5S2V5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocm93ID09PSByb3dzLmF0KDApKSB7XG4gICAgICAgIHJlZnMucHVzaChlYi5yZWYoY29sdW1uTmFtZSkpO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZXNGb3JSb3cucHVzaCh0cmFuc2Zvcm1WYWx1ZShyb3dbY29sdW1uTmFtZV0gPz8gbnVsbCwgY29sdW1uKSk7XG4gICAgfVxuXG4gICAgdmFsdWVzLnB1c2gocmVmcy5sZW5ndGggPT09IDEgPyB2YWx1ZXNGb3JSb3cuYXQoMCkhIDogdHVwbGVGcm9tKHZhbHVlc0ZvclJvdykpO1xuICB9XG5cbiAgY29uc3QgbGhzID0gcmVmcy5sZW5ndGggPT09IDEgPyByZWZzLmF0KDApISA6IHR1cGxlRnJvbShyZWZzKTtcbiAgY29uc3QgcmhzID0gdmFsdWVzLmxlbmd0aCA9PT0gMSA/IHZhbHVlcy5hdCgwKSEgOiB2YWx1ZXM7XG5cbiAgcmV0dXJuIFtbW2xocywgcmhzXV1dO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gdHVwbGVGcm9tKGl0ZW1zOiB1bmtub3duW10pOiBFeHByZXNzaW9uPGFueT4ge1xuICByZXR1cm4gc3FsYCgke3NxbC5qb2luKGl0ZW1zLCBzcWxgLCBgKX0pYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VHJhbnNmb3JtYXRpb25zPEMgZXh0ZW5kcyBcImluc2VydFwiIHwgXCJ1cGRhdGVcIj4oXG4gIF9jb250ZXh0OiBDLFxuICB2YWx1ZXM6IEMgZXh0ZW5kcyBcInVwZGF0ZVwiID8gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4gIGNvbHVtbnM6IFRhYmxlW1wiY29sdW1uc1wiXSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbik6IEMgZXh0ZW5kcyBcInVwZGF0ZVwiID8gKCkgPT4gVXBkYXRlT2JqZWN0PGFueSwgYW55PiA6ICgpID0+IEluc2VydE9iamVjdDxhbnksIGFueT4gfCBJbnNlcnRPYmplY3Q8YW55LCBhbnk+W10ge1xuICByZXR1cm4gKCkgPT5cbiAgICBBcnJheS5pc0FycmF5KHZhbHVlcykgPyB2YWx1ZXMubWFwKChyb3cpID0+IHRyYW5zZm9ybVZhbHVlcyhyb3csIGNvbHVtbnMpKSA6IHRyYW5zZm9ybVZhbHVlcyh2YWx1ZXMsIGNvbHVtbnMpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1WYWx1ZXMoXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbHVtbnM6IFRhYmxlW1wiY29sdW1uc1wiXSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbik6IEluc2VydE9iamVjdDxhbnksIGFueT4gfCBVcGRhdGVPYmplY3Q8YW55LCBhbnk+IHtcbiAgaWYgKE9iamVjdC5rZXlzKHZhbHVlcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgW09iamVjdC5rZXlzKGNvbHVtbnMpLmF0KDApIV06IHNxbGBkZWZhdWx0YCB9O1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHZhbHVlcykucmVkdWNlKFxuICAgIChvYmosIFtrZXksIHZhbHVlXSkgPT4gKHsgLi4ub2JqLCBba2V5XTogdHJhbnNmb3JtVmFsdWUodmFsdWUsIGNvbHVtbnNba2V5XSEpIH0pLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAge30gYXMgSW5zZXJ0T2JqZWN0PGFueSwgYW55PiB8IFVwZGF0ZU9iamVjdDxhbnksIGFueT4sXG4gICk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtVmFsdWUodmFsdWU6IHVua25vd24sIGNvbHVtbjogQ29sdW1uKTogRXhwcmVzc2lvbldyYXBwZXI8YW55LCBhbnksIGFueT4ge1xuICBjb25zdCB7IGRhdGF0eXBlIH0gPSBjb2x1bW47XG5cbiAgY29uc3QgZWIgPSBleHByZXNzaW9uQnVpbGRlcigpO1xuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBlYi5saXQobnVsbCk7XG4gIH1cblxuICBpZiAoIWRhdGF0eXBlLmlzTmF0aXZlKSB7XG4gICAgcmV0dXJuIGViLmNhc3QoZWIudmFsKHZhbHVlKSwgc3FsLmlkKGRhdGF0eXBlLnNjaGVtYSwgZGF0YXR5cGUubmFtZSkpO1xuICB9XG5cbiAgcmV0dXJuIGViLnZhbCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uKFxuICBmaWx0ZXJzOiAoQ29sdW1uRmlsdGVyIHwgRmlsdGVyR3JvdXApW10sXG4gIGNvbHVtbnM6IFRhYmxlW1wiY29sdW1uc1wiXSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbik6IChlYjogRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiBFeHByZXNzaW9uPFNxbEJvb2w+IHtcbiAgaWYgKGZpbHRlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gKGViKSA9PiBlYi5saXQodHJ1ZSk7IC8vIG5vIGZpbHRlcnMsIGFsd2F5cyB0cnVlXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgY29uc3Qgb3JHcm91cHNPZkFuZEJ1aWxkZXJzOiAoKGViOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IEV4cHJlc3Npb248U3FsQm9vbD4pW11bXSA9IFtdO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBsZXQgY3VycmVudEFuZEdyb3VwQnVpbGRlcnM6ICgoZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4gRXhwcmVzc2lvbjxTcWxCb29sPilbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykge1xuICAgIGN1cnJlbnRBbmRHcm91cEJ1aWxkZXJzLnB1c2goYnVpbGRCYXNlRXhwcmVzc2lvbkJ1aWxkZXIoZmlsdGVyc1tpXSEsIGNvbHVtbnMpKTtcblxuICAgIC8vICZuIEFORCBncm91cCBlbmRzIGlmIGl0J3MgdGhlIGxhc3QgZmlsdGVyLCBvciB0aGUgaXRlbSBpcyBmb2xsb3dlZCBieSBhbiAnb3InXG4gICAgaWYgKGkgPT09IGZpbHRlcnMubGVuZ3RoIC0gMSB8fCBmaWx0ZXJzW2ldIS5hZnRlciA9PT0gXCJvclwiKSB7XG4gICAgICBvckdyb3Vwc09mQW5kQnVpbGRlcnMucHVzaChjdXJyZW50QW5kR3JvdXBCdWlsZGVycyk7XG4gICAgICBjdXJyZW50QW5kR3JvdXBCdWlsZGVycyA9IFtdOyAvLyBzdGFydCBhIG5ldyBncm91cFxuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHJldHVybiAoZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgIGNvbnN0IGFuZEV4cHJlc3Npb25zID0gb3JHcm91cHNPZkFuZEJ1aWxkZXJzLm1hcCgoZ3JvdXApID0+IHtcbiAgICAgIHJldHVybiBlYi5hbmQoZ3JvdXAubWFwKChidWlsZGVyKSA9PiBidWlsZGVyKGViKSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGViLm9yKGFuZEV4cHJlc3Npb25zKTtcbiAgfTtcbn1cblxuLy8gSGVscGVyIHRvIGJ1aWxkIGFuIGV4cHJlc3Npb24gYnVpbGRlciBmb3IgYSBzaW5nbGUgZmlsdGVyIG9yIGEgZ3JvdXBcbmZ1bmN0aW9uIGJ1aWxkQmFzZUV4cHJlc3Npb25CdWlsZGVyKFxuICBzcGVjOiBDb2x1bW5GaWx0ZXIgfCBGaWx0ZXJHcm91cCxcbiAgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuKTogKGViOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IEV4cHJlc3Npb248U3FsQm9vbD4ge1xuICBpZiAoc3BlYy5raW5kID09PSBcIkNvbHVtbkZpbHRlclwiKSB7XG4gICAgcmV0dXJuIChlYikgPT4ge1xuICAgICAgY29uc3QgeyBjb2x1bW4sIG9wZXJhdG9yLCB2YWx1ZSB9ID0gc3BlYztcblxuICAgICAgY29uc3QgY29sdW1uTWV0YSA9IGNvbHVtbnNbY29sdW1uXSE7XG5cbiAgICAgIHJldHVybiBlYihcbiAgICAgICAgY29sdW1uTWV0YS5kYXRhdHlwZS5ncm91cCA9PT0gXCJyYXdcIiA/IGViLmNhc3QoY29sdW1uLCBcInRleHRcIikgOiBjb2x1bW4sXG4gICAgICAgIG9wZXJhdG9yLFxuICAgICAgICB0cmFuc2Zvcm1WYWx1ZSh2YWx1ZSwgY29sdW1uTWV0YSksXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbihzcGVjLmZpbHRlcnMsIGNvbHVtbnMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRGF0YVR5cGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuXG5leHBvcnQgY29uc3QgTVlTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQTogUmVjb3JkPHN0cmluZywgUGljazxEYXRhVHlwZSwgXCJncm91cFwiPj4gPSB7XG4gIGJpZ2ludDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgYmluYXJ5OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGJpdDoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBibG9iOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGNoYXI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgXCJjaGFyIGJpbmFyeVwiOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGRhdGU6IHtcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICBkYXRldGltZToge1xuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIGRlYzoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgZGVjaW1hbDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgZG91YmxlOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBcImRvdWJsZSBwcmVjaXNpb25cIjoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgZW51bToge1xuICAgIGdyb3VwOiBcImVudW1cIixcbiAgfSxcbiAgZml4ZWQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGZsb2F0OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBnZW9tZXRyeToge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBnZW9tZXRyeWNvbGxlY3Rpb246IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBpbnRlZ2VyOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBqc29uOiB7XG4gICAgZ3JvdXA6IFwianNvblwiLFxuICB9LFxuICBsaW5lc3RyaW5nOiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIGxvbmc6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgXCJsb25nIHZhcmNoYXJcIjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBsb25nYmxvYjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBsb25ndGV4dDoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBsb25ndmFyYmluYXJ5OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGxvbmd2YXJjaGFyOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIG1lZGl1bWJsb2I6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgbWVkaXVtaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBtZWRpdW10ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIG11bHRpbGluZXN0cmluZzoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBtdWx0aXBvaW50OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIG11bHRpcG9seWdvbjoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBudW1lcmljOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBwb2ludDoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBwb2x5Z29uOiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIHJlYWw6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBodHRwczovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi85LjUvZW4vc2V0Lmh0bWxcbiAgICovXG4gIHNldDoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBzbWFsbGludDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgdGV4dDoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICB0aW1lOiB7XG4gICAgZ3JvdXA6IFwidGltZVwiLFxuICB9LFxuICB0aW1lc3RhbXA6IHtcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICB0aW55YmxvYjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICB0aW55aW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICB0aW55dGV4dDoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICB2YXJiaW5hcnk6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgdmFyY2hhcjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBcInZhcmNoYXIgYmluYXJ5XCI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgLyoqXG4gICAqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzkuNS9lbi92ZWN0b3IuaHRtbFxuICAgKi9cbiAgdmVjdG9yOiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIHllYXI6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG59O1xuIiwgImltcG9ydCB7IHR5cGUgS3lzZWx5LCBNeXNxbEFkYXB0ZXIsIE15c3FsUXVlcnlDb21waWxlciB9IGZyb20gXCJreXNlbHlcIjtcblxuaW1wb3J0IHsgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLCBnZXRCdWlsZGVyIH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gZ2V0TXlTUUxCdWlsZGVyPERhdGFiYXNlID0gYW55PihcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbik6IEt5c2VseTxEYXRhYmFzZT4ge1xuICByZXR1cm4gZ2V0QnVpbGRlcih7IC4uLnJlcXVpcmVtZW50cywgQWRhcHRlcjogTXlzcWxBZGFwdGVyLCBRdWVyeUNvbXBpbGVyOiBNeXNxbFF1ZXJ5Q29tcGlsZXIgfSk7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBJbmZlclJlc3VsdCwgdHlwZSBSZWZlcmVuY2VFeHByZXNzaW9uLCBzcWwgfSBmcm9tIFwia3lzZWx5XCI7XG5pbXBvcnQgdHlwZSB7IE9rUGFja2V0UGFyYW1zIH0gZnJvbSBcIm15c3FsMlwiO1xuXG5pbXBvcnQgdHlwZSB7IEFkYXB0ZXJEZWxldGVEZXRhaWxzLCBBZGFwdGVyUXVlcnlEZXRhaWxzLCBBZGFwdGVyVXBkYXRlRGV0YWlscywgVGFibGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMsXG4gIGFwcGx5VHJhbnNmb3JtYXRpb25zLFxuICB0eXBlIEJ1aWxkZXJSZXF1aXJlbWVudHMsXG4gIGNvbXBpbGUsXG4gIGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24sXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHR5cGUgeyBCaWdJbnRTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgZ2V0TXlTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuaW1wb3J0IHsgbW9ja1RhYmxlc1F1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVsZXRlUXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJEZWxldGVEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICByb3dzLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0TXlTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICByZXR1cm4gY29tcGlsZShidWlsZGVyLmRlbGV0ZUZyb20odGFibGVOYW1lKS4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSkuJGNhc3RUbzxPa1BhY2tldFBhcmFtcz4oKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRRdWVyeShcbiAgZGV0YWlsczogeyByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdOyB0YWJsZTogVGFibGUgfSxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgcm93cyxcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9IGdldE15U1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLmluc2VydEludG8odGFibGVOYW1lKVxuICAgICAgLnZhbHVlcyhhcHBseVRyYW5zZm9ybWF0aW9ucyhcImluc2VydFwiLCByb3dzLCBjb2x1bW5zKSlcbiAgICAgIC4kY2FzdFRvPE9rUGFja2V0UGFyYW1zPigpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5KFxuICBkZXRhaWxzOiB7IGNyaXRlcmlhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdOyB0YWJsZTogVGFibGUgfSxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY3JpdGVyaWEsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPSBnZXRNeVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhjcml0ZXJpYSwgY29sdW1ucykpXG4gICAgICAuc2VsZWN0KE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLnNlbGVjdChnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzKCkuYXMoXCJfX3BzX2luc2VydGVkX2F0X19cIikpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY2hhbmdlcyxcbiAgICByb3csXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPSBnZXRNeVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhbeyAuLi5yb3csIC4uLmNoYW5nZXMgfV0sIGNvbHVtbnMpKVxuICAgICAgLnNlbGVjdChPYmplY3Qua2V5cyhjb2x1bW5zKSlcbiAgICAgIC5zZWxlY3QoZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpLmFzKFwiX19wc191cGRhdGVkX2F0X19cIikpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0UXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJRdWVyeURldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIGZpbHRlciA9IHsgYWZ0ZXI6IFwiYW5kXCIsIGZpbHRlcnM6IFtdLCBraW5kOiBcIkZpbHRlckdyb3VwXCIgfSxcbiAgICBwYWdlSW5kZXgsXG4gICAgcGFnZVNpemUsXG4gICAgc29ydE9yZGVyLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0TXlTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICBjb25zdCBmaWx0ZXJFeHByZXNzaW9uID0gZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbihmaWx0ZXIuZmlsdGVycywgY29sdW1ucyk7XG5cbiAgY29uc3QgY291bnRRdWVyeSA9IGJ1aWxkZXJcbiAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgLndoZXJlKGZpbHRlckV4cHJlc3Npb24pXG4gICAgLnNlbGVjdCgoZWIpID0+IGViLmNhc3Q8QmlnSW50U3RyaW5nPihlYi5mbi5jb2FsZXNjZShlYi5mbi5jb3VudEFsbCgpLCBzcWwubGl0KDApKSwgXCJjaGFyXCIpLmFzKFwidmFsdWVcIikpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC53aXRoKFwiY291bnRcIiwgKCkgPT4gY291bnRRdWVyeSlcbiAgICAgIC5zZWxlY3RGcm9tKFt0YWJsZU5hbWUsIFwiY291bnRcIl0pXG4gICAgICAvLyBUT0RPOiBjdXJzb3IgcGFnaW5hdGlvbj9cbiAgICAgIC53aGVyZShmaWx0ZXJFeHByZXNzaW9uKVxuICAgICAgLnNlbGVjdChPYmplY3Qua2V5cyhjb2x1bW5zKSlcbiAgICAgIC5zZWxlY3QoXG4gICAgICAgIHNxbFxuICAgICAgICAgIC5yZWY8QmlnSW50U3RyaW5nPihcbiAgICAgICAgICAgIFwiY291bnQudmFsdWVcIiBzYXRpc2ZpZXMgUmVmZXJlbmNlRXhwcmVzc2lvbjx7IGNvdW50OiBJbmZlclJlc3VsdDx0eXBlb2YgY291bnRRdWVyeT5bbnVtYmVyXSB9LCBcImNvdW50XCI+LFxuICAgICAgICAgIClcbiAgICAgICAgICAuYXMoXCJfX3BzX2NvdW50X19cIiksXG4gICAgICApXG4gICAgICAuJGNhbGwoKHFiKSA9PiBzb3J0T3JkZXIucmVkdWNlKChxYiwgaXRlbSkgPT4gcWIub3JkZXJCeShpdGVtLmNvbHVtbiwgaXRlbS5kaXJlY3Rpb24pLCBxYikpXG4gICAgICAubGltaXQocGFnZVNpemUpXG4gICAgICAvLyB3ZSdyZSBpbmplY3RpbmcgdGhlIG9mZnNldCB2YWx1ZSBoZXJlIHRvIGF2b2lkIHNlcmlhbGl6YXRpb24gY29tcGxleGl0eSAoYGJpZ2ludGAgaXMgYSBuby1nbyBmb3IgYEpTT04uc3RyaW5naWZ5YCkuXG4gICAgICAub2Zmc2V0KHNxbC5saXQoQmlnSW50KHBhZ2VJbmRleCkgKiBCaWdJbnQocGFnZVNpemUpKSksXG4gICk7XG59XG5cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrU2VsZWN0UXVlcnkoKSB7XG4gIC8vIFRPRE86IC4uLlxuICByZXR1cm4gW10gYXMgY29uc3Qgc2F0aXNmaWVzIHtcbiAgICAvLyBiZXN0IGVmZm9ydCBubyBuZWVkIHRvIGdvIG92ZXJib2FyZFxuICAgIFtLIGluIFJldHVyblR5cGU8dHlwZW9mIG1vY2tUYWJsZXNRdWVyeT5bMV1bXCJjb2x1bW5zXCJdW251bWJlcl1bXCJuYW1lXCJdIHwgXCJfX3BzX2NvdW50X19cIl06IHVua25vd247XG4gIH1bXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVwZGF0ZVF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY2hhbmdlcyxcbiAgICByb3csXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9IGdldE15U1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGhTY2hlbWEoc2NoZW1hKVxuICAgICAgLnVwZGF0ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICAgIC5zZXQoYXBwbHlUcmFuc2Zvcm1hdGlvbnMoXCJ1cGRhdGVcIiwgY2hhbmdlcywgY29sdW1ucykpXG4gICAgICAuJGNhbGwoYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMoW3Jvd10sIGNvbHVtbnMpKVxuICAgICAgLiRjYXN0VG88T2tQYWNrZXRQYXJhbXM+KCksXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKSB7XG4gIHJldHVybiBzcWw8bnVtYmVyIHwgc3RyaW5nPmBjYXN0KHVuaXhfdGltZXN0YW1wKG5vdygzKSkgKiAxMDAwIGFzIHVuc2lnbmVkKWA7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pzb24tb2JqZWN0LWFyZ3MuZC50c1wiIC8+XG5pbXBvcnQgeyBFeHByZXNzaW9uV3JhcHBlciB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi13cmFwcGVyLmpzJztcbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IFJlZmVyZW5jZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZWZlcmVuY2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS90YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEpzb25PYmplY3RBcmdzKG5vZGUsIHRhYmxlKSB7XG4gICAgY29uc3QgYXJncyA9IFtdO1xuICAgIGZvciAoY29uc3QgeyBzZWxlY3Rpb246IHMgfSBvZiBub2RlLnNlbGVjdGlvbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKFJlZmVyZW5jZU5vZGUuaXMocykgJiYgQ29sdW1uTm9kZS5pcyhzLmNvbHVtbikpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChjb2xOYW1lKHMuY29sdW1uLmNvbHVtbi5uYW1lKSwgY29sUmVmKHRhYmxlLCBzLmNvbHVtbi5jb2x1bW4ubmFtZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENvbHVtbk5vZGUuaXMocykpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChjb2xOYW1lKHMuY29sdW1uLm5hbWUpLCBjb2xSZWYodGFibGUsIHMuY29sdW1uLm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBbGlhc05vZGUuaXMocykgJiYgSWRlbnRpZmllck5vZGUuaXMocy5hbGlhcykpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChjb2xOYW1lKHMuYWxpYXMubmFtZSksIGNvbFJlZih0YWJsZSwgcy5hbGlhcy5uYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGV4dHJhY3QgY29sdW1uIG5hbWVzIGZyb20gdGhlIHNlbGVjdCBxdWVyeSBub2RlYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFyZ3M7XG59XG5mdW5jdGlvbiBjb2xOYW1lKGNvbCkge1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZShjb2wpKTtcbn1cbmZ1bmN0aW9uIGNvbFJlZih0YWJsZSwgY29sKSB7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihSZWZlcmVuY2VOb2RlLmNyZWF0ZShDb2x1bW5Ob2RlLmNyZWF0ZShjb2wpLCBUYWJsZU5vZGUuY3JlYXRlKHRhYmxlKSkpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9teXNxbC5kLnRzXCIgLz5cbmltcG9ydCB7IHNxbCB9IGZyb20gJy4uL3Jhdy1idWlsZGVyL3NxbC5qcyc7XG5pbXBvcnQgeyBnZXRKc29uT2JqZWN0QXJncyB9IGZyb20gJy4uL3V0aWwvanNvbi1vYmplY3QtYXJncy5qcyc7XG4vKipcbiAqIEEgTXlTUUwgaGVscGVyIGZvciBhZ2dyZWdhdGluZyBhIHN1YnF1ZXJ5IGludG8gYSBKU09OIGFycmF5LlxuICpcbiAqIE5PVEU6IFRoaXMgaGVscGVyIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBmdWxseSB3b3JrIHdpdGggdGhlIGJ1aWx0LWluIGBNeXNxbERpYWxlY3RgLlxuICogV2hpbGUgdGhlIHByb2R1Y2VkIFNRTCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIE15U1FMIGRhdGFiYXNlcywgc29tZSB0aGlyZC1wYXJ0eSBkaWFsZWN0c1xuICogbWF5IG5vdCBwYXJzZSB0aGUgbmVzdGVkIEpTT04gaW50byBhcnJheXMuIEluIHRoZXNlIGNhc2VzIHlvdSBjYW4gdXNlIHRoZSBidWlsdCBpblxuICogYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gIHRvIHBhcnNlIHRoZSByZXN1bHRzLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBqc29uQXJyYXlGcm9tIH0gZnJvbSAna3lzZWx5L2hlbHBlcnMvbXlzcWwnXG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gKiAgICAgJ2lkJyxcbiAqICAgICBqc29uQXJyYXlGcm9tKFxuICogICAgICAgZWIuc2VsZWN0RnJvbSgncGV0JylcbiAqICAgICAgICAgLnNlbGVjdChbJ3BldC5pZCBhcyBwZXRfaWQnLCAncGV0Lm5hbWUnXSlcbiAqICAgICAgICAgLndoZXJlUmVmKCdwZXQub3duZXJfaWQnLCAnPScsICdwZXJzb24uaWQnKVxuICogICAgICAgICAub3JkZXJCeSgncGV0Lm5hbWUnKVxuICogICAgICkuYXMoJ3BldHMnKVxuICogICBdKVxuICogICAuZXhlY3V0ZSgpXG4gKlxuICogcmVzdWx0WzBdPy5pZFxuICogcmVzdWx0WzBdPy5wZXRzWzBdPy5wZXRfaWRcbiAqIHJlc3VsdFswXT8ucGV0c1swXT8ubmFtZVxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBgaWRgLCAoXG4gKiAgIHNlbGVjdCBjYXN0KGNvYWxlc2NlKGpzb25fYXJyYXlhZ2coanNvbl9vYmplY3QoXG4gKiAgICAgJ3BldF9pZCcsIGBhZ2dgLmBwZXRfaWRgLFxuICogICAgICduYW1lJywgYGFnZ2AuYG5hbWVgXG4gKiAgICkpLCAnW10nKSBhcyBqc29uKSBmcm9tIChcbiAqICAgICBzZWxlY3QgYHBldGAuYGlkYCBhcyBgcGV0X2lkYCwgYHBldGAuYG5hbWVgXG4gKiAgICAgZnJvbSBgcGV0YFxuICogICAgIHdoZXJlIGBwZXRgLmBvd25lcl9pZGAgPSBgcGVyc29uYC5gaWRgXG4gKiAgICAgb3JkZXIgYnkgYHBldGAuYG5hbWVgXG4gKiAgICkgYXMgYGFnZ2BcbiAqICkgYXMgYHBldHNgXG4gKiBmcm9tIGBwZXJzb25gXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25BcnJheUZyb20oZXhwcikge1xuICAgIHJldHVybiBzcWwgYChzZWxlY3QgY2FzdChjb2FsZXNjZShqc29uX2FycmF5YWdnKGpzb25fb2JqZWN0KCR7c3FsLmpvaW4oZ2V0TXlzcWxKc29uT2JqZWN0QXJncyhleHByLnRvT3BlcmF0aW9uTm9kZSgpLCAnYWdnJykpfSkpLCAnW10nKSBhcyBqc29uKSBmcm9tICR7ZXhwcn0gYXMgYWdnKWA7XG59XG4vKipcbiAqIEEgTXlTUUwgaGVscGVyIGZvciB0dXJuaW5nIGEgc3VicXVlcnkgaW50byBhIEpTT04gb2JqZWN0LlxuICpcbiAqIFRoZSBzdWJxdWVyeSBtdXN0IG9ubHkgcmV0dXJuIG9uZSByb3cuXG4gKlxuICogTk9URTogVGhpcyBoZWxwZXIgaXMgb25seSBndWFyYW50ZWVkIHRvIGZ1bGx5IHdvcmsgd2l0aCB0aGUgYnVpbHQtaW4gYE15c3FsRGlhbGVjdGAuXG4gKiBXaGlsZSB0aGUgcHJvZHVjZWQgU1FMIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgTXlTUUwgZGF0YWJhc2VzLCBzb21lIHRoaXJkLXBhcnR5IGRpYWxlY3RzXG4gKiBtYXkgbm90IHBhcnNlIHRoZSBuZXN0ZWQgSlNPTiBpbnRvIG9iamVjdHMuIEluIHRoZXNlIGNhc2VzIHlvdSBjYW4gdXNlIHRoZSBidWlsdCBpblxuICogYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gIHRvIHBhcnNlIHRoZSByZXN1bHRzLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBqc29uT2JqZWN0RnJvbSB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL215c3FsJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbk9iamVjdEZyb20oXG4gKiAgICAgICBlYi5zZWxlY3RGcm9tKCdwZXQnKVxuICogICAgICAgICAuc2VsZWN0KFsncGV0LmlkIGFzIHBldF9pZCcsICdwZXQubmFtZSddKVxuICogICAgICAgICAud2hlcmVSZWYoJ3BldC5vd25lcl9pZCcsICc9JywgJ3BlcnNvbi5pZCcpXG4gKiAgICAgICAgIC53aGVyZSgncGV0LmlzX2Zhdm9yaXRlJywgJz0nLCB0cnVlKVxuICogICAgICkuYXMoJ2Zhdm9yaXRlX3BldCcpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/LmZhdm9yaXRlX3BldD8ucGV0X2lkXG4gKiByZXN1bHRbMF0/LmZhdm9yaXRlX3BldD8ubmFtZVxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBgaWRgLCAoXG4gKiAgIHNlbGVjdCBqc29uX29iamVjdChcbiAqICAgICAncGV0X2lkJywgYG9iamAuYHBldF9pZGAsXG4gKiAgICAgJ25hbWUnLCBgb2JqYC5gbmFtZWBcbiAqICAgKSBmcm9tIChcbiAqICAgICBzZWxlY3QgYHBldGAuYGlkYCBhcyBgcGV0X2lkYCwgYHBldGAuYG5hbWVgXG4gKiAgICAgZnJvbSBgcGV0YFxuICogICAgIHdoZXJlIGBwZXRgLmBvd25lcl9pZGAgPSBgcGVyc29uYC5gaWRgXG4gKiAgICAgYW5kIGBwZXRgLmBpc19mYXZvcml0ZWAgPSA/XG4gKiAgICkgYXMgb2JqXG4gKiApIGFzIGBmYXZvcml0ZV9wZXRgXG4gKiBmcm9tIGBwZXJzb25gXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25PYmplY3RGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IGpzb25fb2JqZWN0KCR7c3FsLmpvaW4oZ2V0TXlzcWxKc29uT2JqZWN0QXJncyhleHByLnRvT3BlcmF0aW9uTm9kZSgpLCAnb2JqJykpfSkgZnJvbSAke2V4cHJ9IGFzIG9iailgO1xufVxuLyoqXG4gKiBUaGUgTXlTUUwgYGpzb25fb2JqZWN0YCBmdW5jdGlvbi5cbiAqXG4gKiBOT1RFOiBUaGlzIGhlbHBlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gZnVsbHkgd29yayB3aXRoIHRoZSBidWlsdC1pbiBgTXlzcWxEaWFsZWN0YC5cbiAqIFdoaWxlIHRoZSBwcm9kdWNlZCBTUUwgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBNeVNRTCBkYXRhYmFzZXMsIHNvbWUgdGhpcmQtcGFydHkgZGlhbGVjdHNcbiAqIG1heSBub3QgcGFyc2UgdGhlIG5lc3RlZCBKU09OIGludG8gb2JqZWN0cy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluXG4gKiBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAgdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbkJ1aWxkT2JqZWN0KHtcbiAqICAgICAgIGZpcnN0OiBlYi5yZWYoJ2ZpcnN0X25hbWUnKSxcbiAqICAgICAgIGxhc3Q6IGViLnJlZignbGFzdF9uYW1lJyksXG4gKiAgICAgICBmdWxsOiBlYi5mbignY29uY2F0JywgWydmaXJzdF9uYW1lJywgZWIudmFsKCcgJyksICdsYXN0X25hbWUnXSlcbiAqICAgICB9KS5hcygnbmFtZScpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/Lm5hbWUuZmlyc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5sYXN0XG4gKiByZXN1bHRbMF0/Lm5hbWUuZnVsbFxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBcImlkXCIsIGpzb25fb2JqZWN0KFxuICogICAnZmlyc3QnLCBmaXJzdF9uYW1lLFxuICogICAnbGFzdCcsIGxhc3RfbmFtZSxcbiAqICAgJ2Z1bGwnLCBjb25jYXQoYGZpcnN0X25hbWVgLCA/LCBgbGFzdF9uYW1lYClcbiAqICkgYXMgXCJuYW1lXCJcbiAqIGZyb20gXCJwZXJzb25cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQnVpbGRPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHNxbCBganNvbl9vYmplY3QoJHtzcWwuam9pbihPYmplY3Qua2V5cyhvYmopLmZsYXRNYXAoKGspID0+IFtzcWwubGl0KGspLCBvYmpba11dKSl9KWA7XG59XG5mdW5jdGlvbiBnZXRNeXNxbEpzb25PYmplY3RBcmdzKG5vZGUsIHRhYmxlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdldEpzb25PYmplY3RBcmdzKG5vZGUsIHRhYmxlKTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ015U1FMIGpzb25BcnJheUZyb20gYW5kIGpzb25PYmplY3RGcm9tIGZ1bmN0aW9ucyBjYW4gb25seSBoYW5kbGUgZXhwbGljaXQgc2VsZWN0aW9ucyBkdWUgdG8gbGltaXRhdGlvbnMgb2YgdGhlIGpzb25fb2JqZWN0IGZ1bmN0aW9uLiBzZWxlY3RBbGwoKSBpcyBub3QgYWxsb3dlZCBpbiB0aGUgc3VicXVlcnkuJyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IHNxbCB9IGZyb20gXCJreXNlbHlcIjtcbmltcG9ydCB7IGpzb25BcnJheUZyb20gfSBmcm9tIFwia3lzZWx5L2hlbHBlcnMvbXlzcWxcIjtcblxuaW1wb3J0IHsgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLCBjb21waWxlLCB0eXBlIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBnZXRNeVNRTEJ1aWxkZXIgfSBmcm9tIFwiLi9idWlsZGVyXCI7XG5cbmludGVyZmFjZSBEYXRhYmFzZSB7XG4gIC8qKiBodHRwczovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi84LjQvZW4vaW5mb3JtYXRpb24tc2NoZW1hLWNvbHVtbnMtdGFibGUuaHRtbCAqL1xuICBcImluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zXCI6IHtcbiAgICBUQUJMRV9TQ0hFTUE6IHN0cmluZztcbiAgICBUQUJMRV9OQU1FOiBzdHJpbmc7XG4gICAgQ09MVU1OX05BTUU6IHN0cmluZztcbiAgICAvKiogVGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4gd2l0aGluIHRoZSB0YWJsZS4gT1JESU5BTF9QT1NJVElPTiBpcyBuZWNlc3NhcnkgYmVjYXVzZSB5b3UgbWlnaHQgd2FudCB0byBzYXkgT1JERVIgQlkgT1JESU5BTF9QT1NJVElPTi4gVW5saWtlIFNIT1cgQ09MVU1OUywgU0VMRUNUIGZyb20gdGhlIENPTFVNTlMgdGFibGUgZG9lcyBub3QgaGF2ZSBhdXRvbWF0aWMgb3JkZXJpbmcuICovXG4gICAgT1JESU5BTF9QT1NJVElPTjogbnVtYmVyO1xuICAgIC8qKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbHVtbi4gVGhpcyBpcyBOVUxMIGlmIHRoZSBjb2x1bW4gaGFzIGFuIGV4cGxpY2l0IGRlZmF1bHQgb2YgTlVMTCwgb3IgaWYgdGhlIGNvbHVtbiBkZWZpbml0aW9uIGluY2x1ZGVzIG5vIERFRkFVTFQgY2xhdXNlLiAqL1xuICAgIENPTFVNTl9ERUZBVUxUOiB1bmtub3duO1xuICAgIElTX05VTExBQkxFOiBcIllFU1wiIHwgXCJOT1wiO1xuICAgIC8qKiBDb250YWlucyB0aGUgdHlwZSBuYW1lIGFuZCBwb3NzaWJseSBvdGhlciBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwcmVjaXNpb24gb3IgbGVuZ3RoLiAqL1xuICAgIENPTFVNTl9UWVBFOiBzdHJpbmc7XG4gICAgLyoqIGVtcHR5IC0gbm90IGluZGV4ZWQgb3IgaXMgc2Vjb25kYXJ5IGNvbHVtbiBpbiBhIG11bHRpLWNvbHVtbiBub251bmlxdWUgaW5kZXguIFBSSSAtIHBhcnQgb2YgYSBwcmltYXJ5IGtleS4gVU5JIC0gZmlyc3QgY29sdW1uIG9mIGEgdW5pcXVlIGluZGV4LiBNVUwgLSBmaXJzdCBjb2x1bW4gb2YgYSBub251bmlxdWUgaW5kZXggKi9cbiAgICBDT0xVTU5fS0VZOiBcIlwiIHwgXCJQUklcIiB8IFwiVU5JXCIgfCBcIk1VTFwiO1xuICAgIC8qKiBFeHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sdW1uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICovXG4gICAgRVhUUkE6XG4gICAgICB8IFwiXCJcbiAgICAgIHwgXCJhdXRvX2luY3JlbWVudFwiXG4gICAgICB8IFwib24gdXBkYXRlIENVUlJFTlRfVElNRVNUQU1QXCJcbiAgICAgIHwgXCJTVE9SRUQgR0VORVJBVEVEXCJcbiAgICAgIHwgXCJWSVJUVUFMIEdFTkVSQVRFRFwiXG4gICAgICB8IFwiREVGQVVMVCBHRU5FUkFURURcIjtcbiAgICAvKiogRm9yIGdlbmVyYXRlZCBjb2x1bW5zLCBkaXNwbGF5cyB0aGUgZXhwcmVzc2lvbiB1c2VkIHRvIGNvbXB1dGUgY29sdW1uIHZhbHVlcy4gRW1wdHkgZm9yIG5vbmdlbmVyYXRlZCBjb2x1bW5zLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgZ2VuZXJhdGVkIGNvbHVtbnMsIHNlZSBTZWN0aW9uIDE1LjEuMjAuOCwgXHUyMDFDQ1JFQVRFIFRBQkxFIGFuZCBHZW5lcmF0ZWQgQ29sdW1uc1x1MjAxRC4gKi9cbiAgICBHRU5FUkFUSU9OX0VYUFJFU1NJT046IHN0cmluZztcbiAgfTtcblxuICAvKiogaHR0cHM6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vOC40L2VuL2luZm9ybWF0aW9uLXNjaGVtYS10YWJsZXMtdGFibGUuaHRtbCAqL1xuICBcImluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXNcIjoge1xuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgc2NoZW1hIChkYXRhYmFzZSkgdG8gd2hpY2ggdGhlIHRhYmxlIGJlbG9uZ3MuICovXG4gICAgVEFCTEVfU0NIRU1BOiBzdHJpbmc7XG4gICAgVEFCTEVfTkFNRTogc3RyaW5nO1xuICAgIC8qKiBCQVNFIFRBQkxFIGZvciBhIHRhYmxlLCBWSUVXIGZvciBhIHZpZXcsIG9yIFNZU1RFTSBWSUVXIGZvciBhbiBJTkZPUk1BVElPTl9TQ0hFTUEgdGFibGUuICovXG4gICAgVEFCTEVfVFlQRTogXCJCQVNFIFRBQkxFXCIgfCBcIlZJRVdcIiB8IFwiU1lTVEVNIFZJRVdcIjtcbiAgfTtcblxuICAvKiogaHR0cHM6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vOC40L2VuL2luZm9ybWF0aW9uLXNjaGVtYS1rZXktY29sdW1uLXVzYWdlLXRhYmxlLmh0bWwgKi9cbiAgXCJpbmZvcm1hdGlvbl9zY2hlbWEuS0VZX0NPTFVNTl9VU0FHRVwiOiB7XG4gICAgQ09OU1RSQUlOVF9TQ0hFTUE6IHN0cmluZztcbiAgICBDT05TVFJBSU5UX05BTUU6IHN0cmluZztcbiAgICBUQUJMRV9TQ0hFTUE6IHN0cmluZztcbiAgICBUQUJMRV9OQU1FOiBzdHJpbmc7XG4gICAgQ09MVU1OX05BTUU6IHN0cmluZztcbiAgICAvKiogbnVsbCAtIHdoZW4gdW5pcXVlIG9yIHByaW1hcnkga2V5IGNvbnN0cmFpbnQuIDEtbiAtIHdoZW4gZm9yZWlnbiBrZXkgY29uc3RyYWludCAqL1xuICAgIFBPU0lUSU9OX0lOX1VOSVFVRV9DT05TVFJBSU5UOiBudW1iZXIgfCBudWxsO1xuICAgIFJFRkVSRU5DRURfVEFCTEVfU0NIRU1BOiBzdHJpbmc7XG4gICAgUkVGRVJFTkNFRF9UQUJMRV9OQU1FOiBzdHJpbmc7XG4gICAgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTogc3RyaW5nO1xuICB9O1xuXG4gIC8qKiBodHRwczovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi84LjQvZW4vaW5mb3JtYXRpb24tc2NoZW1hLXRhYmxlLWNvbnN0cmFpbnRzLXRhYmxlLmh0bWwgKi9cbiAgXCJpbmZvcm1hdGlvbl9zY2hlbWEuVEFCTEVfQ09OU1RSQUlOVFNcIjoge1xuICAgIENPTlNUUkFJTlRfU0NIRU1BOiBzdHJpbmc7XG4gICAgQ09OU1RSQUlOVF9OQU1FOiBzdHJpbmc7XG4gICAgVEFCTEVfU0NIRU1BOiBzdHJpbmc7XG4gICAgVEFCTEVfTkFNRTogc3RyaW5nO1xuICAgIENPTlNUUkFJTlRfVFlQRTogXCJQUklNQVJZIEtFWVwiIHwgXCJGT1JFSUdOIEtFWVwiIHwgXCJVTklRVUVcIiB8IFwiQ0hFQ0tcIjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlc1F1ZXJ5KHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4pIHtcbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgZ2V0TXlTUUxCdWlsZGVyPERhdGFiYXNlPihyZXF1aXJlbWVudHMpXG4gICAgICAuc2VsZWN0RnJvbShcImluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgYXMgdFwiKVxuICAgICAgLndoZXJlKFwidC5UQUJMRV9TQ0hFTUFcIiwgXCI9XCIsIHNxbDxzdHJpbmc+YGRhdGFiYXNlKClgKVxuICAgICAgLndoZXJlKFwidC5UQUJMRV9UWVBFXCIsIFwiaW5cIiwgW1wiQkFTRSBUQUJMRVwiLCBcIlZJRVdcIl0pXG4gICAgICAuc2VsZWN0KFtcInQuVEFCTEVfU0NIRU1BIGFzIHNjaGVtYVwiLCBcInQuVEFCTEVfTkFNRSBhcyBuYW1lXCIsIFwidC5UQUJMRV9UWVBFIGFzIHR5cGVcIl0pXG4gICAgICAuJG5hcnJvd1R5cGU8eyB0eXBlOiBcIkJBU0UgVEFCTEVcIiB8IFwiVklFV1wiIH0+KClcbiAgICAgIC5zZWxlY3QoKGViKSA9PlxuICAgICAgICAvLyBganNvbl9hcnJheWFnZ2AgaWdub3JlcyBgb3JkZXIgYnlgIGluc2lkZSB0aGUgc3VicXVlcnksIHNvIHdlIG5lZWQgdG8gb3JkZXIgYWZ0ZXIgYWdncmVnYXRpb24uXG4gICAgICAgIGpzb25BcnJheUZyb20oXG4gICAgICAgICAgZWJcbiAgICAgICAgICAgIC5zZWxlY3RGcm9tKFwiaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgYXMgY1wiKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwiaW5mb3JtYXRpb25fc2NoZW1hLktFWV9DT0xVTU5fVVNBR0UgYXMga2N1XCIsIChqYikgPT5cbiAgICAgICAgICAgICAgamJcbiAgICAgICAgICAgICAgICAub25SZWYoXCJrY3UuVEFCTEVfU0NIRU1BXCIsIFwiPVwiLCBcImMuVEFCTEVfU0NIRU1BXCIpXG4gICAgICAgICAgICAgICAgLm9uUmVmKFwia2N1LlRBQkxFX05BTUVcIiwgXCI9XCIsIFwiYy5UQUJMRV9OQU1FXCIpXG4gICAgICAgICAgICAgICAgLm9uUmVmKFwia2N1LkNPTFVNTl9OQU1FXCIsIFwiPVwiLCBcImMuQ09MVU1OX05BTUVcIilcbiAgICAgICAgICAgICAgICAvLyBvbmx5IGdldCBmb3JlaWduIGtleSBjb25zdHJhaW50c1xuICAgICAgICAgICAgICAgIC5vbihcImtjdS5QT1NJVElPTl9JTl9VTklRVUVfQ09OU1RSQUlOVFwiLCBcImlzIG5vdFwiLCBudWxsKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC53aGVyZVJlZihcImMuVEFCTEVfU0NIRU1BXCIsIFwiPVwiLCBcInQuVEFCTEVfU0NIRU1BXCIpXG4gICAgICAgICAgICAud2hlcmVSZWYoXCJjLlRBQkxFX05BTUVcIiwgXCI9XCIsIFwidC5UQUJMRV9OQU1FXCIpXG4gICAgICAgICAgICAuc2VsZWN0KFtcbiAgICAgICAgICAgICAgXCJjLkNPTFVNTl9OQU1FIGFzIG5hbWVcIixcbiAgICAgICAgICAgICAgXCJjLkNPTFVNTl9UWVBFIGFzIGRhdGF0eXBlXCIsXG4gICAgICAgICAgICAgIFwiYy5PUkRJTkFMX1BPU0lUSU9OIGFzIHBvc2l0aW9uXCIsXG4gICAgICAgICAgICAgIFwia2N1LlJFRkVSRU5DRURfVEFCTEVfTkFNRSBhcyBma190YWJsZVwiLFxuICAgICAgICAgICAgICBcImtjdS5SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FIGFzIGZrX2NvbHVtblwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICAgICAgICAgIGViKFwiYy5FWFRSQVwiLCBcIj1cIiwgXCJhdXRvX2luY3JlbWVudFwiKS5hcyhcImF1dG9pbmNyZW1lbnRcIiksXG4gICAgICAgICAgICAgIGViKFwiYy5FWFRSQVwiLCBcImluXCIsIFtcIm9uIHVwZGF0ZSBDVVJSRU5UX1RJTUVTVEFNUFwiLCBcIlNUT1JFRCBHRU5FUkFURURcIiwgXCJWSVJUVUFMIEdFTkVSQVRFRFwiXSkuYXMoXG4gICAgICAgICAgICAgICAgXCJjb21wdXRlZFwiLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBlYihcImMuQ09MVU1OX0tFWVwiLCBcIj1cIiwgXCJQUklcIikuYXMoXCJwa1wiKSxcbiAgICAgICAgICAgICAgZWIoXCJjLklTX05VTExBQkxFXCIsIFwiPVwiLCBcIllFU1wiKS5hcyhcIm51bGxhYmxlXCIpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICkuYXMoXCJjb2x1bW5zXCIpLFxuICAgICAgKVxuICAgICAgLm9yZGVyQnkoXCJ0LlRBQkxFX1NDSEVNQVwiKVxuICAgICAgLm9yZGVyQnkoXCJ0LlRBQkxFX05BTUVcIilcbiAgICAgIC5vcmRlckJ5KFwidC5UQUJMRV9UWVBFXCIpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RhYmxlc1F1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDEsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiaW50XCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogMCxcbiAgICAgICAgICBwazogMSxcbiAgICAgICAgICBwb3NpdGlvbjogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiYmluYXJ5KDE2KVwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcInV1aWRcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogMCxcbiAgICAgICAgICBwb3NpdGlvbjogMixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidmFyY2hhcigyNTUpXCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiAwLFxuICAgICAgICAgIHBvc2l0aW9uOiAzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luY3JlbWVudDogMCxcbiAgICAgICAgICBjb21wdXRlZDogMSxcbiAgICAgICAgICBkYXRhdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRfbmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiAwLFxuICAgICAgICAgIHBvc2l0aW9uOiA0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG5hbWU6IFwiYW5pbWFsc1wiLFxuICAgICAgc2NoZW1hOiBcInN0dWRpb1wiLFxuICAgICAgdHlwZTogXCJCQVNFIFRBQkxFXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAxLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDAsXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgICAgcG9zaXRpb246IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogMCxcbiAgICAgICAgICBwb3NpdGlvbjogMixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiZW51bSgnYWRtaW4nLCdtYWludGFpbmVyJywnbWVtYmVyJylcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJyb2xlXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDAsXG4gICAgICAgICAgcGs6IDAsXG4gICAgICAgICAgcG9zaXRpb246IDMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogXCJpZFwiLFxuICAgICAgICAgIGZrX3RhYmxlOiBcImFuaW1hbHNcIixcbiAgICAgICAgICBuYW1lOiBcImFuaW1hbF9pZFwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiAwLFxuICAgICAgICAgIHBvc2l0aW9uOiA0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG5hbWU6IFwidXNlcnNcIixcbiAgICAgIHNjaGVtYTogXCJzdHVkaW9cIixcbiAgICAgIHR5cGU6IFwiQkFTRSBUQUJMRVwiLFxuICAgIH0sXG4gIF0gYXMgY29uc3Qgc2F0aXNmaWVzIFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lem9uZVF1ZXJ5KHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4pIHtcbiAgY29uc3QgYnVpbGRlciA9IGdldE15U1FMQnVpbGRlcihyZXF1aXJlbWVudHMpO1xuXG4gIGNvbnN0IHNlc3Npb25UeiA9IHNxbDxcIlNZU1RFTVwiIHwgKHN0cmluZyAmIHt9KT5gQEBzZXNzaW9uLnRpbWVfem9uZWA7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLnNlbGVjdE5vRnJvbShcbiAgICAgICAgYnVpbGRlclxuICAgICAgICAgIC5jYXNlKClcbiAgICAgICAgICAud2hlbihzZXNzaW9uVHosIFwiPVwiLCBcIlNZU1RFTVwiKVxuICAgICAgICAgIC50aGVuKHNxbDxzdHJpbmc+YEBAc3lzdGVtX3RpbWVfem9uZWApXG4gICAgICAgICAgLmVsc2Uoc2Vzc2lvblR6KVxuICAgICAgICAgIC5lbmQoKVxuICAgICAgICAgIC5hcyhcInRpbWV6b25lXCIpLFxuICAgICAgKVxuICAgICAgLiRuYXJyb3dUeXBlPHsgdGltZXpvbmU6IHN0cmluZyB9PigpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RpbWV6b25lUXVlcnkoKSB7XG4gIHJldHVybiBbeyB0aW1lem9uZTogXCJVVENcIiB9XSBhcyBjb25zdCBzYXRpc2ZpZXMgUXVlcnlSZXN1bHQ8dHlwZW9mIGdldFRpbWV6b25lUXVlcnk+O1xufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRGVsZXRlUmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJFcnJvcixcbiAgdHlwZSBBZGFwdGVySW5zZXJ0UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJRdWVyeVJlc3VsdCxcbiAgdHlwZSBBZGFwdGVyUmVxdWlyZW1lbnRzLFxuICB0eXBlIEFkYXB0ZXJVcGRhdGVSZXN1bHQsXG4gIHR5cGUgQ29sdW1uLFxuICBjcmVhdGVBZGFwdGVyRXJyb3IsXG4gIHR5cGUgRmlsdGVyT3BlcmF0b3IsXG4gIHR5cGUgVGFibGUsXG59IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlcXVlbmNlRXhlY3V0b3IgfSBmcm9tIFwiLi4vZXhlY3V0b3JcIjtcbmltcG9ydCB7IGluZmVyRmlsdGVyT2JqZWN0LCB0eXBlIFF1ZXJ5LCB0eXBlIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEVpdGhlciB9IGZyb20gXCIuLi90eXBlLXV0aWxzXCI7XG5pbXBvcnQgeyBNWVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBIH0gZnJvbSBcIi4vZGF0YXR5cGVcIjtcbmltcG9ydCB7XG4gIGdldERlbGV0ZVF1ZXJ5LFxuICBnZXRJbnNlcnRRdWVyeSxcbiAgZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5LFxuICBnZXRTZWxlY3RRdWVyeSxcbiAgZ2V0VXBkYXRlUXVlcnksXG4gIGdldFVwZGF0ZVJlZmV0Y2hRdWVyeSxcbn0gZnJvbSBcIi4vZG1sXCI7XG5pbXBvcnQgeyBnZXRUYWJsZXNRdWVyeSwgZ2V0VGltZXpvbmVRdWVyeSwgbW9ja1RhYmxlc1F1ZXJ5LCBtb2NrVGltZXpvbmVRdWVyeSB9IGZyb20gXCIuL2ludHJvc3BlY3Rpb25cIjtcblxuZXhwb3J0IHR5cGUgTXlTUUxBZGFwdGVyUmVxdWlyZW1lbnRzID0gT21pdDxBZGFwdGVyUmVxdWlyZW1lbnRzLCBcImV4ZWN1dG9yXCI+ICYge1xuICBleGVjdXRvcjogU2VxdWVuY2VFeGVjdXRvcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNeVNRTEFkYXB0ZXIocmVxdWlyZW1lbnRzOiBNeVNRTEFkYXB0ZXJSZXF1aXJlbWVudHMpOiBBZGFwdGVyIHtcbiAgY29uc3QgeyBleGVjdXRvciwgLi4ub3RoZXJSZXF1aXJlbWVudHMgfSA9IHJlcXVpcmVtZW50cztcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGRlbGV0ZShkZXRhaWxzLCBvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyRGVsZXRlUmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXREZWxldGVRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgLi4uZGV0YWlscywgcXVlcnkgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBpbnNlcnQoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckluc2VydFJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgcm93cywgdGFibGUgfSA9IGRldGFpbHM7XG4gICAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gdGFibGU7XG5cbiAgICAgICAgY29uc3QgYXV0b2luY3JlbWVudENvbHVtbjogQ29sdW1uIHwgdW5kZWZpbmVkID0gT2JqZWN0LnZhbHVlcyhjb2x1bW5zKS5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5pc0F1dG9pbmNyZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlck9iamVjdHMgPSByb3dzLm1hcCgocm93KSA9PiBpbmZlckZpbHRlck9iamVjdChyb3csIGNvbHVtbnMpKTtcblxuICAgICAgICBjb25zdCBoYXNQYXJ0aWFsRmlsdGVyT2JqZWN0cyA9IGZpbHRlck9iamVjdHMuc29tZSgoZmlsdGVyT2JqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXJPYmplY3QpO1xuXG4gICAgICAgICAgcmV0dXJuIGZpbHRlclZhbHVlcy5sZW5ndGggPT09IDAgfHwgZmlsdGVyVmFsdWVzLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZSA9PSBudWxsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIGNsYXNzaWMgcGFydGlhbCBmaWx0ZXIgb2JqZWN0IGNhc2VzIChlLmcuIHV1aWQpIGhlcmUgb3IgYmVmb3JlIHJlcXVlc3RpbmcgZnJvbSBhZGFwdGVyLlxuICAgICAgICBpZiAoIWF1dG9pbmNyZW1lbnRDb2x1bW4gJiYgaGFzUGFydGlhbEZpbHRlck9iamVjdHMpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHtcbiAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJDYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSBpbnNlcnRpb24sIHNvbWUgcm93cyBjYW5ub3QgYmUgcmVmZXRjaGVkIGFmdGVyIGluc2VydGlvbi5cIiksXG4gICAgICAgICAgICBxdWVyeTogZ2V0SW5zZXJ0UXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNQYXJ0aWFsRmlsdGVyT2JqZWN0cykge1xuICAgICAgICAgIGNvbnN0IGluc2VydFF1ZXJ5ID0gZ2V0SW5zZXJ0UXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuICAgICAgICAgIGNvbnN0IHJlZmV0Y2hRdWVyeSA9IGdldEluc2VydFJlZmV0Y2hRdWVyeSh7IGNyaXRlcmlhOiBmaWx0ZXJPYmplY3RzLCB0YWJsZSB9LCBvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICAgICAgY29uc3Qgc2VxdWVuY2UgPSBbaW5zZXJ0UXVlcnksIHJlZmV0Y2hRdWVyeV0gYXMgY29uc3Q7XG5cbiAgICAgICAgICBjb25zdCBbW2luc2VydEVycm9yXSwgbWF5YmVSZWZldGNoUmVzdWx0XSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGVTZXF1ZW5jZShzZXF1ZW5jZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICBjb25zdCBxdWVyeSA9IGpvaW5TZXF1ZW5jZShzZXF1ZW5jZSk7XG5cbiAgICAgICAgICBpZiAoaW5zZXJ0RXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogaW5zZXJ0RXJyb3IsIHF1ZXJ5IH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IFtyZWZldGNoRXJyb3IsIHJlZmV0Y2hSZXN1bHRzXSA9IG1heWJlUmVmZXRjaFJlc3VsdCE7XG5cbiAgICAgICAgICBpZiAocmVmZXRjaEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHtcbiAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIkZhaWxlZCB0byByZWZldGNoIGluc2VydGVkIHJvd3MgLSBwbGVhc2UgcmVmcmVzaC5cIiwgeyBjYXVzZTogcmVmZXRjaEVycm9yIH0pLFxuICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbbnVsbCwgeyByb3dzOiByZWZldGNoUmVzdWx0cywgcXVlcnkgfV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYXMgYXV0b2luY3JlbWVudCBjb2x1bW4gLSBpbnNlcnQgcm93cyBvbmUgYnkgb25lIGFuZCByZWZldGNoLCB0YWtpbmcgYWR2YW50YWdlIG9mIGBpbnNlcnRJZGAgaWYgaW5zZXJ0ZWQgcm93IGhhcyBubyB2YWx1ZSBmb3IgdGhpcyBjb2x1bW4uXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByb3dzLm1hcChhc3luYyAocm93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRRdWVyeSA9IGdldEluc2VydFF1ZXJ5KHsgcm93czogW3Jvd10sIHRhYmxlIH0sIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShpbnNlcnRRdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3IsIHF1ZXJ5OiBpbnNlcnRRdWVyeSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgeyBuYW1lOiBhdXRvaW5jcmVtZW50Q29sdW1uTmFtZSB9ID0gYXV0b2luY3JlbWVudENvbHVtbiE7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2F1dG9pbmNyZW1lbnRDb2x1bW5OYW1lXSB8fCByZXN1bHRbMF0/Lmluc2VydElkO1xuXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZGV0ZXJtaW5lIHZhbHVlIGZvciBhdXRvaW5jcmVtZW50IGNvbHVtbiB0byByZWZldGNoIGluc2VydGVkIHJvdy5cIiksXG4gICAgICAgICAgICAgICAgcXVlcnk6IGluc2VydFF1ZXJ5LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVmZXRjaFF1ZXJ5ID0gZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY3JpdGVyaWE6IFt7IFthdXRvaW5jcmVtZW50Q29sdW1uTmFtZV06IHZhbHVlIH1dLFxuICAgICAgICAgICAgICAgIHRhYmxlOiB7XG4gICAgICAgICAgICAgICAgICAuLi50YWJsZSxcbiAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBkaXJ0eSBoYWNrIHRvIG1hcmsgYXV0b2luY3JlbWVudCBjb2x1bW4gYXMgVEhFIHByaW1hcnkga2V5IGZvciByZWZldGNoaW5nLlxuICAgICAgICAgICAgICAgICAgY29sdW1uczogT2JqZWN0LnZhbHVlcyhjb2x1bW5zKS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgIChhY2MsIGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbmFtZTogY29sdW1uTmFtZSB9ID0gY29sdW1uO1xuXG4gICAgICAgICAgICAgICAgICAgICAgYWNjW2NvbHVtbk5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNJblByaW1hcnlLZXk6IGNvbHVtbk5hbWUgPT09IGF1dG9pbmNyZW1lbnRDb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7fSBhcyBUYWJsZVtcImNvbHVtbnNcIl0sXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG90aGVyUmVxdWlyZW1lbnRzLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgW3JlZmV0Y2hFcnJvciwgcmVmZXRjaFJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShyZWZldGNoUXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9IGpvaW5TZXF1ZW5jZShbaW5zZXJ0UXVlcnksIHJlZmV0Y2hRdWVyeV0pO1xuXG4gICAgICAgICAgICBpZiAocmVmZXRjaEVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWZldGNoaW5nIGluc2VydGVkIHJvdzpcIiwgcmVmZXRjaEVycm9yKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlZmV0Y2ggaW5zZXJ0ZWQgcm93IC0gcGxlYXNlIHJlZnJlc2guXCIsIHsgY2F1c2U6IHJlZmV0Y2hFcnJvciB9KSxcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtyZWZldGNoZWRSb3ddID0gcmVmZXRjaFJlc3VsdHM7XG5cbiAgICAgICAgICAgIGlmICghcmVmZXRjaGVkUm93KSB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJSZWZldGNoIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdHMgZm9yIGluc2VydGVkIHJvdy5cIiksXG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gW251bGwsIHsgcm93OiByZWZldGNoZWRSb3csIHF1ZXJ5IH1dIGFzIGNvbnN0O1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGluc2VydGVkUm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgICBsZXQgcXVlcnk6IFF1ZXJ5PHVua25vd24+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGVycm9yczogW251bWJlciwgQWRhcHRlckVycm9yXVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRdID0gcmVzdWx0c1tpXSE7XG5cbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKFtpLCBlcnJvcl0pO1xuXG4gICAgICAgICAgICBpZiAoZXJyb3IucXVlcnkpIHtcbiAgICAgICAgICAgICAgcXVlcnkgPSAhcXVlcnkgPyBlcnJvci5xdWVyeSA6IGpvaW5TZXF1ZW5jZShbcXVlcnksIGVycm9yLnF1ZXJ5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc2VydGVkUm93cy5wdXNoKHJlc3VsdC5yb3cpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LnF1ZXJ5KSB7XG4gICAgICAgICAgICAgIHF1ZXJ5ID0gIXF1ZXJ5ID8gcmVzdWx0LnF1ZXJ5IDogam9pblNlcXVlbmNlKFtxdWVyeSwgcmVzdWx0LnF1ZXJ5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICBlcnJvcjogbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgICAgICBlcnJvcnMubWFwKChbLCBlcnJvcl0pID0+IGVycm9yKSxcbiAgICAgICAgICAgICAgYFJvdyR7ZXJyb3JzLmxlbmd0aCA+IDEgPyBcInNcIiA6IFwiXCJ9ICR7ZXJyb3JzLm1hcCgoW2luZGV4XSkgPT4gaW5kZXgpLmpvaW4oXCIsIFwiKX0gY291bGQgbm90IGJlIGluc2VydGVkIG9yIHJlZmV0Y2hlZC5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgcm93czogaW5zZXJ0ZWRSb3dzLCBxdWVyeTogcXVlcnkhIH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgaW50cm9zcGVjdChvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW50cm9zcGVjdFJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhYmxlc1F1ZXJ5ID0gZ2V0VGFibGVzUXVlcnkocmVxdWlyZW1lbnRzKTtcbiAgICAgICAgY29uc3QgdGltZXpvbmVRdWVyeSA9IGdldFRpbWV6b25lUXVlcnkocmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbW3RhYmxlc0Vycm9yLCB0YWJsZXNdLCBbdGltZXpvbmVFcnJvciwgdGltZXpvbmVzXV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YWJsZXNRdWVyeSwgb3B0aW9ucyksXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0aW1lem9uZVF1ZXJ5LCBvcHRpb25zKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHRhYmxlc0Vycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiB0YWJsZXNFcnJvciwgcXVlcnk6IHRhYmxlc1F1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWV6b25lRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IHRpbWV6b25lRXJyb3IsIHF1ZXJ5OiB0aW1lem9uZVF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZXpvbmUgPSB0aW1lem9uZXNbMF0/LnRpbWV6b25lO1xuXG4gICAgICAgIGlmICghdGltZXpvbmUpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IG5ldyBFcnJvcihcIlRpbWV6b25lIG5vdCBmb3VuZFwiKSwgcXVlcnk6IHRpbWV6b25lUXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIGNyZWF0ZUludHJvc3BlY3Rpb24oeyBxdWVyeTogdGFibGVzUXVlcnksIHRhYmxlcywgdGltZXpvbmUgfSldO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcXVlcnkoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclF1ZXJ5UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRTZWxlY3RRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRzXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgZmlsdGVyZWRSb3dDb3VudDogcmVzdWx0c1swXT8uX19wc19jb3VudF9fIHx8IFwiMFwiLCByb3dzOiByZXN1bHRzLCBxdWVyeSB9XTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSBwcm9wZXJseVxuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGUoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclVwZGF0ZVJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5ID0gZ2V0VXBkYXRlUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuICAgICAgICBjb25zdCByZWZldGNoUXVlcnkgPSBnZXRVcGRhdGVSZWZldGNoUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgIGNvbnN0IFtbdXBkYXRlRXJyb3JdLCByZWZldGNoUmVzdWx0XSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGVTZXF1ZW5jZShbdXBkYXRlUXVlcnksIHJlZmV0Y2hRdWVyeV0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh1cGRhdGVFcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogdXBkYXRlRXJyb3IsIHF1ZXJ5OiB1cGRhdGVRdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtyZWZldGNoRXJyb3IsIHJlc3VsdHNdID0gcmVmZXRjaFJlc3VsdCE7XG5cbiAgICAgICAgaWYgKHJlZmV0Y2hFcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogcmVmZXRjaEVycm9yLCBxdWVyeTogdXBkYXRlUXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbcm93XSA9IHJlc3VsdHM7XG5cbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IG5ldyBFcnJvcihcIlVwZGF0ZWQgcm93IG5vdCBmb3VuZFwiKSwgcXVlcnk6IHVwZGF0ZVF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtudWxsLCB7IHJvdywgcXVlcnk6IHVwZGF0ZVF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnRyb3NwZWN0aW9uKGFyZ3M6IHtcbiAgcXVlcnk6IFF1ZXJ5O1xuICB0YWJsZXM6IFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG4gIHRpbWV6b25lOiBzdHJpbmc7XG59KTogQWRhcHRlckludHJvc3BlY3RSZXN1bHQge1xuICBjb25zdCB7IHF1ZXJ5LCB0YWJsZXMsIHRpbWV6b25lIH0gPSBhcmdzO1xuXG4gIHJldHVybiB0YWJsZXMucmVkdWNlKFxuICAgIChyZXN1bHQsIHRhYmxlKSA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYXMgfSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSA9IHRhYmxlO1xuXG4gICAgICBjb25zdCBjb2x1bW5zUmVjb3JkID0gY29sdW1uc1xuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5wb3NpdGlvbiAtIGIucG9zaXRpb24pXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGNvbHVtbnMsIGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhdHlwZSwgbmFtZTogY29sdW1uTmFtZSB9ID0gY29sdW1uO1xuXG4gICAgICAgICAgICBjb25zdCBpbmRleE9mUGFyZW50aGVzaXMgPSBkYXRhdHlwZS5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmlwcGVkRGF0YVR5cGUgPSAoaW5kZXhPZlBhcmVudGhlc2lzID4gLTEgPyBkYXRhdHlwZS5zdWJzdHJpbmcoMCwgaW5kZXhPZlBhcmVudGhlc2lzKSA6IGRhdGF0eXBlKVxuICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW5zLFxuICAgICAgICAgICAgICBbY29sdW1uTmFtZV06IHtcbiAgICAgICAgICAgICAgICBkYXRhdHlwZToge1xuICAgICAgICAgICAgICAgICAgLi4uKE1ZU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEFbc3RyaXBwZWREYXRhVHlwZV0gfHwgeyBncm91cDogXCJyYXdcIiB9KSxcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgaXNOYXRpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBzdHJpcHBlZERhdGFUeXBlLFxuICAgICAgICAgICAgICAgICAgb3B0aW9uczpcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBwZWREYXRhVHlwZSA9PT0gXCJlbnVtXCIgPyBkYXRhdHlwZS5zbGljZShgZW51bSgnYC5sZW5ndGgsIC1gJylgLmxlbmd0aCkuc3BsaXQoYCcsJ2ApIDogW10sXG4gICAgICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBma0NvbHVtbjogY29sdW1uLmZrX2NvbHVtbixcbiAgICAgICAgICAgICAgICBma1NjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgIGZrVGFibGU6IGNvbHVtbi5ma190YWJsZSxcbiAgICAgICAgICAgICAgICBpc0F1dG9pbmNyZW1lbnQ6IEJvb2xlYW4oY29sdW1uLmF1dG9pbmNyZW1lbnQpLFxuICAgICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6IEJvb2xlYW4oY29sdW1uLmNvbXB1dGVkKSxcbiAgICAgICAgICAgICAgICBpc0luUHJpbWFyeUtleTogQm9vbGVhbihjb2x1bW4ucGspLFxuICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgbnVsbGFibGU6IEJvb2xlYW4oY29sdW1uLm51bGxhYmxlKSxcbiAgICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgfSBhcyBjb25zdCBzYXRpc2ZpZXMgQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIFRhYmxlW1wiY29sdW1uc1wiXSxcbiAgICAgICAgKTtcblxuICAgICAgaWYgKHNjaGVtYXNbc2NoZW1hXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjaGVtYXNbc2NoZW1hXSA9IHsgbmFtZTogc2NoZW1hLCB0YWJsZXM6IHt9IH07XG4gICAgICB9XG5cbiAgICAgIHNjaGVtYXNbc2NoZW1hXS50YWJsZXNbdGFibGVOYW1lXSA9IHsgY29sdW1uczogY29sdW1uc1JlY29yZCwgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIHsgZmlsdGVyT3BlcmF0b3JzLCBxdWVyeSwgc2NoZW1hczoge30sIHRpbWV6b25lIH0gc2F0aXNmaWVzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0IGFzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0LFxuICApO1xufVxuXG5jb25zdCBmaWx0ZXJPcGVyYXRvcnMgPSBbXG4gIFwiPVwiLFxuICBcIiE9XCIsXG4gIFwiPlwiLFxuICBcIj49XCIsXG4gIFwiPFwiLFxuICBcIjw9XCIsXG4gIFwiaXNcIixcbiAgXCJpcyBub3RcIixcbiAgXCJsaWtlXCIsXG4gIFwibm90IGxpa2VcIixcbl0gc2F0aXNmaWVzIEZpbHRlck9wZXJhdG9yW107XG5cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrSW50cm9zcGVjdCgpIHtcbiAgY29uc3QgdGFibGVzID0gbW9ja1RhYmxlc1F1ZXJ5KCk7XG4gIGNvbnN0IFt7IHRpbWV6b25lIH1dID0gbW9ja1RpbWV6b25lUXVlcnkoKTtcbiAgY29uc3QgcXVlcnkgPSB7IHBhcmFtZXRlcnM6IFtdLCBzcWw6IFwiPG1vY2tlZD5cIiB9IGFzIFF1ZXJ5O1xuXG4gIHJldHVybiBjcmVhdGVJbnRyb3NwZWN0aW9uKHsgdGFibGVzLCB0aW1lem9uZSwgcXVlcnkgfSkgYXMge1xuICAgIC8vIGJlc3QgZWZmb3J0LCBubyBuZWVkIGdvIG92ZXJib2FyZC5cbiAgICBzY2hlbWFzOiB7XG4gICAgICBbSyBpbiAodHlwZW9mIHRhYmxlcylbbnVtYmVyXVtcInNjaGVtYVwiXV06IHtcbiAgICAgICAgbmFtZTogSztcbiAgICAgICAgdGFibGVzOiB7XG4gICAgICAgICAgW1QgaW4gKHR5cGVvZiB0YWJsZXMpW251bWJlcl1bXCJuYW1lXCJdXTogVGFibGU7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH07XG4gICAgdGltZXpvbmU6IHR5cGVvZiB0aW1lem9uZTtcbiAgICBmaWx0ZXJPcGVyYXRvcnM6IEZpbHRlck9wZXJhdG9yW107XG4gICAgcXVlcnk6IFF1ZXJ5O1xuICB9IHNhdGlzZmllcyBBZGFwdGVySW50cm9zcGVjdFJlc3VsdDtcbn1cblxuZnVuY3Rpb24gam9pblNlcXVlbmNlKHNlcXVlbmNlOiByZWFkb25seSBbUXVlcnk8dW5rbm93bj4sIFF1ZXJ5PHVua25vd24+XSk6IFF1ZXJ5PHVua25vd24+IHtcbiAgY29uc3QgW3F1ZXJ5MCwgcXVlcnkxXSA9IHNlcXVlbmNlO1xuXG4gIHJldHVybiB7XG4gICAgcGFyYW1ldGVyczogcXVlcnkwLnBhcmFtZXRlcnMuY29uY2F0KHF1ZXJ5MS5wYXJhbWV0ZXJzKSxcbiAgICBzcWw6IGAke3F1ZXJ5MC5zcWx9O1xcbiR7cXVlcnkxLnNxbH1gLFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgUXVlcnkgfSBmcm9tIFwiLi4vcXVlcnlcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENhbmNlbFF1ZXJ5KHRocmVhZElkOiB1bmtub3duKTogUXVlcnk8dW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIHBhcmFtZXRlcnM6IFt0aHJlYWRJZF0sXG4gICAgc3FsOiBcImtpbGwgP1wiLFxuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogInViQUFBLElBQUFBLEdBQUEsR0FBQUMsR0FBQUQsR0FBQSx3QkFBQUUsR0FBQSxtQkFBQUMsR0FBQSxtQkFBQUMsR0FBQSxtQkFBQUMsR0FBQSwwQkFBQUMsR0FBQSxtQkFBQUMsR0FBQSxtQkFBQUMsR0FBQSxxQkFBQUMsR0FBQSxtQkFBQUMsR0FBQSwwQkFBQUMsR0FBQSxtQkFBQUMsR0FBQSxvQkFBQUMsR0FBQSxvQkFBQUMsR0FBQSxzQkFBQUMsS0FBQSxlQUFBQyxHQUFBaEIsSUM4VU8sU0FBU2lCLEVBQW1CQyxFQUFnRCxDQUNqRixHQUFNLENBQUUsTUFBQUMsRUFBTyxNQUFBQyxDQUFNLEVBQUlGLEVBRW5CRyxFQUFlRixFQUVyQixPQUFBRSxFQUFhLE1BQVFELEVBRWQsQ0FBQ0MsQ0FBWSxDQUN0QixDQzVVTyxTQUFTQyxFQUFZQyxFQUFLLENBQzdCLE9BQU8sT0FBT0EsRUFBUSxLQUFlQSxJQUFRLE1BQ2pELENBQ08sU0FBU0MsRUFBU0QsRUFBSyxDQUMxQixPQUFPLE9BQU9BLEdBQVEsUUFDMUIsQ0FDTyxTQUFTRSxHQUFTRixFQUFLLENBQzFCLE9BQU8sT0FBT0EsR0FBUSxRQUMxQixDQUNPLFNBQVNHLEdBQVVILEVBQUssQ0FDM0IsT0FBTyxPQUFPQSxHQUFRLFNBQzFCLENBQ08sU0FBU0ksR0FBT0osRUFBSyxDQUN4QixPQUFPQSxJ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LE9BQUFDLENBQU8sRUFFL0U1QixDQUNULEVBQ0EsQ0FBRSxnQkFBQW9DLEdBQWlCLE1BQUEvRCxFQUFPLFFBQVMsQ0FBQyxFQUFHLFNBQUE0QyxDQUFTLENBQ2xELENBQ0YsQ0FFQSxJQUFNbUIsR0FBa0IsQ0FDdEIsSUFDQSxLQUNBLElBQ0EsS0FDQSxJQUNBLEtBQ0EsS0FDQSxTQUNBLE9BQ0EsVUFDRixFQUtPLFNBQVNDLElBQWlCLENBQy9CLElBQU12QixFQUFTd0IsR0FBZ0IsRUFDekIsQ0FBQyxDQUFFLFNBQUFyQixDQUFTLENBQUMsRUFBSXNCLEdBQWtCLEVBR3pDLE9BQU9yQixHQUFvQixDQUFFLE9BQUFKLEVBQVEsU0FBQUcsRUFBVSxNQUZqQyxDQUFFLFdBQVksQ0FBQyxFQUFHLElBQUssVUFBVyxDQUVLLENBQUMsQ0FjeEQsQ0FFQSxTQUFTckIsR0FBYUgsRUFBcUUsQ0FDekYsR0FBTSxDQUFDK0MsRUFBUUMsQ0FBTSxFQUFJaEQsRUFFekIsTUFBTyxDQUNMLFdBQVkrQyxFQUFPLFdBQVcsT0FBT0MsRUFBTyxVQUFVLEVBQ3RELElBQUssR0FBR0QsRUFBTyxHQUFHO0FBQUEsRUFBTUMsRUFBTyxHQUFHLEVBQ3BDLENBQ0YsQ0N6WU8sU0FBU0MsR0FBZUMsRUFBbUMsQ0FDaEUsTUFBTyxDQUNMLFdBQVksQ0FBQ0EsQ0FBUSxFQUNyQixJQUFLLFFBQ1AsQ0FDRiIsCiAgIm5hbWVzIjogWyJteXNxbF9jb3JlX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiY3JlYXRlTXlTUUxBZGFwdGVyIiwgImdldENhbmNlbFF1ZXJ5IiwgImdldERlbGV0ZVF1ZXJ5IiwgImdldEluc2VydFF1ZXJ5IiwgImdldEluc2VydFJlZmV0Y2hRdWVyeSIsICJnZXRTZWxlY3RRdWVyeSIsICJnZXRUYWJsZXNRdWVyeSIsICJnZXRUaW1lem9uZVF1ZXJ5IiwgImdldFVwZGF0ZVF1ZXJ5IiwgImdldFVwZGF0ZVJlZmV0Y2hRdWVyeSIsICJtb2NrSW50cm9zcGVjdCIsICJtb2NrU2VsZWN0UXVlcnkiLCAibW9ja1RhYmxlc1F1ZXJ5IiwgIm1vY2tUaW1lem9uZVF1ZXJ5IiwgIl9fdG9Db21tb25KUyIsICJjcmVhdGVBZGFwdGVyRXJyb3IiLCAiYXJncyIsICJlcnJvciIsICJxdWVyeSIsICJhZGFwdGVyRXJyb3IiLCAiaXNVbmRlZmluZWQiLCAib2JqIiwgImlzU3RyaW5nIiwgImlzTnVtYmVyIiwgImlzQm9vbGVhbiIsICJpc051bGwiLCAiaXNEYXRlIiwgImlzQmlnSW50IiwgImlzRnVuY3Rpb24iLCAib2JqIiwgImlzT2JqZWN0IiwgImZyZWV6ZSIsICJvYmoiLCAiYXNBcnJheSIsICJhcmciLCAiaXNSZWFkb25seUFycmF5IiwgImlzUmVhZG9ubHlBcnJheSIsICJhcmciLCAibm9vcCIsICJvYmoiLCAiQWx0ZXJUYWJsZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGUiLCAicHJvcHMiLCAiY29sdW1uQWx0ZXJhdGlvbiIsICJJZGVudGlmaWVyTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIkNyZWF0ZUluZGV4Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIklkZW50aWZpZXJOb2RlIiwgInByb3BzIiwgImNvbHVtbnMiLCAiQ3JlYXRlU2NoZW1hTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJzY2hlbWEiLCAicGFyYW1zIiwgIklkZW50aWZpZXJOb2RlIiwgImNyZWF0ZVNjaGVtYSIsICJPTl9DT01NSVRfQUNUSU9OUyIsICJDcmVhdGVUYWJsZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGUiLCAiY3JlYXRlVGFibGUiLCAiY29sdW1uIiwgImNvbnN0cmFpbnQiLCAibW9kaWZpZXIiLCAicGFyYW1zIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImlkZW50aWZpZXIiLCAiSWRlbnRpZmllck5vZGUiLCAic2NoZW1hIiwgIkRyb3BJbmRleE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJwYXJhbXMiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiZHJvcEluZGV4IiwgInByb3BzIiwgIkRyb3BTY2hlbWFOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNjaGVtYSIsICJwYXJhbXMiLCAiSWRlbnRpZmllck5vZGUiLCAiZHJvcFNjaGVtYSIsICJEcm9wVGFibGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlIiwgInBhcmFtcyIsICJkcm9wSW5kZXgiLCAiQWxpYXNOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImFsaWFzIiwgIlRhYmxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJzY2hlbWEiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIm9iaiIsICJpc09iamVjdCIsICJpc0Z1bmN0aW9uIiwgImlzRXhwcmVzc2lvbiIsICJvYmoiLCAiaXNPYmplY3QiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgImlzQWxpYXNlZEV4cHJlc3Npb24iLCAiaXNTdHJpbmciLCAiU2VsZWN0TW9kaWZpZXJOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm1vZGlmaWVyIiwgIm9mIiwgIkFuZE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGVmdCIsICJyaWdodCIsICJPck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGVmdCIsICJyaWdodCIsICJPbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZmlsdGVyIiwgIm9uTm9kZSIsICJvcGVyYXRvciIsICJvcGVyYXRpb24iLCAiQW5kTm9kZSIsICJPck5vZGUiLCAiSm9pbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiam9pblR5cGUiLCAidGFibGUiLCAib24iLCAiT25Ob2RlIiwgImpvaW5Ob2RlIiwgIm9wZXJhdGlvbiIsICJCaW5hcnlPcGVyYXRpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImxlZnRPcGVyYW5kIiwgIm9wZXJhdG9yIiwgInJpZ2h0T3BlcmFuZCIsICJDT01QQVJJU09OX09QRVJBVE9SUyIsICJBUklUSE1FVElDX09QRVJBVE9SUyIsICJKU09OX09QRVJBVE9SUyIsICJCSU5BUllfT1BFUkFUT1JTIiwgIlVOQVJZX0ZJTFRFUl9PUEVSQVRPUlMiLCAiVU5BUllfT1BFUkFUT1JTIiwgIk9QRVJBVE9SUyIsICJPcGVyYXRvck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib3BlcmF0b3IiLCAiaXNKU09OT3BlcmF0b3IiLCAib3AiLCAiaXNTdHJpbmciLCAiSlNPTl9PUEVSQVRPUlMiLCAiQ29sdW1uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW4iLCAiSWRlbnRpZmllck5vZGUiLCAiU2VsZWN0QWxsTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJSZWZlcmVuY2VOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJ0YWJsZSIsICJTZWxlY3RBbGxOb2RlIiwgIkR5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIiwgIiNkeW5hbWljUmVmZXJlbmNlIiwgInJlZmVyZW5jZSIsICJwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAiaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlciIsICJvYmoiLCAiaXNPYmplY3QiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgImlzU3RyaW5nIiwgIk9yZGVyQnlJdGVtTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcmRlckJ5IiwgImRpcmVjdGlvbiIsICJwcm9wcyIsICJSYXdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNxbEZyYWdtZW50cyIsICJwYXJhbWV0ZXJzIiwgInNxbCIsICJjaGlsZCIsICJjaGlsZHJlbiIsICJDb2xsYXRlTm9kZSIsICJub2RlIiwgImNvbGxhdGlvbiIsICJmcmVlemUiLCAiSWRlbnRpZmllck5vZGUiLCAiT3JkZXJCeUl0ZW1CdWlsZGVyIiwgIl9PcmRlckJ5SXRlbUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJPcmRlckJ5SXRlbU5vZGUiLCAiUmF3Tm9kZSIsICJjb2xsYXRpb24iLCAiQ29sbGF0ZU5vZGUiLCAiTE9HR0VEX01FU1NBR0VTIiwgImxvZ09uY2UiLCAibWVzc2FnZSIsICJpc09yZGVyQnlEaXJlY3Rpb24iLCAidGhpbmciLCAicGFyc2VPcmRlckJ5IiwgImFyZ3MiLCAicGFyc2VPcmRlckJ5SXRlbSIsICJvcmRlckJ5IiwgImxvZ09uY2UiLCAiaXRlbSIsICJleHByIiwgIm1vZGlmaWVycyIsICJwYXJzZWRSZWYiLCAicGFyc2VPcmRlckJ5RXhwcmVzc2lvbiIsICJPcmRlckJ5SXRlbU5vZGUiLCAicGFyc2VPcmRlckJ5V2l0aE1vZGlmaWVycyIsICJpc0V4cHJlc3Npb25PckZhY3RvcnkiLCAicGFyc2VFeHByZXNzaW9uIiwgImlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAicmVmIiwgImRpcmVjdGlvbiIsICJwYXJzZVN0cmluZ1JlZmVyZW5jZSIsICJSYXdOb2RlIiwgImlzRXhwcmVzc2lvbiIsICJub2RlIiwgIk9yZGVyQnlJdGVtQnVpbGRlciIsICJKU09OUmVmZXJlbmNlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJyZWZlcmVuY2UiLCAidHJhdmVyc2FsIiwgIkpTT05PcGVyYXRvckNoYWluTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcGVyYXRvciIsICJ2YWx1ZSIsICJKU09OUGF0aE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaW5PcGVyYXRvciIsICJqc29uUGF0aE5vZGUiLCAicGF0aExlZyIsICJwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAiZXhwIiwgImlzU3RyaW5nIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCIsICJhcmciLCAiaXNSZWFkb25seUFycmF5IiwgIml0IiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJpc0V4cHJlc3Npb25PckZhY3RvcnkiLCAicGFyc2VFeHByZXNzaW9uIiwgInBhcnNlSlNPTlJlZmVyZW5jZSIsICJyZWYiLCAib3AiLCAicmVmZXJlbmNlTm9kZSIsICJpc0pTT05PcGVyYXRvciIsICJKU09OUmVmZXJlbmNlTm9kZSIsICJKU09OT3BlcmF0b3JDaGFpbk5vZGUiLCAiT3BlcmF0b3JOb2RlIiwgIm9wV2l0aG91dExhc3RDaGFyIiwgIkpTT05QYXRoTm9kZSIsICJDT0xVTU5fU0VQQVJBVE9SIiwgIlJlZmVyZW5jZU5vZGUiLCAiQ29sdW1uTm9kZSIsICJwYXJ0cyIsICJ0cmltIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlV2l0aFRhYmxlQW5kU2NoZW1hIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlV2l0aFRhYmxlIiwgInBhcnNlQWxpYXNlZFN0cmluZ1JlZmVyZW5jZSIsICJBTElBU19TRVBBUkFUT1IiLCAiY29sdW1uUmVmIiwgImFsaWFzIiwgIkFsaWFzTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwYXJzZUNvbHVtbk5hbWUiLCAiY29sdW1uIiwgInBhcnNlT3JkZXJlZENvbHVtbk5hbWUiLCAiT1JERVJfU0VQQVJBVE9SIiwgImNvbHVtbk5hbWUiLCAib3JkZXIiLCAiaXNPcmRlckJ5RGlyZWN0aW9uIiwgInBhcnNlT3JkZXJCeSIsICJzY2hlbWEiLCAidGFibGUiLCAiVGFibGVOb2RlIiwgInN0ciIsICJQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInZhbHVlcyIsICJWYWx1ZUxpc3ROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInZhbHVlcyIsICJWYWx1ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb25Pckxpc3QiLCAiYXJnIiwgImlzUmVhZG9ubHlBcnJheSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbkxpc3QiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAiZXhwIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJwYXJzZUV4cHJlc3Npb24iLCAiVmFsdWVOb2RlIiwgImlzU2FmZUltbWVkaWF0ZVZhbHVlIiwgInZhbHVlIiwgImlzTnVtYmVyIiwgImlzQm9vbGVhbiIsICJpc051bGwiLCAicGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUiLCAiVmFsdWVMaXN0Tm9kZSIsICJpdCIsICJQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIiwgIlBhcmVuc05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJhcmdzIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24iLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAibGVmdCIsICJvcGVyYXRvciIsICJyaWdodCIsICJpc0lzT3BlcmF0b3IiLCAibmVlZHNJc09wZXJhdG9yIiwgIkJpbmFyeU9wZXJhdGlvbk5vZGUiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uIiwgInBhcnNlT3BlcmF0b3IiLCAiVmFsdWVOb2RlIiwgInBhcnNlVmFsdWVFeHByZXNzaW9uT3JMaXN0IiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAicGFyc2VGaWx0ZXJPYmplY3QiLCAib2JqIiwgImNvbWJpbmF0b3IiLCAicGFyc2VGaWx0ZXJMaXN0IiwgInYiLCAiaXNVbmRlZmluZWQiLCAiayIsICJsaXN0IiwgIndpdGhQYXJlbnMiLCAiY29tYmluZSIsICJBbmROb2RlIiwgIk9yTm9kZSIsICJPcGVyYXRvck5vZGUiLCAibm9kZSIsICJ0b09wZXJhdGlvbk5vZGUiLCAiaSIsICJQYXJlbnNOb2RlIiwgInZhbHVlIiwgImlzTnVsbCIsICJpc0Jvb2xlYW4iLCAiaXNTdHJpbmciLCAiT1BFUkFUT1JTIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJub2RlT3JTb3VyY2UiLCAiT3JkZXJCeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaXRlbXMiLCAib3JkZXJCeSIsICJQYXJ0aXRpb25CeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaXRlbXMiLCAicGFydGl0aW9uQnkiLCAiT3Zlck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib3Zlck5vZGUiLCAiaXRlbXMiLCAiT3JkZXJCeU5vZGUiLCAiUGFydGl0aW9uQnlOb2RlIiwgIkZyb21Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImZyb21zIiwgImZyb20iLCAiR3JvdXBCeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaXRlbXMiLCAiZ3JvdXBCeSIsICJIYXZpbmdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImZpbHRlciIsICJoYXZpbmdOb2RlIiwgIm9wZXJhdG9yIiwgIm9wZXJhdGlvbiIsICJBbmROb2RlIiwgIk9yTm9kZSIsICJJbnNlcnRRdWVyeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaW50byIsICJ3aXRoTm9kZSIsICJyZXBsYWNlIiwgImluc2VydFF1ZXJ5IiwgInByb3BzIiwgIkxpc3ROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIml0ZW1zIiwgIlVwZGF0ZVF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZXMiLCAid2l0aE5vZGUiLCAiTGlzdE5vZGUiLCAidXBkYXRlUXVlcnkiLCAiZnJvbUl0ZW1zIiwgIkZyb21Ob2RlIiwgInVwZGF0ZXMiLCAibGltaXQiLCAiVXNpbmdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlcyIsICJ1c2luZyIsICJEZWxldGVRdWVyeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZnJvbUl0ZW1zIiwgIndpdGhOb2RlIiwgIkZyb21Ob2RlIiwgIml0ZW1zIiwgIlF1ZXJ5Tm9kZSIsICJkZWxldGVOb2RlIiwgImxpbWl0IiwgInRhYmxlcyIsICJVc2luZ05vZGUiLCAiV2hlcmVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImZpbHRlciIsICJ3aGVyZU5vZGUiLCAib3BlcmF0b3IiLCAib3BlcmF0aW9uIiwgIkFuZE5vZGUiLCAiT3JOb2RlIiwgIlJldHVybmluZ05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic2VsZWN0aW9ucyIsICJyZXR1cm5pbmciLCAiRXhwbGFpbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiV2hlbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uZGl0aW9uIiwgIndoZW5Ob2RlIiwgInJlc3VsdCIsICJNZXJnZVF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpbnRvIiwgIndpdGhOb2RlIiwgIm1lcmdlTm9kZSIsICJ1c2luZyIsICJ3aGVuIiwgInRoZW4iLCAiV2hlbk5vZGUiLCAiT3V0cHV0Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJzZWxlY3Rpb25zIiwgIm91dHB1dCIsICJRdWVyeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiU2VsZWN0UXVlcnlOb2RlIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJVcGRhdGVRdWVyeU5vZGUiLCAiRGVsZXRlUXVlcnlOb2RlIiwgIk1lcmdlUXVlcnlOb2RlIiwgIm1vZGlmaWVyIiwgIm9wZXJhdGlvbiIsICJXaGVyZU5vZGUiLCAiam9pbiIsICJzZWxlY3Rpb25zIiwgIlJldHVybmluZ05vZGUiLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiRXhwbGFpbk5vZGUiLCAidG9wIiwgIk91dHB1dE5vZGUiLCAiaXRlbXMiLCAiT3JkZXJCeU5vZGUiLCAiU2VsZWN0UXVlcnlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIndpdGhOb2RlIiwgImZyb21JdGVtcyIsICJGcm9tTm9kZSIsICJzZWxlY3QiLCAic2VsZWN0aW9ucyIsICJleHByZXNzaW9ucyIsICJtb2RpZmllciIsICJpdGVtcyIsICJRdWVyeU5vZGUiLCAic2VsZWN0Tm9kZSIsICJHcm91cEJ5Tm9kZSIsICJsaW1pdCIsICJvZmZzZXQiLCAiZmV0Y2giLCAib3BlcmF0aW9uIiwgIkhhdmluZ05vZGUiLCAic2V0T3BlcmF0aW9ucyIsICJKb2luQnVpbGRlciIsICJfSm9pbkJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIkpvaW5Ob2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAibGhzIiwgIm9wIiwgInJocyIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgIlJhd05vZGUiLCAiZnVuYyIsICJQYXJ0aXRpb25CeUl0ZW1Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInBhcnRpdGlvbkJ5IiwgInBhcnNlUGFydGl0aW9uQnkiLCAicGFydGl0aW9uQnkiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgIlBhcnRpdGlvbkJ5SXRlbU5vZGUiLCAiT3ZlckJ1aWxkZXIiLCAiX092ZXJCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJPdmVyTm9kZSIsICJwYXJzZU9yZGVyQnkiLCAiUXVlcnlOb2RlIiwgInBhcnRpdGlvbkJ5IiwgInBhcnNlUGFydGl0aW9uQnkiLCAiZnVuYyIsICJTZWxlY3Rpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNlbGVjdGlvbiIsICJTZWxlY3RBbGxOb2RlIiwgInRhYmxlIiwgIlJlZmVyZW5jZU5vZGUiLCAicGFyc2VTZWxlY3RBcmciLCAic2VsZWN0aW9uIiwgImlzRnVuY3Rpb24iLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAiaXNSZWFkb25seUFycmF5IiwgIml0IiwgInBhcnNlU2VsZWN0RXhwcmVzc2lvbiIsICJpc1N0cmluZyIsICJTZWxlY3Rpb25Ob2RlIiwgInBhcnNlQWxpYXNlZFN0cmluZ1JlZmVyZW5jZSIsICJpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIiwgInBhcnNlQWxpYXNlZEV4cHJlc3Npb24iLCAicGFyc2VTZWxlY3RBbGwiLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGxBcmciLCAicGFyc2VUYWJsZSIsICJWYWx1ZXNOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInZhbHVlcyIsICJEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInBhcnNlSW5zZXJ0RXhwcmVzc2lvbiIsICJhcmciLCAib2JqZWN0T3JMaXN0IiwgImlzRnVuY3Rpb24iLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAibGlzdCIsICJpc1JlYWRvbmx5QXJyYXkiLCAiZnJlZXplIiwgInBhcnNlSW5zZXJ0Q29sdW1uc0FuZFZhbHVlcyIsICJyb3dzIiwgImNvbHVtbnMiLCAicGFyc2VDb2x1bW5OYW1lc0FuZEluZGV4ZXMiLCAiQ29sdW1uTm9kZSIsICJWYWx1ZXNOb2RlIiwgInJvdyIsICJwYXJzZVJvd1ZhbHVlcyIsICJjb2xzIiwgImNvbCIsICJyb3dDb2x1bW5zIiwgInJvd1ZhbHVlcyIsICJoYXNVbmRlZmluZWRPckNvbXBsZXhDb2x1bW5zIiwgImluZGV4ZWRSb3dDb2x1bW5zIiwgImNvbHVtbklkeCIsICJpc1VuZGVmaW5lZCIsICJ2YWx1ZSIsICJpc0V4cHJlc3Npb25PckZhY3RvcnkiLCAiZGVmYXVsdFZhbHVlIiwgIkRlZmF1bHRJbnNlcnRWYWx1ZU5vZGUiLCAiVmFsdWVMaXN0Tm9kZSIsICJpdCIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIiwgIkNvbHVtblVwZGF0ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgInZhbHVlIiwgInBhcnNlVXBkYXRlIiwgImFyZ3MiLCAiQ29sdW1uVXBkYXRlTm9kZSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAicGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uIiwgInVwZGF0ZSIsICJ1cGRhdGVPYmoiLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJfIiwgInZhbHVlIiwgImtleSIsICJDb2x1bW5Ob2RlIiwgIk9uRHVwbGljYXRlS2V5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ1cGRhdGVzIiwgIkluc2VydFJlc3VsdCIsICJpbnNlcnRJZCIsICJudW1JbnNlcnRlZE9yVXBkYXRlZFJvd3MiLCAiTm9SZXN1bHRFcnJvciIsICJub2RlIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgImZuIiwgIk9uQ29uZmxpY3ROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInByb3BzIiwgIm9wZXJhdGlvbiIsICJXaGVyZU5vZGUiLCAiT25Db25mbGljdEJ1aWxkZXIiLCAiX09uQ29uZmxpY3RCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiY29sdW1uIiwgImNvbHVtbk5vZGUiLCAiQ29sdW1uTm9kZSIsICJPbkNvbmZsaWN0Tm9kZSIsICJjb2x1bW5zIiwgImNvbHVtbk5vZGVzIiwgImNvbnN0cmFpbnROYW1lIiwgIklkZW50aWZpZXJOb2RlIiwgImV4cHJlc3Npb24iLCAiYXJncyIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJPbkNvbmZsaWN0RG9Ob3RoaW5nQnVpbGRlciIsICJ1cGRhdGUiLCAiT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIiLCAicGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uIiwgImZ1bmMiLCAiX09uQ29uZmxpY3RVcGRhdGVCdWlsZGVyIiwgIlRvcE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAiaXNOdW1iZXIiLCAiaXNCaWdJbnQiLCAiaXNVbmRlZmluZWQiLCAiaXNUb3BNb2RpZmllcnMiLCAiVG9wTm9kZSIsICJPckFjdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiYWN0aW9uIiwgIkluc2VydFF1ZXJ5QnVpbGRlciIsICJfSW5zZXJ0UXVlcnlCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiaW5zZXJ0IiwgImNvbHVtbnMiLCAidmFsdWVzIiwgInBhcnNlSW5zZXJ0RXhwcmVzc2lvbiIsICJJbnNlcnRRdWVyeU5vZGUiLCAiQ29sdW1uTm9kZSIsICJleHByZXNzaW9uIiwgInBhcnNlRXhwcmVzc2lvbiIsICJtb2RpZmllciIsICJRdWVyeU5vZGUiLCAiT3JBY3Rpb25Ob2RlIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJjYWxsYmFjayIsICJPbkNvbmZsaWN0QnVpbGRlciIsICJPbkNvbmZsaWN0Tm9kZSIsICJ1cGRhdGUiLCAiT25EdXBsaWNhdGVLZXlOb2RlIiwgInBhcnNlVXBkYXRlT2JqZWN0RXhwcmVzc2lvbiIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAicGFyc2VTZWxlY3RBbGwiLCAiYXJncyIsICJ0YWJsZSIsICJmdW5jIiwgImNvbmRpdGlvbiIsICJwbHVnaW4iLCAiY29tcGlsZWRRdWVyeSIsICJyZXN1bHQiLCAiYWRhcHRlciIsICJxdWVyeSIsICJJbnNlcnRSZXN1bHQiLCAiZXJyb3JDb25zdHJ1Y3RvciIsICJOb1Jlc3VsdEVycm9yIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgImNodW5rU2l6ZSIsICJzdHJlYW0iLCAiaXRlbSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJEZWxldGVSZXN1bHQiLCAibnVtRGVsZXRlZFJvd3MiLCAiTGltaXROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImxpbWl0IiwgIkRlbGV0ZVF1ZXJ5QnVpbGRlciIsICJfRGVsZXRlUXVlcnlCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJRdWVyeU5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJsaHMiLCAib3AiLCAicmhzIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAidGFibGVzIiwgIkRlbGV0ZVF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICIjam9pbiIsICJqb2luVHlwZSIsICJwYXJzZUpvaW4iLCAic2VsZWN0aW9uIiwgInBhcnNlU2VsZWN0QXJnIiwgInRhYmxlIiwgInBhcnNlU2VsZWN0QWxsIiwgInBhcnNlT3JkZXJCeSIsICJsaW1pdCIsICJMaW1pdE5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAibW9kaWZpZXIiLCAiZnVuYyIsICJjb25kaXRpb24iLCAicGx1Z2luIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImFkYXB0ZXIiLCAicXVlcnkiLCAiRGVsZXRlUmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJjaHVua1NpemUiLCAic3RyZWFtIiwgIml0ZW0iLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiVXBkYXRlUmVzdWx0IiwgIm51bVVwZGF0ZWRSb3dzIiwgIm51bUNoYW5nZWRSb3dzIiwgIlVwZGF0ZVF1ZXJ5QnVpbGRlciIsICJfVXBkYXRlUXVlcnlCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJRdWVyeU5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJsaHMiLCAib3AiLCAicmhzIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAiZnJvbSIsICJVcGRhdGVRdWVyeU5vZGUiLCAicGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QiLCAiI2pvaW4iLCAiam9pblR5cGUiLCAicGFyc2VKb2luIiwgInBhcnNlT3JkZXJCeSIsICJsaW1pdCIsICJMaW1pdE5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAicGFyc2VVcGRhdGUiLCAic2VsZWN0aW9uIiwgInBhcnNlU2VsZWN0QXJnIiwgInRhYmxlIiwgInBhcnNlU2VsZWN0QWxsIiwgIm1vZGlmaWVyIiwgImZ1bmMiLCAiY29uZGl0aW9uIiwgInBsdWdpbiIsICJjb21waWxlZFF1ZXJ5IiwgInJlc3VsdCIsICJhZGFwdGVyIiwgInF1ZXJ5IiwgIlVwZGF0ZVJlc3VsdCIsICJlcnJvckNvbnN0cnVjdG9yIiwgIk5vUmVzdWx0RXJyb3IiLCAiaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IiLCAiY2h1bmtTaXplIiwgInN0cmVhbSIsICJpdGVtIiwgImZvcm1hdCIsICJvcHRpb25zIiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlTmFtZSIsICJjb2x1bW5OYW1lcyIsICJUYWJsZU5vZGUiLCAiQ29sdW1uTm9kZSIsICJDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiZXhwcmVzc2lvbiIsICJwcm9wcyIsICJDVEVCdWlsZGVyIiwgIl9DVEVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZSIsICJwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbiIsICJuYW1lT3JCdWlsZGVyQ2FsbGJhY2siLCAiZXhwcmVzc2lvbiIsICJleHByZXNzaW9uTm9kZSIsICJjcmVhdGVRdWVyeUNyZWF0b3IiLCAiaXNGdW5jdGlvbiIsICJjdGVCdWlsZGVyRmFjdG9yeSIsICJDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIiwgInBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZSIsICJuYW1lIiwgIkNURUJ1aWxkZXIiLCAicGFydHMiLCAidGFibGUiLCAiY29sdW1ucyIsICJpdCIsICJDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZSIsICJXaXRoTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJleHByZXNzaW9uIiwgInBhcmFtcyIsICJ3aXRoTm9kZSIsICJDSEFSUyIsICJyYW5kb21TdHJpbmciLCAibGVuZ3RoIiwgImNoYXJzIiwgImkiLCAicmFuZG9tQ2hhciIsICJjcmVhdGVRdWVyeUlkIiwgIkxhenlRdWVyeUlkIiwgIiNxdWVyeUlkIiwgInJhbmRvbVN0cmluZyIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAiI3RyYW5zZm9ybWVycyIsICJmcmVlemUiLCAibm9kZSIsICJxdWVyeUlkIiwgIm91dCIsICJsaXN0IiwgIl9xdWVyeUlkIiwgIlJPT1RfT1BFUkFUSU9OX05PREVTIiwgImZyZWV6ZSIsICJTQ0hFTUFMRVNTX0ZVTkNUSU9OUyIsICJXaXRoU2NoZW1hVHJhbnNmb3JtZXIiLCAiT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIiwgIiNzY2hlbWEiLCAiI3NjaGVtYWJsZUlkcyIsICIjY3RlcyIsICJzY2hlbWEiLCAibm9kZSIsICJxdWVyeUlkIiwgIiNpc1Jvb3RPcGVyYXRpb25Ob2RlIiwgImN0ZXMiLCAiI2NvbGxlY3RDVEVzIiwgImN0ZSIsICJ0YWJsZXMiLCAiI2NvbGxlY3RTY2hlbWFibGVJZHMiLCAidGFibGUiLCAidHJhbnNmb3JtZWQiLCAiSWRlbnRpZmllck5vZGUiLCAiVGFibGVOb2RlIiwgIiN0cmFuc2Zvcm1UYWJsZUFyZ3NXaXRob3V0U2NoZW1hcyIsICJhcmdzS2V5IiwgImFyZyIsICJzY2hlbWFibGVJZHMiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiI2NvbGxlY3RTY2hlbWFibGVJZCIsICJmcm9tIiwgIiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwciIsICJqb2luIiwgIkpvaW5Ob2RlIiwgIiNjb2xsZWN0Q1RFSWRzIiwgIkFsaWFzTm9kZSIsICJMaXN0Tm9kZSIsICJpZCIsICJleHByIiwgImN0ZUlkIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiI3RyYW5zZm9ybWVyIiwgInNjaGVtYSIsICJXaXRoU2NoZW1hVHJhbnNmb3JtZXIiLCAiYXJncyIsICJNYXRjaGVkTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJub3QiLCAiYnlTb3VyY2UiLCAicGFyc2VNZXJnZVdoZW4iLCAidHlwZSIsICJhcmdzIiwgInJlZlJpZ2h0IiwgIldoZW5Ob2RlIiwgInBhcnNlRmlsdGVyTGlzdCIsICJNYXRjaGVkTm9kZSIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAicGFyc2VNZXJnZVRoZW4iLCAicmVzdWx0IiwgImlzU3RyaW5nIiwgIlJhd05vZGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIkRlZmVycmVkIiwgIiNwcm9taXNlIiwgIiNyZXNvbHZlIiwgIiNyZWplY3QiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAidmFsdWUiLCAicmVhc29uIiwgInByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbiIsICJjb25uZWN0aW9uUHJvdmlkZXIiLCAiY29ubmVjdGlvbkRlZmVyIiwgIkRlZmVycmVkIiwgImNvbm5lY3Rpb25SZWxlYXNlRGVmZXIiLCAiY29ubmVjdGlvbiIsICJleCIsICJmcmVlemUiLCAiTk9fUExVR0lOUyIsICJmcmVlemUiLCAiUXVlcnlFeGVjdXRvckJhc2UiLCAiI3BsdWdpbnMiLCAicGx1Z2lucyIsICJub2RlIiwgInF1ZXJ5SWQiLCAicGx1Z2luIiwgInRyYW5zZm9ybWVkTm9kZSIsICJjb21waWxlZFF1ZXJ5IiwgImNvbm5lY3Rpb24iLCAicmVzdWx0IiwgImxvZ09uY2UiLCAiI3RyYW5zZm9ybVJlc3VsdCIsICJjaHVua1NpemUiLCAicmVsZWFzZSIsICJwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24iLCAiTm9vcFF1ZXJ5RXhlY3V0b3IiLCAiX05vb3BRdWVyeUV4ZWN1dG9yIiwgIlF1ZXJ5RXhlY3V0b3JCYXNlIiwgInBsdWdpbiIsICJwbHVnaW5zIiwgIk5PT1BfUVVFUllfRVhFQ1VUT1IiLCAiTWVyZ2VSZXN1bHQiLCAibnVtQ2hhbmdlZFJvd3MiLCAiTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiX01lcmdlUXVlcnlCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAibW9kaWZpZXIiLCAiUXVlcnlOb2RlIiwgImV4cHJlc3Npb24iLCAibW9kaWZpZXJzIiwgInBhcnNlVG9wIiwgImFyZ3MiLCAiV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiTWVyZ2VRdWVyeU5vZGUiLCAicGFyc2VKb2luIiwgInBhcnNlU2VsZWN0QXJnIiwgInRhYmxlIiwgInBhcnNlU2VsZWN0QWxsIiwgIl9XaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlciIsICIjd2hlbk1hdGNoZWQiLCAibGhzIiwgIm9wIiwgInJocyIsICJyZWZSaWdodCIsICJNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlciIsICJwYXJzZU1lcmdlV2hlbiIsICIjd2hlbk5vdE1hdGNoZWQiLCAiYnlTb3VyY2UiLCAiQnVpbGRlciIsICJOb3RNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlciIsICJmdW5jIiwgImNvbmRpdGlvbiIsICJjb21waWxlZFF1ZXJ5IiwgInJlc3VsdCIsICJhZGFwdGVyIiwgInF1ZXJ5IiwgIk1lcmdlUmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJwYXJzZU1lcmdlVGhlbiIsICJzZXQiLCAiVXBkYXRlUXVlcnlCdWlsZGVyIiwgIk5PT1BfUVVFUllfRVhFQ1VUT1IiLCAiVXBkYXRlUXVlcnlOb2RlIiwgInViIiwgImluc2VydCIsICJjb2x1bW5zIiwgInZhbHVlcyIsICJwYXJzZUluc2VydEV4cHJlc3Npb24iLCAiSW5zZXJ0UXVlcnlOb2RlIiwgIlF1ZXJ5Q3JlYXRvciIsICJfUXVlcnlDcmVhdG9yIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiZnJvbSIsICJjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIiLCAiY3JlYXRlUXVlcnlJZCIsICJTZWxlY3RRdWVyeU5vZGUiLCAicGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QiLCAic2VsZWN0aW9uIiwgInBhcnNlU2VsZWN0QXJnIiwgInRhYmxlIiwgIkluc2VydFF1ZXJ5QnVpbGRlciIsICJJbnNlcnRRdWVyeU5vZGUiLCAicGFyc2VUYWJsZSIsICJEZWxldGVRdWVyeUJ1aWxkZXIiLCAiRGVsZXRlUXVlcnlOb2RlIiwgInRhYmxlcyIsICJVcGRhdGVRdWVyeUJ1aWxkZXIiLCAiVXBkYXRlUXVlcnlOb2RlIiwgInRhcmdldFRhYmxlIiwgIk1lcmdlUXVlcnlCdWlsZGVyIiwgIk1lcmdlUXVlcnlOb2RlIiwgInBhcnNlQWxpYXNlZFRhYmxlIiwgIm5hbWVPckJ1aWxkZXIiLCAiZXhwcmVzc2lvbiIsICJjdGUiLCAicGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb24iLCAiV2l0aE5vZGUiLCAicGx1Z2luIiwgInNjaGVtYSIsICJXaXRoU2NoZW1hUGx1Z2luIiwgImNyZWF0ZVF1ZXJ5Q3JlYXRvciIsICJRdWVyeUNyZWF0b3IiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJjcmVhdGVKb2luQnVpbGRlciIsICJqb2luVHlwZSIsICJ0YWJsZSIsICJKb2luQnVpbGRlciIsICJKb2luTm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbiIsICJjcmVhdGVPdmVyQnVpbGRlciIsICJPdmVyQnVpbGRlciIsICJPdmVyTm9kZSIsICJwYXJzZUpvaW4iLCAiam9pblR5cGUiLCAiYXJncyIsICJwYXJzZVNpbmdsZU9uSm9pbiIsICJwYXJzZUNhbGxiYWNrSm9pbiIsICJwYXJzZU9ubGVzc0pvaW4iLCAiZnJvbSIsICJjYWxsYmFjayIsICJjcmVhdGVKb2luQnVpbGRlciIsICJsaHNDb2x1bW4iLCAicmhzQ29sdW1uIiwgIkpvaW5Ob2RlIiwgInBhcnNlVGFibGVFeHByZXNzaW9uIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiT2Zmc2V0Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvZmZzZXQiLCAiR3JvdXBCeUl0ZW1Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImdyb3VwQnkiLCAicGFyc2VHcm91cEJ5IiwgImdyb3VwQnkiLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QiLCAiR3JvdXBCeUl0ZW1Ob2RlIiwgIlNldE9wZXJhdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib3BlcmF0b3IiLCAiZXhwcmVzc2lvbiIsICJhbGwiLCAicGFyc2VTZXRPcGVyYXRpb25zIiwgIm9wZXJhdG9yIiwgImV4cHJlc3Npb24iLCAiYWxsIiwgImlzRnVuY3Rpb24iLCAiY3JlYXRlRXhwcmVzc2lvbkJ1aWxkZXIiLCAiaXNSZWFkb25seUFycmF5IiwgImV4cHIiLCAiU2V0T3BlcmF0aW9uTm9kZSIsICJwYXJzZUV4cHJlc3Npb24iLCAiRXhwcmVzc2lvbldyYXBwZXIiLCAiX0V4cHJlc3Npb25XcmFwcGVyIiwgIiNub2RlIiwgIm5vZGUiLCAiYWxpYXMiLCAiQWxpYXNlZEV4cHJlc3Npb25XcmFwcGVyIiwgImFyZ3MiLCAiT3JXcmFwcGVyIiwgIk9yTm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgIkFuZFdyYXBwZXIiLCAiQW5kTm9kZSIsICIjZXhwciIsICIjYWxpYXMiLCAiZXhwciIsICJBbGlhc05vZGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIklkZW50aWZpZXJOb2RlIiwgIl9PcldyYXBwZXIiLCAiUGFyZW5zTm9kZSIsICJfQW5kV3JhcHBlciIsICJGZXRjaE5vZGUiLCAibm9kZSIsICJyb3dDb3VudCIsICJtb2RpZmllciIsICJWYWx1ZU5vZGUiLCAicGFyc2VGZXRjaCIsICJyb3dDb3VudCIsICJtb2RpZmllciIsICJpc051bWJlciIsICJpc0JpZ0ludCIsICJpc0ZldGNoTW9kaWZpZXIiLCAiRmV0Y2hOb2RlIiwgInZhbHVlIiwgIlNlbGVjdFF1ZXJ5QnVpbGRlckltcGwiLCAiX1NlbGVjdFF1ZXJ5QnVpbGRlckltcGwiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIlF1ZXJ5Tm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJTZWxlY3RRdWVyeU5vZGUiLCAic2VsZWN0aW9uIiwgInBhcnNlU2VsZWN0QXJnIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCIsICJtb2RpZmllciIsICJTZWxlY3RNb2RpZmllck5vZGUiLCAib2YiLCAiYXNBcnJheSIsICJwYXJzZVRhYmxlIiwgInRhYmxlIiwgInBhcnNlU2VsZWN0QWxsIiwgIiNqb2luIiwgImpvaW5UeXBlIiwgInBhcnNlSm9pbiIsICJwYXJzZU9yZGVyQnkiLCAiZ3JvdXBCeSIsICJwYXJzZUdyb3VwQnkiLCAibGltaXQiLCAiTGltaXROb2RlIiwgInBhcnNlVmFsdWVFeHByZXNzaW9uIiwgIm9mZnNldCIsICJPZmZzZXROb2RlIiwgInJvd0NvdW50IiwgInBhcnNlRmV0Y2giLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAicGFyc2VTZXRPcGVyYXRpb25zIiwgImFsaWFzIiwgIkFsaWFzZWRTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsIiwgImZ1bmMiLCAiY29uZGl0aW9uIiwgIkV4cHJlc3Npb25XcmFwcGVyIiwgInBsdWdpbiIsICJjb21waWxlZFF1ZXJ5IiwgInJlc3VsdCIsICJlcnJvckNvbnN0cnVjdG9yIiwgIk5vUmVzdWx0RXJyb3IiLCAiaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IiLCAiY2h1bmtTaXplIiwgInN0cmVhbSIsICJpdGVtIiwgImZvcm1hdCIsICJvcHRpb25zIiwgImNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciIsICIjcXVlcnlCdWlsZGVyIiwgIiNhbGlhcyIsICJxdWVyeUJ1aWxkZXIiLCAiQWxpYXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgIkFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJhZ2dyZWdhdGVGdW5jdGlvbiIsICJhZ2dyZWdhdGVkIiwgImFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSIsICJvcmRlckl0ZW1zIiwgIndpdGhpbkdyb3VwIiwgInByb3AiLCAiT3JkZXJCeU5vZGUiLCAiZmlsdGVyIiwgIldoZXJlTm9kZSIsICJvdmVyIiwgIkZ1bmN0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmdW5jIiwgImFyZ3MiLCAiQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIiwgIl9BZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhbGlhcyIsICJBbGlhc2VkQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIiwgIkFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSIsICJhcmdzIiwgIlF1ZXJ5Tm9kZSIsICJwYXJzZU9yZGVyQnkiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJsaHMiLCAib3AiLCAicmhzIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAib3ZlciIsICJidWlsZGVyIiwgImNyZWF0ZU92ZXJCdWlsZGVyIiwgImZ1bmMiLCAiI2FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciIsICIjYWxpYXMiLCAiYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIiwgIkFsaWFzTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJjcmVhdGVGdW5jdGlvbk1vZHVsZSIsICJmbiIsICJuYW1lIiwgImFyZ3MiLCAiRXhwcmVzc2lvbldyYXBwZXIiLCAiRnVuY3Rpb25Ob2RlIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCIsICJhZ2ciLCAiQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIiwgIkFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSIsICJjb2x1bW4iLCAidmFsdWVzIiwgInRhYmxlIiwgInBhcnNlU2VsZWN0QWxsIiwgImlzU3RyaW5nIiwgInBhcnNlVGFibGUiLCAiVW5hcnlPcGVyYXRpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9wZXJhdG9yIiwgIm9wZXJhbmQiLCAicGFyc2VVbmFyeU9wZXJhdGlvbiIsICJvcGVyYXRvciIsICJvcGVyYW5kIiwgIlVuYXJ5T3BlcmF0aW9uTm9kZSIsICJPcGVyYXRvck5vZGUiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uIiwgIkNhc2VOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInZhbHVlIiwgImNhc2VOb2RlIiwgIndoZW4iLCAidGhlbiIsICJXaGVuTm9kZSIsICJwcm9wcyIsICJDYXNlQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFyZ3MiLCAiQ2FzZVRoZW5CdWlsZGVyIiwgIkNhc2VOb2RlIiwgIldoZW5Ob2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAidmFsdWVFeHByZXNzaW9uIiwgIkNhc2VXaGVuQnVpbGRlciIsICJpc1NhZmVJbW1lZGlhdGVWYWx1ZSIsICJwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJDYXNlRW5kQnVpbGRlciIsICJFeHByZXNzaW9uV3JhcHBlciIsICJKU09OUGF0aExlZ05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidHlwZSIsICJ2YWx1ZSIsICJKU09OUGF0aEJ1aWxkZXIiLCAiI25vZGUiLCAibm9kZSIsICJpbmRleCIsICIjY3JlYXRlQnVpbGRlcldpdGhQYXRoTGVnIiwgImtleSIsICJsZWdUeXBlIiwgInZhbHVlIiwgIkpTT05SZWZlcmVuY2VOb2RlIiwgIlRyYXZlcnNlZEpTT05QYXRoQnVpbGRlciIsICJKU09OUGF0aE5vZGUiLCAiSlNPTlBhdGhMZWdOb2RlIiwgIkpTT05PcGVyYXRvckNoYWluTm9kZSIsICJWYWx1ZU5vZGUiLCAiX1RyYXZlcnNlZEpTT05QYXRoQnVpbGRlciIsICJhbGlhcyIsICJBbGlhc2VkSlNPTlBhdGhCdWlsZGVyIiwgIiNqc29uUGF0aCIsICIjYWxpYXMiLCAianNvblBhdGgiLCAiQWxpYXNOb2RlIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJJZGVudGlmaWVyTm9kZSIsICJUdXBsZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgIlNJTVBMRV9DT0xVTU5fREFUQV9UWVBFUyIsICJDT0xVTU5fREFUQV9UWVBFX1JFR0VYIiwgIkRhdGFUeXBlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJkYXRhVHlwZSIsICJpc0NvbHVtbkRhdGFUeXBlIiwgInIiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAiZGF0YVR5cGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgImlzQ29sdW1uRGF0YVR5cGUiLCAiRGF0YVR5cGVOb2RlIiwgIkNhc3ROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImV4cHJlc3Npb24iLCAiZGF0YVR5cGUiLCAiY3JlYXRlRXhwcmVzc2lvbkJ1aWxkZXIiLCAiZXhlY3V0b3IiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJiaW5hcnkiLCAibGhzIiwgIm9wIiwgInJocyIsICJFeHByZXNzaW9uV3JhcHBlciIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uIiwgInVuYXJ5IiwgImV4cHIiLCAicGFyc2VVbmFyeU9wZXJhdGlvbiIsICJlYiIsICJ0YWJsZSIsICJjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIiLCAiY3JlYXRlUXVlcnlJZCIsICJTZWxlY3RRdWVyeU5vZGUiLCAicGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QiLCAicmVmZXJlbmNlIiwgIkNhc2VCdWlsZGVyIiwgIkNhc2VOb2RlIiwgImlzVW5kZWZpbmVkIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJwYXJzZVN0cmluZ1JlZmVyZW5jZSIsICJKU09OUGF0aEJ1aWxkZXIiLCAicGFyc2VKU09OUmVmZXJlbmNlIiwgIkpTT05QYXRoTm9kZSIsICJwYXJzZVRhYmxlIiwgInZhbHVlIiwgInBhcnNlVmFsdWVFeHByZXNzaW9uIiwgInZhbHVlcyIsICJUdXBsZU5vZGUiLCAicGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUiLCAic3RhcnQiLCAiZW5kIiwgIkJpbmFyeU9wZXJhdGlvbk5vZGUiLCAiT3BlcmF0b3JOb2RlIiwgIkFuZE5vZGUiLCAiZXhwcnMiLCAiaXNSZWFkb25seUFycmF5IiwgInBhcnNlRmlsdGVyTGlzdCIsICJwYXJzZUZpbHRlck9iamVjdCIsICJhcmdzIiwgIm5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJQYXJlbnNOb2RlIiwgImRhdGFUeXBlIiwgIkNhc3ROb2RlIiwgInBhcnNlRGF0YVR5cGVFeHByZXNzaW9uIiwgInNjaGVtYSIsICJXaXRoU2NoZW1hUGx1Z2luIiwgImNyZWF0ZUZ1bmN0aW9uTW9kdWxlIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgIl8iLCAicGFyc2VFeHByZXNzaW9uIiwgImV4cCIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJwYXJzZUFsaWFzZWRFeHByZXNzaW9uIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJvYmoiLCAiaXNFeHByZXNzaW9uIiwgImlzQWxpYXNlZEV4cHJlc3Npb24iLCAiRHluYW1pY1RhYmxlQnVpbGRlciIsICIjdGFibGUiLCAidGFibGUiLCAiYWxpYXMiLCAiQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIiLCAiI2FsaWFzIiwgIkFsaWFzTm9kZSIsICJwYXJzZVRhYmxlIiwgIklkZW50aWZpZXJOb2RlIiwgImlzQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIiLCAib2JqIiwgImlzT2JqZWN0IiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJpc1N0cmluZyIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICJ0YWJsZSIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXQiLCAicGFyc2VUYWJsZUV4cHJlc3Npb24iLCAiaXNTdHJpbmciLCAicGFyc2VBbGlhc2VkVGFibGUiLCAiaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciIsICJwYXJzZUFsaWFzZWRFeHByZXNzaW9uIiwgImZyb20iLCAiQUxJQVNfU0VQQVJBVE9SIiwgImFsaWFzIiwgInRyaW0iLCAiQWxpYXNOb2RlIiwgInBhcnNlVGFibGUiLCAiSWRlbnRpZmllck5vZGUiLCAiU0NIRU1BX1NFUEFSQVRPUiIsICJzY2hlbWEiLCAiVGFibGVOb2RlIiwgInN0ciIsICJBZGRDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJDb2x1bW5EZWZpbml0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW4iLCAiZGF0YVR5cGUiLCAiQ29sdW1uTm9kZSIsICJtb2RpZmllciIsICJwcm9wcyIsICJEcm9wQ29sdW1uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW4iLCAiQ29sdW1uTm9kZSIsICJSZW5hbWVDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJuZXdDb2x1bW4iLCAiQ29sdW1uTm9kZSIsICJDaGVja0NvbnN0cmFpbnROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImV4cHJlc3Npb24iLCAiY29uc3RyYWludE5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAiT05fTU9ESUZZX0ZPUkVJR05fQUNUSU9OUyIsICJSZWZlcmVuY2VzTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZSIsICJjb2x1bW5zIiwgInJlZmVyZW5jZXMiLCAib25EZWxldGUiLCAib25VcGRhdGUiLCAicGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uIiwgInZhbHVlIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJWYWx1ZU5vZGUiLCAiR2VuZXJhdGVkTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJwYXJhbXMiLCAiZXhwcmVzc2lvbiIsICJEZWZhdWx0VmFsdWVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImRlZmF1bHRWYWx1ZSIsICJwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbiIsICJhY3Rpb24iLCAiT05fTU9ESUZZX0ZPUkVJR05fQUNUSU9OUyIsICJDb2x1bW5EZWZpbml0aW9uQnVpbGRlciIsICJfQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIiLCAiI25vZGUiLCAibm9kZSIsICJDb2x1bW5EZWZpbml0aW9uTm9kZSIsICJyZWYiLCAicmVmZXJlbmNlcyIsICJwYXJzZVN0cmluZ1JlZmVyZW5jZSIsICJTZWxlY3RBbGxOb2RlIiwgIlJlZmVyZW5jZXNOb2RlIiwgIm9uRGVsZXRlIiwgInBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIiwgIm9uVXBkYXRlIiwgInZhbHVlIiwgIkRlZmF1bHRWYWx1ZU5vZGUiLCAicGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uIiwgImV4cHJlc3Npb24iLCAiQ2hlY2tDb25zdHJhaW50Tm9kZSIsICJHZW5lcmF0ZWROb2RlIiwgIm1vZGlmaWVyIiwgImZ1bmMiLCAiTW9kaWZ5Q29sdW1uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW4iLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNvdXJjZUNvbHVtbnMiLCAidGFyZ2V0VGFibGUiLCAidGFyZ2V0Q29sdW1ucyIsICJjb25zdHJhaW50TmFtZSIsICJSZWZlcmVuY2VzTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiX0ZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgIm9uRGVsZXRlIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSIsICJwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbiIsICJvblVwZGF0ZSIsICJmdW5jIiwgIkFkZENvbnN0cmFpbnROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbnN0cmFpbnQiLCAiVW5pcXVlQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1ucyIsICJjb25zdHJhaW50TmFtZSIsICJudWxsc05vdERpc3RpbmN0IiwgIkNvbHVtbk5vZGUiLCAiSWRlbnRpZmllck5vZGUiLCAicHJvcHMiLCAiRHJvcENvbnN0cmFpbnROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbnN0cmFpbnROYW1lIiwgIklkZW50aWZpZXJOb2RlIiwgImRyb3BDb25zdHJhaW50IiwgInByb3BzIiwgIkFsdGVyQ29sdW1uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW4iLCAicHJvcCIsICJ2YWx1ZSIsICJDb2x1bW5Ob2RlIiwgIkFsdGVyQ29sdW1uQnVpbGRlciIsICIjY29sdW1uIiwgImNvbHVtbiIsICJkYXRhVHlwZSIsICJBbHRlcmVkQ29sdW1uQnVpbGRlciIsICJBbHRlckNvbHVtbk5vZGUiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAidmFsdWUiLCAicGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uIiwgImZ1bmMiLCAiI2FsdGVyQ29sdW1uTm9kZSIsICJhbHRlckNvbHVtbk5vZGUiLCAiQWx0ZXJUYWJsZUV4ZWN1dG9yIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJfQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIm9uRGVsZXRlIiwgIm9uVXBkYXRlIiwgImZ1bmMiLCAiQWx0ZXJUYWJsZU5vZGUiLCAiQWRkQ29uc3RyYWludE5vZGUiLCAiQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlciIsICJfQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkFsdGVyVGFibGVOb2RlIiwgIkRyb3BDb25zdHJhaW50Tm9kZSIsICJmdW5jIiwgIlByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW5zIiwgImNvbnN0cmFpbnROYW1lIiwgIkNvbHVtbk5vZGUiLCAiSWRlbnRpZmllck5vZGUiLCAicHJvcHMiLCAiQWRkSW5kZXhOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAicHJvcHMiLCAiY29sdW1ucyIsICJBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyIiwgIl9BbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQWx0ZXJUYWJsZU5vZGUiLCAiQWRkSW5kZXhOb2RlIiwgImNvbHVtbiIsICJwYXJzZU9yZGVyZWRDb2x1bW5OYW1lIiwgImNvbHVtbnMiLCAiZXhwcmVzc2lvbiIsICJpbmRleFR5cGUiLCAiUmF3Tm9kZSIsICJmdW5jIiwgIlVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciIsICJfVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAiVW5pcXVlQ29uc3RyYWludE5vZGUiLCAiZnVuYyIsICJQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiX1ByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgIlByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSIsICJmdW5jIiwgIkNoZWNrQ29uc3RyYWludEJ1aWxkZXIiLCAiI25vZGUiLCAibm9kZSIsICJmdW5jIiwgIlJlbmFtZUNvbnN0cmFpbnROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9sZE5hbWUiLCAibmV3TmFtZSIsICJJZGVudGlmaWVyTm9kZSIsICJBbHRlclRhYmxlQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIm5ld1RhYmxlTmFtZSIsICJBbHRlclRhYmxlRXhlY3V0b3IiLCAiQWx0ZXJUYWJsZU5vZGUiLCAicGFyc2VUYWJsZSIsICJuZXdTY2hlbWEiLCAiSWRlbnRpZmllck5vZGUiLCAiY29sdW1uIiwgImFsdGVyYXRpb24iLCAiYnVpbGRlciIsICJBbHRlckNvbHVtbkJ1aWxkZXIiLCAiQWx0ZXJUYWJsZUNvbHVtbkFsdGVyaW5nQnVpbGRlciIsICJEcm9wQ29sdW1uTm9kZSIsICJuZXdDb2x1bW4iLCAiUmVuYW1lQ29sdW1uTm9kZSIsICJjb2x1bW5OYW1lIiwgImRhdGFUeXBlIiwgImJ1aWxkIiwgIm5vb3AiLCAiQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIiLCAiQ29sdW1uRGVmaW5pdGlvbk5vZGUiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAiQWRkQ29sdW1uTm9kZSIsICJNb2RpZnlDb2x1bW5Ob2RlIiwgImNvbnN0cmFpbnROYW1lIiwgImNvbHVtbnMiLCAidW5pcXVlQ29uc3RyYWludEJ1aWxkZXIiLCAiVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIiwgIlVuaXF1ZUNvbnN0cmFpbnROb2RlIiwgIkFkZENvbnN0cmFpbnROb2RlIiwgImNoZWNrRXhwcmVzc2lvbiIsICJjb25zdHJhaW50QnVpbGRlciIsICJDaGVja0NvbnN0cmFpbnRCdWlsZGVyIiwgIkNoZWNrQ29uc3RyYWludE5vZGUiLCAidGFyZ2V0VGFibGUiLCAidGFyZ2V0Q29sdW1ucyIsICJGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgIkNvbHVtbk5vZGUiLCAiQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgIkFsdGVyVGFibGVEcm9wQ29uc3RyYWludEJ1aWxkZXIiLCAiRHJvcENvbnN0cmFpbnROb2RlIiwgIm9sZE5hbWUiLCAibmV3TmFtZSIsICJSZW5hbWVDb25zdHJhaW50Tm9kZSIsICJpbmRleE5hbWUiLCAiQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlciIsICJBZGRJbmRleE5vZGUiLCAiRHJvcEluZGV4Tm9kZSIsICJmdW5jIiwgIl9BbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyIiwgIkltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIiLCAiT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIiwgIm5vZGUiLCAiVmFsdWVMaXN0Tm9kZSIsICJWYWx1ZU5vZGUiLCAiQ3JlYXRlSW5kZXhCdWlsZGVyIiwgIl9DcmVhdGVJbmRleEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJDcmVhdGVJbmRleE5vZGUiLCAidGFibGUiLCAicGFyc2VUYWJsZSIsICJjb2x1bW4iLCAicGFyc2VPcmRlcmVkQ29sdW1uTmFtZSIsICJjb2x1bW5zIiwgImV4cHJlc3Npb24iLCAiaW5kZXhUeXBlIiwgIlJhd05vZGUiLCAiYXJncyIsICJ0cmFuc2Zvcm1lciIsICJJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyIiwgIlF1ZXJ5Tm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImZ1bmMiLCAiQ3JlYXRlU2NoZW1hQnVpbGRlciIsICJfQ3JlYXRlU2NoZW1hQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZVNjaGVtYU5vZGUiLCAiZnVuYyIsICJwYXJzZU9uQ29tbWl0QWN0aW9uIiwgImFjdGlvbiIsICJPTl9DT01NSVRfQUNUSU9OUyIsICJDcmVhdGVUYWJsZUJ1aWxkZXIiLCAiX0NyZWF0ZVRhYmxlQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZVRhYmxlTm9kZSIsICJvbkNvbW1pdCIsICJwYXJzZU9uQ29tbWl0QWN0aW9uIiwgImNvbHVtbk5hbWUiLCAiZGF0YVR5cGUiLCAiYnVpbGQiLCAibm9vcCIsICJjb2x1bW5CdWlsZGVyIiwgIkNvbHVtbkRlZmluaXRpb25CdWlsZGVyIiwgIkNvbHVtbkRlZmluaXRpb25Ob2RlIiwgInBhcnNlRGF0YVR5cGVFeHByZXNzaW9uIiwgImNvbnN0cmFpbnROYW1lIiwgImNvbHVtbnMiLCAiY29uc3RyYWludEJ1aWxkZXIiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyIiwgIlByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSIsICJ1bmlxdWVDb25zdHJhaW50QnVpbGRlciIsICJVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIiLCAiVW5pcXVlQ29uc3RyYWludE5vZGUiLCAiY2hlY2tFeHByZXNzaW9uIiwgIkNoZWNrQ29uc3RyYWludEJ1aWxkZXIiLCAiQ2hlY2tDb25zdHJhaW50Tm9kZSIsICJ0YXJnZXRUYWJsZSIsICJ0YXJnZXRDb2x1bW5zIiwgImJ1aWxkZXIiLCAiRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSIsICJDb2x1bW5Ob2RlIiwgInBhcnNlVGFibGUiLCAibW9kaWZpZXIiLCAiZXhwcmVzc2lvbiIsICJwYXJzZUV4cHJlc3Npb24iLCAiZnVuYyIsICJEcm9wSW5kZXhCdWlsZGVyIiwgIl9Ecm9wSW5kZXhCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAidGFibGUiLCAiRHJvcEluZGV4Tm9kZSIsICJwYXJzZVRhYmxlIiwgImZ1bmMiLCAiRHJvcFNjaGVtYUJ1aWxkZXIiLCAiX0Ryb3BTY2hlbWFCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiRHJvcFNjaGVtYU5vZGUiLCAiZnVuYyIsICJEcm9wVGFibGVCdWlsZGVyIiwgIl9Ecm9wVGFibGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiRHJvcFRhYmxlTm9kZSIsICJmdW5jIiwgIkNyZWF0ZVZpZXdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiY3JlYXRlVmlldyIsICJwYXJhbXMiLCAiSW1tZWRpYXRlVmFsdWVQbHVnaW4iLCAiI3RyYW5zZm9ybWVyIiwgIkltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIiLCAiYXJncyIsICJDcmVhdGVWaWV3QnVpbGRlciIsICJfQ3JlYXRlVmlld0J1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJDcmVhdGVWaWV3Tm9kZSIsICJjb2x1bW5zIiwgInBhcnNlQ29sdW1uTmFtZSIsICJxdWVyeSIsICJxdWVyeU5vZGUiLCAiSW1tZWRpYXRlVmFsdWVQbHVnaW4iLCAiZnVuYyIsICJEcm9wVmlld05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJkcm9wVmlldyIsICJwYXJhbXMiLCAiRHJvcFZpZXdCdWlsZGVyIiwgIl9Ecm9wVmlld0J1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJEcm9wVmlld05vZGUiLCAiZnVuYyIsICJDcmVhdGVUeXBlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgImNyZWF0ZVR5cGUiLCAidmFsdWVzIiwgIlZhbHVlTGlzdE5vZGUiLCAiVmFsdWVOb2RlIiwgIkNyZWF0ZVR5cGVCdWlsZGVyIiwgIl9DcmVhdGVUeXBlQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgInZhbHVlcyIsICJDcmVhdGVUeXBlTm9kZSIsICJmdW5jIiwgIkRyb3BUeXBlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgImRyb3BUeXBlIiwgInBhcmFtcyIsICJEcm9wVHlwZUJ1aWxkZXIiLCAiX0Ryb3BUeXBlQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkRyb3BUeXBlTm9kZSIsICJmdW5jIiwgInBhcnNlU2NoZW1hYmxlSWRlbnRpZmllciIsICJpZCIsICJTQ0hFTUFfU0VQQVJBVE9SIiwgInBhcnRzIiwgInRyaW0iLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAic3RyIiwgIlJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgImNyZWF0ZVZpZXciLCAicGFyYW1zIiwgIlJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlciIsICJfUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIiwgImZ1bmMiLCAiU2NoZW1hTW9kdWxlIiwgIl9TY2hlbWFNb2R1bGUiLCAiI2V4ZWN1dG9yIiwgImV4ZWN1dG9yIiwgInRhYmxlIiwgIkNyZWF0ZVRhYmxlQnVpbGRlciIsICJjcmVhdGVRdWVyeUlkIiwgIkNyZWF0ZVRhYmxlTm9kZSIsICJwYXJzZVRhYmxlIiwgIkRyb3BUYWJsZUJ1aWxkZXIiLCAiRHJvcFRhYmxlTm9kZSIsICJpbmRleE5hbWUiLCAiQ3JlYXRlSW5kZXhCdWlsZGVyIiwgIkNyZWF0ZUluZGV4Tm9kZSIsICJEcm9wSW5kZXhCdWlsZGVyIiwgIkRyb3BJbmRleE5vZGUiLCAic2NoZW1hIiwgIkNyZWF0ZVNjaGVtYUJ1aWxkZXIiLCAiQ3JlYXRlU2NoZW1hTm9kZSIsICJEcm9wU2NoZW1hQnVpbGRlciIsICJEcm9wU2NoZW1hTm9kZSIsICJBbHRlclRhYmxlQnVpbGRlciIsICJBbHRlclRhYmxlTm9kZSIsICJ2aWV3TmFtZSIsICJDcmVhdGVWaWV3QnVpbGRlciIsICJDcmVhdGVWaWV3Tm9kZSIsICJSZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIiwgIkRyb3BWaWV3QnVpbGRlciIsICJEcm9wVmlld05vZGUiLCAidHlwZU5hbWUiLCAiQ3JlYXRlVHlwZUJ1aWxkZXIiLCAiQ3JlYXRlVHlwZU5vZGUiLCAicGFyc2VTY2hlbWFibGVJZGVudGlmaWVyIiwgIkRyb3BUeXBlQnVpbGRlciIsICJEcm9wVHlwZU5vZGUiLCAicGx1Z2luIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiRHluYW1pY01vZHVsZSIsICJyZWZlcmVuY2UiLCAiRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAidGFibGUiLCAiRHluYW1pY1RhYmxlQnVpbGRlciIsICJEZWZhdWx0Q29ubmVjdGlvblByb3ZpZGVyIiwgIiNkcml2ZXIiLCAiZHJpdmVyIiwgImNvbnN1bWVyIiwgImNvbm5lY3Rpb24iLCAiRGVmYXVsdFF1ZXJ5RXhlY3V0b3IiLCAiX0RlZmF1bHRRdWVyeUV4ZWN1dG9yIiwgIlF1ZXJ5RXhlY3V0b3JCYXNlIiwgIiNjb21waWxlciIsICIjYWRhcHRlciIsICIjY29ubmVjdGlvblByb3ZpZGVyIiwgImNvbXBpbGVyIiwgImFkYXB0ZXIiLCAiY29ubmVjdGlvblByb3ZpZGVyIiwgInBsdWdpbnMiLCAibm9kZSIsICJxdWVyeUlkIiwgImNvbnN1bWVyIiwgInBsdWdpbiIsICJwZXJmb3JtYW5jZU5vdyIsICJpc0Z1bmN0aW9uIiwgIlJ1bnRpbWVEcml2ZXIiLCAiI2RyaXZlciIsICIjbG9nIiwgIiNpbml0UHJvbWlzZSIsICIjaW5pdERvbmUiLCAiI2Rlc3Ryb3lQcm9taXNlIiwgIiNjb25uZWN0aW9ucyIsICJkcml2ZXIiLCAibG9nIiwgImVyciIsICJjb25uZWN0aW9uIiwgIiNuZWVkc0xvZ2dpbmciLCAiI2FkZExvZ2dpbmciLCAic2V0dGluZ3MiLCAic2F2ZXBvaW50TmFtZSIsICJjb21waWxlUXVlcnkiLCAiZXhlY3V0ZVF1ZXJ5IiwgInN0cmVhbVF1ZXJ5IiwgImRpcyIsICJjb21waWxlZFF1ZXJ5IiwgImNhdWdodEVycm9yIiwgInN0YXJ0VGltZSIsICJwZXJmb3JtYW5jZU5vdyIsICJlcnJvciIsICIjbG9nRXJyb3IiLCAiI2xvZ1F1ZXJ5IiwgImNodW5rU2l6ZSIsICJyZXN1bHQiLCAiI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzIiwgImlzU3RyZWFtIiwgImlnbm9yZUVycm9yIiwgIlNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlciIsICIjY29ubmVjdGlvbiIsICIjcnVubmluZ1Byb21pc2UiLCAiY29ubmVjdGlvbiIsICJjb25zdW1lciIsICIjcnVuIiwgInJ1bm5lciIsICJUUkFOU0FDVElPTl9BQ0NFU1NfTU9ERVMiLCAiVFJBTlNBQ1RJT05fSVNPTEFUSU9OX0xFVkVMUyIsICJ2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3MiLCAic2V0dGluZ3MiLCAiTE9HX0xFVkVMUyIsICJmcmVlemUiLCAiTG9nIiwgIiNsZXZlbHMiLCAiI2xvZ2dlciIsICJjb25maWciLCAiaXNGdW5jdGlvbiIsICJkZWZhdWx0TG9nZ2VyIiwgImxldmVsIiwgImdldEV2ZW50IiwgImV2ZW50IiwgInByZWZpeCIsICJpc0NvbXBpbGFibGUiLCAidmFsdWUiLCAiaXNPYmplY3QiLCAiaXNGdW5jdGlvbiIsICJLeXNlbHkiLCAiX0t5c2VseSIsICJRdWVyeUNyZWF0b3IiLCAiI3Byb3BzIiwgImFyZ3MiLCAic3VwZXJQcm9wcyIsICJwcm9wcyIsICJpc0t5c2VseVByb3BzIiwgImRpYWxlY3QiLCAiZHJpdmVyIiwgImNvbXBpbGVyIiwgImFkYXB0ZXIiLCAibG9nIiwgIkxvZyIsICJydW50aW1lRHJpdmVyIiwgIlJ1bnRpbWVEcml2ZXIiLCAiY29ubmVjdGlvblByb3ZpZGVyIiwgIkRlZmF1bHRDb25uZWN0aW9uUHJvdmlkZXIiLCAiZXhlY3V0b3IiLCAiRGVmYXVsdFF1ZXJ5RXhlY3V0b3IiLCAiZnJlZXplIiwgIlNjaGVtYU1vZHVsZSIsICJEeW5hbWljTW9kdWxlIiwgInZhbHVlIiwgIkNhc2VCdWlsZGVyIiwgIkNhc2VOb2RlIiwgImlzVW5kZWZpbmVkIiwgInBhcnNlRXhwcmVzc2lvbiIsICJjcmVhdGVGdW5jdGlvbk1vZHVsZSIsICJUcmFuc2FjdGlvbkJ1aWxkZXIiLCAiQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlciIsICJDb25uZWN0aW9uQnVpbGRlciIsICJwbHVnaW4iLCAic2NoZW1hIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAicXVlcnkiLCAicXVlcnlJZCIsICJsb2dPbmNlIiwgImNvbXBpbGVkUXVlcnkiLCAiaXNDb21waWxhYmxlIiwgIlRyYW5zYWN0aW9uIiwgIl9UcmFuc2FjdGlvbiIsICJvYmoiLCAiaXNPYmplY3QiLCAiY2FsbGJhY2siLCAiY29ubmVjdGlvbiIsICJTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIiLCAiZGIiLCAiX1RyYW5zYWN0aW9uQnVpbGRlciIsICJhY2Nlc3NNb2RlIiwgImlzb2xhdGlvbkxldmVsIiwgImt5c2VseVByb3BzIiwgInNldHRpbmdzIiwgInZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyIsICJ0cmFuc2FjdGlvbiIsICJ0cmFuc2FjdGlvbkJlZ3VuIiwgInJlc3VsdCIsICJlcnJvciIsICJfQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlciIsICJwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24iLCAiQ29udHJvbGxlZFRyYW5zYWN0aW9uIiwgIl9Db250cm9sbGVkVHJhbnNhY3Rpb24iLCAiI2NvbXBpbGVRdWVyeSIsICIjc3RhdGUiLCAic3RhdGUiLCAiTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IiLCAidHJhbnNhY3Rpb25Qcm9wcyIsICJjcmVhdGVRdWVyeUlkIiwgIm5vZGUiLCAiYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrIiwgIkNvbW1hbmQiLCAic2F2ZXBvaW50TmFtZSIsICIjY2IiLCAiY2IiLCAiX05vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yIiwgIiNleGVjdXRvciIsICJjb25zdW1lciIsICJjaHVua1NpemUiLCAicGx1Z2lucyIsICJSYXdCdWlsZGVySW1wbCIsICJfUmF3QnVpbGRlckltcGwiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhbGlhcyIsICJBbGlhc2VkUmF3QnVpbGRlckltcGwiLCAicGx1Z2luIiwgIiN0b09wZXJhdGlvbk5vZGUiLCAiI2dldEV4ZWN1dG9yIiwgImV4ZWN1dG9yUHJvdmlkZXIiLCAiI2NvbXBpbGUiLCAiZXhlY3V0b3IiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJjcmVhdGVSYXdCdWlsZGVyIiwgIiNyYXdCdWlsZGVyIiwgIiNhbGlhcyIsICJyYXdCdWlsZGVyIiwgIkFsaWFzTm9kZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiSWRlbnRpZmllck5vZGUiLCAic3FsIiwgInNxbEZyYWdtZW50cyIsICJwYXJhbWV0ZXJzIiwgImNyZWF0ZVJhd0J1aWxkZXIiLCAiY3JlYXRlUXVlcnlJZCIsICJSYXdOb2RlIiwgInBhcnNlUGFyYW1ldGVyIiwgImNvbHVtblJlZmVyZW5jZSIsICJwYXJzZVN0cmluZ1JlZmVyZW5jZSIsICJ2YWx1ZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJ0YWJsZVJlZmVyZW5jZSIsICJwYXJzZVRhYmxlIiwgImlkcyIsICJmcmFnbWVudHMiLCAiSWRlbnRpZmllck5vZGUiLCAiVmFsdWVOb2RlIiwgImFycmF5IiwgInNlcGFyYXRvciIsICJub2RlcyIsICJzZXAiLCAiaSIsICJwYXJhbSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiT3BlcmF0aW9uTm9kZVZpc2l0b3IiLCAiI3Zpc2l0b3JzIiwgImZyZWV6ZSIsICJub2RlIiwgIkxJVF9XUkFQX1JFR0VYIiwgIkRlZmF1bHRRdWVyeUNvbXBpbGVyIiwgIk9wZXJhdGlvbk5vZGVWaXNpdG9yIiwgIiNzcWwiLCAiI3BhcmFtZXRlcnMiLCAibm9kZSIsICJxdWVyeUlkIiwgImZyZWV6ZSIsICJ3cmFwSW5QYXJlbnMiLCAiUGFyZW5zTm9kZSIsICJJbnNlcnRRdWVyeU5vZGUiLCAiQ3JlYXRlVGFibGVOb2RlIiwgIkNyZWF0ZVZpZXdOb2RlIiwgIlNldE9wZXJhdGlvbk5vZGUiLCAiZXhwcmVzc2lvbnMiLCAibm9kZXMiLCAic2VwYXJhdG9yIiwgImxhc3RJbmRleCIsICJpIiwgIlJhd05vZGUiLCAiV2hlbk5vZGUiLCAibG9nT25jZSIsICJfIiwgImlzU3RyaW5nIiwgInZhbHVlcyIsICJKT0lOX1RZUEVfU1FMIiwgInNxbEZyYWdtZW50cyIsICJwYXJhbXMiLCAiaXNCb29sZWFuIiwgIlNFTEVDVF9NT0RJRklFUl9TUUwiLCAiT3BlcmF0b3JOb2RlIiwgInBhdGhMZWciLCAiaXNBcnJheUxvY2F0aW9uIiwgImxlbiIsICJzdHIiLCAicGFyYW1ldGVyIiwgImlkZW50aWZpZXIiLCAibGVmdFdyYXAiLCAicmlnaHRXcmFwIiwgInNhbml0aXplZCIsICJjIiwgInZhbHVlIiwgImlzTnVtYmVyIiwgImlzQmlnSW50IiwgImlzTnVsbCIsICJpc0RhdGUiLCAiYXJyIiwgImxlZnQiLCAicmlnaHQiLCAiU0VMRUNUX01PRElGSUVSX1BSSU9SSVRZIiwgImNvbHVtbkFsdGVyYXRpb25zIiwgIkR1bW15RHJpdmVyIiwgIkR1bW15Q29ubmVjdGlvbiIsICJEaWFsZWN0QWRhcHRlckJhc2UiLCAiSURfV1JBUF9SRUdFWCIsICJNeXNxbFF1ZXJ5Q29tcGlsZXIiLCAiRGVmYXVsdFF1ZXJ5Q29tcGlsZXIiLCAiaWRlbnRpZmllciIsICJub2RlIiwgIkxPQ0tfSUQiLCAiTE9DS19USU1FT1VUX1NFQ09ORFMiLCAiTXlzcWxBZGFwdGVyIiwgIkRpYWxlY3RBZGFwdGVyQmFzZSIsICJkYiIsICJfb3B0IiwgInNxbCIsICJnZXRCdWlsZGVyIiwgInJlcXVpcmVtZW50cyIsICJLeXNlbHkiLCAiRHVtbXlEcml2ZXIiLCAiSW1tZWRpYXRlVmFsdWVQbHVnaW4iLCAiI3RyYW5zZm9ybWVyIiwgIkltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIiLCAiYXJncyIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAibm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIlZhbHVlTm9kZSIsICJjb21waWxlIiwgImNvbXBpbGVhYmxlIiwgIm9wdGlvbnMiLCAiY29tcGlsZWRRdWVyeSIsICJhcHBseUluZmVycmVkUm93RmlsdGVycyIsICJyb3dzIiwgImNvbHVtbnMiLCAicm93RmlsdGVycyIsICJpbmZlclJvd0ZpbHRlcnMiLCAicWIiLCAiZWIiLCAicm93RmlsdGVyIiwgImNvbHVtbk5hbWUiLCAidmFsdWUiLCAiaW5mZXJGaWx0ZXJPYmplY3QiLCAicm93IiwgImZpbHRlciIsICJjb2x1bW4iLCAiaXNJblByaW1hcnlLZXkiLCAicmVmcyIsICJ2YWx1ZXMiLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAidmFsdWVzRm9yUm93IiwgInRyYW5zZm9ybVZhbHVlIiwgInR1cGxlRnJvbSIsICJsaHMiLCAicmhzIiwgIml0ZW1zIiwgInNxbCIsICJhcHBseVRyYW5zZm9ybWF0aW9ucyIsICJfY29udGV4dCIsICJ0cmFuc2Zvcm1WYWx1ZXMiLCAib2JqIiwgImtleSIsICJkYXRhdHlwZSIsICJnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uIiwgImZpbHRlcnMiLCAib3JHcm91cHNPZkFuZEJ1aWxkZXJzIiwgImN1cnJlbnRBbmRHcm91cEJ1aWxkZXJzIiwgImkiLCAiYnVpbGRCYXNlRXhwcmVzc2lvbkJ1aWxkZXIiLCAiYW5kRXhwcmVzc2lvbnMiLCAiZ3JvdXAiLCAiYnVpbGRlciIsICJzcGVjIiwgIm9wZXJhdG9yIiwgImNvbHVtbk1ldGEiLCAiTVlTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSIsICJnZXRNeVNRTEJ1aWxkZXIiLCAicmVxdWlyZW1lbnRzIiwgImdldEJ1aWxkZXIiLCAiTXlzcWxBZGFwdGVyIiwgIk15c3FsUXVlcnlDb21waWxlciIsICJnZXREZWxldGVRdWVyeSIsICJkZXRhaWxzIiwgInJlcXVpcmVtZW50cyIsICJyb3dzIiwgImNvbHVtbnMiLCAidGFibGVOYW1lIiwgImJ1aWxkZXIiLCAiZ2V0TXlTUUxCdWlsZGVyIiwgImNvbXBpbGUiLCAiYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMiLCAiZ2V0SW5zZXJ0UXVlcnkiLCAiYXBwbHlUcmFuc2Zvcm1hdGlvbnMiLCAiZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5IiwgImNyaXRlcmlhIiwgImdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMiLCAiZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5IiwgImNoYW5nZXMiLCAicm93IiwgImdldFNlbGVjdFF1ZXJ5IiwgImZpbHRlciIsICJwYWdlSW5kZXgiLCAicGFnZVNpemUiLCAic29ydE9yZGVyIiwgImZpbHRlckV4cHJlc3Npb24iLCAiZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbiIsICJjb3VudFF1ZXJ5IiwgImViIiwgInNxbCIsICJxYiIsICJpdGVtIiwgIm1vY2tTZWxlY3RRdWVyeSIsICJnZXRVcGRhdGVRdWVyeSIsICJzY2hlbWEiLCAiZ2V0SnNvbk9iamVjdEFyZ3MiLCAibm9kZSIsICJ0YWJsZSIsICJhcmdzIiwgInMiLCAiUmVmZXJlbmNlTm9kZSIsICJDb2x1bW5Ob2RlIiwgImNvbE5hbWUiLCAiY29sUmVmIiwgIkFsaWFzTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJjb2wiLCAiRXhwcmVzc2lvbldyYXBwZXIiLCAiVmFsdWVOb2RlIiwgIlRhYmxlTm9kZSIsICJqc29uQXJyYXlGcm9tIiwgImV4cHIiLCAic3FsIiwgImdldE15c3FsSnNvbk9iamVjdEFyZ3MiLCAiZ2V0TXlzcWxKc29uT2JqZWN0QXJncyIsICJub2RlIiwgInRhYmxlIiwgImdldEpzb25PYmplY3RBcmdzIiwgImdldFRhYmxlc1F1ZXJ5IiwgInJlcXVpcmVtZW50cyIsICJjb21waWxlIiwgImdldE15U1FMQnVpbGRlciIsICJzcWwiLCAiZWIiLCAianNvbkFycmF5RnJvbSIsICJqYiIsICJtb2NrVGFibGVzUXVlcnkiLCAiZ2V0VGltZXpvbmVRdWVyeSIsICJidWlsZGVyIiwgInNlc3Npb25UeiIsICJtb2NrVGltZXpvbmVRdWVyeSIsICJjcmVhdGVNeVNRTEFkYXB0ZXIiLCAicmVxdWlyZW1lbnRzIiwgImV4ZWN1dG9yIiwgIm90aGVyUmVxdWlyZW1lbnRzIiwgImRldGFpbHMiLCAib3B0aW9ucyIsICJxdWVyeSIsICJnZXREZWxldGVRdWVyeSIsICJlcnJvciIsICJjcmVhdGVBZGFwdGVyRXJyb3IiLCAicm93cyIsICJ0YWJsZSIsICJjb2x1bW5zIiwgImF1dG9pbmNyZW1lbnRDb2x1bW4iLCAiY29sdW1uIiwgImZpbHRlck9iamVjdHMiLCAicm93IiwgImluZmVyRmlsdGVyT2JqZWN0IiwgImhhc1BhcnRpYWxGaWx0ZXJPYmplY3RzIiwgImZpbHRlck9iamVjdCIsICJmaWx0ZXJWYWx1ZXMiLCAidmFsdWUiLCAiZ2V0SW5zZXJ0UXVlcnkiLCAiaW5zZXJ0UXVlcnkiLCAicmVmZXRjaFF1ZXJ5IiwgImdldEluc2VydFJlZmV0Y2hRdWVyeSIsICJzZXF1ZW5jZSIsICJpbnNlcnRFcnJvciIsICJtYXliZVJlZmV0Y2hSZXN1bHQiLCAiam9pblNlcXVlbmNlIiwgInJlZmV0Y2hFcnJvciIsICJyZWZldGNoUmVzdWx0cyIsICJyZXN1bHRzIiwgInJlc3VsdCIsICJhdXRvaW5jcmVtZW50Q29sdW1uTmFtZSIsICJhY2MiLCAiY29sdW1uTmFtZSIsICJyZWZldGNoZWRSb3ciLCAiaW5zZXJ0ZWRSb3dzIiwgImVycm9ycyIsICJpIiwgImluZGV4IiwgInRhYmxlc1F1ZXJ5IiwgImdldFRhYmxlc1F1ZXJ5IiwgInRpbWV6b25lUXVlcnkiLCAiZ2V0VGltZXpvbmVRdWVyeSIsICJ0YWJsZXNFcnJvciIsICJ0YWJsZXMiLCAidGltZXpvbmVFcnJvciIsICJ0aW1lem9uZXMiLCAidGltZXpvbmUiLCAiY3JlYXRlSW50cm9zcGVjdGlvbiIsICJnZXRTZWxlY3RRdWVyeSIsICJ1cGRhdGVRdWVyeSIsICJnZXRVcGRhdGVRdWVyeSIsICJnZXRVcGRhdGVSZWZldGNoUXVlcnkiLCAidXBkYXRlRXJyb3IiLCAicmVmZXRjaFJlc3VsdCIsICJhcmdzIiwgInNjaGVtYXMiLCAidGFibGVOYW1lIiwgInNjaGVtYSIsICJjb2x1bW5zUmVjb3JkIiwgImEiLCAiYiIsICJkYXRhdHlwZSIsICJpbmRleE9mUGFyZW50aGVzaXMiLCAic3RyaXBwZWREYXRhVHlwZSIsICJNWVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBIiwgImZpbHRlck9wZXJhdG9ycyIsICJtb2NrSW50cm9zcGVjdCIsICJtb2NrVGFibGVzUXVlcnkiLCAibW9ja1RpbWV6b25lUXVlcnkiLCAicXVlcnkwIiwgInF1ZXJ5MSIsICJnZXRDYW5jZWxRdWVyeSIsICJ0aHJlYWRJZCJdCn0K
|