@vulcanjs/react-ui 0.5.1 → 0.5.2

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/index.js CHANGED
@@ -2,7 +2,7 @@ module.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;va
2
2
  ${e.queryFragment}
3
3
  `,!e.queryFragmentName)throw new Error("When using a string queryFragment, queryFragmentName is mandatory");r=e.queryFragmentName}else n=e.queryFragment,r=e.queryFragmentName||i.getFragmentName(e.queryFragment);if(e.mutationFragment)if("string"==typeof e.mutationFragment){if(o=l.gql`
4
4
  ${e.mutationFragment}
5
- `,!e.mutationFragmentName)throw new Error("When using a string mutationFragment, mutationFragmentName is mandatory");r=e.mutationFragmentName}else o=e.mutationFragment,a=e.mutationFragmentName||i.getFragmentName(e.mutationFragment);if(!e.queryFragment||!e.mutationFragment){const{model:n,fields:r,addFields:o}=e;s=u.default({formType:t,model:n,fields:r,addFields:o})}return e.queryFragment||(n=s.queryFragment,r=s.queryFragmentName),e.mutationFragment||(o=s.mutationFragment,a=s.mutationFragmentName),{mutationFragment:o,mutationFragmentName:a,queryFragment:n,queryFragmentName:r}})(e,F),x={model:t,fragment:O,fragmentName:j},D={model:t,fragment:E,fragmentName:P,input:{id:n,enableCache:!1},queryOptions:{fetchPolicy:"network-only",pollInterval:0,skip:"new"===F}},{data:N,document:I,loading:M,refetch:w}=c.useSingle(D);"new"!==F&&p("useSingle result","data",N,"document",I,"loading",M);const[S]=c.useCreate(x),[k]=c.useUpdate(x),[T]=c.useDelete(x),{currentUser:V,loading:L}=f.useVulcanCurrentUser(),q=void 0!==h,A=q?h:V,B=q?y:L;return v&&M?a.default.createElement(C.Loading,null):a.default.createElement(C.Form,Object.assign({document:I,loading:M||B,createDocument:e=>r(void 0,void 0,void 0,(function*(){const t=yield S(e),{errors:n,document:r}=t;return{document:r,errors:n}})),updateDocument:e=>r(void 0,void 0,void 0,(function*(){const t=yield k(e),{errors:n,document:r}=t;return{document:r,errors:n}})),deleteDocument:e=>r(void 0,void 0,void 0,(function*(){yield T(e)})),refetch:w,currentUser:A},_,e))},t.SmartForm=t.FormContainer,t.default=t.FormContainer},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const o=r(n(16)),a=r(n(17)),l=n(6),u=n(34),i=n(18),s=n(4),c=r(n(10)),m=(e,t,n)=>[t,e,"form",n,"fragment"].map(s.capitalize).join(""),d=({schema:e,options:t})=>"new"===t.formType?u.getCreateableFields(e):u.getUpdateableFields(e),f=({readableFieldNames:e,queryFieldNames:t})=>o.default(t.concat(e)),p=({schema:e,fragmentName:t,options:n,fieldNames:r})=>{const o=r||(n.isMutation?f({queryFieldNames:d({schema:e,options:n}),readableFieldNames:u.getFragmentFieldNames({schema:e,options:{onlyViewable:!0}})}):d({schema:e,options:n})),a=o.length&&o.map(t=>i.getFieldFragment({schema:e,fieldName:t,options:n,getObjectFragment:p})).filter(e=>!!e);return a.length?`${t} { ${a.join("\n")} }`:null};t.default=({formType:e="new",model:t,fields:n,addFields:r})=>{const{schema:i,name:s,graphql:b}=t,{typeName:h,multiTypeName:y}=b;let g=d({schema:i,options:{formType:e}}),v=f({queryFieldNames:g,readableFieldNames:u.getFragmentFieldNames({schema:i,options:{onlyViewable:!0}})});if(n&&(null==n?void 0:n.length)>0){const e=n.map(e=>e+"_intl"),t=[...n,...e];g=a.default(g,t),v=a.default(v,t)}if((null==r?void 0:r.length)&&(g=g.concat(r),v=v.concat(r)),i.userId&&(g.unshift("userId"),v.unshift("userId")),i._id&&(g.unshift("_id"),v.unshift("_id")),g=o.default(g),v=o.default(v),0===g.length)throw new Error(`Model "${t.name}" has no queryable fields, cannot create a form for it. Please add readable/createable/updateable fields to the model schema.`);if(0===v.length)throw new Error(`Model "${t.name}" has no mutable fields, cannot create a form for it. Please add createable/updateable fields to model schema.`);const F=m(e,y,"query"),C=p({schema:i,fragmentName:`fragment ${F} on ${h}`,options:{formType:e,isMutation:!1},fieldNames:g});if(!C)throw new Error(`Model ${t.name} with fields ${g} yield an empty query fragment.`);const _=l.gql(C),O=m(e,y,"mutation"),j=p({schema:i,fragmentName:`fragment ${O} on ${h}`,options:{formType:e,isMutation:!0},fieldNames:v});if(!j)throw new Error(`Model ${t.name} with fields ${v} yield an empty mutation fragment.`);return{queryFragment:_,mutationFragment:l.gql(j),queryFragmentName:F,mutationFragmentName:O,extraQueries:c.default(d({schema:i,options:{formType:e}}).map(e=>i[e].query))}}},function(e,t){e.exports=require("@vulcanjs/schema")},function(e,t){e.exports=require("@vulcanjs/react-hooks")},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Dummy=void 0;const o=r(n(0));t.Dummy=()=>o.default.createElement("span",null,"You have not setup VulcanComponentsProvider. Please add following code in your app:"," ",o.default.createElement("code",null,'import { VulcanComponentsProvider } from "@vulcanjs/react-ui"; const YourApp = <VulcanComponentsProvider>{/* your app */}</VulcanComponentsProvider>;}'))},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,a){function l(e){try{i(r.next(e))}catch(e){a(e)}}function u(e){try{i(r.throw(e))}catch(e){a(e)}}function i(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(l,u)}i((r=r.apply(e,t||[])).next())}))},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Form=void 0;const i=a(n(0)),s=n(38),c=n(3),m=n(4),d=u(n(39)),f=u(n(10)),p=u(n(7)),b=u(n(40)),h=u(n(41)),y=u(n(22)),g=u(n(8)),v=u(n(42)),F=u(n(12)),C=u(n(43)),_=u(n(23)),O=u(n(44)),j=u(n(45)),E=u(n(46)),P=u(n(24)),x=n(25),D=n(14),N=n(27),I=n(2),M=n(53),w=n(60),S=n(62),k=n(1),T=e=>{const t=e.schema||e.model.schema,n=x.convertSchema(t),r="new"===(e.document?"edit":"new")?(e=>C.default(h.default(e,e=>e.defaultValue),e=>e))(n):{},o=y.default({},r,e.prefilledProps,(a=e.document,v.default(a,e=>null==e)));var a;return Object.keys(n).forEach(e=>{let t=n[e].minCount;if(t)for(o[e]=o[e]||[];o[e].length<t;)o[e].push({})}),m.removeProperty(o,"__typename"),{disabled:e.disabled,errors:[],deletedValues:[],currentValues:{},originalSchema:x.convertSchema(t,{removeArrays:!1}),schema:n,flatSchema:x.convertSchema(t,{flatten:!0}),initialDocument:o,currentDocument:o}},V=({isChanged:e,warnUnsavedChanges:t,children:n})=>(S.useWarnOnUnsaved({isChanged:e,warnUnsavedChanges:t}),i.default.createElement(i.default.Fragment,null,n)),L=(e,t,n,{submitFormCallbacks:r,form:o})=>{const{currentDocument:a}=n,{model:l,prefilledProps:u}=t;let i=u||{};i=v.default(i,(e,t)=>t.endsWith(".$"));const c=Object.assign({schema:l.schema,excludeRemovedFields:!1,excludeHiddenFields:!1,replaceIntlFields:!0,addExtraFields:!1},e),m=M.getFieldNames(t,a,c);return i=Object.assign(Object.assign({},i),F.default(a,...m)),n.deletedValues.forEach(e=>{e.includes(".")&&((e,t)=>{const n=N.getParentPath(t);j.default(e,n,e=>Array.isArray(e)?f.default(e):e)})(i,e)}),i=s.runCallbacks({callbacks:r,iterator:i,args:[{}]}),i};t.Form=e=>{const{initCallback:t,createDocument:n,updateDocument:r,deleteDocument:o}=e,a=T(e),{schema:u,originalSchema:m,flatSchema:f,initialDocument:h}=a,v=i.useRef(!0);i.useEffect(()=>{v.current?v.current=!1:t&&t(a.currentDocument)},[t]);Object.assign(Object.assign({},{layout:"horizontal",prefilledProps:{},repeatErrors:!1,showRemove:!0,showDelete:!0}),e);const F=[],C=[],j=[],N=c.useIntlContext(),[S,q]=i.useState([]),A=e=>{let t=s.getErrors(e);console.log(t),q(e=>[...e,...t])},[B,$]=i.useState([]),[R,U]=i.useState({submitFormCallbacks:[],successFormCallbacks:[],failureFormCallbacks:[]}),[G,H]=i.useState({}),[z,W]=i.useState(h),K=()=>{e.refetch&&e.refetch()},[Q,Y]=i.useState(!1),[J,X]=i.useState(!1),Z=(t={})=>{const{document:n}=t,r=n?y.default({},e.prefilledProps,n):null;q([]),H({}),$([]),W(r||h),Y(!1)},ee=i.useRef(null),te=function(t,n){Y(!1),X(!0),"new"===n&&K();let{document:r}=t;ee.current&&Z({document:"edit"===n?r:void 0}),r=s.runCallbacks({callbacks:C,iterator:r,args:[{form:ee.current}]}),e.successCallback&&e.successCallback(r,{form:this})},ne=(t,n)=>{Y(!1),console.error("// graphQL Error"),console.error(n),s.runCallbacks({callbacks:j,iterator:n,args:[{error:n,form:ee.current}]}),P.default(n)||A(n),e.errorCallback&&e.errorCallback(t,n,{form:this})},re=t=>o=>l(void 0,void 0,void 0,(function*(){var a,l;o&&o.preventDefault(),o&&o.stopPropagation();const{contextName:u}=e;if(Q)return;q([]),Y(!0);let i=L({replaceIntlFields:!0,addExtraFields:!1,mutableFields:me},e,{currentDocument:z,deletedValues:B},{form:ee.current,submitFormCallbacks:F});if(e.submitCallback&&(i=e.submitCallback(i)||i),"new"===t)try{const e=yield n({input:{data:i,contextName:u}});(null===(a=e.errors)||void 0===a?void 0:a.length)?ne(ae,e.errors[0]):function(e){te(e,"new")}(e)}catch(e){ne(ae,e)}else try{const e=z._id,t=yield r({input:{id:e,data:i,contextName:u}});(null===(l=t.errors)||void 0===l?void 0:l.length)?ne(ae,t.errors[0]):function(e){te(e,"edit")}(t)}catch(e){ne(ae,e)}})),{successComponent:oe,document:ae,currentUser:le,model:ue,warnUnsavedChanges:ie}=e,se=k.useVulcanComponents(),ce=ae?"edit":"new",me="edit"===ce?x.getEditableFields(u,le,h):x.getInsertableFields(u,le),{formLayoutProps:de,formGroupProps:fe}=((e,t,n,r)=>{const{currentUser:o,repeatErrors:a,submitLabel:l,cancelLabel:u,revertLabel:i,cancelCallback:s,revertCallback:c,id:m,model:d,prefilledProps:f,itemProperties:p,contextName:b,showRemove:h,showDelete:y}=e,{disabled:v,currentDocument:F}=t,{formType:C}=n,{deleteDocument:_}=r,O={document:F,formType:C,currentUser:o,disabled:v,prefilledProps:f,itemProperties:p,contextName:b},j="document-"+C,E=d.name.toLowerCase(),P={model:d,currentUser:o,submitLabel:l,cancelLabel:u,revertLabel:i,cancelCallback:s,revertCallback:c,document:F,deleteDocument:"edit"===C&&h&&y&&_||null};return{commonProps:O,formSubmitProps:P,formGroupProps:e=>Object.assign(Object.assign(Object.assign({key:e.name},e),{group:g.default(e,["fields"])}),O),formLayoutProps:{formProps:{className:`${j} ${j}-${E}`,id:m},repeatErrors:a,submitProps:P,commonProps:O}}})(e,{disabled:Q,currentDocument:z},{formType:ce},{deleteDocument:()=>{const t=z,n=e.document._id,r=t.title||t.name||"",a=N.formatMessage({id:"forms.delete_confirm"},{title:r});"42".confirm(a)&&o({input:{id:n}}).then(t=>{e.removeSuccessCallback&&e.removeSuccessCallback({documentId:n,documentTitle:r}),K()}).catch(e=>{console.log(e)})}}),pe=w.isNotSameDocument(h,z);return J&&oe?oe:i.default.createElement(V,{isChanged:pe,warnUnsavedChanges:ie},i.default.createElement(I.FormContext.Provider,{value:{throwError:A,clearForm:Z,refetchForm:K,isChanged:pe,submitForm:(e=>t=>{re(e)(t)})(ce),addToDeletedValues:e=>{$(t=>[...t,e])},updateCurrentValues:(t,n={})=>{const{mode:r="overwrite"}=n,{changeCallback:o}=e,a={currentValues:d.default(G),currentDocument:d.default(z),deletedValues:d.default(B)};Object.keys(t).forEach(e=>{const n=e;let o=t[e];if(D.isEmptyValue(o))O.default(a.currentValues,n),_.default(a.currentDocument,n,null),a.deletedValues=[...a.deletedValues,n];else{if(_.default(a.currentValues,n,o),"merge"===r&&(Array.isArray(o)||b.default(o))){const e=p.default(a.currentDocument,n);_.default(a.currentDocument,n,y.default(e,o))}else _.default(a.currentDocument,n,o);a.deletedValues=E.default(a.deletedValues,n)}}),o&&o(a.currentDocument),H(a.currentValues),W(a.currentDocument),$(a.deletedValues)},getDocument:()=>z,getLabel:(e,t)=>M.getLabel(ue,f,N,e,t),initialDocument:h,addToSubmitForm:e=>{U(e=>Object.assign({},e))},addToSuccessForm:e=>{U(t=>Object.assign(Object.assign({},t),{successFormCallbacks:[...t.successFormCallbacks,e]}))},addToFailureForm:e=>{U(t=>Object.assign(Object.assign({},t),{failureFormCallbacks:[...t.failureFormCallbacks,e]}))},clearFormCallbacks:()=>{U({submitFormCallbacks:[],successFormCallbacks:[],failureFormCallbacks:[]})},errors:S,currentValues:G,deletedValues:B,clearFieldErrors:e=>{q(t=>t.filter(t=>t.path!==e))}}},i.default.createElement(se.FormLayout,Object.assign({},de),M.getFieldGroups(e,{currentDocument:z,schema:u,flatSchema:f,originalSchema:m},N,me,N.formatMessage).map((e,t)=>i.default.createElement(se.FormGroup,Object.assign({key:t},fe(e)))))))};t.default=t.Form},function(e,t){e.exports=require("@vulcanjs/core")},function(e,t){e.exports=require("lodash/cloneDeep")},function(e,t){e.exports=require("lodash/isObject")},function(e,t){e.exports=require("lodash/mapValues")},function(e,t){e.exports=require("lodash/omitBy")},function(e,t){e.exports=require("lodash/pickBy")},function(e,t){e.exports=require("lodash/unset")},function(e,t){e.exports=require("lodash/update")},function(e,t){e.exports=require("lodash/without")},function(e,t){e.exports=require("lodash/isPlainObject")},function(e,t){e.exports=require("lodash/size")},function(e,t){e.exports=require("lodash/toPath")},function(e,t){e.exports=require("lodash/initial")},function(e,t){e.exports=require("lodash/fp/flow")},function(e,t){e.exports=require("lodash/takeRight")},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getFieldGroups=t.getFieldNames=t.getLabel=void 0;const o=n(25),a=r(n(16)),l=r(n(10)),u=r(n(7)),i=r(n(12)),s=n(3),c=r(n(54)),m=r(n(55)),d=r(n(56)),f=r(n(57)),p=r(n(58)),b=r(n(17)),h=r(n(59)),y=n(4);t.getLabel=(e,t,n,r,o)=>{const a=e.name.toLowerCase(),l=s.formatLabel({intl:n,fieldName:r,collectionName:a,schema:t});if(o){return`${l} (${n.formatMessage({id:"locales."+o,defaultMessage:o})})`}return l};const g=(e,t,n,r)=>{const o=e.name.toLowerCase(),a=r.intlId||`${o}.${n}.${r.value}`;return t.formatMessage({id:a,defaultMessage:r.label})};t.getFieldNames=(e,t,n)=>{const{fields:r,addFields:o,removeFields:l}=e,u=Object.assign(Object.assign({},{excludeHiddenFields:!0,excludeRemovedFields:!0,replaceIntlFields:!1,addExtraFields:!1}),n),{schema:i,mutableFields:c,excludeRemovedFields:m,excludeHiddenFields:d,addExtraFields:h,replaceIntlFields:y}=u;let g=c;if(void 0!==r&&r.length>0&&(g=b.default(g,r)),m&&void 0!==l&&l.length>0&&(g=f.default(g,l)),h&&void 0!==o&&o.length>0&&(g=null==g?void 0:g.concat(o)),d){const n=t;g=p.default(g,t=>{const r=null==i?void 0:i[t].hidden;return"function"==typeof r?r({props:e,document:n}):r})}return y&&(g=null==g?void 0:g.map(e=>s.isIntlField(null==i?void 0:i[e])?e+"_intl":e)),g=a.default(g),g};const v=(e,n,r,a,l)=>{const{model:c}=e,{currentDocument:m,flatSchema:d}=n,f=u.default(l,"type.0.type")===Array;let p=Object.assign(Object.assign({},i.default(l,o.formProperties)),{name:a,datatype:l.type,layout:e.layout,input:l.input||l.control});if(f){const e=n.originalSchema[a+".$"];p.itemDatatype=u.default(e,"type.0.type")}p.label=t.getLabel(c,d,r,a),p.intlKeys=s.getIntlKeys(a);const b=m;p.document=b,p.options&&Array.isArray(p.options)&&(p.options=p.options.map(e=>Object.assign(Object.assign({},e),{label:g(c,r,a,e)}))),s.isIntlField(l)&&(p.intlInput=!0);const h=l.form||l.inputProperties||{};for(const t in h){const n=h[t];p[t]="function"==typeof n?n.call(l,Object.assign(Object.assign({},e),{fieldName:a,document:b,intl:r})):n}const y=((e,t,n,r)=>{const o=e.name.toLowerCase();return s.getIntlLabel({intl:n,fieldName:r,collectionName:o,schema:t,isDescription:!0})||null})(c,d,r,a);return y&&(p.help=y),p},F=(e,t,n)=>{const r=n?`${n}.${t}`:t;return e.path=r,e},C=(e,t,n)=>(n.includes(t)||(e.disabled=!0),e),_=(e,n,r,o,a,l,u,i)=>{const s=a[o];let c=v(e,n,r,o,s);return c=F(c,o,i),c=((e,t)=>(t&&(e.parentFieldName=t),e))(c,u),c=C(c,o,l),c=((e,n,r,o,a,l,u,i)=>{const{currentDocument:s}=n;return l.arrayFieldSchema&&(o.arrayFieldSchema=l.arrayFieldSchema,o.arrayField=O(e,n,r,a,o.arrayFieldSchema,u,i)),l.schema&&(o.nestedSchema=l.schema,o.nestedInput=!0,o.nestedFields=t.getFieldNames(e,s,{schema:o.nestedSchema,addExtraFields:!1}).map(t=>_(e,n,r,t,o.nestedSchema,i,a,o.path))),o})(e,n,r,c,o,s,a,l),c},O=(e,t,n,r,o,a,l)=>{let u=v(e,t,n,r+".$",o);return u=F(u,r),u=C(u,r,l),u};t.getFieldGroups=(e,n,r,o,a)=>{const{schema:u,currentDocument:i}=n;let s=t.getFieldNames(e,i,{mutableFields:o,schema:u}).map(t=>_(e,n,r,t,u,o));s=m.default(s,"order");let f=l.default(d.default(c.default(s,"group"),e=>e?e.name:"")).map(e=>{const t=e.label||y.capitalize(e.name),n=h.default(s,t=>t.group&&t.group.name===e.name);return Object.assign(Object.assign({},e),{label:t,fields:n})});const p=h.default(s,e=>!e.group);if(p.length){f=[{name:"default",label:"default",order:0,fields:p}].concat(f)}return f=m.default(f,"order"),f}},function(e,t){e.exports=require("lodash/map")},function(e,t){e.exports=require("lodash/sortBy")},function(e,t){e.exports=require("lodash/uniqBy")},function(e,t){e.exports=require("lodash/difference")},function(e,t){e.exports=require("lodash/reject")},function(e,t){e.exports=require("lodash/filter")},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.isNotSameDocument=void 0;const o=r(n(26)),a=r(n(61));t.isNotSameDocument=(e,t)=>void 0!==o.default(t,(t,n,r)=>!a.default(t,e[n],(e,t)=>{if(!e&&!t)return!0}))},function(e,t){e.exports=require("lodash/isEqualWith")},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(63),t)},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useWarnOnUnsaved=void 0;const o=n(64),a=r(n(15)),l=n(3),u=a.default("vn:route-transitions");t.useWarnOnUnsaved=({isChanged:e,warnUnsavedChanges:t})=>{const n=l.useIntlContext();o.useBlockTransition({shouldBlock:!(!t||!e),getBlockedMessage:e=>{u("running handlePageLeave",e);return n.formatMessage({id:"forms.confirm_discard",defaultMessage:"Are you sure you want to discard your changes?"})}})}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useBlockTransition=void 0;const o=n(0),a=n(65),l=r(n(15)).default("vn:router-transitions");t.useBlockTransition=({shouldBlock:e,getBlockedMessage:t})=>{const n=o.useRef();o.useEffect(()=>{const r=!!n.current;l("running effect","should block",e,"currently blocked",r);const o=()=>{l("running unblock from effect"),e||n.current&&n.current()},u=e=>{const n=t(e);return l("user is being blocked after trying to leave the page, with message: "+n),e&&(e.returnValue=n),n};e&&(l("should block transition, setting up relevant event listener"),n.current=a.block(u,o)),!e&&r&&(l("should unblock (state has been reinitialized)"),n.current&&n.current())},[e])}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.block=t.UNBLOCK_TRANSITION_EVENT_TYPE=t.BLOCK_TRANSITION_EVENT_TYPE=void 0;const o=r(n(15)).default("vn:route-transition");function a(e){e.preventDefault(),e.returnValue=""}t.BLOCK_TRANSITION_EVENT_TYPE="blocktransition",t.UNBLOCK_TRANSITION_EVENT_TYPE="unblocktransition";t.block=(e,n)=>{o("running block function");const r=new Event(t.BLOCK_TRANSITION_EVENT_TYPE);"42".dispatchEvent(r),"42".addEventListener("beforeunload",a),"42".addEventListener("beforeunload",e);return()=>{o("running unblock function"),n&&(o("running user defined function"),n());const r=new Event(t.UNBLOCK_TRANSITION_EVENT_TYPE);"42".dispatchEvent(r),"42".removeEventListener("beforeunload",a),"42".removeEventListener("beforeunload",e),"42".onbeforeunload=void 0}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanComponentsProvider=void 0;const a=o(n(0)),l=n(68),u=n(11),i=n(1);t.VulcanComponentsProvider=e=>{var{value:t}=e,n=r(e,["value"]);const o=i.useVulcanComponents(),s=Object.assign(Object.assign(Object.assign({},l.defaultVulcanComponents),(null==o?void 0:o.__not_intialized)?{}:o||{}),t||{});return Object.keys(s).forEach(e=>{s[e].displayName=e}),a.default.createElement(u.VulcanComponentsContext.Provider,Object.assign({value:s},n))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.defaultVulcanComponents=void 0;const o=n(3),a=n(69),l=r(n(70)),u=n(71),i=n(74),s=n(75),c=n(76),m=n(78),d=n(79),f=n(80),p=n(81),b=n(82),h=n(83),y=n(84),g=n(85),v=n(86),F=n(87),C=n(88),_=n(21),O=n(89),j=n(90),E=n(93),P=n(94),x=n(95),D=n(96),N=n(97),I=n(98),M=r(n(99)),w={Loading:P.Loading,Alert:()=>null,Button:E.Button,Icon:()=>null,FormattedMessage:o.FormattedMessage,LoadingButton:x.LoadingButton,MutationButton:D.MutationButton,HeadTags:N.HeadTags,TooltipTrigger:I.TooltipTrigger,Dropdown:M.default},S={FormError:a.FormError,FormComponentDefault:O.FormComponentDefault,FormComponentPassword:O.FormComponentPassword,FormComponentNumber:O.FormComponentNumber,FormComponentUrl:O.FormComponentUrl,FormComponentEmail:O.FormComponentEmail,FormComponentTextarea:O.FormComponentTextarea,FormComponentCheckbox:O.FormComponentCheckbox,FormComponentCheckboxGroup:O.FormComponentCheckboxGroup,FormComponentRadioGroup:O.FormComponentRadioGroup,FormComponentSelect:O.FormComponentSelect,FormComponentSelectMultiple:O.FormComponentSelectMultiple,FormComponentDateTime:O.FormComponentDateTime,FormComponentDate:O.FormComponentDate,FormComponentTime:O.FormComponentTime,FormComponentStaticText:O.FormComponentStaticText,FormComponentLikert:O.FormComponentLikert,FormComponent:l.default,FormComponentInner:u.FormComponentInner,FormComponentLoader:i.FormComponentLoader,FormElement:s.FormElement,FormGroup:c.FormGroup,FormGroupLayout:c.FormGroupLayout,FormGroupHeader:c.FormGroupHeader,FormIntl:m.FormIntl,FormIntlItemLayout:m.FormIntlItemLayout,FormIntlLayout:m.FormIntlLayout,FieldErrors:v.FieldErrors,FormErrors:d.FormErrors,FormSubmit:f.FormSubmit,FormLayout:p.FormLayout,FormNestedArray:b.FormNestedArray,FormNestedArrayInnerLayout:b.FormNestedArrayInnerLayout,FormNestedArrayLayout:h.FormNestedArrayLayout,FormNestedItem:y.FormNestedItem,IconAdd:b.IconAdd,IconRemove:b.IconRemove,FormNestedDivider:g.FormNestedDivider,FormNestedItemLayout:y.FormNestedItemLayout,FormNestedObjectLayout:F.FormNestedObjectLayout,FormNestedObject:F.FormNestedObject,FormOptionLabel:C.FormOptionLabel,Form:_.Form,FormItem:O.FormItem,FormComponentAutocomplete:O.FormComponentAutocomplete,FormComponentMultiAutocomplete:j.AutocompleteMultiple};t.defaultVulcanComponents=Object.assign(Object.assign({},w),S)},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormError=void 0;const o=r(n(0)),a=r(n(7)),l=n(1),u=n(2);t.FormError=({error:e,errorContext:t})=>{const n=l.useVulcanComponents(),{getLabel:r}=u.useFormContext(),i=JSON.stringify(e.message||e);let s={id:e.id||"app.defaultError",defaultMessage:i,values:{errorContext:t,defaultMessage:i}};if(e.properties){const t=e.properties.name&&e.properties.name.split(".").slice(-1)[0];s.values=Object.assign(Object.assign(Object.assign({},s.values),{label:t&&r(t,e.properties.locale)}),e.properties)}e.data&&(s.values=Object.assign(Object.assign({},s.values),e.data));const c=a.default(e,"extensions.exception");return c&&(s=Object.assign(Object.assign({},s),{id:c.id,values:c.data})),o.default.createElement(n.FormattedMessage,Object.assign({html:!0},s))},t.FormError.defaultProps={errorContext:""}},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.formComponentsDependencies=t.FormComponent=void 0;const u=a(n(0)),i=l(n(7)),s=l(n(28)),c=n(14),m=n(1),d=n(29),f=n(2),p=(e,t)=>{const n=e&&e.length?e.length:0;return{charsRemaining:t-n,charsCount:n}},b=({intlInput:e,path:t})=>e?t+"_intl":t,h=(e,t)=>t||d.getAutoInputFromType(e),y=({type:e,input:t,FormComponents:n})=>{if("function"==typeof t){return t}{const r=h(e,t);switch(r){case"text":return n.FormComponentDefault;case"password":return n.FormComponentPassword;case"number":return n.FormComponentNumber;case"url":return n.FormComponentUrl;case"email":return n.FormComponentEmail;case"textarea":return n.FormComponentTextarea;case"checkbox":return n.FormComponentCheckbox;case"checkboxgroup":return n.FormComponentCheckboxGroup;case"radiogroup":return n.FormComponentRadioGroup;case"select":return n.FormComponentSelect;case"selectmultiple":return n.FormComponentSelectMultiple;case"datetime":return n.FormComponentDateTime;case"date":return n.FormComponentDate;case"time":return n.FormComponentTime;case"statictext":return n.FormComponentStaticText;case"likert":return n.FormComponentLikert;case"autocomplete":return n.FormComponentAutocomplete;case"multiautocomplete":return n.FormComponentMultiAutocomplete;default:throw new Error(`Input name "${r}" is not a standard Vulcan form input (type: ${e}, input: ${t})`)}}};t.FormComponent=e=>{const{locale:t,max:n,path:r,datatype:o,input:a,intlInput:l,nestedInput:d,query:g,options:v}=e,{updateCurrentValues:F,deletedValues:C,clearFieldErrors:_}=f.useFormContext(),O=o,j=(({document:e,max:t,intlInput:n,path:r})=>{if(!t)return null;const o=b({intlInput:n,path:r}),a=null==e?void 0:e[o],l=a&&"object"==typeof a?a.value:a;return p(l,t)})(e),[E,P]=u.useState(j),x=e=>{if(!n)throw new Error("Cannot update character count when no max value is set.");P(p(e,n))};u.useEffect(()=>{j&&P(j)},[null==j?void 0:j.charsCount,null==j?void 0:j.charsRemaining]);let D=!1,N=null;"string"==typeof a&&(N=h(O,a),D=!(void 0===n||!N||!["url","email","textarea","text"].includes(N)));const I=()=>{const{locale:t,defaultValue:n,formType:r,datatype:o}=e,a=t?b(e)+".value":b(e),l=e.document;let u=i.default(l,a);const s=t?"":c.getNullValue(o);return C.includes(a)?u=s:c.isEmptyValue(u)&&(u="new"===r&&n?n:s),u},M=t=>(t=t||e.errors||[]).filter(e=>e.path&&e.path.includes(r)),w=m.useVulcanComponents();if(l)return u.default.createElement(w.FormIntl,Object.assign({},e));if(!a&&d){if((e=>e===Array)(O))return u.default.createElement(w.FormNestedArray,Object.assign({},e,{formComponents:w,errors:M(),value:I()}));if((e=>e instanceof s.default)(O))return u.default.createElement(w.FormNestedObject,Object.assign({},e,{formComponents:w,errors:M(),value:I()}))}const S=Object.assign(Object.assign(Object.assign({},e),E||{}),{inputType:h(O,a),value:I(),errors:M(),showCharsRemaining:!!D,handleChange:n=>{if(""===n&&(n=null),O===Number&&null!=n?n=Number(n):O===s.default.Integer&&null!=n&&(n=parseInt(n)),n!==I()){const r=t?{locale:t,value:n}:n;F({[b(e)]:r}),_(b(e))}D&&x(n)},clearField:e=>{e.preventDefault(),e.stopPropagation(),F({[r]:null}),D&&x(null)},formInput:y({FormComponents:w,input:a,type:O})});g||"function"!=typeof v||(S.options=v(S));const k=u.default.createElement(w.FormComponentInner,Object.assign({},S));return g?u.default.createElement(w.FormComponentLoader,Object.assign({},S),k):k},t.formComponentsDependencies=["FormComponentDefault","FormComponentPassword","FormComponentNumber","FormComponentUrl","FormComponentEmail","FormComponentTextarea","FormComponentCheckbox","FormComponentCheckboxGroup","FormComponentRadioGroup","FormComponentSelect","FormComponentSelectMultiple","FormComponentDateTime","FormComponentDate","FormComponentDate2","FormComponentTime","FormComponentStaticText","FormComponentLikert","FormComponentAutocomplete","FormComponentMultiAutocomplete"],t.default=t.FormComponent},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentInner=void 0;const o=r(n(0)),a=n(3),l=n(72),u=r(n(73)),i=n(29),s=n(1);t.FormComponentInner=e=>{const t=a.useIntlContext(),{inputType:n,disabled:r,clearField:c}=e,{inputClassName:m,name:d,input:f,beforeComponent:p,afterComponent:b,errors:h,showCharsRemaining:y,charsRemaining:g,renderComponent:v,formInput:F}=e,C=s.useVulcanComponents(),_=h&&h.length,O="function"==typeof f?f.name:n,j=u.default("form-input",m,"input-"+d,"form-component-"+(O||"default"),{"input-error":_}),E=(()=>{const{handleChange:t,inputType:n,itemProperties:r,help:o,description:a,loading:u,submitForm:i,formComponents:s,intlKeys:c}=e;return Object.assign(Object.assign({},e),{inputProperties:Object.assign(Object.assign({},l.whitelistInputProps(e)),{onChange:e=>{const r="checkbox"===n?e.target.checked:e.target.value;t&&t(r)}}),itemProperties:Object.assign(Object.assign({},r),{intlKeys:c,Components:s,description:a||o,loading:u})})})(),P=F;return o.default.createElement("div",{className:j},o.default.createElement(P,Object.assign({},E)),_?o.default.createElement(C.FieldErrors,{errors:h}):null,(()=>{if(i.clearableInputs.includes(n)&&!r)return o.default.createElement("button",{className:"form-component-clear",title:t.formatMessage({id:"forms.clear_field"}),onClick:c},o.default.createElement("span",null,"✕"))})(),y&&o.default.createElement("div",{className:u.default("form-control-limit",{danger:g<10})},g))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.whitelistInputProps=t.getHtmlInputProps=void 0;const o=r(n(12));t.getHtmlInputProps=e=>{const{name:t,path:n,options:r,label:o,onChange:a,onBlur:l,value:u,disabled:i}=e,s=Object.assign(Object.assign({},e.inputProperties),{name:t,path:n,options:r,label:o,onChange:a,onBlur:l,value:u,disabled:i});return Object.assign(Object.assign({},e),{inputProperties:s})};t.whitelistInputProps=e=>o.default(e,["name","path","options","label","onChange","onBlur","value","disabled","placeholder"])},function(e,t){e.exports=require("classnames")},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentLoader=void 0;const u=a(n(0)),i=n(6),s=l(n(24)),c=n(1);t.FormComponentLoader=e=>{const t=c.useVulcanComponents(),{query:n,children:r,options:o,value:a,queryWaitsForValue:l}=e,m="function"==typeof n?n({value:a}):n,[d,{loading:f,error:p,data:b}]=i.useLazyQuery(i.gql(m)),h=s.default(a)||0===(Array.isArray(a)&&a.length);if(u.useEffect(()=>{l&&h||d({variables:{value:a}})},[h,a,l]),p)throw new Error(p.toString());if(f)return u.default.createElement("div",{className:"form-component-loader"},u.default.createElement(t.Loading,null));const y={data:b,queryData:b,queryError:p,loading:f};if("function"==typeof o&&(y.optionsFunction=o,y.options=o.call({},Object.assign(Object.assign({},e),{data:b}))),!u.default.isValidElement(r))throw new Error("Children of FormComponentLoader must be a React element, got "+r);const g=u.default.cloneElement(r,y);return u.default.createElement("div",{className:"form-component-loader"},g)},t.FormComponentLoader.propTypes={}},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormElement=void 0;const a=o(n(0)),l=n(2);t.FormElement=a.default.forwardRef((e,t)=>{var{children:n}=e,o=r(e,["children"]);const{submitForm:u}=l.useFormContext();return a.default.createElement("form",Object.assign({},o,{onSubmit:u,ref:t}),n)})},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormGroup=t.FormGroupHeader=t.FormGroupLayout=void 0;const i=a(n(0)),s=u(n(77)),c=n(13),m=n(1),d=n(2);t.FormGroupLayout=e=>{var{anchorName:t,collapsed:n,hasErrors:r,group:o,document:a,toggle:u}=e,s=l(e,["anchorName","collapsed","hasErrors","group","document","toggle"]);return i.default.createElement("fieldset",Object.assign({},s))};t.FormGroupHeader=e=>i.default.createElement("h2",Object.assign({},e));t.FormGroup=e=>{const{name:t,label:n,group:r,fields:o,hidden:a,document:l,currentUser:u,disabled:f,itemProperties:p,prefilledProps:b,formType:h}=e,{errors:y,clearFieldErrors:g}=d.useFormContext(),[v,F]=i.useState(r.startCollapsed||!1),C=()=>F(e=>!e),_=s.default(o,e=>!!y.filter(t=>t.path===e.path).length),O=m.useVulcanComponents(),j="function"==typeof a?a(Object.assign(Object.assign({},e),{document:l})):a||!1,E=i.default.createElement(O.FormGroupHeader,{toggle:C,label:n,collapsed:v,hidden:j,group:r});if(r.adminsOnly&&!c.isAdmin(u))return null;const P=t.split(".").length>1?t.split(".")[1]:t;return i.default.createElement(O.FormGroupLayout,{label:n,anchorName:P,toggle:C,collapsed:v,hidden:j,group:r,heading:"default"===t?null:E,hasErrors:_,document:l},o.map(e=>i.default.createElement(O.FormComponent,Object.assign({key:e.name,disabled:f},e,{document:l,itemProperties:Object.assign(Object.assign({},p),e.itemProperties),clearFieldErrors:g,formType:h,currentUser:u,prefilledProps:b}))))},t.default=t.FormGroup},function(e,t){e.exports=require("lodash/some")},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormIntl=t.FormIntlItemLayout=t.FormIntlLayout=void 0;const o=r(n(0)),a=r(n(8)),l=n(1),u=n(2),i=[];t.FormIntlLayout=({children:e})=>o.default.createElement("div",{className:"form-intl"},e);t.FormIntlItemLayout=({locale:e,children:t})=>o.default.createElement("div",{className:"form-intl-"+e.id},t);t.FormIntl=e=>{const t=l.useVulcanComponents(),{getLabel:n}=u.useFormContext(),{name:r}=e,s=a.default(e,"value","inputProperties","intlInput","nestedInput");return o.default.createElement(t.FormIntlLayout,null,i.map((a,l)=>{return o.default.createElement(t.FormIntlItemLayout,{key:a.id,locale:a},o.default.createElement(t.FormComponent,Object.assign({},s,{label:n(r,a.id),path:(u=l,`${e.path}_intl.${u}`),locale:a.id})));var u}))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormErrors=void 0;const o=r(n(0)),a=n(2),l=n(1);t.FormErrors=()=>{const e=l.useVulcanComponents(),{errors:t}=a.useFormContext();return o.default.createElement("div",{className:"form-errors"},!!t.length&&o.default.createElement(e.Alert,{className:"flash-message",variant:"danger"},o.default.createElement("ul",null,t.map((t,n)=>o.default.createElement("li",{key:n},o.default.createElement(e.FormError,{error:t,errorContext:"form"}))))))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormSubmit=void 0;const o=r(n(0)),a=r(n(5)),l=n(13),u=n(1),i=n(2);t.FormSubmit=({submitLabel:e,cancelLabel:t,cancelCallback:n,revertLabel:r,revertCallback:a,document:s,deleteDocument:c,model:m,currentUser:d})=>{const f=u.useVulcanComponents(),{clearForm:p}=i.useFormContext();return o.default.createElement("div",{className:"form-submit"},o.default.createElement(f.Button,{type:"submit",variant:"primary"},e||o.default.createElement(f.FormattedMessage,{id:"forms.submit",defaultMessage:"Submit"})),n?o.default.createElement("a",{className:"form-cancel",onClick:e=>{e.preventDefault(),n(s)}},t||o.default.createElement(f.FormattedMessage,{id:"forms.cancel",defaultMessage:"Cancel"})):null,a?o.default.createElement("a",{className:"form-cancel",onClick:e=>{e.preventDefault(),p(),a(s)}},r||o.default.createElement(f.FormattedMessage,{id:"forms.revert",defaultMessage:"Revert"})):null,c&&l.canDeleteDocument({user:d,document:s,model:m})?o.default.createElement("div",null,o.default.createElement("hr",null),o.default.createElement(f.Button,{variant:"link",onClick:c,className:`delete-link ${m.name}-delete-link`},o.default.createElement(f.Icon,{name:"close"})," ",o.default.createElement(f.FormattedMessage,{id:"forms.delete",defaultMessage:"Delete"}))):null)},t.FormSubmit.propTypes={submitLabel:a.default.node,cancelLabel:a.default.node,cancelCallback:a.default.func,revertLabel:a.default.node,revertCallback:a.default.func,document:a.default.object,deleteDocument:a.default.func,collectionName:a.default.string,classes:a.default.object}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.formComponentsDependencies=t.FormLayout=void 0;const o=r(n(0)),a=n(1);t.FormLayout=({commonProps:e,formProps:t,repeatErrors:n,submitProps:r,children:l})=>{const u=a.useVulcanComponents();return o.default.createElement(u.FormElement,Object.assign({},t),o.default.createElement(u.FormErrors,Object.assign({},e)),l,n&&o.default.createElement(u.FormErrors,Object.assign({},e)),o.default.createElement(u.FormSubmit,Object.assign({},e,r)))},t.formComponentsDependencies=["FormErrors","FormSubmit","FormElement"]},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.IconRemove=t.IconAdd=t.formComponentsDependencies=t.FormNestedArray=t.FormNestedArrayInnerLayout=void 0;const u=a(n(0)),i=l(n(8)),s=l(n(7)),c=n(2),m=n(1);t.FormNestedArrayInnerLayout=e=>{const{label:t,children:n,addItem:r,BeforeComponent:o,AfterComponent:a}=e,l=m.useVulcanComponents();return u.default.createElement("div",{className:"form-nested-array-inner-layout"},u.default.createElement(o,Object.assign({},e)),n,u.default.createElement(l.FormNestedDivider,{label:t,addItem:r}),u.default.createElement(a,Object.assign({},e)))};t.FormNestedArray=e=>{const{updateCurrentValues:t,deletedValues:n,errors:r}=c.useFormContext(),o=e.value||[],a=()=>{const{prefilledProps:n,path:r}=e;t({[`${r}.${o.length}`]:s.default(n,r+".$")||{}},{mode:"merge"})},l=t=>n.includes(`${e.path}.${t}`);u.useEffect(()=>{e.itemProperties.openNested&&a()},[]);const d=(e=>{let t=0;return e.map((e,n)=>l(n)?0:(t+=1,t))})(o),f=Object.assign({},i.default(e,"value","input","inputProperties","nestedInput","beforeComponent","afterComponent")),{path:p,minCount:b,maxCount:h,arrayField:y}=e,g=m.useVulcanComponents();let v=o.filter(e=>null!=e).length;return f.addItem=!h||v<h?a:null,f.nestedArrayErrors=r.filter(e=>e.path&&e.path===p),f.hasErrors=!(!f.nestedArrayErrors||!f.nestedArrayErrors.length),u.default.createElement(g.FormNestedArrayLayout,Object.assign({},f),o.map((n,r)=>{if(l(r))return null;const o=`${e.path}.${r}`,i=d[r];return u.default.createElement(g.FormNestedArrayInnerLayout,Object.assign({},y,{key:o,addItem:a,itemIndex:r,visibleItemIndex:i,path:o}),u.default.createElement(g.FormNestedItem,Object.assign({},f,{itemIndex:r,visibleItemIndex:i,path:o,removeItem:()=>{var n;n=r,t({[`${e.path}.${n}`]:null})},hideRemove:!!b&&v<=b})))}))},t.formComponentsDependencies=["FormNestedArrayInnerLayout","FormNestedArrayLayout"],t.default=t.FormNestedArray;t.IconAdd=({width:e=24,height:t=24})=>u.default.createElement("svg",{width:e,height:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},u.default.createElement("path",{fill:"currentColor",d:"M448 294.2v-76.4c0-13.3-10.7-24-24-24H286.2V56c0-13.3-10.7-24-24-24h-76.4c-13.3 0-24 10.7-24 24v137.8H24c-13.3 0-24 10.7-24 24v76.4c0 13.3 10.7 24 24 24h137.8V456c0 13.3 10.7 24 24 24h76.4c13.3 0 24-10.7 24-24V318.2H424c13.3 0 24-10.7 24-24z"}));t.IconRemove=({width:e=24,height:t=24})=>u.default.createElement("svg",{width:e,height:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},u.default.createElement("path",{fill:"currentColor",d:"M424 318.2c13.3 0 24-10.7 24-24v-76.4c0-13.3-10.7-24-24-24H24c-13.3 0-24 10.7-24 24v76.4c0 13.3 10.7 24 24 24h400z"}))},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedArrayLayout=void 0;const o=r(n(5)),a=r(n(0)),l=n(1);t.FormNestedArrayLayout=e=>{const{hasErrors:t,nestedArrayErrors:n,label:r,addItem:o,BeforeComponent:u,AfterComponent:i,children:s}=e,c=l.useVulcanComponents();return a.default.createElement("div",{className:"form-group row form-nested "+(t?"input-error":"")},u&&a.default.createElement(u,Object.assign({},e)),a.default.createElement("label",{className:"control-label col-sm-3"},r),a.default.createElement("div",{className:"col-sm-9"},s,o&&a.default.createElement(c.Button,{className:"form-nested-button form-nested-add",size:"sm",variant:"success",onClick:o},a.default.createElement(c.IconAdd,{height:12,width:12})),e.hasErrors?a.default.createElement(c.FieldErrors,{key:"form-nested-errors",errors:n}):null),i&&a.default.createElement(i,Object.assign({},e)))},t.FormNestedArrayLayout.propTypes={hasErrors:o.default.bool.isRequired,nestedArrayErrors:o.default.array,label:o.default.node,hideLabel:o.default.bool,addItem:o.default.func,beforeComponent:o.default.node,afterComponent:o.default.node,formComponents:o.default.object,children:o.default.node},t.default=t.FormNestedArrayLayout},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedItem=t.FormNestedItemLayout=void 0;const a=o(n(0)),l=o(n(5)),u=n(3),i=n(1),s=n(3);t.FormNestedItemLayout=({content:e,removeButton:t})=>a.default.createElement("div",{className:"form-nested-item"},a.default.createElement("div",{className:"form-nested-item-inner"},e),t&&[a.default.createElement("div",{key:"remove-button",className:"form-nested-item-remove"},t),a.default.createElement("div",{key:"remove-button-overlay",className:"form-nested-item-deleted-overlay"})]),t.FormNestedItemLayout.propTypes={content:l.default.node.isRequired,removeButton:l.default.node};t.FormNestedItem=e=>{var{nestedFields:t,name:n,path:o,removeItem:l,itemIndex:u,formComponents:c,hideRemove:m,label:d}=e,f=r(e,["nestedFields","name","path","removeItem","itemIndex","formComponents","hideRemove","label"]);const p=i.useVulcanComponents(),b=s.useIntlContext(),h=void 0!==u;return a.default.createElement(p.FormNestedItemLayout,{content:t.map((e,t)=>a.default.createElement(p.FormComponent,Object.assign({key:t},f,e,{path:`${o}.${e.name}`,itemIndex:u}))),removeButton:h&&!m&&[a.default.createElement("div",{key:"remove-button",className:"form-nested-item-remove"},a.default.createElement(p.Button,{className:"form-nested-button",variant:"danger",size:"sm",iconButton:!0,tabIndex:-1,onClick:()=>{l(n)},"aria-label":b.formatMessage({id:"forms.delete_nested_field"},{label:d})},a.default.createElement(p.IconRemove,{height:12,width:12}))),a.default.createElement("div",{key:"remove-button-overlay",className:"form-nested-item-deleted-overlay"})]})},t.FormNestedItem.propTypes={path:l.default.string.isRequired,itemIndex:l.default.number,formComponents:l.default.object,hideRemove:l.default.bool},t.FormNestedItem.contextTypes={errors:l.default.array,intl:u.intlShape}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedDivider=void 0;const o=r(n(0)),a=r(n(5));t.FormNestedDivider=({label:e,addItem:t})=>o.default.createElement("div",null),t.FormNestedDivider.propTypes={label:a.default.string,addItem:a.default.func}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FieldErrors=t.formComponentsDependencies=void 0;const o=r(n(0)),a=n(1);t.formComponentsDependencies=["FormError"];t.FieldErrors=({errors:e})=>{const t=a.useVulcanComponents();return o.default.createElement("ul",{className:"form-input-errors"},e.map((e,n)=>o.default.createElement("li",{key:n},o.default.createElement(t.FormError,{error:e,errorContext:"field"}))))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedObject=t.FormNestedObjectLayout=void 0;const o=r(n(0)),a=r(n(5)),l=r(n(8)),u=n(1),i=n(2);t.FormNestedObjectLayout=({hasErrors:e,label:t,content:n})=>o.default.createElement("div",{className:"form-group row form-nested "+(e?"input-error":"")},o.default.createElement("label",{className:"control-label col-sm-3"},t),o.default.createElement("div",{className:"col-sm-9"},n)),t.FormNestedObjectLayout.propTypes={hasErrors:a.default.oneOfType([a.default.number,a.default.bool]),label:a.default.node,content:a.default.node};t.FormNestedObject=e=>{const t=u.useVulcanComponents(),n=l.default(e,"value","input","inputProperties","nestedInput"),{errors:r}=i.useFormContext(),a=r.filter(t=>t.path&&t.path===e.path),s=a&&a.length;return o.default.createElement(t.FormNestedObjectLayout,{hasErrors:s,label:e.label,content:[o.default.createElement(t.FormNestedItem,Object.assign({key:"form-nested-item"},n,{path:""+e.path})),s?o.default.createElement(t.FieldErrors,{key:"form-nested-errors",errors:a}):null]})},t.FormNestedObject.propTypes={currentValues:a.default.object,path:a.default.string,label:a.default.string,errors:a.default.array.isRequired,formComponents:a.default.object},t.default=t.FormNestedObject},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormOptionLabel=void 0;const o=r(n(0));t.FormOptionLabel=({option:e})=>{const{label:t}=e;return o.default.createElement("span",{className:"form-option-label"},t)}},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentAutocomplete=t.FormComponentLikert=t.FormComponentStaticText=t.FormComponentTime=t.FormComponentDateTime=t.FormComponentDate=t.FormComponentSelectMultiple=t.FormComponentSelect=t.FormComponentRadioGroup=t.FormComponentCheckboxGroup=t.FormComponentCheckbox=t.FormComponentTextarea=t.FormComponentEmail=t.FormComponentUrl=t.FormComponentNumber=t.FormComponentPassword=t.FormComponentDefault=t.FormItem=void 0;const a=o(n(0)),l=n(1),u=e=>{const t=l.useVulcanComponents(),{inputProperties:n}=e,{label:o,name:u}=n,i=r(n,["label","name"]);return a.default.createElement(t.FormItem,{name:u,label:o,inputProperties:n},a.default.createElement("input",Object.assign({},i,{id:u,name:u,type:e.type})))};t.FormItem=e=>{const{inputProperties:t,label:n,name:r}=e;return a.default.createElement("div",{className:"form-item "+r},a.default.createElement("label",{htmlFor:r},n),e.children)};const i=e=>{const{inputProperties:t,options:n=[]}=e,{label:r,name:o}=t;if(!Array.isArray(n))throw new Error("HTMLSelectAdapater not yet supporting functional options");const u=l.useVulcanComponents();return a.default.createElement(u.FormItem,{name:o,label:r,inputProperties:t},a.default.createElement("select",Object.assign({},t),n.map(({label:e,value:t})=>a.default.createElement("option",{key:t,label:e,value:t}))))};t.FormComponentDefault=e=>a.default.createElement(u,Object.assign({type:"text"},e));t.FormComponentPassword=e=>a.default.createElement(u,Object.assign({type:"password"},e));t.FormComponentNumber=e=>a.default.createElement(u,Object.assign({type:"number"},e));t.FormComponentUrl=e=>a.default.createElement(u,Object.assign({type:"url"},e));t.FormComponentEmail=e=>a.default.createElement(u,Object.assign({type:"email"},e));t.FormComponentTextarea=e=>a.default.createElement("textarea",Object.assign({},e));t.FormComponentCheckbox=e=>a.default.createElement(i,Object.assign({type:"checkbox"},e));t.FormComponentCheckboxGroup=e=>a.default.createElement(t.FormComponentSelectMultiple,Object.assign({},e));t.FormComponentRadioGroup=e=>{const{inputProperties:t,options:n=[]}=e,{label:r,name:o}=t;if(!Array.isArray(n))throw new Error("RadioGroup not yet supporting functional options");const u=l.useVulcanComponents();return a.default.createElement(u.FormItem,{name:o,label:r,inputProperties:t},n.map(({label:e,value:t})=>a.default.createElement("div",{key:t},a.default.createElement("label",{htmlFor:t},e),a.default.createElement("input",{type:"radio",id:t,name:o,key:t,value:t}))))};t.FormComponentSelect=e=>a.default.createElement(i,Object.assign({},e));t.FormComponentSelectMultiple=e=>{const t=l.useVulcanComponents();return a.default.createElement(t.FormComponentSelect,Object.assign({multiple:!0},e))};t.FormComponentDate=e=>a.default.createElement(u,Object.assign({type:"date"},e));t.FormComponentDateTime=e=>a.default.createElement(u,Object.assign({type:"datetime-local"},e));t.FormComponentTime=e=>a.default.createElement(u,Object.assign({type:"time"},e));t.FormComponentStaticText=e=>a.default.createElement("input",Object.assign({disabled:!0},e));t.FormComponentLikert=e=>"Likert component not yet implemented";t.FormComponentAutocomplete=e=>"Autocomplete component not yet implemented"},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.AutocompleteMultiple=void 0;const u=n(91),i=a(n(0)),s=n(6),c=l(n(92)),m=n(1),d=n(2);t.AutocompleteMultiple=e=>{const{queryData:t,refFunction:n,path:r,inputProperties:o={},itemProperties:a={},autocompleteQuery:l,optionsFunction:f}=e,{updateCurrentValues:p}=d.useFormContext(),b=m.useVulcanComponents(),{value:h,label:y}=o,[g,v]=i.useState(),[F,{loading:C,error:_,data:O}]=s.useLazyQuery(c.default(l()),{variables:{queryString:g}});if(_)throw new Error(_.message);const j=O&&f({data:O}),E=t&&f({data:t}).filter(e=>h.includes(e.value));return i.default.createElement(b.FormItem,Object.assign({},e,{name:r}),i.default.createElement(u.AsyncTypeahead,Object.assign({},o,{multiple:!0,onChange:e=>{const t=e.map(({value:e})=>e);p({[r]:t})},options:j,id:r,inputProps:{id:r},ref:n,onSearch:e=>{v(e),F()},isLoading:C,selected:E})))}},function(e,t){e.exports=require("react-bootstrap-typeahead")},function(e,t){e.exports=require("graphql-tag")},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Button=void 0;const a=o(n(0));t.Button=e=>{var{children:t}=e,n=r(e,["children"]);return a.default.createElement("button",Object.assign({},n),t)}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Loading=void 0;const o=r(n(0));t.Loading=()=>o.default.createElement("span",{"aria-live":"polite","aria-busy":"true"},"Loading...")},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.LoadingButton=void 0;const a=o(n(0)),l=n(9);t.LoadingButton=e=>{var{loading:t,label:n,onClick:o,children:u,className:i=""}=e,s=r(e,["loading","label","onClick","children","className"]);const c=l.useVulcanComponents(),m=t?{opacity:.5}:{},d=t?{position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",justifyContent:"center",alignItems:"center"}:{display:"none"};return a.default.createElement(c.Button,Object.assign({className:`loading-button ${t?"loading-button-loading":"loading-button-notloading"} ${i}`,onClick:o},s),a.default.createElement("span",{style:{position:"relative"}},a.default.createElement("span",{style:m},n||u),a.default.createElement("span",{style:d},a.default.createElement(c.Loading,null))))}},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,a){function l(e){try{i(r.next(e))}catch(e){a(e)}}function u(e){try{i(r.throw(e))}catch(e){a(e)}}function i(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(l,u)}i((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.MutationButton=void 0;const u=a(n(0)),i=n(6),s=n(9);t.MutationButton=e=>{const t=s.useVulcanComponents(),[n,r]=u.useState(!1),[o,a]=u.useState(),{mutation:c,mutationArguments:m,loadingButtonProps:d}=e,f="string"==typeof c?i.gql`
5
+ `,!e.mutationFragmentName)throw new Error("When using a string mutationFragment, mutationFragmentName is mandatory");r=e.mutationFragmentName}else o=e.mutationFragment,a=e.mutationFragmentName||i.getFragmentName(e.mutationFragment);if(!e.queryFragment||!e.mutationFragment){const{model:n,fields:r,addFields:o}=e;s=u.default({formType:t,model:n,fields:r,addFields:o})}return e.queryFragment||(n=s.queryFragment,r=s.queryFragmentName),e.mutationFragment||(o=s.mutationFragment,a=s.mutationFragmentName),{mutationFragment:o,mutationFragmentName:a,queryFragment:n,queryFragmentName:r}})(e,F),x={model:t,fragment:O,fragmentName:j},D={model:t,fragment:E,fragmentName:P,input:{id:n,enableCache:!1},queryOptions:{fetchPolicy:"network-only",pollInterval:0,skip:"new"===F}},{data:N,document:I,loading:M,refetch:w}=c.useSingle(D);"new"!==F&&p("useSingle result","data",N,"document",I,"loading",M);const[S]=c.useCreate(x),[k]=c.useUpdate(x),[T]=c.useDelete(x),{currentUser:V,loading:L}=f.useVulcanCurrentUser(),q=void 0!==h,A=q?h:V,B=q?y:L;return v&&M?a.default.createElement(C.Loading,null):a.default.createElement(C.Form,Object.assign({document:I,loading:M||B,createDocument:e=>r(void 0,void 0,void 0,(function*(){const t=yield S(e),{errors:n,document:r}=t;return{document:r,errors:n}})),updateDocument:e=>r(void 0,void 0,void 0,(function*(){const t=yield k(e),{errors:n,document:r}=t;return{document:r,errors:n}})),deleteDocument:e=>r(void 0,void 0,void 0,(function*(){yield T(e)})),refetch:w,currentUser:A},_,e))},t.SmartForm=t.FormContainer,t.default=t.FormContainer},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const o=r(n(16)),a=r(n(17)),l=n(6),u=n(34),i=n(18),s=n(4),c=r(n(10)),m=(e,t,n)=>[t,e,"form",n,"fragment"].map(s.capitalize).join(""),d=({schema:e,options:t})=>"new"===t.formType?u.getCreateableFields(e):u.getUpdateableFields(e),f=({readableFieldNames:e,queryFieldNames:t})=>o.default(t.concat(e)),p=({schema:e,fragmentName:t,options:n,fieldNames:r})=>{const o=r||(n.isMutation?f({queryFieldNames:d({schema:e,options:n}),readableFieldNames:u.getFragmentFieldNames({schema:e,options:{onlyViewable:!0}})}):d({schema:e,options:n})),a=o.length&&o.map(t=>i.getFieldFragment({schema:e,fieldName:t,options:n,getObjectFragment:p})).filter(e=>!!e);return a.length?`${t} { ${a.join("\n")} }`:null};t.default=({formType:e="new",model:t,fields:n,addFields:r})=>{const{schema:i,name:s,graphql:b}=t,{typeName:h,multiTypeName:y}=b;let g=d({schema:i,options:{formType:e}}),v=f({queryFieldNames:g,readableFieldNames:u.getFragmentFieldNames({schema:i,options:{onlyViewable:!0}})});if(n&&(null==n?void 0:n.length)>0){const e=n.map(e=>e+"_intl"),t=[...n,...e];g=a.default(g,t),v=a.default(v,t)}if((null==r?void 0:r.length)&&(g=g.concat(r),v=v.concat(r)),i.userId&&(g.unshift("userId"),v.unshift("userId")),i._id&&(g.unshift("_id"),v.unshift("_id")),g=o.default(g),v=o.default(v),0===g.length)throw new Error(`Model "${t.name}" has no queryable fields, cannot create a form for it. Please add readable/createable/updateable fields to the model schema.`);if(0===v.length)throw new Error(`Model "${t.name}" has no mutable fields, cannot create a form for it. Please add createable/updateable fields to model schema.`);const F=m(e,y,"query"),C=p({schema:i,fragmentName:`fragment ${F} on ${h}`,options:{formType:e,isMutation:!1},fieldNames:g});if(!C)throw new Error(`Model ${t.name} with fields ${g} yield an empty query fragment.`);const _=l.gql(C),O=m(e,y,"mutation"),j=p({schema:i,fragmentName:`fragment ${O} on ${h}`,options:{formType:e,isMutation:!0},fieldNames:v});if(!j)throw new Error(`Model ${t.name} with fields ${v} yield an empty mutation fragment.`);return{queryFragment:_,mutationFragment:l.gql(j),queryFragmentName:F,mutationFragmentName:O,extraQueries:c.default(d({schema:i,options:{formType:e}}).map(e=>i[e].query))}}},function(e,t){e.exports=require("@vulcanjs/schema")},function(e,t){e.exports=require("@vulcanjs/react-hooks")},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Dummy=void 0;const o=r(n(0));t.Dummy=()=>o.default.createElement("span",null,"You have not setup VulcanComponentsProvider. Please add following code in your app:"," ",o.default.createElement("code",null,'import { VulcanComponentsProvider } from "@vulcanjs/react-ui"; const YourApp = <VulcanComponentsProvider>{/* your app */}</VulcanComponentsProvider>;}'))},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,a){function l(e){try{i(r.next(e))}catch(e){a(e)}}function u(e){try{i(r.throw(e))}catch(e){a(e)}}function i(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(l,u)}i((r=r.apply(e,t||[])).next())}))},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Form=void 0;const i=a(n(0)),s=n(38),c=n(3),m=n(4),d=u(n(39)),f=u(n(10)),p=u(n(7)),b=u(n(40)),h=u(n(41)),y=u(n(22)),g=u(n(8)),v=u(n(42)),F=u(n(12)),C=u(n(43)),_=u(n(23)),O=u(n(44)),j=u(n(45)),E=u(n(46)),P=u(n(24)),x=n(25),D=n(14),N=n(27),I=n(2),M=n(53),w=n(60),S=n(62),k=n(1),T=e=>{const t=e.schema||e.model.schema,n=x.convertSchema(t),r="new"===(e.document?"edit":"new")?(e=>C.default(h.default(e,e=>e.defaultValue),e=>e))(n):{},o=y.default({},r,e.prefilledProps,(a=e.document,v.default(a,e=>null==e)));var a;return Object.keys(n).forEach(e=>{let t=n[e].minCount;if(t)for(o[e]=o[e]||[];o[e].length<t;)o[e].push({})}),m.removeProperty(o,"__typename"),{disabled:e.disabled,errors:[],deletedValues:[],currentValues:{},originalSchema:x.convertSchema(t,{removeArrays:!1}),schema:n,flatSchema:x.convertSchema(t,{flatten:!0}),initialDocument:o,currentDocument:o}},V=({isChanged:e,warnUnsavedChanges:t,children:n})=>(S.useWarnOnUnsaved({isChanged:e,warnUnsavedChanges:t}),i.default.createElement(i.default.Fragment,null,n)),L=(e,t,n,{submitFormCallbacks:r,form:o})=>{const{currentDocument:a}=n,{model:l,prefilledProps:u}=t;let i=u||{};i=v.default(i,(e,t)=>t.endsWith(".$"));const c=Object.assign({schema:l.schema,excludeRemovedFields:!1,excludeHiddenFields:!1,replaceIntlFields:!0,addExtraFields:!1},e),m=M.getFieldNames(t,a,c);return i=Object.assign(Object.assign({},i),F.default(a,...m)),n.deletedValues.forEach(e=>{e.includes(".")&&((e,t)=>{const n=N.getParentPath(t);j.default(e,n,e=>Array.isArray(e)?f.default(e):e)})(i,e)}),i=s.runCallbacks({callbacks:r,iterator:i,args:[{}]}),i};t.Form=e=>{const{initCallback:t,createDocument:n,updateDocument:r,deleteDocument:o}=e,a=T(e),{schema:u,originalSchema:m,flatSchema:f,initialDocument:h}=a,v=i.useRef(!0);i.useEffect(()=>{v.current?v.current=!1:t&&t(a.currentDocument)},[t]);Object.assign(Object.assign({},{layout:"horizontal",prefilledProps:{},repeatErrors:!1,showRemove:!0,showDelete:!0}),e);const F=[],C=[],j=[],N=c.useIntlContext(),[S,q]=i.useState([]),A=e=>{let t=s.getErrors(e);console.log(t),q(e=>[...e,...t])},[B,$]=i.useState([]),[R,U]=i.useState({submitFormCallbacks:[],successFormCallbacks:[],failureFormCallbacks:[]}),[G,H]=i.useState({}),[z,W]=i.useState(h),K=()=>{e.refetch&&e.refetch()},[Q,Y]=i.useState(!1),[J,X]=i.useState(!1),Z=(t={})=>{const{document:n}=t,r=n?y.default({},e.prefilledProps,n):null;q([]),H({}),$([]),W(r||h),Y(!1)},ee=i.useRef(null),te=function(t,n){Y(!1),X(!0),"new"===n&&K();let{document:r}=t;ee.current&&Z({document:"edit"===n?r:void 0}),r=s.runCallbacks({callbacks:C,iterator:r,args:[{form:ee.current}]}),e.successCallback&&e.successCallback(r,{form:this})},ne=(t,n)=>{Y(!1),console.error("// graphQL Error"),console.error(n),s.runCallbacks({callbacks:j,iterator:n,args:[{error:n,form:ee.current}]}),P.default(n)||A(n),e.errorCallback&&e.errorCallback(t,n,{form:this})},re=t=>o=>l(void 0,void 0,void 0,(function*(){var a,l;o&&o.preventDefault(),o&&o.stopPropagation();const{contextName:u}=e;if(Q)return;q([]),Y(!0);let i=L({replaceIntlFields:!0,addExtraFields:!1,mutableFields:me},e,{currentDocument:z,deletedValues:B},{form:ee.current,submitFormCallbacks:F});if(e.submitCallback&&(i=e.submitCallback(i)||i),"new"===t)try{const e=yield n({input:{data:i,contextName:u}});(null===(a=e.errors)||void 0===a?void 0:a.length)?ne(ae,e.errors[0]):function(e){te(e,"new")}(e)}catch(e){ne(ae,e)}else try{const e=z._id,t=yield r({input:{id:e,data:i,contextName:u}});(null===(l=t.errors)||void 0===l?void 0:l.length)?ne(ae,t.errors[0]):function(e){te(e,"edit")}(t)}catch(e){ne(ae,e)}})),{successComponent:oe,document:ae,currentUser:le,model:ue,warnUnsavedChanges:ie}=e,se=k.useVulcanComponents(),ce=ae?"edit":"new",me="edit"===ce?x.getEditableFields(u,le,h):x.getInsertableFields(u,le),{formLayoutProps:de,formGroupProps:fe}=((e,t,n,r)=>{const{currentUser:o,repeatErrors:a,submitLabel:l,cancelLabel:u,revertLabel:i,cancelCallback:s,revertCallback:c,id:m,model:d,prefilledProps:f,itemProperties:p,contextName:b,showRemove:h,showDelete:y}=e,{disabled:v,currentDocument:F}=t,{formType:C}=n,{deleteDocument:_}=r,O={document:F,formType:C,currentUser:o,disabled:v,prefilledProps:f,itemProperties:p,contextName:b},j="document-"+C,E=d.name.toLowerCase(),P={model:d,currentUser:o,submitLabel:l,cancelLabel:u,revertLabel:i,cancelCallback:s,revertCallback:c,document:F,deleteDocument:"edit"===C&&h&&y&&_||null};return{commonProps:O,formSubmitProps:P,formGroupProps:e=>Object.assign(Object.assign(Object.assign({key:e.name},e),{group:g.default(e,["fields"])}),O),formLayoutProps:{formProps:{className:`${j} ${j}-${E}`,id:m},repeatErrors:a,submitProps:P,commonProps:O}}})(e,{disabled:Q,currentDocument:z},{formType:ce},{deleteDocument:()=>{const t=z,n=e.document._id,r=t.title||t.name||"",a=N.formatMessage({id:"forms.delete_confirm"},{title:r});"42".confirm(a)&&o({input:{id:n}}).then(t=>{e.removeSuccessCallback&&e.removeSuccessCallback({documentId:n,documentTitle:r}),K()}).catch(e=>{console.log(e)})}}),pe=w.isNotSameDocument(h,z);return J&&oe?oe:i.default.createElement(V,{isChanged:pe,warnUnsavedChanges:ie},i.default.createElement(I.FormContext.Provider,{value:{throwError:A,clearForm:Z,refetchForm:K,isChanged:pe,submitForm:(e=>t=>{re(e)(t)})(ce),addToDeletedValues:e=>{$(t=>[...t,e])},updateCurrentValues:(t,n={})=>{const{mode:r="overwrite"}=n,{changeCallback:o}=e,a={currentValues:d.default(G),currentDocument:d.default(z),deletedValues:d.default(B)};Object.keys(t).forEach(e=>{const n=e;let o=t[e];if(D.isEmptyValue(o))O.default(a.currentValues,n),_.default(a.currentDocument,n,null),a.deletedValues=[...a.deletedValues,n];else{if(_.default(a.currentValues,n,o),"merge"===r&&(Array.isArray(o)||b.default(o))){const e=p.default(a.currentDocument,n);_.default(a.currentDocument,n,y.default(e,o))}else _.default(a.currentDocument,n,o);a.deletedValues=E.default(a.deletedValues,n)}}),o&&o(a.currentDocument),H(a.currentValues),W(a.currentDocument),$(a.deletedValues)},getDocument:()=>z,getLabel:(e,t)=>M.getLabel(ue,f,N,e,t),initialDocument:h,addToSubmitForm:e=>{U(e=>Object.assign({},e))},addToSuccessForm:e=>{U(t=>Object.assign(Object.assign({},t),{successFormCallbacks:[...t.successFormCallbacks,e]}))},addToFailureForm:e=>{U(t=>Object.assign(Object.assign({},t),{failureFormCallbacks:[...t.failureFormCallbacks,e]}))},clearFormCallbacks:()=>{U({submitFormCallbacks:[],successFormCallbacks:[],failureFormCallbacks:[]})},errors:S,currentValues:G,deletedValues:B,clearFieldErrors:e=>{q(t=>t.filter(t=>t.path!==e))}}},i.default.createElement(se.FormLayout,Object.assign({},de),M.getFieldGroups(e,{currentDocument:z,schema:u,flatSchema:f,originalSchema:m},N,me,N.formatMessage).map((e,t)=>i.default.createElement(se.FormGroup,Object.assign({key:t},fe(e)))))))};t.default=t.Form},function(e,t){e.exports=require("@vulcanjs/core")},function(e,t){e.exports=require("lodash/cloneDeep")},function(e,t){e.exports=require("lodash/isObject")},function(e,t){e.exports=require("lodash/mapValues")},function(e,t){e.exports=require("lodash/omitBy")},function(e,t){e.exports=require("lodash/pickBy")},function(e,t){e.exports=require("lodash/unset")},function(e,t){e.exports=require("lodash/update")},function(e,t){e.exports=require("lodash/without")},function(e,t){e.exports=require("lodash/isPlainObject")},function(e,t){e.exports=require("lodash/size")},function(e,t){e.exports=require("lodash/toPath")},function(e,t){e.exports=require("lodash/initial")},function(e,t){e.exports=require("lodash/fp/flow")},function(e,t){e.exports=require("lodash/takeRight")},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getFieldGroups=t.getFieldNames=t.getLabel=void 0;const o=n(25),a=r(n(16)),l=r(n(10)),u=r(n(7)),i=r(n(12)),s=n(3),c=r(n(54)),m=r(n(55)),d=r(n(56)),f=r(n(57)),p=r(n(58)),b=r(n(17)),h=r(n(59)),y=n(4);t.getLabel=(e,t,n,r,o)=>{const a=e.name.toLowerCase(),l=s.formatLabel({intl:n,fieldName:r,collectionName:a,schema:t});if(o){return`${l} (${n.formatMessage({id:"locales."+o,defaultMessage:o})})`}return l};const g=(e,t,n,r)=>{const o=e.name.toLowerCase(),a=r.intlId||`${o}.${n}.${r.value}`;return t.formatMessage({id:a,defaultMessage:r.label})};t.getFieldNames=(e,t,n)=>{const{fields:r,addFields:o,removeFields:l}=e,u=Object.assign(Object.assign({},{excludeHiddenFields:!0,excludeRemovedFields:!0,replaceIntlFields:!1,addExtraFields:!1}),n),{schema:i,mutableFields:c,excludeRemovedFields:m,excludeHiddenFields:d,addExtraFields:h,replaceIntlFields:y}=u;let g=c;if(void 0!==r&&r.length>0&&(g=b.default(g,r)),m&&void 0!==l&&l.length>0&&(g=f.default(g,l)),h&&void 0!==o&&o.length>0&&(g=null==g?void 0:g.concat(o)),d){const n=t;g=p.default(g,t=>{const r=null==i?void 0:i[t].hidden;return"function"==typeof r?r({props:e,document:n}):r})}return y&&(g=null==g?void 0:g.map(e=>s.isIntlField(null==i?void 0:i[e])?e+"_intl":e)),g=a.default(g),g};const v=(e,n,r,a,l)=>{const{model:c}=e,{currentDocument:m,flatSchema:d}=n,f=u.default(l,"type.0.type")===Array;let p=Object.assign(Object.assign({},i.default(l,o.formProperties)),{name:a,datatype:l.type,layout:e.layout,input:l.input||l.control});if(f){const e=n.originalSchema[a+".$"];p.itemDatatype=u.default(e,"type.0.type")}p.label=t.getLabel(c,d,r,a),p.intlKeys=s.getIntlKeys(a);const b=m;p.document=b,p.options&&Array.isArray(p.options)&&(p.options=p.options.map(e=>Object.assign(Object.assign({},e),{label:g(c,r,a,e)}))),s.isIntlField(l)&&(p.intlInput=!0);const h=l.form||l.inputProperties||{};for(const t in h){const n=h[t];p[t]="function"==typeof n?n.call(l,Object.assign(Object.assign({},e),{fieldName:a,document:b,intl:r})):n}const y=((e,t,n,r)=>{const o=e.name.toLowerCase();return s.getIntlLabel({intl:n,fieldName:r,collectionName:o,schema:t,isDescription:!0})||null})(c,d,r,a);return y&&(p.help=y),p},F=(e,t,n)=>{const r=n?`${n}.${t}`:t;return e.path=r,e},C=(e,t,n)=>(n.includes(t)||(e.disabled=!0),e),_=(e,n,r,o,a,l,u,i)=>{const s=a[o];let c=v(e,n,r,o,s);return c=F(c,o,i),c=((e,t)=>(t&&(e.parentFieldName=t),e))(c,u),c=C(c,o,l),c=((e,n,r,o,a,l,u,i)=>{const{currentDocument:s}=n;return l.arrayFieldSchema&&(o.arrayFieldSchema=l.arrayFieldSchema,o.arrayField=O(e,n,r,a,o.arrayFieldSchema,u,i)),l.schema&&(o.nestedSchema=l.schema,o.nestedInput=!0,o.nestedFields=t.getFieldNames(e,s,{schema:o.nestedSchema,addExtraFields:!1}).map(t=>_(e,n,r,t,o.nestedSchema,i,a,o.path))),o})(e,n,r,c,o,s,a,l),c},O=(e,t,n,r,o,a,l)=>{let u=v(e,t,n,r+".$",o);return u=F(u,r),u=C(u,r,l),u};t.getFieldGroups=(e,n,r,o,a)=>{const{schema:u,currentDocument:i}=n;let s=t.getFieldNames(e,i,{mutableFields:o,schema:u}).map(t=>_(e,n,r,t,u,o));s=m.default(s,"order");let f=l.default(d.default(c.default(s,"group"),e=>e?e.name:"")).map(e=>{const t=e.label||y.capitalize(e.name),n=h.default(s,t=>t.group&&t.group.name===e.name);return Object.assign(Object.assign({},e),{label:t,fields:n})});const p=h.default(s,e=>!e.group);if(p.length){f=[{name:"default",label:"default",order:0,fields:p}].concat(f)}return f=m.default(f,"order"),f}},function(e,t){e.exports=require("lodash/map")},function(e,t){e.exports=require("lodash/sortBy")},function(e,t){e.exports=require("lodash/uniqBy")},function(e,t){e.exports=require("lodash/difference")},function(e,t){e.exports=require("lodash/reject")},function(e,t){e.exports=require("lodash/filter")},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.isNotSameDocument=void 0;const o=r(n(26)),a=r(n(61));t.isNotSameDocument=(e,t)=>void 0!==o.default(t,(t,n,r)=>!a.default(t,e[n],(e,t)=>{if(!e&&!t)return!0}))},function(e,t){e.exports=require("lodash/isEqualWith")},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(63),t)},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useWarnOnUnsaved=void 0;const o=n(64),a=r(n(15)),l=n(3),u=a.default("vn:route-transitions");t.useWarnOnUnsaved=({isChanged:e,warnUnsavedChanges:t})=>{const n=l.useIntlContext();o.useBlockTransition({shouldBlock:!(!t||!e),getBlockedMessage:e=>{u("running handlePageLeave",e);return n.formatMessage({id:"forms.confirm_discard",defaultMessage:"Are you sure you want to discard your changes?"})}})}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useBlockTransition=void 0;const o=n(0),a=n(65),l=r(n(15)).default("vn:router-transitions");t.useBlockTransition=({shouldBlock:e,getBlockedMessage:t})=>{const n=o.useRef();o.useEffect(()=>{const r=!!n.current;l("running effect","should block",e,"currently blocked",r);const o=()=>{l("running unblock from effect"),e||n.current&&n.current()},u=e=>{const n=t(e);return l("user is being blocked after trying to leave the page, with message: "+n),e&&(e.returnValue=n),n};e&&(l("should block transition, setting up relevant event listener"),n.current=a.block(u,o)),!e&&r&&(l("should unblock (state has been reinitialized)"),n.current&&n.current())},[e])}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.block=t.UNBLOCK_TRANSITION_EVENT_TYPE=t.BLOCK_TRANSITION_EVENT_TYPE=void 0;const o=r(n(15)).default("vn:route-transition");function a(e){e.preventDefault(),e.returnValue=""}t.BLOCK_TRANSITION_EVENT_TYPE="blocktransition",t.UNBLOCK_TRANSITION_EVENT_TYPE="unblocktransition";t.block=(e,n)=>{o("running block function");const r=new Event(t.BLOCK_TRANSITION_EVENT_TYPE);"42".dispatchEvent(r),"42".addEventListener("beforeunload",a),"42".addEventListener("beforeunload",e);return()=>{o("running unblock function"),n&&(o("running user defined function"),n());const r=new Event(t.UNBLOCK_TRANSITION_EVENT_TYPE);"42".dispatchEvent(r),"42".removeEventListener("beforeunload",a),"42".removeEventListener("beforeunload",e),"42".onbeforeunload=void 0}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanComponentsProvider=void 0;const a=o(n(0)),l=n(68),u=n(11),i=n(1);t.VulcanComponentsProvider=e=>{var{value:t}=e,n=r(e,["value"]);const o=i.useVulcanComponents(),s=Object.assign(Object.assign(Object.assign({},l.defaultVulcanComponents),(null==o?void 0:o.__not_intialized)?{}:o||{}),t||{});return Object.keys(s).forEach(e=>{s[e].displayName="Vulcan."+e}),a.default.createElement(u.VulcanComponentsContext.Provider,Object.assign({value:s},n))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.defaultVulcanComponents=void 0;const o=n(3),a=n(69),l=r(n(70)),u=n(71),i=n(74),s=n(75),c=n(76),m=n(78),d=n(79),f=n(80),p=n(81),b=n(82),h=n(83),y=n(84),g=n(85),v=n(86),F=n(87),C=n(88),_=n(21),O=n(89),j=n(90),E=n(93),P=n(94),x=n(95),D=n(96),N=n(97),I=n(98),M=r(n(99)),w={Loading:P.Loading,Alert:()=>null,Button:E.Button,Icon:()=>null,FormattedMessage:o.FormattedMessage,LoadingButton:x.LoadingButton,MutationButton:D.MutationButton,HeadTags:N.HeadTags,TooltipTrigger:I.TooltipTrigger,Dropdown:M.default},S={FormError:a.FormError,FormComponentDefault:O.FormComponentDefault,FormComponentPassword:O.FormComponentPassword,FormComponentNumber:O.FormComponentNumber,FormComponentUrl:O.FormComponentUrl,FormComponentEmail:O.FormComponentEmail,FormComponentTextarea:O.FormComponentTextarea,FormComponentCheckbox:O.FormComponentCheckbox,FormComponentCheckboxGroup:O.FormComponentCheckboxGroup,FormComponentRadioGroup:O.FormComponentRadioGroup,FormComponentSelect:O.FormComponentSelect,FormComponentSelectMultiple:O.FormComponentSelectMultiple,FormComponentDateTime:O.FormComponentDateTime,FormComponentDate:O.FormComponentDate,FormComponentTime:O.FormComponentTime,FormComponentStaticText:O.FormComponentStaticText,FormComponentLikert:O.FormComponentLikert,FormComponent:l.default,FormComponentInner:u.FormComponentInner,FormComponentLoader:i.FormComponentLoader,FormElement:s.FormElement,FormGroup:c.FormGroup,FormGroupLayout:c.FormGroupLayout,FormGroupHeader:c.FormGroupHeader,FormIntl:m.FormIntl,FormIntlItemLayout:m.FormIntlItemLayout,FormIntlLayout:m.FormIntlLayout,FieldErrors:v.FieldErrors,FormErrors:d.FormErrors,FormSubmit:f.FormSubmit,FormLayout:p.FormLayout,FormNestedArray:b.FormNestedArray,FormNestedArrayInnerLayout:b.FormNestedArrayInnerLayout,FormNestedArrayLayout:h.FormNestedArrayLayout,FormNestedItem:y.FormNestedItem,IconAdd:b.IconAdd,IconRemove:b.IconRemove,FormNestedDivider:g.FormNestedDivider,FormNestedItemLayout:y.FormNestedItemLayout,FormNestedObjectLayout:F.FormNestedObjectLayout,FormNestedObject:F.FormNestedObject,FormOptionLabel:C.FormOptionLabel,Form:_.Form,FormItem:O.FormItem,FormComponentAutocomplete:O.FormComponentAutocomplete,FormComponentMultiAutocomplete:j.AutocompleteMultiple};t.defaultVulcanComponents=Object.assign(Object.assign({},w),S)},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormError=void 0;const o=r(n(0)),a=r(n(7)),l=n(1),u=n(2);t.FormError=({error:e,errorContext:t})=>{const n=l.useVulcanComponents(),{getLabel:r}=u.useFormContext(),i=JSON.stringify(e.message||e);let s={id:e.id||"app.defaultError",defaultMessage:i,values:{errorContext:t,defaultMessage:i}};if(e.properties){const t=e.properties.name&&e.properties.name.split(".").slice(-1)[0];s.values=Object.assign(Object.assign(Object.assign({},s.values),{label:t&&r(t,e.properties.locale)}),e.properties)}e.data&&(s.values=Object.assign(Object.assign({},s.values),e.data));const c=a.default(e,"extensions.exception");return c&&(s=Object.assign(Object.assign({},s),{id:c.id,values:c.data})),o.default.createElement(n.FormattedMessage,Object.assign({html:!0},s))},t.FormError.defaultProps={errorContext:""}},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.formComponentsDependencies=t.FormComponent=void 0;const u=a(n(0)),i=l(n(7)),s=l(n(28)),c=n(14),m=n(1),d=n(29),f=n(2),p=(e,t)=>{const n=e&&e.length?e.length:0;return{charsRemaining:t-n,charsCount:n}},b=({intlInput:e,path:t})=>e?t+"_intl":t,h=(e,t)=>t||d.getAutoInputFromType(e),y=({type:e,input:t,FormComponents:n})=>{if("function"==typeof t){return t}{const r=h(e,t);switch(r){case"text":return n.FormComponentDefault;case"password":return n.FormComponentPassword;case"number":return n.FormComponentNumber;case"url":return n.FormComponentUrl;case"email":return n.FormComponentEmail;case"textarea":return n.FormComponentTextarea;case"checkbox":return n.FormComponentCheckbox;case"checkboxgroup":return n.FormComponentCheckboxGroup;case"radiogroup":return n.FormComponentRadioGroup;case"select":return n.FormComponentSelect;case"selectmultiple":return n.FormComponentSelectMultiple;case"datetime":return n.FormComponentDateTime;case"date":return n.FormComponentDate;case"time":return n.FormComponentTime;case"statictext":return n.FormComponentStaticText;case"likert":return n.FormComponentLikert;case"autocomplete":return n.FormComponentAutocomplete;case"multiautocomplete":return n.FormComponentMultiAutocomplete;default:throw new Error(`Input name "${r}" is not a standard Vulcan form input (type: ${e}, input: ${t})`)}}};t.FormComponent=e=>{const{locale:t,max:n,path:r,datatype:o,input:a,intlInput:l,nestedInput:d,query:g,options:v}=e,{updateCurrentValues:F,deletedValues:C,clearFieldErrors:_}=f.useFormContext(),O=o,j=(({document:e,max:t,intlInput:n,path:r})=>{if(!t)return null;const o=b({intlInput:n,path:r}),a=null==e?void 0:e[o],l=a&&"object"==typeof a?a.value:a;return p(l,t)})(e),[E,P]=u.useState(j),x=e=>{if(!n)throw new Error("Cannot update character count when no max value is set.");P(p(e,n))};u.useEffect(()=>{j&&P(j)},[null==j?void 0:j.charsCount,null==j?void 0:j.charsRemaining]);let D=!1,N=null;"string"==typeof a&&(N=h(O,a),D=!(void 0===n||!N||!["url","email","textarea","text"].includes(N)));const I=()=>{const{locale:t,defaultValue:n,formType:r,datatype:o}=e,a=t?b(e)+".value":b(e),l=e.document;let u=i.default(l,a);const s=t?"":c.getNullValue(o);return C.includes(a)?u=s:c.isEmptyValue(u)&&(u="new"===r&&n?n:s),u},M=t=>(t=t||e.errors||[]).filter(e=>e.path&&e.path.includes(r)),w=m.useVulcanComponents();if(l)return u.default.createElement(w.FormIntl,Object.assign({},e));if(!a&&d){if((e=>e===Array)(O))return u.default.createElement(w.FormNestedArray,Object.assign({},e,{formComponents:w,errors:M(),value:I()}));if((e=>e instanceof s.default)(O))return u.default.createElement(w.FormNestedObject,Object.assign({},e,{formComponents:w,errors:M(),value:I()}))}const S=Object.assign(Object.assign(Object.assign({},e),E||{}),{inputType:h(O,a),value:I(),errors:M(),showCharsRemaining:!!D,handleChange:n=>{if(""===n&&(n=null),O===Number&&null!=n?n=Number(n):O===s.default.Integer&&null!=n&&(n=parseInt(n)),n!==I()){const r=t?{locale:t,value:n}:n;F({[b(e)]:r}),_(b(e))}D&&x(n)},clearField:e=>{e.preventDefault(),e.stopPropagation(),F({[r]:null}),D&&x(null)},formInput:y({FormComponents:w,input:a,type:O})});g||"function"!=typeof v||(S.options=v(S));const k=u.default.createElement(w.FormComponentInner,Object.assign({},S));return g?u.default.createElement(w.FormComponentLoader,Object.assign({},S),k):k},t.formComponentsDependencies=["FormComponentDefault","FormComponentPassword","FormComponentNumber","FormComponentUrl","FormComponentEmail","FormComponentTextarea","FormComponentCheckbox","FormComponentCheckboxGroup","FormComponentRadioGroup","FormComponentSelect","FormComponentSelectMultiple","FormComponentDateTime","FormComponentDate","FormComponentDate2","FormComponentTime","FormComponentStaticText","FormComponentLikert","FormComponentAutocomplete","FormComponentMultiAutocomplete"],t.default=t.FormComponent},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentInner=void 0;const o=r(n(0)),a=n(3),l=n(72),u=r(n(73)),i=n(29),s=n(1);t.FormComponentInner=e=>{const t=a.useIntlContext(),{inputType:n,disabled:r,clearField:c}=e,{inputClassName:m,name:d,input:f,beforeComponent:p,afterComponent:b,errors:h,showCharsRemaining:y,charsRemaining:g,renderComponent:v,formInput:F}=e,C=s.useVulcanComponents(),_=h&&h.length,O="function"==typeof f?f.name:n,j=u.default("form-input",m,"input-"+d,"form-component-"+(O||"default"),{"input-error":_}),E=(()=>{const{handleChange:t,inputType:n,itemProperties:r,help:o,description:a,loading:u,submitForm:i,formComponents:s,intlKeys:c}=e;return Object.assign(Object.assign({},e),{inputProperties:Object.assign(Object.assign({},l.whitelistInputProps(e)),{onChange:e=>{const r="checkbox"===n?e.target.checked:e.target.value;t&&t(r)}}),itemProperties:Object.assign(Object.assign({},r),{intlKeys:c,Components:s,description:a||o,loading:u})})})(),P=F;return o.default.createElement("div",{className:j},o.default.createElement(P,Object.assign({},E)),_?o.default.createElement(C.FieldErrors,{errors:h}):null,(()=>{if(i.clearableInputs.includes(n)&&!r)return o.default.createElement("button",{className:"form-component-clear",title:t.formatMessage({id:"forms.clear_field"}),onClick:c},o.default.createElement("span",null,"✕"))})(),y&&o.default.createElement("div",{className:u.default("form-control-limit",{danger:g<10})},g))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.whitelistInputProps=t.getHtmlInputProps=void 0;const o=r(n(12));t.getHtmlInputProps=e=>{const{name:t,path:n,options:r,label:o,onChange:a,onBlur:l,value:u,disabled:i}=e,s=Object.assign(Object.assign({},e.inputProperties),{name:t,path:n,options:r,label:o,onChange:a,onBlur:l,value:u,disabled:i});return Object.assign(Object.assign({},e),{inputProperties:s})};t.whitelistInputProps=e=>o.default(e,["name","path","options","label","onChange","onBlur","value","disabled","placeholder"])},function(e,t){e.exports=require("classnames")},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentLoader=void 0;const u=a(n(0)),i=n(6),s=l(n(24)),c=n(1);t.FormComponentLoader=e=>{const t=c.useVulcanComponents(),{query:n,children:r,options:o,value:a,queryWaitsForValue:l}=e,m="function"==typeof n?n({value:a}):n,[d,{loading:f,error:p,data:b}]=i.useLazyQuery(i.gql(m)),h=s.default(a)||0===(Array.isArray(a)&&a.length);if(u.useEffect(()=>{l&&h||d({variables:{value:a}})},[h,a,l]),p)throw new Error(p.toString());if(f)return u.default.createElement("div",{className:"form-component-loader"},u.default.createElement(t.Loading,null));const y={data:b,queryData:b,queryError:p,loading:f};if("function"==typeof o&&(y.optionsFunction=o,y.options=o.call({},Object.assign(Object.assign({},e),{data:b}))),!u.default.isValidElement(r))throw new Error("Children of FormComponentLoader must be a React element, got "+r);const g=u.default.cloneElement(r,y);return u.default.createElement("div",{className:"form-component-loader"},g)},t.FormComponentLoader.propTypes={}},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormElement=void 0;const a=o(n(0)),l=n(2);t.FormElement=a.default.forwardRef((e,t)=>{var{children:n}=e,o=r(e,["children"]);const{submitForm:u}=l.useFormContext();return a.default.createElement("form",Object.assign({},o,{onSubmit:u,ref:t}),n)})},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormGroup=t.FormGroupHeader=t.FormGroupLayout=void 0;const i=a(n(0)),s=u(n(77)),c=n(13),m=n(1),d=n(2);t.FormGroupLayout=e=>{var{anchorName:t,collapsed:n,hasErrors:r,group:o,document:a,toggle:u}=e,s=l(e,["anchorName","collapsed","hasErrors","group","document","toggle"]);return i.default.createElement("fieldset",Object.assign({},s))};t.FormGroupHeader=e=>i.default.createElement("h2",Object.assign({},e));t.FormGroup=e=>{const{name:t,label:n,group:r,fields:o,hidden:a,document:l,currentUser:u,disabled:f,itemProperties:p,prefilledProps:b,formType:h}=e,{errors:y,clearFieldErrors:g}=d.useFormContext(),[v,F]=i.useState(r.startCollapsed||!1),C=()=>F(e=>!e),_=s.default(o,e=>!!y.filter(t=>t.path===e.path).length),O=m.useVulcanComponents(),j="function"==typeof a?a(Object.assign(Object.assign({},e),{document:l})):a||!1,E=i.default.createElement(O.FormGroupHeader,{toggle:C,label:n,collapsed:v,hidden:j,group:r});if(r.adminsOnly&&!c.isAdmin(u))return null;const P=t.split(".").length>1?t.split(".")[1]:t;return i.default.createElement(O.FormGroupLayout,{label:n,anchorName:P,toggle:C,collapsed:v,hidden:j,group:r,heading:"default"===t?null:E,hasErrors:_,document:l},o.map(e=>i.default.createElement(O.FormComponent,Object.assign({key:e.name,disabled:f},e,{document:l,itemProperties:Object.assign(Object.assign({},p),e.itemProperties),clearFieldErrors:g,formType:h,currentUser:u,prefilledProps:b}))))},t.default=t.FormGroup},function(e,t){e.exports=require("lodash/some")},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormIntl=t.FormIntlItemLayout=t.FormIntlLayout=void 0;const o=r(n(0)),a=r(n(8)),l=n(1),u=n(2);t.FormIntlLayout=({children:e})=>o.default.createElement("div",{className:"form-intl"},e);t.FormIntlItemLayout=({locale:e,children:t})=>o.default.createElement("div",{className:"form-intl-"+e.id},t);t.FormIntl=e=>{const t=l.useVulcanComponents(),{getLabel:n}=u.useFormContext(),{name:r}=e,i=a.default(e,"value","inputProperties","intlInput","nestedInput");return o.default.createElement(t.FormIntlLayout,null,[].map((a,l)=>{return o.default.createElement(t.FormIntlItemLayout,{key:a.id,locale:a},o.default.createElement(t.FormComponent,Object.assign({},i,{label:n(r,a.id),path:(u=l,`${e.path}_intl.${u}`),locale:a.id})));var u}))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormErrors=void 0;const o=r(n(0)),a=n(2),l=n(1);t.FormErrors=()=>{const e=l.useVulcanComponents(),{errors:t}=a.useFormContext();return o.default.createElement("div",{className:"form-errors"},!!t.length&&o.default.createElement(e.Alert,{className:"flash-message",variant:"danger"},o.default.createElement("ul",null,t.map((t,n)=>o.default.createElement("li",{key:n},o.default.createElement(e.FormError,{error:t,errorContext:"form"}))))))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormSubmit=void 0;const o=r(n(0)),a=r(n(5)),l=n(13),u=n(1),i=n(2);t.FormSubmit=({submitLabel:e,cancelLabel:t,cancelCallback:n,revertLabel:r,revertCallback:a,document:s,deleteDocument:c,model:m,currentUser:d})=>{const f=u.useVulcanComponents(),{clearForm:p}=i.useFormContext();return o.default.createElement("div",{className:"form-submit"},o.default.createElement(f.Button,{type:"submit",variant:"primary"},e||o.default.createElement(f.FormattedMessage,{id:"forms.submit",defaultMessage:"Submit"})),n?o.default.createElement("a",{className:"form-cancel",onClick:e=>{e.preventDefault(),n(s)}},t||o.default.createElement(f.FormattedMessage,{id:"forms.cancel",defaultMessage:"Cancel"})):null,a?o.default.createElement("a",{className:"form-cancel",onClick:e=>{e.preventDefault(),p(),a(s)}},r||o.default.createElement(f.FormattedMessage,{id:"forms.revert",defaultMessage:"Revert"})):null,c&&l.canDeleteDocument({user:d,document:s,model:m})?o.default.createElement("div",null,o.default.createElement("hr",null),o.default.createElement(f.Button,{variant:"link",onClick:c,className:`delete-link ${m.name}-delete-link`},o.default.createElement(f.Icon,{name:"close"})," ",o.default.createElement(f.FormattedMessage,{id:"forms.delete",defaultMessage:"Delete"}))):null)},t.FormSubmit.propTypes={submitLabel:a.default.node,cancelLabel:a.default.node,cancelCallback:a.default.func,revertLabel:a.default.node,revertCallback:a.default.func,document:a.default.object,deleteDocument:a.default.func,collectionName:a.default.string,classes:a.default.object}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.formComponentsDependencies=t.FormLayout=void 0;const o=r(n(0)),a=n(1);t.FormLayout=({commonProps:e,formProps:t,repeatErrors:n,submitProps:r,children:l})=>{const u=a.useVulcanComponents();return o.default.createElement(u.FormElement,Object.assign({},t),o.default.createElement(u.FormErrors,Object.assign({},e)),l,n&&o.default.createElement(u.FormErrors,Object.assign({},e)),o.default.createElement(u.FormSubmit,Object.assign({},e,r)))},t.formComponentsDependencies=["FormErrors","FormSubmit","FormElement"]},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.IconRemove=t.IconAdd=t.formComponentsDependencies=t.FormNestedArray=t.FormNestedArrayInnerLayout=void 0;const u=a(n(0)),i=l(n(8)),s=l(n(7)),c=n(2),m=n(1);t.FormNestedArrayInnerLayout=e=>{const{label:t,children:n,addItem:r,BeforeComponent:o,AfterComponent:a}=e,l=m.useVulcanComponents();return u.default.createElement("div",{className:"form-nested-array-inner-layout"},u.default.createElement(o,Object.assign({},e)),n,u.default.createElement(l.FormNestedDivider,{label:t,addItem:r}),u.default.createElement(a,Object.assign({},e)))};t.FormNestedArray=e=>{const{updateCurrentValues:t,deletedValues:n,errors:r}=c.useFormContext(),o=e.value||[],a=()=>{const{prefilledProps:n,path:r}=e;t({[`${r}.${o.length}`]:s.default(n,r+".$")||{}},{mode:"merge"})},l=t=>n.includes(`${e.path}.${t}`);u.useEffect(()=>{e.itemProperties.openNested&&a()},[]);const d=(e=>{let t=0;return e.map((e,n)=>l(n)?0:(t+=1,t))})(o),f=Object.assign({},i.default(e,"value","input","inputProperties","nestedInput","beforeComponent","afterComponent")),{path:p,minCount:b,maxCount:h,arrayField:y}=e,g=m.useVulcanComponents();let v=o.filter(e=>null!=e).length;return f.addItem=!h||v<h?a:null,f.nestedArrayErrors=r.filter(e=>e.path&&e.path===p),f.hasErrors=!(!f.nestedArrayErrors||!f.nestedArrayErrors.length),u.default.createElement(g.FormNestedArrayLayout,Object.assign({},f),o.map((n,r)=>{if(l(r))return null;const o=`${e.path}.${r}`,i=d[r];return u.default.createElement(g.FormNestedArrayInnerLayout,Object.assign({},y,{key:o,addItem:a,itemIndex:r,visibleItemIndex:i,path:o}),u.default.createElement(g.FormNestedItem,Object.assign({},f,{itemIndex:r,visibleItemIndex:i,path:o,removeItem:()=>{var n;n=r,t({[`${e.path}.${n}`]:null})},hideRemove:!!b&&v<=b})))}))},t.formComponentsDependencies=["FormNestedArrayInnerLayout","FormNestedArrayLayout"],t.default=t.FormNestedArray;t.IconAdd=({width:e=24,height:t=24})=>u.default.createElement("svg",{width:e,height:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},u.default.createElement("path",{fill:"currentColor",d:"M448 294.2v-76.4c0-13.3-10.7-24-24-24H286.2V56c0-13.3-10.7-24-24-24h-76.4c-13.3 0-24 10.7-24 24v137.8H24c-13.3 0-24 10.7-24 24v76.4c0 13.3 10.7 24 24 24h137.8V456c0 13.3 10.7 24 24 24h76.4c13.3 0 24-10.7 24-24V318.2H424c13.3 0 24-10.7 24-24z"}));t.IconRemove=({width:e=24,height:t=24})=>u.default.createElement("svg",{width:e,height:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},u.default.createElement("path",{fill:"currentColor",d:"M424 318.2c13.3 0 24-10.7 24-24v-76.4c0-13.3-10.7-24-24-24H24c-13.3 0-24 10.7-24 24v76.4c0 13.3 10.7 24 24 24h400z"}))},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedArrayLayout=void 0;const o=r(n(5)),a=r(n(0)),l=n(1);t.FormNestedArrayLayout=e=>{const{hasErrors:t,nestedArrayErrors:n,label:r,addItem:o,BeforeComponent:u,AfterComponent:i,children:s}=e,c=l.useVulcanComponents();return a.default.createElement("div",{className:"form-group row form-nested "+(t?"input-error":"")},u&&a.default.createElement(u,Object.assign({},e)),a.default.createElement("label",{className:"control-label col-sm-3"},r),a.default.createElement("div",{className:"col-sm-9"},s,o&&a.default.createElement(c.Button,{className:"form-nested-button form-nested-add",size:"sm",variant:"success",onClick:o},a.default.createElement(c.IconAdd,{height:12,width:12})),e.hasErrors?a.default.createElement(c.FieldErrors,{key:"form-nested-errors",errors:n}):null),i&&a.default.createElement(i,Object.assign({},e)))},t.FormNestedArrayLayout.propTypes={hasErrors:o.default.bool.isRequired,nestedArrayErrors:o.default.array,label:o.default.node,hideLabel:o.default.bool,addItem:o.default.func,beforeComponent:o.default.node,afterComponent:o.default.node,formComponents:o.default.object,children:o.default.node},t.default=t.FormNestedArrayLayout},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedItem=t.FormNestedItemLayout=void 0;const a=o(n(0)),l=o(n(5)),u=n(3),i=n(1),s=n(3);t.FormNestedItemLayout=({content:e,removeButton:t})=>a.default.createElement("div",{className:"form-nested-item"},a.default.createElement("div",{className:"form-nested-item-inner"},e),t&&[a.default.createElement("div",{key:"remove-button",className:"form-nested-item-remove"},t),a.default.createElement("div",{key:"remove-button-overlay",className:"form-nested-item-deleted-overlay"})]),t.FormNestedItemLayout.propTypes={content:l.default.node.isRequired,removeButton:l.default.node};t.FormNestedItem=e=>{var{nestedFields:t,name:n,path:o,removeItem:l,itemIndex:u,formComponents:c,hideRemove:m,label:d}=e,f=r(e,["nestedFields","name","path","removeItem","itemIndex","formComponents","hideRemove","label"]);const p=i.useVulcanComponents(),b=s.useIntlContext(),h=void 0!==u;return a.default.createElement(p.FormNestedItemLayout,{content:t.map((e,t)=>a.default.createElement(p.FormComponent,Object.assign({key:t},f,e,{path:`${o}.${e.name}`,itemIndex:u}))),removeButton:h&&!m&&[a.default.createElement("div",{key:"remove-button",className:"form-nested-item-remove"},a.default.createElement(p.Button,{className:"form-nested-button",variant:"danger",size:"sm",iconButton:!0,tabIndex:-1,onClick:()=>{l(n)},"aria-label":b.formatMessage({id:"forms.delete_nested_field"},{label:d})},a.default.createElement(p.IconRemove,{height:12,width:12}))),a.default.createElement("div",{key:"remove-button-overlay",className:"form-nested-item-deleted-overlay"})]})},t.FormNestedItem.propTypes={path:l.default.string.isRequired,itemIndex:l.default.number,formComponents:l.default.object,hideRemove:l.default.bool},t.FormNestedItem.contextTypes={errors:l.default.array,intl:u.intlShape}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedDivider=void 0;const o=r(n(0)),a=r(n(5));t.FormNestedDivider=({label:e,addItem:t})=>o.default.createElement("div",null),t.FormNestedDivider.propTypes={label:a.default.string,addItem:a.default.func}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FieldErrors=t.formComponentsDependencies=void 0;const o=r(n(0)),a=n(1);t.formComponentsDependencies=["FormError"];t.FieldErrors=({errors:e})=>{const t=a.useVulcanComponents();return o.default.createElement("ul",{className:"form-input-errors"},e.map((e,n)=>o.default.createElement("li",{key:n},o.default.createElement(t.FormError,{error:e,errorContext:"field"}))))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedObject=t.FormNestedObjectLayout=void 0;const o=r(n(0)),a=r(n(5)),l=r(n(8)),u=n(1),i=n(2);t.FormNestedObjectLayout=({hasErrors:e,label:t,content:n})=>o.default.createElement("div",{className:"form-group row form-nested "+(e?"input-error":"")},o.default.createElement("label",{className:"control-label col-sm-3"},t),o.default.createElement("div",{className:"col-sm-9"},n)),t.FormNestedObjectLayout.propTypes={hasErrors:a.default.oneOfType([a.default.number,a.default.bool]),label:a.default.node,content:a.default.node};t.FormNestedObject=e=>{const t=u.useVulcanComponents(),n=l.default(e,"value","input","inputProperties","nestedInput"),{errors:r}=i.useFormContext(),a=r.filter(t=>t.path&&t.path===e.path),s=a&&a.length;return o.default.createElement(t.FormNestedObjectLayout,{hasErrors:s,label:e.label,content:[o.default.createElement(t.FormNestedItem,Object.assign({key:"form-nested-item"},n,{path:""+e.path})),s?o.default.createElement(t.FieldErrors,{key:"form-nested-errors",errors:a}):null]})},t.FormNestedObject.propTypes={currentValues:a.default.object,path:a.default.string,label:a.default.string,errors:a.default.array.isRequired,formComponents:a.default.object},t.default=t.FormNestedObject},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormOptionLabel=void 0;const o=r(n(0));t.FormOptionLabel=({option:e})=>{const{label:t}=e;return o.default.createElement("span",{className:"form-option-label"},t)}},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentAutocomplete=t.FormComponentLikert=t.FormComponentStaticText=t.FormComponentTime=t.FormComponentDateTime=t.FormComponentDate=t.FormComponentSelectMultiple=t.FormComponentSelect=t.FormComponentRadioGroup=t.FormComponentCheckboxGroup=t.FormComponentCheckbox=t.FormComponentTextarea=t.FormComponentEmail=t.FormComponentUrl=t.FormComponentNumber=t.FormComponentPassword=t.FormComponentDefault=t.FormItem=void 0;const a=o(n(0)),l=n(1),u=e=>{const t=l.useVulcanComponents(),{inputProperties:n}=e,{label:o,name:u}=n,i=r(n,["label","name"]);return a.default.createElement(t.FormItem,{name:u,label:o,inputProperties:n},a.default.createElement("input",Object.assign({},i,{id:u,name:u,type:e.type})))};t.FormItem=e=>{const{inputProperties:t,label:n,name:r}=e;return a.default.createElement("div",{className:"form-item "+r},a.default.createElement("label",{htmlFor:r},n),e.children)};const i=e=>{const{inputProperties:t,options:n=[]}=e,{label:r,name:o}=t;if(!Array.isArray(n))throw new Error("HTMLSelectAdapater not yet supporting functional options");const u=l.useVulcanComponents();return a.default.createElement(u.FormItem,{name:o,label:r,inputProperties:t},a.default.createElement("select",Object.assign({},t),n.map(({label:e,value:t})=>a.default.createElement("option",{key:t,label:e,value:t}))))};t.FormComponentDefault=e=>a.default.createElement(u,Object.assign({type:"text"},e));t.FormComponentPassword=e=>a.default.createElement(u,Object.assign({type:"password"},e));t.FormComponentNumber=e=>a.default.createElement(u,Object.assign({type:"number"},e));t.FormComponentUrl=e=>a.default.createElement(u,Object.assign({type:"url"},e));t.FormComponentEmail=e=>a.default.createElement(u,Object.assign({type:"email"},e));t.FormComponentTextarea=e=>a.default.createElement("textarea",Object.assign({},e));t.FormComponentCheckbox=e=>a.default.createElement(i,Object.assign({type:"checkbox"},e));t.FormComponentCheckboxGroup=e=>a.default.createElement(t.FormComponentSelectMultiple,Object.assign({},e));t.FormComponentRadioGroup=e=>{const{inputProperties:t,options:n=[]}=e,{label:r,name:o}=t;if(!Array.isArray(n))throw new Error("RadioGroup not yet supporting functional options");const u=l.useVulcanComponents();return a.default.createElement(u.FormItem,{name:o,label:r,inputProperties:t},n.map(e=>{const{value:t,label:n}=e;return a.default.createElement("div",{key:t,className:"form-radio-group-radio-item"},a.default.createElement(u.FormOptionLabel,{option:e}),a.default.createElement("input",{type:"radio",id:t,name:o,key:t,value:t}))}))};t.FormComponentSelect=e=>a.default.createElement(i,Object.assign({},e));t.FormComponentSelectMultiple=e=>{const t=l.useVulcanComponents();return a.default.createElement(t.FormComponentSelect,Object.assign({multiple:!0},e))};t.FormComponentDate=e=>a.default.createElement(u,Object.assign({type:"date"},e));t.FormComponentDateTime=e=>a.default.createElement(u,Object.assign({type:"datetime-local"},e));t.FormComponentTime=e=>a.default.createElement(u,Object.assign({type:"time"},e));t.FormComponentStaticText=e=>a.default.createElement("input",Object.assign({disabled:!0},e));t.FormComponentLikert=e=>"Likert component not yet implemented";t.FormComponentAutocomplete=e=>"Autocomplete component not yet implemented"},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.AutocompleteMultiple=void 0;const u=n(91),i=a(n(0)),s=n(6),c=l(n(92)),m=n(1),d=n(2);t.AutocompleteMultiple=e=>{const{queryData:t,refFunction:n,path:r,inputProperties:o={},itemProperties:a={},autocompleteQuery:l,optionsFunction:f}=e,{updateCurrentValues:p}=d.useFormContext(),b=m.useVulcanComponents(),{value:h,label:y}=o,[g,v]=i.useState(),[F,{loading:C,error:_,data:O}]=s.useLazyQuery(c.default(l()),{variables:{queryString:g}});if(_)throw new Error(_.message);const j=O&&f({data:O}),E=t&&f({data:t}).filter(e=>h.includes(e.value));return i.default.createElement(b.FormItem,Object.assign({},e,{name:r}),i.default.createElement(u.AsyncTypeahead,Object.assign({},o,{multiple:!0,onChange:e=>{const t=e.map(({value:e})=>e);p({[r]:t})},options:j,id:r,inputProps:{id:r},ref:n,onSearch:e=>{v(e),F()},isLoading:C,selected:E})))}},function(e,t){e.exports=require("react-bootstrap-typeahead")},function(e,t){e.exports=require("graphql-tag")},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Button=void 0;const a=o(n(0));t.Button=e=>{var{children:t}=e,n=r(e,["children"]);return a.default.createElement("button",Object.assign({},n),t)}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Loading=void 0;const o=r(n(0));t.Loading=()=>o.default.createElement("span",{"aria-live":"polite","aria-busy":"true"},"Loading...")},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.LoadingButton=void 0;const a=o(n(0)),l=n(9);t.LoadingButton=e=>{var{loading:t,label:n,onClick:o,children:u,className:i=""}=e,s=r(e,["loading","label","onClick","children","className"]);const c=l.useVulcanComponents(),m=t?{opacity:.5}:{},d=t?{position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",justifyContent:"center",alignItems:"center"}:{display:"none"};return a.default.createElement(c.Button,Object.assign({className:`loading-button ${t?"loading-button-loading":"loading-button-notloading"} ${i}`,onClick:o},s),a.default.createElement("span",{style:{position:"relative"}},a.default.createElement("span",{style:m},n||u),a.default.createElement("span",{style:d},a.default.createElement(c.Loading,null))))}},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},l=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,a){function l(e){try{i(r.next(e))}catch(e){a(e)}}function u(e){try{i(r.throw(e))}catch(e){a(e)}}function i(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(l,u)}i((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.MutationButton=void 0;const u=a(n(0)),i=n(6),s=n(9);t.MutationButton=e=>{const t=s.useVulcanComponents(),[n,r]=u.useState(!1),[o,a]=u.useState(),{mutation:c,mutationArguments:m,loadingButtonProps:d}=e,f="string"==typeof c?i.gql`
6
6
  ${c}
7
- `:c,[p]=i.useMutation(f,{variables:m}),b=u.default.createElement(t.LoadingButton,Object.assign({loading:n,onClick:t=>l(void 0,void 0,void 0,(function*(){t.preventDefault(),r(!0),a(void 0);const{submitCallback:n,successCallback:o,errorCallback:l}=e;try{n&&(yield n());const e=yield p();o&&(yield o(e))}catch(e){a(e),l&&(yield l(e))}finally{r(!1)}}))},d));return o?u.default.createElement(t.TooltipTrigger,{trigger:b,defaultShow:!0},o.message.replace("GraphQL error: ","")):b}},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.HeadTags=void 0;const l=a(n(0));class u extends l.PureComponent{render(){const{url:e,title:t,description:n,siteUrl:r,faviconUrl:o}=this.props;let a=this.props.image;return a&&-1===a.indexOf("//")&&("/"===a.charAt(0)&&(a=a.slice(1)),a=r+a),l.default.createElement(l.default.Fragment,null,l.default.createElement("title",null,t),l.default.createElement("meta",{charSet:"utf-8"}),l.default.createElement("meta",{name:"description",content:n}),l.default.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),l.default.createElement("meta",{property:"og:type",content:"article"}),l.default.createElement("meta",{property:"og:url",content:e}),l.default.createElement("meta",{property:"og:image",content:a}),l.default.createElement("meta",{property:"og:title",content:t}),l.default.createElement("meta",{property:"og:description",content:n}),l.default.createElement("meta",{name:"twitter:card",content:"summary"}),l.default.createElement("meta",{name:"twitter:image:src",content:a}),l.default.createElement("meta",{name:"twitter:title",content:t}),l.default.createElement("meta",{name:"twitter:description",content:n}),l.default.createElement("link",{rel:"canonical",href:e}),l.default.createElement("link",{rel:"shortcut icon",href:o||"/favicon.ico"}))}}t.HeadTags=u},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipTrigger=void 0;const o=r(n(0));t.TooltipTrigger=({children:e,trigger:t})=>o.default.createElement("div",{title:e},t)},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const a=o(n(0)),l=o(n(5)),u=o(n(100)),i=o(n(101)),s=o(n(102)),c=n(9),m=e=>{var{index:t,labelId:n,label:o,component:l,componentProps:u={},itemProps:s}=e,m=r(e,["index","labelId","label","component","componentProps","itemProps"]);const d=c.useVulcanComponents();let f;f=l?a.default.cloneElement(l,u):n?a.default.createElement(d.FormattedMessage,{id:n}):a.default.createElement("span",null,o);return a.default.createElement(i.default,Object.assign({eventKey:t},s,m),f)};m.propTypes={index:l.default.number,to:l.default.any,labelId:l.default.string,label:l.default.string,component:l.default.object,componentProps:l.default.object,itemProps:l.default.object};const d=e=>{var{childrenItems:t}=e,n=r(e,["childrenItems"]);return a.default.createElement(a.default.Fragment,null,a.default.createElement(m,Object.assign({},n)),t&&!!t.length&&a.default.createElement("div",{className:"menu-node-children"},t.map((e,t)=>a.default.createElement(m,Object.assign({key:t},e)))))};d.propTypes={childrenItems:l.default.array};const f=e=>{var{label:t,labelId:n,trigger:o,menuItems:l,menuContents:i,variant:m="dropdown",buttonProps:f}=e,p=r(e,["label","labelId","trigger","menuItems","menuContents","variant","buttonProps"]);const b=c.useVulcanComponents(),h=i||l.map((e,t)=>"divider"===e?a.default.createElement(u.default.Divider,{key:t}):a.default.createElement(d,Object.assign({},e,{key:t,index:t})));return"flat"===m?h:o?a.default.createElement(u.default,Object.assign({},p),a.default.createElement(u.default.Toggle,null,o),a.default.createElement(u.default.Menu,null,h)):a.default.createElement(s.default,Object.assign({},f,{title:n?a.default.createElement(b.FormattedMessage,{id:n}):t},p),h)};f.propTypes={labelId:l.default.string,label:l.default.string,trigger:l.default.object,menuContents:l.default.object,menuItems:l.default.array,variant:l.default.string,buttonProps:l.default.object},t.default=f},function(e,t){e.exports=require("react-bootstrap/Dropdown")},function(e,t){e.exports=require("react-bootstrap/DropdownItem")},function(e,t){e.exports=require("react-bootstrap/DropdownButton")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(19),t),o(n(105),t)},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanCurrentUserProvider=void 0;const a=o(n(0)),l=n(20);t.VulcanCurrentUserProvider=e=>{var{value:t}=e,n=r(e,["value"]);return a.default.createElement(l.VulcanCurrentUserContext.Provider,Object.assign({value:t},n))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.mergeWithComponents=t.delayedComponent=t.instantiateComponent=t.getRawComponent=t.componentExists=t.coreComponents=t.ComponentsTable=t.Components=void 0;const o=r(n(0));t.Components={},t.ComponentsTable={},t.coreComponents=["Alert","Button","Modal","ModalTrigger","Table","FormComponentCheckbox","FormComponentCheckboxGroup","FormComponentDate","FormComponentDate2","FormComponentDateTime","FormComponentDefault","FormComponentText","FormComponentEmail","FormComponentNumber","FormComponentRadioGroup","FormComponentSelect","FormComponentSelectMultiple","FormComponentStaticText","FormComponentTextarea","FormComponentTime","FormComponentUrl","FormComponentInner","FormControl","FormElement"];t.componentExists=e=>!!t.ComponentsTable[e];t.getRawComponent=e=>t.ComponentsTable[e].rawComponent;t.instantiateComponent=(e,t)=>{if(e){if(o.default.isValidElement(e))return o.default.cloneElement(e,t);if("function"==typeof e&&e.prototype&&e.prototype.isReactComponent){const n=e;return o.default.createElement(n,Object.assign({},t))}if("function"==typeof e)return e(t);if("object"==typeof e&&e.$$typeof&&e.render){const n=e;return o.default.createElement(n,Object.assign({},t))}return e}return null};t.delayedComponent=e=>n=>{const r=t.Components[e]||null;return r&&o.default.createElement(r,Object.assign({},n))};t.mergeWithComponents=e=>e?Object.assign(Object.assign({},t.Components),e):t.Components}]);
8
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXIudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29udGV4dC50c3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL2kxOG5cIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJAdnVsY2FuanMvdXRpbHNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwcm9wLXR5cGVzXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQGFwb2xsby9jbGllbnRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvZ2V0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL29taXRcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkNvbXBvbmVudHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2NvbXBhY3RcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkNvbXBvbmVudHMvQ29udGV4dC50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvcGlja1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9tb2R1bGVzL3V0aWxzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImRlYnVnXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3VuaXFcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaW50ZXJzZWN0aW9uXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL2dyYXBocWxcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkN1cnJlbnRVc2VyL0NvbnN1bWVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkN1cnJlbnRVc2VyL0NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm0vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL21lcmdlXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3NldFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9pc0VtcHR5XCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL21vZHVsZXMvc2NoZW1hX3V0aWxzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9maW5kXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL21vZHVsZXMvcGF0aF91dGlscy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJzaW1wbC1zY2hlbWFcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vaW5wdXRzL2NvbnN0cy50cyIsIndlYnBhY2s6Ly8vLi9pbmRleC50cyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1Db250YWluZXIudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9tb2R1bGVzL2Zvcm1GcmFnbWVudHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL3NjaGVtYVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9yZWFjdC1ob29rc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvVnVsY2FuQ29tcG9uZW50cy9EdW1teS50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm0vRm9ybS50c3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL2NvcmVcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvY2xvbmVEZWVwXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2lzT2JqZWN0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL21hcFZhbHVlc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9vbWl0QnlcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvcGlja0J5XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3Vuc2V0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3VwZGF0ZVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC93aXRob3V0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2lzUGxhaW5PYmplY3RcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvc2l6ZVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC90b1BhdGhcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaW5pdGlhbFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9mcC9mbG93XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3Rha2VSaWdodFwiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtL2ZpZWxkcy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvbWFwXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3NvcnRCeVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC91bmlxQnlcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvZGlmZmVyZW5jZVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9yZWplY3RcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvZmlsdGVyXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm0vdXRpbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2lzRXF1YWxXaXRoXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL3VzZVdhcm5PblVuc2F2ZWQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL3VzZVdhcm5PblVuc2F2ZWQvdXNlV2Fybk9uVW5zYXZlZC50cyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vdXNlQmxvY2tUcmFuc2l0aW9uL3VzZUJsb2NrVHJhbnNpdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vdXNlQmxvY2tUcmFuc2l0aW9uL2Jsb2NrLnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvVnVsY2FuQ29tcG9uZW50cy9Qcm92aWRlci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9WdWxjYW5Db21wb25lbnRzL2RlZmF1bHRWdWxjYW5Db21wb25lbnRzLnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtRXJyb3IudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29tcG9uZW50LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUNvbXBvbmVudElubmVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vdWlfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY2xhc3NuYW1lc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29tcG9uZW50TG9hZGVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUVsZW1lbnQudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtR3JvdXAudHN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9zb21lXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1JbnRsLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUVycm9ycy50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1TdWJtaXQudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTGF5b3V0LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZEFycmF5LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZEFycmF5TGF5b3V0LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZEl0ZW0udHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTmVzdGVkRGl2aWRlci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0ZpZWxkRXJyb3JzLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZE9iamVjdC50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1PcHRpb25MYWJlbC50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2lucHV0cy9CYXNpY0lucHV0cy50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2lucHV0cy9BdXRvY29tcGxldGVNdWx0aXBsZS50c3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtYm9vdHN0cmFwLXR5cGVhaGVhZFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImdyYXBocWwtdGFnXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2NvcmUvQnV0dG9uLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vY29yZS9Mb2FkaW5nLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL0xvYWRpbmdCdXR0b24udHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvTXV0YXRpb25CdXR0b24udHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvSGVhZFRhZ3MudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvYm9vdHN0cmFwL1Rvb2x0aXBUcmlnZ2VyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Jvb3RzdHJhcC9Ecm9wZG93bi50c3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtYm9vdHN0cmFwL0Ryb3Bkb3duXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtYm9vdHN0cmFwL0Ryb3Bkb3duSXRlbVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInJlYWN0LWJvb3RzdHJhcC9Ecm9wZG93bkJ1dHRvblwiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvVnVsY2FuQ3VycmVudFVzZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9WdWxjYW5DdXJyZW50VXNlci9Qcm92aWRlci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50c0hlbHBlcnMudHN4Il0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIlZ1bGNhbkNvbXBvbmVudHNDb25zdW1lciIsIlZ1bGNhbkNvbXBvbmVudHNDb250ZXh0IiwiQ29uc3VtZXIiLCJ1c2VWdWxjYW5Db21wb25lbnRzIiwidXNlQ29udGV4dCIsIndpdGhWdWxjYW5Db21wb25lbnRzIiwiQyIsInByb3BzIiwidnVsY2FuQ29tcG9uZW50cyIsImRlcHJlY2F0ZSIsIkZvcm1Db250ZXh0IiwiY3JlYXRlQ29udGV4dCIsInVuZGVmaW5lZCIsInVzZUZvcm1Db250ZXh0IiwiZm9ybUNvbnRleHQiLCJFcnJvciIsIl9fbm90X2ludGlhbGl6ZWQiLCJBbGVydCIsIkR1bW15IiwiQnV0dG9uIiwiRmllbGRFcnJvcnMiLCJIZWFkVGFncyIsIkxvYWRpbmdCdXR0b24iLCJNdXRhdGlvbkJ1dHRvbiIsIlRvb2x0aXBUcmlnZ2VyIiwiRHJvcGRvd24iLCJGb3JtIiwiRm9ybUNvbXBvbmVudCIsIkZvcm1Db21wb25lbnRBdXRvY29tcGxldGUiLCJGb3JtQ29tcG9uZW50Q2hlY2tib3giLCJGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cCIsIkZvcm1Db21wb25lbnREYXRlIiwiRm9ybUNvbXBvbmVudERhdGVUaW1lIiwiRm9ybUNvbXBvbmVudERlZmF1bHQiLCJGb3JtQ29tcG9uZW50RW1haWwiLCJGb3JtQ29tcG9uZW50SW5uZXIiLCJGb3JtQ29tcG9uZW50TGlrZXJ0IiwiRm9ybUNvbXBvbmVudExvYWRlciIsIkZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZSIsIkZvcm1Db21wb25lbnROdW1iZXIiLCJGb3JtQ29tcG9uZW50UGFzc3dvcmQiLCJGb3JtQ29tcG9uZW50UmFkaW9Hcm91cCIsIkZvcm1Db21wb25lbnRTZWxlY3QiLCJGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGUiLCJGb3JtQ29tcG9uZW50U3RhdGljVGV4dCIsIkZvcm1Db21wb25lbnRUZXh0YXJlYSIsIkZvcm1Db21wb25lbnRUaW1lIiwiRm9ybUNvbXBvbmVudFVybCIsIkZvcm1FbGVtZW50IiwiRm9ybUVycm9yIiwiRm9ybUVycm9ycyIsIkZvcm1Hcm91cCIsIkZvcm1Hcm91cEhlYWRlciIsIkZvcm1Hcm91cExheW91dCIsIkZvcm1JbnRsIiwiRm9ybUludGxJdGVtTGF5b3V0IiwiRm9ybUludGxMYXlvdXQiLCJGb3JtTGF5b3V0IiwiRm9ybU5lc3RlZEFycmF5IiwiRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXQiLCJGb3JtTmVzdGVkQXJyYXlMYXlvdXQiLCJGb3JtTmVzdGVkRGl2aWRlciIsIkZvcm1OZXN0ZWRJdGVtIiwiRm9ybU5lc3RlZEl0ZW1MYXlvdXQiLCJGb3JtTmVzdGVkT2JqZWN0IiwiRm9ybU5lc3RlZE9iamVjdExheW91dCIsIkZvcm1PcHRpb25MYWJlbCIsIkZvcm1TdWJtaXQiLCJGb3JtYXR0ZWRNZXNzYWdlIiwiSWNvbiIsIkljb25BZGQiLCJJY29uUmVtb3ZlIiwiTG9hZGluZyIsIkZvcm1JdGVtIiwiZGVlcFZhbHVlIiwib2JqIiwicGF0aCIsInBhdGhBcnJheSIsInNwbGl0IiwibGVuZ3RoIiwiZmxhdHRlbiIsImRhdGEiLCJyZXN1bHQiLCJyZWN1cnNlIiwiY3VyIiwicHJvcCIsInRvU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5IiwiaXNFbXB0eSIsImlzRW1wdHlWYWx1ZSIsIm1lcmdlVmFsdWUiLCJjdXJyZW50VmFsdWUiLCJkb2N1bWVudFZhbHVlIiwiZGVsZXRlZFZhbHVlcyIsImRlbGV0ZWRGaWVsZHMiLCJsb2NhbGUiLCJkYXRhdHlwZSIsImdldE5lc3RlZERlbGV0ZWRWYWx1ZXMiLCJoYXNEZWxldGVkVmFsdWVzIiwiZ2V0RGVsZXRlZFZhbHVlcyIsImFjY3VtdWxhdG9yIiwicmVkdWNlIiwicHJlZml4IiwicmVtb3ZlUHJlZml4IiwiZmlsdGVyUGF0aHNCeVByZWZpeCIsImdldEZpZWxkVHlwZSIsImZpZWxkU2NoZW1hIiwidHlwZSIsImdldE51bGxWYWx1ZSIsImZpZWxkVHlwZSIsIkJvb2xlYW4iLCJTdHJpbmciLCJOdW1iZXIiLCJWdWxjYW5DdXJyZW50VXNlckNvbnN1bWVyIiwiVnVsY2FuQ3VycmVudFVzZXJDb250ZXh0IiwidXNlVnVsY2FuQ3VycmVudFVzZXIiLCJjdXJyZW50VXNlciIsImxvYWRpbmciLCJnZXRWYWxpZEZpZWxkcyIsInNjaGVtYSIsImtleXMiLCJmaWx0ZXIiLCJmaWVsZE5hbWUiLCJpbmNsdWRlcyIsImdldEluc2VydGFibGVGaWVsZHMiLCJ1c2VyIiwiZmllbGQiLCJjYW5DcmVhdGVGaWVsZCIsImdldEVkaXRhYmxlRmllbGRzIiwiZG9jdW1lbnQiLCJjYW5VcGRhdGVGaWVsZCIsImNvbnZlcnRTY2hlbWEiLCJvcHRpb25zIiwicmVtb3ZlQXJyYXlzIiwianNvblNjaGVtYSIsImZvckVhY2giLCJnZXRGaWVsZFNjaGVtYSIsInN1YlNjaGVtYU9yVHlwZSIsImdldE5lc3RlZEZpZWxkU2NoZW1hT3JUeXBlIiwiYXJyYXlGaWVsZFNjaGVtYSIsImlzTmVzdGVkU2NoZW1hIiwiY29udmVydGVkU3ViU2NoZW1hIiwiaXNTaW1wbGVBcnJheUZpZWxkIiwic2NoZW1hUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJnZXRTY2hlbWFUeXBlIiwiZ2V0T2JqZWN0TmVzdGVkU2NoZW1hIiwiaXNOZXN0ZWRTY2hlbWFGaWVsZCIsImFycmF5SXRlbVNjaGVtYSIsImdldEFycmF5TmVzdGVkU2NoZW1hIiwib2JqZWN0SXRlbVNjaGVtYSIsImZvcm1Qcm9wZXJ0aWVzIiwic3BsaXRQYXRoIiwic3RyaW5nIiwiam9pblBhdGgiLCJhcnJheSIsIml0ZW0iLCJpc05hTiIsImdldFBhcmVudFBhdGgiLCJwYXRocyIsImV4cGxvZGVkUHJlZml4IiwibWFwIiwiZXhwbG9kZWRQYXRoIiwiZXhwbG9kZWRTdWZmaXgiLCJzdGFydHNXaXRoIiwic3RhbmRhcmRJbnB1dHMiLCJjbGVhcmFibGVJbnB1dHMiLCJhZHZhbmNlZElucHV0cyIsImRlcml2ZWRJbnB1dHMiLCJhbGxWdWxjYW5JbnB1dHMiLCJnZXRBdXRvSW5wdXRGcm9tVHlwZSIsIkludGVnZXIiLCJEYXRlIiwiZGVidWdGb3JtIiwiZGVidWdWdWxjYW4iLCJGb3JtQ29udGFpbmVyIiwibW9kZWwiLCJkb2N1bWVudElkIiwic2x1ZyIsImZpZWxkcyIsImFkZEZpZWxkcyIsImN1cnJlbnRVc2VyRnJvbVByb3BzIiwibG9hZGluZ0N1cnJlbnRVc2VyIiwibG9hZGluZ0N1cnJlbnRVc2VyRnJvbVByb3BzIiwiaXNFZGl0IiwiZm9ybVR5cGUiLCJWdWxjYW5Db21wb25lbnRzIiwiY2hpbGRQcm9wcyIsImNhcGl0YWxpemUiLCJtdXRhdGlvbkZyYWdtZW50IiwibXV0YXRpb25GcmFnbWVudE5hbWUiLCJxdWVyeUZyYWdtZW50IiwicXVlcnlGcmFnbWVudE5hbWUiLCJhdXRvRm9ybUZyYWdtZW50cyIsImdxbCIsImdldEZyYWdtZW50TmFtZSIsInVzZUZyYWdtZW50cyIsIm11dGF0aW9uT3B0aW9ucyIsImZyYWdtZW50IiwiZnJhZ21lbnROYW1lIiwicXVlcnlPcHRpb25zIiwiaW5wdXQiLCJpZCIsImVuYWJsZUNhY2hlIiwiZmV0Y2hQb2xpY3kiLCJwb2xsSW50ZXJ2YWwiLCJza2lwIiwicmVmZXRjaCIsInVzZVNpbmdsZSIsImNyZWF0ZURvY3VtZW50IiwidXNlQ3JlYXRlIiwidXBkYXRlRG9jdW1lbnQiLCJ1c2VVcGRhdGUiLCJkZWxldGVEb2N1bWVudCIsInVzZURlbGV0ZSIsImN1cnJlbnRVc2VyRnJvbUNvbnRleHQiLCJsb2FkaW5nQ3VycmVudFVzZXJGcm9tQ29udGV4dCIsInNob3VsZEdldEN1cnJlbnRVc2VyRnJvbVByb3BzIiwidmFyaWFibGVzIiwiZXJyb3JzIiwiU21hcnRGb3JtIiwibXVsdGlUeXBlTmFtZSIsImZyYWdtZW50VHlwZSIsImpvaW4iLCJnZXRRdWVyeUZpZWxkTmFtZXMiLCJnZXRDcmVhdGVhYmxlRmllbGRzIiwiZ2V0VXBkYXRlYWJsZUZpZWxkcyIsImdldE11dGF0aW9uRmllbGROYW1lcyIsInJlYWRhYmxlRmllbGROYW1lcyIsInF1ZXJ5RmllbGROYW1lcyIsImNvbmNhdCIsImdldFNjaGVtYUZyYWdtZW50IiwiZmllbGROYW1lcyIsInByb3ZpZGVkRmllbGROYW1lcyIsImlzTXV0YXRpb24iLCJnZXRGcmFnbWVudEZpZWxkTmFtZXMiLCJvbmx5Vmlld2FibGUiLCJjaGlsZEZyYWdtZW50cyIsImdldEZpZWxkRnJhZ21lbnQiLCJnZXRPYmplY3RGcmFnbWVudCIsImYiLCJncmFwaHFsIiwidHlwZU5hbWUiLCJtdXRhdGlvbkZpZWxkTmFtZXMiLCJmaWVsZHNXaXRoSW50bFN1ZmZpeCIsImFsbEZpZWxkcyIsInVzZXJJZCIsInVuc2hpZnQiLCJfaWQiLCJxdWVyeUZyYWdtZW50VGV4dCIsImdlbmVyYXRlZFF1ZXJ5RnJhZ21lbnQiLCJtdXRhdGlvbkZyYWdtZW50VGV4dCIsImV4dHJhUXVlcmllcyIsInF1ZXJ5IiwiZ2V0SW5pdGlhbFN0YXRlRnJvbVByb3BzIiwibmV4dFByb3BzIiwiY29udmVydGVkU2NoZW1hIiwiZGVmYXVsdFZhbHVlcyIsImRlZmF1bHRWYWx1ZSIsImdldERlZmF1bHRWYWx1ZXMiLCJpbml0aWFsRG9jdW1lbnQiLCJwcmVmaWxsZWRQcm9wcyIsIm1pbkNvdW50IiwicHVzaCIsInJlbW92ZVByb3BlcnR5IiwiZGlzYWJsZWQiLCJjdXJyZW50VmFsdWVzIiwib3JpZ2luYWxTY2hlbWEiLCJmbGF0U2NoZW1hIiwiY3VycmVudERvY3VtZW50IiwiRm9ybVdhcm5VbnNhdmVkIiwiaXNDaGFuZ2VkIiwid2FyblVuc2F2ZWRDaGFuZ2VzIiwiY2hpbGRyZW4iLCJ1c2VXYXJuT25VbnNhdmVkIiwiZ2V0RGF0YSIsImN1c3RvbUFyZ3MiLCJzdGF0ZSIsInN1Ym1pdEZvcm1DYWxsYmFja3MiLCJmb3JtIiwiZW5kc1dpdGgiLCJhcmdzIiwiZXhjbHVkZVJlbW92ZWRGaWVsZHMiLCJleGNsdWRlSGlkZGVuRmllbGRzIiwicmVwbGFjZUludGxGaWVsZHMiLCJhZGRFeHRyYUZpZWxkcyIsImdldEZpZWxkTmFtZXMiLCJwYXJlbnRQYXRoIiwieCIsImNvbXBhY3RQYXJlbnQiLCJydW5DYWxsYmFja3MiLCJjYWxsYmFja3MiLCJpdGVyYXRvciIsImluaXRDYWxsYmFjayIsImluaXRpYWxTdGF0ZSIsImlzRmlyc3RSZW5kZXIiLCJ1c2VSZWYiLCJ1c2VFZmZlY3QiLCJjdXJyZW50IiwibGF5b3V0IiwicmVwZWF0RXJyb3JzIiwic2hvd1JlbW92ZSIsInNob3dEZWxldGUiLCJzdWNjZXNzRm9ybUNhbGxiYWNrcyIsImZhaWx1cmVGb3JtQ2FsbGJhY2tzIiwiaW50bCIsInVzZUludGxDb250ZXh0Iiwic2V0RXJyb3JzIiwidXNlU3RhdGUiLCJ0aHJvd0Vycm9yIiwiZXJyb3IiLCJmb3JtRXJyb3JzIiwiZ2V0RXJyb3JzIiwiY29uc29sZSIsImxvZyIsInByZXZFcnJvcnMiLCJzZXREZWxldGVkVmFsdWVzIiwic2V0Q2FsbGJhY2tzIiwic2V0Q3VycmVudFZhbHVlcyIsInNldEN1cnJlbnREb2N1bWVudCIsInJlZmV0Y2hGb3JtIiwic2V0RGlzYWJsZWQiLCJzdWNjZXNzIiwic2V0U3VjY2VzcyIsImNsZWFyRm9ybSIsIm9wdGlvbnNEb2N1bWVudCIsImZvcm1SZWYiLCJtdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayIsIm11dGF0aW9uVHlwZSIsInN1Y2Nlc3NDYWxsYmFjayIsInRoaXMiLCJtdXRhdGlvbkVycm9yQ2FsbGJhY2siLCJlcnJvckNhbGxiYWNrIiwic3VibWl0Rm9ybSIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJjb250ZXh0TmFtZSIsIm11dGFibGVGaWVsZHMiLCJzdWJtaXRDYWxsYmFjayIsIm5ld011dGF0aW9uU3VjY2Vzc0NhbGxiYWNrIiwiZWRpdE11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrIiwic3VjY2Vzc0NvbXBvbmVudCIsIkZvcm1Db21wb25lbnRzIiwiZm9ybUxheW91dFByb3BzIiwiZm9ybUdyb3VwUHJvcHMiLCJzdWJtaXRMYWJlbCIsImNhbmNlbExhYmVsIiwicmV2ZXJ0TGFiZWwiLCJjYW5jZWxDYWxsYmFjayIsInJldmVydENhbGxiYWNrIiwiaXRlbVByb3BlcnRpZXMiLCJjb21tb25Qcm9wcyIsImRvY0NsYXNzTmFtZSIsIm1vZGVsTmFtZSIsInRvTG93ZXJDYXNlIiwiZm9ybVN1Ym1pdFByb3BzIiwiZ3JvdXAiLCJmb3JtUHJvcHMiLCJjbGFzc05hbWUiLCJzdWJtaXRQcm9wcyIsImdldENoaWxkcmVuUHJvcHMiLCJkb2N1bWVudFRpdGxlIiwidGl0bGUiLCJkZWxldGVEb2N1bWVudENvbmZpcm0iLCJmb3JtYXRNZXNzYWdlIiwiY29uZmlybSIsInRoZW4iLCJtdXRhdGlvblJlc3VsdCIsInJlbW92ZVN1Y2Nlc3NDYWxsYmFjayIsImNhdGNoIiwiaXNOb3RTYW1lRG9jdW1lbnQiLCJQcm92aWRlciIsInN1Ym1pdEZvcm1Db250ZXh0IiwiYWRkVG9EZWxldGVkVmFsdWVzIiwicHJldkRlbGV0ZWRWYWx1ZXMiLCJ1cGRhdGVDdXJyZW50VmFsdWVzIiwibmV3VmFsdWVzIiwiY2hhbmdlQ2FsbGJhY2siLCJuZXdTdGF0ZSIsIm9sZFZhbHVlIiwiZ2V0RG9jdW1lbnQiLCJnZXRMYWJlbCIsImZpZWxkTG9jYWxlIiwiYWRkVG9TdWJtaXRGb3JtIiwiY2FsbGJhY2siLCJjYnMiLCJhZGRUb1N1Y2Nlc3NGb3JtIiwiYWRkVG9GYWlsdXJlRm9ybSIsImNsZWFyRm9ybUNhbGxiYWNrcyIsImNsZWFyRmllbGRFcnJvcnMiLCJnZXRGaWVsZEdyb3VwcyIsImNvbnRleHQiLCJjb2xsZWN0aW9uTmFtZSIsImxhYmVsIiwiZm9ybWF0TGFiZWwiLCJkZWZhdWx0TWVzc2FnZSIsImdldE9wdGlvbkxhYmVsIiwib3B0aW9uIiwiaW50bElkIiwib3B0aW9uc0Zyb21BcmdzIiwicmVtb3ZlRmllbGRzIiwicmVsZXZhbnRGaWVsZHMiLCJoaWRkZW4iLCJpc0ludGxGaWVsZCIsImluaXRGaWVsZCIsImNvbnRyb2wiLCJpdGVtRmllbGRTY2hlbWEiLCJpdGVtRGF0YXR5cGUiLCJpbnRsS2V5cyIsImdldEludGxLZXlzIiwiaW50bElucHV0IiwiaW5wdXRQcm9wZXJ0aWVzIiwiZGVzY3JpcHRpb24iLCJnZXRJbnRsTGFiZWwiLCJpc0Rlc2NyaXB0aW9uIiwiZ2V0RGVzY3JpcHRpb24iLCJoZWxwIiwiaGFuZGxlRmllbGRQYXRoIiwiZmllbGRQYXRoIiwiaGFuZGxlUGVybWlzc2lvbnMiLCJjcmVhdGVGaWVsZCIsInBhcmVudEZpZWxkTmFtZSIsImhhbmRsZUZpZWxkUGFyZW50IiwiYXJyYXlGaWVsZCIsImNyZWF0ZUFycmF5U3ViRmllbGQiLCJuZXN0ZWRTY2hlbWEiLCJuZXN0ZWRJbnB1dCIsIm5lc3RlZEZpZWxkcyIsInN1YkZpZWxkTmFtZSIsImhhbmRsZUZpZWxkQ2hpbGRyZW4iLCJzdWJGaWVsZFNjaGVtYSIsInN1YkZpZWxkIiwiZ3JvdXBzV2l0aEZpZWxkcyIsImciLCJncm91cEZpZWxkcyIsImRlZmF1bHRHcm91cEZpZWxkcyIsIm9yZGVyIiwiY2hhbmdlZERvY3VtZW50IiwiY29sbGVjdGlvbiIsIm9ialZhbHVlIiwib3RoVmFsdWUiLCJkZWJ1Z1RyYW5zaXRpb25zIiwidXNlQmxvY2tUcmFuc2l0aW9uIiwic2hvdWxkQmxvY2siLCJnZXRCbG9ja2VkTWVzc2FnZSIsInVuYmxvY2tSZWYiLCJpc0Jsb2NraW5nIiwib25VbmJsb2NrIiwib25CbG9ja2VkIiwiZXZ0IiwibWVzc2FnZSIsInJldHVyblZhbHVlIiwiYmxvY2siLCJibG9ja0JlZm9yZVVubG9hZCIsIkJMT0NLX1RSQU5TSVRJT05fRVZFTlRfVFlQRSIsIlVOQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFIiwic2V0Q29uZmlybWF0aW9uTWVzc2FnZSIsImJsb2NrRXZlbnQiLCJFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwidW5ibG9ja0V2ZW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uYmVmb3JldW5sb2FkIiwiVnVsY2FuQ29tcG9uZW50c1Byb3ZpZGVyIiwiY3VycmVudENvbXBvbmVudHMiLCJtZXJnZWRDb21wb25lbnRzIiwiZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHMiLCJjb21wb25lbnROYW1lIiwiZGlzcGxheU5hbWUiLCJkZWZhdWx0Q29yZUNvbXBvbmVudHMiLCJkZWZhdWx0Rm9ybUNvbXBvbmVudHMiLCJBdXRvY29tcGxldGVNdWx0aXBsZSIsImVycm9yQ29udGV4dCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtZXNzYWdlUHJvcHMiLCJ2YWx1ZXMiLCJwcm9wZXJ0aWVzIiwiZXJyb3JOYW1lIiwic2xpY2UiLCJleGNlcHRpb24iLCJodG1sIiwiZGVmYXVsdFByb3BzIiwiZ2V0Q2hhcmFjdGVyQ291bnRzIiwibWF4IiwiY2hhcmFjdGVyQ291bnQiLCJjaGFyc1JlbWFpbmluZyIsImNoYXJzQ291bnQiLCJnZXRQYXRoIiwiZ2V0SW5wdXROYW1lIiwiZ2V0Rm9ybUlucHV0IiwiaW5wdXROYW1lIiwiY291bnRGcm9tUHJvcHMiLCJpbnRsT3JSZWd1bGFyVmFsdWUiLCJnZXRDaGFyYWN0ZXJDb3VudHNGcm9tUHJvcHMiLCJjaGFyc0NvdW50U3RhdGUiLCJzZXRDaGFyYWN0ZXJDb3VudHMiLCJ1cGRhdGVDaGFyYWN0ZXJDb3VudCIsInNob3dDaGFyc1JlbWFpbmluZyIsImdldFZhbHVlIiwibnVsbFZhbHVlIiwiaXNBcnJheUZpZWxkIiwiZm9ybUNvbXBvbmVudHMiLCJpc09iamVjdEZpZWxkIiwiZmNpUHJvcHMiLCJpbnB1dFR5cGUiLCJoYW5kbGVDaGFuZ2UiLCJwYXJzZUludCIsInVwZGF0ZVZhbHVlIiwiY2xlYXJGaWVsZCIsImZvcm1JbnB1dCIsImZjaSIsImZvcm1Db21wb25lbnRzRGVwZW5kZW5jaWVzIiwiaW5wdXRDbGFzc05hbWUiLCJiZWZvcmVDb21wb25lbnQiLCJhZnRlckNvbXBvbmVudCIsInJlbmRlckNvbXBvbmVudCIsImhhc0Vycm9ycyIsImlucHV0Q2xhc3MiLCJ3aGl0ZWxpc3RJbnB1dFByb3BzIiwib25DaGFuZ2UiLCJpbnB1dFZhbHVlIiwidGFyZ2V0IiwiY2hlY2tlZCIsIkNvbXBvbmVudHMiLCJnZXRQcm9wZXJ0aWVzIiwiRm9ybUlucHV0Iiwib25DbGljayIsInJlbmRlckNsZWFyIiwiZGFuZ2VyIiwiZ2V0SHRtbElucHV0UHJvcHMiLCJvbkJsdXIiLCJxdWVyeVdhaXRzRm9yVmFsdWUiLCJxdWVyeVRleHQiLCJsb2FkRmllbGRRdWVyeSIsInVzZUxhenlRdWVyeSIsInZhbHVlSXNFbXB0eSIsImV4dHJhUHJvcHMiLCJxdWVyeURhdGEiLCJxdWVyeUVycm9yIiwib3B0aW9uc0Z1bmN0aW9uIiwiaXNWYWxpZEVsZW1lbnQiLCJjbG9uZUVsZW1lbnQiLCJwcm9wVHlwZXMiLCJmb3J3YXJkUmVmIiwicmVmIiwib3RoZXJQcm9wcyIsIm9uU3VibWl0IiwiYW5jaG9yTmFtZSIsImNvbGxhcHNlZCIsInRvZ2dsZSIsInNldENvbGxhcHNlZCIsInN0YXJ0Q29sbGFwc2VkIiwiaXNIaWRkZW4iLCJoZWFkaW5nIiwiYWRtaW5zT25seSIsImlzQWRtaW4iLCJMb2NhbGVzIiwiZGVmYXVsdEluZGV4IiwidmFyaWFudCIsImluZGV4IiwiZSIsImNhbkRlbGV0ZURvY3VtZW50Iiwibm9kZSIsImZ1bmMiLCJjbGFzc2VzIiwiYWRkSXRlbSIsIkJlZm9yZUNvbXBvbmVudCIsIkFmdGVyQ29tcG9uZW50IiwiaXNEZWxldGVkIiwib3Blbk5lc3RlZCIsInZpc2libGVJdGVtSW5kZXhlcyIsImN1cnJlbnRJbmRleCIsInN1YkRvY3VtZW50Iiwic3ViRG9jdW1lbnRJbmR4IiwiY29tcHV0ZVZpc2libGVJbmRleCIsIm1heENvdW50IiwiYXJyYXlMZW5ndGgiLCJzaW5nbGVWYWx1ZSIsIm5lc3RlZEFycmF5RXJyb3JzIiwidmlzaWJsZUl0ZW1JbmRleCIsIml0ZW1JbmRleCIsInJlbW92ZUl0ZW0iLCJoaWRlUmVtb3ZlIiwid2lkdGgiLCJoZWlnaHQiLCJ4bWxucyIsInZpZXdCb3giLCJmaWxsIiwic2l6ZSIsImJvb2wiLCJpc1JlcXVpcmVkIiwiaGlkZUxhYmVsIiwiY29udGVudCIsInJlbW92ZUJ1dHRvbiIsImljb25CdXR0b24iLCJ0YWJJbmRleCIsIm51bWJlciIsImNvbnRleHRUeXBlcyIsImludGxTaGFwZSIsIm9uZU9mVHlwZSIsIm5lc3RlZE9iamVjdEVycm9ycyIsIkhUTUxJbnB1dEFkYXB0ZXIiLCJvdGhlcklucHV0UHJvcGVydGllcyIsImh0bWxGb3IiLCJIVE1MU2VsZWN0QWRhcHRlciIsIm11bHRpcGxlIiwicmVmRnVuY3Rpb24iLCJhdXRvY29tcGxldGVRdWVyeSIsInF1ZXJ5U3RyaW5nIiwic2V0UXVlcnlTdHJpbmciLCJsb2FkQXV0b2NvbXBsZXRlT3B0aW9ucyIsImF1dG9jb21wbGV0ZU9wdGlvbnMiLCJzZWxlY3RlZEl0ZW1zIiwiQXN5bmNUeXBlYWhlYWQiLCJzZWxlY3RlZCIsInNlbGVjdGVkSWRzIiwiaW5wdXRQcm9wcyIsIm9uU2VhcmNoIiwiaXNMb2FkaW5nIiwicmVzdCIsImxhYmVsU3R5bGUiLCJvcGFjaXR5IiwibG9hZGluZ1N0eWxlIiwicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJkaXNwbGF5IiwianVzdGlmeUNvbnRlbnQiLCJhbGlnbkl0ZW1zIiwic3R5bGUiLCJzZXRMb2FkaW5nIiwic2V0RXJyb3IiLCJtdXRhdGlvbiIsIm11dGF0aW9uQXJndW1lbnRzIiwibG9hZGluZ0J1dHRvblByb3BzIiwibXV0YXRpb25Bc05vZGUiLCJtdXRhdGlvbkZ1bmMiLCJ1c2VNdXRhdGlvbiIsImxvYWRpbmdCdXR0b24iLCJ0cmlnZ2VyIiwiZGVmYXVsdFNob3ciLCJyZXBsYWNlIiwiUHVyZUNvbXBvbmVudCIsInVybCIsInNpdGVVcmwiLCJmYXZpY29uVXJsIiwiaW1hZ2UiLCJpbmRleE9mIiwiY2hhckF0IiwiY2hhclNldCIsInJlbCIsImhyZWYiLCJJdGVtIiwibGFiZWxJZCIsImNvbXBvbmVudCIsImNvbXBvbmVudFByb3BzIiwiaXRlbVByb3BzIiwibWVudUNvbXBvbmVudCIsImV2ZW50S2V5IiwidG8iLCJhbnkiLCJOb2RlIiwiY2hpbGRyZW5JdGVtcyIsIkJvb3RzdHJhcERyb3Bkb3duIiwibWVudUl0ZW1zIiwibWVudUNvbnRlbnRzIiwiYnV0dG9uUHJvcHMiLCJkcm9wZG93blByb3BzIiwibWVudUJvZHkiLCJEaXZpZGVyIiwiVG9nZ2xlIiwiTWVudSIsIlZ1bGNhbkN1cnJlbnRVc2VyUHJvdmlkZXIiLCJDb21wb25lbnRzVGFibGUiLCJjb3JlQ29tcG9uZW50cyIsImNvbXBvbmVudEV4aXN0cyIsImdldFJhd0NvbXBvbmVudCIsInJhd0NvbXBvbmVudCIsImluc3RhbnRpYXRlQ29tcG9uZW50IiwiaXNSZWFjdENvbXBvbmVudCIsIkNvbXBvbmVudCIsIiQkdHlwZW9mIiwicmVuZGVyIiwiZGVsYXllZENvbXBvbmVudCIsIm1lcmdlV2l0aENvbXBvbmVudHMiLCJteUNvbXBvbmVudHMiXSwibWFwcGluZ3MiOiIyQkFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUEwRGYsT0FyREFGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVBQUVYLEVBQVNTLElBQ2xDRyxPQUFPQyxlQUFlYixFQUFTUyxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVaLEVBQW9Ca0IsRUFBSSxTQUFTaEIsR0FDWCxvQkFBWGlCLFFBQTBCQSxPQUFPQyxhQUMxQ04sT0FBT0MsZUFBZWIsRUFBU2lCLE9BQU9DLFlBQWEsQ0FBRUMsTUFBTyxXQUU3RFAsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLEtBUXZEckIsRUFBb0JzQixFQUFJLFNBQVNELEVBQU9FLEdBRXZDLEdBRFUsRUFBUEEsSUFBVUYsRUFBUXJCLEVBQW9CcUIsSUFDL0IsRUFBUEUsRUFBVSxPQUFPRixFQUNwQixHQUFXLEVBQVBFLEdBQThCLGlCQUFWRixHQUFzQkEsR0FBU0EsRUFBTUcsV0FBWSxPQUFP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QSxFQUFjLCtCQUFNLEVBQUFwSyxZQUFlb0ssR0FBaUIsRUFBQXBLIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDMwKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpOyIsImltcG9ydCB7IGRlcHJlY2F0ZSB9IGZyb20gXCJAdnVsY2FuanMvdXRpbHNcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuXG5leHBvcnQgY29uc3QgVnVsY2FuQ29tcG9uZW50c0NvbnN1bWVyID0gVnVsY2FuQ29tcG9uZW50c0NvbnRleHQuQ29uc3VtZXI7XG5cbmV4cG9ydCBjb25zdCB1c2VWdWxjYW5Db21wb25lbnRzID0gKCkgPT4ge1xuICBjb25zdCB2YWwgPSB1c2VDb250ZXh0KFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0KTtcbiAgcmV0dXJuIHZhbDtcbn07XG5cbmV4cG9ydCBjb25zdCB3aXRoVnVsY2FuQ29tcG9uZW50cyA9IChDKSA9PiAocHJvcHMpID0+IHtcbiAgY29uc3QgdnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgZGVwcmVjYXRlKFxuICAgIFwiMC4wLjBcIixcbiAgICBcIlVzaW5nIHdpdGhWdWxjYW5Db21wb25lbnRzIEhPQyA9PiBwcmVmZXIgdXNlVnVsY2FuQ29tcG9uZW50cyB3aXRoIGhvb2tzXCJcbiAgKTtcbiAgcmV0dXJuIDxDIHZ1bGNhbkNvbXBvbmVudHM9e3Z1bGNhbkNvbXBvbmVudHN9IHsuLi5wcm9wc30gLz47XG59O1xuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcblxuaW50ZXJmYWNlIEZvcm1Db250ZXh0VmFsdWUge1xuICBhZGRUb0RlbGV0ZWRWYWx1ZXM6IEZ1bmN0aW9uO1xuICBhZGRUb0ZhaWx1cmVGb3JtOiBGdW5jdGlvbjtcbiAgYWRkVG9TdWJtaXRGb3JtOiBGdW5jdGlvbjtcbiAgYWRkVG9TdWNjZXNzRm9ybTogRnVuY3Rpb247XG4gIGNsZWFyRm9ybTogRnVuY3Rpb247XG4gIGNsZWFyRm9ybUNhbGxiYWNrczogRnVuY3Rpb247XG4gIGNsZWFyRmllbGRFcnJvcnM6IEZ1bmN0aW9uO1xuICBjdXJyZW50VmFsdWVzOiBvYmplY3Q7XG4gIGRlbGV0ZWRWYWx1ZXM6IEFycmF5PGFueT47XG4gIGVycm9yczogQXJyYXk8YW55PjtcbiAgZ2V0RG9jdW1lbnQ6IEZ1bmN0aW9uO1xuICBnZXRMYWJlbDogKGZpZWxkTmFtZTogc3RyaW5nLCBmaWVsZExvY2FsZT86IHN0cmluZykgPT4gc3RyaW5nO1xuICBpbml0aWFsRG9jdW1lbnQ6IG9iamVjdDtcbiAgaXNDaGFuZ2VkOiBib29sZWFuO1xuICByZWZldGNoRm9ybTogRnVuY3Rpb247XG4gIC8vIFRPRE86IHdlIGRlcHJlY2F0ZSB0aGlzLCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gYWxsb3cgYSBjaGlsZCB0byBzZXRTdGF0ZSB0aGlzIHdheVxuICAvLyBzZXRGb3JtU3RhdGU6IEZ1bmN0aW9uO1xuICAvLyBGSVhNRTogdGhpcyB0eXBlIGRvZXNuJ3Qgd29yaywgaXQgZG9lc24ndCBuZWNlc3NhcmlseSBoYXZlIHRoZSBldmVudCArIGl0IGhhcyB0byBiZSBkZWZpbmVkXG4gIHN1Ym1pdEZvcm06IEZ1bmN0aW9uOyAvL1JlYWN0LkhUTUxBdHRyaWJ1dGVzPEhUTUxGb3JtRWxlbWVudD5bXCJvblN1Ym1pdFwiXTtcbiAgdGhyb3dFcnJvcjogRnVuY3Rpb247XG4gIHVwZGF0ZUN1cnJlbnRWYWx1ZXM6IEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgY29uc3QgRm9ybUNvbnRleHQgPVxuICBSZWFjdC5jcmVhdGVDb250ZXh0PEZvcm1Db250ZXh0VmFsdWUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmV4cG9ydCBjb25zdCB1c2VGb3JtQ29udGV4dCA9ICgpID0+IHtcbiAgY29uc3QgZm9ybUNvbnRleHQgPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgaWYgKCFmb3JtQ29udGV4dClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkEgY29tcG9uZW50IGlzIHRyeWluZyB0byBhY2Nlc3MgZm9ybSBjb250ZXh0IGJ1dCBpdCBpcyB1bmRlZmluZWQuIFBsZWFzZSB3cmFwIHlvdXIgY29tcG9uZW50IHdpdGggYSA8Rm9ybT4uXCJcbiAgICApO1xuICByZXR1cm4gZm9ybUNvbnRleHQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL2kxOG5cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL3V0aWxzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInByb3AtdHlwZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGFwb2xsby9jbGllbnRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2dldFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvb21pdFwiKTsiLCJleHBvcnQgKiBmcm9tIFwiLi9Qcm92aWRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ29udGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ29uc3VtZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGluZ3NcIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9jb21wYWN0XCIpOyIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgUG9zc2libGVWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vdHlwaW5nc1wiO1xuaW1wb3J0IHsgRHVtbXkgfSBmcm9tIFwiLi9EdW1teVwiO1xuXG4vLyBXZSBuZWVkIHRoaXMgdG8gc2h1dCBUeXBlU2NyaXB0IHVwXG4vLyBZb3Ugc2hvdWxkIHVzZSB0aGUgUHJvdmlkZXIgdG8gZ2V0IHRoZSByaWdodCBkZWZhdWx0IHZhbHVlc1xuZXhwb3J0IGNvbnN0IFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0ID1cbiAgUmVhY3QuY3JlYXRlQ29udGV4dDxQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHM+KHtcbiAgICBfX25vdF9pbnRpYWxpemVkOiB0cnVlLFxuICAgIEFsZXJ0OiBEdW1teSxcbiAgICBCdXR0b246IER1bW15LFxuICAgIEZpZWxkRXJyb3JzOiBEdW1teSxcbiAgICBIZWFkVGFnczogRHVtbXksXG4gICAgTG9hZGluZ0J1dHRvbjogRHVtbXksXG4gICAgTXV0YXRpb25CdXR0b246IER1bW15LFxuICAgIFRvb2x0aXBUcmlnZ2VyOiBEdW1teSxcbiAgICBEcm9wZG93bjogRHVtbXksXG4gICAgLy8gZm9ybVxuICAgIEZvcm06IER1bW15LFxuICAgIEZvcm1Db21wb25lbnQ6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRBdXRvY29tcGxldGU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRDaGVja2JveDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXA6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnREYXRlOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50RGF0ZVRpbWU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnREZWZhdWx0OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50RW1haWw6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRJbm5lcjogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudExpa2VydDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudExvYWRlcjogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudE11bHRpQXV0b2NvbXBsZXRlOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50TnVtYmVyOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50UGFzc3dvcmQ6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRSYWRpb0dyb3VwOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50U2VsZWN0OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRTdGF0aWNUZXh0OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50VGV4dGFyZWE6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRUaW1lOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50VXJsOiBEdW1teSxcbiAgICBGb3JtRWxlbWVudDogRHVtbXksXG4gICAgRm9ybUVycm9yOiBEdW1teSxcbiAgICBGb3JtRXJyb3JzOiBEdW1teSxcbiAgICBGb3JtR3JvdXA6IER1bW15LFxuICAgIEZvcm1Hcm91cEhlYWRlcjogRHVtbXksXG4gICAgRm9ybUdyb3VwTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtSW50bDogRHVtbXksXG4gICAgRm9ybUludGxJdGVtTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtSW50bExheW91dDogRHVtbXksXG4gICAgRm9ybUxheW91dDogRHVtbXksXG4gICAgRm9ybU5lc3RlZEFycmF5OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dDogRHVtbXksXG4gICAgRm9ybU5lc3RlZEFycmF5TGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkRGl2aWRlcjogRHVtbXksXG4gICAgRm9ybU5lc3RlZEl0ZW06IER1bW15LFxuICAgIEZvcm1OZXN0ZWRJdGVtTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkT2JqZWN0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkT2JqZWN0TGF5b3V0OiBEdW1teSxcbiAgICBGb3JtT3B0aW9uTGFiZWw6IER1bW15LFxuICAgIEZvcm1TdWJtaXQ6IER1bW15LFxuICAgIEZvcm1hdHRlZE1lc3NhZ2U6IER1bW15LFxuICAgIEljb246IER1bW15LFxuICAgIEljb25BZGQ6IER1bW15LFxuICAgIEljb25SZW1vdmU6IER1bW15LFxuICAgIExvYWRpbmc6IER1bW15LFxuICAgIEZvcm1JdGVtOiBEdW1teSxcbiAgfSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvcGlja1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvcGVybWlzc2lvbnNcIik7IiwiaW1wb3J0IG1lcmdlIGZyb20gXCJsb2Rhc2gvbWVyZ2VcIjtcbmltcG9ydCBmaW5kIGZyb20gXCJsb2Rhc2gvZmluZFwiO1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSBcImxvZGFzaC9pc1BsYWluT2JqZWN0XCI7XG5pbXBvcnQgc2V0IGZyb20gXCJsb2Rhc2gvc2V0XCI7XG5pbXBvcnQgc2l6ZSBmcm9tIFwibG9kYXNoL3NpemVcIjtcblxuaW1wb3J0IHsgcmVtb3ZlUHJlZml4LCBmaWx0ZXJQYXRoc0J5UHJlZml4IH0gZnJvbSBcIi4vcGF0aF91dGlsc1wiO1xuaW1wb3J0IHsgVnVsY2FuRmllbGRTY2hlbWEgfSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuXG4vLyBhZGQgc3VwcG9ydCBmb3IgbmVzdGVkIHByb3BlcnRpZXNcbmV4cG9ydCBjb25zdCBkZWVwVmFsdWUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gIGNvbnN0IHBhdGhBcnJheSA9IHBhdGguc3BsaXQoXCIuXCIpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgb2JqID0gb2JqW3BhdGhBcnJheVtpXV07XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuLy8gc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTkwOTg3OTcvZmFzdGVzdC13YXktdG8tZmxhdHRlbi11bi1mbGF0dGVuLW5lc3RlZC1qc29uLW9iamVjdHNcbmV4cG9ydCBjb25zdCBmbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmdW5jdGlvbiByZWN1cnNlKGN1ciwgcHJvcCkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoY3VyKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgcmVzdWx0W3Byb3BdID0gY3VyO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXIpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGN1ci5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgIHJlY3Vyc2UoY3VyW2ldLCBwcm9wICsgXCJbXCIgKyBpICsgXCJdXCIpO1xuICAgICAgaWYgKGwgPT0gMCkgcmVzdWx0W3Byb3BdID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTtcbiAgICAgIGZvciAodmFyIHAgaW4gY3VyKSB7XG4gICAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgcmVjdXJzZShjdXJbcF0sIHByb3AgPyBwcm9wICsgXCIuXCIgKyBwIDogcCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNFbXB0eSAmJiBwcm9wKSByZXN1bHRbcHJvcF0gPSB7fTtcbiAgICB9XG4gIH1cbiAgcmVjdXJzZShkYXRhLCBcIlwiKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5VmFsdWUgPSAodmFsdWUpID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICB2YWx1ZSA9PT0gbnVsbCB8fFxuICB2YWx1ZSA9PT0gXCJcIiB8fFxuICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKTtcblxuLyoqXG4gKiBNZXJnZXMgdmFsdWVzLiBJdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQsIG9yaWdpbmFsIGFuZCBkZWxldGVkIHZhbHVlcyxcbiAqIGFuZCB0aGUgbWVyZ2UgcHJvZHVjZXMgdGhlIHByb3BlciB0eXBlIGZvciBzaW1wbGUgb2JqZWN0cyBvciBhcnJheXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gKiAgRm9ybSBjb21wb25lbnQgcHJvcHMuIE9ubHkgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgdGhpcyBmdW5jdGlvbiBhcmUgZG9jdW1lbnRlZC5cbiAqIEBwYXJhbSB7Kn0gcHJvcHMuY3VycmVudFZhbHVlXG4gKiAgQ3VycmVudCB2YWx1ZSBvZiB0aGUgZmllbGRcbiAqIEBwYXJhbSB7Kn0gcHJvcHMuZG9jdW1lbnRWYWx1ZVxuICogIE9yaWdpbmFsIHZhbHVlIG9mIHRoZSBmaWVsZFxuICogQHJldHVybiB7Knx1bmRlZmluZWR9XG4gKiAgTWVyZ2VkIHZhbHVlIG9yIHVuZGVmaW5lZCBpZiBubyBtZXJnZSB3YXMgcGVyZm9ybWVkXG4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZVZhbHVlID0gKHtcbiAgY3VycmVudFZhbHVlLFxuICBkb2N1bWVudFZhbHVlLFxuICBkZWxldGVkVmFsdWVzOiBkZWxldGVkRmllbGRzLFxuICBwYXRoLFxuICBsb2NhbGUsXG4gIGRhdGF0eXBlLFxufSkgPT4ge1xuICBpZiAobG9jYWxlKSB7XG4gICAgLy8gbm90ZTogaW50bCBmaWVsZHMgYXJlIG9mIHR5cGUgT2JqZWN0IGJ1dCBzaG91bGQgYmUgdHJlYXRlZCBhcyBTdHJpbmdzXG4gICAgcmV0dXJuIGN1cnJlbnRWYWx1ZSB8fCBkb2N1bWVudFZhbHVlIHx8IFwiXCI7XG4gIH1cblxuICAvLyBub3RlOiByZXRyaWV2ZSBuZXN0ZWQgZGVsZXRlZCB2YWx1ZXMgaXMgcGVyZm9ybWVkIGhlcmUgdG8gYXZvaWQgc2tpcHBpbmdcbiAgLy8gdGhlIG1lcmdlIGluIGNhc2UgdGhlIGN1cnJlbnQgZmllbGQgaXMgbm90IGluIGBjdXJyZW50VmFsdWVzYCBidXQgYSBuZXN0ZWRcbiAgLy8gcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZCBkaXJlY3RseSBieSBwYXRoXG4gIGNvbnN0IGRlbGV0ZWRWYWx1ZXMgPSBnZXROZXN0ZWREZWxldGVkVmFsdWVzKHBhdGgsIGRlbGV0ZWRGaWVsZHMpO1xuICBjb25zdCBoYXNEZWxldGVkVmFsdWVzID0gISFzaXplKGRlbGV0ZWRWYWx1ZXMpO1xuICBpZiAoXG4gICAgKEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSB8fCBoYXNEZWxldGVkVmFsdWVzKSAmJlxuICAgIGZpbmQoZGF0YXR5cGUsIFtcInR5cGVcIiwgQXJyYXldKVxuICApIHtcbiAgICByZXR1cm4gbWVyZ2UoW10sIGRvY3VtZW50VmFsdWUsIGN1cnJlbnRWYWx1ZSwgZGVsZXRlZFZhbHVlcyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgKGlzUGxhaW5PYmplY3QoY3VycmVudFZhbHVlKSB8fCBoYXNEZWxldGVkVmFsdWVzKSAmJlxuICAgIGZpbmQoZGF0YXR5cGUsIFtcInR5cGVcIiwgT2JqZWN0XSlcbiAgKSB7XG4gICAgcmV0dXJuIG1lcmdlKHt9LCBkb2N1bWVudFZhbHVlLCBjdXJyZW50VmFsdWUsIGRlbGV0ZWRWYWx1ZXMpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgbGlzdCBvZiBmaWVsZCBuYW1lcyB0byBhbiBvYmplY3Qgb2YgZGVsZXRlZCB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXXxPYmplY3QuPHN0cmluZ3xzdHJpbmc+fSBkZWxldGVkRmllbGRzXG4gKiAgTGlzdCBvZiBkZWxldGVkIGZpZWxkIG5hbWVzIG9yIHBhdGhzXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheT19IGFjY3VtdWxhdG9yPXt9XG4gKiAgVmFsdWUgdG8gcmVkdWNlIHRoZSB2YWx1ZXMgdG9cbiAqIEByZXR1cm4ge09iamVjdHxBcnJheX1cbiAqICBEZWxldGVkIHZhbHVlcywgd2l0aCB0aGUgc3RydWN0dXJlIGRlZmluZWQgYnkgdGFraW5nIHRoZSByZWNlaXZlZCBkZWxldGVkXG4gKiAgZmllbGRzIGFzIHBhdGhzXG4gKiBAZXhhbXBsZVxuICogIGNvbnN0IGRlbGV0ZWRGaWVsZHMgPSBbXG4gKiAgICAnZmllbGQuc3ViRmllbGQnLFxuICogICAgJ2ZpZWxkLnN1YkZpZWxkQXJyYXlbMF0nLFxuICogICAgJ2ZpZWxkQXJyYXlbMF0nLFxuICogICAgJ2ZpZWxkQXJyYXlbMl0ubmFtZScsXG4gKiAgXTtcbiAqICBnZXROZXN0ZWREZWxldGVkVmFsdWVzKGRlbGV0ZWRGaWVsZHMpO1xuICogIC8vID0+IHsgJ2ZpZWxkJzogeyAnc3ViRmllbGQnOiBudWxsLCAnc3ViRmllbGRBcnJheSc6IFtudWxsXSB9LCAnZmllbGRBcnJheSc6IFtudWxsLCB1bmRlZmluZWQsIHsgbmFtZTogbnVsbCB9IH1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldERlbGV0ZWRWYWx1ZXMgPSAoZGVsZXRlZEZpZWxkcywgYWNjdW11bGF0b3IgPSB7fSkgPT5cbiAgZGVsZXRlZEZpZWxkcy5yZWR1Y2UoXG4gICAgKGRlbGV0ZWRWYWx1ZXMsIHBhdGgpID0+IHNldChkZWxldGVkVmFsdWVzLCBwYXRoLCBudWxsKSxcbiAgICBhY2N1bXVsYXRvclxuICApO1xuXG4vKipcbiAqIEZpbHRlcnMgdGhlIGdpdmVuIGZpZWxkIG5hbWVzIGJ5IHByZWZpeCwgcmVtb3ZlcyBpdCBmcm9tIGVhY2ggb25lIG9mIHRoZW1cbiAqIGFuZCBjb252ZXJ0IHRoZSBsaXN0IHRvIGFuIG9iamVjdCBvZiBkZWxldGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IHByZWZpeFxuICogIFByZWZpeCB0byBmaWx0ZXIgYW5kIHJlbW92ZSBmcm9tIGRlbGV0ZWQgZmllbGRzXG4gKiBAcGFyYW0ge3N0cmluZ1tdfE9iamVjdC48c3RyaW5nfHN0cmluZz59IGRlbGV0ZWRGaWVsZHNcbiAqICBMaXN0IG9mIGRlbGV0ZWQgZmllbGQgbmFtZXMgb3IgcGF0aHNcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5PX0gYWNjdW11bGF0b3I9e31cbiAqICBWYWx1ZSB0byByZWR1Y2UgdGhlIHZhbHVlcyB0b1xuICogQHJldHVybiB7T2JqZWN0LjxzdHJpbmcsIG51bGw+fVxuICogIE9iamVjdCBrZXllZCB3aXRoIHRoZSBnaXZlbiBkZWxldGVkIGZpZWxkcywgdmFsdWVkIHdpdGggYG51bGxgXG4gKiBAZXhhbXBsZVxuICogIGNvbnN0IGRlbGV0ZWRGaWVsZHMgPSBbXG4gKiAgICAnZmllbGQuc3ViRmllbGQnLFxuICogICAgJ2ZpZWxkLnN1YkZpZWxkQXJyYXlbMF0nLFxuICogICAgJ2ZpZWxkQXJyYXlbMF0nLFxuICogICAgJ2ZpZWxkQXJyYXlbMl0ubmFtZScsXG4gKiAgXTtcbiAqICBnZXROZXN0ZWREZWxldGVkVmFsdWVzKCdmaWVsZCcsIGRlbGV0ZWRGaWVsZHMpO1xuICogIC8vID0+IHsgJ3N1YkZpZWxkJzogbnVsbCwgJ3N1YkZpZWxkQXJyYXknOiBbbnVsbF0gfVxuICogIGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMoJ2ZpZWxkQXJyYXknLCBkZWxldGVkRmllbGRzKTtcbiAqICAvLyA9PiB7ICcwJzogbnVsbCwgJzInOiB7ICduYW1lJzogbnVsbCB9IH1cbiAqICBnZXROZXN0ZWREZWxldGVkVmFsdWVzKCdmaWVsZEFycmF5JywgZGVsZXRlZEZpZWxkcywgW10pO1xuICogIC8vID0+IFtudWxsLCB1bmRlZmluZWQsIHsgJ25hbWUnOiBudWxsIH0gXVxuICovXG5leHBvcnQgY29uc3QgZ2V0TmVzdGVkRGVsZXRlZFZhbHVlcyA9IChcbiAgcHJlZml4LFxuICBkZWxldGVkRmllbGRzLFxuICBhY2N1bXVsYXRvciA9IHt9XG4pID0+XG4gIGdldERlbGV0ZWRWYWx1ZXMoXG4gICAgcmVtb3ZlUHJlZml4KHByZWZpeCwgZmlsdGVyUGF0aHNCeVByZWZpeChwcmVmaXgsIGRlbGV0ZWRGaWVsZHMpKSxcbiAgICBhY2N1bXVsYXRvclxuICApO1xuXG4vL1RPRE86IGNoZWNrIGlmIGl0IHN0aWxsIHdvcmtzIGFzIGV4cGVjdGVkXG4vLyBwcmV2aW91c2x5IHdhcyBkYXRhVHlwZVswXS50eXBlXG5leHBvcnQgY29uc3QgZ2V0RmllbGRUeXBlID0gKGZpZWxkU2NoZW1hOiBWdWxjYW5GaWVsZFNjaGVtYSkgPT5cbiAgZmllbGRTY2hlbWEudHlwZTtcbi8qKlxuICogR2V0IGFwcHJvcHJpYXRlIG51bGwgdmFsdWUgZm9yIHZhcmlvdXMgZmllbGQgdHlwZXNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhdHlwZVxuICogRmllbGQncyBkYXRhdHlwZSBwcm9wZXJ0eVxuICovXG5leHBvcnQgY29uc3QgZ2V0TnVsbFZhbHVlID0gKGRhdGF0eXBlKSA9PiB7XG4gIGNvbnN0IGZpZWxkVHlwZSA9IGdldEZpZWxkVHlwZShkYXRhdHlwZSk7XG4gIGlmIChmaWVsZFR5cGUgPT09IEFycmF5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PT0gQm9vbGVhbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT09IFN0cmluZykge1xuICAgIHJldHVybiBcIlwiO1xuICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PT0gTnVtYmVyKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm9ybWFsaXplIHRvIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImRlYnVnXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC91bmlxXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pbnRlcnNlY3Rpb25cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL2dyYXBocWxcIik7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgVnVsY2FuQ3VycmVudFVzZXJDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuXG5leHBvcnQgY29uc3QgVnVsY2FuQ3VycmVudFVzZXJDb25zdW1lciA9IFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dC5Db25zdW1lcjtcblxuZXhwb3J0IGNvbnN0IHVzZVZ1bGNhbkN1cnJlbnRVc2VyID0gKCkgPT4gdXNlQ29udGV4dChWdWxjYW5DdXJyZW50VXNlckNvbnRleHQpO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBWdWxjYW5Vc2VyIH0gZnJvbSBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiO1xuXG5leHBvcnQgdHlwZSBWdWxjYW5DdXJyZW50VXNlckNvbnRleHRUeXBlID1cbiAgfCB7IGN1cnJlbnRVc2VyOiBWdWxjYW5Vc2VyIHwgbnVsbDsgbG9hZGluZzogZmFsc2UgfVxuICB8IHsgbG9hZGluZzogdHJ1ZTsgY3VycmVudFVzZXI6IGFueSB9O1xuLy8gV2UgbmVlZCB0aGlzIHRvIHNodXQgVHlwZVNjcmlwdCB1cFxuLy8gWW91IHNob3VsZCB1c2UgdGhlIFByb3ZpZGVyIHRvIGdldCB0aGUgcmlnaHQgZGVmYXVsdCB2YWx1ZXNcbmV4cG9ydCBjb25zdCBWdWxjYW5DdXJyZW50VXNlckNvbnRleHQgPVxuICBSZWFjdC5jcmVhdGVDb250ZXh0PFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dFR5cGU+KHtcbiAgICBjdXJyZW50VXNlcjogbnVsbCxcbiAgICBsb2FkaW5nOiBmYWxzZSxcbiAgfSk7XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9Gb3JtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBpbmdzXCI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvbWVyZ2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3NldFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvaXNFbXB0eVwiKTsiLCIvKlxuICogU2NoZW1hIGNvbnZlcnRlci9nZXR0ZXJzXG4gKi9cbmltcG9ydCB7IGNhbkNyZWF0ZUZpZWxkLCBjYW5VcGRhdGVGaWVsZCB9IGZyb20gXCJAdnVsY2FuanMvcGVybWlzc2lvbnNcIjtcbmltcG9ydCB7IFZ1bGNhbkZpZWxkU2NoZW1hLCBWdWxjYW5TY2hlbWEgfSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHsgZ2V0RmllbGRUeXBlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyogZ2V0dGVycyAqL1xuLy8gZmlsdGVyIG91dCBmaWVsZHMgd2l0aCBcIi5cIiBvciBcIiRcIlxuZXhwb3J0IGNvbnN0IGdldFZhbGlkRmllbGRzID0gKHNjaGVtYSkgPT4ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoXG4gICAgKGZpZWxkTmFtZSkgPT4gIWZpZWxkTmFtZS5pbmNsdWRlcyhcIiRcIikgJiYgIWZpZWxkTmFtZS5pbmNsdWRlcyhcIi5cIilcbiAgKTtcbn07XG5cbi8qXG5cbkNvbnZlcnQgYSBuZXN0ZWQgU2ltcGxlU2NoZW1hIHNjaGVtYSBpbnRvIGEgSlNPTiBvYmplY3RcbklmIGZsYXR0ZW4gPSB0cnVlLCB3aWxsIGNyZWF0ZSBhIGZsYXQgb2JqZWN0IGluc3RlYWQgb2YgbmVzdGVkIHRyZWVcblxuLyogcGVybWlzc2lvbnMgKi9cblxuLyoqXG4gKiBAbWV0aG9kIE1vbmdvLkNvbGxlY3Rpb24uZ2V0SW5zZXJ0YWJsZUZpZWxkc1xuICogR2V0IGFuIGFycmF5IG9mIGFsbCBmaWVsZHMgZWRpdGFibGUgYnkgYSBzcGVjaWZpYyB1c2VyIGZvciBhIGdpdmVuIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSB1c2VyIOKAkyB0aGUgdXNlciBmb3Igd2hpY2ggdG8gY2hlY2sgZmllbGQgcGVybWlzc2lvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEluc2VydGFibGVGaWVsZHMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1c2VyKSB7XG4gIGNvbnN0IGZpZWxkcyA9IE9iamVjdC5rZXlzKHNjaGVtYSkuZmlsdGVyKGZ1bmN0aW9uIChmaWVsZE5hbWUpIHtcbiAgICB2YXIgZmllbGQgPSBzY2hlbWFbZmllbGROYW1lXTtcbiAgICByZXR1cm4gY2FuQ3JlYXRlRmllbGQodXNlciwgZmllbGQpO1xuICB9KTtcbiAgcmV0dXJuIGZpZWxkcztcbn07XG5cbi8qKlxuICogQG1ldGhvZCBNb25nby5Db2xsZWN0aW9uLmdldEVkaXRhYmxlRmllbGRzXG4gKiBHZXQgYW4gYXJyYXkgb2YgYWxsIGZpZWxkcyBlZGl0YWJsZSBieSBhIHNwZWNpZmljIHVzZXIgZm9yIGEgZ2l2ZW4gY29sbGVjdGlvbiAoYW5kIG9wdGlvbmFsbHkgZG9jdW1lbnQpXG4gKiBAcGFyYW0ge09iamVjdH0gdXNlciDigJMgdGhlIHVzZXIgZm9yIHdoaWNoIHRvIGNoZWNrIGZpZWxkIHBlcm1pc3Npb25zXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUZpZWxkcyA9IGZ1bmN0aW9uIChzY2hlbWEsIHVzZXIsIGRvY3VtZW50KSB7XG4gIGNvbnN0IGZpZWxkcyA9IE9iamVjdC5rZXlzKHNjaGVtYSkuZmlsdGVyKGZ1bmN0aW9uIChmaWVsZE5hbWUpIHtcbiAgICB2YXIgZmllbGQgPSBzY2hlbWFbZmllbGROYW1lXTtcbiAgICByZXR1cm4gY2FuVXBkYXRlRmllbGQodXNlciwgZmllbGQsIGRvY3VtZW50KTtcbiAgfSk7XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5jb25zdCBpc05lc3RlZFNjaGVtYSA9IChzY2hlbWE6IGFueSk6IHNjaGVtYSBpcyBWdWxjYW5TY2hlbWEgPT4ge1xuICByZXR1cm4gdHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIjtcbn07XG5cbi8qKlxuICogVnVsY2FuIFNjaGVtYSA9PiBGb3JtIFNjaGVtYVxuICogVE9ETzogdHlwZSB0aGlzIGJldHRlclxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0U2NoZW1hID0gKFxuICBzY2hlbWE6IFZ1bGNhblNjaGVtYSxcbiAgb3B0aW9uczogeyBmbGF0dGVuPzogYm9vbGVhbjsgcmVtb3ZlQXJyYXlzPzogYm9vbGVhbiB9ID0ge31cbikgPT4ge1xuICBjb25zdCB7IGZsYXR0ZW4gPSBmYWxzZSwgcmVtb3ZlQXJyYXlzID0gdHJ1ZSB9ID0gb3B0aW9ucztcblxuICBsZXQganNvblNjaGVtYSA9IHt9O1xuXG4gIE9iamVjdC5rZXlzKHNjaGVtYSkuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XG4gICAgLy8gZXhjbHVkZSBhcnJheSBmaWVsZHNcbiAgICBpZiAocmVtb3ZlQXJyYXlzICYmIGZpZWxkTmFtZS5pbmNsdWRlcyhcIiRcIikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBleHRyYWN0IHNjaGVtYVxuICAgIGpzb25TY2hlbWFbZmllbGROYW1lXSA9IGdldEZpZWxkU2NoZW1hKGZpZWxkTmFtZSwgc2NoZW1hKTtcblxuICAgIC8vIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YgbmVzdGVkIGZpZWxkXG4gICAgLy8gYW5kIGdldCBpdHMgc2NoZW1hIGlmIHBvc3NpYmxlIG9yIGl0cyB0eXBlIG90aGVyd2lzZVxuICAgIGNvbnN0IHN1YlNjaGVtYU9yVHlwZSA9IGdldE5lc3RlZEZpZWxkU2NoZW1hT3JUeXBlKGZpZWxkTmFtZSwgc2NoZW1hKTtcbiAgICBpZiAoc3ViU2NoZW1hT3JUeXBlKSB7XG4gICAgICAvLyByZW1lbWJlciB0aGUgc3Vic2NoZW1hIGlmIGl0IGV4aXN0cywgYWxsb3cgdG8gY3VzdG9taXplIGxhYmVscyBmb3IgZWFjaCBncm91cCBvZiBpdGVtcyBmb3IgYXJyYXlzIG9mIG9iamVjdHNcbiAgICAgIGpzb25TY2hlbWFbZmllbGROYW1lXS5hcnJheUZpZWxkU2NoZW1hID0gZ2V0RmllbGRTY2hlbWEoXG4gICAgICAgIGAke2ZpZWxkTmFtZX0uJGAsXG4gICAgICAgIHNjaGVtYVxuICAgICAgKTtcblxuICAgICAgLy8gbmVzdGVkIHNjaGVtYSBjYW4gYmUgYSBmaWVsZCBzY2hlbWEgKHt0eXBlLCBjYW5SZWFkLCBldGMufSkgKGNvbnZlcnRlZFNjaGVtYSB3aWxsIGJlIG51bGwpXG4gICAgICAvLyBvciBhIHNjaGVtYSBvbiBpdHMgb3duIHdpdGggc3ViZmllbGRzIChjb252ZXJ0ZWRTY2hlbWEgd2lsbCByZXR1cm4gc210aClcbiAgICAgIGlmIChpc05lc3RlZFNjaGVtYShzdWJTY2hlbWFPclR5cGUpKSB7XG4gICAgICAgIC8vIGNhbGwgY29udmVydFNjaGVtYSByZWN1cnNpdmVseSBvbiB0aGUgc3ViU2NoZW1hXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZFN1YlNjaGVtYSA9IGNvbnZlcnRTY2hlbWEoc3ViU2NoZW1hT3JUeXBlLCBvcHRpb25zKTtcbiAgICAgICAgLy8gc3ViU2NoZW1hIGlzIGEgZnVsbCBzY2hlbWEgd2l0aCBtdWx0aXBsZSBmaWVsZHMgKGVnIGFycmF5IG9mIG9iamVjdHMpXG4gICAgICAgIGlmIChmbGF0dGVuKSB7XG4gICAgICAgICAganNvblNjaGVtYSA9IHsgLi4uanNvblNjaGVtYSwgLi4uY29udmVydGVkU3ViU2NoZW1hIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvblNjaGVtYVtmaWVsZE5hbWVdLnNjaGVtYSA9IGNvbnZlcnRlZFN1YlNjaGVtYTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3ViU2NoZW1hIGlzIGEgc2ltcGxlIGZpZWxkIGluIHRoaXMgY2FzZSAoZWcgYXJyYXkgb2YgbnVtYmVycylcbiAgICAgICAganNvblNjaGVtYVtmaWVsZE5hbWVdLmlzU2ltcGxlQXJyYXlGaWVsZCA9IHRydWU7IC8vZ2V0RmllbGRTY2hlbWEoYCR7ZmllbGROYW1lfS4kYCwgc2NoZW1hKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4ganNvblNjaGVtYTtcbn07XG5cbi8qXG5cbkdldCBhIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpZWxkJ3Mgc2NoZW1hXG5cbiovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRTY2hlbWEgPSAoZmllbGROYW1lOiBzdHJpbmcsIHNjaGVtYTogVnVsY2FuU2NoZW1hKSA9PiB7XG4gIGxldCBmaWVsZFNjaGVtYSA9IHt9O1xuICBzY2hlbWFQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IHNjaGVtYVtmaWVsZE5hbWVdPy5bcHJvcGVydHldO1xuICAgIGlmIChwcm9wZXJ0eVZhbHVlKSB7XG4gICAgICBmaWVsZFNjaGVtYVtwcm9wZXJ0eV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmaWVsZFNjaGVtYTtcbn07XG5cbi8vIHR5cGUgaXMgYW4gYXJyYXkgZHVlIHRvIHRoZSBwb3NzaWJpbGl0eSBvZiB1c2luZyBTaW1wbGVTY2hlbWEub25lT2Zcbi8vIHJpZ2h0IG5vdyB3ZSBzdXBwb3J0IG9ubHkgZmllbGRzIHdpdGggb25lIHR5cGVcbmV4cG9ydCBjb25zdCBnZXRTY2hlbWFUeXBlID0gKGZpZWxkU2NoZW1hOiBWdWxjYW5GaWVsZFNjaGVtYSkgPT5cbiAgZ2V0RmllbGRUeXBlKGZpZWxkU2NoZW1hKTtcblxuY29uc3QgZ2V0QXJyYXlOZXN0ZWRTY2hlbWEgPSAoZmllbGROYW1lOiBzdHJpbmcsIHNjaGVtYTogVnVsY2FuU2NoZW1hKSA9PiB7XG4gIGNvbnN0IGFycmF5SXRlbVNjaGVtYSA9IHNjaGVtYVtgJHtmaWVsZE5hbWV9LiRgXTtcbiAgY29uc3QgbmVzdGVkU2NoZW1hID0gYXJyYXlJdGVtU2NoZW1hICYmIGdldFNjaGVtYVR5cGUoYXJyYXlJdGVtU2NoZW1hKTtcbiAgcmV0dXJuIG5lc3RlZFNjaGVtYTtcbn07XG5cbi8vIFRPRE86IG5vdCAxMDAlIGl0J3MgdmFsaWQgd2l0aCBjdXJyZW50IGltcGxlbWVudGF0aW9uXG5jb25zdCBpc05lc3RlZFNjaGVtYUZpZWxkID0gKGZpZWxkU2NoZW1hOiBWdWxjYW5GaWVsZFNjaGVtYSkgPT4ge1xuICBjb25zdCBmaWVsZFR5cGUgPSBnZXRTY2hlbWFUeXBlKGZpZWxkU2NoZW1hKTtcbiAgcmV0dXJuIGZpZWxkVHlwZSAmJiB0eXBlb2YgZmllbGRUeXBlID09PSBcIm9iamVjdFwiO1xufTtcbmNvbnN0IGdldE9iamVjdE5lc3RlZFNjaGVtYSA9IChmaWVsZE5hbWU6IHN0cmluZywgc2NoZW1hOiBWdWxjYW5TY2hlbWEpID0+IHtcbiAgY29uc3QgZmllbGRTY2hlbWEgPSBzY2hlbWFbZmllbGROYW1lXTtcbiAgaWYgKCFpc05lc3RlZFNjaGVtYUZpZWxkKGZpZWxkU2NoZW1hKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG5lc3RlZFNjaGVtYSA9IGZpZWxkU2NoZW1hICYmIGdldFNjaGVtYVR5cGUoZmllbGRTY2hlbWEpO1xuICByZXR1cm4gbmVzdGVkU2NoZW1hO1xufTtcbi8qXG5cbkdpdmVuIGFuIGFycmF5IGZpZWxkLCBnZXQgaXRzIG5lc3RlZCBzY2hlbWFcbklmIHRoZSBmaWVsZCBpcyBub3QgYW4gb2JqZWN0LCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdWJmaWVsZCB0eXBlIGluc3RlYWRcbiovXG5leHBvcnQgY29uc3QgZ2V0TmVzdGVkRmllbGRTY2hlbWFPclR5cGUgPSAoZmllbGROYW1lLCBzY2hlbWEpID0+IHtcbiAgY29uc3QgYXJyYXlJdGVtU2NoZW1hID0gZ2V0QXJyYXlOZXN0ZWRTY2hlbWEoZmllbGROYW1lLCBzY2hlbWEpO1xuICBpZiAoIWFycmF5SXRlbVNjaGVtYSkge1xuICAgIC8vIGxvb2sgZm9yIGFuIG9iamVjdCBzY2hlbWFcbiAgICBjb25zdCBvYmplY3RJdGVtU2NoZW1hID0gZ2V0T2JqZWN0TmVzdGVkU2NoZW1hKGZpZWxkTmFtZSwgc2NoZW1hKTtcbiAgICAvLyBubyBzY2hlbWEgd2FzIGZvdW5kXG4gICAgaWYgKCFvYmplY3RJdGVtU2NoZW1hKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gb2JqZWN0SXRlbVNjaGVtYTtcbiAgfVxuICByZXR1cm4gYXJyYXlJdGVtU2NoZW1hO1xufTtcblxuZXhwb3J0IGNvbnN0IHNjaGVtYVByb3BlcnRpZXMgPSBbXG4gIFwidHlwZVwiLFxuICBcImxhYmVsXCIsXG4gIFwib3B0aW9uYWxcIixcbiAgXCJyZXF1aXJlZFwiLFxuICBcIm1pblwiLFxuICBcIm1heFwiLFxuICBcImV4Y2x1c2l2ZU1pblwiLFxuICBcImV4Y2x1c2l2ZU1heFwiLFxuICBcIm1pbkNvdW50XCIsXG4gIFwibWF4Q291bnRcIixcbiAgXCJhbGxvd2VkVmFsdWVzXCIsXG4gIFwicmVnRXhcIixcbiAgXCJibGFja2JveFwiLFxuICBcInRyaW1cIixcbiAgXCJjdXN0b21cIixcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJhdXRvVmFsdWVcIixcbiAgXCJoaWRkZW5cIiwgLy8gaGlkZGVuOiB0cnVlIG1lYW5zIHRoZSBmaWVsZCBpcyBuZXZlciBzaG93biBpbiBhIGZvcm0gbm8gbWF0dGVyIHdoYXRcbiAgXCJtdXN0Q29tcGxldGVcIiwgLy8gbXVzdENvbXBsZXRlOiB0cnVlIG1lYW5zIHRoZSBmaWVsZCBpcyByZXF1aXJlZCB0byBoYXZlIGEgY29tcGxldGUgcHJvZmlsZVxuICBcImZvcm1cIiwgLy8gZm9ybSBwbGFjZWhvbGRlclxuICBcImlucHV0UHJvcGVydGllc1wiLCAvLyBmb3JtIHBsYWNlaG9sZGVyXG4gIFwiaXRlbVByb3BlcnRpZXNcIixcbiAgXCJjb250cm9sXCIsIC8vIFNtYXJ0Rm9ybSBjb250cm9sIChTdHJpbmcgb3IgUmVhY3QgY29tcG9uZW50KVxuICBcImlucHV0XCIsIC8vIFNtYXJ0Rm9ybSBjb250cm9sIChTdHJpbmcgb3IgUmVhY3QgY29tcG9uZW50KVxuICBcImF1dG9mb3JtXCIsIC8vIGxlZ2FjeSBmb3JtIHBsYWNlaG9sZGVyOyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChub3QgdXNlZCBhbnltb3JlKVxuICBcIm9yZGVyXCIsIC8vIHBvc2l0aW9uIGluIHRoZSBmb3JtXG4gIFwiZ3JvdXBcIiwgLy8gZm9ybSBmaWVsZHNldCBncm91cFxuICBcIm9uQ3JlYXRlXCIsIC8vIGZpZWxkIGluc2VydCBjYWxsYmFja1xuICBcIm9uVXBkYXRlXCIsIC8vIGZpZWxkIGVkaXQgY2FsbGJhY2tcbiAgXCJvbkRlbGV0ZVwiLCAvLyBmaWVsZCByZW1vdmUgY2FsbGJhY2tcbiAgXCJvbkluc2VydFwiLCAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBcIm9uRWRpdFwiLCAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBcIm9uUmVtb3ZlXCIsIC8vIE9wZW5DUlVEIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIFwiY2FuUmVhZFwiLFxuICBcImNhbkNyZWF0ZVwiLFxuICBcImNhblVwZGF0ZVwiLFxuICBcInZpZXdhYmxlQnlcIiwgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgXCJpbnNlcnRhYmxlQnlcIiwgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgXCJlZGl0YWJsZUJ5XCIsIC8vIE9wZW5DUlVEIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIFwicmVzb2x2ZUFzXCIsXG4gIFwic2VhcmNoYWJsZVwiLFxuICBcImRlc2NyaXB0aW9uXCIsXG4gIFwiYmVmb3JlQ29tcG9uZW50XCIsXG4gIFwiYWZ0ZXJDb21wb25lbnRcIixcbiAgXCJwbGFjZWhvbGRlclwiLFxuICBcIm9wdGlvbnNcIixcbiAgXCJxdWVyeVwiLFxuICBcInF1ZXJ5V2FpdHNGb3JWYWx1ZVwiLFxuICBcImF1dG9jb21wbGV0ZVF1ZXJ5XCIsXG4gIFwiZmllbGRQcm9wZXJ0aWVzXCIsXG4gIFwiaW50bFwiLFxuICBcImludGxJZFwiLFxuXTtcblxuZXhwb3J0IGNvbnN0IGZvcm1Qcm9wZXJ0aWVzID0gW1xuICBcIm9wdGlvbmFsXCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJtaW5cIixcbiAgXCJtYXhcIixcbiAgXCJleGNsdXNpdmVNaW5cIixcbiAgXCJleGNsdXNpdmVNYXhcIixcbiAgXCJtaW5Db3VudFwiLFxuICBcIm1heENvdW50XCIsXG4gIFwiYWxsb3dlZFZhbHVlc1wiLFxuICBcInJlZ0V4XCIsXG4gIFwiYmxhY2tib3hcIixcbiAgXCJ0cmltXCIsXG4gIFwiY3VzdG9tXCIsXG4gIFwiZGVmYXVsdFZhbHVlXCIsXG4gIFwiYXV0b1ZhbHVlXCIsXG4gIFwibXVzdENvbXBsZXRlXCIsIC8vIG11c3RDb21wbGV0ZTogdHJ1ZSBtZWFucyB0aGUgZmllbGQgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbXBsZXRlIHByb2ZpbGVcbiAgXCJmb3JtXCIsIC8vIGZvcm0gcGxhY2Vob2xkZXJcbiAgXCJpbnB1dFByb3BlcnRpZXNcIiwgLy8gZm9ybSBwbGFjZWhvbGRlclxuICBcIml0ZW1Qcm9wZXJ0aWVzXCIsXG4gIFwiY29udHJvbFwiLCAvLyBTbWFydEZvcm0gY29udHJvbCAoU3RyaW5nIG9yIFJlYWN0IGNvbXBvbmVudClcbiAgXCJpbnB1dFwiLCAvLyBTbWFydEZvcm0gY29udHJvbCAoU3RyaW5nIG9yIFJlYWN0IGNvbXBvbmVudClcbiAgXCJvcmRlclwiLCAvLyBwb3NpdGlvbiBpbiB0aGUgZm9ybVxuICBcImdyb3VwXCIsIC8vIGZvcm0gZmllbGRzZXQgZ3JvdXBcbiAgXCJkZXNjcmlwdGlvblwiLFxuICBcImJlZm9yZUNvbXBvbmVudFwiLFxuICBcImFmdGVyQ29tcG9uZW50XCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbiAgXCJvcHRpb25zXCIsXG4gIFwicXVlcnlcIixcbiAgXCJxdWVyeVdhaXRzRm9yVmFsdWVcIixcbiAgXCJhdXRvY29tcGxldGVRdWVyeVwiLFxuICBcImZpZWxkUHJvcGVydGllc1wiLFxuXTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9maW5kXCIpOyIsImltcG9ydCB0b1BhdGggZnJvbSBcImxvZGFzaC90b1BhdGhcIjtcbmltcG9ydCBpbml0aWFsIGZyb20gXCJsb2Rhc2gvaW5pdGlhbFwiO1xuaW1wb3J0IGZsb3cgZnJvbSBcImxvZGFzaC9mcC9mbG93XCI7XG5pbXBvcnQgdGFrZVJpZ2h0IGZyb20gXCJsb2Rhc2gvdGFrZVJpZ2h0XCI7XG5cbi8qKlxuICogU3BsaXRzIGEgcGF0aCBpbiBzdHJpbmcgZm9ybWF0IGludG8gYW4gYXJyYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBzcGxpdFBhdGggPSAoc3RyaW5nOiBzdHJpbmcpID0+IHRvUGF0aChzdHJpbmcpO1xuXG4vKipcbiAqIEpvaW5zIGEgcGF0aCBpbiBhcnJheSBmb3JtYXQgaW50byBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGpvaW5QYXRoID0gKGFycmF5OiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogc3RyaW5nID0+XG4gIGFycmF5LnJlZHVjZTxzdHJpbmc+KFxuICAgIChzdHJpbmcsIGl0ZW0pID0+XG4gICAgICBzdHJpbmcgK1xuICAgICAgKE51bWJlci5pc05hTihOdW1iZXIoaXRlbSkpXG4gICAgICAgID8gYCR7c3RyaW5nID09PSBcIlwiID8gXCJcIiA6IFwiLlwifSR7aXRlbX1gXG4gICAgICAgIDogYFske2l0ZW19XWApLFxuICAgIFwiXCJcbiAgKTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgcGFyZW50IHBhdGggZnJvbSB0aGUgZ2l2ZW4gb25lLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqICBQYXRoIGluIHN0cmluZyBmb3JtYXRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFBhcmVudFBhdGggPSBmbG93KHNwbGl0UGF0aCwgaW5pdGlhbCwgam9pblBhdGgpO1xuXG4vKipcbiAqIFJlbW92ZXMgcHJlZml4IGZyb20gdGhlIGdpdmVuIHBhdGhzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7U3RyaW5nW119IHBhdGhzXG4gKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZVByZWZpeCA9IChcbiAgcHJlZml4OiBzdHJpbmcsXG4gIHBhdGhzOiBBcnJheTxzdHJpbmc+XG4pOiBBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgZXhwbG9kZWRQcmVmaXggPSBzcGxpdFBhdGgocHJlZml4KTtcbiAgcmV0dXJuIHBhdGhzLm1hcCgocGF0aCkgPT4ge1xuICAgIGlmIChwYXRoID09PSBwcmVmaXgpIHtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICBjb25zdCBleHBsb2RlZFBhdGggPSBzcGxpdFBhdGgocGF0aCk7XG4gICAgY29uc3QgZXhwbG9kZWRTdWZmaXggPSB0YWtlUmlnaHQoXG4gICAgICBleHBsb2RlZFBhdGgsXG4gICAgICBleHBsb2RlZFBhdGgubGVuZ3RoIC0gZXhwbG9kZWRQcmVmaXgubGVuZ3RoXG4gICAgKTtcbiAgICByZXR1cm4gam9pblBhdGgoZXhwbG9kZWRTdWZmaXgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogRmlsdGVycyBwYXRocyB0aGF0IGhhdmUgdGhlIGdpdmVuIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1N0cmluZ1tdfSBwYXRoc1xuICogQHJldHVybiB7U3RyaW5nW119XG4gKi9cbmV4cG9ydCBjb25zdCBmaWx0ZXJQYXRoc0J5UHJlZml4ID0gKHByZWZpeDogc3RyaW5nLCBwYXRoczogQXJyYXk8c3RyaW5nPikgPT5cbiAgcGF0aHMuZmlsdGVyKFxuICAgIChwYXRoKSA9PlxuICAgICAgcGF0aCA9PT0gcHJlZml4IHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoYCR7cHJlZml4fS5gKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKGAke3ByZWZpeH1bYClcbiAgKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInNpbXBsLXNjaGVtYVwiKTsiLCJpbXBvcnQge1xuICBWdWxjYW5GaWVsZFR5cGUsXG4gIFZ1bGNhbkNvcmVJbnB1dCxcbiAgVnVsY2FuRmllbGRJbnB1dCxcbn0gZnJvbSBcIkB2dWxjYW5qcy9zY2hlbWFcIjtcbmltcG9ydCBTaW1wbGVTY2hlbWEgZnJvbSBcInNpbXBsLXNjaGVtYVwiO1xuXG5leHBvcnQgY29uc3Qgc3RhbmRhcmRJbnB1dHM6IEFycmF5PFZ1bGNhbkNvcmVJbnB1dD4gPSBbXG4gIFwibnVtYmVyXCIsXG4gIFwidXJsXCIsXG4gIFwiZW1haWxcIixcbiAgXCJ0ZXh0YXJlYVwiLFxuICBcImNoZWNrYm94XCIsXG4gIFwiY2hlY2tib3hncm91cFwiLFxuICBcInJhZGlvZ3JvdXBcIixcbiAgXCJzZWxlY3RcIixcbiAgXCJzZWxlY3RtdWx0aXBsZVwiLFxuICBcImRhdGV0aW1lXCIsXG4gIFwiZGF0ZVwiLFxuICBcInRpbWVcIixcbiAgXCJ0ZXh0XCIsXG4gIFwicGFzc3dvcmRcIixcbl07XG5cbmV4cG9ydCBjb25zdCBjbGVhcmFibGVJbnB1dHM6IEFycmF5PFZ1bGNhbkNvcmVJbnB1dD4gPSBbXG4gIFwiZGF0ZVwiLFxuICAvLyAgXCJkYXRlMlwiLFxuICBcImRhdGV0aW1lXCIsXG4gIFwidGltZVwiLFxuICBcInNlbGVjdFwiLFxuICBcInJhZGlvZ3JvdXBcIixcbl07XG5leHBvcnQgY29uc3QgYWR2YW5jZWRJbnB1dHM6IEFycmF5PFZ1bGNhbkNvcmVJbnB1dD4gPSBbXG4gIFwibGlrZXJ0XCIsXG4gIFwiYXV0b2NvbXBsZXRlXCIsXG4gIFwibXVsdGlhdXRvY29tcGxldGVcIixcbl07XG5leHBvcnQgdHlwZSBEZXJpdmVkSW5wdXQgPSBcIm5lc3RlZFwiO1xuZXhwb3J0IGNvbnN0IGRlcml2ZWRJbnB1dHM6IEFycmF5PERlcml2ZWRJbnB1dD4gPSBbXCJuZXN0ZWRcIl07XG5leHBvcnQgY29uc3QgYWxsVnVsY2FuSW5wdXRzOiBBcnJheTxWdWxjYW5Db3JlSW5wdXQgfCBEZXJpdmVkSW5wdXQ+ID0gW1xuICAuLi5zdGFuZGFyZElucHV0cyxcbiAgLi4uYWR2YW5jZWRJbnB1dHMsXG4gIC8vIGRlcml2ZWQgaW5wdXRzIGFyZSBzcGVjaWZpYyB0byB0aGUgRm9ybSBpbnRlcm5hbCBjb21wdXRhdGlvbnNcbiAgLy8gaXQgY2FuJ3QgYmUgc2V0IGJ5IHRoZSB1c2VyXG4gIC4uLmRlcml2ZWRJbnB1dHMsXG5dO1xuXG5leHBvcnQgY29uc3QgZ2V0QXV0b0lucHV0RnJvbVR5cGUgPSAoXG4gIGZpZWxkVHlwZTogVnVsY2FuRmllbGRUeXBlXG4pOiBWdWxjYW5Db3JlSW5wdXQgPT4ge1xuICBjb25zdCBhdXRvVHlwZSA9XG4gICAgZmllbGRUeXBlID09PSBOdW1iZXIgfHwgZmllbGRUeXBlID09PSBTaW1wbGVTY2hlbWEuSW50ZWdlclxuICAgICAgPyBcIm51bWJlclwiXG4gICAgICA6IGZpZWxkVHlwZSA9PT0gQm9vbGVhblxuICAgICAgPyBcImNoZWNrYm94XCJcbiAgICAgIDogZmllbGRUeXBlID09PSBEYXRlXG4gICAgICA/IFwiZGF0ZVwiXG4gICAgICA6IFwidGV4dFwiO1xuICByZXR1cm4gYXV0b1R5cGU7XG59O1xuIiwiZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50cy9mb3JtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21wb25lbnRzL1Z1bGNhbkNvbXBvbmVudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbXBvbmVudHMvVnVsY2FuQ3VycmVudFVzZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbXBvbmVudHNIZWxwZXJzXCI7XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9Gb3JtQ29udGFpbmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Gb3JtXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG4iLCIvKlxuXG5Gb3JtQ29udGFpbmVyIGFrYSBTbWFydEZvcm1cblxuQ2hhbmdlcyBjb21wYXJlZCB0byBWdWxjYW4gTWV0ZW9yOlxuXG4tIHByZXZpb3VzbHkgd2FzIG5hbWVkIEZvcm1XcmFwcGVyXG4tIGFjY2VwdHMgYSBtb2RlbCBpbnN0ZWFkIG9mIGNvbGxlY3Rpb25cbi0gbm8gcXVlcnlGcmFnbWVudE5hbWUgKHJlc3AuIG11dGF0aW9uIG5hbWUpLCBpbnN0ZWFkIHlvdSBuZWVkIHRvIHBhc3MgdGhlIGZyYWdtZW50IGV4cGxpY2l0ZWx5XG5cblRlY2huaWNhbGx5LCB0aGlzIGlzIGEgR3JhcGhxbFNtYXJ0Rm9ybSwgd2hpbGUgRm9ybS50c3ggaXMgdGhlIG1vcmVcbmdlbmVyaWMgU21hcnRGb3JtLCBvciBhIFwiTW9kZWxGb3JtXCIuXG5cblxuLS0tXG5cbkdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBmcmFnbWVudCBmb3IgdGhlIGN1cnJlbnQgZm9ybSwgdGhlblxud3JhcCB0aGUgbWFpbiBGb3JtIGNvbXBvbmVudCB3aXRoIHRoZSBuZWNlc3NhcnkgSG9DcyB3aGlsZSBwYXNzaW5nXG50aGVtIHRoZSBmcmFnbWVudC5cblxuVGhpcyBjb21wb25lbnQgaXMgaXRzZWxmIHdyYXBwZWQgd2l0aDpcblxuLSB3aXRoQ3VycmVudFVzZXJcbi0gd2l0aEFwb2xsbyAodXNlZCB0byBhY2Nlc3MgdGhlIEFwb2xsbyBjbGllbnQgZm9yIGZvcm0gcHJlLXBvcHVsYXRpb24pXG5cbkFuZCB3cmFwcyB0aGUgRm9ybSBjb21wb25lbnQgd2l0aDpcblxuLSB3aXRoTmV3XG5cbk9yOlxuXG4tIHdpdGhTaW5nbGVcbi0gd2l0aFVwZGF0ZVxuLSB3aXRoRGVsZXRlXG5cbihXaGVuIHdyYXBwaW5nIHdpdGggd2l0aFNpbmdsZSwgd2l0aFVwZGF0ZSwgYW5kIHdpdGhEZWxldGUsIGEgc3BlY2lhbCBMb2FkZXJcbmNvbXBvbmVudCBpcyBhbHNvIGFkZGVkIHRvIHdhaXQgZm9yIHdpdGhTaW5nbGUncyBsb2FkaW5nIHByb3AgdG8gYmUgZmFsc2UpXG5cbiovXG5pbXBvcnQgUmVhY3QsIHsgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG4vLyBpbXBvcnQgLy8gd2l0aEN1cnJlbnRVc2VyLFxuLy8gVXRpbHMsXG4vLyBnZXRGcmFnbWVudCxcbi8vXCJtZXRlb3IvdnVsY2FuOmNvcmVcIjtcbmltcG9ydCB7IERvY3VtZW50Tm9kZSwgZ3FsIH0gZnJvbSBcIkBhcG9sbG8vY2xpZW50XCI7XG5cbmltcG9ydCBnZXRGb3JtRnJhZ21lbnRzIGZyb20gXCIuL21vZHVsZXMvZm9ybUZyYWdtZW50c1wiO1xuLy8gaW1wb3J0IHsgVnVsY2FuTW9kZWwgfSBmcm9tIFwiQHZ1bGNhbmpzL21vZGVsXCI7XG5pbXBvcnQge1xuICBWdWxjYW5HcmFwaHFsTW9kZWwsXG4gIENyZWF0ZVZhcmlhYmxlcyxcbiAgVXBkYXRlVmFyaWFibGVzLFxuICBEZWxldGVWYXJpYWJsZXMsXG4gIGdldEZyYWdtZW50TmFtZSxcbn0gZnJvbSBcIkB2dWxjYW5qcy9ncmFwaHFsXCI7XG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSBcIkB2dWxjYW5qcy91dGlsc1wiO1xuaW1wb3J0IHtcbiAgdXNlU2luZ2xlLFxuICB1c2VDcmVhdGUsXG4gIHVzZVVwZGF0ZSxcbiAgdXNlRGVsZXRlLFxuICBVc2VTaW5nbGVPcHRpb25zLFxufSBmcm9tIFwiQHZ1bGNhbmpzL3JlYWN0LWhvb2tzXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IEZldGNoUmVzdWx0IH0gZnJvbSBcIkBhcG9sbG8vY2xpZW50XCI7XG4vLyBpbXBvcnQgeyBGb3JtVHlwZSB9IGZyb20gXCIuL3R5cGluZ3NcIjtcbmltcG9ydCB7IGRlYnVnVnVsY2FuIH0gZnJvbSBcIkB2dWxjYW5qcy91dGlsc1wiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ3VycmVudFVzZXIgfSBmcm9tIFwiLi4vVnVsY2FuQ3VycmVudFVzZXIvQ29uc3VtZXJcIjtcbmltcG9ydCB7IFZ1bGNhblVzZXIgfSBmcm9tIFwiQHZ1bGNhbmpzL3Blcm1pc3Npb25zXCI7XG5pbXBvcnQgeyBQYXNzZWREb3duRm9ybVByb3BzIH0gZnJvbSBcIi4vRm9ybS90eXBpbmdzXCI7XG5jb25zdCBkZWJ1Z0Zvcm0gPSBkZWJ1Z1Z1bGNhbihcImZvcm1cIik7XG5cbi8vIE11dGF0aW9uIHRoYXQgeWllbGQgYSBzdWNjZXNzIHJlc3VsdFxudHlwZSBTdWNjZXNzZnVsRmV0Y2hSZXN1bHQ8VERhdGEgPSBPYmplY3Q+ID0gRmV0Y2hSZXN1bHQ8VERhdGE+ICYge1xuICBkYXRhOiBURGF0YTtcbn07XG4vKipcbiAqIFR5cGVndWFyZWQgdG8gYWxsb3cgY29uc2lkZXJpbmcgdGhlIHJlcXVlc3QgYXMgc3VjY2Vzc2Z1bFxuICovXG5jb25zdCBpc1N1Y2Nlc3NmdWwgPSBmdW5jdGlvbiA8VCA9IGFueT4oXG4gIHJlc3VsdDogRmV0Y2hSZXN1bHQ8VD4gfCB1bmRlZmluZWRcbik6IHJlc3VsdCBpcyBTdWNjZXNzZnVsRmV0Y2hSZXN1bHQ8VD4ge1xuICByZXR1cm4gISFyZXN1bHQ/LmRhdGE7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db250YWluZXJQcm9wcyBleHRlbmRzIFBhc3NlZERvd25Gb3JtUHJvcHMge1xuICBtb2RlbDogVnVsY2FuR3JhcGhxbE1vZGVsO1xuICAvKiogRG9jdW1lbnQgaWQgZm9yIGVkaXRpb24gbW9kZSwgd2lsbCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSBkb2N1bWVudCAqL1xuICBkb2N1bWVudElkPzogc3RyaW5nO1xuICAvKiogU2x1ZyAoPSBodW1hbiByZWFkYWJsZSB1bmlxdWUgaWQpIGZvciBlZGl0aW9uIG1vZGUsIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgZG9jdW1lbnQgKi9cbiAgc2x1Zz86IHN0cmluZztcbiAgLyoqXG4gICAqIExpc3Qgb25seSB0aG9zZSBmaWVsZHMgaW4gdGhlIGZvcm1cbiAgICovXG4gIGZpZWxkcz86IEFycmF5PHN0cmluZz47XG4gIC8qKlxuICAgKiBMaXN0IGRlZmF1bHQgZmllbGRzICsgdGhvc2UgYWRkaXRpb25hbCBmaWVsZHMgYXMgd2VsbFxuICAgKi9cbiAgYWRkRmllbGRzPzogQXJyYXk8c3RyaW5nPjtcbiAgLyoqXG4gICAqIEZvcmNlIGEgY3VycmVudFVzZXIsIG92ZXJyaWRpbmcgdGhlIGN1cnJlbnRVc2VyIG9idGFpbmVkXG4gICAqIHZpYSBDb250ZXh0XG4gICAqXG4gICAqIElmIHlvdSB1c2UgbWFueSBmb3JtcyBpbiB5b3VyIGFwcCxcbiAgICogaXQgbWlnaHQgYmUgYmV0dGVyIHRvIHNldCBWdWxjYW5DdXJyZW50VXNlckNvbnRleHRcbiAgICogYXQgdGhlIHRvcC1sZXZlbCBvZiB5b3VyIGFwcFxuICAgKiAoZWcgaW4gXCJwYWdlcy9fYXBwLmpzXCIgZm9yIE5leHQuanMpXG4gICAqL1xuICBjdXJyZW50VXNlcj86IFZ1bGNhblVzZXIgfCBudWxsO1xuICBsb2FkaW5nQ3VycmVudFVzZXI/OiBib29sZWFuO1xufVxuZXhwb3J0IHR5cGUgU21hcnRGb3JtUHJvcHMgPSBGb3JtQ29udGFpbmVyUHJvcHM7XG5cbmNvbnN0IHVzZUZyYWdtZW50cyA9IChcbiAgcHJvcHM6IFBpY2s8XG4gICAgRm9ybUNvbnRhaW5lclByb3BzLFxuICAgIHwgXCJtdXRhdGlvbkZyYWdtZW50XCJcbiAgICB8IFwibXV0YXRpb25GcmFnbWVudE5hbWVcIlxuICAgIHwgXCJxdWVyeUZyYWdtZW50XCJcbiAgICB8IFwicXVlcnlGcmFnbWVudE5hbWVcIlxuICAgIC8vIGZvciBhdXRvIGdlbmVyYXRpb25cbiAgICB8IFwibW9kZWxcIlxuICAgIHwgXCJmaWVsZHNcIlxuICAgIHwgXCJhZGRGaWVsZHNcIlxuICA+LFxuICBmb3JtVHlwZTogXCJlZGl0XCIgfCBcIm5ld1wiXG4pID0+IHtcbiAgLy8gZ2V0IGZyYWdtZW50IHVzZWQgdG8gZGVjaWRlIHdoYXQgZGF0YSB0byBsb2FkIGZyb20gdGhlIHNlcnZlciB0byBwb3B1bGF0ZSB0aGUgZm9ybSxcbiAgLy8gYXMgd2VsbCBhcyB3aGF0IGRhdGEgdG8gYXNrIGZvciBhcyByZXR1cm4gdmFsdWUgZm9yIHRoZSBtdXRhdGlvblxuICAvLyBUT0RPOiBtb3ZlIG91dCBvZiB0aGUgY29tcG9uZW50XG4gIC8vY29uc3QgZ2V0RnJhZ21lbnRzID0gKCkgPT4ge1xuICBsZXQgcXVlcnlGcmFnbWVudDogRG9jdW1lbnROb2RlIHwgdW5kZWZpbmVkO1xuICBsZXQgcXVlcnlGcmFnbWVudE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG11dGF0aW9uRnJhZ21lbnQ6IERvY3VtZW50Tm9kZSB8IHVuZGVmaW5lZDtcbiAgbGV0IG11dGF0aW9uRnJhZ21lbnROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gaWYgcXVlcnlGcmFnbWVudCBvciBtdXRhdGlvbkZyYWdtZW50IHByb3BzIGFyZSBzcGVjaWZpZWQsIGFjY2VwdCBlaXRoZXIgZnJhZ21lbnQgb2JqZWN0IG9yIGZyYWdtZW50IHN0cmluZ1xuICAvLyBUT0RPOiBub3Qgc3VyZSB3ZSBhY3R1YWxseSBuZWVkIHRoYXQsIGdBcG9sbG8gYWNjZXB0cyBmcmFnbWVudHMgb3Igc3RyaW5nIG5vcm1hbGx5XG4gIGlmIChwcm9wcy5xdWVyeUZyYWdtZW50KSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5xdWVyeUZyYWdtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBxdWVyeUZyYWdtZW50ID0gZ3FsYFxuICAgICAgICAke3Byb3BzLnF1ZXJ5RnJhZ21lbnR9XG4gICAgICBgO1xuICAgICAgaWYgKCFwcm9wcy5xdWVyeUZyYWdtZW50TmFtZSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiV2hlbiB1c2luZyBhIHN0cmluZyBxdWVyeUZyYWdtZW50LCBxdWVyeUZyYWdtZW50TmFtZSBpcyBtYW5kYXRvcnlcIlxuICAgICAgICApO1xuICAgICAgcXVlcnlGcmFnbWVudE5hbWUgPSBwcm9wcy5xdWVyeUZyYWdtZW50TmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRG9jdW1lbnROb2RlXG4gICAgICBxdWVyeUZyYWdtZW50ID0gcHJvcHMucXVlcnlGcmFnbWVudDtcbiAgICAgIC8vIGF1dG9tYXRpY2FsbHkgY29tcHV0ZSB0aGUgZnJhZ21lbnQgbmFtZVxuICAgICAgcXVlcnlGcmFnbWVudE5hbWUgPVxuICAgICAgICBwcm9wcy5xdWVyeUZyYWdtZW50TmFtZSB8fCBnZXRGcmFnbWVudE5hbWUocHJvcHMucXVlcnlGcmFnbWVudCk7XG4gICAgfVxuICB9XG4gIGlmIChwcm9wcy5tdXRhdGlvbkZyYWdtZW50KSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5tdXRhdGlvbkZyYWdtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtdXRhdGlvbkZyYWdtZW50ID0gZ3FsYFxuICAgICAgICAke3Byb3BzLm11dGF0aW9uRnJhZ21lbnR9XG4gICAgICBgO1xuICAgICAgaWYgKCFwcm9wcy5tdXRhdGlvbkZyYWdtZW50TmFtZSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiV2hlbiB1c2luZyBhIHN0cmluZyBtdXRhdGlvbkZyYWdtZW50LCBtdXRhdGlvbkZyYWdtZW50TmFtZSBpcyBtYW5kYXRvcnlcIlxuICAgICAgICApO1xuICAgICAgcXVlcnlGcmFnbWVudE5hbWUgPSBwcm9wcy5tdXRhdGlvbkZyYWdtZW50TmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRG9jdW1lbnROb2RlXG4gICAgICBtdXRhdGlvbkZyYWdtZW50ID0gcHJvcHMubXV0YXRpb25GcmFnbWVudDtcbiAgICAgIC8vIGF1dG9tYXRpY2FsbHkgY29tcHV0ZSB0aGUgZnJhZ21lbnQgbmFtZVxuICAgICAgbXV0YXRpb25GcmFnbWVudE5hbWUgPVxuICAgICAgICBwcm9wcy5tdXRhdGlvbkZyYWdtZW50TmFtZSB8fCBnZXRGcmFnbWVudE5hbWUocHJvcHMubXV0YXRpb25GcmFnbWVudCk7XG4gICAgfVxuICB9XG4gIC8vIGF1dG8gZ2VuZXJhdGUgZnJhZ21lbnRzXG4gIGxldCBhdXRvRm9ybUZyYWdtZW50cztcbiAgaWYgKCFwcm9wcy5xdWVyeUZyYWdtZW50IHx8ICFwcm9wcy5tdXRhdGlvbkZyYWdtZW50KSB7XG4gICAgY29uc3QgeyBtb2RlbCwgZmllbGRzLCBhZGRGaWVsZHMgfSA9IHByb3BzO1xuICAgIC8vIGF1dG9nZW5lcmF0ZWQgZnJhZ21lbnRzXG4gICAgYXV0b0Zvcm1GcmFnbWVudHMgPSBnZXRGb3JtRnJhZ21lbnRzKHtcbiAgICAgIGZvcm1UeXBlLFxuICAgICAgbW9kZWwsXG4gICAgICBmaWVsZHMsXG4gICAgICBhZGRGaWVsZHMsXG4gICAgfSk7XG4gIH1cbiAgLy8gdXNlIGF1dG9nZW5lcmF0ZWQgdmFsdWUgaWYgbmVjZXNzYXJ5XG4gIGlmICghcHJvcHMucXVlcnlGcmFnbWVudCkge1xuICAgIHF1ZXJ5RnJhZ21lbnQgPSBhdXRvRm9ybUZyYWdtZW50cy5xdWVyeUZyYWdtZW50O1xuICAgIHF1ZXJ5RnJhZ21lbnROYW1lID0gYXV0b0Zvcm1GcmFnbWVudHMucXVlcnlGcmFnbWVudE5hbWU7XG4gIH1cbiAgaWYgKCFwcm9wcy5tdXRhdGlvbkZyYWdtZW50KSB7XG4gICAgbXV0YXRpb25GcmFnbWVudCA9IGF1dG9Gb3JtRnJhZ21lbnRzLm11dGF0aW9uRnJhZ21lbnQ7XG4gICAgbXV0YXRpb25GcmFnbWVudE5hbWUgPSBhdXRvRm9ybUZyYWdtZW50cy5tdXRhdGlvbkZyYWdtZW50TmFtZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG11dGF0aW9uRnJhZ21lbnQ6IG11dGF0aW9uRnJhZ21lbnQgYXMgRG9jdW1lbnROb2RlLFxuICAgIG11dGF0aW9uRnJhZ21lbnROYW1lOiBtdXRhdGlvbkZyYWdtZW50TmFtZSBhcyBzdHJpbmcsXG4gICAgcXVlcnlGcmFnbWVudDogcXVlcnlGcmFnbWVudCBhcyBEb2N1bWVudE5vZGUsXG4gICAgcXVlcnlGcmFnbWVudE5hbWU6IHF1ZXJ5RnJhZ21lbnROYW1lIGFzIHN0cmluZyxcbiAgfTtcbn07XG4vLyBGb25jdGlvbm5hbCB2ZXJzaW9uIHRvIGJlIGFibGUgdG8gdXNlIGhvb2tzXG5leHBvcnQgY29uc3QgRm9ybUNvbnRhaW5lciA9IChwcm9wczogRm9ybUNvbnRhaW5lclByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBtb2RlbCxcbiAgICBkb2N1bWVudElkLFxuICAgIHNsdWcsXG4gICAgZmllbGRzLFxuICAgIGFkZEZpZWxkcyxcbiAgICBjdXJyZW50VXNlcjogY3VycmVudFVzZXJGcm9tUHJvcHMsXG4gICAgbG9hZGluZ0N1cnJlbnRVc2VyOiBsb2FkaW5nQ3VycmVudFVzZXJGcm9tUHJvcHMsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgeyBzY2hlbWEgfSA9IG1vZGVsO1xuICAvLyBpZiBhIGRvY3VtZW50IGlzIGJlaW5nIHBhc3NlZCwgdGhpcyBpcyBhbiBlZGl0IGZvcm1cbiAgY29uc3QgaXNFZGl0ID0gZG9jdW1lbnRJZCB8fCBzbHVnO1xuICBjb25zdCBzZWxlY3RvciA9IHtcbiAgICBkb2N1bWVudElkLFxuICAgIHNsdWcsXG4gIH07XG4gIGNvbnN0IGZvcm1UeXBlID0gaXNFZGl0ID8gXCJlZGl0XCIgOiBcIm5ld1wiO1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuXG4gIC8vIGdldCBxdWVyeSAmIG11dGF0aW9uIGZyYWdtZW50cyBmcm9tIHByb3BzIG9yIGVsc2UgZGVmYXVsdCB0byBzYW1lIGFzIGdlbmVyYXRlZEZyYWdtZW50XG4gIC8vcmV0dXJuIHtcbiAgLy8gIHF1ZXJ5RnJhZ21lbnQsXG4gIC8vICBtdXRhdGlvbkZyYWdtZW50LFxuICAvL307XG4gIC8vfVxuXG4gIGNvbnN0IHByZWZpeCA9IGAke21vZGVsLm5hbWV9JHtjYXBpdGFsaXplKGZvcm1UeXBlKX1gO1xuICAvLyBwcm9wcyB0byBwYXNzIG9uIHRvIGNoaWxkIGNvbXBvbmVudCAoaS5lLiA8Rm9ybSAvPilcbiAgY29uc3QgY2hpbGRQcm9wcyA9IHtcbiAgICBmb3JtVHlwZSxcbiAgICBzY2hlbWEsXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIG11dGF0aW9uRnJhZ21lbnQsXG4gICAgbXV0YXRpb25GcmFnbWVudE5hbWUsXG4gICAgcXVlcnlGcmFnbWVudCxcbiAgICBxdWVyeUZyYWdtZW50TmFtZSxcbiAgfSA9IHVzZUZyYWdtZW50cyhwcm9wcywgZm9ybVR5cGUpO1xuXG4gIC8vIG9wdGlvbnMgZm9yIHVzZUNyZWF0ZSwgdXNlVXBkYXRlIGFuZCB1c2VEZWxldGVcbiAgY29uc3QgbXV0YXRpb25PcHRpb25zID0ge1xuICAgIG1vZGVsLFxuICAgIC8vIGNvbGxlY3Rpb246IHRoaXMucHJvcHMuY29sbGVjdGlvbixcbiAgICBmcmFnbWVudDogbXV0YXRpb25GcmFnbWVudCxcbiAgICBmcmFnbWVudE5hbWU6IG11dGF0aW9uRnJhZ21lbnROYW1lLFxuICB9O1xuXG4gIGNvbnN0IHF1ZXJ5T3B0aW9uczogVXNlU2luZ2xlT3B0aW9uczxhbnk+ID0ge1xuICAgIG1vZGVsLFxuICAgIC8vIFRPRE86IHdoYXQgdGhpcyBvcHRpb24gZG9lcz9cbiAgICAvLyBxdWVyeU5hbWU6IGAke3ByZWZpeH1Gb3JtUXVlcnlgLFxuICAgIGZyYWdtZW50OiBxdWVyeUZyYWdtZW50LFxuICAgIGZyYWdtZW50TmFtZTogcXVlcnlGcmFnbWVudE5hbWUsXG4gICAgLy8gZnJhZ21lbnROYW1lP1xuICAgIGlucHV0OiB7XG4gICAgICBpZDogZG9jdW1lbnRJZCxcbiAgICAgIGVuYWJsZUNhY2hlOiBmYWxzZSxcbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgc2x1Z1xuICAgIH0sXG4gICAgcXVlcnlPcHRpb25zOiB7XG4gICAgICAvLyB3ZSBhbHdheXMgd2FudCB0byBsb2FkIGEgZnJlc2ggY29weSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgIGZldGNoUG9saWN5OiBcIm5ldHdvcmstb25seVwiIGFzIFwibmV0d29yay1vbmx5XCIsIC8vIGNhc3QgaXMgZm9yIGZpeGluZyBhbm5veWluZyBUUyBpc3N1ZS4uLiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWFwb2xsby9pc3N1ZXMvOTM2XG4gICAgICBwb2xsSW50ZXJ2YWw6IDAsIC8vIG5vIHBvbGxpbmcsIG9ubHkgbG9hZCBkYXRhIG9uY2VcbiAgICAgIHNraXA6IGZvcm1UeXBlID09PSBcIm5ld1wiLFxuICAgIH0sXG4gIH07XG4gIC8qIGRlYnVnXG4gIGNvbnNvbGUubG9nKFxuICAgIFwiTVVUXCIsXG4gICAgKG11dGF0aW9uRnJhZ21lbnQgYXMgYW55KS5sb2Muc291cmNlLmJvZHksXG4gICAgbXV0YXRpb25GcmFnbWVudE5hbWVcbiAgKTtcbiAgY29uc29sZS5sb2coXG4gICAgXCJRVUVSWVwiLFxuICAgIChxdWVyeUZyYWdtZW50IGFzIGFueSkubG9jLnNvdXJjZS5ib2R5LFxuICAgIHF1ZXJ5RnJhZ21lbnROYW1lXG4gICk7Ki9cbiAgY29uc3QgeyBkYXRhLCBkb2N1bWVudCwgbG9hZGluZywgcmVmZXRjaCB9ID0gdXNlU2luZ2xlKHF1ZXJ5T3B0aW9ucyk7XG4gIGlmIChmb3JtVHlwZSAhPT0gXCJuZXdcIikge1xuICAgIGRlYnVnRm9ybShcbiAgICAgIFwidXNlU2luZ2xlIHJlc3VsdFwiLFxuICAgICAgXCJkYXRhXCIsXG4gICAgICBkYXRhLFxuICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBcImxvYWRpbmdcIixcbiAgICAgIGxvYWRpbmdcbiAgICApO1xuICB9XG4gIC8vIFRPRE86IHBhc3MgdGhlIGNyZWF0aW9uIGZ1bmN0aW9ucyBkb3duIHRvIHRoZSBGb3JtXG4gIGNvbnN0IFtjcmVhdGVEb2N1bWVudF0gPSB1c2VDcmVhdGUobXV0YXRpb25PcHRpb25zKTtcbiAgY29uc3QgW3VwZGF0ZURvY3VtZW50XSA9IHVzZVVwZGF0ZShtdXRhdGlvbk9wdGlvbnMpO1xuICBjb25zdCBbZGVsZXRlRG9jdW1lbnRdID0gdXNlRGVsZXRlKG11dGF0aW9uT3B0aW9ucyk7XG5cbiAgY29uc3Qge1xuICAgIGN1cnJlbnRVc2VyOiBjdXJyZW50VXNlckZyb21Db250ZXh0LFxuICAgIGxvYWRpbmc6IGxvYWRpbmdDdXJyZW50VXNlckZyb21Db250ZXh0LFxuICB9ID0gdXNlVnVsY2FuQ3VycmVudFVzZXIoKTtcbiAgY29uc3Qgc2hvdWxkR2V0Q3VycmVudFVzZXJGcm9tUHJvcHMgPVxuICAgIHR5cGVvZiBjdXJyZW50VXNlckZyb21Qcm9wcyAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgY29uc3QgY3VycmVudFVzZXIgPSBzaG91bGRHZXRDdXJyZW50VXNlckZyb21Qcm9wc1xuICAgID8gY3VycmVudFVzZXJGcm9tUHJvcHNcbiAgICA6IGN1cnJlbnRVc2VyRnJvbUNvbnRleHQ7XG4gIGNvbnN0IGxvYWRpbmdDdXJyZW50VXNlciA9IHNob3VsZEdldEN1cnJlbnRVc2VyRnJvbVByb3BzXG4gICAgPyBsb2FkaW5nQ3VycmVudFVzZXJGcm9tUHJvcHNcbiAgICA6IGxvYWRpbmdDdXJyZW50VXNlckZyb21Db250ZXh0O1xuXG4gIC8vIGNhbGxiYWNrc1xuICAvKlxuICBjb25zdCBmb3JtUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBuZXdNdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayA9IGZ1bmN0aW9uIDxURGF0YSA9IE9iamVjdD4oXG4gICAgcmVzdWx0OiBTdWNjZXNzZnVsRmV0Y2hSZXN1bHQ8VERhdGE+XG4gICkge1xuICAgIGdldERvY3VtZW50RnJvbVJlc3VsdChyZXN1bHQsIFwibmV3XCIpO1xuICB9O1xuICBjb25zdCBlZGl0TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbiA8VERhdGEgPSBPYmplY3Q+KFxuICAgIHJlc3VsdDogU3VjY2Vzc2Z1bEZldGNoUmVzdWx0PFREYXRhPlxuICApIHtcbiAgICBnZXREb2N1bWVudEZyb21SZXN1bHQocmVzdWx0LCBcImVkaXRcIik7XG4gIH07XG4gICovXG5cbiAgLypcbiAgVGhlIGNyZWF0ZSBob29rIGFscmVhZHkgY3JlYXRlcyBhIGRvY3VtZW50IHByb3AgaW4gYSBtb3JlIHN0YWJsZSB3YXlcbiAgY29uc3QgZ2V0RG9jdW1lbnRGcm9tUmVzdWx0ID0gZnVuY3Rpb24gPFREYXRhID0gT2JqZWN0PihcbiAgICAvLyBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uIHZhbGlkIHJlc3VsdHNcbiAgICByZXN1bHQ6IFN1Y2Nlc3NmdWxGZXRjaFJlc3VsdDxURGF0YT4gfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gVE9ETzogcXVpdGUgcmlza3kuLi4gd2Ugc2hvdWxkIGhhdmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGUgZG9jdW1lbnRcbiAgICBsZXQgZG9jdW1lbnQgPSByZXN1bHQuZGF0YVtPYmplY3Qua2V5cyhyZXN1bHQuZGF0YSlbMF1dLmRhdGE7IC8vIGRvY3VtZW50IGlzIGFsd2F5cyBvbiBmaXJzdCBwcm9wZXJ0eVxuXG4gICAgcmV0dXJuIGRvY3VtZW50O1xuICB9OyovXG4gIC8vIGZvciBuZXcgbXV0YXRpb24sIHJ1biByZWZldGNoIGZ1bmN0aW9uIGlmIGl0IGV4aXN0c1xuICAvKlxuICBpZiAobXV0YXRpb25UeXBlID09PSBcIm5ld1wiICYmIHJlZmV0Y2gpIHJlZmV0Y2goKTtcbiAgKi9cblxuICBjb25zdCBjcmVhdGVBbmRSZXR1cm5Eb2N1bWVudCA9IGFzeW5jICh2YXJpYWJsZXM6IENyZWF0ZVZhcmlhYmxlcykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZURvY3VtZW50KHZhcmlhYmxlcyk7XG4gICAgY29uc3QgeyBlcnJvcnMsIGRvY3VtZW50IH0gPSByZXN1bHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvY3VtZW50LFxuICAgICAgZXJyb3JzLFxuICAgIH07XG4gIH07XG4gIGNvbnN0IHVwZGF0ZUFuZFJldHVybkRvY3VtZW50ID0gYXN5bmMgKHZhcmlhYmxlczogVXBkYXRlVmFyaWFibGVzKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXBkYXRlRG9jdW1lbnQodmFyaWFibGVzKTtcbiAgICBjb25zdCB7IGVycm9ycywgZG9jdW1lbnQgfSA9IHJlc3VsdDtcbiAgICByZXR1cm4ge1xuICAgICAgZG9jdW1lbnQsXG4gICAgICBlcnJvcnMsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBkZWxldGVEb2N1bWVudEFuZFJlZmV0Y2ggPSBhc3luYyAodmFyaWFibGVzOiBEZWxldGVWYXJpYWJsZXMpID0+IHtcbiAgICBhd2FpdCBkZWxldGVEb2N1bWVudCh2YXJpYWJsZXMgYXMgYW55KTtcbiAgfTtcblxuICBpZiAoaXNFZGl0ICYmIGxvYWRpbmcpIHtcbiAgICByZXR1cm4gPFZ1bGNhbkNvbXBvbmVudHMuTG9hZGluZyAvPjtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1cbiAgICAgIGRvY3VtZW50PXtkb2N1bWVudH1cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmcgfHwgbG9hZGluZ0N1cnJlbnRVc2VyfVxuICAgICAgY3JlYXRlRG9jdW1lbnQ9e2NyZWF0ZUFuZFJldHVybkRvY3VtZW50IC8qY3JlYXRlRG9jdW1lbnQqL31cbiAgICAgIHVwZGF0ZURvY3VtZW50PXt1cGRhdGVBbmRSZXR1cm5Eb2N1bWVudH1cbiAgICAgIGRlbGV0ZURvY3VtZW50PXtkZWxldGVEb2N1bWVudEFuZFJlZmV0Y2h9XG4gICAgICByZWZldGNoPXtyZWZldGNofVxuICAgICAgY3VycmVudFVzZXI9e2N1cnJlbnRVc2VyfVxuICAgICAgey4uLmNoaWxkUHJvcHN9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qXG5Gb3JtQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgLy8gbWFpbiBvcHRpb25zXG4gIGRvY3VtZW50SWQ6IFByb3BUeXBlcy5zdHJpbmcsIC8vIGlmIGEgZG9jdW1lbnQgaXMgcGFzc2VkLCB0aGlzIHdpbGwgYmUgYW4gZWRpdCBmb3JtXG4gIG11dGF0aW9uRnJhZ21lbnQ6IFByb3BUeXBlcy5vYmplY3QsXG4gIG11dGF0aW9uRnJhZ21lbnROYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8vIGdyYXBoUUxcbiAgLy8gY3JlYXRlRm9vLCBkZWxldGVGb28sIHVwZGF0ZUZvb1xuICAvLyBuZXdNdXRhdGlvbjogUHJvcFR5cGVzLmZ1bmMsIC8vIHRoZSBuZXcgbXV0YXRpb25cbiAgLy8gZWRpdE11dGF0aW9uOiBQcm9wVHlwZXMuZnVuYywgLy8gdGhlIGVkaXQgbXV0YXRpb25cbiAgLy8gcmVtb3ZlTXV0YXRpb246IFByb3BUeXBlcy5mdW5jLCAvLyB0aGUgcmVtb3ZlIG11dGF0aW9uXG5cbiAgLy8gZm9ybVxuICBwcmVmaWxsZWRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgbGF5b3V0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICBmaWVsZHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICBoaWRlRmllbGRzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgYWRkRmllbGRzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgc2hvd1JlbW92ZTogUHJvcFR5cGVzLmJvb2wsXG4gIHN1Ym1pdExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgY2FuY2VsTGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICByZXZlcnRMYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIHJlcGVhdEVycm9yczogUHJvcFR5cGVzLmJvb2wsXG4gIHdhcm5VbnNhdmVkQ2hhbmdlczogUHJvcFR5cGVzLmJvb2wsXG4gIGZvcm1Db21wb25lbnRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGl0ZW1Qcm9wZXJ0aWVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBzdWNjZXNzQ29tcG9uZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZWxlbWVudF0pLFxuICBjb250ZXh0TmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvLyBjYWxsYmFja3NcbiAgLi4uY2FsbGJhY2tQcm9wcyxcblxuICBjdXJyZW50VXNlcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2xpZW50OiBQcm9wVHlwZXMub2JqZWN0LFxufTtcblxuRm9ybUNvbnRhaW5lci5kZWZhdWx0UHJvcHMgPSB7XG4gIGxheW91dDogXCJob3Jpem9udGFsXCIsXG59O1xuKi9cblxuLypcbnJlZ2lzdGVyQ29tcG9uZW50KHtcbiAgbmFtZTogJ1NtYXJ0Rm9ybScsXG4gIGNvbXBvbmVudDogRm9ybUNvbnRhaW5lcixcbiAgaG9jczogW3dpdGhDdXJyZW50VXNlciwgd2l0aEFwb2xsbywgd2l0aFJvdXRlciwgd2l0aENvbGxlY3Rpb25Qcm9wc10sXG59KTtcbiovXG5cbmV4cG9ydCBjb25zdCBTbWFydEZvcm0gPSBGb3JtQ29udGFpbmVyO1xuXG5leHBvcnQgZGVmYXVsdCBGb3JtQ29udGFpbmVyO1xuIiwiLyoqXG4gKiBHZW5lcmF0ZSBtdXRhdGlvbiBhbmQgcXVlcnkgZnJhZ21lbnRzIGZvciBhIGZvcm0gYmFzZWQgb24gdGhlIHNjaGVtYVxuICogVE9ETzogcmVmYWN0b3IgdG8gbXV0dWFsaXplIG1vcmUgY29kZSB3aXRoIHZ1bGNhbi1jb3JlIGRlZmF1bHRGcmFnbWVudCBmdW5jdGlvbnNcbiAqIFRPRE86IG1vdmUgdG8gbGliIHdoZW4gcmVmYWN0b3JlZFxuICovXG5pbXBvcnQgX3VuaXEgZnJvbSBcImxvZGFzaC91bmlxXCI7XG5pbXBvcnQgX2ludGVyc2VjdGlvbiBmcm9tIFwibG9kYXNoL2ludGVyc2VjdGlvblwiO1xuaW1wb3J0IHsgZ3FsIH0gZnJvbSBcIkBhcG9sbG8vY2xpZW50XCI7XG5pbXBvcnQge1xuICBnZXRDcmVhdGVhYmxlRmllbGRzLFxuICBnZXRVcGRhdGVhYmxlRmllbGRzLFxuICBnZXRGcmFnbWVudEZpZWxkTmFtZXMsXG4gIC8vaXNCbGFja2JveCxcbn0gZnJvbSBcIkB2dWxjYW5qcy9zY2hlbWFcIjtcbmltcG9ydCB7XG4gIGdldEZpZWxkRnJhZ21lbnQsXG4gIFZ1bGNhbkdyYXBocWxNb2RlbCxcbiAgLy9pc0JsYWNrYm94LFxufSBmcm9tIFwiQHZ1bGNhbmpzL2dyYXBocWxcIjtcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tIFwiQHZ1bGNhbmpzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1UeXBlIH0gZnJvbSBcIi4uL3R5cGluZ3NcIjtcbmltcG9ydCBjb21wYWN0IGZyb20gXCJsb2Rhc2gvY29tcGFjdFwiO1xuLy8gIGdldEZpZWxkRnJhZ21lbnQsXG5jb25zdCBpbnRsU3VmZml4ID0gXCJfaW50bFwiO1xuXG4vLyBQb3N0c0VkaXRGb3JtUXVlcnlGcmFnbWVudC9Qb3N0c05ld0Zvcm1NdXRhdGlvbkZyYWdtZW50L2V0Yy5cbmNvbnN0IGdldEZyYWdtZW50TmFtZSA9IChcbiAgZm9ybVR5cGU6IEZvcm1UeXBlLFxuICBtdWx0aVR5cGVOYW1lOiBzdHJpbmcsXG4gIGZyYWdtZW50VHlwZTogXCJtdXRhdGlvblwiIHwgXCJxdWVyeVwiXG4pID0+XG4gIFttdWx0aVR5cGVOYW1lLCBmb3JtVHlwZSwgXCJmb3JtXCIsIGZyYWdtZW50VHlwZSwgXCJmcmFnbWVudFwiXVxuICAgIC5tYXAoY2FwaXRhbGl6ZSlcbiAgICAuam9pbihcIlwiKTtcblxuLy8gZ2V0IG1vZGlmaWFibGUgZmllbGRzIGluIHRoZSBxdWVyeSBlaXRoZXIgZm9yIHVwZGF0ZSBvciBjcmVhdGUgb3BlcmF0aW9uc1xuY29uc3QgZ2V0UXVlcnlGaWVsZE5hbWVzID0gKHsgc2NoZW1hLCBvcHRpb25zIH0pID0+IHtcbiAgY29uc3QgcXVlcnlGaWVsZHMgPVxuICAgIG9wdGlvbnMuZm9ybVR5cGUgPT09IFwibmV3XCJcbiAgICAgID8gZ2V0Q3JlYXRlYWJsZUZpZWxkcyhzY2hlbWEpXG4gICAgICA6IGdldFVwZGF0ZWFibGVGaWVsZHMoc2NoZW1hKTtcbiAgcmV0dXJuIHF1ZXJ5RmllbGRzO1xufTtcbi8vIGFkZCByZWFkYWJsZSBmaWVsZHMgdG8gbXV0YXRpb24gZmllbGRzXG5jb25zdCBnZXRNdXRhdGlvbkZpZWxkTmFtZXMgPSAoeyByZWFkYWJsZUZpZWxkTmFtZXMsIHF1ZXJ5RmllbGROYW1lcyB9KSA9PiB7XG4gIHJldHVybiBfdW5pcShxdWVyeUZpZWxkTmFtZXMuY29uY2F0KHJlYWRhYmxlRmllbGROYW1lcykpO1xufTtcblxuLypcbmNvbnN0IGdldEZpZWxkRnJhZ21lbnQgPSAoeyBzY2hlbWEsIGZpZWxkTmFtZSwgb3B0aW9ucyB9KSA9PiB7XG4gICAgbGV0IGZpZWxkRnJhZ21lbnQgPSBmaWVsZE5hbWU7XG4gICAgY29uc3QgZmllbGQgPSBzY2hlbWFbZmllbGROYW1lXTtcbiAgICBpZiAoIShmaWVsZCAmJiBmaWVsZC50eXBlKSkgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICBjb25zdCBmaWVsZFR5cGUgPSBmaWVsZC50eXBlLnNpbmdsZVR5cGU7XG4gICAgY29uc3QgZmllbGRUeXBlTmFtZSA9XG4gICAgICAgIHR5cGVvZiBmaWVsZFR5cGUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/ICdPYmplY3QnXG4gICAgICAgICAgICA6IHR5cGVvZiBmaWVsZFR5cGUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICA/IGZpZWxkVHlwZS5uYW1lXG4gICAgICAgICAgICAgICAgOiBmaWVsZFR5cGU7XG5cbiAgICBpZiAoZmllbGROYW1lLnNsaWNlKC01KSA9PT0gaW50bFN1ZmZpeCkge1xuICAgICAgICBmaWVsZEZyYWdtZW50ID0gYCR7ZmllbGROYW1lfXsgbG9jYWxlIHZhbHVlIH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaCAoZmllbGRUeXBlTmFtZSkge1xuICAgICAgICAgICAgLy8gcmVjdXJzaXZlIGNhbGwgZm9yIG5lc3RlZCBhcnJheXMgYW5kIG9iamVjdHNcbiAgICAgICAgICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICAgICAgICAgICAgaWYgKCFpc0JsYWNrYm94KGZpZWxkKSAmJiBmaWVsZFR5cGUuX3NjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEZyYWdtZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFNjaGVtYUZyYWdtZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IGZpZWxkVHlwZS5fc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUl0ZW1GaWVsZE5hbWUgPSBgJHtmaWVsZE5hbWV9LiRgO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5SXRlbUZpZWxkID0gc2NoZW1hW2FycmF5SXRlbUZpZWxkTmFtZV07XG4gICAgICAgICAgICAgICAgLy8gbm90ZTogbWFrZSBzdXJlIGZpZWxkIGhhcyBhbiBhc3NvY2lhdGVkIGFycmF5IGl0ZW0gZmllbGRcbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlJdGVtRmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hpbGQgd2lsbCBlaXRoZXIgYmUgbmF0aXZlIHZhbHVlIG9yIGEgYW4gb2JqZWN0IChmaXJzdCBjYXNlKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheUl0ZW1GaWVsZFR5cGUgPSBhcnJheUl0ZW1GaWVsZC50eXBlLnNpbmdsZVR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXlJdGVtRmllbGQuYmxhY2tib3ggJiYgYXJyYXlJdGVtRmllbGRUeXBlLl9zY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRnJhZ21lbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNjaGVtYUZyYWdtZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogYXJyYXlJdGVtRmllbGRUeXBlLl9zY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGludGwgb3IgcmV0dXJuIGZpZWxkTmFtZVxuICAgICAgICAgICAgICAgIGZpZWxkRnJhZ21lbnQgPSBmaWVsZE5hbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkRnJhZ21lbnQ7XG59O1xuKi9cblxuLy8gZ2V0IGZyYWdtZW50IGZvciBhIHdob2xlIHNjaGVtYSAocm9vdCBzY2hlbWEgb3IgbmVzdGVkIHNjaGVtYSBvZiBhbiBvYmplY3Qgb3IgYW4gYXJyYXkpXG5jb25zdCBnZXRTY2hlbWFGcmFnbWVudCA9ICh7XG4gIHNjaGVtYSxcbiAgZnJhZ21lbnROYW1lLFxuICBvcHRpb25zLFxuICBmaWVsZE5hbWVzOiBwcm92aWRlZEZpZWxkTmFtZXMsXG59KSA9PiB7XG4gIC8vIGRpZmZlcmVudGlhdGUgbXV0YXRpb24vcXVlcnkgYW5kIGNyZWF0ZS91cGRhdGUgY2FzZXNcbiAgLy8gcmVzcGVjdCBwcm92aWRlZCBmaWVsZE5hbWVzIGlmIGFueSAobmVlZGVkIGZvciB0aGUgcm9vdCBzY2hlbWEpXG4gIGNvbnN0IGZpZWxkTmFtZXMgPVxuICAgIHByb3ZpZGVkRmllbGROYW1lcyB8fFxuICAgIChvcHRpb25zLmlzTXV0YXRpb25cbiAgICAgID8gZ2V0TXV0YXRpb25GaWVsZE5hbWVzKHtcbiAgICAgICAgICBxdWVyeUZpZWxkTmFtZXM6IGdldFF1ZXJ5RmllbGROYW1lcyh7IHNjaGVtYSwgb3B0aW9ucyB9KSxcbiAgICAgICAgICByZWFkYWJsZUZpZWxkTmFtZXM6IGdldEZyYWdtZW50RmllbGROYW1lcyh7XG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICBvcHRpb25zOiB7IG9ubHlWaWV3YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KVxuICAgICAgOiBnZXRRdWVyeUZpZWxkTmFtZXMoeyBzY2hlbWEsIG9wdGlvbnMgfSkpO1xuXG4gIGNvbnN0IGNoaWxkRnJhZ21lbnRzID1cbiAgICBmaWVsZE5hbWVzLmxlbmd0aCAmJlxuICAgIGZpZWxkTmFtZXNcbiAgICAgIC5tYXAoKGZpZWxkTmFtZSkgPT5cbiAgICAgICAgZ2V0RmllbGRGcmFnbWVudCh7XG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGdldE9iamVjdEZyYWdtZW50OiBnZXRTY2hlbWFGcmFnbWVudCwgLy8gYWxsb3cgdG8gcmV1c2UgdGhlIGNvZGUgZnJvbSBkZWZhdWx0RnJhZ21lbnQgd2l0aCBhbm90aGVyIGJlaGF2aW91clxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLy8gcmVtb3ZlIGVtcHR5IHZhbHVlc1xuICAgICAgLmZpbHRlcigoZikgPT4gISFmKTtcbiAgaWYgKGNoaWxkRnJhZ21lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBgJHtmcmFnbWVudE5hbWV9IHsgJHtjaGlsZEZyYWdtZW50cy5qb2luKFwiXFxuXCIpfSB9YDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgcXVlcnkgYW5kIG11dGF0aW9uIGZyYWdtZW50cyBmb3IgZm9ybXMsIGR5bmFtaWNhbGx5ICBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgZmllbGRzXG4gKi9cbmNvbnN0IGdldEZvcm1GcmFnbWVudHMgPSAoe1xuICBmb3JtVHlwZSA9IFwibmV3XCIsXG4gIG1vZGVsLFxuICBmaWVsZHMsIC8vIHJlc3RyaWN0IG9uIGNlcnRhaW4gZmllbGRzXG4gIGFkZEZpZWxkcywgLy8gYWRkIGFkZGl0aW9uYWwgZmllbGRzIChlZyB0byBkaXNwbGF5IHN0YXRpYyBmaWVsZHMpXG59OiB7XG4gIG1vZGVsOiBWdWxjYW5HcmFwaHFsTW9kZWw7XG4gIGZvcm1UeXBlOiBGb3JtVHlwZTtcbiAgZmllbGRzPzogQXJyYXk8c3RyaW5nPjsgLy8gcmVzdHJpY3Qgb24gY2VydGFpbiBmaWVsZHNcbiAgYWRkRmllbGRzPzogQXJyYXk8c3RyaW5nPjsgLy8gYWRkIGFkZGl0aW9uYWwgZmllbGRzIChlZyB0byBkaXNwbGF5IHN0YXRpYyBmaWVsZHMpXG59KSA9PiB7XG4gIGNvbnN0IHsgc2NoZW1hLCBuYW1lLCBncmFwaHFsIH0gPSBtb2RlbDtcbiAgY29uc3QgeyB0eXBlTmFtZSwgbXVsdGlUeXBlTmFtZSB9ID0gZ3JhcGhxbDtcbiAgLy8gZ2V0IHRoZSByb290IHNjaGVtYSBmaWVsZE5hbWVzXG4gIGxldCBxdWVyeUZpZWxkTmFtZXMgPSBnZXRRdWVyeUZpZWxkTmFtZXMoeyBzY2hlbWEsIG9wdGlvbnM6IHsgZm9ybVR5cGUgfSB9KTtcbiAgbGV0IG11dGF0aW9uRmllbGROYW1lcyA9IGdldE11dGF0aW9uRmllbGROYW1lcyh7XG4gICAgcXVlcnlGaWVsZE5hbWVzLFxuICAgIHJlYWRhYmxlRmllbGROYW1lczogZ2V0RnJhZ21lbnRGaWVsZE5hbWVzKHtcbiAgICAgIHNjaGVtYSxcbiAgICAgIG9wdGlvbnM6IHsgb25seVZpZXdhYmxlOiB0cnVlIH0sXG4gICAgfSksXG4gIH0pO1xuXG4gIC8vIGlmIFwiZmllbGRzXCIgcHJvcCBpcyBzcGVjaWZpZWQsIHJlc3RyaWN0IGxpc3Qgb2YgZmllbGRzIHRvIGl0XG4gIGlmIChmaWVsZHMgJiYgZmllbGRzPy5sZW5ndGggPiAwKSB7XG4gICAgLy8gYWRkIFwiX2ludGxcIiBzdWZmaXggdG8gYWxsIGZpZWxkcyBpbiBjYXNlIHNvbWUgb2YgdGhlbSBhcmUgaW50bCBmaWVsZHNcbiAgICBjb25zdCBmaWVsZHNXaXRoSW50bFN1ZmZpeCA9IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiBgJHtmaWVsZH0ke2ludGxTdWZmaXh9YCk7XG4gICAgY29uc3QgYWxsRmllbGRzID0gWy4uLmZpZWxkcywgLi4uZmllbGRzV2l0aEludGxTdWZmaXhdO1xuICAgIHF1ZXJ5RmllbGROYW1lcyA9IF9pbnRlcnNlY3Rpb24ocXVlcnlGaWVsZE5hbWVzLCBhbGxGaWVsZHMpO1xuICAgIG11dGF0aW9uRmllbGROYW1lcyA9IF9pbnRlcnNlY3Rpb24obXV0YXRpb25GaWVsZE5hbWVzLCBhbGxGaWVsZHMpO1xuICB9XG5cbiAgLy8gYWRkIFwiYWRkRmllbGRzXCIgcHJvcCBjb250ZW50cyB0byBsaXN0IG9mIGZpZWxkc1xuICBpZiAoYWRkRmllbGRzPy5sZW5ndGgpIHtcbiAgICBxdWVyeUZpZWxkTmFtZXMgPSBxdWVyeUZpZWxkTmFtZXMuY29uY2F0KGFkZEZpZWxkcyk7XG4gICAgbXV0YXRpb25GaWVsZE5hbWVzID0gbXV0YXRpb25GaWVsZE5hbWVzLmNvbmNhdChhZGRGaWVsZHMpO1xuICB9XG5cbiAgLy8gdXNlcklkIGlzIHVzZWQgdG8gY2hlY2sgZm9yIHBlcm1pc3Npb25zLCBzbyBhZGQgaXQgdG8gZnJhZ21lbnRzIGlmIHBvc3NpYmxlXG4gIGlmIChzY2hlbWEudXNlcklkKSB7XG4gICAgcXVlcnlGaWVsZE5hbWVzLnVuc2hpZnQoXCJ1c2VySWRcIik7XG4gICAgbXV0YXRpb25GaWVsZE5hbWVzLnVuc2hpZnQoXCJ1c2VySWRcIik7XG4gIH1cblxuICBpZiAoc2NoZW1hLl9pZCkge1xuICAgIHF1ZXJ5RmllbGROYW1lcy51bnNoaWZ0KFwiX2lkXCIpO1xuICAgIG11dGF0aW9uRmllbGROYW1lcy51bnNoaWZ0KFwiX2lkXCIpO1xuICB9XG5cbiAgLy8gY2hlY2sgdW5pY2l0eSAoX2lkIGNhbiBiZSBhZGRlZCB0d2ljZSlcbiAgcXVlcnlGaWVsZE5hbWVzID0gX3VuaXEocXVlcnlGaWVsZE5hbWVzKTtcbiAgbXV0YXRpb25GaWVsZE5hbWVzID0gX3VuaXEobXV0YXRpb25GaWVsZE5hbWVzKTtcblxuICBpZiAocXVlcnlGaWVsZE5hbWVzLmxlbmd0aCA9PT0gMClcbiAgICAvLyBOT1RFOiBpbiB0aGVvcnksIHlvdSBjb3VsZCBoYXZlIG5vIHF1ZXJpYWJsZSBmaWVsZHMsIGJ1dCBtdXRhYmxlIGZpZWxkcyA9PlxuICAgIC8vIGEgZm9ybSBmb3IgZGF0YSB0aGF0IHlvdSBjYW4gY3JlYXRlIGJ1dCBjYW4gbmV2ZXIgc2VlLi4uXG4gICAgLy8gU2luY2UgdGhhdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSwgd2UgdGhyb3cgYW4gZXJyb3IgdG8gc2VjdXJlIHRoZSBlbmQgdXNlclxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2RlbCBcIiR7bW9kZWwubmFtZX1cIiBoYXMgbm8gcXVlcnlhYmxlIGZpZWxkcywgY2Fubm90IGNyZWF0ZSBhIGZvcm0gZm9yIGl0LiBQbGVhc2UgYWRkIHJlYWRhYmxlL2NyZWF0ZWFibGUvdXBkYXRlYWJsZSBmaWVsZHMgdG8gdGhlIG1vZGVsIHNjaGVtYS5gXG4gICAgKTtcbiAgaWYgKG11dGF0aW9uRmllbGROYW1lcy5sZW5ndGggPT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1vZGVsIFwiJHttb2RlbC5uYW1lfVwiIGhhcyBubyBtdXRhYmxlIGZpZWxkcywgY2Fubm90IGNyZWF0ZSBhIGZvcm0gZm9yIGl0LiBQbGVhc2UgYWRkIGNyZWF0ZWFibGUvdXBkYXRlYWJsZSBmaWVsZHMgdG8gbW9kZWwgc2NoZW1hLmBcbiAgICApO1xuXG4gIGNvbnN0IHF1ZXJ5RnJhZ21lbnROYW1lID0gZ2V0RnJhZ21lbnROYW1lKFxuICAgIGZvcm1UeXBlLFxuICAgIG11bHRpVHlwZU5hbWUsIC8vIHByZXZpb3VzbHkgY29sbGVjdGlvbk5hbWUgLy9uYW1lLFxuICAgIFwicXVlcnlcIlxuICApO1xuICAvLyBnZW5lcmF0ZSBxdWVyeSBmcmFnbWVudCBiYXNlZCBvbiB0aGUgZmllbGRzIHRoYXQgY2FuIGJlIGVkaXRlZC4gTm90ZTogYWx3YXlzIGFkZCBfaWQsIGFuZCB1c2VySWQgaWYgcG9zc2libGUuXG4gIC8vIFRPRE86IHN1cHBvcnQgbmVzdGluZ1xuICBjb25zdCBxdWVyeUZyYWdtZW50VGV4dCA9IGdldFNjaGVtYUZyYWdtZW50KHtcbiAgICBzY2hlbWEsXG4gICAgZnJhZ21lbnROYW1lOiBgZnJhZ21lbnQgJHtxdWVyeUZyYWdtZW50TmFtZX0gb24gJHt0eXBlTmFtZX1gLFxuICAgIG9wdGlvbnM6IHsgZm9ybVR5cGUsIGlzTXV0YXRpb246IGZhbHNlIH0sXG4gICAgZmllbGROYW1lczogcXVlcnlGaWVsZE5hbWVzLFxuICB9KTtcbiAgaWYgKCFxdWVyeUZyYWdtZW50VGV4dCkge1xuICAgIC8vIE5PVEU6IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBpZiB3ZSBkb24ndCBoYXZlIGFuIGVtcHR5IGFycmF5IGZvciBmaWVsZCBuYW1lc1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2RlbCAke21vZGVsLm5hbWV9IHdpdGggZmllbGRzICR7cXVlcnlGaWVsZE5hbWVzfSB5aWVsZCBhbiBlbXB0eSBxdWVyeSBmcmFnbWVudC5gXG4gICAgKTtcbiAgfVxuICBjb25zdCBnZW5lcmF0ZWRRdWVyeUZyYWdtZW50ID0gZ3FsKHF1ZXJ5RnJhZ21lbnRUZXh0KTtcblxuICBjb25zdCBtdXRhdGlvbkZyYWdtZW50TmFtZSA9IGdldEZyYWdtZW50TmFtZShcbiAgICBmb3JtVHlwZSxcbiAgICBtdWx0aVR5cGVOYW1lLCAvLyBwcmV2aW91c2x5IGNvbGxlY3Rpb25OYW1lLFxuICAgIFwibXV0YXRpb25cIlxuICApO1xuICBjb25zdCBtdXRhdGlvbkZyYWdtZW50VGV4dCA9IGdldFNjaGVtYUZyYWdtZW50KHtcbiAgICBzY2hlbWEsXG4gICAgZnJhZ21lbnROYW1lOiBgZnJhZ21lbnQgJHttdXRhdGlvbkZyYWdtZW50TmFtZX0gb24gJHt0eXBlTmFtZX1gLFxuICAgIG9wdGlvbnM6IHsgZm9ybVR5cGUsIGlzTXV0YXRpb246IHRydWUgfSxcbiAgICBmaWVsZE5hbWVzOiBtdXRhdGlvbkZpZWxkTmFtZXMsXG4gIH0pO1xuICBpZiAoIW11dGF0aW9uRnJhZ21lbnRUZXh0KSB7XG4gICAgLy8gTk9URTogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGlmIHdlIGRvbid0IGhhdmUgYW4gZW1wdHkgYXJyYXkgZm9yIGZpZWxkIG5hbWVzXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwubmFtZX0gd2l0aCBmaWVsZHMgJHttdXRhdGlvbkZpZWxkTmFtZXN9IHlpZWxkIGFuIGVtcHR5IG11dGF0aW9uIGZyYWdtZW50LmBcbiAgICApO1xuICB9XG4gIC8vIGdlbmVyYXRlIG11dGF0aW9uIGZyYWdtZW50IGJhc2VkIG9uIHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgZWRpdGVkIGFuZC9vciB2aWV3ZWQuIE5vdGU6IGFsd2F5cyBhZGQgX2lkLCBhbmQgdXNlcklkIGlmIHBvc3NpYmxlLlxuICAvLyBUT0RPOiBzdXBwb3J0IG5lc3RpbmdcbiAgY29uc3QgZ2VuZXJhdGVkTXV0YXRpb25GcmFnbWVudCA9IGdxbChtdXRhdGlvbkZyYWdtZW50VGV4dCk7XG5cbiAgLy8gaWYgYW55IGZpZWxkIHNwZWNpZmllcyBleHRyYSBxdWVyaWVzLCBhZGQgdGhlbVxuICBjb25zdCBleHRyYVF1ZXJpZXMgPSBjb21wYWN0KFxuICAgIGdldFF1ZXJ5RmllbGROYW1lcyh7IHNjaGVtYSwgb3B0aW9uczogeyBmb3JtVHlwZSB9IH0pLm1hcCgoZmllbGROYW1lKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHNjaGVtYVtmaWVsZE5hbWVdO1xuICAgICAgcmV0dXJuIGZpZWxkLnF1ZXJ5O1xuICAgIH0pXG4gICk7XG4gIC8vIGdldCBxdWVyeSAmIG11dGF0aW9uIGZyYWdtZW50cyBmcm9tIHByb3BzIG9yIGVsc2UgZGVmYXVsdCB0byBzYW1lIGFzIGdlbmVyYXRlZEZyYWdtZW50XG4gIHJldHVybiB7XG4gICAgcXVlcnlGcmFnbWVudDogZ2VuZXJhdGVkUXVlcnlGcmFnbWVudCxcbiAgICBtdXRhdGlvbkZyYWdtZW50OiBnZW5lcmF0ZWRNdXRhdGlvbkZyYWdtZW50LFxuICAgIHF1ZXJ5RnJhZ21lbnROYW1lLFxuICAgIG11dGF0aW9uRnJhZ21lbnROYW1lLFxuICAgIGV4dHJhUXVlcmllcyxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdldEZvcm1GcmFnbWVudHM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvc2NoZW1hXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkB2dWxjYW5qcy9yZWFjdC1ob29rc1wiKTsiLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5leHBvcnQgaW50ZXJmYWNlIER1bW15UHJvcHMge31cblxuZXhwb3J0IGNvbnN0IER1bW15ID0gKCkgPT4gKFxuICA8c3Bhbj5cbiAgICBZb3UgaGF2ZSBub3Qgc2V0dXAgVnVsY2FuQ29tcG9uZW50c1Byb3ZpZGVyLiBQbGVhc2UgYWRkIGZvbGxvd2luZyBjb2RlIGluXG4gICAgeW91ciBhcHA6e1wiIFwifVxuICAgIDxjb2RlPntgaW1wb3J0IHsgVnVsY2FuQ29tcG9uZW50c1Byb3ZpZGVyIH0gZnJvbSBcIkB2dWxjYW5qcy9yZWFjdC11aVwiOyBjb25zdCBZb3VyQXBwID0gPFZ1bGNhbkNvbXBvbmVudHNQcm92aWRlcj57LyogeW91ciBhcHAgKi99PC9WdWxjYW5Db21wb25lbnRzUHJvdmlkZXI+O31gfTwvY29kZT5cbiAgPC9zcGFuPlxuKTtcbiIsIi8qXG5cbk1haW4gZm9ybSBjb21wb25lbnQuXG5cblRoaXMgY29tcG9uZW50IGV4cGVjdHM6XG5cbiMjIyBBbGwgRm9ybXM6XG5cbi0gY29sbGVjdGlvblxuLSBjdXJyZW50VXNlclxuLSBjbGllbnQgKEFwb2xsbyBjbGllbnQpXG5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHJ1bkNhbGxiYWNrcywgZ2V0RXJyb3JzIH0gZnJvbSBcIkB2dWxjYW5qcy9jb3JlXCI7XG5pbXBvcnQgeyB1c2VJbnRsQ29udGV4dCB9IGZyb20gXCJAdnVsY2FuanMvaTE4blwiO1xuaW1wb3J0IHsgcmVtb3ZlUHJvcGVydHkgfSBmcm9tIFwiQHZ1bGNhbmpzL3V0aWxzXCI7XG5pbXBvcnQgX2ZpbHRlciBmcm9tIFwibG9kYXNoL2ZpbHRlclwiO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tIFwibG9kYXNoL2Nsb25lRGVlcFwiO1xuaW1wb3J0IGNvbXBhY3QgZnJvbSBcImxvZGFzaC9jb21wYWN0XCI7XG5pbXBvcnQgZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSBcImxvZGFzaC9pc09iamVjdFwiO1xuaW1wb3J0IG1hcFZhbHVlcyBmcm9tIFwibG9kYXNoL21hcFZhbHVlc1wiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJsb2Rhc2gvbWVyZ2VcIjtcbmltcG9ydCBvbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xuaW1wb3J0IG9taXRCeSBmcm9tIFwibG9kYXNoL29taXRCeVwiO1xuaW1wb3J0IHBpY2sgZnJvbSBcImxvZGFzaC9waWNrXCI7XG5pbXBvcnQgcGlja0J5IGZyb20gXCJsb2Rhc2gvcGlja0J5XCI7XG5pbXBvcnQgc2V0IGZyb20gXCJsb2Rhc2gvc2V0XCI7XG5pbXBvcnQgdW5zZXQgZnJvbSBcImxvZGFzaC91bnNldFwiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwibG9kYXNoL3VwZGF0ZVwiO1xuaW1wb3J0IHdpdGhvdXQgZnJvbSBcImxvZGFzaC93aXRob3V0XCI7XG5pbXBvcnQgaXNFbXB0eSBmcm9tIFwibG9kYXNoL2lzRW1wdHlcIjtcbmltcG9ydCB0eXBlIHsgRm9ybUxheW91dFByb3BzIH0gZnJvbSBcIi4uL0Zvcm1MYXlvdXRcIjtcbmltcG9ydCB0eXBlIHsgRm9ybVN1Ym1pdFByb3BzIH0gZnJvbSBcIi4uL0Zvcm1TdWJtaXRcIjtcblxuaW1wb3J0IHtcbiAgY29udmVydFNjaGVtYSxcbiAgZ2V0RWRpdGFibGVGaWVsZHMsXG4gIGdldEluc2VydGFibGVGaWVsZHMsXG59IGZyb20gXCIuLi9tb2R1bGVzL3NjaGVtYV91dGlsc1wiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcbmltcG9ydCB7IGdldFBhcmVudFBhdGggfSBmcm9tIFwiLi4vbW9kdWxlcy9wYXRoX3V0aWxzXCI7XG4vLyBpbXBvcnQgd2l0aENvbGxlY3Rpb25Qcm9wcyBmcm9tIFwiLi93aXRoQ29sbGVjdGlvblByb3BzXCI7XG5pbXBvcnQgeyBGb3JtQ29udGV4dCB9IGZyb20gXCIuLi9Gb3JtQ29udGV4dFwiO1xuaW1wb3J0IHsgZ2V0RmllbGRHcm91cHMsIGdldEZpZWxkTmFtZXMsIGdldExhYmVsIH0gZnJvbSBcIi4vZmllbGRzXCI7XG5pbXBvcnQgeyBpc05vdFNhbWVEb2N1bWVudCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyB1c2VXYXJuT25VbnNhdmVkIH0gZnJvbSBcIi4uL3VzZVdhcm5PblVuc2F2ZWRcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG5pbXBvcnQgdHlwZSB7IEZvcm1UeXBlIH0gZnJvbSBcIi4uL3R5cGluZ3NcIjtcbmltcG9ydCB7XG4gIENyZWF0ZURvY3VtZW50UmVzdWx0LFxuICBGb3JtUHJvcHMsXG4gIEZvcm1TdGF0ZSxcbiAgVXBkYXRlRG9jdW1lbnRSZXN1bHQsXG59IGZyb20gXCIuL3R5cGluZ3NcIjtcbmltcG9ydCB7IE11dGF0aW9uUmVzdWx0IH0gZnJvbSBcIkBhcG9sbG8vY2xpZW50XCI7XG5cbi8vIHByb3BzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYSBmb3JtIHJlc2V0XG5jb25zdCBSRVNFVF9QUk9QUyA9IFtcbiAgXCJtb2RlbFwiLFxuICAvLyBcImNvbGxlY3Rpb25cIixcbiAgLy8gXCJjb2xsZWN0aW9uTmFtZVwiLFxuICBcImRvY3VtZW50XCIsXG4gIFwic2NoZW1hXCIsXG4gIFwiY3VycmVudFVzZXJcIixcbiAgXCJmaWVsZHNcIixcbiAgXCJyZW1vdmVGaWVsZHNcIixcbiAgXCJwcmVmaWxsZWRQcm9wc1wiLCAvLyBUT0RPOiBwcmVmaWxsZWRQcm9wcyBzaG91bGQgYmUgbWVyZ2VkIGluc3RlYWQ/XG5dO1xuXG5jb25zdCBjb21wYWN0UGFyZW50ID0gKG9iamVjdCwgcGF0aCkgPT4ge1xuICBjb25zdCBwYXJlbnRQYXRoID0gZ2V0UGFyZW50UGF0aChwYXRoKTtcblxuICAvLyBub3RlOiB3ZSBvbmx5IHdhbnQgdG8gY29tcGFjdCBhcnJheXMsIG5vdCBvYmplY3RzXG4gIGNvbnN0IGNvbXBhY3RJZkFycmF5ID0gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gY29tcGFjdCh4KSA6IHgpO1xuXG4gIHVwZGF0ZShvYmplY3QsIHBhcmVudFBhdGgsIGNvbXBhY3RJZkFycmF5KTtcbn07XG5cbmNvbnN0IGdldERlZmF1bHRWYWx1ZXMgPSAoY29udmVydGVkU2NoZW1hKSA9PiB7XG4gIC8vIFRPRE86IG1ha2UgdGhpcyB3b3JrIHdpdGggbmVzdGVkIHNjaGVtYXMsIHRvb1xuICByZXR1cm4gcGlja0J5KFxuICAgIG1hcFZhbHVlcyhjb252ZXJ0ZWRTY2hlbWEsIChmaWVsZCkgPT4gZmllbGQuZGVmYXVsdFZhbHVlKSxcbiAgICAodmFsdWUpID0+IHZhbHVlXG4gICk7XG59O1xuXG5jb25zdCBjb21wYWN0T2JqZWN0ID0gKG8pID0+IG9taXRCeShvLCAoZikgPT4gZiA9PT0gbnVsbCB8fCBmID09PSB1bmRlZmluZWQpO1xuXG5jb25zdCBnZXRJbml0aWFsU3RhdGVGcm9tUHJvcHMgPSAobmV4dFByb3BzOiBGb3JtUHJvcHMpOiBGb3JtU3RhdGUgPT4ge1xuICBjb25zdCBzY2hlbWEgPSBuZXh0UHJvcHMuc2NoZW1hIHx8IG5leHRQcm9wcy5tb2RlbC5zY2hlbWE7XG4gIGNvbnN0IGNvbnZlcnRlZFNjaGVtYSA9IGNvbnZlcnRTY2hlbWEoc2NoZW1hKTtcbiAgY29uc3QgZm9ybVR5cGU6IEZvcm1UeXBlID0gbmV4dFByb3BzLmRvY3VtZW50ID8gXCJlZGl0XCIgOiBcIm5ld1wiO1xuICAvLyBmb3IgbmV3IGRvY3VtZW50IGZvcm1zLCBhZGQgZGVmYXVsdCB2YWx1ZXMgdG8gaW5pdGlhbCBkb2N1bWVudFxuICBjb25zdCBkZWZhdWx0VmFsdWVzID1cbiAgICBmb3JtVHlwZSA9PT0gXCJuZXdcIiA/IGdldERlZmF1bHRWYWx1ZXMoY29udmVydGVkU2NoZW1hKSA6IHt9O1xuICAvLyBub3RlOiB3ZSByZW1vdmUgbnVsbC91bmRlZmluZWQgdmFsdWVzIGZyb20gdGhlIGxvYWRlZCBkb2N1bWVudCBzbyB0aGV5IGRvbid0IG92ZXJ3cml0ZSBwb3NzaWJsZSBwcmVmaWxsZWRQcm9wc1xuICBjb25zdCBpbml0aWFsRG9jdW1lbnQgPSBtZXJnZShcbiAgICB7fSxcbiAgICBkZWZhdWx0VmFsdWVzLFxuICAgIG5leHRQcm9wcy5wcmVmaWxsZWRQcm9wcyxcbiAgICBjb21wYWN0T2JqZWN0KG5leHRQcm9wcy5kb2N1bWVudClcbiAgKTtcblxuICAvL2lmIG1pbkNvdW50IGlzIHNwZWNpZmllZCwgZ28gYWhlYWQgYW5kIGNyZWF0ZSBlbXB0eSBuZXN0ZWQgZG9jdW1lbnRzXG4gIE9iamVjdC5rZXlzKGNvbnZlcnRlZFNjaGVtYSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgbGV0IG1pbkNvdW50ID0gY29udmVydGVkU2NoZW1hW2tleV0ubWluQ291bnQ7XG4gICAgaWYgKG1pbkNvdW50KSB7XG4gICAgICBpbml0aWFsRG9jdW1lbnRba2V5XSA9IGluaXRpYWxEb2N1bWVudFtrZXldIHx8IFtdO1xuICAgICAgd2hpbGUgKGluaXRpYWxEb2N1bWVudFtrZXldLmxlbmd0aCA8IG1pbkNvdW50KVxuICAgICAgICBpbml0aWFsRG9jdW1lbnRba2V5XS5wdXNoKHt9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHJlbW92ZSBhbGwgaW5zdGFuY2VzIG9mIHRoZSBgX190eXBlbmFtZWAgcHJvcGVydHkgZnJvbSBkb2N1bWVudFxuICByZW1vdmVQcm9wZXJ0eShpbml0aWFsRG9jdW1lbnQsIFwiX190eXBlbmFtZVwiKTtcblxuICByZXR1cm4ge1xuICAgIGRpc2FibGVkOiBuZXh0UHJvcHMuZGlzYWJsZWQsXG4gICAgZXJyb3JzOiBbXSxcbiAgICBkZWxldGVkVmFsdWVzOiBbXSxcbiAgICBjdXJyZW50VmFsdWVzOiB7fSxcbiAgICBvcmlnaW5hbFNjaGVtYTogY29udmVydFNjaGVtYShzY2hlbWEsIHsgcmVtb3ZlQXJyYXlzOiBmYWxzZSB9KSxcbiAgICAvLyBjb252ZXJ0IFNpbXBsZVNjaGVtYSBzY2hlbWEgaW50byBKU09OIG9iamVjdFxuICAgIHNjaGVtYTogY29udmVydGVkU2NoZW1hLFxuICAgIC8vIEFsc28gc3RvcmUgYWxsIGZpZWxkIHNjaGVtYXMgKGluY2x1ZGluZyBuZXN0ZWQgc2NoZW1hcykgaW4gYSBmbGF0IHN0cnVjdHVyZVxuICAgIGZsYXRTY2hlbWE6IGNvbnZlcnRTY2hlbWEoc2NoZW1hLCB7IGZsYXR0ZW46IHRydWUgfSksXG4gICAgLy8gdGhlIGluaXRpYWwgZG9jdW1lbnQgcGFzc2VkIGFzIHByb3BzXG4gICAgaW5pdGlhbERvY3VtZW50LFxuICAgIC8vIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgZG9jdW1lbnQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGluaXRpYWwgZG9jdW1lbnRcbiAgICBjdXJyZW50RG9jdW1lbnQ6IGluaXRpYWxEb2N1bWVudCxcbiAgfTtcbn07XG5cbmNvbnN0IGdldENoaWxkcmVuUHJvcHMgPSAoXG4gIHByb3BzOiBGb3JtUHJvcHMsXG4gIHN0YXRlOiBQaWNrPEZvcm1TdGF0ZSwgXCJkaXNhYmxlZFwiIHwgXCJjdXJyZW50RG9jdW1lbnRcIj4sXG4gIG9wdGlvbnM6IHsgZm9ybVR5cGU6IEZvcm1UeXBlIH0sXG4gIC8vIFRPRE86IHRoYXQgYmVsb25ncyB0byB0aGUgY29udGV4dCBpbnN0ZWFkXG4gIGNhbGxiYWNrczogeyBkZWxldGVEb2N1bWVudDogRnVuY3Rpb24gfVxuKToge1xuICBmb3JtTGF5b3V0UHJvcHM6IEZvcm1MYXlvdXRQcm9wcztcbiAgZm9ybUdyb3VwUHJvcHM6IEZ1bmN0aW9uO1xuICBjb21tb25Qcm9wczogYW55O1xuICBmb3JtU3VibWl0UHJvcHM6IEZvcm1TdWJtaXRQcm9wcztcbn0gPT4ge1xuICBjb25zdCB7XG4gICAgY3VycmVudFVzZXIsXG4gICAgcmVwZWF0RXJyb3JzLFxuICAgIHN1Ym1pdExhYmVsLFxuICAgIGNhbmNlbExhYmVsLFxuICAgIHJldmVydExhYmVsLFxuICAgIGNhbmNlbENhbGxiYWNrLFxuICAgIHJldmVydENhbGxiYWNrLFxuICAgIGlkLFxuICAgIG1vZGVsLFxuICAgIHByZWZpbGxlZFByb3BzLFxuICAgIGl0ZW1Qcm9wZXJ0aWVzLFxuICAgIGNvbnRleHROYW1lLFxuICAgIHNob3dSZW1vdmUsXG4gICAgc2hvd0RlbGV0ZSxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7IGRpc2FibGVkLCBjdXJyZW50RG9jdW1lbnQgfSA9IHN0YXRlO1xuICBjb25zdCB7IGZvcm1UeXBlIH0gPSBvcHRpb25zO1xuICBjb25zdCB7IGRlbGV0ZURvY3VtZW50IH0gPSBjYWxsYmFja3M7XG4gIGNvbnN0IGNvbW1vblByb3BzID0ge1xuICAgIGRvY3VtZW50OiBjdXJyZW50RG9jdW1lbnQsXG4gICAgZm9ybVR5cGUsXG4gICAgY3VycmVudFVzZXIsXG4gICAgZGlzYWJsZWQsXG4gICAgcHJlZmlsbGVkUHJvcHMsXG4gICAgaXRlbVByb3BlcnRpZXMsXG4gICAgY29udGV4dE5hbWUsXG4gIH07XG5cbiAgY29uc3QgZG9jQ2xhc3NOYW1lID0gYGRvY3VtZW50LSR7Zm9ybVR5cGV9YDtcbiAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWwubmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmb3JtUHJvcHMgPSB7XG4gICAgY2xhc3NOYW1lOiBgJHtkb2NDbGFzc05hbWV9ICR7ZG9jQ2xhc3NOYW1lfS0ke21vZGVsTmFtZX1gLFxuICAgIGlkOiBpZCxcbiAgICAvLyBJdCdzIHRoZSBmb3JtIGVsZW1lbnQgcmVzcG9uc2liaWxpdHkgdG8gZ2V0IHN1Ym1pdEZvcm0gZnJvbSBjb250ZXh0XG4gICAgLy8gb25TdWJtaXQ6IHRoaXMuc3VibWl0Rm9ybShmb3JtVHlwZSksXG4gICAgLy8gVE9ETzogdXBkYXRlIHRvIHVzZVJlZlxuICAgIC8vcmVmOiAoZSkgPT4ge1xuICAgIC8vICB0aGlzLmZvcm0gPSBlO1xuICAgIC8vfSxcbiAgfTtcblxuICBjb25zdCBmb3JtR3JvdXBQcm9wcyA9IChncm91cCkgPT4gKHtcbiAgICBrZXk6IGdyb3VwLm5hbWUsXG4gICAgLi4uZ3JvdXAsXG4gICAgZ3JvdXA6IG9taXQoZ3JvdXAsIFtcImZpZWxkc1wiXSksXG4gICAgLi4uY29tbW9uUHJvcHMsXG4gIH0pO1xuXG4gIGNvbnN0IGZvcm1TdWJtaXRQcm9wcyA9IHtcbiAgICBtb2RlbCxcbiAgICBjdXJyZW50VXNlcixcbiAgICBzdWJtaXRMYWJlbCxcbiAgICBjYW5jZWxMYWJlbCxcbiAgICByZXZlcnRMYWJlbCxcbiAgICBjYW5jZWxDYWxsYmFjayxcbiAgICByZXZlcnRDYWxsYmFjayxcbiAgICBkb2N1bWVudDogY3VycmVudERvY3VtZW50LFxuICAgIC8vIFRPRE86IHNob3VsZCBwcm9iYWJseSBiZSBwYXNzZWQgdGhyb3VnaCBjb250ZXh0XG4gICAgZGVsZXRlRG9jdW1lbnQ6XG4gICAgICAoZm9ybVR5cGUgPT09IFwiZWRpdFwiICYmIHNob3dSZW1vdmUgJiYgc2hvd0RlbGV0ZSAmJiBkZWxldGVEb2N1bWVudCkgfHxcbiAgICAgIG51bGwsXG4gIH07XG5cbiAgY29uc3QgZm9ybUxheW91dFByb3BzID0ge1xuICAgIGZvcm1Qcm9wczogZm9ybVByb3BzLFxuICAgIHJlcGVhdEVycm9yczogcmVwZWF0RXJyb3JzLFxuICAgIHN1Ym1pdFByb3BzOiBmb3JtU3VibWl0UHJvcHMsXG4gICAgY29tbW9uUHJvcHMsXG4gIH07XG4gIHJldHVybiB7XG4gICAgY29tbW9uUHJvcHMsXG4gICAgZm9ybVN1Ym1pdFByb3BzLFxuICAgIGZvcm1Hcm91cFByb3BzLFxuICAgIGZvcm1MYXlvdXRQcm9wcyxcbiAgfTtcbn07XG5cbi8vIGNvbXBvbmVudCBmb3JtIHVudGlsIHdlIGdvIHN0YXRlbGVzc1xuY29uc3QgRm9ybVdhcm5VbnNhdmVkID0gKHtcbiAgaXNDaGFuZ2VkLFxuICB3YXJuVW5zYXZlZENoYW5nZXMsXG4gIGNoaWxkcmVuLFxufToge1xuICBpc0NoYW5nZWQ6IGJvb2xlYW47XG4gIHdhcm5VbnNhdmVkQ2hhbmdlcz86IGJvb2xlYW47XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59KSA9PiB7XG4gIHVzZVdhcm5PblVuc2F2ZWQoe1xuICAgIGlzQ2hhbmdlZCxcbiAgICB3YXJuVW5zYXZlZENoYW5nZXMsXG4gIH0pO1xuICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xufTtcblxuLypcblxuICBMaWtlIGdldERvY3VtZW50LCBidXQgY3Jvc3MtcmVmZXJlbmNlIHdpdGggZ2V0RmllbGROYW1lcygpXG4gIHRvIG9ubHkgcmV0dXJuIGZpZWxkcyB0aGF0IGFjdHVhbGx5IG5lZWQgdG8gYmUgc3VibWl0dGVkXG5cbiAgQWxzbyByZW1vdmUgYW55IGRlbGV0ZWQgdmFsdWVzLlxuXG4gICovXG5jb25zdCBnZXREYXRhID0gKFxuICBjdXN0b21BcmdzLFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiY3VycmVudERvY3VtZW50XCIgfCBcImRlbGV0ZWRWYWx1ZXNcIj4sXG4gIC8vIHByZXZpb3VzbHkgZnJvbSBcInRoaXNcIiBvYmplY3RcbiAgeyBzdWJtaXRGb3JtQ2FsbGJhY2tzLCBmb3JtIH06IGFueVxuKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERvY3VtZW50IH0gPSBzdGF0ZTtcbiAgY29uc3QgeyBtb2RlbCwgcHJlZmlsbGVkUHJvcHMgfSA9IHByb3BzO1xuICAvLyB3ZSB3YW50IHRvIGtlZXAgcHJlZmlsbGVkIGRhdGEgZXZlbiBmb3IgaGlkZGVuL3JlbW92ZWQgZmllbGRzXG4gIGxldCBkYXRhID0gcHJlZmlsbGVkUHJvcHMgfHwge307XG5cbiAgLy8gb21pdCBwcmVmaWxsZWQgcHJvcHMgZm9yIG5lc3RlZCBmaWVsZHNcbiAgZGF0YSA9IG9taXRCeShkYXRhLCAodmFsdWUsIGtleSkgPT4ga2V5LmVuZHNXaXRoKFwiLiRcIikpO1xuXG4gIGNvbnN0IGFyZ3MgPSB7XG4gICAgc2NoZW1hOiBtb2RlbC5zY2hlbWEsXG4gICAgZXhjbHVkZVJlbW92ZWRGaWVsZHM6IGZhbHNlLFxuICAgIGV4Y2x1ZGVIaWRkZW5GaWVsZHM6IGZhbHNlLFxuICAgIHJlcGxhY2VJbnRsRmllbGRzOiB0cnVlLFxuICAgIGFkZEV4dHJhRmllbGRzOiBmYWxzZSxcbiAgICAuLi5jdXN0b21BcmdzLFxuICB9O1xuXG4gIC8vIG9ubHkga2VlcCByZWxldmFudCBmaWVsZHNcbiAgLy8gZm9yIGludGwgZmllbGRzLCBtYWtlIHN1cmUgd2UgbG9vayBpbiBmb29faW50bCBhbmQgbm90IGZvb1xuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZE5hbWVzKHByb3BzLCBjdXJyZW50RG9jdW1lbnQsIGFyZ3MpO1xuICBkYXRhID0geyAuLi5kYXRhLCAuLi5waWNrKGN1cnJlbnREb2N1bWVudCwgLi4uZmllbGRzKSB9O1xuXG4gIC8vIGNvbXBhY3QgZGVsZXRlZCB2YWx1ZXNcbiAgc3RhdGUuZGVsZXRlZFZhbHVlcy5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgaWYgKHBhdGguaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAvKlxuXG4gICAgICAgIElmIGRlbGV0ZWQgZmllbGQgaXMgYSBuZXN0ZWQgZmllbGQsIG5lc3RlZCBhcnJheSwgb3IgbmVzdGVkIGFycmF5IGl0ZW0sIHRyeSB0byBjb21wYWN0IGl0cyBwYXJlbnQgYXJyYXlcblxuICAgICAgICAtIE5lc3RlZCBmaWVsZDogJ2FkZHJlc3MuY2l0eSdcbiAgICAgICAgLSBOZXN0ZWQgYXJyYXk6ICdhZGRyZXNzZXMuMSdcbiAgICAgICAgLSBOZXN0ZWQgYXJyYXkgaXRlbTogJ2FkZHJlc3Nlcy4xLmNpdHknXG5cbiAgICAgICAgKi9cbiAgICAgIGNvbXBhY3RQYXJlbnQoZGF0YSwgcGF0aCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBydW4gZGF0YSBvYmplY3QgdGhyb3VnaCBzdWJtaXRGb3JtIGNhbGxiYWNrc1xuICBkYXRhID0gcnVuQ2FsbGJhY2tzKHtcbiAgICBjYWxsYmFja3M6IHN1Ym1pdEZvcm1DYWxsYmFja3MsXG4gICAgaXRlcmF0b3I6IGRhdGEsXG4gICAgYXJnczogW1xuICAgICAge1xuICAgICAgICAvKmZvcm06IHRoaXMqL1xuICAgICAgfSxcbiAgICBdLFxuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBGb3JtID0gKHByb3BzOiBGb3JtUHJvcHMpID0+IHtcbiAgY29uc3QgeyBpbml0Q2FsbGJhY2ssIGNyZWF0ZURvY3VtZW50LCB1cGRhdGVEb2N1bWVudCwgZGVsZXRlRG9jdW1lbnQgfSA9XG4gICAgcHJvcHM7XG4gIGNvbnN0IGluaXRpYWxTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZUZyb21Qcm9wcyhwcm9wcyk7XG4gIGNvbnN0IHsgc2NoZW1hLCBvcmlnaW5hbFNjaGVtYSwgZmxhdFNjaGVtYSwgaW5pdGlhbERvY3VtZW50IH0gPSBpbml0aWFsU3RhdGU7XG4gIGNvbnN0IGlzRmlyc3RSZW5kZXIgPSB1c2VSZWYodHJ1ZSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzRmlyc3RSZW5kZXIuY3VycmVudCkge1xuICAgICAgaXNGaXJzdFJlbmRlci5jdXJyZW50ID0gZmFsc2U7IC8vIHRvZ2dsZSBmbGFnIGFmdGVyIGZpcnN0IHJlbmRlci9tb3VudGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5pdENhbGxiYWNrKSBpbml0Q2FsbGJhY2soaW5pdGlhbFN0YXRlLmN1cnJlbnREb2N1bWVudCk7XG4gIH0sIFtpbml0Q2FsbGJhY2tdKTtcbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIGxheW91dDogXCJob3Jpem9udGFsXCIsXG4gICAgcHJlZmlsbGVkUHJvcHM6IHt9LFxuICAgIHJlcGVhdEVycm9yczogZmFsc2UsXG4gICAgc2hvd1JlbW92ZTogdHJ1ZSxcbiAgICBzaG93RGVsZXRlOiB0cnVlLFxuICB9O1xuICBjb25zdCBhbGxQcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCAuLi5wcm9wcyB9O1xuICBjb25zdCBkZWZhdWx0VmFsdWVzID0ge307XG4gIGNvbnN0IHN1Ym1pdEZvcm1DYWxsYmFja3M6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xuICBjb25zdCBzdWNjZXNzRm9ybUNhbGxiYWNrczogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gIGNvbnN0IGZhaWx1cmVGb3JtQ2FsbGJhY2tzOiBBcnJheTxGdW5jdGlvbj4gPSBbXTtcbiAgY29uc3QgaW50bCA9IHVzZUludGxDb250ZXh0KCk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXJyb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvKlxuXG4gIEFkZCBlcnJvciB0byBmb3JtIHN0YXRlXG5cbiAgRXJyb3JzIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAtIGlkOiB1c2VkIGFzIGFuIGludGVybmF0aW9uYWxpemF0aW9uIGtleSwgZm9yIGV4YW1wbGUgYGVycm9ycy5yZXF1aXJlZGBcbiAgICAtIHBhdGg6IGZvciBmaWVsZC1zcGVjaWZpYyBlcnJvcnMsIHRoZSBwYXRoIG9mIHRoZSBmaWVsZCB3aXRoIHRoZSBpc3N1ZVxuICAgIC0gcHJvcGVydGllczogYWRkaXRpb25hbCBkYXRhLiBXaWxsIGJlIHBhc3NlZCB0byB2dWxjYW4taTE4biBhcyB2YWx1ZXNcbiAgICAtIG1lc3NhZ2U6IGlmIGlkIGNhbm5vdCBiZSB1c2VkIGFzIGk4MW4ga2V5LCBtZXNzYWdlIHdpbGwgYmUgdXNlZFxuXG4gICovXG4gIGNvbnN0IFtlcnJvcnMsIHNldEVycm9yc10gPSB1c2VTdGF0ZTxBcnJheTxhbnk+PihbXSk7XG4gIGNvbnN0IHRocm93RXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICBsZXQgZm9ybUVycm9ycyA9IGdldEVycm9ycyhlcnJvcik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKGZvcm1FcnJvcnMpO1xuXG4gICAgLy8gYWRkIGVycm9yKHMpIHRvIHN0YXRlXG4gICAgc2V0RXJyb3JzKChwcmV2RXJyb3JzKSA9PiBbLi4ucHJldkVycm9ycywgLi4uZm9ybUVycm9yc10pO1xuICB9O1xuXG4gIC8qXG5cbiAgQ2xlYXIgZXJyb3JzIGZvciBhIGZpZWxkXG5cbiAgKi9cbiAgY29uc3QgY2xlYXJGaWVsZEVycm9ycyA9IChwYXRoKSA9PiB7XG4gICAgc2V0RXJyb3JzKChwcmV2RXJyb3JzKSA9PlxuICAgICAgcHJldkVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiBlcnJvci5wYXRoICE9PSBwYXRoKVxuICAgICk7XG4gIH07XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICBjb25zdCBbZGVsZXRlZFZhbHVlcywgc2V0RGVsZXRlZFZhbHVlc10gPSB1c2VTdGF0ZTxBcnJheTxhbnk+PihbXSk7XG5cbiAgLy8gYWRkIHNvbWV0aGluZyB0byBkZWxldGVkIHZhbHVlc1xuICBjb25zdCBhZGRUb0RlbGV0ZWRWYWx1ZXMgPSAobmFtZSkgPT4ge1xuICAgIHNldERlbGV0ZWRWYWx1ZXMoKHByZXZEZWxldGVkVmFsdWVzKSA9PiBbLi4ucHJldkRlbGV0ZWRWYWx1ZXMsIG5hbWVdKTtcbiAgfTtcblxuICBpbnRlcmZhY2UgQ2FsbGJhY2tzIHtcbiAgICBzdWJtaXRGb3JtQ2FsbGJhY2tzOiBBcnJheTxhbnk+O1xuICAgIHN1Y2Nlc3NGb3JtQ2FsbGJhY2tzOiBBcnJheTxhbnk+O1xuICAgIGZhaWx1cmVGb3JtQ2FsbGJhY2tzOiBBcnJheTxhbnk+O1xuICB9XG4gIGNvbnN0IFtjYWxsYmFja3MsIHNldENhbGxiYWNrc10gPSB1c2VTdGF0ZTxDYWxsYmFja3M+KHtcbiAgICBzdWJtaXRGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgICBzdWNjZXNzRm9ybUNhbGxiYWNrczogW10sXG4gICAgZmFpbHVyZUZvcm1DYWxsYmFja3M6IFtdLFxuICB9KTtcbiAgLy8gYWRkIGEgY2FsbGJhY2sgdG8gdGhlIGZvcm0gc3VibWlzc2lvblxuICBjb25zdCBhZGRUb1N1Ym1pdEZvcm0gPSAoY2FsbGJhY2spID0+IHtcbiAgICBzZXRDYWxsYmFja3MoKGNicykgPT4gKHtcbiAgICAgIC4uLmNicyxcbiAgICAgIC8vIHN1Ym1pdEZvcm1DYWxsYmFja3M6IFsuLi5jYnMuc3VibWl0Rm9ybUNhbGxiYWNrcywgY2FsbGJhY2tdLFxuICAgIH0pKTtcbiAgfTtcblxuICAvLyBhZGQgYSBjYWxsYmFjayB0byBmb3JtIHN1Ym1pc3Npb24gc3VjY2Vzc1xuICBjb25zdCBhZGRUb1N1Y2Nlc3NGb3JtID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgc2V0Q2FsbGJhY2tzKChjYnMpID0+ICh7XG4gICAgICAuLi5jYnMsXG4gICAgICBzdWNjZXNzRm9ybUNhbGxiYWNrczogWy4uLmNicy5zdWNjZXNzRm9ybUNhbGxiYWNrcywgY2FsbGJhY2tdLFxuICAgIH0pKTtcbiAgfTtcblxuICAvLyBhZGQgYSBjYWxsYmFjayB0byBmb3JtIHN1Ym1pc3Npb24gZmFpbHVyZVxuICBjb25zdCBhZGRUb0ZhaWx1cmVGb3JtID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgc2V0Q2FsbGJhY2tzKChjYnMpID0+ICh7XG4gICAgICAuLi5jYnMsXG4gICAgICBmYWlsdXJlRm9ybUNhbGxiYWNrczogWy4uLmNicy5mYWlsdXJlRm9ybUNhbGxiYWNrcywgY2FsbGJhY2tdLFxuICAgIH0pKTtcbiAgfTtcblxuICBjb25zdCBjbGVhckZvcm1DYWxsYmFja3MgPSAoKSA9PiB7XG4gICAgc2V0Q2FsbGJhY2tzKHtcbiAgICAgIHN1Ym1pdEZvcm1DYWxsYmFja3M6IFtdLFxuICAgICAgc3VjY2Vzc0Zvcm1DYWxsYmFja3M6IFtdLFxuICAgICAgZmFpbHVyZUZvcm1DYWxsYmFja3M6IFtdLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qXG4gIHNldEZvcm1TdGF0ZSA9IChmbikgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoZm4pO1xuICB9O1xuICAqL1xuXG4gIGNvbnN0IFtjdXJyZW50VmFsdWVzLCBzZXRDdXJyZW50VmFsdWVzXSA9IHVzZVN0YXRlPE9iamVjdD4oe30pO1xuXG4gIGNvbnN0IHN1Ym1pdEZvcm1Db250ZXh0ID0gKGZvcm1UeXBlOiBGb3JtVHlwZSkgPT4gKGV2ZW50IC8qbmV3VmFsdWVzKi8pID0+IHtcbiAgICAvKlxuICAgIFRPRE86IHByZXZpb3VzbHkgdGhpcyBjYWxsYmFjayB3YXMgdXBkYXRpbmcgdGhlIGN1cnJlbnQgdmFsdWVzIHdpdGggbmV3IHZhbHVlcyBhZnRlciB0aGlzIGNhbGxcbiAgICBOZWVkIHRvIGNoZWNrIGhvdyB0aGlzIHdvcmtlZCBpbiBWdWxjYW4gaW5pdGlhbGx5XG4gICAgc2V0Q3VycmVudFZhbHVlcygocHJldkN1cnJlbnRWYWx1ZXMpID0+ICh7XG4gICAgICAuLi5wcmV2Q3VycmVudFZhbHVlcyxcbiAgICAgIC4uLm5ld1ZhbHVlcyxcbiAgICB9KSk7XG4gICAgKi9cbiAgICAvLyBUT0RPOiBwcmV2aW91c2x5LCB0aGlzIHdhcyB1c2luZyBhIGNhbGxiYWNrIGZyb20gc2V0Q3VycmVudFZhbHVlc1xuICAgIC8vIHRoaXMgbmVlZHMgdG8gYmUgcmVhcmNoaXRlY3R1cmVkIHRvIHdvcmsgd2l0aG91dCwgd2lsbCBuZWVkIHNvbWUgY2hlY2tcbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjI0NzQzMy9ob3ctdG8tdXNlLXNldHN0YXRlLWNhbGxiYWNrLW9uLXJlYWN0LWhvb2tzXG4gICAgc3VibWl0Rm9ybShmb3JtVHlwZSkoZXZlbnQpO1xuICB9O1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLypcblxuICBXaGVuIHByb3BzIGNoYW5nZSwgcmVpbml0aWFsaXplIHRoZSBmb3JtICBzdGF0ZVxuICBUcmlnZ2VyZWQgb25seSBmb3IgZGF0YSByZWxhdGVkIHByb3BzIChjb2xsZWN0aW9uLCBkb2N1bWVudCwgY3VycmVudFVzZXIgZXRjLilcblxuICBAc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvYmxvZy8yMDE4LzA2LzA3L3lvdS1wcm9iYWJseS1kb250LW5lZWQtZGVyaXZlZC1zdGF0ZS5odG1sXG5cbiAgKi9cbiAgLypcbiAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgY29uc3QgbmVlZFJlc2V0ID0gISFSRVNFVF9QUk9QUy5maW5kKFxuICAgICAgKHByb3ApID0+ICFpc0VxdWFsKHRoaXMucHJvcHNbcHJvcF0sIG5leHRQcm9wc1twcm9wXSlcbiAgICApO1xuICAgIGlmIChuZWVkUmVzZXQpIHtcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0gZ2V0SW5pdGlhbFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcyk7XG4gICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgIGlmIChuZXh0UHJvcHMuaW5pdENhbGxiYWNrKVxuICAgICAgICBuZXh0UHJvcHMuaW5pdENhbGxiYWNrKG5ld1N0YXRlLmN1cnJlbnREb2N1bWVudCk7XG4gICAgfVxuICB9Ki9cblxuICBjb25zdCBbY3VycmVudERvY3VtZW50LCBzZXRDdXJyZW50RG9jdW1lbnRdID1cbiAgICB1c2VTdGF0ZTx7XG4gICAgICB0aXRsZT86IHN0cmluZztcbiAgICAgIF9pZD86IHN0cmluZztcbiAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgfT4oaW5pdGlhbERvY3VtZW50KTtcblxuICAvKlxuXG4gIE1hbnVhbGx5IHVwZGF0ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2Ygb25lIG9yIG1vcmUgZmllbGRzKGkuZS4gb24gY2hhbmdlIG9yIGJsdXIpLlxuXG4gICovXG4gIGNvbnN0IHVwZGF0ZUN1cnJlbnRWYWx1ZXMgPSAobmV3VmFsdWVzLCBvcHRpb25zOiB7IG1vZGU/OiBzdHJpbmcgfSA9IHt9KSA9PiB7XG4gICAgLy8gZGVmYXVsdCB0byBvdmVyd3JpdGluZyBvbGQgdmFsdWUgd2l0aCBuZXdcbiAgICBjb25zdCB7IG1vZGUgPSBcIm92ZXJ3cml0ZVwiIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgY2hhbmdlQ2FsbGJhY2sgfSA9IHByb3BzO1xuXG4gICAgLy8ga2VlcCB0aGUgcHJldmlvdXMgb25lcyBhbmQgZXh0ZW5kICh3aXRoIHBvc3NpYmxlIHJlcGxhY2VtZW50KSB3aXRoIG5ldyBvbmVzXG4gICAgLy8ga2VlcCBvbmx5IHRoZSByZWxldmFudCBwcm9wZXJ0aWVzXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICBjdXJyZW50VmFsdWVzOiBjbG9uZURlZXAoY3VycmVudFZhbHVlcyksXG4gICAgICBjdXJyZW50RG9jdW1lbnQ6IGNsb25lRGVlcChjdXJyZW50RG9jdW1lbnQpLFxuICAgICAgZGVsZXRlZFZhbHVlczogY2xvbmVEZWVwKGRlbGV0ZWRWYWx1ZXMpLFxuICAgIH07XG5cbiAgICBPYmplY3Qua2V5cyhuZXdWYWx1ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IGtleTtcbiAgICAgIGxldCB2YWx1ZSA9IG5ld1ZhbHVlc1trZXldO1xuXG4gICAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgICAvLyBkZWxldGUgdmFsdWVcbiAgICAgICAgdW5zZXQobmV3U3RhdGUuY3VycmVudFZhbHVlcywgcGF0aCk7XG4gICAgICAgIHNldChuZXdTdGF0ZS5jdXJyZW50RG9jdW1lbnQsIHBhdGgsIG51bGwpO1xuICAgICAgICBuZXdTdGF0ZS5kZWxldGVkVmFsdWVzID0gWy4uLm5ld1N0YXRlLmRlbGV0ZWRWYWx1ZXMsIHBhdGhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gMS4gdXBkYXRlIGN1cnJlbnRWYWx1ZXNcbiAgICAgICAgc2V0KG5ld1N0YXRlLmN1cnJlbnRWYWx1ZXMsIHBhdGgsIHZhbHVlKTtcblxuICAgICAgICAvLyAyLiB1cGRhdGUgY3VycmVudERvY3VtZW50XG4gICAgICAgIC8vIEZvciBhcnJheXMgYW5kIG9iamVjdHMsIGdpdmUgb3B0aW9uIHRvIG1lcmdlIGluc3RlYWQgb2Ygb3ZlcndyaXRlXG4gICAgICAgIGlmIChtb2RlID09PSBcIm1lcmdlXCIgJiYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSkpIHtcbiAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGdldChuZXdTdGF0ZS5jdXJyZW50RG9jdW1lbnQsIHBhdGgpO1xuICAgICAgICAgIHNldChuZXdTdGF0ZS5jdXJyZW50RG9jdW1lbnQsIHBhdGgsIG1lcmdlKG9sZFZhbHVlLCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldChuZXdTdGF0ZS5jdXJyZW50RG9jdW1lbnQsIHBhdGgsIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIGluIGNhc2UgdmFsdWUgaGFkIHByZXZpb3VzbHkgYmVlbiBkZWxldGVkLCBcInVuZGVsZXRlXCIgaXRcbiAgICAgICAgbmV3U3RhdGUuZGVsZXRlZFZhbHVlcyA9IHdpdGhvdXQobmV3U3RhdGUuZGVsZXRlZFZhbHVlcywgcGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGNoYW5nZUNhbGxiYWNrKSBjaGFuZ2VDYWxsYmFjayhuZXdTdGF0ZS5jdXJyZW50RG9jdW1lbnQpO1xuXG4gICAgLy8gVE9ETzogcHJlZmVyICBhIHJlZHVjZXJcbiAgICBzZXRDdXJyZW50VmFsdWVzKG5ld1N0YXRlLmN1cnJlbnRWYWx1ZXMpO1xuICAgIHNldEN1cnJlbnREb2N1bWVudChuZXdTdGF0ZS5jdXJyZW50RG9jdW1lbnQpO1xuICAgIHNldERlbGV0ZWRWYWx1ZXMobmV3U3RhdGUuZGVsZXRlZFZhbHVlcyk7XG4gIH07XG5cbiAgLypcblxuICBSZWZldGNoIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBkYXRhYmFzZSAoaW4gY2FzZSBpdCB3YXMgdXBkYXRlZCBieSBhbm90aGVyIHByb2Nlc3Mgb3IgdG8gcmVzZXQgdGhlIGZvcm0pXG5cbiAgKi9cbiAgY29uc3QgcmVmZXRjaEZvcm0gPSAoKSA9PiB7XG4gICAgaWYgKHByb3BzLnJlZmV0Y2gpIHtcbiAgICAgIHByb3BzLnJlZmV0Y2goKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgW2Rpc2FibGVkLCBzZXREaXNhYmxlZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7IC8vIFRPRE9cbiAgY29uc3QgW3N1Y2Nlc3MsIHNldFN1Y2Nlc3NdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOyAvLyBUT0RPXG4gIC8qKlxuICAgKiBDbGVhcnMgZm9ybSBlcnJvcnMgYW5kIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGUgQ2xlYXIgZm9ybVxuICAgKiAgLy8gZm9ybSB3aWxsIGJlIGZ1bGx5IGVtcHRpZWQsIHdpdGggZXhjZXB0aW9uIG9mIHByZWZpbGxlZCB2YWx1ZXNcbiAgICogIGNsZWFyRm9ybSh7IGRvY3VtZW50OiB7fSB9KTtcbiAgICpcbiAgICogQGV4YW1wbGUgUmVzZXQvcmV2ZXJ0IGZvcm1cbiAgICogIC8vIGZvcm0gd2lsbCBiZSByZXZlcnRlZCB0byBpdHMgaW5pdGlhbCBzdGF0ZVxuICAgKiAgY2xlYXJGb3JtKCk7XG4gICAqXG4gICAqIEBleGFtcGxlIENsZWFyIHdpdGggbmV3IHZhbHVlc1xuICAgKiAgLy8gZm9ybSB3aWxsIGJlIGNsZWFyZWQgYnV0IGluaXRpYWxpemVkIHdpdGggdGhlIG5ldyBkb2N1bWVudFxuICAgKiAgY29uc3QgZG9jdW1lbnQgPSB7XG4gICAqICAgIC8vIC4uLiBzb21lIHZhbHVlc1xuICAgKiAgfTtcbiAgICogIGNsZWFyRm9ybSh7IGRvY3VtZW50IH0pO1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zLmRvY3VtZW50XG4gICAqICBEb2N1bWVudCB0byB1c2UgYXMgbmV3IGluaXRpYWwgZG9jdW1lbnQgd2hlbiB2YWx1ZXMgYXJlIGNsZWFyZWQgaW5zdGVhZCBvZlxuICAgKiAgdGhlIGV4aXN0aW5nIG9uZS4gTm90ZSB0aGF0IHByZWZpbGxlZCBwcm9wcyB3aWxsIGJlIG1lcmdlZFxuICAgKi9cbiAgY29uc3QgY2xlYXJGb3JtID0gKG9wdGlvbnM6IHsgZG9jdW1lbnQ/OiBhbnkgfSA9IHt9KSA9PiB7XG4gICAgY29uc3QgeyBkb2N1bWVudDogb3B0aW9uc0RvY3VtZW50IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGRvY3VtZW50ID0gb3B0aW9uc0RvY3VtZW50XG4gICAgICA/IG1lcmdlKHt9LCBwcm9wcy5wcmVmaWxsZWRQcm9wcywgb3B0aW9uc0RvY3VtZW50KVxuICAgICAgOiBudWxsO1xuICAgIC8vIFRPRE86IHByZWZlciBhIHJlZHVjZXJcbiAgICBzZXRFcnJvcnMoW10pO1xuICAgIHNldEN1cnJlbnRWYWx1ZXMoe30pO1xuICAgIHNldERlbGV0ZWRWYWx1ZXMoW10pO1xuICAgIHNldEN1cnJlbnREb2N1bWVudChkb2N1bWVudCB8fCBpbml0aWFsRG9jdW1lbnQpO1xuICAgIC8vIHNldEluaXRpYWxEb2N1bWVudChkb2N1bWVudCB8fCBpbml0aWFsRG9jdW1lbnQpO1xuICAgIHNldERpc2FibGVkKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBuZXdNdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayA9IGZ1bmN0aW9uIDxUTW9kZWwgPSBPYmplY3Q+KFxuICAgIHJlc3VsdDogQ3JlYXRlRG9jdW1lbnRSZXN1bHQ8VE1vZGVsPlxuICApIHtcbiAgICBtdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayhyZXN1bHQsIFwibmV3XCIpO1xuICB9O1xuXG4gIGNvbnN0IGVkaXRNdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayA9IGZ1bmN0aW9uIDxUTW9kZWwgPSBPYmplY3Q+KFxuICAgIHJlc3VsdDogVXBkYXRlRG9jdW1lbnRSZXN1bHQ8VE1vZGVsPlxuICApIHtcbiAgICBtdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayhyZXN1bHQsIFwiZWRpdFwiKTtcbiAgfTtcblxuICBjb25zdCBmb3JtUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBtdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayA9IGZ1bmN0aW9uIDxUTW9kZWwgPSBPYmplY3Q+KFxuICAgIC8vIG11c3QgYmUgY2FsbGVkIG9ubHkgb24gdmFsaWQgcmVzdWx0c1xuICAgIHJlc3VsdDogQ3JlYXRlRG9jdW1lbnRSZXN1bHQ8VE1vZGVsPixcbiAgICBtdXRhdGlvblR5cGU6IEZvcm1UeXBlXG4gICkge1xuICAgIC8vIFRPRE86IHVzZSBhIHJlZHVjZXJcbiAgICBzZXREaXNhYmxlZChmYWxzZSk7XG4gICAgc2V0U3VjY2Vzcyh0cnVlKTtcbiAgICAvLyBmb3IgbmV3IG11dGF0aW9uLCBydW4gcmVmZXRjaCBmdW5jdGlvbiBpZiBpdCBleGlzdHNcbiAgICAvLyBUT0RPOiB0aGUgY3JlYXRlIG11dGF0aW9uIHNob3VsZCBhbHJlYWR5IHJldHVybiB0aGUgZnJlc2hlc3QgdmFsdWUsIGRvIHdlIHJlYWxseSBuZWVkIHRoYXQ/XG4gICAgLy8gaW5zdGVhZCB3ZSBtaWdodCB3YW50IHRvIHVwZGF0ZSBjdXJyZW50UmVzdWx0IHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgY3JlYXRpb25cbiAgICBpZiAobXV0YXRpb25UeXBlID09PSBcIm5ld1wiKSByZWZldGNoRm9ybSgpO1xuICAgIGxldCB7IGRvY3VtZW50IH0gPSByZXN1bHQ7XG5cbiAgICAvLyBjYWxsIHRoZSBjbGVhciBmb3JtIG1ldGhvZCAoaS5lLiB0cmlnZ2VyIHNldFN0YXRlKSBvbmx5IGlmIHRoZSBmb3JtIGhhcyBub3QgYmVlbiB1bm1vdW50ZWRcbiAgICAvLyAod2UgYXJlIGluIGFuIGFzeW5jIGNhbGxiYWNrLCBldmVyeXRoaW5nIGNhbiBoYXBwZW4hKVxuICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIHJlbHkgb24gYSByZWZcbiAgICBpZiAoZm9ybVJlZi5jdXJyZW50KSB7XG4gICAgICBjbGVhckZvcm0oe1xuICAgICAgICBkb2N1bWVudDogbXV0YXRpb25UeXBlID09PSBcImVkaXRcIiA/IGRvY3VtZW50IDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcnVuIGRvY3VtZW50IHRocm91Z2ggbXV0YXRpb24gc3VjY2VzcyBjYWxsYmFja3NcbiAgICBkb2N1bWVudCA9IHJ1bkNhbGxiYWNrcyh7XG4gICAgICBjYWxsYmFja3M6IHN1Y2Nlc3NGb3JtQ2FsbGJhY2tzLFxuICAgICAgaXRlcmF0b3I6IGRvY3VtZW50LFxuICAgICAgYXJnczogW3sgZm9ybTogZm9ybVJlZi5jdXJyZW50IH1dLFxuICAgIH0pO1xuXG4gICAgLy8gcnVuIHN1Y2Nlc3MgY2FsbGJhY2sgaWYgaXQgZXhpc3RzXG4gICAgaWYgKHByb3BzLnN1Y2Nlc3NDYWxsYmFjaykgcHJvcHMuc3VjY2Vzc0NhbGxiYWNrKGRvY3VtZW50LCB7IGZvcm06IHRoaXMgfSk7XG4gIH07XG5cbiAgLy8gY2F0Y2ggZ3JhcGhxbCBlcnJvcnNcbiAgY29uc3QgbXV0YXRpb25FcnJvckNhbGxiYWNrID0gKGRvY3VtZW50LCBlcnJvcikgPT4ge1xuICAgIHNldERpc2FibGVkKGZhbHNlKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5lcnJvcihcIi8vIGdyYXBoUUwgRXJyb3JcIik7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgIC8vIHJ1biBtdXRhdGlvbiBmYWlsdXJlIGNhbGxiYWNrcyBvbiBlcnJvciwgd2UgZG8gbm90IGFsbG93IHRoZSBjYWxsYmFja3MgdG8gY2hhbmdlIHRoZSBlcnJvclxuICAgIHJ1bkNhbGxiYWNrcyh7XG4gICAgICBjYWxsYmFja3M6IGZhaWx1cmVGb3JtQ2FsbGJhY2tzLFxuICAgICAgaXRlcmF0b3I6IGVycm9yLFxuICAgICAgYXJnczogW3sgZXJyb3IsIGZvcm06IGZvcm1SZWYuY3VycmVudCB9XSxcbiAgICB9KTtcblxuICAgIGlmICghaXNFbXB0eShlcnJvcikpIHtcbiAgICAgIC8vIGFkZCBlcnJvciB0byBzdGF0ZVxuICAgICAgdGhyb3dFcnJvcihlcnJvcik7XG4gICAgfVxuXG4gICAgLy8gcnVuIGVycm9yIGNhbGxiYWNrIGlmIGl0IGV4aXN0c1xuICAgIGlmIChwcm9wcy5lcnJvckNhbGxiYWNrKVxuICAgICAgcHJvcHMuZXJyb3JDYWxsYmFjayhkb2N1bWVudCwgZXJyb3IsIHsgZm9ybTogdGhpcyB9KTtcblxuICAgIC8vIHNjcm9sbCBiYWNrIHVwIHRvIHNob3cgZXJyb3IgbWVzc2FnZXNcbiAgICAvLyBUT0RPOiBtaWdyYXRlIHRoaXMgdG8gc2Nyb2xsIG9uIHRvcCBvZiB0aGUgZm9ybVxuICAgIC8vVXRpbHMuc2Nyb2xsSW50b1ZpZXcoXCIuZmxhc2gtbWVzc2FnZVwiKTtcbiAgfTtcblxuICAvKlxuXG4gIFN1Ym1pdCBmb3JtIGhhbmRsZXJcblxuICAqL1xuICBjb25zdCBzdWJtaXRGb3JtID0gKGZvcm1UeXBlOiBGb3JtVHlwZSkgPT4gYXN5bmMgKGV2ZW50PzogRXZlbnQpID0+IHtcbiAgICBldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50ICYmIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgeyBjb250ZXh0TmFtZSB9ID0gcHJvcHM7XG5cbiAgICAvLyBpZiBmb3JtIGlzIGRpc2FibGVkICh0aGVyZSBpcyBhbHJlYWR5IGEgc3VibWl0IGhhbmRsZXIgcnVubmluZykgZG9uJ3QgZG8gYW55dGhpbmdcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjbGVhciBlcnJvcnMgYW5kIGRpc2FibGUgZm9ybSB3aGlsZSBpdCdzIHN1Ym1pdHRpbmdcbiAgICBzZXRFcnJvcnMoW10pO1xuICAgIHNldERpc2FibGVkKHRydWUpO1xuXG4gICAgLy8gY29tcGxldGUgdGhlIGRhdGEgd2l0aCB2YWx1ZXMgZnJvbSBjdXN0b20gY29tcG9uZW50c1xuICAgIC8vIG5vdGU6IGl0IGZvbGxvd3MgdGhlIHNhbWUgbG9naWMgYXMgU21hcnRGb3JtJ3MgZ2V0RG9jdW1lbnQgbWV0aG9kXG4gICAgbGV0IGRhdGEgPSBnZXREYXRhKFxuICAgICAgeyByZXBsYWNlSW50bEZpZWxkczogdHJ1ZSwgYWRkRXh0cmFGaWVsZHM6IGZhbHNlLCBtdXRhYmxlRmllbGRzIH0sXG4gICAgICBwcm9wcyxcbiAgICAgIHtcbiAgICAgICAgY3VycmVudERvY3VtZW50LFxuICAgICAgICBkZWxldGVkVmFsdWVzLFxuICAgICAgfSxcbiAgICAgIHsgZm9ybTogZm9ybVJlZi5jdXJyZW50LCBzdWJtaXRGb3JtQ2FsbGJhY2tzIH1cbiAgICApO1xuXG4gICAgLy8gaWYgdGhlcmUncyBhIHN1Ym1pdCBjYWxsYmFjaywgcnVuIGl0XG4gICAgaWYgKHByb3BzLnN1Ym1pdENhbGxiYWNrKSB7XG4gICAgICBkYXRhID0gcHJvcHMuc3VibWl0Q2FsbGJhY2soZGF0YSkgfHwgZGF0YTtcbiAgICB9XG5cbiAgICBpZiAoZm9ybVR5cGUgPT09IFwibmV3XCIpIHtcbiAgICAgIC8vIGNyZWF0ZSBkb2N1bWVudCBmb3JtXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVEb2N1bWVudCh7XG4gICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBjb250ZXh0TmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5lcnJvcnM/Lmxlbmd0aCkge1xuICAgICAgICAgIC8vIFRPRE86IHByZXZpb3VzbHkgZ290IGZyb20gbWV0YSwgd2UgY291bGQgaGF2ZSBtb3JlIHRoYW4gMSBlcnJvclxuICAgICAgICAgIG11dGF0aW9uRXJyb3JDYWxsYmFjayhkb2N1bWVudCwgcmVzdWx0LmVycm9yc1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbXV0YXRpb25FcnJvckNhbGxiYWNrKGRvY3VtZW50LCBlcnJvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVwZGF0ZSBkb2N1bWVudCBmb3JtXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkb2N1bWVudElkID0gY3VycmVudERvY3VtZW50Ll9pZDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXBkYXRlRG9jdW1lbnQoe1xuICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICBpZDogZG9jdW1lbnRJZCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBjb250ZXh0TmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIG1vcmUgdGhhbiAxIGVycm9yXG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3JzPy5sZW5ndGgpIHtcbiAgICAgICAgICBtdXRhdGlvbkVycm9yQ2FsbGJhY2soZG9jdW1lbnQsIHJlc3VsdC5lcnJvcnNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkaXRNdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBtdXRhdGlvbkVycm9yQ2FsbGJhY2soZG9jdW1lbnQsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLypcblxuICBEZWxldGUgZG9jdW1lbnQgaGFuZGxlclxuXG4gICovXG4gIGNvbnN0IGRlbGV0ZURvY3VtZW50V2l0aENvbmZpcm0gPSAoKSA9PiB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQ7XG4gICAgY29uc3QgZG9jdW1lbnRJZCA9IHByb3BzLmRvY3VtZW50Ll9pZDtcbiAgICBjb25zdCBkb2N1bWVudFRpdGxlID0gZG9jdW1lbnQudGl0bGUgfHwgZG9jdW1lbnQubmFtZSB8fCBcIlwiO1xuXG4gICAgY29uc3QgZGVsZXRlRG9jdW1lbnRDb25maXJtID0gaW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgeyBpZDogXCJmb3Jtcy5kZWxldGVfY29uZmlybVwiIH0sXG4gICAgICB7IHRpdGxlOiBkb2N1bWVudFRpdGxlIH1cbiAgICApO1xuXG4gICAgaWYgKHdpbmRvdy5jb25maXJtKGRlbGV0ZURvY3VtZW50Q29uZmlybSkpIHtcbiAgICAgIGRlbGV0ZURvY3VtZW50KHsgaW5wdXQ6IHsgaWQ6IGRvY3VtZW50SWQgfSB9KVxuICAgICAgICAudGhlbigobXV0YXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICAvLyB0aGUgbXV0YXRpb24gcmVzdWx0IGxvb2tzIGxpa2Uge2RhdGE6e2NvbGxlY3Rpb25SZW1vdmU6IG51bGx9fSBpZiBzdWNjZWVkZWRcbiAgICAgICAgICBpZiAocHJvcHMucmVtb3ZlU3VjY2Vzc0NhbGxiYWNrKVxuICAgICAgICAgICAgcHJvcHMucmVtb3ZlU3VjY2Vzc0NhbGxiYWNrKHsgZG9jdW1lbnRJZCwgZG9jdW1lbnRUaXRsZSB9KTtcbiAgICAgICAgICByZWZldGNoRm9ybSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wcyB0byBQYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZW5kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgY29uc3QgeyBzdWNjZXNzQ29tcG9uZW50LCBkb2N1bWVudCwgY3VycmVudFVzZXIsIG1vZGVsLCB3YXJuVW5zYXZlZENoYW5nZXMgfSA9XG4gICAgcHJvcHM7XG4gIGNvbnN0IEZvcm1Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuXG4gIGNvbnN0IGZvcm1UeXBlOiBcImVkaXRcIiB8IFwibmV3XCIgPSBkb2N1bWVudCA/IFwiZWRpdFwiIDogXCJuZXdcIjtcblxuICAvLyBGaWVsZHMgY29tcHV0YXRpb25cbiAgY29uc3QgbXV0YWJsZUZpZWxkcyA9XG4gICAgZm9ybVR5cGUgPT09IFwiZWRpdFwiXG4gICAgICA/IGdldEVkaXRhYmxlRmllbGRzKHNjaGVtYSwgY3VycmVudFVzZXIsIGluaXRpYWxEb2N1bWVudClcbiAgICAgIDogZ2V0SW5zZXJ0YWJsZUZpZWxkcyhzY2hlbWEsIGN1cnJlbnRVc2VyKTtcblxuICBjb25zdCB7IGZvcm1MYXlvdXRQcm9wcywgZm9ybUdyb3VwUHJvcHMgfSA9IGdldENoaWxkcmVuUHJvcHMoXG4gICAgcHJvcHMsXG4gICAgeyBkaXNhYmxlZCwgY3VycmVudERvY3VtZW50IH0sXG4gICAge1xuICAgICAgZm9ybVR5cGUsXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWxldGVEb2N1bWVudDogZGVsZXRlRG9jdW1lbnRXaXRoQ29uZmlybSxcbiAgICB9XG4gICk7XG4gIGNvbnN0IGlzQ2hhbmdlZCA9IGlzTm90U2FtZURvY3VtZW50KGluaXRpYWxEb2N1bWVudCwgY3VycmVudERvY3VtZW50KTtcblxuICByZXR1cm4gc3VjY2VzcyAmJiBzdWNjZXNzQ29tcG9uZW50ID8gKFxuICAgIHN1Y2Nlc3NDb21wb25lbnRcbiAgKSA6IChcbiAgICA8Rm9ybVdhcm5VbnNhdmVkXG4gICAgICBpc0NoYW5nZWQ9e2lzQ2hhbmdlZH1cbiAgICAgIHdhcm5VbnNhdmVkQ2hhbmdlcz17d2FyblVuc2F2ZWRDaGFuZ2VzfVxuICAgID5cbiAgICAgIDxGb3JtQ29udGV4dC5Qcm92aWRlclxuICAgICAgICB2YWx1ZT17e1xuICAgICAgICAgIHRocm93RXJyb3IsXG4gICAgICAgICAgY2xlYXJGb3JtLFxuICAgICAgICAgIHJlZmV0Y2hGb3JtLFxuICAgICAgICAgIGlzQ2hhbmdlZCxcbiAgICAgICAgICBzdWJtaXRGb3JtOiBzdWJtaXRGb3JtQ29udGV4dChmb3JtVHlwZSksIC8vQ2hhbmdlIGluIG5hbWUgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgYSBmdW5jdGlvblxuICAgICAgICAgIC8vIGNhbGxlZCBzdWJtaXRGb3JtLCBidXQgbm8gcmVhc29uIGZvciB0aGUgdXNlciB0byBrbm93XG4gICAgICAgICAgLy8gYWJvdXQgdGhhdFxuICAgICAgICAgIGFkZFRvRGVsZXRlZFZhbHVlczogYWRkVG9EZWxldGVkVmFsdWVzLFxuICAgICAgICAgIHVwZGF0ZUN1cnJlbnRWYWx1ZXM6IHVwZGF0ZUN1cnJlbnRWYWx1ZXMsXG4gICAgICAgICAgZ2V0RG9jdW1lbnQ6ICgpID0+IGN1cnJlbnREb2N1bWVudCxcbiAgICAgICAgICBnZXRMYWJlbDogKGZpZWxkTmFtZSwgZmllbGRMb2NhbGUpID0+XG4gICAgICAgICAgICBnZXRMYWJlbChtb2RlbCwgZmxhdFNjaGVtYSwgaW50bCwgZmllbGROYW1lLCBmaWVsZExvY2FsZSksXG4gICAgICAgICAgaW5pdGlhbERvY3VtZW50OiBpbml0aWFsRG9jdW1lbnQsXG4gICAgICAgICAgLy8gVE9ETyBCQUQ6IGNoZWNrIHdoZXJlIHVzZWRcbiAgICAgICAgICAvL3NldEZvcm1TdGF0ZTogdGhpcy5zZXRGb3JtU3RhdGUsXG4gICAgICAgICAgYWRkVG9TdWJtaXRGb3JtLFxuICAgICAgICAgIGFkZFRvU3VjY2Vzc0Zvcm0sXG4gICAgICAgICAgYWRkVG9GYWlsdXJlRm9ybSxcbiAgICAgICAgICBjbGVhckZvcm1DYWxsYmFja3MsXG4gICAgICAgICAgZXJyb3JzLFxuICAgICAgICAgIGN1cnJlbnRWYWx1ZXMsXG4gICAgICAgICAgZGVsZXRlZFZhbHVlcyxcbiAgICAgICAgICBjbGVhckZpZWxkRXJyb3JzLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybUxheW91dCB7Li4uZm9ybUxheW91dFByb3BzfT5cbiAgICAgICAgICB7Z2V0RmllbGRHcm91cHMoXG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY3VycmVudERvY3VtZW50LFxuICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICAgIGZsYXRTY2hlbWEsXG4gICAgICAgICAgICAgIG9yaWdpbmFsU2NoZW1hLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGludGwsXG4gICAgICAgICAgICBtdXRhYmxlRmllbGRzLFxuICAgICAgICAgICAgaW50bC5mb3JtYXRNZXNzYWdlXG4gICAgICAgICAgKS5tYXAoKGdyb3VwLCBpKSA9PiAoXG4gICAgICAgICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybUdyb3VwIGtleT17aX0gey4uLmZvcm1Hcm91cFByb3BzKGdyb3VwKX0gLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9Gb3JtQ29tcG9uZW50cy5Gb3JtTGF5b3V0PlxuICAgICAgPC9Gb3JtQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L0Zvcm1XYXJuVW5zYXZlZD5cbiAgKTtcbn07XG5cbi8vIE11dGF0aW9uIHRoYXQgeWllbGQgYSBzdWNjZXNzIHJlc3VsdFxudHlwZSBTdWNjZXNzZnVsTXV0YXRpb25SZXN1bHQ8VERhdGEgPSBPYmplY3Q+ID0gTXV0YXRpb25SZXN1bHQ8VERhdGE+ICYge1xuICBkYXRhOiBURGF0YTtcbn07XG4vKipcbiAqIFR5cGVndWFyZWQgdG8gYWxsb3cgY29uc2lkZXJpbmcgdGhlIHJlcXVlc3QgYXMgc3VjY2Vzc2Z1bFxuICovXG5jb25zdCBpc1N1Y2Nlc3NmdWwgPSBmdW5jdGlvbiA8VCA9IGFueT4oXG4gIHJlc3VsdDogTXV0YXRpb25SZXN1bHQ8VD4gfCB1bmRlZmluZWRcbik6IHJlc3VsdCBpcyBTdWNjZXNzZnVsTXV0YXRpb25SZXN1bHQ8VD4ge1xuICByZXR1cm4gISFyZXN1bHQ/LmRhdGE7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGb3JtO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL2NvcmVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2Nsb25lRGVlcFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvaXNPYmplY3RcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL21hcFZhbHVlc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvb21pdEJ5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9waWNrQnlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3Vuc2V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC91cGRhdGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3dpdGhvdXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2lzUGxhaW5PYmplY3RcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3NpemVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3RvUGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvaW5pdGlhbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvZnAvZmxvd1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvdGFrZVJpZ2h0XCIpOyIsImltcG9ydCB7IGZvcm1Qcm9wZXJ0aWVzIH0gZnJvbSBcIi4uL21vZHVsZXMvc2NoZW1hX3V0aWxzXCI7XG5pbXBvcnQgeyBGaWVsZEdyb3VwIH0gZnJvbSBcIkB2dWxjYW5qcy9zY2hlbWFcIjtcbmltcG9ydCB7IEZvcm1GaWVsZCB9IGZyb20gXCIuLi90eXBpbmdzXCI7XG5pbXBvcnQgeyBGb3JtUHJvcHMsIEZvcm1TdGF0ZSB9IGZyb20gXCIuL3R5cGluZ3NcIjtcblxuLyoqXG4gKiBGaWVsZCByZWxhdGVkIGZ1bmN0aW9uc1xuICovXG5cbmltcG9ydCB7IFZ1bGNhblNjaGVtYSB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgdW5pcSBmcm9tIFwibG9kYXNoL3VuaXFcIjtcbmltcG9ydCBjb21wYWN0IGZyb20gXCJsb2Rhc2gvY29tcGFjdFwiO1xuaW1wb3J0IGdldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IHBpY2sgZnJvbSBcImxvZGFzaC9waWNrXCI7XG5pbXBvcnQge1xuICBpc0ludGxGaWVsZCxcbiAgZm9ybWF0TGFiZWwsXG4gIGdldEludGxLZXlzLFxuICBnZXRJbnRsTGFiZWwsXG4gIEludGxQcm92aWRlckNvbnRleHRWYWx1ZSxcbn0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5cbmltcG9ydCBtYXAgZnJvbSBcImxvZGFzaC9tYXBcIjtcbmltcG9ydCBzb3J0QnkgZnJvbSBcImxvZGFzaC9zb3J0QnlcIjtcbmltcG9ydCB1bmlxQnkgZnJvbSBcImxvZGFzaC91bmlxQnlcIjtcbmltcG9ydCBkaWZmZXJlbmNlIGZyb20gXCJsb2Rhc2gvZGlmZmVyZW5jZVwiO1xuaW1wb3J0IHJlamVjdCBmcm9tIFwibG9kYXNoL3JlamVjdFwiO1xuaW1wb3J0IGludGVyc2VjdGlvbiBmcm9tIFwibG9kYXNoL2ludGVyc2VjdGlvblwiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcImxvZGFzaC9maWx0ZXJcIjtcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tIFwiQHZ1bGNhbmpzL3V0aWxzXCI7XG5pbXBvcnQgeyBWdWxjYW5GaWVsZFNjaGVtYSB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBWdWxjYW5Nb2RlbCB9IGZyb20gXCJAdnVsY2FuanMvbW9kZWxcIjtcblxuLypcblxuICBHZXQgYSBmaWVsZCdzIGludGwga2V5cyAodXNlZnVsIGZvciBkZWJ1Z2dpbmcpXG5cbiAgKi9cbmNvbnN0IGdldE1vZGVsSW50bEtleXMgPSAoXG4gIG1vZGVsOiBWdWxjYW5Nb2RlbCxcbiAgZmxhdFNjaGVtYTogYW55LFxuICBmaWVsZE5hbWU6IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IGNvbGxlY3Rpb25OYW1lID0gbW9kZWwubmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gZ2V0SW50bEtleXMoe1xuICAgIGZpZWxkTmFtZTogZmllbGROYW1lLFxuICAgIGNvbGxlY3Rpb25OYW1lLFxuICAgIHNjaGVtYTogZmxhdFNjaGVtYSxcbiAgfSk7XG59O1xuXG4vKlxuXG4gICBHZXQgYSBmaWVsZCdzIGxhYmVsXG5cbiAgICovXG5leHBvcnQgY29uc3QgZ2V0TGFiZWwgPSAoXG4gIG1vZGVsOiBWdWxjYW5Nb2RlbCxcbiAgZmxhdFNjaGVtYTogYW55LFxuICBjb250ZXh0OiBJbnRsUHJvdmlkZXJDb250ZXh0VmFsdWUsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBmaWVsZExvY2FsZT86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IGNvbGxlY3Rpb25OYW1lID0gbW9kZWwubmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBsYWJlbCA9IGZvcm1hdExhYmVsKHtcbiAgICBpbnRsOiBjb250ZXh0LFxuICAgIGZpZWxkTmFtZTogZmllbGROYW1lLFxuICAgIGNvbGxlY3Rpb25OYW1lOiBjb2xsZWN0aW9uTmFtZSxcbiAgICBzY2hlbWE6IGZsYXRTY2hlbWEsXG4gIH0pO1xuICBpZiAoZmllbGRMb2NhbGUpIHtcbiAgICBjb25zdCBpbnRsRmllbGRMb2NhbGUgPSBjb250ZXh0LmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgaWQ6IGBsb2NhbGVzLiR7ZmllbGRMb2NhbGV9YCxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiBmaWVsZExvY2FsZSxcbiAgICB9KTtcbiAgICByZXR1cm4gYCR7bGFiZWx9ICgke2ludGxGaWVsZExvY2FsZX0pYDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cbn07XG5cbi8qXG5cbiAgIEdldCBhIGZpZWxkJ3MgZGVzY3JpcHRpb25cblxuICAgKFNhbWUgYXMgZ2V0TGFiZWwgYnV0IHBhc3MgaXNEZXNjcmlwdGlvbjogdHJ1ZSApXG4gICAqL1xuY29uc3QgZ2V0RGVzY3JpcHRpb24gPSAoXG4gIG1vZGVsOiBWdWxjYW5Nb2RlbCxcbiAgZmxhdFNjaGVtYTogYW55LFxuICBjb250ZXh0OiBhbnksXG4gIGZpZWxkTmFtZTogc3RyaW5nXG4pID0+IHtcbiAgY29uc3QgY29sbGVjdGlvbk5hbWUgPSBtb2RlbC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZ2V0SW50bExhYmVsKHtcbiAgICBpbnRsOiBjb250ZXh0LFxuICAgIGZpZWxkTmFtZTogZmllbGROYW1lLFxuICAgIGNvbGxlY3Rpb25OYW1lOiBjb2xsZWN0aW9uTmFtZSxcbiAgICBzY2hlbWE6IGZsYXRTY2hlbWEsXG4gICAgaXNEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBkZXNjcmlwdGlvbiB8fCBudWxsO1xufTtcblxuLypcblxuICBHZXQgYSBmaWVsZCBvcHRpb24ncyBsYWJlbFxuXG4gICovXG5jb25zdCBnZXRPcHRpb25MYWJlbCA9IChcbiAgbW9kZWw6IFZ1bGNhbk1vZGVsLFxuICBjb250ZXh0OiB7IGZvcm1hdE1lc3NhZ2U6IEZ1bmN0aW9uIH0sXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBvcHRpb246IHsgaW50bElkPzogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyB2YWx1ZT86IGFueSB9XG4pID0+IHtcbiAgY29uc3QgY29sbGVjdGlvbk5hbWUgPSBtb2RlbC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGludGxJZCA9XG4gICAgb3B0aW9uLmludGxJZCB8fCBgJHtjb2xsZWN0aW9uTmFtZX0uJHtmaWVsZE5hbWV9LiR7b3B0aW9uLnZhbHVlfWA7XG4gIHJldHVybiBjb250ZXh0LmZvcm1hdE1lc3NhZ2Uoe1xuICAgIGlkOiBpbnRsSWQsXG4gICAgZGVmYXVsdE1lc3NhZ2U6IG9wdGlvbi5sYWJlbCxcbiAgfSk7XG59O1xuXG4vKlxuXG4gIEdldCBhIGxpc3Qgb2YgdGhlIGZpZWxkcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBmb3JtXG5cbiAgTm90ZTogd2hlbiBzdWJtaXR0aW5nIHRoZSBmb3JtIChnZXREYXRhKCkpLCBkbyBub3QgaW5jbHVkZSBhbnkgZXh0cmEgZmllbGRzLlxuXG4gICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGROYW1lcyA9IChcbiAgcHJvcHM6IFBpY2s8Rm9ybVByb3BzLCBcImZpZWxkc1wiIHwgXCJhZGRGaWVsZHNcIiB8IFwicmVtb3ZlRmllbGRzXCI+LFxuICBjdXJyZW50RG9jdW1lbnQsXG4gIG9wdGlvbnNGcm9tQXJnczoge1xuICAgIGV4Y2x1ZGVIaWRkZW5GaWVsZHM/OiBib29sZWFuO1xuICAgIGV4Y2x1ZGVSZW1vdmVkRmllbGRzPzogYm9vbGVhbjtcbiAgICByZXBsYWNlSW50bEZpZWxkcz86IGJvb2xlYW47XG4gICAgYWRkRXh0cmFGaWVsZHM/OiBib29sZWFuO1xuICAgIHNjaGVtYT86IFZ1bGNhblNjaGVtYTtcbiAgICBtdXRhYmxlRmllbGRzPzogQXJyYXk8YW55PjtcbiAgfVxuKSA9PiB7XG4gIGNvbnN0IHsgZmllbGRzLCBhZGRGaWVsZHMsIHJlbW92ZUZpZWxkcyB9ID0gcHJvcHM7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGV4Y2x1ZGVIaWRkZW5GaWVsZHM6IHRydWUsXG4gICAgZXhjbHVkZVJlbW92ZWRGaWVsZHM6IHRydWUsXG4gICAgcmVwbGFjZUludGxGaWVsZHM6IGZhbHNlLFxuICAgIGFkZEV4dHJhRmllbGRzOiBmYWxzZSxcbiAgfTtcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAuLi5vcHRpb25zRnJvbUFyZ3MsXG4gIH07XG4gIGNvbnN0IHtcbiAgICBzY2hlbWEsXG4gICAgbXV0YWJsZUZpZWxkcyxcbiAgICBleGNsdWRlUmVtb3ZlZEZpZWxkcyxcbiAgICBleGNsdWRlSGlkZGVuRmllbGRzLFxuICAgIGFkZEV4dHJhRmllbGRzLFxuICAgIHJlcGxhY2VJbnRsRmllbGRzLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBnZXQgYWxsIGVkaXRhYmxlL2luc2VydGFibGUgZmllbGRzIChkZXBlbmRpbmcgb24gY3VycmVudCBmb3JtIHR5cGUpXG4gIGxldCByZWxldmFudEZpZWxkcyA9IG11dGFibGVGaWVsZHM7XG5cbiAgLy8gaWYgXCJmaWVsZHNcIiBwcm9wIGlzIHNwZWNpZmllZCwgcmVzdHJpY3QgbGlzdCBvZiBmaWVsZHMgdG8gaXRcbiAgaWYgKHR5cGVvZiBmaWVsZHMgIT09IFwidW5kZWZpbmVkXCIgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICByZWxldmFudEZpZWxkcyA9IGludGVyc2VjdGlvbihyZWxldmFudEZpZWxkcywgZmllbGRzKTtcbiAgfVxuXG4gIC8vIGlmIFwiaGlkZUZpZWxkc1wiIHByb3AgaXMgc3BlY2lmaWVkLCByZW1vdmUgaXRzIGZpZWxkc1xuICBpZiAoZXhjbHVkZVJlbW92ZWRGaWVsZHMpIHtcbiAgICAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIC8vY29uc3QgcmVtb3ZlRmllbGRzID0gcmVtb3ZlRmllbGRzIHx8IGhpZGVGaWVsZHM7XG4gICAgaWYgKHR5cGVvZiByZW1vdmVGaWVsZHMgIT09IFwidW5kZWZpbmVkXCIgJiYgcmVtb3ZlRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlbGV2YW50RmllbGRzID0gZGlmZmVyZW5jZShyZWxldmFudEZpZWxkcywgcmVtb3ZlRmllbGRzKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiBcImFkZEZpZWxkc1wiIHByb3AgaXMgc3BlY2lmaWVkLCBhZGQgaXRzIGZpZWxkc1xuICBpZiAoXG4gICAgYWRkRXh0cmFGaWVsZHMgJiZcbiAgICB0eXBlb2YgYWRkRmllbGRzICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgYWRkRmllbGRzLmxlbmd0aCA+IDBcbiAgKSB7XG4gICAgcmVsZXZhbnRGaWVsZHMgPSByZWxldmFudEZpZWxkcz8uY29uY2F0KGFkZEZpZWxkcyk7XG4gIH1cblxuICAvLyByZW1vdmUgYWxsIGhpZGRlbiBmaWVsZHNcbiAgaWYgKGV4Y2x1ZGVIaWRkZW5GaWVsZHMpIHtcbiAgICBjb25zdCBkb2N1bWVudCA9IGN1cnJlbnREb2N1bWVudDtcbiAgICByZWxldmFudEZpZWxkcyA9IHJlamVjdChyZWxldmFudEZpZWxkcywgKGZpZWxkTmFtZSkgPT4ge1xuICAgICAgY29uc3QgaGlkZGVuID0gc2NoZW1hPy5bZmllbGROYW1lXS5oaWRkZW47XG4gICAgICByZXR1cm4gdHlwZW9mIGhpZGRlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gaGlkZGVuKHsgcHJvcHMsIGRvY3VtZW50IH0pXG4gICAgICAgIDogaGlkZGVuO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gcmVwbGFjZSBpbnRsIGZpZWxkc1xuICBpZiAocmVwbGFjZUludGxGaWVsZHMpIHtcbiAgICByZWxldmFudEZpZWxkcyA9IHJlbGV2YW50RmllbGRzPy5tYXAoKGZpZWxkTmFtZSkgPT5cbiAgICAgIGlzSW50bEZpZWxkKHNjaGVtYT8uW2ZpZWxkTmFtZV0pID8gYCR7ZmllbGROYW1lfV9pbnRsYCA6IGZpZWxkTmFtZVxuICAgICk7XG4gIH1cblxuICAvLyByZW1vdmUgYW55IGR1cGxpY2F0ZXNcbiAgcmVsZXZhbnRGaWVsZHMgPSB1bmlxKHJlbGV2YW50RmllbGRzKTtcblxuICByZXR1cm4gcmVsZXZhbnRGaWVsZHM7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmNvbnN0IGluaXRGaWVsZCA9IChcbiAgcHJvcHMsXG4gIHN0YXRlOiBQaWNrPEZvcm1TdGF0ZSwgXCJjdXJyZW50RG9jdW1lbnRcIiB8IFwiZmxhdFNjaGVtYVwiIHwgXCJvcmlnaW5hbFNjaGVtYVwiPixcbiAgY29udGV4dCxcbiAgZmllbGROYW1lLFxuICBmaWVsZFNjaGVtYVxuKSA9PiB7XG4gIGNvbnN0IHsgbW9kZWwgfSA9IHByb3BzO1xuICBjb25zdCB7IGN1cnJlbnREb2N1bWVudCwgZmxhdFNjaGVtYSB9ID0gc3RhdGU7XG4gIGNvbnN0IGlzQXJyYXkgPSBnZXQoZmllbGRTY2hlbWEsIFwidHlwZS4wLnR5cGVcIikgPT09IEFycmF5O1xuXG4gIC8vIGludGlhbGl6ZSBwcm9wZXJ0aWVzXG4gIGxldCBmaWVsZDogUGFydGlhbDxGb3JtRmllbGQ+ID0ge1xuICAgIC4uLnBpY2soZmllbGRTY2hlbWEsIGZvcm1Qcm9wZXJ0aWVzKSxcbiAgICBuYW1lOiBmaWVsZE5hbWUsXG4gICAgZGF0YXR5cGU6IGZpZWxkU2NoZW1hLnR5cGUsXG4gICAgbGF5b3V0OiBwcm9wcy5sYXlvdXQsIC8vIEEgbGF5b3V0IHByb3BlcnR5IHVzZWQgdG8gY29udHJvbCBob3cgdGhlIGZvcm0gZmllbGRzIGFyZSBkaXNwbGF5ZWQuIERlZmF1bHRzIHRvIGhvcml6b250YWwuXG4gICAgaW5wdXQ6IGZpZWxkU2NoZW1hLmlucHV0IHx8IGZpZWxkU2NoZW1hLmNvbnRyb2wsIC8vIFRPRE9cbiAgfTtcblxuICAvLyBpZiB0aGlzIGlzIGFuIGFycmF5IGZpZWxkIGFsc28gc3RvcmUgaXRzIGFycmF5IGl0ZW0gdHlwZVxuICBpZiAoaXNBcnJheSkge1xuICAgIGNvbnN0IGl0ZW1GaWVsZFNjaGVtYSA9IHN0YXRlLm9yaWdpbmFsU2NoZW1hW2Ake2ZpZWxkTmFtZX0uJGBdO1xuICAgIGZpZWxkLml0ZW1EYXRhdHlwZSA9IGdldChpdGVtRmllbGRTY2hlbWEsIFwidHlwZS4wLnR5cGVcIik7XG4gIH1cblxuICBmaWVsZC5sYWJlbCA9IGdldExhYmVsKG1vZGVsLCBmbGF0U2NoZW1hLCBjb250ZXh0LCBmaWVsZE5hbWUpO1xuICBmaWVsZC5pbnRsS2V5cyA9IGdldEludGxLZXlzKGZpZWxkTmFtZSk7XG4gIC8vIC8vIHJlcGxhY2UgdmFsdWUgYnkgcHJlZmlsbGVkIHZhbHVlIGlmIHZhbHVlIGlzIGVtcHR5XG4gIC8vIGNvbnN0IHByZWZpbGwgPSBmaWVsZFNjaGVtYS5wcmVmaWxsIHx8IChmaWVsZFNjaGVtYS5mb3JtICYmIGZpZWxkU2NoZW1hLmZvcm0ucHJlZmlsbCk7XG4gIC8vIGlmIChwcmVmaWxsKSB7XG4gIC8vICAgY29uc3QgcHJlZmlsbGVkVmFsdWUgPSB0eXBlb2YgcHJlZmlsbCA9PT0gJ2Z1bmN0aW9uJyA/IHByZWZpbGwuY2FsbChmaWVsZFNjaGVtYSkgOiBwcmVmaWxsO1xuICAvLyAgIGlmICghIXByZWZpbGxlZFZhbHVlICYmICFmaWVsZC52YWx1ZSkge1xuICAvLyAgICAgZmllbGQucHJlZmlsbGVkVmFsdWUgPSBwcmVmaWxsZWRWYWx1ZTtcbiAgLy8gICAgIGZpZWxkLnZhbHVlID0gcHJlZmlsbGVkVmFsdWU7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgY29uc3QgZG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQ7XG4gIGZpZWxkLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG5cbiAgLy8gaW50ZXJuYXRpb25hbGl6ZSBmaWVsZCBvcHRpb25zIGxhYmVsc1xuICBpZiAoZmllbGQub3B0aW9ucyAmJiBBcnJheS5pc0FycmF5KGZpZWxkLm9wdGlvbnMpKSB7XG4gICAgZmllbGQub3B0aW9ucyA9IGZpZWxkLm9wdGlvbnMubWFwKChvcHRpb24pID0+ICh7XG4gICAgICAuLi5vcHRpb24sXG4gICAgICBsYWJlbDogZ2V0T3B0aW9uTGFiZWwobW9kZWwsIGNvbnRleHQsIGZpZWxkTmFtZSwgb3B0aW9uKSxcbiAgICB9KSk7XG4gIH1cblxuICAvLyBpZiB0aGlzIGFuIGludGwnZCBmaWVsZCwgdXNlIGEgc3BlY2lhbCBpbnRsSW5wdXRcbiAgaWYgKGlzSW50bEZpZWxkKGZpZWxkU2NoZW1hKSkge1xuICAgIGZpZWxkLmludGxJbnB1dCA9IHRydWU7XG4gIH1cblxuICAvLyBhZGQgYW55IHByb3BlcnRpZXMgc3BlY2lmaWVkIGluIGZpZWxkU2NoZW1hLmZvcm0gYXMgZXh0cmEgcHJvcHMgcGFzc2VkIG9uXG4gIC8vIHRvIHRoZSBmb3JtIGNvbXBvbmVudCwgY2FsbGluZyB0aGVtIGlmIHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBjb25zdCBpbnB1dFByb3BlcnRpZXMgPSBmaWVsZFNjaGVtYS5mb3JtIHx8IGZpZWxkU2NoZW1hLmlucHV0UHJvcGVydGllcyB8fCB7fTtcbiAgZm9yIChjb25zdCBwcm9wIGluIGlucHV0UHJvcGVydGllcykge1xuICAgIGNvbnN0IHByb3BlcnR5ID0gaW5wdXRQcm9wZXJ0aWVzW3Byb3BdO1xuICAgIGZpZWxkW3Byb3BdID1cbiAgICAgIHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gcHJvcGVydHkuY2FsbChmaWVsZFNjaGVtYSwge1xuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgICAgIGludGw6IGNvbnRleHQsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBwcm9wZXJ0eTtcbiAgfVxuXG4gIC8vIGFkZCBkZXNjcmlwdGlvbiBhcyBoZWxwIHByb3BcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbihtb2RlbCwgZmxhdFNjaGVtYSwgY29udGV4dCwgZmllbGROYW1lKTtcbiAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgZmllbGQuaGVscCA9IGRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcmV0dXJuIGZpZWxkIGFzIEZvcm1GaWVsZDtcbn07XG5jb25zdCBoYW5kbGVGaWVsZFBhdGggPSAoXG4gIGZpZWxkOiBGb3JtRmllbGQsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBwYXJlbnRQYXRoPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3QgZmllbGRQYXRoID0gcGFyZW50UGF0aCA/IGAke3BhcmVudFBhdGh9LiR7ZmllbGROYW1lfWAgOiBmaWVsZE5hbWU7XG4gIGZpZWxkLnBhdGggPSBmaWVsZFBhdGg7XG4gIC8vIFRPRE86IHJlaW50cm9kdWNlIHRoaXMgc2lkZSBlZmZlY3QgdG8gY29ycmVjdGx5IHNldCB0aGUgZGVmYXVsdCB2YWx1ZXNcbiAgLy8gKHByZXZpb3VzbHkgd2FzIGluIEZvcm0udHN4KVxuICAvLyBOb3RlIHN1cmUgaWYgdGhpcyBpcyBhY3R1YWxseSBuZWVkZWRcbiAgLy8gaWYgKGZpZWxkLmRlZmF1bHRWYWx1ZSkge1xuICAvLyAgIHNldCh0aGlzLmRlZmF1bHRWYWx1ZXMsIGZpZWxkUGF0aCwgZmllbGQuZGVmYXVsdFZhbHVlKTtcbiAgLy8gfVxuICByZXR1cm4gZmllbGQ7XG59O1xuY29uc3QgaGFuZGxlRmllbGRQYXJlbnQgPSAoZmllbGQsIHBhcmVudEZpZWxkTmFtZSkgPT4ge1xuICAvLyBpZiBmaWVsZCBoYXMgYSBwYXJlbnQgZmllbGQsIHBhc3MgaXQgb25cbiAgaWYgKHBhcmVudEZpZWxkTmFtZSkge1xuICAgIGZpZWxkLnBhcmVudEZpZWxkTmFtZSA9IHBhcmVudEZpZWxkTmFtZTtcbiAgfVxuXG4gIHJldHVybiBmaWVsZDtcbn07XG5jb25zdCBoYW5kbGVQZXJtaXNzaW9ucyA9IChmaWVsZCwgZmllbGROYW1lLCBtdXRhYmxlRmllbGRzOiBBcnJheTxhbnk+KSA9PiB7XG4gIC8vIGlmIGZpZWxkIGlzIG5vdCBjcmVhdGFibGUvdXBkYXRhYmxlLCBkaXNhYmxlIGl0XG4gIGlmICghbXV0YWJsZUZpZWxkcy5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XG4gICAgZmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiBmaWVsZDtcbn07XG5jb25zdCBoYW5kbGVGaWVsZENoaWxkcmVuID0gKFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiY3VycmVudERvY3VtZW50XCIgfCBcImZsYXRTY2hlbWFcIiB8IFwib3JpZ2luYWxTY2hlbWFcIj4sXG4gIGNvbnRleHQ6IGFueSxcbiAgZmllbGQsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBmaWVsZFNjaGVtYTogYW55LCAvLyBUT0RPOiBub3QgYSBWdWxjYW5GaWVsZCwgbW9yZSBhIEZvcm1GaWVsZFxuICBzY2hlbWE6IFZ1bGNhblNjaGVtYSxcbiAgbXV0YWJsZUZpZWxkczogQXJyYXk8YW55PlxuKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERvY3VtZW50IH0gPSBzdGF0ZTtcbiAgLy8gYXJyYXkgZmllbGRcbiAgaWYgKGZpZWxkU2NoZW1hLmFycmF5RmllbGRTY2hlbWEpIHtcbiAgICBmaWVsZC5hcnJheUZpZWxkU2NoZW1hID0gZmllbGRTY2hlbWEuYXJyYXlGaWVsZFNjaGVtYTtcbiAgICAvLyBjcmVhdGUgYSBmaWVsZCB0aGF0IGNhbiBiZSBleHBsb2l0ZWQgYnkgdGhlIGZvcm1cbiAgICBmaWVsZC5hcnJheUZpZWxkID0gY3JlYXRlQXJyYXlTdWJGaWVsZChcbiAgICAgIHByb3BzLFxuICAgICAgc3RhdGUsXG4gICAgICBjb250ZXh0LFxuICAgICAgZmllbGROYW1lLFxuICAgICAgZmllbGQuYXJyYXlGaWVsZFNjaGVtYSxcbiAgICAgIHNjaGVtYSxcbiAgICAgIG11dGFibGVGaWVsZHNcbiAgICApO1xuICAgIC8vZmllbGQubmVzdGVkSW5wdXQgPSB0cnVlXG4gIH1cbiAgLy8gbmVzdGVkIGZpZWxkczogc2V0IGlucHV0IHRvIFwibmVzdGVkXCJcbiAgaWYgKGZpZWxkU2NoZW1hLnNjaGVtYSkge1xuICAgIGZpZWxkLm5lc3RlZFNjaGVtYSA9IGZpZWxkU2NoZW1hLnNjaGVtYTtcbiAgICBmaWVsZC5uZXN0ZWRJbnB1dCA9IHRydWU7XG5cbiAgICAvLyBnZXQgbmVzdGVkIHNjaGVtYVxuICAgIC8vIGZvciBlYWNoIG5lc3RlZCBmaWVsZCwgZ2V0IGZpZWxkIG9iamVjdCBieSBjYWxsaW5nIGNyZWF0ZUZpZWxkIHJlY3Vyc2l2ZWx5XG4gICAgZmllbGQubmVzdGVkRmllbGRzID0gZ2V0RmllbGROYW1lcyhwcm9wcywgY3VycmVudERvY3VtZW50LCB7XG4gICAgICBzY2hlbWE6IGZpZWxkLm5lc3RlZFNjaGVtYSxcbiAgICAgIGFkZEV4dHJhRmllbGRzOiBmYWxzZSxcbiAgICB9KS5tYXAoKHN1YkZpZWxkTmFtZSkgPT4ge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZpZWxkKFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHN1YkZpZWxkTmFtZSxcbiAgICAgICAgZmllbGQubmVzdGVkU2NoZW1hLFxuICAgICAgICBtdXRhYmxlRmllbGRzLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIGZpZWxkLnBhdGhcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGZpZWxkO1xufTtcblxuLypcbiAgR2l2ZW4gYSBmaWVsZCdzIG5hbWUsIHRoZSBjb250YWluaW5nIHNjaGVtYSwgYW5kIHBhcmVudCwgY3JlYXRlIHRoZVxuICBjb21wbGV0ZSBmaWVsZCBvYmplY3QgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21wb25lbnRcblxuICAqL1xuY29uc3QgY3JlYXRlRmllbGQgPSAoXG4gIHByb3BzOiBGb3JtUHJvcHMsXG4gIHN0YXRlOiBQaWNrPEZvcm1TdGF0ZSwgXCJjdXJyZW50RG9jdW1lbnRcIiB8IFwiZmxhdFNjaGVtYVwiIHwgXCJvcmlnaW5hbFNjaGVtYVwiPixcbiAgY29udGV4dDogYW55LFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgc2NoZW1hOiBhbnksXG4gIG11dGFibGVGaWVsZHM6IEFycmF5PGFueT4sXG4gIHBhcmVudEZpZWxkTmFtZT86IHN0cmluZyxcbiAgcGFyZW50UGF0aD86IHN0cmluZ1xuKTogRm9ybUZpZWxkID0+IHtcbiAgY29uc3QgZmllbGRTY2hlbWEgPSBzY2hlbWFbZmllbGROYW1lXTtcbiAgbGV0IGZpZWxkID0gaW5pdEZpZWxkKHByb3BzLCBzdGF0ZSwgY29udGV4dCwgZmllbGROYW1lLCBmaWVsZFNjaGVtYSk7XG4gIGZpZWxkID0gaGFuZGxlRmllbGRQYXRoKGZpZWxkLCBmaWVsZE5hbWUsIHBhcmVudFBhdGgpO1xuICBmaWVsZCA9IGhhbmRsZUZpZWxkUGFyZW50KGZpZWxkLCBwYXJlbnRGaWVsZE5hbWUpO1xuICBmaWVsZCA9IGhhbmRsZVBlcm1pc3Npb25zKGZpZWxkLCBmaWVsZE5hbWUsIG11dGFibGVGaWVsZHMpO1xuICBmaWVsZCA9IGhhbmRsZUZpZWxkQ2hpbGRyZW4oXG4gICAgcHJvcHMsXG4gICAgc3RhdGUsXG4gICAgY29udGV4dCxcbiAgICBmaWVsZCxcbiAgICBmaWVsZE5hbWUsXG4gICAgZmllbGRTY2hlbWEsXG4gICAgc2NoZW1hLFxuICAgIG11dGFibGVGaWVsZHNcbiAgKTtcbiAgcmV0dXJuIGZpZWxkO1xufTtcbmNvbnN0IGNyZWF0ZUFycmF5U3ViRmllbGQgPSAoXG4gIHByb3BzOiBGb3JtUHJvcHMsXG4gIHN0YXRlOiBQaWNrPEZvcm1TdGF0ZSwgXCJjdXJyZW50RG9jdW1lbnRcIiB8IFwiZmxhdFNjaGVtYVwiIHwgXCJvcmlnaW5hbFNjaGVtYVwiPixcbiAgY29udGV4dDogYW55LFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgc3ViRmllbGRTY2hlbWE6IFZ1bGNhbkZpZWxkU2NoZW1hLFxuICBzY2hlbWE6IFZ1bGNhblNjaGVtYSxcbiAgbXV0YWJsZUZpZWxkczogQXJyYXk8c3RyaW5nPlxuKSA9PiB7XG4gIGNvbnN0IHN1YkZpZWxkTmFtZSA9IGAke2ZpZWxkTmFtZX0uJGA7XG4gIGxldCBzdWJGaWVsZCA9IGluaXRGaWVsZChwcm9wcywgc3RhdGUsIGNvbnRleHQsIHN1YkZpZWxkTmFtZSwgc3ViRmllbGRTY2hlbWEpO1xuICAvLyBhcnJheSBzdWJmaWVsZCBoYXMgdGhlIHNhbWUgcGF0aCBhbmQgcGVybWlzc2lvbnMgYXMgaXRzIHBhcmVudFxuICAvLyBzbyB3ZSB1c2UgcGFyZW50IG5hbWUgKGZpZWxkTmFtZSkgYW5kIG5vdCBzdWJmaWVsZE5hbWVcbiAgc3ViRmllbGQgPSBoYW5kbGVGaWVsZFBhdGgoc3ViRmllbGQsIGZpZWxkTmFtZSk7XG4gIHN1YkZpZWxkID0gaGFuZGxlUGVybWlzc2lvbnMoc3ViRmllbGQsIGZpZWxkTmFtZSwgbXV0YWJsZUZpZWxkcyAvKnNjaGVtYSovKTtcbiAgLy8gd2UgZG8gbm90IGFsbG93IG5lc3RpbmcgeWV0XG4gIC8vc3ViRmllbGQgPSB0aGlzLmhhbmRsZUZpZWxkQ2hpbGRyZW4oZmllbGQsIGZpZWxkU2NoZW1hKVxuICByZXR1cm4gc3ViRmllbGQ7XG59O1xuXG4vLyBHcm91cCBvZiBtdWx0aXBsZSBmaWVsZHMgKG9idGFpbmVkIGJ5IHBhcnNpbmcgdGhlIHdob2xlIHNjaGVtYSlcbmludGVyZmFjZSBHcm91cFdpdGhGaWVsZHMgZXh0ZW5kcyBGaWVsZEdyb3VwIHtcbiAgZmllbGRzOiBBcnJheTxGb3JtRmllbGQ+O1xufVxuXG50eXBlIEZvcm1TY2hlbWFTdGF0ZSA9IFBpY2s8XG4gIEZvcm1TdGF0ZSxcbiAgXCJjdXJyZW50RG9jdW1lbnRcIiB8IFwic2NoZW1hXCIgfCBcImZsYXRTY2hlbWFcIiB8IFwib3JpZ2luYWxTY2hlbWFcIlxuPjtcblxuLypcblxuICBHZXQgYWxsIGZpZWxkIGdyb3Vwc1xuXG4gICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRHcm91cHMgPSAoXG4gIHByb3BzOiBGb3JtUHJvcHMsXG4gIHN0YXRlOiBGb3JtU2NoZW1hU3RhdGUsXG4gIGNvbnRleHQ6IEludGxQcm92aWRlckNvbnRleHRWYWx1ZSxcbiAgbXV0YWJsZUZpZWxkczogQXJyYXk8c3RyaW5nPixcbiAgZm9ybWF0TWVzc2FnZTogRnVuY3Rpb25cbikgPT4ge1xuICBjb25zdCB7IHNjaGVtYSwgY3VycmVudERvY3VtZW50IH0gPSBzdGF0ZTtcbiAgLy8gYnVpbGQgZmllbGRzIGFycmF5IGJ5IGl0ZXJhdGluZyBvdmVyIHRoZSBsaXN0IG9mIGZpZWxkIG5hbWVzXG4gIGxldCBmaWVsZHMgPSBnZXRGaWVsZE5hbWVzKHByb3BzLCBjdXJyZW50RG9jdW1lbnQsIHtcbiAgICBtdXRhYmxlRmllbGRzLFxuICAgIHNjaGVtYSxcbiAgfSkubWFwKChmaWVsZE5hbWUpID0+IHtcbiAgICAvLyBnZXQgc2NoZW1hIGZvciB0aGUgY3VycmVudCBmaWVsZFxuICAgIHJldHVybiBjcmVhdGVGaWVsZChwcm9wcywgc3RhdGUsIGNvbnRleHQsIGZpZWxkTmFtZSwgc2NoZW1hLCBtdXRhYmxlRmllbGRzKTtcbiAgfSk7XG5cbiAgZmllbGRzID0gc29ydEJ5KGZpZWxkcywgXCJvcmRlclwiKTtcblxuICAvLyBnZXQgbGlzdCBvZiBhbGwgdW5pcXVlIGdyb3VwcyAoYmFzZWQgb24gdGhlaXIgbmFtZSkgdXNlZCBpbiBjdXJyZW50IGZpZWxkcywgcmVtb3ZlIFwiZW1wdHlcIiBncm91cFxuICBsZXQgZ3JvdXBzID0gY29tcGFjdCh1bmlxQnkobWFwKGZpZWxkcywgXCJncm91cFwiKSwgKGcpID0+IChnID8gZy5uYW1lIDogXCJcIikpKTtcblxuICAvLyBmb3IgZWFjaCBncm91cCwgYWRkIHJlbGV2YW50IGZpZWxkc1xuICBsZXQgZ3JvdXBzV2l0aEZpZWxkcyA9IGdyb3Vwcy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAgZ3JvdXAubGFiZWwgfHxcbiAgICAgIC8vdGhpcy5jb250ZXh0LmZvcm1hdE1lc3NhZ2UoeyBpZDogZ3JvdXAubmFtZSB9KSB8fFxuICAgICAgY2FwaXRhbGl6ZShncm91cC5uYW1lKTtcbiAgICBjb25zdCBncm91cEZpZWxkcyA9IF9maWx0ZXI8Rm9ybUZpZWxkPihmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmdyb3VwICYmIGZpZWxkLmdyb3VwLm5hbWUgPT09IGdyb3VwLm5hbWU7XG4gICAgfSk7XG4gICAgY29uc3QgZ3JvdXBXaXRoRmllbGRzOiBHcm91cFdpdGhGaWVsZHMgPSB7XG4gICAgICAuLi5ncm91cCxcbiAgICAgIGxhYmVsLFxuICAgICAgZmllbGRzOiBncm91cEZpZWxkcyxcbiAgICB9O1xuICAgIHJldHVybiBncm91cFdpdGhGaWVsZHM7XG4gIH0pO1xuXG4gIC8vIGFkZCBkZWZhdWx0IGdyb3VwIGlmIG5lY2Vzc2FyeVxuICBjb25zdCBkZWZhdWx0R3JvdXBGaWVsZHMgPSBfZmlsdGVyKGZpZWxkcywgKGZpZWxkKSA9PiAhZmllbGQuZ3JvdXApO1xuICBpZiAoZGVmYXVsdEdyb3VwRmllbGRzLmxlbmd0aCkge1xuICAgIGNvbnN0IGRlZmF1bHRHcm91cDogR3JvdXBXaXRoRmllbGRzID0ge1xuICAgICAgbmFtZTogXCJkZWZhdWx0XCIsXG4gICAgICBsYWJlbDogXCJkZWZhdWx0XCIsXG4gICAgICBvcmRlcjogMCxcbiAgICAgIGZpZWxkczogZGVmYXVsdEdyb3VwRmllbGRzLFxuICAgIH07XG4gICAgZ3JvdXBzV2l0aEZpZWxkcyA9IFtkZWZhdWx0R3JvdXBdLmNvbmNhdChncm91cHNXaXRoRmllbGRzKTtcbiAgfVxuXG4gIC8vIHNvcnQgYnkgb3JkZXJcbiAgZ3JvdXBzV2l0aEZpZWxkcyA9IHNvcnRCeShncm91cHNXaXRoRmllbGRzLCBcIm9yZGVyXCIpO1xuXG4gIC8vIGNvbnNvbGUubG9nKGdyb3Vwcyk7XG5cbiAgcmV0dXJuIGdyb3Vwc1dpdGhGaWVsZHM7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL21hcFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvc29ydEJ5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC91bmlxQnlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2RpZmZlcmVuY2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3JlamVjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpOyIsImltcG9ydCBmaW5kIGZyb20gXCJsb2Rhc2gvZmluZFwiO1xuaW1wb3J0IGlzRXF1YWxXaXRoIGZyb20gXCJsb2Rhc2gvaXNFcXVhbFdpdGhcIjtcbmV4cG9ydCBjb25zdCBpc05vdFNhbWVEb2N1bWVudCA9IChpbml0aWFsRG9jdW1lbnQsIGNoYW5nZWREb2N1bWVudCkgPT4ge1xuICBjb25zdCBjaGFuZ2VkVmFsdWUgPSBmaW5kKGNoYW5nZWREb2N1bWVudCwgKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pID0+IHtcbiAgICByZXR1cm4gIWlzRXF1YWxXaXRoKHZhbHVlLCBpbml0aWFsRG9jdW1lbnRba2V5XSwgKG9ialZhbHVlLCBvdGhWYWx1ZSkgPT4ge1xuICAgICAgaWYgKCFvYmpWYWx1ZSAmJiAhb3RoVmFsdWUpIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHR5cGVvZiBjaGFuZ2VkVmFsdWUgIT09IFwidW5kZWZpbmVkXCI7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2lzRXF1YWxXaXRoXCIpOyIsImV4cG9ydCAqIGZyb20gXCIuL3VzZVdhcm5PblVuc2F2ZWRcIjtcbiIsImltcG9ydCB7IHVzZUJsb2NrVHJhbnNpdGlvbiB9IGZyb20gXCIuLi91c2VCbG9ja1RyYW5zaXRpb24vdXNlQmxvY2tUcmFuc2l0aW9uXCI7XG5pbXBvcnQgZGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQgeyB1c2VJbnRsQ29udGV4dCB9IGZyb20gXCJAdnVsY2FuanMvaTE4blwiO1xuY29uc3QgZGVidWdUcmFuc2l0aW9ucyA9IGRlYnVnKFwidm46cm91dGUtdHJhbnNpdGlvbnNcIik7XG5cbi8qKlxuICogQ2FuIHRyaWdnZXIgYW4gYWxlcnQgb24gdW5zYXZlZCBjaGFuZ2VzXG4gKlxuICogVHJpZ2dlcnMgZXZlbnQgc28geW91IGNhbiBhbHNvIGJsb2NrIFNQQSB0cmFuc2l0aW9uIChpbXBsZW1lbnRhdGlvbiBpcyBOT1QgcHJvdmlkZWQgYnkgdGhpcyBob29rLCB5b3VcbiAqIG5lZWQgbGlzdGVuZXJzIHdob3NlIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24geW91ciByb3V0ZXIgKFJlYWN0IFJvdXRlciwgTmV4dCBSb3V0ZXIuLi4pLCBzZWUgYmxvY2sudHMpXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RUcmFpbmluZy9oaXN0b3J5L2Jsb2IvbWFzdGVyL2RvY3MvYmxvY2tpbmctdHJhbnNpdGlvbnMubWRcbiAqXG4gKiBAcGFyYW0gcGFyYW0wXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXJuT25VbnNhdmVkID0gKHtcbiAgaXNDaGFuZ2VkLFxuICB3YXJuVW5zYXZlZENoYW5nZXMsXG59OiB7XG4gIGlzQ2hhbmdlZDogYm9vbGVhbjtcbiAgd2FyblVuc2F2ZWRDaGFuZ2VzPzogYm9vbGVhbjtcbn0pID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUludGxDb250ZXh0KCk7XG4gIC8qKlxuICAgKiBUbyBiZSBwYXNzZWQgdG8gb25iZWZvcmV1bmxvYWQgZXZlbnQuIFRoZSByZXR1cm5lZCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkXG4gICAqIGJ5IHRoZSBwcm9tcHQuXG4gICAqXG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93RXZlbnRIYW5kbGVycy9vbmJlZm9yZXVubG9hZFxuICAgKiB0aGUgbWVzc2FnZSByZXR1cm5lZCBpcyBhY3R1YWxseSBpZ25vcmVkIGJ5IG1vc3QgYnJvd3NlcnMgYW5kIGEgZGVmYXVsdCBtZXNzYWdlICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmUgdGhpcyBwYWdlPyBZb3UgbWlnaHQgaGF2ZSB1bnNhdmVkIGNoYW5nZXMnIGlzIGRpc3BsYXllZC4gU2VlIHRoZSBOb3RlcyBzZWN0aW9uIG9uIHRoZSBtb3ppbGxhIGRvY3MgYWJvdmVcbiAgICovXG4gIGNvbnN0IGdldEJsb2NrZWRNZXNzYWdlID0gKGV2ZW50PzogQmVmb3JlVW5sb2FkRXZlbnQpID0+IHtcbiAgICBkZWJ1Z1RyYW5zaXRpb25zKFwicnVubmluZyBoYW5kbGVQYWdlTGVhdmVcIiwgZXZlbnQpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjb250ZXh0LmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgaWQ6IFwiZm9ybXMuY29uZmlybV9kaXNjYXJkXCIsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGlzY2FyZCB5b3VyIGNoYW5nZXM/XCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH07XG4gIHVzZUJsb2NrVHJhbnNpdGlvbih7XG4gICAgc2hvdWxkQmxvY2s6ICEhKHdhcm5VbnNhdmVkQ2hhbmdlcyAmJiBpc0NoYW5nZWQpLFxuICAgIGdldEJsb2NrZWRNZXNzYWdlOiBnZXRCbG9ja2VkTWVzc2FnZSxcbiAgfSk7XG59O1xuIiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGJsb2NrIH0gZnJvbSBcIi4vYmxvY2tcIjtcbmltcG9ydCBkZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmNvbnN0IGRlYnVnVHJhbnNpdGlvbnMgPSBkZWJ1ZyhcInZuOnJvdXRlci10cmFuc2l0aW9uc1wiKTtcblxuLyoqXG4gKiBDYW4gdHJpZ2dlciBhbiBhbGVydCBvbiB1bnNhdmVkIGNoYW5nZXNcbiAqXG4gKiBUcmlnZ2VycyBldmVudCBzbyB5b3UgY2FuIGFsc28gYmxvY2sgU1BBIHRyYW5zaXRpb24gKGltcGxlbWVudGF0aW9uIGlzIE5PVCBwcm92aWRlZCBieSB0aGlzIGhvb2ssIHlvdVxuICogbmVlZCBsaXN0ZW5lcnMgd2hvc2UgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiB5b3VyIHJvdXRlciAoUmVhY3QgUm91dGVyLCBOZXh0IFJvdXRlci4uLiksIHNlZSBibG9jay50cylcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdFRyYWluaW5nL2hpc3RvcnkvYmxvYi9tYXN0ZXIvZG9jcy9ibG9ja2luZy10cmFuc2l0aW9ucy5tZFxuICpcbiAqIEBwYXJhbSBwYXJhbTBcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUJsb2NrVHJhbnNpdGlvbiA9ICh7XG4gIHNob3VsZEJsb2NrLFxuICBnZXRCbG9ja2VkTWVzc2FnZSxcbn06IHtcbiAgc2hvdWxkQmxvY2s6IGJvb2xlYW47XG4gIGdldEJsb2NrZWRNZXNzYWdlOiAoZXZ0PzogQmVmb3JlVW5sb2FkRXZlbnQpID0+IHN0cmluZztcbn0pID0+IHtcbiAgLy8gZnVuY3Rpb24gdG8gdW5ibG9jayB0aGUgZm9ybVxuICBjb25zdCB1bmJsb2NrUmVmID0gdXNlUmVmPEZ1bmN0aW9uIHwgdW5kZWZpbmVkPigpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaXNCbG9ja2luZyA9ICEhdW5ibG9ja1JlZi5jdXJyZW50O1xuICAgIGRlYnVnVHJhbnNpdGlvbnMoXG4gICAgICBcInJ1bm5pbmcgZWZmZWN0XCIsXG4gICAgICBcInNob3VsZCBibG9ja1wiLFxuICAgICAgc2hvdWxkQmxvY2ssXG4gICAgICBcImN1cnJlbnRseSBibG9ja2VkXCIsXG4gICAgICBpc0Jsb2NraW5nXG4gICAgKTtcblxuICAgIGNvbnN0IG9uVW5ibG9jayA9ICgpID0+IHtcbiAgICAgIGRlYnVnVHJhbnNpdGlvbnMoXCJydW5uaW5nIHVuYmxvY2sgZnJvbSBlZmZlY3RcIik7XG4gICAgICBpZiAoIXNob3VsZEJsb2NrKSB7XG4gICAgICAgIGlmICh1bmJsb2NrUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICB1bmJsb2NrUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgLy8gYmxvY2tcbiAgICBjb25zdCBvbkJsb2NrZWQgPSAoZXZ0PzogQmVmb3JlVW5sb2FkRXZlbnQpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGdldEJsb2NrZWRNZXNzYWdlKGV2dCk7XG4gICAgICBkZWJ1Z1RyYW5zaXRpb25zKFxuICAgICAgICBcInVzZXIgaXMgYmVpbmcgYmxvY2tlZCBhZnRlciB0cnlpbmcgdG8gbGVhdmUgdGhlIHBhZ2UsIHdpdGggbWVzc2FnZTogXCIgK1xuICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICk7XG4gICAgICBpZiAoZXZ0KSB7XG4gICAgICAgIGV2dC5yZXR1cm5WYWx1ZSA9IG1lc3NhZ2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9O1xuICAgIGlmIChzaG91bGRCbG9jaykge1xuICAgICAgZGVidWdUcmFuc2l0aW9ucyhcbiAgICAgICAgXCJzaG91bGQgYmxvY2sgdHJhbnNpdGlvbiwgc2V0dGluZyB1cCByZWxldmFudCBldmVudCBsaXN0ZW5lclwiXG4gICAgICApO1xuICAgICAgdW5ibG9ja1JlZi5jdXJyZW50ID0gYmxvY2sob25CbG9ja2VkLCBvblVuYmxvY2spO1xuICAgIH1cbiAgICAvLyB1bmJsb2NrIGlmIG5vdCBibG9ja2luZyBhbnltb3JlIGFuZCB3YXMgYmxvY2tpbmcgcHJldmlvdXNseVxuICAgIGlmICghc2hvdWxkQmxvY2sgJiYgaXNCbG9ja2luZykge1xuICAgICAgZGVidWdUcmFuc2l0aW9ucyhcInNob3VsZCB1bmJsb2NrIChzdGF0ZSBoYXMgYmVlbiByZWluaXRpYWxpemVkKVwiKTtcbiAgICAgIGlmICh1bmJsb2NrUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgdW5ibG9ja1JlZi5jdXJyZW50KCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRyaWdnZXIgdGhlIHBvdGVudGlhbGx5IHJlZ2lzdGVyZWQgdW5ibG9jayBmdW5jdGlvbiB3aGVuIGNvbXBvbmVudCB1bm1vdW50c1xuICAgIC8vcmV0dXJuIG9uVW5ibG9jaztcbiAgfSwgW3Nob3VsZEJsb2NrXSk7XG59O1xuIiwiaW1wb3J0IGRlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuY29uc3QgZGVidWdUcmFuc2l0aW9ucyA9IGRlYnVnKFwidm46cm91dGUtdHJhbnNpdGlvblwiKTtcbmNvbnN0IEJlZm9yZVVubG9hZEV2ZW50VHlwZSA9IFwiYmVmb3JldW5sb2FkXCI7XG4vKipcbiAqIEV2ZW50IHRyaWdnZXJlZCB3aGVuIGEgd2FybmluZyBvbiB1bnNhdmVkIGNoYW5nZXMgaXMgbmVjZXNzYXJ5XG4gKiBUaGUgYXBwIHNob3VsZCBsaXN0ZW4gZm9yIHRoaXMgZXZlbnQgdG8gc2V0dXAgcmVsZXZhbnQgYmxvY2tpbmcgbWV0aG9kcyBkZXBlbmRpbmcgb24gdGhlIGZyYW1ld29ya1xuICpcbiAqIEZvciBpbnN0YW5jZSB3aXRoIFJlYWN0IFJvdXRlcjpcbiAqXG4gKiBsZXQgdW5ibG9ja1xuICogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibG9ja3RyYW5zaXRpb25cIiwgKCkgPT4ge1xuICogICAgdW5ibG9jayA9IHJvdXRlci5oaXN0b3J5LmJsb2NrKC4uLilcbiAqIH0pXG4gKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInVuYmxvY2t0cmFuc2l0aW9uXCIsICgpID0+IHtcbiAqICAgIHVuYmxvY2soKVxuICogfSlcbiAqXG4gKiBGb3IgTmV4dC5qcywgeW91IHdvdWxkIGRvIHNvbWV0aGluZyBzaW1pbGFyXG4gKiBDaGVjayBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL25leHQuanMvZGlzY3Vzc2lvbnMvMTIzNDhcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBCTE9DS19UUkFOU0lUSU9OX0VWRU5UX1RZUEUgPSBcImJsb2NrdHJhbnNpdGlvblwiO1xuLyoqXG4gKiBDYWxsZWQgd2hlbiBibG9ja2luZyBpcyBub3QgbmVjZXNzYXJ5IGFueW1vcmU6XG4gKiAtIHRoZXJlIGFyZSBubyB1bnNhdmVkIGNoYW5nZXMgYW55bW9yZVxuICogLSB1c2VyIGhhcyBjb25maXJtZWQgdGhleSB3YW50IHRvIGxlYXZlXG4gKi9cbmV4cG9ydCBjb25zdCBVTkJMT0NLX1RSQU5TSVRJT05fRVZFTlRfVFlQRSA9IFwidW5ibG9ja3RyYW5zaXRpb25cIjtcbi8qKlxuICogSW50ZXJjZXB0cyB0aGUgYmVmb3JldW5sb2FkIGV2ZW50XG4gKlxuICogQ29kZSB0YWtlbiBmcm9tIFJlYWN0IFJvdXRlciBoaXN0b3J5IGZlYXR1cmVcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0VHJhaW5pbmcvaGlzdG9yeS9ibG9iL21hc3Rlci9kb2NzL2Jsb2NraW5nLXRyYW5zaXRpb25zLm1kXG4gKi9cbmZ1bmN0aW9uIGJsb2NrQmVmb3JlVW5sb2FkKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkge1xuICAvLyBDYW5jZWwgdGhlIGV2ZW50LlxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBDaHJvbWUgKGFuZCBsZWdhY3kgSUUpIHJlcXVpcmVzIHJldHVyblZhbHVlIHRvIGJlIHNldC5cbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufVxuXG4vKipcbiAqIEJsb2NrcyB0cmFuc2l0aW9uXG4gKlxuICogLyFcXCBJbiBvcmRlciB0byBjYXRjaCBTUEEgdHJhbnNpdGlvbiwgeW91IG5lZWQgdG8gaW1wbGVtZW50XG4gKiBhbiBldmVudCBsaXN0ZW5lciBpbiB5b3VyIG93biBhcHAuXG4gKlxuICpcbiAqIEBwYXJhbSBvblVuYmxvY2sgQ2FsbGJhY2sgdG8gY2FsbCBvbiB1bmJsb2NrLCBmb3IgY3VzdG9tIGJlaGF2aW91clxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0byB1bmJsb2NrIHRoZSB0cmFuc2l0aW9uIChlZyBpZiB0aGUgZm9ybSBpcyBiYWNrIHRvXG4gKiBpdHMgb3JpZ2luYWwgc3RhdGUpXG4gKi9cbmV4cG9ydCBjb25zdCBibG9jayA9IChcbiAgc2V0Q29uZmlybWF0aW9uTWVzc2FnZTogKGV2ZW50PzogQmVmb3JlVW5sb2FkRXZlbnQpID0+IHN0cmluZyxcbiAgb25VbmJsb2NrPzogRnVuY3Rpb25cbikgPT4ge1xuICBkZWJ1Z1RyYW5zaXRpb25zKFwicnVubmluZyBibG9jayBmdW5jdGlvblwiKTtcbiAgLy8gdHJpZ2dlciBhIGJsb2NrIGV2ZW50LCB0byBiZSBoYW5kbGVkIGF0IHRoZSBmcmFtZXdvcmsgbGV2ZWxcbiAgLy8gVE9ETzogc2V0Q29uZmlybWF0aW9uTWVzc2FnZSBzaG91bGQgYmUgcGFzc2VkIGFzIHdlbGxcbiAgY29uc3QgYmxvY2tFdmVudCA9IG5ldyBFdmVudChCTE9DS19UUkFOU0lUSU9OX0VWRU5UX1RZUEUpO1xuICB3aW5kb3cuZGlzcGF0Y2hFdmVudChibG9ja0V2ZW50KTtcbiAgLy8gYmxvY2sgYXQgYnJvd3NlciBsZXZlbFxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihCZWZvcmVVbmxvYWRFdmVudFR5cGUsIGJsb2NrQmVmb3JlVW5sb2FkKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoQmVmb3JlVW5sb2FkRXZlbnRUeXBlLCBzZXRDb25maXJtYXRpb25NZXNzYWdlKTtcbiAgLy8gcmV0dXJuIGFuIHVuYmxvY2sgZnVuY3Rpb24gdG8gY2FuY2VsXG4gIGNvbnN0IHVuYmxvY2sgPSAoKSA9PiB7XG4gICAgZGVidWdUcmFuc2l0aW9ucyhcInJ1bm5pbmcgdW5ibG9jayBmdW5jdGlvblwiKTtcbiAgICBpZiAob25VbmJsb2NrKSB7XG4gICAgICBkZWJ1Z1RyYW5zaXRpb25zKFwicnVubmluZyB1c2VyIGRlZmluZWQgZnVuY3Rpb25cIik7XG4gICAgICBvblVuYmxvY2soKTsgLy8gY2FsbGJhY2sgZnJvbSB1c2VyIGxhbmRcbiAgICB9XG4gICAgLy8gdHJpZ2dlciBhbiB1bmJsb2NrIGV2ZW50LCB0byBiZSBoYW5kbGVkIGF0IHRoZSBmcmFtZXdvcmsgbGV2ZWxcbiAgICBjb25zdCB1bmJsb2NrRXZlbnQgPSBuZXcgRXZlbnQoVU5CTE9DS19UUkFOU0lUSU9OX0VWRU5UX1RZUEUpO1xuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KHVuYmxvY2tFdmVudCk7XG4gICAgLy8gcmVtb3ZlIHRoZSBicm93c2VyIGxldmVsIGV2ZW50c1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEJlZm9yZVVubG9hZEV2ZW50VHlwZSwgYmxvY2tCZWZvcmVVbmxvYWQpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEJlZm9yZVVubG9hZEV2ZW50VHlwZSwgc2V0Q29uZmlybWF0aW9uTWVzc2FnZSk7XG4gICAgLy8gdW5ibG9jayBicm93c2VyIGNoYW5nZVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cub25iZWZvcmV1bmxvYWQgPSB1bmRlZmluZWQ7IC8vdW5kZWZpbmVkIGluc3RlYWQgb2YgbnVsbCB0byBzdXBwb3J0IElFXG4gIH07XG4gIHJldHVybiB1bmJsb2NrO1xufTtcbiIsIi8qKlxuICogTk9URTogS0VFUCBTRVBBUkFURUQgRlJPTSBUSEUgSE9PS1MgVE8gQ09OU1VNRSBUSEUgQ09OVEVYVFxuICogb3RoZXJ3aXNlIHlvdSdsbCBlbmQgdXAgd2l0aCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmVjYXVzZSBvZiB0aGUgZGVmYXVsdCBjb21wb25lbnRzXG4gKi9cbi8vIFRPRE86IHdlIG1pZ2h0IG5lZWQgdG8gYWRhcHQgdGhlIHByb3ZpZGVyIHRvIG1lcmdlIGl0cyB2YWx1ZSB3aXRoIGEgcG90ZW50aWFsbHkgaGlnaGVyIHVwIGNvbnRleHRcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHsgZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9kZWZhdWx0VnVsY2FuQ29tcG9uZW50c1wiO1xuaW1wb3J0IHsgUG9zc2libGVWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vdHlwaW5nc1wiO1xuaW1wb3J0IHsgVnVsY2FuQ29tcG9uZW50c0NvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vQ29uc3VtZXJcIjtcblxuLyoqXG4gKlxuICogQHBhcmFtIG9wdGlvbnMudmFsdWUgQW4gb2JqZWN0IG9mIFZ1bGNhbiBjb21wb25lbnRzIHRvIGJlIG92ZXJyaWRlbi5cbiAqL1xuZXhwb3J0IGNvbnN0IFZ1bGNhbkNvbXBvbmVudHNQcm92aWRlciA9ICh7XG4gIHZhbHVlLFxuICAuLi5wcm9wc1xufToge1xuICB2YWx1ZT86IFBhcnRpYWw8UG9zc2libGVWdWxjYW5Db21wb25lbnRzPjtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pID0+IHtcbiAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IG1lcmdlZENvbXBvbmVudHMgPSB7XG4gICAgLi4uZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHMsXG4gICAgLy8gbWVyZ2Ugd2l0aCBhIHBhcmVudCBQcm92aWRlciBpZiBuZWVkZWRcbiAgICAuLi4oY3VycmVudENvbXBvbmVudHM/Ll9fbm90X2ludGlhbGl6ZWQgPyB7fSA6IGN1cnJlbnRDb21wb25lbnRzIHx8IHt9KSxcbiAgICAuLi4odmFsdWUgfHwge30pLFxuICB9O1xuICAvLyBGb3IgcHJlc2VydmluZyBkaXNwbGF5TmFtZSwgdGhhdCBpcyBsb3N0IGFmdGVyIGJ1aWxkIHNvbWVob3dcbiAgT2JqZWN0LmtleXMobWVyZ2VkQ29tcG9uZW50cykuZm9yRWFjaCgoY29tcG9uZW50TmFtZSkgPT4ge1xuICAgIG1lcmdlZENvbXBvbmVudHNbY29tcG9uZW50TmFtZV0uZGlzcGxheU5hbWUgPSBjb21wb25lbnROYW1lO1xuICB9KTtcbiAgcmV0dXJuIChcbiAgICA8VnVsY2FuQ29tcG9uZW50c0NvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXttZXJnZWRDb21wb25lbnRzfSAvLyBtZXJnZSBwcm92aWRlZCBjb21wb25lbnRzIHNvIHRoZSB1c2VyIGNhbiBwcm92aWRlIG9ubHkgYSBwYXJ0aWFsIHJlcGxhY2VtZW50XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKTtcbn07XG4iLCJpbXBvcnQgeyBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5pbXBvcnQgeyBGb3JtRXJyb3IgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtRXJyb3JcIjtcbi8vIFRPRE86IGN1cnJlbnRseSB3ZSBuZWVkIHRoZSBkZWZhdWx0IGV4cG9ydCBiZWNhdXNlIHdlIHBhc3MgY29tcG9uZW50cyBtYW51YWxseVxuaW1wb3J0IEZvcm1Db21wb25lbnQgZnJvbSBcIi4uL2Zvcm0vRm9ybUNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRm9ybUNvbXBvbmVudElubmVyIH0gZnJvbSBcIi4uL2Zvcm0vRm9ybUNvbXBvbmVudElubmVyXCI7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50TG9hZGVyIH0gZnJvbSBcIi4uL2Zvcm0vRm9ybUNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtRWxlbWVudFwiO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtR3JvdXBMYXlvdXQsIEZvcm1Hcm91cEhlYWRlciB9IGZyb20gXCIuLi9mb3JtL0Zvcm1Hcm91cFwiO1xuaW1wb3J0IHsgRm9ybUludGwsIEZvcm1JbnRsSXRlbUxheW91dCwgRm9ybUludGxMYXlvdXQgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtSW50bFwiO1xuaW1wb3J0IHsgRm9ybUVycm9ycyB9IGZyb20gXCIuLi9mb3JtL0Zvcm1FcnJvcnNcIjtcbmltcG9ydCB7IEZvcm1TdWJtaXQgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtU3VibWl0XCI7XG5pbXBvcnQgeyBGb3JtTGF5b3V0IH0gZnJvbSBcIi4uL2Zvcm0vRm9ybUxheW91dFwiO1xuaW1wb3J0IHtcbiAgRm9ybU5lc3RlZEFycmF5LFxuICBGb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dCxcbiAgSWNvbkFkZCxcbiAgSWNvblJlbW92ZSxcbn0gZnJvbSBcIi4uL2Zvcm0vRm9ybU5lc3RlZEFycmF5XCI7XG5pbXBvcnQgeyBGb3JtTmVzdGVkQXJyYXlMYXlvdXQgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtTmVzdGVkQXJyYXlMYXlvdXRcIjtcbmltcG9ydCB7IEZvcm1OZXN0ZWRJdGVtLCBGb3JtTmVzdGVkSXRlbUxheW91dCB9IGZyb20gXCIuLi9mb3JtL0Zvcm1OZXN0ZWRJdGVtXCI7XG5pbXBvcnQgeyBGb3JtTmVzdGVkRGl2aWRlciB9IGZyb20gXCIuLi9mb3JtL0Zvcm1OZXN0ZWREaXZpZGVyXCI7XG5pbXBvcnQgeyBGaWVsZEVycm9ycyB9IGZyb20gXCIuLi9mb3JtL0ZpZWxkRXJyb3JzXCI7XG5pbXBvcnQge1xuICBGb3JtTmVzdGVkT2JqZWN0LFxuICBGb3JtTmVzdGVkT2JqZWN0TGF5b3V0LFxufSBmcm9tIFwiLi4vZm9ybS9Gb3JtTmVzdGVkT2JqZWN0XCI7XG5pbXBvcnQgeyBGb3JtT3B0aW9uTGFiZWwgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtT3B0aW9uTGFiZWxcIjtcbmltcG9ydCB7IEZvcm0gfSBmcm9tIFwiLi4vZm9ybS9Gb3JtXCI7XG5cbmltcG9ydCB7XG4gIEZvcm1Db21wb25lbnREZWZhdWx0LFxuICBGb3JtQ29tcG9uZW50UGFzc3dvcmQsXG4gIEZvcm1Db21wb25lbnROdW1iZXIsXG4gIEZvcm1Db21wb25lbnRVcmwsXG4gIEZvcm1Db21wb25lbnRFbWFpbCxcbiAgRm9ybUNvbXBvbmVudFRleHRhcmVhLFxuICBGb3JtQ29tcG9uZW50Q2hlY2tib3gsXG4gIEZvcm1Db21wb25lbnRDaGVja2JveEdyb3VwLFxuICBGb3JtQ29tcG9uZW50UmFkaW9Hcm91cCxcbiAgRm9ybUNvbXBvbmVudFNlbGVjdCxcbiAgRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlLFxuICBGb3JtQ29tcG9uZW50RGF0ZVRpbWUsXG4gIEZvcm1Db21wb25lbnREYXRlLFxuICBGb3JtQ29tcG9uZW50VGltZSxcbiAgRm9ybUNvbXBvbmVudFN0YXRpY1RleHQsXG4gIEZvcm1Db21wb25lbnRMaWtlcnQsXG4gIC8vIHVzZWQgYnkgdWktYm9vdHN0cmFwIGFuZCB1aS1tYXRlcmlhbFxuICBGb3JtSXRlbSxcbiAgRm9ybUNvbXBvbmVudEF1dG9jb21wbGV0ZSxcbn0gZnJvbSBcIi4uL2Zvcm0vaW5wdXRzL0Jhc2ljSW5wdXRzXCI7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVNdWx0aXBsZSB9IGZyb20gXCIuLi9mb3JtL2lucHV0cy9BdXRvY29tcGxldGVNdWx0aXBsZVwiO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSBcIi4uL2Zvcm0vY29yZS9CdXR0b25cIjtcbmltcG9ydCB7IExvYWRpbmcgfSBmcm9tIFwiLi4vZm9ybS9jb3JlL0xvYWRpbmdcIjtcblxuaW1wb3J0IHsgTG9hZGluZ0J1dHRvbiB9IGZyb20gXCIuLi9Mb2FkaW5nQnV0dG9uXCI7XG5pbXBvcnQgeyBNdXRhdGlvbkJ1dHRvbiB9IGZyb20gXCIuLi9NdXRhdGlvbkJ1dHRvblwiO1xuaW1wb3J0IHsgSGVhZFRhZ3MgfSBmcm9tIFwiLi4vSGVhZFRhZ3NcIjtcblxuLy8gVE9ETzogcmV3cml0ZSB0byByZW1vdmUgZGVwIHRvIHJlYWN0LWJvb3RzdHJhcFxuaW1wb3J0IHsgVG9vbHRpcFRyaWdnZXIgfSBmcm9tIFwiLi4vYm9vdHN0cmFwL1Rvb2x0aXBUcmlnZ2VyXCI7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4uL2Jvb3RzdHJhcC9Ecm9wZG93blwiO1xuXG5pbXBvcnQgeyBQb3NzaWJsZUNvcmVDb21wb25lbnRzLCBQb3NzaWJsZUZvcm1Db21wb25lbnRzIH0gZnJvbSBcIi4vdHlwaW5nc1wiO1xuXG5jb25zdCBkZWZhdWx0Q29yZUNvbXBvbmVudHM6IFBvc3NpYmxlQ29yZUNvbXBvbmVudHMgPSB7XG4gIC8vIGNvcmUgY29tcG9uZW50cyB0YWh0IHdlcmUgdXNlZCBpbiBmb3Jtc1xuICBMb2FkaW5nLFxuICBBbGVydDogKCkgPT4gbnVsbCxcbiAgQnV0dG9uLFxuICBJY29uOiAoKSA9PiBudWxsLFxuICAvLyBpMThuXG4gIEZvcm1hdHRlZE1lc3NhZ2UsXG4gIC8vIGNvcmVcbiAgTG9hZGluZ0J1dHRvbixcbiAgTXV0YXRpb25CdXR0b24sXG4gIEhlYWRUYWdzLFxuICAvL1xuICBUb29sdGlwVHJpZ2dlcixcbiAgRHJvcGRvd24sXG59O1xuY29uc3QgZGVmYXVsdEZvcm1Db21wb25lbnRzOiBQb3NzaWJsZUZvcm1Db21wb25lbnRzID0ge1xuICBGb3JtRXJyb3IsIC8vIHVzZWQgYnk6IEZpZWxkRXJyb3JzXG4gIC8vIFRvIGJlIGRlZmluZWQgYnkgdGhlIFVJIGZyYW1ld29ya1xuICAvLyBUT0RPOiBhZGQgZGVmYXVsdHMgaW4gUmVhY3QgY29tcG9uZW50c1xuICBGb3JtQ29tcG9uZW50RGVmYXVsdCxcbiAgRm9ybUNvbXBvbmVudFBhc3N3b3JkLFxuICBGb3JtQ29tcG9uZW50TnVtYmVyLFxuICBGb3JtQ29tcG9uZW50VXJsLFxuICBGb3JtQ29tcG9uZW50RW1haWwsXG4gIEZvcm1Db21wb25lbnRUZXh0YXJlYSxcbiAgRm9ybUNvbXBvbmVudENoZWNrYm94LFxuICBGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cCxcbiAgRm9ybUNvbXBvbmVudFJhZGlvR3JvdXAsXG4gIEZvcm1Db21wb25lbnRTZWxlY3QsXG4gIEZvcm1Db21wb25lbnRTZWxlY3RNdWx0aXBsZSxcbiAgRm9ybUNvbXBvbmVudERhdGVUaW1lLFxuICBGb3JtQ29tcG9uZW50RGF0ZSxcbiAgLy9Gb3JtQ29tcG9uZW50RGF0ZTIsXG4gIEZvcm1Db21wb25lbnRUaW1lLFxuICBGb3JtQ29tcG9uZW50U3RhdGljVGV4dCxcbiAgRm9ybUNvbXBvbmVudExpa2VydCxcbiAgLy9Gb3JtQ29tcG9uZW50QXV0b2NvbXBsZXRlLFxuICAvL0Zvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZSxcbiAgLy8gQ29tcG9uZW50cyBkZWZpbmVkIGluIGRlZmF1bHQgdnVsY2FuL2Zvcm1zXG4gIEZvcm1Db21wb25lbnQsXG4gIEZvcm1Db21wb25lbnRJbm5lcixcbiAgRm9ybUNvbXBvbmVudExvYWRlcixcbiAgRm9ybUVsZW1lbnQsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUdyb3VwTGF5b3V0LFxuICBGb3JtR3JvdXBIZWFkZXIsXG4gIEZvcm1JbnRsLFxuICBGb3JtSW50bEl0ZW1MYXlvdXQsXG4gIEZvcm1JbnRsTGF5b3V0LFxuXG4gIC8vIExheW91dFxuICBGaWVsZEVycm9ycyxcbiAgRm9ybUVycm9ycyxcbiAgRm9ybVN1Ym1pdCxcbiAgRm9ybUxheW91dCxcblxuICBGb3JtTmVzdGVkQXJyYXksXG4gIEZvcm1OZXN0ZWRBcnJheUlubmVyTGF5b3V0LFxuICBGb3JtTmVzdGVkQXJyYXlMYXlvdXQsXG4gIEZvcm1OZXN0ZWRJdGVtLFxuICBJY29uQWRkLFxuICBJY29uUmVtb3ZlLFxuICBGb3JtTmVzdGVkRGl2aWRlcixcbiAgLy8gbmVzdGVkIGl0ZW1cbiAgRm9ybU5lc3RlZEl0ZW1MYXlvdXQsXG4gIEZvcm1OZXN0ZWRPYmplY3RMYXlvdXQsXG4gIEZvcm1OZXN0ZWRPYmplY3QsXG4gIEZvcm1PcHRpb25MYWJlbCxcbiAgLy9cbiAgRm9ybSxcbiAgLy9cbiAgRm9ybUl0ZW0sXG4gIEZvcm1Db21wb25lbnRBdXRvY29tcGxldGUsXG4gIEZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZTogQXV0b2NvbXBsZXRlTXVsdGlwbGUsXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHMgPSB7XG4gIC4uLmRlZmF1bHRDb3JlQ29tcG9uZW50cyxcbiAgLi4uZGVmYXVsdEZvcm1Db21wb25lbnRzLFxufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbi8vIGltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbi8vIGltcG9ydCBnZXRDb250ZXh0IGZyb20gJ3JlY29tcG9zZS9nZXRDb250ZXh0Jztcbi8vIGltcG9ydCB7IENvbXBvbmVudHMsIHJlZ2lzdGVyQ29tcG9uZW50IH0gZnJvbSAnbWV0ZW9yL3Z1bGNhbjpjb3JlJztcbmltcG9ydCBnZXQgZnJvbSBcImxvZGFzaC9nZXRcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuXG5leHBvcnQgY29uc3QgRm9ybUVycm9yID0gKHsgZXJyb3IsIGVycm9yQ29udGV4dCB9KSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IHsgZ2V0TGFiZWwgfSA9IHVzZUZvcm1Db250ZXh0KCk7XG4gIC8vIHVzZSB0aGUgZXJyb3Igb3IgZXJyb3IgbWVzc2FnZSBhcyBkZWZhdWx0IG1lc3NhZ2VcbiAgY29uc3QgZGVmYXVsdE1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShlcnJvci5tZXNzYWdlIHx8IGVycm9yKTtcbiAgY29uc3QgaWQgPSBlcnJvci5pZCB8fCBcImFwcC5kZWZhdWx0RXJyb3JcIjtcblxuICAvLyBkZWZhdWx0IHByb3BzIGZvciBhbGwgZXJyb3JzXG4gIGxldCBtZXNzYWdlUHJvcHMgPSB7XG4gICAgaWQsXG4gICAgZGVmYXVsdE1lc3NhZ2UsXG4gICAgdmFsdWVzOiB7XG4gICAgICBlcnJvckNvbnRleHQsXG4gICAgICBkZWZhdWx0TWVzc2FnZSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBlbmhhbmNlIHRoZSBtZXNzYWdlXG4gIGlmIChlcnJvci5wcm9wZXJ0aWVzKSB7XG4gICAgLy8gaW4gY2FzZSB0aGlzIGlzIGEgbmVzdGVkIGZpZWxkcywgb25seSBrZWVwIGxhc3Qgc2VnbWVudCBvZiBwYXRoXG4gICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgIGVycm9yLnByb3BlcnRpZXMubmFtZSAmJiBlcnJvci5wcm9wZXJ0aWVzLm5hbWUuc3BsaXQoXCIuXCIpLnNsaWNlKC0xKVswXTtcbiAgICBtZXNzYWdlUHJvcHMudmFsdWVzID0ge1xuICAgICAgLi4ubWVzc2FnZVByb3BzLnZhbHVlcyxcbiAgICAgIC8vIGlmIHRoZSBlcnJvciBpcyB0cmlnZ2VyZWQgYnkgYSBmaWVsZCwgZ2V0IHRoZSByZWxldmFudCBsYWJlbFxuICAgICAgbGFiZWw6IGVycm9yTmFtZSAmJiBnZXRMYWJlbChlcnJvck5hbWUsIGVycm9yLnByb3BlcnRpZXMubG9jYWxlKSxcbiAgICAgIC4uLmVycm9yLnByb3BlcnRpZXMsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChlcnJvci5kYXRhKSB7XG4gICAgbWVzc2FnZVByb3BzLnZhbHVlcyA9IHtcbiAgICAgIC4uLm1lc3NhZ2VQcm9wcy52YWx1ZXMsXG4gICAgICAuLi5lcnJvci5kYXRhLCAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIH07XG4gIH1cblxuICBjb25zdCBleGNlcHRpb24gPSBnZXQoZXJyb3IsIFwiZXh0ZW5zaW9ucy5leGNlcHRpb25cIik7XG4gIGlmIChleGNlcHRpb24pIHtcbiAgICBtZXNzYWdlUHJvcHMgPSB7XG4gICAgICAuLi5tZXNzYWdlUHJvcHMsXG4gICAgICBpZDogZXhjZXB0aW9uLmlkLFxuICAgICAgdmFsdWVzOiBleGNlcHRpb24uZGF0YSxcbiAgICB9O1xuICB9XG4gIHJldHVybiA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtYXR0ZWRNZXNzYWdlIGh0bWw9e3RydWV9IHsuLi5tZXNzYWdlUHJvcHN9IC8+O1xufTtcblxuRm9ybUVycm9yLmRlZmF1bHRQcm9wcyA9IHtcbiAgZXJyb3JDb250ZXh0OiBcIlwiLCAvLyBkZWZhdWx0IGNvbnRleHQgc28gZm9ybWF0IG1lc3NhZ2UgZG9lcyBub3QgY29tcGxhaW5cbn07XG4iLCIvKipcbiAqIFRPRE86IHJlbmFtZSBcIkZpZWxkQ29tcG9uZW50XCIgdG8gY2xhcmlmeVxuICogQ2hhbmdlIGNvbXBhcmVkIHRvIE1ldGVvcjpcbiAqIC0gY3VzdG9tIGlucHV0cyBjYW5ub3QgYmUgYSByZWZlcmVuY2UgYW55bW9yZSwgeW91IG5lZWQgdG8gcGFzcyB0aGUgd2hvbGUgY29tcG9uZW50IGFuZCBub3QganVzdCB0aGUgbmFtZVxuICogLSBGb3JtQ29tcG9uZW50cyBjb250ZXh0IGlzIGxpbWl0ZWQgdG8gZGVmYXVsdCBjb21wb25lbnQuIE90aGVyIGNvbXBvbmVudHMgbXVzdCBiZSBwYXNzZWQgdGhyb3VnaCB0aGUgc2NoZW1hIGluc3RlYWRcbiAqIChpdCBtZWFucyB5b3UgY2FuJ3QgZXh0ZW5kIHRoZSBTbWFydEZvcm0gd2l0aCBuZXcgaW5wdXRUeXBlLCBpbnN0ZWFkIHVzZSBhIGZ1bGx5IGN1c3RvbSBpbnB1dClcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudFR5cGUsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBnZXQgZnJvbSBcImxvZGFzaC9nZXRcIjtcbmltcG9ydCBTaW1wbGVTY2hlbWEgZnJvbSBcInNpbXBsLXNjaGVtYVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlLCBnZXROdWxsVmFsdWUgfSBmcm9tIFwiLi9tb2R1bGVzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFBvc3NpYmxlRm9ybUNvbXBvbmVudHMsXG4gIFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cyxcbn0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvdHlwaW5nc1wiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyBGb3JtRmllbGQgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQge1xuICBWdWxjYW5GaWVsZFNjaGVtYSxcbiAgVnVsY2FuRmllbGRJbnB1dCxcbiAgVnVsY2FuRmllbGRUeXBlLFxufSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHsgZ2V0QXV0b0lucHV0RnJvbVR5cGUgfSBmcm9tIFwiLi9pbnB1dHMvY29uc3RzXCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5cbmNvbnN0IGdldENoYXJhY3RlckNvdW50cyA9ICh2YWx1ZTogYW55LCBtYXg6IG51bWJlcikgPT4ge1xuICBjb25zdCBjaGFyYWN0ZXJDb3VudDogbnVtYmVyID0gdmFsdWUgJiYgdmFsdWUubGVuZ3RoID8gdmFsdWUubGVuZ3RoIDogMDtcbiAgcmV0dXJuIHsgY2hhcnNSZW1haW5pbmc6IG1heCAtIGNoYXJhY3RlckNvdW50LCBjaGFyc0NvdW50OiBjaGFyYWN0ZXJDb3VudCB9O1xufTtcblxuLyoqXG4gKiBHZXQgZmllbGQgcGF0aCwgdGFraW5nIGludGxJbnB1dCBmaWVsZHMgaW50byBhY2NvdW50XG4gKi9cbmNvbnN0IGdldFBhdGggPSAoe1xuICBpbnRsSW5wdXQsXG4gIHBhdGgsXG59OiB7XG4gIGludGxJbnB1dD86IGJvb2xlYW47XG4gIHBhdGg6IHN0cmluZztcbn0pID0+IHtcbiAgcmV0dXJuIGludGxJbnB1dCA/IGAke3BhdGh9X2ludGxgIDogcGF0aDtcbn07XG5cbmNvbnN0IGdldENoYXJhY3RlckNvdW50c0Zyb21Qcm9wcyA9ICh7XG4gIGRvY3VtZW50LFxuICBtYXgsXG4gIGludGxJbnB1dCxcbiAgcGF0aCxcbn06IFBpY2s8Rm9ybUNvbXBvbmVudFByb3BzLCBcImRvY3VtZW50XCIgfCBcIm1heFwiIHwgXCJpbnRsSW5wdXRcIiB8IFwicGF0aFwiPikgPT4ge1xuICBpZiAoIW1heCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGZpZWxkUGF0aCA9IGdldFBhdGgoeyBpbnRsSW5wdXQsIHBhdGggfSk7XG4gIGNvbnN0IGludGxPclJlZ3VsYXJWYWx1ZSA9IGRvY3VtZW50Py5bZmllbGRQYXRoXTtcbiAgY29uc3QgdmFsdWUgPVxuICAgIGludGxPclJlZ3VsYXJWYWx1ZSAmJiB0eXBlb2YgaW50bE9yUmVndWxhclZhbHVlID09PSBcIm9iamVjdFwiXG4gICAgICA/IGludGxPclJlZ3VsYXJWYWx1ZS52YWx1ZVxuICAgICAgOiBpbnRsT3JSZWd1bGFyVmFsdWU7XG4gIHJldHVybiBnZXRDaGFyYWN0ZXJDb3VudHModmFsdWUsIG1heCk7XG59O1xuXG4vLyBUT0RPOiBtb3ZlIHRvIHNjaGVtYSBoZWxwZXJzXG5jb25zdCBpc0FycmF5RmllbGQgPSAodHlwZTogVnVsY2FuRmllbGRTY2hlbWFbXCJ0eXBlXCJdKSA9PiB7XG4gIHJldHVybiB0eXBlID09PSBBcnJheTtcbn07XG5cbi8vIFRPRE86IG5vdCB1cCB0byBkYXRlXG5jb25zdCBpc09iamVjdEZpZWxkID0gKHR5cGU6IFZ1bGNhbkZpZWxkU2NoZW1hW1widHlwZVwiXSkgPT4ge1xuICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFNpbXBsZVNjaGVtYTtcbn07XG5cbi8qXG5cbiAgR2V0IGZvcm0gaW5wdXQgdHlwZSwgZWl0aGVyIGJhc2VkIG9uIGlucHV0IHByb3BzLCBvciBieSBndWVzc2luZyBiYXNlZCBvbiBmb3JtIGZpZWxkIHR5cGVcblxuICAqL1xuY29uc3QgZ2V0SW5wdXROYW1lID0gKGZpZWxkVHlwZTogVnVsY2FuRmllbGRUeXBlLCBpbnB1dD86IFZ1bGNhbkZpZWxkSW5wdXQpID0+IHtcbiAgaWYgKGlucHV0KSByZXR1cm4gaW5wdXQ7XG4gIHJldHVybiBnZXRBdXRvSW5wdXRGcm9tVHlwZShmaWVsZFR5cGUpO1xufTtcblxuLypcbiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgaW5wdXQgdHlwZSBpcyBhIGN1c3RvbVxuICBOT1RFOiBpdCBhbHNvIGFjY2VwdCBub24tc3RhbmRhcmQgbmFtZSwgaWYgeW91IHdhbnQgdG8gYWRkIGEgbmV3IHR5cGUgb2YgSW5wdXQgaW4gdGhlIGNvbnRleHRcbiAgKi9cbi8qXG5jb25zdCBpc0N1c3RvbUlucHV0ID0gKGlucHV0VHlwZTogVnVsY2FuRmllbGRJbnB1dCkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0VHlwZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGlzU3RhbmRhcmRJbnB1dCA9IGFsbFZ1bGNhbklucHV0cy5pbmNsdWRlcyhpbnB1dFR5cGUpO1xuICByZXR1cm4gIWlzU3RhbmRhcmRJbnB1dDtcbn07XG4qL1xuXG4vKlxuXG4gIEZ1bmN0aW9uIHBhc3NlZCB0byBGb3JtQ29tcG9uZW50SW5uZXIgdG8gaGVscCB3aXRoIHJlbmRlcmluZyB0aGUgY29tcG9uZW50XG5cbiAgKi9cbmNvbnN0IGdldEZvcm1JbnB1dCA9ICh7XG4gIHR5cGUsXG4gIGlucHV0LFxuICBGb3JtQ29tcG9uZW50cyxcbn06IHtcbiAgdHlwZTogVnVsY2FuRmllbGRUeXBlO1xuICBpbnB1dDogVnVsY2FuRmllbGRJbnB1dDtcbiAgRm9ybUNvbXBvbmVudHM6IFBvc3NpYmxlRm9ybUNvbXBvbmVudHM7XG59KTogLy8gVE9ETzogd2UgY291bGQgdHlwZSB0aGUgcHJvcHMgaGVyZSwgaXQncyBhbiBJbnB1dENvbXBvbmVudCB0byBiZSBtb3JlIHByZWNpc2VcbkNvbXBvbmVudFR5cGUgPT4ge1xuICAvLyBpZiBpbnB1dCBpcyBhIFJlYWN0IGNvbXBvbmVudCwgdXNlIGl0XG4gIC8vIE5PVEU6IGRvZXMgaXQgd29yayB3aXRoIGNsYXNzIGNvbXBvbmVudHM/XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IElucHV0Q29tcG9uZW50ID0gaW5wdXQ7XG4gICAgcmV0dXJuIElucHV0Q29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGlucHV0TmFtZSA9IGdldElucHV0TmFtZSh0eXBlLCBpbnB1dCk7XG4gICAgLy8gZWxzZSBwaWNrIGEgcHJlZGVmaW5lZCBjb21wb25lbnRcbiAgICBzd2l0Y2ggKGlucHV0TmFtZSkge1xuICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnREZWZhdWx0O1xuXG4gICAgICBjYXNlIFwicGFzc3dvcmRcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRQYXNzd29yZDtcblxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudE51bWJlcjtcblxuICAgICAgY2FzZSBcInVybFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFVybDtcblxuICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50RW1haWw7XG5cbiAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFRleHRhcmVhO1xuXG4gICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRDaGVja2JveDtcblxuICAgICAgY2FzZSBcImNoZWNrYm94Z3JvdXBcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRDaGVja2JveEdyb3VwO1xuXG4gICAgICBjYXNlIFwicmFkaW9ncm91cFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFJhZGlvR3JvdXA7XG5cbiAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRTZWxlY3Q7XG5cbiAgICAgIGNhc2UgXCJzZWxlY3RtdWx0aXBsZVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlO1xuXG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnREYXRlVGltZTtcblxuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnREYXRlO1xuXG4gICAgICAvLyBjYXNlIFwiZGF0ZTJcIjpcbiAgICAgIC8vICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnREYXRlMjtcblxuICAgICAgY2FzZSBcInRpbWVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRUaW1lO1xuXG4gICAgICBjYXNlIFwic3RhdGljdGV4dFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFN0YXRpY1RleHQ7XG5cbiAgICAgIGNhc2UgXCJsaWtlcnRcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRMaWtlcnQ7XG5cbiAgICAgIGNhc2UgXCJhdXRvY29tcGxldGVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRBdXRvY29tcGxldGU7XG5cbiAgICAgIGNhc2UgXCJtdWx0aWF1dG9jb21wbGV0ZVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudE11bHRpQXV0b2NvbXBsZXRlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9WdWxjYW5KUy92dWxjYW4tbnBtL3B1bGwvMzEgZGlzY3Vzc2lvbnMgYWJvdXQgY3VzdG9tIGNvbXBvbmVudHMgc3VwcG9ydCBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW5wdXQgbmFtZSBcIiR7aW5wdXROYW1lfVwiIGlzIG5vdCBhIHN0YW5kYXJkIFZ1bGNhbiBmb3JtIGlucHV0ICh0eXBlOiAke3R5cGV9LCBpbnB1dDogJHtpbnB1dH0pYFxuICAgICAgICApO1xuICAgIH1cbiAgfVxufTtcblxudHlwZSBPcHRpb25zPFRGaWVsZCA9IGFueT4gPSBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBURmllbGQgfT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbXBvbmVudFByb3BzPFRGaWVsZCA9IGFueT4gZXh0ZW5kcyBGb3JtRmllbGQge1xuICBkb2N1bWVudDogYW55O1xuICBkYXRhdHlwZTogVnVsY2FuRmllbGRUeXBlOyAvLyBUT0RPOiB0eXBlIG9mIHRoZSBmaWVsZCwgcmVwbGFjZSB0aGlzIGJ5IGEgY2xlYW5lciB2YWx1ZSBsaWtlIHdlIGRvIGluIGdyYXBocWwgdG8gZ2V0IHRoZSBmaWVsZCB0eXBlXG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBlcnJvcnM6IEFycmF5PGFueT47XG4gIC8qKiBIZWxwIHRleHQgZm9yIHRoZSBmb3JtICovXG4gIGhlbHA/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIG9mIHRoZSBmaWVsZCBpZiBuZXN0ZWQgKi9cbiAgcGF0aDogc3RyaW5nO1xuICBkZWZhdWx0VmFsdWU/OiBURmllbGQ7XG4gIG1heD86IG51bWJlcjtcbiAgbG9jYWxlPzogc3RyaW5nO1xuICAvKiogSW5wdXQgZm9yIHRoaXMgZmllbGQgKi9cbiAgaW5wdXQ/OiBWdWxjYW5GaWVsZElucHV0IHwgc3RyaW5nIHwgUmVhY3QuQ29tcG9uZW50O1xuICBmb3JtVHlwZTogXCJuZXdcIiB8IFwiZWRpdFwiOyAvLyBuZXcgb3IgZWRpdFxuICBpbnRsSW5wdXQ/OiBib29sZWFuO1xuICBuZXN0ZWRJbnB1dD86IGJvb2xlYW47XG4gIC8qKiBHcmFwaHFsIHF1ZXJ5IHlvdSBjYW4gcGFzcyB0byBmZXRjaCB0aGUgb3B0aW9ucyBhc3luY2hyb25vdXNseSAqL1xuICBxdWVyeT86IHN0cmluZztcbiAgb3B0aW9ucz86IE9wdGlvbnMgfCAoKGZjaVByb3BzPzogYW55KSA9PiBPcHRpb25zKTtcbiAgdnVsY2FuQ29tcG9uZW50cz86IFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cztcbn1cbi8qKlxuICogQ29tcG9uZW50IGZvciB0aGUgZGlzcGxheSBvZiBhbnkgZmllbGQgb2YgdGhlIGZvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnQgPSAocHJvcHM6IEZvcm1Db21wb25lbnRQcm9wcykgPT4ge1xuICAvKlxuICBUT0RPOiByZXBsYWNlIHdpdGggYSB1c2VNZW1vXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgIC8vIGFsbG93IGN1c3RvbSBjb250cm9scyB0byBkZXRlcm1pbmUgaWYgdGhleSBzaG91bGQgdXBkYXRlXG4gICAgaWYgKHRoaXMuaXNDdXN0b21JbnB1dCh0aGlzLmdldElucHV0VHlwZShuZXh0UHJvcHMpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgeyBkb2N1bWVudCwgZGVsZXRlZFZhbHVlcywgZXJyb3JzIH0gPSBuZXh0UHJvcHM7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgodGhpcy5wcm9wcyk7XG5cbiAgICAvLyB3aGVuIGNoZWNraW5nIGZvciBkZWxldGVkIHZhbHVlcywgYm90aCBjdXJyZW50IHBhdGggKCdmb28nKSBhbmQgY2hpbGQgcGF0aCAoJ2Zvby4wLmJhcicpIHNob3VsZCB0cmlnZ2VyIHVwZGF0ZXNcbiAgICBjb25zdCBpbmNsdWRlc1BhdGhPckNoaWxkcmVuID0gKGRlbGV0ZWRWYWx1ZXMpID0+XG4gICAgICBkZWxldGVkVmFsdWVzLnNvbWUoKGRlbGV0ZWRQYXRoKSA9PiBkZWxldGVkUGF0aC5pbmNsdWRlcyhwYXRoKSk7XG5cbiAgICBjb25zdCB2YWx1ZUNoYW5nZWQgPSAhaXNFcXVhbChcbiAgICAgIGdldChkb2N1bWVudCwgcGF0aCksXG4gICAgICBnZXQodGhpcy5wcm9wcy5kb2N1bWVudCwgcGF0aClcbiAgICApO1xuICAgIGNvbnN0IGVycm9yQ2hhbmdlZCA9ICFpc0VxdWFsKHRoaXMuZ2V0RXJyb3JzKGVycm9ycyksIHRoaXMuZ2V0RXJyb3JzKCkpO1xuICAgIGNvbnN0IGRlbGV0ZUNoYW5nZWQgPVxuICAgICAgaW5jbHVkZXNQYXRoT3JDaGlsZHJlbihkZWxldGVkVmFsdWVzKSAhPT1cbiAgICAgIGluY2x1ZGVzUGF0aE9yQ2hpbGRyZW4odGhpcy5wcm9wcy5kZWxldGVkVmFsdWVzKTtcbiAgICBjb25zdCBjaGFyc0NoYW5nZWQgPSBuZXh0U3RhdGUuY2hhcnNSZW1haW5pbmcgIT09IHRoaXMuc3RhdGUuY2hhcnNSZW1haW5pbmc7XG4gICAgY29uc3QgZGlzYWJsZWRDaGFuZ2VkID0gbmV4dFByb3BzLmRpc2FibGVkICE9PSB0aGlzLnByb3BzLmRpc2FibGVkO1xuICAgIGNvbnN0IGhlbHBDaGFuZ2VkID0gbmV4dFByb3BzLmhlbHAgIT09IHRoaXMucHJvcHMuaGVscDtcblxuICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9XG4gICAgICB2YWx1ZUNoYW5nZWQgfHxcbiAgICAgIGVycm9yQ2hhbmdlZCB8fFxuICAgICAgZGVsZXRlQ2hhbmdlZCB8fFxuICAgICAgY2hhcnNDaGFuZ2VkIHx8XG4gICAgICBkaXNhYmxlZENoYW5nZWQgfHxcbiAgICAgIGhlbHBDaGFuZ2VkO1xuXG4gICAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbiAgfSovXG5cbiAgY29uc3Qge1xuICAgIGxvY2FsZSxcbiAgICBtYXgsXG4gICAgcGF0aCxcbiAgICAvL3R5cGUsXG4gICAgZGF0YXR5cGUsXG4gICAgaW5wdXQsXG4gICAgaW50bElucHV0LFxuICAgIG5lc3RlZElucHV0LFxuICAgIHF1ZXJ5LFxuICAgIG9wdGlvbnMsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgeyB1cGRhdGVDdXJyZW50VmFsdWVzLCBkZWxldGVkVmFsdWVzLCBjbGVhckZpZWxkRXJyb3JzIH0gPVxuICAgIHVzZUZvcm1Db250ZXh0KCk7XG5cbiAgY29uc3QgdHlwZSA9IGRhdGF0eXBlO1xuICBjb25zdCBjb3VudEZyb21Qcm9wcyA9IGdldENoYXJhY3RlckNvdW50c0Zyb21Qcm9wcyhwcm9wcyk7XG4gIC8vIGVxdWl2YWxlbnQgdG8gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG4gIGNvbnN0IFtjaGFyc0NvdW50U3RhdGUsIHNldENoYXJhY3RlckNvdW50c10gPVxuICAgIHVzZVN0YXRlPHtcbiAgICAgIGNoYXJzQ291bnQ6IG51bWJlcjtcbiAgICAgIGNoYXJzUmVtYWluaW5nOiBudW1iZXI7XG4gICAgfSB8IG51bGw+KGNvdW50RnJvbVByb3BzKTtcblxuICAvLyBUT0RPOiBtb3ZlIHRoaXMgbG9naWMgc29tZXdoZXJlIGVsc2UsIGFzIGl0IGlzIHNwZWNpZmljIHRvIFN0cmluZyBjb21wb25lbnRzLlxuICAvLyBFZyB1c2luZyBhbiBpbnRlcm1lZGlhdGUgRm9ybUNvbXBvbmVudFRleHRcbiAgLypcbiAgVXBkYXRlcyB0aGUgc3RhdGUgb2YgY2hhcnNDb3VudCBhbmQgY2hhcnNSZW1haW5pbmcgYXMgdGhlIHVzZXJzIHR5cGVzXG4gICovXG4gIGNvbnN0IHVwZGF0ZUNoYXJhY3RlckNvdW50ID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKCFtYXgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IHVwZGF0ZSBjaGFyYWN0ZXIgY291bnQgd2hlbiBubyBtYXggdmFsdWUgaXMgc2V0LlwiXG4gICAgICApO1xuICAgIHNldENoYXJhY3RlckNvdW50cyhnZXRDaGFyYWN0ZXJDb3VudHModmFsdWUsIG1heCkpO1xuICB9O1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjb3VudEZyb21Qcm9wcykge1xuICAgICAgc2V0Q2hhcmFjdGVyQ291bnRzKGNvdW50RnJvbVByb3BzKTtcbiAgICB9XG4gIH0sIFtjb3VudEZyb21Qcm9wcz8uY2hhcnNDb3VudCwgY291bnRGcm9tUHJvcHM/LmNoYXJzUmVtYWluaW5nXSk7XG4gIC8qXG5cbiAgV2hldGhlciB0byBrZWVwIHRyYWNrIG9mIGFuZCBzaG93IHJlbWFpbmluZyBjaGFyc1xuXG4gICovXG4gIGxldCBzaG93Q2hhcnNSZW1haW5pbmcgPSBmYWxzZTtcbiAgbGV0IGlucHV0TmFtZSA9IG51bGw7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpbnB1dE5hbWUgPSBnZXRJbnB1dE5hbWUodHlwZSwgaW5wdXQpO1xuICAgIHNob3dDaGFyc1JlbWFpbmluZyA9ICEhKFxuICAgICAgdHlwZW9mIG1heCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgaW5wdXROYW1lICYmXG4gICAgICBbXCJ1cmxcIiwgXCJlbWFpbFwiLCBcInRleHRhcmVhXCIsIFwidGV4dFwiXS5pbmNsdWRlcyhpbnB1dE5hbWUpXG4gICAgKTtcbiAgfVxuICAvLyBjb25zdCBpbnB1dFR5cGUgPSBpbnB1dE5hbWU7IC8vIFRPRE86IHJlbmFtZSBpbnB1dFR5cGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2hpbGQgY29tcG9uZW50c1xuXG4gIC8qXG4gIEZ1bmN0aW9uIHBhc3NlZCB0byBmb3JtIGNvbnRyb2xzIChhbHdheXMgY29udHJvbGxlZCkgdG8gdXBkYXRlIHRoZWlyIHZhbHVlXG4gIChOb3RlOiB3ZSBjb3VsZCB1c2UgdGhlIGNvbnRleHQgaW5zdGVhZD8pXG4gICovXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICh2YWx1ZSkgPT4ge1xuICAgIC8vIGlmIHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZywgZGVsZXRlIHRoZSBmaWVsZFxuICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgdmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICAvLyBpZiB0aGlzIGlzIGEgbnVtYmVyIGZpZWxkLCBjb252ZXJ0IHZhbHVlIGJlZm9yZSBzZW5kaW5nIGl0IHVwIHRvIEZvcm1cbiAgICBpZiAodHlwZSA9PT0gTnVtYmVyICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFNpbXBsZVNjaGVtYS5JbnRlZ2VyICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSAhPT0gZ2V0VmFsdWUoKSkge1xuICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSBsb2NhbGUgPyB7IGxvY2FsZTogbG9jYWxlLCB2YWx1ZSB9IDogdmFsdWU7XG4gICAgICB1cGRhdGVDdXJyZW50VmFsdWVzKHsgW2dldFBhdGgocHJvcHMpXTogdXBkYXRlVmFsdWUgfSk7XG4gICAgICBjbGVhckZpZWxkRXJyb3JzKGdldFBhdGgocHJvcHMpKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgdGV4dCBmaWVsZHMsIHVwZGF0ZSBjaGFyYWN0ZXIgY291bnQgb24gY2hhbmdlXG4gICAgaWYgKHNob3dDaGFyc1JlbWFpbmluZykge1xuICAgICAgdXBkYXRlQ2hhcmFjdGVyQ291bnQodmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICAvKlxuICBHZXQgdmFsdWUgZnJvbSBGb3JtIHN0YXRlIHRocm91Z2ggZG9jdW1lbnQgYW5kIGN1cnJlbnRWYWx1ZXMgcHJvcHNcbiAgICAvLyBUT0RPOiBnZXQgZG9jdW1lbnQgZnJvbSBjb250ZXh0XG4gICovXG4gIGNvbnN0IGdldFZhbHVlID0gKCkgPT4ge1xuICAgIC8vY29uc3QgYyA9IGNvbnRleHQgfHwgdGhpcy5jb250ZXh0O1xuICAgIGNvbnN0IHsgbG9jYWxlLCBkZWZhdWx0VmFsdWUsIGZvcm1UeXBlLCBkYXRhdHlwZSB9ID0gcHJvcHM7XG4gICAgY29uc3QgcGF0aCA9IGxvY2FsZSA/IGAke2dldFBhdGgocHJvcHMpfS52YWx1ZWAgOiBnZXRQYXRoKHByb3BzKTtcbiAgICBjb25zdCBjdXJyZW50RG9jdW1lbnQgPSBwcm9wcy5kb2N1bWVudDtcbiAgICBsZXQgdmFsdWUgPSBnZXQoY3VycmVudERvY3VtZW50LCBwYXRoKTtcbiAgICAvLyBub3RlOiBmb3JjZSBpbnRsIGZpZWxkcyB0byBiZSB0cmVhdGVkIGxpa2Ugc3RyaW5nc1xuICAgIGNvbnN0IG51bGxWYWx1ZSA9IGxvY2FsZSA/IFwiXCIgOiBnZXROdWxsVmFsdWUoZGF0YXR5cGUpO1xuXG4gICAgLy8gaGFuZGxlIGRlbGV0ZWQgJiBlbXB0eSB2YWx1ZVxuICAgIGlmIChkZWxldGVkVmFsdWVzLmluY2x1ZGVzKHBhdGgpKSB7XG4gICAgICB2YWx1ZSA9IG51bGxWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIC8vIHJlcGxhY2UgZW1wdHkgdmFsdWUgYnkgdGhlIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgc2NoZW1hIGlmIGl0IGV4aXN0cyDigJMgZm9yIG5ldyBmb3JtcyBvbmx5XG4gICAgICB2YWx1ZSA9IGZvcm1UeXBlID09PSBcIm5ld1wiICYmIGRlZmF1bHRWYWx1ZSA/IGRlZmF1bHRWYWx1ZSA6IG51bGxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIC8qXG5cbiAgR2V0IGVycm9ycyBmcm9tIEZvcm0gc3RhdGUgdGhyb3VnaCBjb250ZXh0XG5cbiAgTm90ZTogd2UgdXNlIGBpbmNsdWRlc2AgdG8gZ2V0IGFsbCBlcnJvcnMgZnJvbSBuZXN0ZWQgY29tcG9uZW50cywgd2hpY2ggaGF2ZSBsb25nZXIgcGF0aHNcblxuICAqL1xuICBjb25zdCBnZXRFcnJvcnMgPSAoZXJyb3JzPzogQXJyYXk8YW55PikgPT4ge1xuICAgIGVycm9ycyA9IGVycm9ycyB8fCBwcm9wcy5lcnJvcnMgfHwgW107XG4gICAgY29uc3QgZmllbGRFcnJvcnMgPSBlcnJvcnMuZmlsdGVyKFxuICAgICAgKGVycm9yKSA9PiBlcnJvci5wYXRoICYmIGVycm9yLnBhdGguaW5jbHVkZXMocGF0aClcbiAgICApO1xuICAgIHJldHVybiBmaWVsZEVycm9ycztcbiAgfTtcblxuICAvKlxuXG4gIEZ1bmN0aW9uIHBhc3NlZCB0byBmb3JtIGNvbnRyb2xzIHRvIGNsZWFyIHRoZWlyIGNvbnRlbnRzIChzZXQgdGhlaXIgdmFsdWUgdG8gbnVsbClcblxuICAqL1xuICBjb25zdCBjbGVhckZpZWxkID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB1cGRhdGVDdXJyZW50VmFsdWVzKHsgW3BhdGhdOiBudWxsIH0pO1xuICAgIGlmIChzaG93Q2hhcnNSZW1haW5pbmcpIHtcbiAgICAgIHVwZGF0ZUNoYXJhY3RlckNvdW50KG51bGwpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICBpZiAoaW50bElucHV0KSB7XG4gICAgcmV0dXJuIDxGb3JtQ29tcG9uZW50cy5Gb3JtSW50bCB7Li4ucHJvcHN9IC8+O1xuICB9IGVsc2UgaWYgKCFpbnB1dCAmJiBuZXN0ZWRJbnB1dCkge1xuICAgIGlmIChpc0FycmF5RmllbGQodHlwZSkpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkQXJyYXlcbiAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgZm9ybUNvbXBvbmVudHM9e0Zvcm1Db21wb25lbnRzfVxuICAgICAgICAgIGVycm9ycz17Z2V0RXJyb3JzKCl9XG4gICAgICAgICAgdmFsdWU9e2dldFZhbHVlKCl9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3RGaWVsZCh0eXBlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1OZXN0ZWRPYmplY3RcbiAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgZm9ybUNvbXBvbmVudHM9e0Zvcm1Db21wb25lbnRzfVxuICAgICAgICAgIGVycm9ycz17Z2V0RXJyb3JzKCl9XG4gICAgICAgICAgdmFsdWU9e2dldFZhbHVlKCl9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZjaVByb3BzID0ge1xuICAgIC4uLnByb3BzLFxuICAgIC4uLihjaGFyc0NvdW50U3RhdGUgfHwge30pLFxuICAgIGlucHV0VHlwZTogZ2V0SW5wdXROYW1lKHR5cGUsIGlucHV0KSxcbiAgICB2YWx1ZTogZ2V0VmFsdWUoKSxcbiAgICBlcnJvcnM6IGdldEVycm9ycygpLFxuICAgIHNob3dDaGFyc1JlbWFpbmluZzogISFzaG93Q2hhcnNSZW1haW5pbmcsXG4gICAgaGFuZGxlQ2hhbmdlOiBoYW5kbGVDaGFuZ2UsXG4gICAgY2xlYXJGaWVsZDogY2xlYXJGaWVsZCxcbiAgICBmb3JtSW5wdXQ6IGdldEZvcm1JbnB1dCh7IEZvcm1Db21wb25lbnRzLCBpbnB1dCwgdHlwZSB9KSxcbiAgfTtcblxuICAvLyBpZiB0aGVyZSBpcyBubyBxdWVyeSwgaGFuZGxlIG9wdGlvbnMgaGVyZTsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBoYW5kbGVkIGJ5XG4gIC8vIHRoZSBGb3JtQ29tcG9uZW50TG9hZGVyIGNvbXBvbmVudFxuICBpZiAoIXF1ZXJ5ICYmIHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBmY2lQcm9wcy5vcHRpb25zID0gb3B0aW9ucyhmY2lQcm9wcyk7XG4gIH1cblxuICBjb25zdCBmY2kgPSA8Rm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudElubmVyIHsuLi5mY2lQcm9wc30gLz47XG5cbiAgcmV0dXJuIHF1ZXJ5ID8gKFxuICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50TG9hZGVyIHsuLi5mY2lQcm9wc30+XG4gICAgICB7ZmNpfVxuICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudExvYWRlcj5cbiAgKSA6IChcbiAgICBmY2lcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtQ29tcG9uZW50c0RlcGVuZGVuY2llcyA9IFtcbiAgXCJGb3JtQ29tcG9uZW50RGVmYXVsdFwiLFxuICBcIkZvcm1Db21wb25lbnRQYXNzd29yZFwiLFxuICBcIkZvcm1Db21wb25lbnROdW1iZXJcIixcbiAgXCJGb3JtQ29tcG9uZW50VXJsXCIsXG4gIFwiRm9ybUNvbXBvbmVudEVtYWlsXCIsXG4gIFwiRm9ybUNvbXBvbmVudFRleHRhcmVhXCIsXG4gIFwiRm9ybUNvbXBvbmVudENoZWNrYm94XCIsXG4gIFwiRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXBcIixcbiAgXCJGb3JtQ29tcG9uZW50UmFkaW9Hcm91cFwiLFxuICBcIkZvcm1Db21wb25lbnRTZWxlY3RcIixcbiAgXCJGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGVcIixcbiAgXCJGb3JtQ29tcG9uZW50RGF0ZVRpbWVcIixcbiAgXCJGb3JtQ29tcG9uZW50RGF0ZVwiLFxuICBcIkZvcm1Db21wb25lbnREYXRlMlwiLFxuICBcIkZvcm1Db21wb25lbnRUaW1lXCIsXG4gIFwiRm9ybUNvbXBvbmVudFN0YXRpY1RleHRcIixcbiAgXCJGb3JtQ29tcG9uZW50TGlrZXJ0XCIsXG4gIFwiRm9ybUNvbXBvbmVudEF1dG9jb21wbGV0ZVwiLFxuICBcIkZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZVwiLFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybUNvbXBvbmVudDtcbiIsImltcG9ydCBSZWFjdCwgeyBNb3VzZUV2ZW50SGFuZGxlciB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlSW50bENvbnRleHQgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcbmltcG9ydCB7IHdoaXRlbGlzdElucHV0UHJvcHMgfSBmcm9tIFwiLi91aV91dGlsc1wiO1xuaW1wb3J0IHsgRm9ybUNvbXBvbmVudFByb3BzIH0gZnJvbSBcIi4vRm9ybUNvbXBvbmVudFwiO1xuLypcbmltcG9ydCB7XG4gIGluc3RhbnRpYXRlQ29tcG9uZW50LFxuICB3aGl0ZWxpc3RJbnB1dFByb3BzLFxufSBmcm9tIFwibWV0ZW9yL3Z1bGNhbjpjb3JlXCI7XG4qL1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcbmltcG9ydCB7IFZ1bGNhbkNvcmVJbnB1dCB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy90eXBpbmdzXCI7XG5pbXBvcnQgeyBjbGVhcmFibGVJbnB1dHMgfSBmcm9tIFwiLi9pbnB1dHMvY29uc3RzXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29tcG9uZW50SW5uZXJQcm9wcyBleHRlbmRzIEZvcm1Db21wb25lbnRQcm9wcyB7XG4gIGlucHV0VHlwZTogVnVsY2FuQ29yZUlucHV0O1xuICAvL2Rpc2FibGVkPzogYm9vbGVhbjtcbiAgLy8gaGVscD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIGNsaWNraW5nIG9uIHRoZSBcImNsZWFyIGlucHV0XCIgYnV0dG9uXG4gICAqL1xuICBjbGVhckZpZWxkPzogTW91c2VFdmVudEhhbmRsZXI8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICAvKipcbiAgICogVE9ETzogbm90IHN1cmUgaWYgaXQgc2hvdWxkIGJlIG1hbmRhdG9yeSBvciBub3QgKGVnIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cz8pXG4gICAqL1xuICBoYW5kbGVDaGFuZ2U/OiBGdW5jdGlvbjtcbiAgaXRlbVByb3BlcnRpZXM/OiBhbnk7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBsb2FkaW5nPzogYm9vbGVhbjtcbiAgc3VibWl0Rm9ybTogYW55O1xuICBmb3JtQ29tcG9uZW50czogUG9zc2libGVWdWxjYW5Db21wb25lbnRzO1xuICBpbnRsS2V5cz86IGFueTtcbiAgaW5wdXRDbGFzc05hbWU6IGFueTtcbiAgbmFtZTogYW55O1xuICBpbnB1dDogYW55O1xuICBiZWZvcmVDb21wb25lbnQ6IGFueTtcbiAgYWZ0ZXJDb21wb25lbnQ6IGFueTtcbiAgZXJyb3JzOiBhbnk7XG4gIHNob3dDaGFyc1JlbWFpbmluZzogYW55O1xuICBjaGFyc1JlbWFpbmluZzogYW55O1xuICByZW5kZXJDb21wb25lbnQ6IGFueTtcbiAgZm9ybUlucHV0OiBhbnk7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50SW5uZXIgPSAocHJvcHM6IEZvcm1Db21wb25lbnRJbm5lclByb3BzKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsQ29udGV4dCgpO1xuICBjb25zdCB7IGlucHV0VHlwZSwgZGlzYWJsZWQsIGNsZWFyRmllbGQgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHJlbmRlckNsZWFyID0gKCkgPT4ge1xuICAgIGlmIChjbGVhcmFibGVJbnB1dHMuaW5jbHVkZXMoaW5wdXRUeXBlKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgIC8qXG4gICAgICBGcm9tIGJvb3RzdHJhcDpcbiAgICAgICAgPENvbXBvbmVudHMuVG9vbHRpcFRyaWdnZXJcbiAgICAgICAgICB0cmlnZ2VyPXtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jb21wb25lbnQtY2xlYXJcIlxuICAgICAgICAgICAgICB0aXRsZT17dGhpcy5jb250ZXh0LmludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgaWQ6IFwiZm9ybXMuY2xlYXJfZmllbGRcIixcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuY2xlYXJGaWVsZH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4+4pyVPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAgPENvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZSBpZD1cImZvcm1zLmNsZWFyX2ZpZWxkXCIgLz5cbiAgICAgICAgPC9Db21wb25lbnRzLlRvb2x0aXBUcmlnZ2VyPlxuICAgICAgICAqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29tcG9uZW50LWNsZWFyXCJcbiAgICAgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgIGlkOiBcImZvcm1zLmNsZWFyX2ZpZWxkXCIsXG4gICAgICAgICAgfSl9XG4gICAgICAgICAgb25DbGljaz17Y2xlYXJGaWVsZH1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPuKclTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRQcm9wZXJ0aWVzID0gKCk6IEZvcm1JbnB1dFByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBoYW5kbGVDaGFuZ2UsXG4gICAgICBpbnB1dFR5cGUsXG4gICAgICBpdGVtUHJvcGVydGllcyxcbiAgICAgIGhlbHAsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGxvYWRpbmcsXG4gICAgICBzdWJtaXRGb3JtLFxuICAgICAgZm9ybUNvbXBvbmVudHMsXG4gICAgICBpbnRsS2V5cyxcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgaW5wdXRQcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLndoaXRlbGlzdElucHV0UHJvcHMocHJvcHMpLFxuICAgICAgICBvbkNoYW5nZTogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gRm9ybUNvbXBvbmVudCdzIGhhbmRsZUNoYW5nZSBleHBlY3RzIHZhbHVlIGFzIGFyZ3VtZW50OyBsb29rIGluIHRhcmdldC5jaGVja2VkIG9yIHRhcmdldC52YWx1ZVxuICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPVxuICAgICAgICAgICAgaW5wdXRUeXBlID09PSBcImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgPyAvLyBUT0RPOiBub3Qgc3VyZSB3aHkgd2UgbmVlZCBhbiBpZ25vcmUgdGhlcmVcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWRcbiAgICAgICAgICAgICAgOiAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgIGlmIChoYW5kbGVDaGFuZ2UpIHtcbiAgICAgICAgICAgIGhhbmRsZUNoYW5nZShpbnB1dFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qXG4gICAgICAgIFRPRE86IGNoZWNrIGlmIHRoaXMgY3JlYXRlcyByZWdyZXNzaW9uXG4gICAgICAgIG9uS2V5UHJlc3M6IChldmVudCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIiAmJiBpbnB1dFR5cGUgIT09IFwidGV4dGFyZWFcIikge1xuICAgICAgICAgICAgc3VibWl0Rm9ybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKi9cbiAgICAgIH0sXG5cbiAgICAgIGl0ZW1Qcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLml0ZW1Qcm9wZXJ0aWVzLFxuICAgICAgICBpbnRsS2V5cyxcbiAgICAgICAgQ29tcG9uZW50czogZm9ybUNvbXBvbmVudHMsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB8fCBoZWxwLFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBpbnB1dENsYXNzTmFtZSxcbiAgICBuYW1lLFxuICAgIGlucHV0LFxuICAgIC8vaW5wdXRUeXBlLFxuICAgIGJlZm9yZUNvbXBvbmVudCxcbiAgICBhZnRlckNvbXBvbmVudCxcbiAgICBlcnJvcnMsXG4gICAgc2hvd0NoYXJzUmVtYWluaW5nLFxuICAgIGNoYXJzUmVtYWluaW5nLFxuICAgIHJlbmRlckNvbXBvbmVudCxcbiAgICBmb3JtSW5wdXQsXG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgLy9jb25zdCBGb3JtQ29tcG9uZW50cyA9IGZvcm1Db21wb25lbnRzO1xuXG4gIGNvbnN0IGhhc0Vycm9ycyA9IGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoO1xuXG4gIGNvbnN0IGlucHV0TmFtZSA9IHR5cGVvZiBpbnB1dCA9PT0gXCJmdW5jdGlvblwiID8gaW5wdXQubmFtZSA6IGlucHV0VHlwZTtcbiAgY29uc3QgaW5wdXRDbGFzcyA9IGNsYXNzTmFtZXMoXG4gICAgXCJmb3JtLWlucHV0XCIsXG4gICAgaW5wdXRDbGFzc05hbWUsXG4gICAgYGlucHV0LSR7bmFtZX1gLFxuICAgIGBmb3JtLWNvbXBvbmVudC0ke2lucHV0TmFtZSB8fCBcImRlZmF1bHRcIn1gLFxuICAgIHtcbiAgICAgIFwiaW5wdXQtZXJyb3JcIjogaGFzRXJyb3JzLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXMoKTtcblxuICBjb25zdCBGb3JtSW5wdXQgPSBmb3JtSW5wdXQ7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17aW5wdXRDbGFzc30+XG4gICAgICB7LyppbnN0YW50aWF0ZUNvbXBvbmVudChiZWZvcmVDb21wb25lbnQsIHByb3BlcnRpZXMpKi99XG4gICAgICA8Rm9ybUlucHV0IHsuLi5wcm9wZXJ0aWVzfSAvPlxuICAgICAge2hhc0Vycm9ycyA/IDxGb3JtQ29tcG9uZW50cy5GaWVsZEVycm9ycyBlcnJvcnM9e2Vycm9yc30gLz4gOiBudWxsfVxuICAgICAge3JlbmRlckNsZWFyKCl9XG4gICAgICB7c2hvd0NoYXJzUmVtYWluaW5nICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcImZvcm0tY29udHJvbC1saW1pdFwiLCB7XG4gICAgICAgICAgICBkYW5nZXI6IGNoYXJzUmVtYWluaW5nIDwgMTAsXG4gICAgICAgICAgfSl9XG4gICAgICAgID5cbiAgICAgICAgICB7Y2hhcnNSZW1haW5pbmd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIHsvKmluc3RhbnRpYXRlQ29tcG9uZW50KGFmdGVyQ29tcG9uZW50LCBwcm9wZXJ0aWVzKSovfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtSW5wdXRQcm9wcyBleHRlbmRzIEZvcm1Db21wb25lbnRJbm5lclByb3BzIHtcbiAgLy8gVE9ETzogbm90ZSBzdXJlIGFib3V0IHRoaXMsIHRoZXJlIGFsc28gc2VlbXMgdG8gYmUgbGFiZWwgYW5kIG90aGVyIHByb3BzIHRoYXQgYXJlIG5vdCBIVE1MSW5wdXQgcHJvcHMgcGVyIHNlXG4gIC8vIEl0IG1heSBkZXBlbmQgb24gdGhlIHR5cGUgb2YgaW5wdXQgYXMgd2VsbCwgbWF5YmUgdGhlIHR5cGUgaXMgbW9yZSBhbiB1bmlvblxuICBpbnB1dFByb3BlcnRpZXM6IFJlYWN0LkhUTUxQcm9wczxIVE1MSW5wdXRFbGVtZW50PjtcbiAgaXRlbVByb3BlcnRpZXM6IGFueTsgLy8gVE9ET1xufVxuIiwiaW1wb3J0IHBpY2sgZnJvbSBcImxvZGFzaC9waWNrXCI7XG5cbi8qKlxuICogRXh0cmFjdCBpbnB1dCBwcm9wcyBmb3IgdGhlIEZvcm1Db21wb25lbnRJbm5lclxuICogQHBhcmFtIHsqfSBwcm9wcyBBbGwgY29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBJbml0aWFsIHByb3BzICsgcHJvcHMgc3BlY2lmaWMgdG8gdGhlIEhUTUwgaW5wdXQgaW4gYW4gaW5wdXRQcm9wZXJ0aWVzIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgZ2V0SHRtbElucHV0UHJvcHMgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBuYW1lLCBwYXRoLCBvcHRpb25zLCBsYWJlbCwgb25DaGFuZ2UsIG9uQmx1ciwgdmFsdWUsIGRpc2FibGVkIH0gPVxuICAgIHByb3BzO1xuXG4gIC8vIHRoZXNlIHByb3BlcnRpZXMgYXJlIHdoaXRlbGlzdGVkIHNvIHRoYXQgdGhleSBjYW4gYmUgc2FmZWx5IHBhc3NlZCB0byB0aGUgYWN0dWFsIGZvcm0gaW5wdXRcbiAgLy8gYW5kIGF2b2lkIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L3dhcm5pbmdzL3Vua25vd24tcHJvcC5odG1sIHdhcm5pbmdzXG4gIGNvbnN0IGlucHV0UHJvcGVydGllcyA9IHtcbiAgICAuLi5wcm9wcy5pbnB1dFByb3BlcnRpZXMsXG4gICAgbmFtZSxcbiAgICBwYXRoLFxuICAgIG9wdGlvbnMsXG4gICAgbGFiZWwsXG4gICAgb25DaGFuZ2UsXG4gICAgb25CbHVyLFxuICAgIHZhbHVlLFxuICAgIGRpc2FibGVkLFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4ucHJvcHMsXG4gICAgaW5wdXRQcm9wZXJ0aWVzLFxuICB9O1xufTtcblxuLyoqXG4gKiBFeHRyYWN0IGlucHV0IHByb3BzIGZvciB0aGUgRm9ybUNvbXBvbmVudElubmVyXG4gKiBAcGFyYW0geyp9IHByb3BzIEFsbCBjb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIEluaXRpYWwgcHJvcHMgKyBwcm9wcyBzcGVjaWZpYyB0byB0aGUgSFRNTCBpbnB1dCBpbiBhbiBpbnB1dFByb3BlcnRpZXMgb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCB3aGl0ZWxpc3RJbnB1dFByb3BzID0gKFxuICBwcm9wczogYW55XG4pOiBSZWFjdC5IVE1MUHJvcHM8SFRNTElucHV0RWxlbWVudD4gPT4ge1xuICBjb25zdCB3aGl0ZWxpc3QgPSBbXG4gICAgXCJuYW1lXCIsXG4gICAgXCJwYXRoXCIsXG4gICAgXCJvcHRpb25zXCIsXG4gICAgXCJsYWJlbFwiLFxuICAgIFwib25DaGFuZ2VcIixcbiAgICBcIm9uQmx1clwiLFxuICAgIFwidmFsdWVcIixcbiAgICBcImRpc2FibGVkXCIsXG4gICAgXCJwbGFjZWhvbGRlclwiLFxuICBdO1xuICByZXR1cm4gcGljayhwcm9wcywgd2hpdGVsaXN0KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpOyIsIi8qKlxuICogQ2hhbmdlcyBmcm9tIFZ1bGNhbiBNZXRlb3I6XG4gKiAtIHF1ZXJ5IGlzIG5vdCBleHBhbmRlZDogeW91IG5lZWQgdG8gcGFzcyB0aGUgZnVsbCBxdWVyeSB3aXRoIGZyYWdtZW50cyBhbHJlYWR5XG4gKi9cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbi8vwqBAc2VlIHBhY2thZ2VzL3Z1bGNhbi1saWIvbGliL21vZHVsZXMvZnJhZ21lbnRzLmpzIGluIFZ1bGNhblxuLy8gc2hvdWxkIHdlIHJlZW5hYmxlIHRoaXM/XG4vLyBpbXBvcnQgeyBleHBhbmRRdWVyeUZyYWdtZW50cyB9IGZyb20gXCJtZXRlb3IvdnVsY2FuOmNvcmVcIjtcbmltcG9ydCB7IHVzZUxhenlRdWVyeSwgZ3FsIH0gZnJvbSBcIkBhcG9sbG8vY2xpZW50XCI7XG5pbXBvcnQgaXNFbXB0eSBmcm9tIFwibG9kYXNoL2lzRW1wdHlcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db21wb25lbnRMb2FkZXJQcm9wcyB7XG4gIHF1ZXJ5OiBzdHJpbmcgfCAoKHsgdmFsdWU6IGFueSB9KSA9PiBzdHJpbmcpO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBvcHRpb25zOiBhbnk7XG4gIHZhbHVlOiBhbnk7XG4gIC8qKiBSdW4gdGhlIHF1ZXJ5IG9ubHkgd2hlbiB2YWx1ZSBpcyBub3QgZW1wdHkgKi9cbiAgcXVlcnlXYWl0c0ZvclZhbHVlPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50TG9hZGVyID0gKHByb3BzOiBGb3JtQ29tcG9uZW50TG9hZGVyUHJvcHMpID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgeyBxdWVyeSwgY2hpbGRyZW4sIG9wdGlvbnMsIHZhbHVlLCBxdWVyeVdhaXRzRm9yVmFsdWUgfSA9IHByb3BzO1xuXG4gIC8vIGlmIHF1ZXJ5IGlzIGEgZnVuY3Rpb24sIGV4ZWN1dGUgaXRcbiAgY29uc3QgcXVlcnlUZXh0ID0gdHlwZW9mIHF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIgPyBxdWVyeSh7IHZhbHVlIH0pIDogcXVlcnk7XG5cbiAgY29uc3QgW2xvYWRGaWVsZFF1ZXJ5LCB7IGxvYWRpbmcsIGVycm9yLCBkYXRhIH1dID0gdXNlTGF6eVF1ZXJ5KFxuICAgIGdxbChxdWVyeVRleHQpXG4gICAgLy8gZ3FsKGV4cGFuZFF1ZXJ5RnJhZ21lbnRzKHF1ZXJ5VGV4dCkpXG4gICk7XG5cbiAgY29uc3QgdmFsdWVJc0VtcHR5ID1cbiAgICBpc0VtcHR5KHZhbHVlKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA9PT0gMDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChxdWVyeVdhaXRzRm9yVmFsdWUgJiYgdmFsdWVJc0VtcHR5KSB7XG4gICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHJ1biB0aGlzIHF1ZXJ5IHVudGlsIHdlIGhhdmUgYSB2YWx1ZSB0byBwYXNzIHRvIGl0XG4gICAgICAvLyBzbyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRGaWVsZFF1ZXJ5KHtcbiAgICAgICAgdmFyaWFibGVzOiB7IHZhbHVlIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFt2YWx1ZUlzRW1wdHksIHZhbHVlLCBxdWVyeVdhaXRzRm9yVmFsdWVdKTtcblxuICBpZiAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAobG9hZGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tY29tcG9uZW50LWxvYWRlclwiPlxuICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Mb2FkaW5nIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgLy8gcGFzcyBuZXdseSBsb2FkZWQgZGF0YSAoYW5kIG9wdGlvbnMgaWYgbmVlZGVkKSB0byBjaGlsZCBjb21wb25lbnRcbiAgY29uc3QgZXh0cmFQcm9wczoge1xuICAgIGRhdGE6IGFueTtcbiAgICBxdWVyeURhdGE6IGFueTtcbiAgICBxdWVyeUVycm9yOiBhbnk7XG4gICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICBvcHRpb25zRnVuY3Rpb24/OiBGdW5jdGlvbjtcbiAgICBvcHRpb25zPzogQXJyYXk8YW55PjtcbiAgfSA9IHsgZGF0YSwgcXVlcnlEYXRhOiBkYXRhLCBxdWVyeUVycm9yOiBlcnJvciwgbG9hZGluZyB9O1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV4dHJhUHJvcHMub3B0aW9uc0Z1bmN0aW9uID0gb3B0aW9ucztcbiAgICBleHRyYVByb3BzLm9wdGlvbnMgPSBvcHRpb25zLmNhbGwoe30sIHsgLi4ucHJvcHMsIGRhdGEgfSk7XG4gIH1cbiAgaWYgKCFSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkNoaWxkcmVuIG9mIEZvcm1Db21wb25lbnRMb2FkZXIgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGdvdCBcIiArIGNoaWxkcmVuXG4gICAgKTtcbiAgfVxuICBjb25zdCBmY2kgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIGV4dHJhUHJvcHMpO1xuXG4gIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tY29tcG9uZW50LWxvYWRlclwiPntmY2l9PC9kaXY+O1xufTtcblxuRm9ybUNvbXBvbmVudExvYWRlci5wcm9wVHlwZXMgPSB7fTtcbiIsImltcG9ydCBSZWFjdCwgeyBIVE1MQXR0cmlidXRlcywgUHJvcHNXaXRoQ2hpbGRyZW4gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuZXhwb3J0IHR5cGUgRm9ybUVsZW1lbnRQcm9wcyA9IEhUTUxBdHRyaWJ1dGVzPEhUTUxGb3JtRWxlbWVudD47XG4vKipcbiAqIFRoZSBhY3R1YWwgd3JhcHBlciBvZiB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3QgRm9ybUVsZW1lbnQgPSBSZWFjdC5mb3J3YXJkUmVmPEhUTUxGb3JtRWxlbWVudD4oXG4gICh7IGNoaWxkcmVuLCAuLi5vdGhlclByb3BzIH06IFByb3BzV2l0aENoaWxkcmVuPEZvcm1FbGVtZW50UHJvcHM+LCByZWYpID0+IHtcbiAgICBjb25zdCB7IHN1Ym1pdEZvcm0gfSA9IHVzZUZvcm1Db250ZXh0KCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxmb3JtXG4gICAgICAgIHsuLi5vdGhlclByb3BzfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG9uU3VibWl0PXtzdWJtaXRGb3JtfVxuICAgICAgICByZWY9e3JlZn1cbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9mb3JtPlxuICAgICk7XG4gIH1cbik7XG4iLCJpbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBfc29tZSBmcm9tIFwibG9kYXNoL3NvbWVcIjtcbmltcG9ydCB7IFZ1bGNhblVzZXIsIGlzQWRtaW4gfSBmcm9tIFwiQHZ1bGNhbmpzL3Blcm1pc3Npb25zXCI7XG5pbXBvcnQgeyBGaWVsZEdyb3VwIH0gZnJvbSBcIkB2dWxjYW5qcy9zY2hlbWFcIjtcbmltcG9ydCB7IEZvcm1GaWVsZCB9IGZyb20gXCIuL3R5cGluZ3NcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Hcm91cFByb3BzIHtcbiAgbmFtZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBncm91cDogRmllbGRHcm91cCAvKntcbiAgICBhZG1pbnNPbmx5PzogYm9vbGVhbjtcbiAgICBiZWZvcmVDb21wb25lbnQ/OiBhbnk7XG4gIH07Ki87XG4gIGZpZWxkczogQXJyYXk8Rm9ybUZpZWxkPjtcbiAgaGlkZGVuPzogYm9vbGVhbiB8IEZ1bmN0aW9uO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGRvY3VtZW50OiBhbnk7XG4gIGN1cnJlbnRVc2VyPzogVnVsY2FuVXNlcjtcbiAgaXRlbVByb3BlcnRpZXM6IGFueTtcbiAgZm9ybVR5cGU6IGFueTtcbiAgcHJlZmlsbGVkUHJvcHM6IGFueTtcbn1cblxuLyoqXG4gKiBUT0RPOiB0YWtlIHVudXNlZCBwcm9wcyBpbnRvIGFjY291bnRcbiAqIEBwYXJhbSBwYXJhbTBcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBGb3JtR3JvdXBMYXlvdXQgPSAoe1xuICBhbmNob3JOYW1lLFxuICBjb2xsYXBzZWQsXG4gIGhhc0Vycm9ycyxcbiAgZ3JvdXAsXG4gIGRvY3VtZW50LFxuICB0b2dnbGUsXG4gIC4uLnByb3BzXG59KSA9PiB7XG4gIHJldHVybiA8ZmllbGRzZXQgey4uLnByb3BzfSAvPjtcbn07XG5cbmV4cG9ydCBjb25zdCBGb3JtR3JvdXBIZWFkZXIgPSAocHJvcHMpID0+IDxoMiB7Li4ucHJvcHN9IC8+O1xuXG5leHBvcnQgY29uc3QgRm9ybUdyb3VwIC8qPEZvcm1Hcm91cFByb3BzLCBGb3JtR3JvdXBTdGF0ZT4qLyA9IChcbiAgcHJvcHM6IEZvcm1Hcm91cFByb3BzXG4pID0+IHtcbiAgLy8gVE9ETzogZ2V0IHZhbHVlL3VwZGF0ZSBtZXRob2RzIGZyb20gY29udGV4dCBpbnN0ZWFkXG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGxhYmVsLFxuICAgIGdyb3VwLFxuICAgIGZpZWxkcyxcbiAgICBoaWRkZW4sXG4gICAgZG9jdW1lbnQsXG4gICAgY3VycmVudFVzZXIsXG4gICAgZGlzYWJsZWQsXG4gICAgaXRlbVByb3BlcnRpZXMsXG4gICAgcHJlZmlsbGVkUHJvcHMsXG4gICAgZm9ybVR5cGUsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgeyBlcnJvcnMsIGNsZWFyRmllbGRFcnJvcnMgfSA9IHVzZUZvcm1Db250ZXh0KCk7XG4gIGNvbnN0IFtjb2xsYXBzZWQsIHNldENvbGxhcHNlZF0gPSB1c2VTdGF0ZTxib29sZWFuPihcbiAgICBncm91cC5zdGFydENvbGxhcHNlZCB8fCBmYWxzZVxuICApO1xuICBjb25zdCB0b2dnbGUgPSAoKSA9PiBzZXRDb2xsYXBzZWQoKGNvbGxhcHNlZCkgPT4gIWNvbGxhcHNlZCk7XG4gIC8vIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBncm91cCBoYXMgYW4gZXJyb3IsIHRoZSBncm91cCBhcyBhIHdob2xlIGhhcyBhbiBlcnJvclxuICBjb25zdCBoYXNFcnJvcnMgPSBfc29tZShmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgIHJldHVybiAhIWVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiBlcnJvci5wYXRoID09PSBmaWVsZC5wYXRoKS5sZW5ndGg7XG4gIH0pO1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuXG4gIGNvbnN0IGlzSGlkZGVuID1cbiAgICB0eXBlb2YgaGlkZGVuID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gaGlkZGVuKHsgLi4ucHJvcHMsIGRvY3VtZW50IH0pXG4gICAgICA6IGhpZGRlbiB8fCBmYWxzZTtcbiAgLypcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG9yZGVyOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGhpZGRlbjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZmllbGRzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBncm91cDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIGVycm9yczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgdGhyb3dFcnJvcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBjdXJyZW50VmFsdWVzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgdXBkYXRlQ3VycmVudFZhbHVlczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBkZWxldGVkVmFsdWVzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBhZGRUb0RlbGV0ZWRWYWx1ZXM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgY2xlYXJGaWVsZEVycm9yczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBmb3JtVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIGN1cnJlbnRVc2VyOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHByZWZpbGxlZFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICB9OyovXG5cbiAgY29uc3QgaGVhZGluZyA9IChcbiAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtR3JvdXBIZWFkZXJcbiAgICAgIHRvZ2dsZT17dG9nZ2xlfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgY29sbGFwc2VkPXtjb2xsYXBzZWR9XG4gICAgICBoaWRkZW49e2lzSGlkZGVufVxuICAgICAgZ3JvdXA9e2dyb3VwfVxuICAgIC8+XG4gICk7XG5cbiAgaWYgKGdyb3VwLmFkbWluc09ubHkgJiYgIWlzQWRtaW4oY3VycmVudFVzZXIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYW5jaG9yTmFtZSA9IG5hbWUuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEgPyBuYW1lLnNwbGl0KFwiLlwiKVsxXSA6IG5hbWU7XG5cbiAgcmV0dXJuIChcbiAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtR3JvdXBMYXlvdXRcbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGFuY2hvck5hbWU9e2FuY2hvck5hbWV9XG4gICAgICB0b2dnbGU9e3RvZ2dsZX1cbiAgICAgIGNvbGxhcHNlZD17Y29sbGFwc2VkfVxuICAgICAgaGlkZGVuPXtpc0hpZGRlbn1cbiAgICAgIGdyb3VwPXtncm91cH1cbiAgICAgIGhlYWRpbmc9e25hbWUgPT09IFwiZGVmYXVsdFwiID8gbnVsbCA6IGhlYWRpbmd9XG4gICAgICBoYXNFcnJvcnM9e2hhc0Vycm9yc31cbiAgICAgIGRvY3VtZW50PXtkb2N1bWVudH1cbiAgICA+XG4gICAgICB7LyogVE9ETzogY3JlYXRlIFRTIGVycm9yIGF0IHRoZSBtb21lbnQ6IGdyb3VwLmJlZm9yZUNvbXBvbmVudCAmJiA8Z3JvdXAuYmVmb3JlQ29tcG9uZW50IHsuLi5wcm9wc30gLz4qL31cbiAgICAgIHsvKiogVE9ETzogd2UgcGFzcyBhbGwgdGhlIGZ1bmN0aW9ucyBhcyBwcm9wcyB0byB0aGUgRm9ybUNvbXBvbmVudCxcbiAgICAgICAqIGJ1dCBpdCBzaG91bGQgcmVseSBvbiB0aGUgY29udGV4dCBpbnN0ZWFkIGZvciBtZXRob2RzXG4gICAgICAgKi99XG5cbiAgICAgIHtmaWVsZHMubWFwKChmaWVsZCkgPT4gKFxuICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50XG4gICAgICAgICAga2V5PXtmaWVsZC5uYW1lfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICB7Li4uZmllbGR9XG4gICAgICAgICAgZG9jdW1lbnQ9e2RvY3VtZW50fVxuICAgICAgICAgIGl0ZW1Qcm9wZXJ0aWVzPXt7XG4gICAgICAgICAgICAuLi5pdGVtUHJvcGVydGllcyxcbiAgICAgICAgICAgIC4uLmZpZWxkLml0ZW1Qcm9wZXJ0aWVzLFxuICAgICAgICAgIH19XG4gICAgICAgICAgY2xlYXJGaWVsZEVycm9ycz17Y2xlYXJGaWVsZEVycm9yc31cbiAgICAgICAgICBmb3JtVHlwZT17Zm9ybVR5cGV9XG4gICAgICAgICAgY3VycmVudFVzZXI9e2N1cnJlbnRVc2VyfVxuICAgICAgICAgIHByZWZpbGxlZFByb3BzPXtwcmVmaWxsZWRQcm9wc31cbiAgICAgICAgLz5cbiAgICAgICkpfVxuXG4gICAgICB7LyogVE9ETzogY3JlYXRlIFRTIGVycm9yIGF0IHRoZSBtb21lbnQ6IGdyb3VwLmFmdGVyQ29tcG9uZW50ICYmIDxncm91cC5hZnRlckNvbXBvbmVudCB7Li4ucHJvcHN9IC8+Ki99XG4gICAgPC9WdWxjYW5Db21wb25lbnRzLkZvcm1Hcm91cExheW91dD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1Hcm91cDtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9zb21lXCIpOyIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBvbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5cbmNvbnN0IExvY2FsZXM6IEFycmF5PHsgaWQ6IHN0cmluZyB9PiA9IFtdOyAvLyA/PyBtaWdodCBuZWVkIHRvIGdldCB0aGlzIGZyb20gY29udGV4dFxuZXhwb3J0IGNvbnN0IEZvcm1JbnRsTGF5b3V0ID0gKHsgY2hpbGRyZW4gfSkgPT4gKFxuICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0taW50bFwiPntjaGlsZHJlbn08L2Rpdj5cbik7XG5leHBvcnQgY29uc3QgRm9ybUludGxJdGVtTGF5b3V0ID0gKHsgbG9jYWxlLCBjaGlsZHJlbiB9KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPXtgZm9ybS1pbnRsLSR7bG9jYWxlLmlkfWB9PntjaGlsZHJlbn08L2Rpdj5cbik7XG5cbmludGVyZmFjZSBGb3JtSW50bFByb3BzIHtcbiAgcGF0aDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtSW50bCA9IChwcm9wczogRm9ybUludGxQcm9wcykgPT4ge1xuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgeyBnZXRMYWJlbCB9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgLypcbiAgTm90ZTogaWRlYWxseSB3ZSdkIHRyeSB0byBtYWtlIHN1cmUgdG8gcmV0dXJuIHRoZSByaWdodCBwYXRoIG5vIG1hdHRlclxuICB0aGUgb3JkZXIgdHJhbnNsYXRpb25zIGFyZSBzdG9yZWQgaW4sIGJ1dCBpbiBwcmFjdGljZSB3ZSBjYW4ndCBndWFyYW50ZWUgaXRcbiAgc28gd2UganVzdCB1c2UgdGhlIG9yZGVyIG9mIHRoZSBMb2NhbGVzIGFycmF5LlxuXG4gICovXG4gIGNvbnN0IGdldExvY2FsZVBhdGggPSAoZGVmYXVsdEluZGV4KSA9PiB7XG4gICAgcmV0dXJuIGAke3Byb3BzLnBhdGh9X2ludGwuJHtkZWZhdWx0SW5kZXh9YDtcbiAgfTtcblxuICBjb25zdCB7IG5hbWUgfSA9IHByb3BzO1xuXG4gIC8vIGRvIG5vdCBwYXNzIEZvcm1JbnRsJ3Mgb3duIHZhbHVlLCBpbnB1dFByb3BlcnRpZXMsIGFuZCBpbnRsSW5wdXQgcHJvcHMgZG93blxuICBjb25zdCBwcm9wZXJ0aWVzID0gb21pdChcbiAgICBwcm9wcyxcbiAgICBcInZhbHVlXCIsXG4gICAgXCJpbnB1dFByb3BlcnRpZXNcIixcbiAgICBcImludGxJbnB1dFwiLFxuICAgIFwibmVzdGVkSW5wdXRcIlxuICApO1xuICByZXR1cm4gKFxuICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtSW50bExheW91dD5cbiAgICAgIHtMb2NhbGVzLm1hcCgobG9jYWxlLCBpKSA9PiAoXG4gICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtSW50bEl0ZW1MYXlvdXQga2V5PXtsb2NhbGUuaWR9IGxvY2FsZT17bG9jYWxlfT5cbiAgICAgICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFxuICAgICAgICAgICAgey4uLnByb3BlcnRpZXN9XG4gICAgICAgICAgICBsYWJlbD17Z2V0TGFiZWwobmFtZSwgbG9jYWxlLmlkKX1cbiAgICAgICAgICAgIHBhdGg9e2dldExvY2FsZVBhdGgoaSl9XG4gICAgICAgICAgICBsb2NhbGU9e2xvY2FsZS5pZH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0Zvcm1Db21wb25lbnRzLkZvcm1JbnRsSXRlbUxheW91dD5cbiAgICAgICkpfVxuICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybUludGxMYXlvdXQ+XG4gICk7XG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbi8qKlxuICogRGlzcGxheSBlcnJvcnMgZm9yIHRoZSBjdXJyZW50IGZvcm0sIGJhc2VkIG9uIHRoZSBjb250ZXh0XG4gKi9cbmV4cG9ydCBjb25zdCBGb3JtRXJyb3JzID0gKCkgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCB7IGVycm9ycyB9ID0gdXNlRm9ybUNvbnRleHQoKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1lcnJvcnNcIj5cbiAgICAgIHshIWVycm9ycy5sZW5ndGggJiYgKFxuICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5BbGVydCBjbGFzc05hbWU9XCJmbGFzaC1tZXNzYWdlXCIgdmFyaWFudD1cImRhbmdlclwiPlxuICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgIHtlcnJvcnMubWFwKChlcnJvciwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgPGxpIGtleT17aW5kZXh9PlxuICAgICAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1FcnJvciBlcnJvcj17ZXJyb3J9IGVycm9yQ29udGV4dD1cImZvcm1cIiAvPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9WdWxjYW5Db21wb25lbnRzLkFsZXJ0PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbi8vIC8qXG5cbi8vICAgUmVuZGVyIGVycm9yc1xuXG4vLyAgICovXG4vLyAgcmVuZGVyRXJyb3JzID0gKCkgPT4ge1xuLy8gICByZXR1cm4gKFxuLy8gICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1lcnJvcnNcIj5cbi8vICAgICAgIHt0aGlzLnN0YXRlLmVycm9ycy5tYXAoKGVycm9yLCBpbmRleCkgPT4ge1xuLy8gICAgICAgICBsZXQgbWVzc2FnZTtcblxuLy8gICAgICAgICBpZiAoZXJyb3IuZGF0YSAmJiBlcnJvci5kYXRhLmVycm9ycykge1xuLy8gICAgICAgICAgIC8vIHRoaXMgZXJyb3IgaXMgYSBcIm11bHRpLWVycm9yXCIgd2l0aCBtdWx0aXBsZSBzdWItZXJyb3JzXG5cbi8vICAgICAgICAgICBtZXNzYWdlID0gZXJyb3IuZGF0YS5lcnJvcnMubWFwKGVycm9yID0+IHtcbi8vICAgICAgICAgICAgIHJldHVybiB7XG4vLyAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSxcbi8vICAgICAgICAgICAgICAgZGF0YTogZXJyb3IuZGF0YSxcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgfSk7XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgLy8gdGhpcyBpcyBhIHJlZ3VsYXIgZXJyb3JcblxuLy8gICAgICAgICAgIG1lc3NhZ2UgPSB7XG4vLyAgICAgICAgICAgICBjb250ZW50OlxuLy8gICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlIHx8XG4vLyAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbnRsLmZvcm1hdE1lc3NhZ2UoeyBpZDogZXJyb3IuaWQsIGRlZmF1bHRNZXNzYWdlOiBlcnJvci5pZCB9LCBlcnJvci5kYXRhKSxcbi8vICAgICAgICAgICB9O1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgcmV0dXJuIDxDb21wb25lbnRzLkZvcm1GbGFzaCBrZXk9e2luZGV4fSBtZXNzYWdlPXttZXNzYWdlfSB0eXBlPVwiZXJyb3JcIiAvPjtcbi8vICAgICAgIH0pfVxuLy8gICAgIDwvZGl2PlxuLy8gICApO1xuLy8gfTtcbiIsIi8qKlxuICogQ2hhbmdlIGNvbXBhcmVkIHRvIFZ1bGNhbjpcbiAqIC0gdXNpbmcgYSBtb2RlbCBpbnN0ZWFkIG9mIGEgY29sbGVjdGlvbk5hbWVcbiAqL1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgY2FuRGVsZXRlRG9jdW1lbnQgfSBmcm9tIFwiQHZ1bGNhbmpzL3Blcm1pc3Npb25zXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtU3VibWl0UHJvcHMge1xuICBzdWJtaXRMYWJlbDogYW55O1xuICBjYW5jZWxMYWJlbDogYW55O1xuICBjYW5jZWxDYWxsYmFjazogYW55O1xuICByZXZlcnRMYWJlbDogYW55O1xuICByZXZlcnRDYWxsYmFjazogYW55O1xuICBkb2N1bWVudDogYW55O1xuICBkZWxldGVEb2N1bWVudDogYW55O1xuICBtb2RlbDogYW55O1xuICAvLyBjbGFzc2VzOiBhbnksXG4gIGN1cnJlbnRVc2VyOiBhbnk7XG59XG5leHBvcnQgY29uc3QgRm9ybVN1Ym1pdCA9ICh7XG4gIHN1Ym1pdExhYmVsLFxuICBjYW5jZWxMYWJlbCxcbiAgY2FuY2VsQ2FsbGJhY2ssXG4gIHJldmVydExhYmVsLFxuICByZXZlcnRDYWxsYmFjayxcbiAgZG9jdW1lbnQsXG4gIGRlbGV0ZURvY3VtZW50LFxuICBtb2RlbCxcbiAgLy8gY2xhc3NlcyxcbiAgY3VycmVudFVzZXIsXG59KSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IHsgY2xlYXJGb3JtIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1zdWJtaXRcIj5cbiAgICAgIDxWdWxjYW5Db21wb25lbnRzLkJ1dHRvbiB0eXBlPVwic3VibWl0XCIgdmFyaWFudD1cInByaW1hcnlcIj5cbiAgICAgICAge3N1Ym1pdExhYmVsID8gKFxuICAgICAgICAgIHN1Ym1pdExhYmVsXG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgaWQ9XCJmb3Jtcy5zdWJtaXRcIlxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9XCJTdWJtaXRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1Z1bGNhbkNvbXBvbmVudHMuQnV0dG9uPlxuXG4gICAgICB7Y2FuY2VsQ2FsbGJhY2sgPyAoXG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jYW5jZWxcIlxuICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjYW5jZWxDYWxsYmFjayhkb2N1bWVudCk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtjYW5jZWxMYWJlbCA/IChcbiAgICAgICAgICAgIGNhbmNlbExhYmVsXG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgaWQ9XCJmb3Jtcy5jYW5jZWxcIlxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT1cIkNhbmNlbFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvYT5cbiAgICAgICkgOiBudWxsfVxuXG4gICAgICB7cmV2ZXJ0Q2FsbGJhY2sgPyAoXG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jYW5jZWxcIlxuICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjbGVhckZvcm0oKTtcbiAgICAgICAgICAgIHJldmVydENhbGxiYWNrKGRvY3VtZW50KTtcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3JldmVydExhYmVsID8gKFxuICAgICAgICAgICAgcmV2ZXJ0TGFiZWxcbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICBpZD1cImZvcm1zLnJldmVydFwiXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPVwiUmV2ZXJ0XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9hPlxuICAgICAgKSA6IG51bGx9XG5cbiAgICAgIHtkZWxldGVEb2N1bWVudCAmJlxuICAgICAgY2FuRGVsZXRlRG9jdW1lbnQoe1xuICAgICAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICAgICAgZG9jdW1lbnQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgfSkgPyAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGhyIC8+XG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuQnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwibGlua1wiXG4gICAgICAgICAgICBvbkNsaWNrPXtkZWxldGVEb2N1bWVudH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17YGRlbGV0ZS1saW5rICR7bW9kZWwubmFtZX0tZGVsZXRlLWxpbmtgfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkljb24gbmFtZT1cImNsb3NlXCIgLz57XCIgXCJ9XG4gICAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICAgIGlkPVwiZm9ybXMuZGVsZXRlXCJcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9XCJEZWxldGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1Z1bGNhbkNvbXBvbmVudHMuQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuRm9ybVN1Ym1pdC5wcm9wVHlwZXMgPSB7XG4gIHN1Ym1pdExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgY2FuY2VsTGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBjYW5jZWxDYWxsYmFjazogUHJvcFR5cGVzLmZ1bmMsXG4gIHJldmVydExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgcmV2ZXJ0Q2FsbGJhY2s6IFByb3BUeXBlcy5mdW5jLFxuICBkb2N1bWVudDogUHJvcFR5cGVzLm9iamVjdCxcbiAgZGVsZXRlRG9jdW1lbnQ6IFByb3BUeXBlcy5mdW5jLFxuICBjb2xsZWN0aW9uTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtTGF5b3V0UHJvcHMge1xuICBjb21tb25Qcm9wczogYW55O1xuICBmb3JtUHJvcHM6IGFueTtcbiAgc3VibWl0UHJvcHM6IGFueTtcbiAgcmVwZWF0RXJyb3JzPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBjb25zdCBGb3JtTGF5b3V0OiBSZWFjdC5GQzxGb3JtTGF5b3V0UHJvcHM+ID0gKHtcbiAgY29tbW9uUHJvcHMsXG4gIGZvcm1Qcm9wcyxcbiAgcmVwZWF0RXJyb3JzLFxuICBzdWJtaXRQcm9wcyxcbiAgY2hpbGRyZW4sXG59KSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUVsZW1lbnQgey4uLmZvcm1Qcm9wc30+XG4gICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtRXJyb3JzIHsuLi5jb21tb25Qcm9wc30gLz5cblxuICAgICAge2NoaWxkcmVufVxuXG4gICAgICB7cmVwZWF0RXJyb3JzICYmIDxWdWxjYW5Db21wb25lbnRzLkZvcm1FcnJvcnMgey4uLmNvbW1vblByb3BzfSAvPn1cblxuICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybVN1Ym1pdCB7Li4uY29tbW9uUHJvcHN9IHsuLi5zdWJtaXRQcm9wc30gLz5cbiAgICA8L1Z1bGNhbkNvbXBvbmVudHMuRm9ybUVsZW1lbnQ+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybUNvbXBvbmVudHNEZXBlbmRlbmNpZXMgPSBbXG4gIFwiRm9ybUVycm9yc1wiLFxuICBcIkZvcm1TdWJtaXRcIixcbiAgXCJGb3JtRWxlbWVudFwiLFxuXTtcbiIsIi8qKlxuICogQ2hhbmdlIGNvbXBhcmVkIHRvIFZ1bGNhbiBNZXRlb3I6XG4gKiBhZnRlci9iZWZvcmUgPT4gQWZ0ZXIsIEJlZm9yZSB3aXRoIHRpdGxlY2FzZVxuICovXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgX29taXQgZnJvbSBcImxvZGFzaC9vbWl0XCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbi8vIFdyYXBzIHRoZSBGb3JtTmVzdGVkSXRlbSwgcmVwZWF0ZWQgZm9yIGVhY2ggb2JqZWN0XG4vLyBBbGxvdyBmb3IgZXhhbXBsZSB0byBoYXZlIGEgbGFiZWwgcGVyIG9iamVjdFxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRBcnJheUlubmVyTGF5b3V0ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgbGFiZWwsIGNoaWxkcmVuLCBhZGRJdGVtLCBCZWZvcmVDb21wb25lbnQsIEFmdGVyQ29tcG9uZW50IH0gPSBwcm9wcztcbiAgY29uc3QgRm9ybUNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1hcnJheS1pbm5lci1sYXlvdXRcIj5cbiAgICAgIDxCZWZvcmVDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAge2NoaWxkcmVufVxuICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1OZXN0ZWREaXZpZGVyIGxhYmVsPXtsYWJlbH0gYWRkSXRlbT17YWRkSXRlbX0gLz5cbiAgICAgIDxBZnRlckNvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1OZXN0ZWRBcnJheVByb3BzPFRWYWx1ZSA9IGFueT4ge1xuICB2YWx1ZTogVFZhbHVlO1xuICAvKiogUGF0aCBmb3IgdGhlIG5lc3RlZCBvYmplY3QgKi9cbiAgcGF0aDogc3RyaW5nO1xuICBpdGVtUHJvcGVydGllczogYW55O1xuICBtaW5Db3VudD86IG51bWJlcjtcbiAgbWF4Q291bnQ/OiBudW1iZXI7XG4gIGFycmF5RmllbGQ/OiBib29sZWFuO1xuICBuZXN0ZWRBcnJheUVycm9yczogYW55O1xuICBoYXNFcnJvcnM/OiBib29sZWFuO1xuICAvLyBUT0RPOiBnZXQgZnJvbSBjb250ZXh0XG4gIHByZWZpbGxlZFByb3BzPzogYW55O1xuICBhZGRJdGVtOiBGdW5jdGlvbiB8IG51bGw7XG59XG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZEFycmF5ID0gKHByb3BzOiBGb3JtTmVzdGVkQXJyYXlQcm9wcykgPT4ge1xuICBjb25zdCB7IHVwZGF0ZUN1cnJlbnRWYWx1ZXMsIGRlbGV0ZWRWYWx1ZXMsIGVycm9ycyB9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgLypzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGl0ZW1Qcm9wZXJ0aWVzOiB7fSxcbiAgfTsqL1xuICBjb25zdCB2YWx1ZSA9IHByb3BzLnZhbHVlIHx8IFtdO1xuXG4gIGNvbnN0IGFkZEl0ZW0gPSAoKSA9PiB7XG4gICAgY29uc3QgeyBwcmVmaWxsZWRQcm9wcywgcGF0aCB9ID0gcHJvcHM7XG4gICAgdXBkYXRlQ3VycmVudFZhbHVlcyhcbiAgICAgIHsgW2Ake3BhdGh9LiR7dmFsdWUubGVuZ3RofWBdOiBfZ2V0KHByZWZpbGxlZFByb3BzLCBgJHtwYXRofS4kYCkgfHwge30gfSxcbiAgICAgIHsgbW9kZTogXCJtZXJnZVwiIH1cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHJlbW92ZUl0ZW0gPSAoaW5kZXgpID0+IHtcbiAgICB1cGRhdGVDdXJyZW50VmFsdWVzKHsgW2Ake3Byb3BzLnBhdGh9LiR7aW5kZXh9YF06IG51bGwgfSk7XG4gIH07XG5cbiAgLypcblxuICBHbyB0aHJvdWdoIHRoaXMuY29udGV4dC5kZWxldGVkVmFsdWVzIGFuZCBzZWUgaWYgYW55IHZhbHVlIG1hdGNoZXMgYm90aCB0aGUgY3VycmVudCBmaWVsZFxuICBhbmQgdGhlIGdpdmVuIGluZGV4IChleDogaWYgd2Ugd2FudCB0byBrbm93IGlmIHRoZSBzZWNvbmQgYWRkcmVzcyBpcyBkZWxldGVkLCB3ZVxuICBsb29rIGZvciB0aGUgcHJlc2VuY2Ugb2YgJ2FkZHJlc3Nlcy4xJylcbiAgKi9cbiAgY29uc3QgaXNEZWxldGVkID0gKGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIGRlbGV0ZWRWYWx1ZXMuaW5jbHVkZXMoYCR7cHJvcHMucGF0aH0uJHtpbmRleH1gKTtcbiAgfTtcblxuICBjb25zdCBjb21wdXRlVmlzaWJsZUluZGV4ID0gKHZhbHVlcykgPT4ge1xuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIGNvbnN0IHZpc2libGVJbmRleGVzID0gdmFsdWVzLm1hcCgoc3ViRG9jdW1lbnQsIHN1YkRvY3VtZW50SW5keCkgPT4ge1xuICAgICAgaWYgKGlzRGVsZXRlZChzdWJEb2N1bWVudEluZHgpKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmlzaWJsZUluZGV4ZXM7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJvcHMuaXRlbVByb3BlcnRpZXMub3Blbk5lc3RlZCkgYWRkSXRlbSgpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgdmlzaWJsZUl0ZW1JbmRleGVzID0gY29tcHV0ZVZpc2libGVJbmRleCh2YWx1ZSk7XG4gIC8vIGRvIG5vdCBwYXNzIEZvcm1OZXN0ZWQncyBvd24gdmFsdWUsIGlucHV0IGFuZCBpbnB1dFByb3BlcnRpZXMgcHJvcHMgZG93blxuICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgIC4uLl9vbWl0KFxuICAgICAgcHJvcHMsXG4gICAgICBcInZhbHVlXCIsXG4gICAgICBcImlucHV0XCIsXG4gICAgICBcImlucHV0UHJvcGVydGllc1wiLFxuICAgICAgXCJuZXN0ZWRJbnB1dFwiLFxuICAgICAgXCJiZWZvcmVDb21wb25lbnRcIixcbiAgICAgIFwiYWZ0ZXJDb21wb25lbnRcIlxuICAgICksXG4gIH07XG4gIGNvbnN0IHsgcGF0aCwgbWluQ291bnQsIG1heENvdW50LCBhcnJheUZpZWxkIH0gPSBwcm9wcztcbiAgY29uc3QgRm9ybUNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG5cbiAgLy9maWx0ZXIgb3V0IG51bGwgdmFsdWVzIHRvIGNhbGN1bGF0ZSBhcnJheSBsZW5ndGhcbiAgbGV0IGFycmF5TGVuZ3RoID0gdmFsdWUuZmlsdGVyKChzaW5nbGVWYWx1ZSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygc2luZ2xlVmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgc2luZ2xlVmFsdWUgIT09IG51bGw7XG4gIH0pLmxlbmd0aDtcbiAgcHJvcGVydGllcy5hZGRJdGVtID0gIW1heENvdW50IHx8IGFycmF5TGVuZ3RoIDwgbWF4Q291bnQgPyBhZGRJdGVtIDogbnVsbDtcblxuICAvLyBvbmx5IGtlZXAgZXJyb3JzIHNwZWNpZmljIHRvIHRoZSBuZXN0ZWQgYXJyYXkgKGFuZCBub3QgaXRzIHN1YmZpZWxkcylcbiAgcHJvcGVydGllcy5uZXN0ZWRBcnJheUVycm9ycyA9IGVycm9ycy5maWx0ZXIoXG4gICAgKGVycm9yKSA9PiBlcnJvci5wYXRoICYmIGVycm9yLnBhdGggPT09IHBhdGhcbiAgKTtcbiAgcHJvcGVydGllcy5oYXNFcnJvcnMgPSAhIShcbiAgICBwcm9wZXJ0aWVzLm5lc3RlZEFycmF5RXJyb3JzICYmIHByb3BlcnRpZXMubmVzdGVkQXJyYXlFcnJvcnMubGVuZ3RoXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZEFycmF5TGF5b3V0IHsuLi5wcm9wZXJ0aWVzfT5cbiAgICAgIHt2YWx1ZS5tYXAoKHN1YkRvY3VtZW50LCBpKSA9PiB7XG4gICAgICAgIGlmIChpc0RlbGV0ZWQoaSkpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBwYXRoID0gYCR7cHJvcHMucGF0aH0uJHtpfWA7XG4gICAgICAgIGNvbnN0IHZpc2libGVJdGVtSW5kZXggPSB2aXNpYmxlSXRlbUluZGV4ZXNbaV07XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1OZXN0ZWRBcnJheUlubmVyTGF5b3V0XG4gICAgICAgICAgICB7Li4uYXJyYXlGaWVsZH1cbiAgICAgICAgICAgIGtleT17cGF0aH1cbiAgICAgICAgICAgIGFkZEl0ZW09e2FkZEl0ZW19XG4gICAgICAgICAgICBpdGVtSW5kZXg9e2l9XG4gICAgICAgICAgICB2aXNpYmxlSXRlbUluZGV4PXt2aXNpYmxlSXRlbUluZGV4fVxuICAgICAgICAgICAgcGF0aD17cGF0aH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZEl0ZW1cbiAgICAgICAgICAgICAgey4uLnByb3BlcnRpZXN9XG4gICAgICAgICAgICAgIGl0ZW1JbmRleD17aX1cbiAgICAgICAgICAgICAgdmlzaWJsZUl0ZW1JbmRleD17dmlzaWJsZUl0ZW1JbmRleH1cbiAgICAgICAgICAgICAgcGF0aD17cGF0aH1cbiAgICAgICAgICAgICAgcmVtb3ZlSXRlbT17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW92ZUl0ZW0oaSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGhpZGVSZW1vdmU9eyEhbWluQ291bnQgJiYgYXJyYXlMZW5ndGggPD0gbWluQ291bnR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXQ+XG4gICAgICAgICk7XG4gICAgICB9KX1cbiAgICA8L0Zvcm1Db21wb25lbnRzLkZvcm1OZXN0ZWRBcnJheUxheW91dD5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtQ29tcG9uZW50c0RlcGVuZGVuY2llcyA9IFtcbiAgXCJGb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dFwiLFxuICBcIkZvcm1OZXN0ZWRBcnJheUxheW91dFwiLFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybU5lc3RlZEFycmF5O1xuXG5leHBvcnQgY29uc3QgSWNvbkFkZCA9ICh7IHdpZHRoID0gMjQsIGhlaWdodCA9IDI0IH0pID0+IChcbiAgPHN2Z1xuICAgIHdpZHRoPXt3aWR0aH1cbiAgICBoZWlnaHQ9e2hlaWdodH1cbiAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIlxuICA+XG4gICAgPHBhdGhcbiAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgZD1cIk00NDggMjk0LjJ2LTc2LjRjMC0xMy4zLTEwLjctMjQtMjQtMjRIMjg2LjJWNTZjMC0xMy4zLTEwLjctMjQtMjQtMjRoLTc2LjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0djEzNy44SDI0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHY3Ni40YzAgMTMuMyAxMC43IDI0IDI0IDI0aDEzNy44VjQ1NmMwIDEzLjMgMTAuNyAyNCAyNCAyNGg3Ni40YzEzLjMgMCAyNC0xMC43IDI0LTI0VjMxOC4ySDQyNGMxMy4zIDAgMjQtMTAuNyAyNC0yNHpcIlxuICAgIC8+XG4gIDwvc3ZnPlxuKTtcblxuZXhwb3J0IGNvbnN0IEljb25SZW1vdmUgPSAoeyB3aWR0aCA9IDI0LCBoZWlnaHQgPSAyNCB9KSA9PiAoXG4gIDxzdmdcbiAgICB3aWR0aD17d2lkdGh9XG4gICAgaGVpZ2h0PXtoZWlnaHR9XG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgdmlld0JveD1cIjAgMCA0NDggNTEyXCJcbiAgPlxuICAgIDxwYXRoXG4gICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgIGQ9XCJNNDI0IDMxOC4yYzEzLjMgMCAyNC0xMC43IDI0LTI0di03Ni40YzAtMTMuMy0xMC43LTI0LTI0LTI0SDI0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHY3Ni40YzAgMTMuMyAxMC43IDI0IDI0IDI0aDQwMHpcIlxuICAgIC8+XG4gIDwvc3ZnPlxuKTtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG4vLyBSZXBsYWNlYWJsZSBsYXlvdXQsIGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkQXJyYXlMYXlvdXQgPSAocHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGhhc0Vycm9ycyxcbiAgICBuZXN0ZWRBcnJheUVycm9ycyxcbiAgICBsYWJlbCxcbiAgICBhZGRJdGVtLFxuICAgIEJlZm9yZUNvbXBvbmVudCxcbiAgICBBZnRlckNvbXBvbmVudCxcbiAgICBjaGlsZHJlbixcbiAgfSA9IHByb3BzO1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtgZm9ybS1ncm91cCByb3cgZm9ybS1uZXN0ZWQgJHtoYXNFcnJvcnMgPyBcImlucHV0LWVycm9yXCIgOiBcIlwifWB9XG4gICAgPlxuICAgICAge0JlZm9yZUNvbXBvbmVudCAmJiA8QmVmb3JlQ29tcG9uZW50IHsuLi5wcm9wc30gLz59XG5cbiAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJjb250cm9sLWxhYmVsIGNvbC1zbS0zXCI+e2xhYmVsfTwvbGFiZWw+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTlcIj5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgICB7YWRkSXRlbSAmJiAoXG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuQnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1idXR0b24gZm9ybS1uZXN0ZWQtYWRkXCJcbiAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICB2YXJpYW50PVwic3VjY2Vzc1wiXG4gICAgICAgICAgICBvbkNsaWNrPXthZGRJdGVtfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkljb25BZGQgaGVpZ2h0PXsxMn0gd2lkdGg9ezEyfSAvPlxuICAgICAgICAgIDwvVnVsY2FuQ29tcG9uZW50cy5CdXR0b24+XG4gICAgICAgICl9XG4gICAgICAgIHtwcm9wcy5oYXNFcnJvcnMgPyAoXG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRmllbGRFcnJvcnNcbiAgICAgICAgICAgIGtleT1cImZvcm0tbmVzdGVkLWVycm9yc1wiXG4gICAgICAgICAgICBlcnJvcnM9e25lc3RlZEFycmF5RXJyb3JzfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtBZnRlckNvbXBvbmVudCAmJiA8QWZ0ZXJDb21wb25lbnQgey4uLnByb3BzfSAvPn1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbkZvcm1OZXN0ZWRBcnJheUxheW91dC5wcm9wVHlwZXMgPSB7XG4gIGhhc0Vycm9yczogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbmVzdGVkQXJyYXlFcnJvcnM6IFByb3BUeXBlcy5hcnJheSxcbiAgbGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBoaWRlTGFiZWw6IFByb3BUeXBlcy5ib29sLFxuICBhZGRJdGVtOiBQcm9wVHlwZXMuZnVuYyxcbiAgYmVmb3JlQ29tcG9uZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgYWZ0ZXJDb21wb25lbnQ6IFByb3BUeXBlcy5ub2RlLFxuICBmb3JtQ29tcG9uZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybU5lc3RlZEFycmF5TGF5b3V0O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgaW50bFNoYXBlIH0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUludGxDb250ZXh0IH0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5cbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkSXRlbUxheW91dCA9ICh7IGNvbnRlbnQsIHJlbW92ZUJ1dHRvbiB9KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbVwiPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1pbm5lclwiPntjb250ZW50fTwvZGl2PlxuICAgIHtyZW1vdmVCdXR0b24gJiYgW1xuICAgICAgPGRpdiBrZXk9XCJyZW1vdmUtYnV0dG9uXCIgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1yZW1vdmVcIj5cbiAgICAgICAge3JlbW92ZUJ1dHRvbn1cbiAgICAgIDwvZGl2PixcbiAgICAgIDxkaXZcbiAgICAgICAga2V5PVwicmVtb3ZlLWJ1dHRvbi1vdmVybGF5XCJcbiAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1kZWxldGVkLW92ZXJsYXlcIlxuICAgICAgLz4sXG4gICAgXX1cbiAgPC9kaXY+XG4pO1xuRm9ybU5lc3RlZEl0ZW1MYXlvdXQucHJvcFR5cGVzID0ge1xuICBjb250ZW50OiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICByZW1vdmVCdXR0b246IFByb3BUeXBlcy5ub2RlLFxufTtcblxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRJdGVtID0gKHtcbiAgbmVzdGVkRmllbGRzLFxuICBuYW1lLFxuICBwYXRoLFxuICByZW1vdmVJdGVtLFxuICBpdGVtSW5kZXgsXG4gIGZvcm1Db21wb25lbnRzLFxuICBoaWRlUmVtb3ZlLFxuICBsYWJlbCxcbiAgLi4ucHJvcHNcbn0pID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgaW50bCA9IHVzZUludGxDb250ZXh0KCk7XG4gIGNvbnN0IGlzQXJyYXkgPSB0eXBlb2YgaXRlbUluZGV4ICE9PSBcInVuZGVmaW5lZFwiO1xuICByZXR1cm4gKFxuICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1OZXN0ZWRJdGVtTGF5b3V0XG4gICAgICBjb250ZW50PXtuZXN0ZWRGaWVsZHMubWFwKChmaWVsZCwgaSkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1Db21wb25lbnRcbiAgICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICAgIHsuLi5maWVsZH1cbiAgICAgICAgICAgIHBhdGg9e2Ake3BhdGh9LiR7ZmllbGQubmFtZX1gfVxuICAgICAgICAgICAgaXRlbUluZGV4PXtpdGVtSW5kZXh9XG4gICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICAgIH0pfVxuICAgICAgcmVtb3ZlQnV0dG9uPXtcbiAgICAgICAgaXNBcnJheSAmJlxuICAgICAgICAhaGlkZVJlbW92ZSAmJiBbXG4gICAgICAgICAgPGRpdiBrZXk9XCJyZW1vdmUtYnV0dG9uXCIgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1yZW1vdmVcIj5cbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkJ1dHRvblxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1idXR0b25cIlxuICAgICAgICAgICAgICB2YXJpYW50PVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgaWNvbkJ1dHRvblxuICAgICAgICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtKG5hbWUpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgeyBpZDogXCJmb3Jtcy5kZWxldGVfbmVzdGVkX2ZpZWxkXCIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBsYWJlbCB9XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkljb25SZW1vdmUgaGVpZ2h0PXsxMn0gd2lkdGg9ezEyfSAvPlxuICAgICAgICAgICAgPC9WdWxjYW5Db21wb25lbnRzLkJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PVwicmVtb3ZlLWJ1dHRvbi1vdmVybGF5XCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tbmVzdGVkLWl0ZW0tZGVsZXRlZC1vdmVybGF5XCJcbiAgICAgICAgICAvPixcbiAgICAgICAgXVxuICAgICAgfVxuICAgIC8+XG4gICk7XG59O1xuXG5Gb3JtTmVzdGVkSXRlbS5wcm9wVHlwZXMgPSB7XG4gIHBhdGg6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgaXRlbUluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICBmb3JtQ29tcG9uZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgaGlkZVJlbW92ZTogUHJvcFR5cGVzLmJvb2wsXG59O1xuXG5Gb3JtTmVzdGVkSXRlbS5jb250ZXh0VHlwZXMgPSB7XG4gIGVycm9yczogUHJvcFR5cGVzLmFycmF5LFxuICBpbnRsOiBpbnRsU2hhcGUsXG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZERpdmlkZXIgPSAoeyBsYWJlbCwgYWRkSXRlbSB9KSA9PiA8ZGl2IC8+O1xuXG5Gb3JtTmVzdGVkRGl2aWRlci5wcm9wVHlwZXMgPSB7XG4gIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhZGRJdGVtOiBQcm9wVHlwZXMuZnVuYyxcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuLy8gVHJhY2sgZGVwZW5kZW5jaWVzLCBub3QgdXNlZCB5ZXRcbmV4cG9ydCBjb25zdCBmb3JtQ29tcG9uZW50c0RlcGVuZGVuY2llcyA9IFtcIkZvcm1FcnJvclwiXTtcblxuLyoqXG4gKiBFcnJvcnMgZm9yIG9uZSBzcGVjaWYgZmllbGRzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgRmllbGRFcnJvcnMgPSAoe1xuICBlcnJvcnMsXG59OiB7XG4gIC8qKlxuICAgKiBFcnJvcnMgZm9yIHRoaXMgc3BlY2lmaWMgZmllbGQgb25seVxuICAgKi9cbiAgZXJyb3JzOiBBcnJheTxhbnk+O1xufSkgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICByZXR1cm4gKFxuICAgIDx1bCBjbGFzc05hbWU9XCJmb3JtLWlucHV0LWVycm9yc1wiPlxuICAgICAge2Vycm9ycy5tYXAoKGVycm9yLCBpbmRleCkgPT4gKFxuICAgICAgICA8bGkga2V5PXtpbmRleH0+XG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUVycm9yIGVycm9yPXtlcnJvcn0gZXJyb3JDb250ZXh0PVwiZmllbGRcIiAvPlxuICAgICAgICA8L2xpPlxuICAgICAgKSl9XG4gICAgPC91bD5cbiAgKTtcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgX29taXQgZnJvbSBcImxvZGFzaC9vbWl0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuLy8gUmVwbGFjZWFibGUgbGF5b3V0XG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZE9iamVjdExheW91dCA9ICh7IGhhc0Vycm9ycywgbGFiZWwsIGNvbnRlbnQgfSkgPT4gKFxuICA8ZGl2XG4gICAgY2xhc3NOYW1lPXtgZm9ybS1ncm91cCByb3cgZm9ybS1uZXN0ZWQgJHtoYXNFcnJvcnMgPyBcImlucHV0LWVycm9yXCIgOiBcIlwifWB9XG4gID5cbiAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY29udHJvbC1sYWJlbCBjb2wtc20tM1wiPntsYWJlbH08L2xhYmVsPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTlcIj57Y29udGVudH08L2Rpdj5cbiAgPC9kaXY+XG4pO1xuRm9ybU5lc3RlZE9iamVjdExheW91dC5wcm9wVHlwZXMgPSB7XG4gIGhhc0Vycm9yczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgbGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBjb250ZW50OiBQcm9wVHlwZXMubm9kZSxcbn07XG5cbmludGVyZmFjZSBGb3JtTmVzdGVkT2JqZWN0UHJvcHMge1xuICBsYWJlbD86IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgaW5wdXQ6IGFueTtcbiAgaW5wdXRQcm9wZXJ0aWVzOiBhbnk7XG4gIG5lc3RlZElucHV0OiBhbnk7XG4gIGVycm9yczogQXJyYXk8YW55PjtcbiAgcGF0aDogc3RyaW5nO1xufVxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRPYmplY3QgPSAocHJvcHM6IEZvcm1OZXN0ZWRPYmplY3RQcm9wcykgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICAvL2NvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsdWUoKVxuICAvLyBkbyBub3QgcGFzcyBGb3JtTmVzdGVkJ3Mgb3duIHZhbHVlLCBpbnB1dCBhbmQgaW5wdXRQcm9wZXJ0aWVzIHByb3BzIGRvd25cbiAgY29uc3QgcHJvcGVydGllcyA9IF9vbWl0KFxuICAgIHByb3BzLFxuICAgIFwidmFsdWVcIixcbiAgICBcImlucHV0XCIsXG4gICAgXCJpbnB1dFByb3BlcnRpZXNcIixcbiAgICBcIm5lc3RlZElucHV0XCJcbiAgKTtcbiAgY29uc3QgeyBlcnJvcnMgfSA9IHVzZUZvcm1Db250ZXh0KCk7XG4gIC8vIG9ubHkga2VlcCBlcnJvcnMgc3BlY2lmaWMgdG8gdGhlIG5lc3RlZCBhcnJheSAoYW5kIG5vdCBpdHMgc3ViZmllbGRzKVxuICBjb25zdCBuZXN0ZWRPYmplY3RFcnJvcnMgPSBlcnJvcnMuZmlsdGVyKFxuICAgIChlcnJvcikgPT4gZXJyb3IucGF0aCAmJiBlcnJvci5wYXRoID09PSBwcm9wcy5wYXRoXG4gICk7XG4gIGNvbnN0IGhhc0Vycm9ycyA9IG5lc3RlZE9iamVjdEVycm9ycyAmJiBuZXN0ZWRPYmplY3RFcnJvcnMubGVuZ3RoO1xuICByZXR1cm4gKFxuICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1OZXN0ZWRPYmplY3RMYXlvdXRcbiAgICAgIGhhc0Vycm9ycz17aGFzRXJyb3JzfVxuICAgICAgbGFiZWw9e3Byb3BzLmxhYmVsfVxuICAgICAgY29udGVudD17W1xuICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtTmVzdGVkSXRlbVxuICAgICAgICAgIGtleT1cImZvcm0tbmVzdGVkLWl0ZW1cIlxuICAgICAgICAgIHsuLi5wcm9wZXJ0aWVzfVxuICAgICAgICAgIHBhdGg9e2Ake3Byb3BzLnBhdGh9YH1cbiAgICAgICAgLz4sXG4gICAgICAgIGhhc0Vycm9ycyA/IChcbiAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5GaWVsZEVycm9yc1xuICAgICAgICAgICAga2V5PVwiZm9ybS1uZXN0ZWQtZXJyb3JzXCJcbiAgICAgICAgICAgIGVycm9ycz17bmVzdGVkT2JqZWN0RXJyb3JzfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsLFxuICAgICAgXX1cbiAgICAvPlxuICApO1xufTtcblxuRm9ybU5lc3RlZE9iamVjdC5wcm9wVHlwZXMgPSB7XG4gIGN1cnJlbnRWYWx1ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIHBhdGg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBlcnJvcnM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICBmb3JtQ29tcG9uZW50czogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1OZXN0ZWRPYmplY3Q7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCBjb25zdCBGb3JtT3B0aW9uTGFiZWwgPSAoeyBvcHRpb24gfSkgPT4ge1xuICBjb25zdCB7IGxhYmVsIH0gPSBvcHRpb247XG4gIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJmb3JtLW9wdGlvbi1sYWJlbFwiPntsYWJlbH08L3NwYW4+O1xufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEZvcm1JbnB1dFByb3BzIH0gZnJvbSBcIi4uL0Zvcm1Db21wb25lbnRJbm5lclwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi8uLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbi8qKlxuICogQ29udmVydHMgcHJvcHMgcGFzc2VkIGJ5IFZ1bGNhbiB0byBhbiBIVE1MIElucHV0XG4gKiBAc2VlIHBhY2thZ2VzL3Z1bGNhbi11aS1ib290c3RyYXAvbGliL2NvbXBvbmVudHMvZm9ybXMvRm9ybUl0ZW0uanN4IGluIFZ1bGNhblxuICogQHBhcmFtIHBhcmFtMFxuICogQHJldHVybnNcbiAqL1xuY29uc3QgSFRNTElucHV0QWRhcHRlciA9IChwcm9wczogRm9ybUlucHV0UHJvcHMgJiB7IHR5cGU6IHN0cmluZyB9KSA9PiB7XG4gIGNvbnN0IENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IHsgaW5wdXRQcm9wZXJ0aWVzIH0gPSBwcm9wcztcbiAgY29uc3QgeyBsYWJlbCwgbmFtZSwgLi4ub3RoZXJJbnB1dFByb3BlcnRpZXMgfSA9IGlucHV0UHJvcGVydGllcztcblxuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnRzLkZvcm1JdGVtXG4gICAgICBuYW1lPXtuYW1lfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgaW5wdXRQcm9wZXJ0aWVzPXtpbnB1dFByb3BlcnRpZXN9XG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIHsuLi5vdGhlcklucHV0UHJvcGVydGllc31cbiAgICAgICAgaWQ9e25hbWV9IC8vIG5lZWRlZCBmb3IgYWNjZXNzaWJpbGl0eS4gTk9URTogd2UgbWlnaHQgbmVlZCB0byB1c2UgXCJjb250ZXh0XCIgYXMgYSBwcmVmaXggd2hlbiBoYXZpbmdcbiAgICAgICAgLy8gbXVsdGlwbGUgZm9ybXMgZm9yIHRoZSBzYW1lIGtpbmQgb2YgZGF0YVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB0eXBlPXtwcm9wcy50eXBlfVxuICAgICAgLz5cbiAgICA8L0NvbXBvbmVudHMuRm9ybUl0ZW0+XG4gICk7XG59OyAvLyBUT0RPOiBtaWdodCBuZWVkIHNvbWUgc2FuaXRpemF0aW9uXG4vLyBGb3IgY29uc2lzdGVuY3kgd2l0aCBWdWxjYW4gTWV0ZW9yIHVpIGJvb3RzdHJhcCBhbmQgdWkgbWF0ZXJpYWxcbi8vwqBAc2VlIHBhY2thZ2VzL3Z1bGNhbi11aS1ib290c3RyYXAvbGliL2NvbXBvbmVudHMvZm9ybXMvRm9ybUl0ZW0uanN4XG5leHBvcnQgY29uc3QgRm9ybUl0ZW0gPSAoXG4gIHByb3BzOiBGb3JtSW5wdXRQcm9wc1tcIml0ZW1Qcm9wZXJ0aWVzXCJdICZcbiAgICBQaWNrPEZvcm1JbnB1dFByb3BzW1wiaW5wdXRQcm9wZXJ0aWVzXCJdLCBcImxhYmVsXCIgfCBcIm5hbWVcIj5cbikgPT4ge1xuICBjb25zdCB7IGlucHV0UHJvcGVydGllcywgbGFiZWwsIG5hbWUgfSA9IHByb3BzO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtgZm9ybS1pdGVtICR7bmFtZX1gfT5cbiAgICAgIDxsYWJlbCBodG1sRm9yPXtuYW1lfT57bGFiZWx9PC9sYWJlbD5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmNvbnN0IEhUTUxTZWxlY3RBZGFwdGVyID0gKHByb3BzOiBGb3JtSW5wdXRQcm9wcykgPT4ge1xuICBjb25zdCB7IGlucHV0UHJvcGVydGllcywgb3B0aW9ucyA9IFtdIH0gPSBwcm9wcztcbiAgY29uc3QgeyBsYWJlbCwgbmFtZSB9ID0gaW5wdXRQcm9wZXJ0aWVzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSFRNTFNlbGVjdEFkYXBhdGVyIG5vdCB5ZXQgc3VwcG9ydGluZyBmdW5jdGlvbmFsIG9wdGlvbnNcIik7XG5cbiAgY29uc3QgQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50cy5Gb3JtSXRlbVxuICAgICAgbmFtZT17bmFtZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGlucHV0UHJvcGVydGllcz17aW5wdXRQcm9wZXJ0aWVzfVxuICAgID5cbiAgICAgIHsvKiogVE9ETzogd2hpdGVsaXN0aW5nIGZlYXR1cmUgc2hvdWxkIGJlIHNtYXJ0ZXIgdG8gZGlmZmVyZW50aWF0ZSBzZWxlY3QgYW5kIGlucHV0ICovfVxuICAgICAgPHNlbGVjdFxuICAgICAgICB7Li4uKGlucHV0UHJvcGVydGllcyBhcyB1bmtub3duIGFzIFJlYWN0LkhUTUxQcm9wczxIVE1MU2VsZWN0RWxlbWVudD4pfVxuICAgICAgPlxuICAgICAgICB7b3B0aW9ucy5tYXAoKHsgbGFiZWwsIHZhbHVlIH0pID0+IChcbiAgICAgICAgICA8b3B0aW9uIGtleT17dmFsdWV9IGxhYmVsPXtsYWJlbH0gdmFsdWU9e3ZhbHVlfT48L29wdGlvbj5cbiAgICAgICAgKSl9XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L0NvbXBvbmVudHMuRm9ybUl0ZW0+XG4gICk7XG59O1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnREZWZhdWx0ID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJ0ZXh0XCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50UGFzc3dvcmQgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cInBhc3N3b3JkXCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50TnVtYmVyID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJudW1iZXJcIiB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRVcmwgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cInVybFwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudEVtYWlsID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJlbWFpbFwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFRleHRhcmVhID0gKHByb3BzKSA9PiA8dGV4dGFyZWEgey4uLnByb3BzfSAvPjtcbi8vIFRPRE86IGF0IHRoZSBtb21lbnQgd2UgdXNlIGEgc2VsZWN0IGluc3RlYWRcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50Q2hlY2tib3ggPSAocHJvcHMpID0+IChcbiAgPEhUTUxTZWxlY3RBZGFwdGVyIHR5cGU9XCJjaGVja2JveFwiIHsuLi5wcm9wc30gLz5cbik7XG4vLyBUT0RPOiBhdG0gd2UgdXNlIGEgc2VsZWN0IG11bHRpcGxlIGluc3RlYWQgb2YgY2hlY2tib3hlc1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRDaGVja2JveEdyb3VwID0gKHByb3BzKSA9PiAoXG4gIDxGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGUgey4uLnByb3BzfSAvPlxuKTtcbi8vIFRPRE86IGF0bSB3ZSB1c2UgYSBzZWxlY3QgaW5zdGVhZCBvZiByYWRpb1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRSYWRpb0dyb3VwID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgaW5wdXRQcm9wZXJ0aWVzLCBvcHRpb25zID0gW10gfSA9IHByb3BzO1xuICBjb25zdCB7IGxhYmVsLCBuYW1lIH0gPSBpbnB1dFByb3BlcnRpZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYWRpb0dyb3VwIG5vdCB5ZXQgc3VwcG9ydGluZyBmdW5jdGlvbmFsIG9wdGlvbnNcIik7XG5cbiAgY29uc3QgQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50cy5Gb3JtSXRlbVxuICAgICAgbmFtZT17bmFtZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGlucHV0UHJvcGVydGllcz17aW5wdXRQcm9wZXJ0aWVzfVxuICAgID5cbiAgICAgIHsvKiogVE9ETzogd2hpdGVsaXN0aW5nIGZlYXR1cmUgc2hvdWxkIGJlIHNtYXJ0ZXIgdG8gZGlmZmVyZW50aWF0ZSBzZWxlY3QgYW5kIGlucHV0ICovfVxuICAgICAge29wdGlvbnMubWFwKCh7IGxhYmVsLCB2YWx1ZSB9KSA9PiAoXG4gICAgICAgIDxkaXYga2V5PXt2YWx1ZX0+XG4gICAgICAgICAgPGxhYmVsIGh0bWxGb3I9e3ZhbHVlfT57bGFiZWx9PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICBpZD17dmFsdWV9XG4gICAgICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICAgICAga2V5PXt2YWx1ZX1cbiAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkpfVxuICAgIDwvQ29tcG9uZW50cy5Gb3JtSXRlbT5cbiAgKTtcbn07XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFNlbGVjdCA9IChwcm9wczogRm9ybUlucHV0UHJvcHMpID0+IChcbiAgPEhUTUxTZWxlY3RBZGFwdGVyIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIHJldHVybiA8Q29tcG9uZW50cy5Gb3JtQ29tcG9uZW50U2VsZWN0IG11bHRpcGxlIHsuLi5wcm9wc30gLz47XG59O1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnREYXRlID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJkYXRlXCIgey4uLnByb3BzfSAvPlxuKTtcbi8qXG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudERhdGUyID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHsuLi5wcm9wc30gLz5cbik7XG4qL1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnREYXRlVGltZSA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRUaW1lID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJ0aW1lXCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50U3RhdGljVGV4dCA9IChwcm9wcykgPT4gPGlucHV0IGRpc2FibGVkIHsuLi5wcm9wc30gLz47XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudExpa2VydCA9IChwcm9wcykgPT5cbiAgXCJMaWtlcnQgY29tcG9uZW50IG5vdCB5ZXQgaW1wbGVtZW50ZWRcIjtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50QXV0b2NvbXBsZXRlID0gKHByb3BzKSA9PlxuICBcIkF1dG9jb21wbGV0ZSBjb21wb25lbnQgbm90IHlldCBpbXBsZW1lbnRlZFwiO1xuLy9leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudE11bHRpQXV0b2NvbXBsZXRlID0gKHByb3BzKSA9PlxuLy8gIFwiTXVsdGlBdXRvY29tcGxldGUgY29tcG9uZW50IG5vdCB5ZXQgaW1wbGVtZW50ZWRcIjtcbiIsIi8qKlxuICpcbiAqIC8vIENvcGllZCBmb3IgYm9vdHN0cmFwIHBhY2thZ2VcbiAqIC8vIFRPRE86IGZpbmQgYSBtb3JlIGdlbmVyaWMgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBJZGVhbGx5IGZvciBzdWNoIGEgcmljaCBjb21wb25lbnQgd2Ugc2hvdWxkIGFsc28gZXhwb3NlXG4gKiBob29rcyBhbmQgaW50ZXJuYWwgbG9naWMgc28gdXNlcnMgY2FuIGJ1aWxkIHRoZWlyIG93blxuICovXG5pbXBvcnQgeyBBc3luY1R5cGVhaGVhZCB9IGZyb20gXCJyZWFjdC1ib290c3RyYXAtdHlwZWFoZWFkXCI7IC8vIEVTMjAxNVxuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG4vLyBXZSBkb24ndCBhdXRvLWV4cGFuZCBxdWVyaWVzIGluIFZ1bGNhbiBOUE0sIHNpbmNlIHdlIGRvbid0IHVzZSB0aGUgcmVnaXN0cnkgcGF0dGVyblxuLy8gYW55bW9yZS4gSW5zdGVhZCwgcHJvdmlkZSB0aGUgcmlnaHQgZnJhZ21lbnRzIGRpcmVjdGx5LCB1c2luZyBjb21wb3NpdGlvbiB3aXRoIHN0cmluZyB0ZW1wbGF0ZXMuXG4vL2ltcG9ydCB7IGV4cGFuZFF1ZXJ5RnJhZ21lbnRzIH0gZnJvbSBcIm1ldGVvci92dWxjYW46Y29yZVwiO1xuaW1wb3J0IHsgdXNlTGF6eVF1ZXJ5IH0gZnJvbSBcIkBhcG9sbG8vY2xpZW50XCI7XG5pbXBvcnQgZ3FsIGZyb20gXCJncmFwaHFsLXRhZ1wiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi8uLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyBGb3JtSW5wdXRQcm9wcyB9IGZyb20gXCIuLi9Gb3JtQ29tcG9uZW50SW5uZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4uL0Zvcm1Db250ZXh0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b2NvbXBsZXRlTXVsdGlwbGVQcm9wcyBleHRlbmRzIEZvcm1JbnB1dFByb3BzIHt9XG5leHBvcnQgY29uc3QgQXV0b2NvbXBsZXRlTXVsdGlwbGUgPSAocHJvcHM6IEF1dG9jb21wbGV0ZU11bHRpcGxlUHJvcHMpID0+IHtcbiAgLy8gVE9ETzogc29tZSBwcm9wcyBhcmUgbm93IGNvbW1pbmcgZnJvbSB0aGUgY29udGV4dFxuICBjb25zdCB7XG4gICAgcXVlcnlEYXRhLFxuICAgIC8vdXBkYXRlQ3VycmVudFZhbHVlcyxcbiAgICByZWZGdW5jdGlvbixcbiAgICBwYXRoLFxuICAgIGlucHV0UHJvcGVydGllcyA9IHt9LFxuICAgIGl0ZW1Qcm9wZXJ0aWVzID0ge30sXG4gICAgYXV0b2NvbXBsZXRlUXVlcnksXG4gICAgb3B0aW9uc0Z1bmN0aW9uLFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyB1cGRhdGVDdXJyZW50VmFsdWVzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuXG4gIGNvbnN0IENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIC8vIE1lcmdlV2l0aENvbXBvbmVudHMgc2hvdWxkIGJlIGhhbmRsZWQgYXQgdGhlIEZvcm0gbGV2ZWxcbiAgLy8gYnkgY3JlYXRpbmcgYSBuZXcgVnVsY2FuQ29tcG9uZW50cyBjb250ZXh0IHRoYXQgbWVyZ2VzIGRlZmF1bHQgY29tcG9uZW50c1xuICAvLyBhbmQgY29tcG9uZW50cyBwYXNzZWQgdmlhIHByb3BzXG4gIC8vY29uc3QgQ29tcG9uZW50cyA9IG1lcmdlV2l0aENvbXBvbmVudHMoZm9ybUNvbXBvbmVudHMpO1xuXG4gIGNvbnN0IHsgdmFsdWUsIGxhYmVsIH0gPSBpbnB1dFByb3BlcnRpZXM7XG5cbiAgLy8gc3RvcmUgY3VycmVudCBhdXRvY29tcGxldGUgcXVlcnkgc3RyaW5nIGluIGxvY2FsIGNvbXBvbmVudCBzdGF0ZVxuICBjb25zdCBbcXVlcnlTdHJpbmcsIHNldFF1ZXJ5U3RyaW5nXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuICAvLyBnZXQgY29tcG9uZW50J3MgYXV0b2NvbXBsZXRlIHF1ZXJ5IGFuZCB1c2UgaXQgdG8gbG9hZCBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbnNcbiAgLy8gbm90ZTogd2UgdXNlIHVzZUxhenlRdWVyeSBiZWNhdXNlXG4gIC8vIHdlIGRvbid0IHdhbnQgdG8gdHJpZ2dlciB0aGUgcXVlcnkgdW50aWwgdGhlIHVzZXIgaGFzIGFjdHVhbGx5IHR5cGVkIGluIHNvbWV0aGluZ1xuICBjb25zdCBbbG9hZEF1dG9jb21wbGV0ZU9wdGlvbnMsIHsgbG9hZGluZywgZXJyb3IsIGRhdGEgfV0gPSB1c2VMYXp5UXVlcnkoXG4gICAgZ3FsKC8qZXhwYW5kUXVlcnlGcmFnbWVudHMoKi8gYXV0b2NvbXBsZXRlUXVlcnkoKSAvKikqLyksXG4gICAge1xuICAgICAgdmFyaWFibGVzOiB7IHF1ZXJ5U3RyaW5nIH0sXG4gICAgfVxuICApO1xuXG4gIGlmIChlcnJvcikge1xuICAgIC8vIFRPRE86IHByb2JhYmx5IG5vdCB0aGUgYmVzdCB3YXkgdG8gZGlzcGxhdCB0aGUgZXJyb3JcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gIH1cbiAgLy8gYXBwbHkgb3B0aW9ucyBmdW5jdGlvbiB0byBkYXRhIHRvIGdldCBzdWdnZXN0aW9ucyBpbiB7IHZhbHVlLCBsYWJlbCB9IHBhaXJzXG4gIGNvbnN0IGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBkYXRhICYmIG9wdGlvbnNGdW5jdGlvbih7IGRhdGEgfSk7XG5cbiAgLy8gYXBwbHkgc2FtZSBmdW5jdGlvbiB0byBsb2FkZWQgZGF0YTsgZmlsdGVyIGJ5IGN1cnJlbnQgdmFsdWUgdG8gYXZvaWQgZGlzcGxheWluZyBhbnlcbiAgLy8gZXh0cmEgdW53YW50ZWQgaXRlbXMgaWYgZmllbGQtbGV2ZWwgZGF0YSBsb2FkaW5nIGxvYWRlZCB0b28gbWFueSBpdGVtc1xuICBjb25zdCBzZWxlY3RlZEl0ZW1zID1cbiAgICBxdWVyeURhdGEgJiZcbiAgICBvcHRpb25zRnVuY3Rpb24oeyBkYXRhOiBxdWVyeURhdGEgfSkuZmlsdGVyKChkKSA9PlxuICAgICAgKHZhbHVlIGFzIEFycmF5PGFueT4pLmluY2x1ZGVzKGQudmFsdWUpXG4gICAgKTtcblxuICAvLyBjb25zb2xlLmxvZyhxdWVyeURhdGEpXG4gIC8vIGNvbnNvbGUubG9nKHF1ZXJ5RGF0YSAmJiBvcHRpb25zRnVuY3Rpb24oeyBkYXRhOiBxdWVyeURhdGEgfSkpO1xuICAvLyBjb25zb2xlLmxvZyh2YWx1ZSlcbiAgLy8gY29uc29sZS5sb2coc2VsZWN0ZWRJdGVtcylcblxuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnRzLkZvcm1JdGVtXG4gICAgICB7Li4ucHJvcHN9IC8qcGF0aD17cGF0aH0gbGFiZWw9e2xhYmVsfSB7Li4uaXRlbVByb3BlcnRpZXN9Ki9cbiAgICAgIG5hbWU9e3BhdGh9XG4gICAgPlxuICAgICAgey8qKiBAdHMtaWdub3JlICovfVxuICAgICAgPEFzeW5jVHlwZWFoZWFkXG4gICAgICAgIHsuLi5pbnB1dFByb3BlcnRpZXN9XG4gICAgICAgIG11bHRpcGxlXG4gICAgICAgIG9uQ2hhbmdlPXsoc2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHNlbGVjdGVkLm1hcChcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgVHlwaW5nIGlzIHdyb25nIGZvciBzb21lIHJlYXNvblxuICAgICAgICAgICAgKHsgdmFsdWUgfSkgPT4gdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUN1cnJlbnRWYWx1ZXMoeyBbcGF0aF06IHNlbGVjdGVkSWRzIH0pO1xuICAgICAgICB9fVxuICAgICAgICBvcHRpb25zPXthdXRvY29tcGxldGVPcHRpb25zfVxuICAgICAgICBpZD17cGF0aH1cbiAgICAgICAgLy8gcGFzc2luZyBpZCBkb2Vzbid0IHNlZW0gdG8gd29yaywgd2UgbmVlZCBpbnB1dCBwcm9wc1xuICAgICAgICBpbnB1dFByb3BzPXt7IGlkOiBwYXRoIH19XG4gICAgICAgIHJlZj17cmVmRnVuY3Rpb259XG4gICAgICAgIG9uU2VhcmNoPXsocXVlcnlTdHJpbmcpID0+IHtcbiAgICAgICAgICBzZXRRdWVyeVN0cmluZyhxdWVyeVN0cmluZyk7XG4gICAgICAgICAgbG9hZEF1dG9jb21wbGV0ZU9wdGlvbnMoKTtcbiAgICAgICAgfX1cbiAgICAgICAgaXNMb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICBzZWxlY3RlZD17c2VsZWN0ZWRJdGVtc31cbiAgICAgIC8+XG4gICAgPC9Db21wb25lbnRzLkZvcm1JdGVtPlxuICApO1xufTtcblxuLy9yZWdpc3RlckNvbXBvbmVudChcIkZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZVwiLCBNdWx0aUF1dG9jb21wbGV0ZSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1ib290c3RyYXAtdHlwZWFoZWFkXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImdyYXBocWwtdGFnXCIpOyIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuLy8gVE9ETzogd2hpdGVsaXN0IEhUTUxCdXR0b24gcHJvcHNcbmV4cG9ydCBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKHsgY2hpbGRyZW4sIC4uLnByb3BzIH0pID0+IChcbiAgPGJ1dHRvbiB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2J1dHRvbj5cbik7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG4vLyBAc2VlIGh0dHBzOi8vZG9ja3lhcmQuY29tL2Jsb2cvMjAyMC8wMy8wMi9hY2Nlc3NpYmxlLWxvYWRpbmctaW5kaWNhdG9yc3dpdGgtbm8tZXh0cmEtZWxlbWVudHNcbmV4cG9ydCBjb25zdCBMb2FkaW5nID0gKCkgPT4gKFxuICA8c3BhbiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWJ1c3k9XCJ0cnVlXCI+XG4gICAgTG9hZGluZy4uLlxuICA8L3NwYW4+XG4pO1xuIiwiaW1wb3J0IFJlYWN0LCB7IENTU1Byb3BlcnRpZXMgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBMb2FkaW5nQnV0dG9uID0gKHtcbiAgbG9hZGluZyxcbiAgbGFiZWwsXG4gIG9uQ2xpY2ssXG4gIGNoaWxkcmVuLFxuICBjbGFzc05hbWUgPSBcIlwiLFxuICAuLi5yZXN0XG59KSA9PiB7XG4gIGNvbnN0IENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG5cbiAgY29uc3Qgd3JhcHBlclN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gIH07XG5cbiAgY29uc3QgbGFiZWxTdHlsZSA9IGxvYWRpbmcgPyB7IG9wYWNpdHk6IDAuNSB9IDoge307XG5cbiAgY29uc3QgbG9hZGluZ1N0eWxlOiBDU1NQcm9wZXJ0aWVzID0gbG9hZGluZ1xuICAgID8ge1xuICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIH1cbiAgICA6IHsgZGlzcGxheTogXCJub25lXCIgfTtcblxuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnRzLkJ1dHRvblxuICAgICAgY2xhc3NOYW1lPXtgbG9hZGluZy1idXR0b24gJHtcbiAgICAgICAgbG9hZGluZyA/IFwibG9hZGluZy1idXR0b24tbG9hZGluZ1wiIDogXCJsb2FkaW5nLWJ1dHRvbi1ub3Rsb2FkaW5nXCJcbiAgICAgIH0gJHtjbGFzc05hbWV9YH1cbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICB7Li4ucmVzdH1cbiAgICA+XG4gICAgICA8c3BhbiBzdHlsZT17d3JhcHBlclN0eWxlfT5cbiAgICAgICAgPHNwYW4gc3R5bGU9e2xhYmVsU3R5bGV9PntsYWJlbCB8fCBjaGlsZHJlbn08L3NwYW4+XG4gICAgICAgIDxzcGFuIHN0eWxlPXtsb2FkaW5nU3R5bGV9PlxuICAgICAgICAgIDxDb21wb25lbnRzLkxvYWRpbmcgLz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgIDwvQ29tcG9uZW50cy5CdXR0b24+XG4gICk7XG59O1xuIiwiLypcblxuRXhhbXBsZSBVc2FnZVxuXG48Q29tcG9uZW50cy5NdXRhdGlvbkJ1dHRvblxuICBsYWJlbD1cIkNhbmNlbCBTdWJzY3JpcHRpb25cIlxuICB2YXJpYW50PVwicHJpbWFyeVwiXG4gIG11dGF0aW9uT3B0aW9ucz17e1xuICAgIG5hbWU6ICdjYW5jZWxTdWJzY3JpcHRpb24nLFxuICAgIGFyZ3M6IHsgYm9va2luZ0lkOiAnU3RyaW5nJyB9LFxuICAgIGZyYWdtZW50TmFtZTogJ0Jvb2tpbmdzU3RyaXBlRGF0YUZyYWdtZW50JyxcbiAgfX1cbiAgbXV0YXRpb25Bcmd1bWVudHM9e3sgYm9va2luZ0lkOiBib29raW5nLl9pZCB9fVxuICBzdWJtaXRDYWxsYmFjaz17KCkgPT4ge319XG4gIHN1Y2Nlc3NDYWxsYmFjaz17cmVzdWx0ID0+IHsgY29uc29sZS5sb2cocmVzdWx0KSB9fVxuLz5cblxuKi9cbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgRG9jdW1lbnROb2RlIH0gZnJvbSBcImdyYXBocWxcIjtcbmltcG9ydCB7IGdxbCwgTXV0YXRpb25Ib29rT3B0aW9ucywgdXNlTXV0YXRpb24gfSBmcm9tIFwiQGFwb2xsby9jbGllbnRcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzXCI7XG4vLyBpbXBvcnQgd2l0aE11dGF0aW9uIGZyb20gJy4uL2NvbnRhaW5lcnMvcmVnaXN0ZXJlZE11dGF0aW9uJztcblxuLy8gVE9ETzpcbi8qKlxuICogRGlmZmVyZW5jZSB3aXRoIFZ1bGNhbiBNZXRlb3I6IHRoZXJlIGlzIG5vXG4gKiByZWdpc3RlcmVkIG11dGF0aW9uIGFueW1vcmUsXG4gKiBzbyB5b3UgbmVlZCB0byBwYXNzIHlvdXIgbXV0YXRpb25zIGV4cGxpY2l0ZWx5LCB1c2luZyBncmFwaHFsXG4gKi9cbi8qXG5leHBvcnQgY2xhc3MgTXV0YXRpb25CdXR0b24gZXh0ZW5kcyBQdXJlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5idXR0b24gPSB3aXRoTXV0YXRpb24ocHJvcHMubXV0YXRpb25PcHRpb25zKShNdXRhdGlvbkJ1dHRvbklubmVyKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSB0aGlzLmJ1dHRvbjtcbiAgICByZXR1cm4gPENvbXBvbmVudCB7Li4udGhpcy5wcm9wc30gLz47XG4gIH1cbn0qL1xuXG5leHBvcnQgaW50ZXJmYWNlIE11dGF0aW9uQnV0dG9uUHJvcHMge1xuICAvKipcbiAgICogTk9URTogaW4gVnVsY2FuIE1ldGVvciB5b3UgaGFkIHRvIHdyaXRlOlxuICAgKiBtdXRhdGlvbk9wdGlvbnM6IHsgbmFtZTogXCJmb29iYXJcIiwgbXV0YXRpb25PcHRpb25zOiB7cmVmZXRjaFF1ZXJpZXM6W1wiaGVsbG9cIl19fVxuICAgKlxuICAgKiBJbiBWdWxjYW4gTmV4dCwgeW91IGNhbiBvbmx5IHBhc3MgdGhlIFwibXV0YXRpb25PcHRpb25zXCIgb2JqZWN0OlxuICAgKiBtdXRhdGlvbk9wdGlvbnM6IHsgcmVmZXRjaFF1ZXJpZXM6W1wiaGVsbG9cIl19XG4gICAqIGFuZCB0aGUgbXV0YXRpb24gaXMgcHJvdmlkZWQgdmlhIHRoZSBuZXcgXCJtdXRhdGlvblwiIHByb3BcbiAgICovXG4gIG11dGF0aW9uT3B0aW9uczogTXV0YXRpb25Ib29rT3B0aW9ucztcbiAgLyoqXG4gICAqIEBleGFtcGxlXG4gICAgbXV0YXRpb246IGdxbGBcbiAgICAgIG11dGF0aW9uIHNhbXBsZU11dGF0aW9uKCRpbnB1dDogSW5wdXQpIHtcbiAgICAgICAgaGVsbG9cbiAgICAgIH1cbiAgICBgLFxuICAgKi9cbiAgbXV0YXRpb246IHN0cmluZyB8IERvY3VtZW50Tm9kZTtcbiAgLyoqIFZhcmlhYmxlcyBwYXNzZWQgdG8gdGhlIG11dGF0aW9uIChOT1RFOiB3ZSBjYW4ndCBwYXNzIG90aGVyIG9wdGlvbnMgYXQgdGhlIG1vbWVudCkgKi9cbiAgbXV0YXRpb25Bcmd1bWVudHM6IE11dGF0aW9uSG9va09wdGlvbnM8YW55PltcInZhcmlhYmxlc1wiXTtcbiAgc3VibWl0Q2FsbGJhY2s6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBzdWNjZXNzQ2FsbGJhY2s6IChyZXM6IGFueSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIGVycm9yQ2FsbGJhY2s6IChlcnI6IGFueSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIC8vIE5vdyBpc29sYXRlZCBpbnRvIHRoZWlyIG93biBvYmplY3QgdG8gYXZvaWQgbmVlZGVkIHRvIGV4cGxpY2l0ZWx5IHBpY2svb21pdFxuICBsb2FkaW5nQnV0dG9uUHJvcHM6IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IE11dGF0aW9uQnV0dG9uID0gKHByb3BzOiBNdXRhdGlvbkJ1dHRvblByb3BzKSA9PiB7XG4gIGNvbnN0IENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxhbnkgfCB1bmRlZmluZWQ+KCk7XG5cbiAgY29uc3Qge1xuICAgIC8vbXV0YXRpb25PcHRpb25zLFxuICAgIG11dGF0aW9uLFxuICAgIG11dGF0aW9uQXJndW1lbnRzLFxuICAgIGxvYWRpbmdCdXR0b25Qcm9wcyxcbiAgfSA9IHByb3BzO1xuICBjb25zdCBtdXRhdGlvbkFzTm9kZSA9XG4gICAgdHlwZW9mIG11dGF0aW9uID09PSBcInN0cmluZ1wiXG4gICAgICA/IGdxbGBcbiAgICAgICAgICAke211dGF0aW9ufVxuICAgICAgICBgXG4gICAgICA6IG11dGF0aW9uO1xuICBjb25zdCBbbXV0YXRpb25GdW5jXSA9IHVzZU11dGF0aW9uKG11dGF0aW9uQXNOb2RlLCB7XG4gICAgdmFyaWFibGVzOiBtdXRhdGlvbkFyZ3VtZW50cyxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSBhc3luYyAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgIHNldEVycm9yKHVuZGVmaW5lZCk7XG4gICAgY29uc3Qge1xuICAgICAgLy9tdXRhdGlvbk9wdGlvbnMsXG4gICAgICBzdWJtaXRDYWxsYmFjayxcbiAgICAgIHN1Y2Nlc3NDYWxsYmFjayxcbiAgICAgIGVycm9yQ2FsbGJhY2ssXG4gICAgfSA9IHByb3BzO1xuICAgIC8vY29uc3QgbXV0YXRpb25OYW1lID0gbXV0YXRpb25PcHRpb25zLm5hbWU7XG4gICAgLy9jb25zdCBtdXRhdGlvbiA9IHRoaXMucHJvcHNbbXV0YXRpb25OYW1lXTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoc3VibWl0Q2FsbGJhY2spIHtcbiAgICAgICAgYXdhaXQgc3VibWl0Q2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG11dGF0aW9uRnVuYygpO1xuICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjaykge1xuICAgICAgICBhd2FpdCBzdWNjZXNzQ2FsbGJhY2socmVzdWx0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gVE9ETzogbWF5IG5vdCB3b3JrIGJlY2F1c2UgdGhlIG11dGF0aW9uRnVuYyBtYXkgbm90IHRocm93IGluIGNhc2Ugb2YgZXJyb3JcbiAgICAgIHNldEVycm9yKGVycm9yKTtcbiAgICAgIGlmIChlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgIGF3YWl0IGVycm9yQ2FsbGJhY2soZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBtdXRhdGlvbihtdXRhdGlvbkFyZ3VtZW50cylcbiAgICAvLyAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgLy8gICAgIHRoaXMuc2V0U3RhdGUoeyBsb2FkaW5nOiBmYWxzZSB9KTtcbiAgICAvLyAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjaykge1xuICAgIC8vICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhyZXN1bHQpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9KVxuICAgIC8vICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAvLyAgICAgdGhpcy5zZXRTdGF0ZSh7IGxvYWRpbmc6IGZhbHNlIH0pO1xuICAgIC8vICAgICBpZiAoZXJyb3JDYWxsYmFjaykge1xuICAgIC8vICAgICAgIGVycm9yQ2FsbGJhY2soZXJyb3IpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9KTtcbiAgfTtcblxuICAvL2NvbnN0IG11dGF0aW9uTmFtZSA9IHRoaXMucHJvcHMubXV0YXRpb25PcHRpb25zLm5hbWU7XG5cbiAgY29uc3QgbG9hZGluZ0J1dHRvbiA9IChcbiAgICA8Q29tcG9uZW50cy5Mb2FkaW5nQnV0dG9uXG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgICB7Li4ubG9hZGluZ0J1dHRvblByb3BzfVxuICAgIC8+XG4gICk7XG5cbiAgaWYgKGVycm9yKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxDb21wb25lbnRzLlRvb2x0aXBUcmlnZ2VyIHRyaWdnZXI9e2xvYWRpbmdCdXR0b259IGRlZmF1bHRTaG93PXt0cnVlfT5cbiAgICAgICAge2Vycm9yLm1lc3NhZ2UucmVwbGFjZShcIkdyYXBoUUwgZXJyb3I6IFwiLCBcIlwiKX1cbiAgICAgIDwvQ29tcG9uZW50cy5Ub29sdGlwVHJpZ2dlcj5cbiAgICApO1xuICB9XG4gIHJldHVybiBsb2FkaW5nQnV0dG9uO1xufTtcbiIsImltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG4vLyBpbXBvcnQgeyBIZWxtZXQgfSBmcm9tICdyZWFjdC1oZWxtZXQnO1xuLy8gaW1wb3J0IHsgcmVnaXN0ZXJDb21wb25lbnQsIFV0aWxzLCBnZXRTZXR0aW5nLCByZWdpc3RlclNldHRpbmcsIEhlYWQgfSBmcm9tICdtZXRlb3IvdnVsY2FuOmxpYic7XG4vLyBpbXBvcnQgY29tcG9zZSBmcm9tIFwicmVjb21wb3NlL2NvbXBvc2VcIjtcblxuLy8gcmVnaXN0ZXJTZXR0aW5nKCdsb2dvVXJsJywgbnVsbCwgJ0Fic29sdXRlIFVSTCBmb3IgdGhlIGxvZ28gaW1hZ2UnKTtcbi8vIHJlZ2lzdGVyU2V0dGluZygndGl0bGUnLCAnTXkgQXBwJywgJ0FwcCB0aXRsZScpO1xuLy8gcmVnaXN0ZXJTZXR0aW5nKCd0YWdsaW5lJywgbnVsbCwgJ0FwcCB0YWdsaW5lJyk7XG4vLyByZWdpc3RlclNldHRpbmcoJ2Rlc2NyaXB0aW9uJyk7XG4vLyByZWdpc3RlclNldHRpbmcoJ3NpdGVJbWFnZScsIG51bGwsICdBbiBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgc2l0ZSBvbiBzb2NpYWwgbWVkaWEnKTtcbi8vIHJlZ2lzdGVyU2V0dGluZygnZmF2aWNvblVybCcsICcvaW1nL2Zhdmljb24uaWNvJywgJ0Zhdmljb24gYWJzb2x1dGUgVVJMJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZFRhZ3NQcm9wcyB7XG4gIHVybDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaW1hZ2U6IHN0cmluZztcbiAgc2l0ZVVybDogc3RyaW5nO1xuICBmYXZpY29uVXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKlxuICogQ3JlYXRlIGJhc2ljIHNvY2lhbCBtZXRhIHRhZ3MgZm9yIGEgcGFnZVxuICogKEZhY2Vib29rLCBUd2l0dGVyKVxuICpcbiAqIE5PVEU6IHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIHdyYXBwaW5nIHRob3NlIHRhZ3MgaW5cbiAqIG5leHQvaGVhZCwgSGVsbWV0IG9yIHdoYXRldmVyIHNvbHV0aW9uIHlvdSB1c2UgZm9yXG4gKiBoZWFkIHRhZ3MgZGVjZW50cmFsaXphdGlvblxuICpcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBIZWFkVGFncyBleHRlbmRzIFB1cmVDb21wb25lbnQ8SGVhZFRhZ3NQcm9wcz4ge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyB1cmwsIHRpdGxlLCBkZXNjcmlwdGlvbiwgc2l0ZVVybCwgZmF2aWNvblVybCB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgaW1hZ2UgPSB0aGlzLnByb3BzLmltYWdlO1xuICAgIC8qXG4gICAgY29uc3QgdXJsID0gdXJsOyAvL3x8IFV0aWxzLmdldFNpdGVVcmwoKTtcbiAgICBjb25zdCB0aXRsZSA9IHRpdGxlOyAvL3x8IGdldFNldHRpbmcoXCJ0aXRsZVwiLCBcIk15IEFwcFwiKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOyAvKiAgfHxcbiAgICAgIGdldFNldHRpbmcoXCJ0YWdsaW5lXCIpIHx8XG4gICAgICBnZXRTZXR0aW5nKFwiZGVzY3JpcHRpb25cIik7ICovXG4gICAgLy8gZGVmYXVsdCBpbWFnZSBtZXRhOiBsb2dvIHVybCwgZWxzZSBzaXRlIGltYWdlIGRlZmluZWQgaW4gc2V0dGluZ3NcbiAgICAvL2xldCBpbWFnZSA9IGxvZ29Vcmw7IC8qISFnZXRTZXR0aW5nKFwic2l0ZUltYWdlXCIpXG4gICAgLy8/IGdldFNldHRpbmcoXCJzaXRlSW1hZ2VcIilcbiAgICAvLzogZ2V0U2V0dGluZyhcImxvZ29VcmxcIik7Ki9cblxuICAgIC8vIG92ZXJ3cml0ZSBkZWZhdWx0IGltYWdlIGlmIG9uZSBpcyBwYXNzZWQgYXMgcHJvcHNcbiAgICAvL2lmICghIXRoaXMucHJvcHMuaW1hZ2UpIHtcbiAgICAvLyAgaW1hZ2UgPSB0aGlzLnByb3BzLmltYWdlO1xuICAgIC8vfVxuXG4gICAgLy8gYWRkIHNpdGUgdXJsIGJhc2UgaWYgdGhlIGltYWdlIGlzIHN0b3JlZCBsb2NhbGx5XG4gICAgaWYgKCEhaW1hZ2UgJiYgaW1hZ2UuaW5kZXhPZihcIi8vXCIpID09PSAtMSkge1xuICAgICAgLy8gcmVtb3ZlIHN0YXJ0aW5nIHNsYXNoIGZyb20gaW1hZ2UgcGF0aCBpZiBuZWVkZWRcbiAgICAgIGlmIChpbWFnZS5jaGFyQXQoMCkgPT09IFwiL1wiKSB7XG4gICAgICAgIGltYWdlID0gaW1hZ2Uuc2xpY2UoMSk7XG4gICAgICB9XG4gICAgICBpbWFnZSA9IC8qZ2V0U2l0ZVVybCgpKi8gc2l0ZVVybCArIGltYWdlO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8dGl0bGU+e3RpdGxlfTwvdGl0bGU+XG5cbiAgICAgICAgPG1ldGEgY2hhclNldD1cInV0Zi04XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cImRlc2NyaXB0aW9uXCIgY29udGVudD17ZGVzY3JpcHRpb259IC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+XG5cbiAgICAgICAgey8qIGZhY2Vib29rICovfVxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnR5cGVcIiBjb250ZW50PVwiYXJ0aWNsZVwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6dXJsXCIgY29udGVudD17dXJsfSAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD17aW1hZ2V9IC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6dGl0bGVcIiBjb250ZW50PXt0aXRsZX0gLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZzpkZXNjcmlwdGlvblwiIGNvbnRlbnQ9e2Rlc2NyaXB0aW9ufSAvPlxuXG4gICAgICAgIHsvKiB0d2l0dGVyICovfVxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZTpzcmNcIiBjb250ZW50PXtpbWFnZX0gLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PXt0aXRsZX0gLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIiBjb250ZW50PXtkZXNjcmlwdGlvbn0gLz5cblxuICAgICAgICA8bGluayByZWw9XCJjYW5vbmljYWxcIiBocmVmPXt1cmx9IC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgLy9uYW1lPVwiZmF2aWNvblwiXG4gICAgICAgICAgcmVsPVwic2hvcnRjdXQgaWNvblwiXG4gICAgICAgICAgaHJlZj17ZmF2aWNvblVybCB8fCBcIi9mYXZpY29uLmljb1wifVxuICAgICAgICAvPlxuXG4gICAgICAgIHsvKipcbiAqICBOb3QgbmVlZGVkIGFzIHdlIGV4cGVjdCB0aGUgZW5kIGFwcGxpY2F0aW9uIHVzZSBlaXRoZXIgSGVsbWV0IGF0IGFwcCBsZXZlbFxuICogb3IgbmV4dC9oZWFkXG4gKiBcbiAgICAgICAgICB7SGVhZC5tZXRhLm1hcCgodGFnLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPG1ldGEga2V5PXtpbmRleH0gey4uLnRhZ30gLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgICB7SGVhZC5saW5rLm1hcCgodGFnLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPGxpbmsga2V5PXtpbmRleH0gey4uLnRhZ30gLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgICB7SGVhZC5zY3JpcHQubWFwKCh0YWcsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8c2NyaXB0IGtleT17aW5kZXh9IHsuLi50YWd9PlxuICAgICAgICAgICAgICB7dGFnLmNvbnRlbnRzfVxuICAgICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgICAgKSl9XG5cbiAgICAgICAge0hlYWQuY29tcG9uZW50cy5tYXAoKGNvbXBvbmVudE9yQXJyYXksIGluZGV4KSA9PiB7XG4gICAgICAgICAgbGV0IEhlYWRDb21wb25lbnQ7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50T3JBcnJheSkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtjb21wb25lbnQsIC4uLmhvY3NdID0gY29tcG9uZW50T3JBcnJheTtcbiAgICAgICAgICAgIEhlYWRDb21wb25lbnQgPSBjb21wb3NlKC4uLmhvY3MpKGNvbXBvbmVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEhlYWRDb21wb25lbnQgPSBjb21wb25lbnRPckFycmF5O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gPEhlYWRDb21wb25lbnQga2V5PXtpbmRleH0gLz47XG4gICAgICAgIH0pfVxuICovfVxuICAgICAgPC8+XG4gICAgKTtcbiAgfVxufVxuXG4vKlxuSGVhZFRhZ3MucHJvcFR5cGVzID0ge1xuICB1cmw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgaW1hZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG59O1xuKi9cbiIsIi8qXG5cbmNoaWxkcmVuOiB0aGUgY29udGVudCBvZiB0aGUgdG9vbHRpcFxudHJpZ2dlcjogdGhlIGNvbXBvbmVudCB0aGF0IHRyaWdnZXJzIHRoZSB0b29sdGlwIHRvIGFwcGVhclxuXG4qL1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuLy8gaW1wb3J0IFRvb2x0aXAgZnJvbSAncmVhY3QtYm9vdHN0cmFwL1Rvb2x0aXAnO1xuLy8gaW1wb3J0IE92ZXJsYXlUcmlnZ2VyIGZyb20gJ3JlYWN0LWJvb3RzdHJhcC9PdmVybGF5VHJpZ2dlcic7XG5cbi8qKlxuICogRGlzcGxheSBhIHRvb2x0aXAgd2hlbiBob3ZlcmluZyBhbiBpdGVtXG4gKi9cbmV4cG9ydCBjb25zdCBUb29sdGlwVHJpZ2dlciA9ICh7XG4gIGNoaWxkcmVuLFxuICB0cmlnZ2VyLFxuICAvL3BsYWNlbWVudCA9IFwidG9wXCIsXG4gIC8vLi4ucmVzdFxufSkgPT4ge1xuICByZXR1cm4gPGRpdiB0aXRsZT17Y2hpbGRyZW59Pnt0cmlnZ2VyfTwvZGl2PjtcbiAgLypcbiAgY29uc3QgdG9vbHRpcCA9IDxUb29sdGlwIGlkPVwidG9vbHRpcFwiPntjaGlsZHJlbn08L1Rvb2x0aXA+O1xuXG4gIHJldHVybiAoXG4gICAgPE92ZXJsYXlUcmlnZ2VyIHBsYWNlbWVudD17cGxhY2VtZW50fSB7Li4ucmVzdH0gb3ZlcmxheT17dG9vbHRpcH0+XG4gICAgICB7dHJpZ2dlcn1cbiAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICApOyovXG59O1xuIiwiLy8gVE9ETzogdXNlcyByZWFjdCBib290c3RyYXAgYSBsb3QsIG5lZWQgYSByZWZhY3RvclxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gXCJyZWFjdC1ib290c3RyYXAvRHJvcGRvd25cIjtcbmltcG9ydCBEcm9wZG93bkl0ZW0gZnJvbSBcInJlYWN0LWJvb3RzdHJhcC9Ecm9wZG93bkl0ZW1cIjtcbmltcG9ydCBEcm9wZG93bkJ1dHRvbiBmcm9tIFwicmVhY3QtYm9vdHN0cmFwL0Ryb3Bkb3duQnV0dG9uXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHNcIjtcbi8vIGltcG9ydCB7IExpbmtDb250YWluZXIgfSBmcm9tIFwicmVhY3Qtcm91dGVyLWJvb3RzdHJhcFwiO1xuXG4vKlxuXG5Ob3RlOiBgcmVzdGAgaXMgdXNlZCB0byBlbnN1cmUgYXV0by1nZW5lcmF0ZWQgcHJvcHMgZnJvbSBwYXJlbnQgZHJvcGRvd25cbmNvbXBvbmVudHMgYXJlIHByb3Blcmx5IHBhc3NlZCBkb3duIHRvIE1lbnVJdGVtXG5cbiovXG5jb25zdCBJdGVtID0gKHtcbiAgaW5kZXgsXG4gIC8vdG8sXG4gIGxhYmVsSWQsXG4gIGxhYmVsLFxuICBjb21wb25lbnQsXG4gIGNvbXBvbmVudFByb3BzID0ge30sXG4gIGl0ZW1Qcm9wcyxcbiAgLy9saW5rUHJvcHMsXG4gIC4uLnJlc3Rcbn06IGFueSkgPT4ge1xuICBjb25zdCBDb21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBsZXQgbWVudUNvbXBvbmVudDtcblxuICBpZiAoY29tcG9uZW50KSB7XG4gICAgbWVudUNvbXBvbmVudCA9IFJlYWN0LmNsb25lRWxlbWVudChjb21wb25lbnQsIGNvbXBvbmVudFByb3BzKTtcbiAgfSBlbHNlIGlmIChsYWJlbElkKSB7XG4gICAgbWVudUNvbXBvbmVudCA9IDxDb21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2UgaWQ9e2xhYmVsSWR9IC8+O1xuICB9IGVsc2Uge1xuICAgIG1lbnVDb21wb25lbnQgPSA8c3Bhbj57bGFiZWx9PC9zcGFuPjtcbiAgfVxuXG4gIGNvbnN0IGl0ZW0gPSAoXG4gICAgPERyb3Bkb3duSXRlbSBldmVudEtleT17aW5kZXh9IHsuLi5pdGVtUHJvcHN9IHsuLi5yZXN0fT5cbiAgICAgIHttZW51Q29tcG9uZW50fVxuICAgIDwvRHJvcGRvd25JdGVtPlxuICApO1xuXG4gIC8qXG4gIEBkZXByZWFjdGVkIEluc3RlYWQgd3JhcCB0aGUgaXRlbSB5b3Vyc2VsZiB3aXRoIHRoZSByZWxldmFudCBsaW5rXG4gIHJldHVybiB0byA/IChcbiAgICA8TGlua0NvbnRhaW5lciB0bz17dG99IHsuLi5saW5rUHJvcHN9PlxuICAgICAge2l0ZW19XG4gICAgPC9MaW5rQ29udGFpbmVyPlxuICApIDogKFxuICAgIGl0ZW1cbiAgKTsqL1xuICByZXR1cm4gaXRlbTtcbn07XG5cbkl0ZW0ucHJvcFR5cGVzID0ge1xuICBpbmRleDogUHJvcFR5cGVzLm51bWJlciwgLy8gaW5kZXhcbiAgdG86IFByb3BUeXBlcy5hbnksIC8vIGEgc3RyaW5nIG9yIG9iamVjdCwgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcm91dGVyIHBhdGggZm9yIHRoZSBtZW51IGl0ZW1cbiAgbGFiZWxJZDogUHJvcFR5cGVzLnN0cmluZywgLy8gYW4gaTE4biBpZCBmb3IgdGhlIGl0ZW0gbGFiZWxcbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsIC8vIGl0ZW0gbGFiZWwgc3RyaW5nLCB1c2VkIGlmIGlkIGlzIG5vdCBwcm92aWRlZFxuICBjb21wb25lbnQ6IFByb3BUeXBlcy5vYmplY3QsIC8vIGEgY29tcG9uZW50IHRvIHVzZSBhcyBtZW51IGl0ZW1cbiAgY29tcG9uZW50UHJvcHM6IFByb3BUeXBlcy5vYmplY3QsIC8vIHByb3BzIHBhc3NlZCB0byB0aGUgY29tcG9uZW50XG4gIGl0ZW1Qcm9wczogUHJvcFR5cGVzLm9iamVjdCwgLy8gcHJvcHMgZm9yIHRoZSA8TWVudUl0ZW0vPiBjb21wb25lbnRcbn07XG4vKlxuXG5BIG5vZGUgY29udGFpbnMgYSBtZW51IGl0ZW0sIGFuZCBvcHRpb25hbGx5IGEgbGlzdCBvZiBjaGlsZCBpdGVtc1xuXG4qL1xuY29uc3QgTm9kZSA9ICh7IGNoaWxkcmVuSXRlbXMsIC4uLnJlc3QgfSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8SXRlbSB7Li4ucmVzdH0gLz5cbiAgICAgIHtjaGlsZHJlbkl0ZW1zICYmICEhY2hpbGRyZW5JdGVtcy5sZW5ndGggJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbnUtbm9kZS1jaGlsZHJlblwiPlxuICAgICAgICAgIHtjaGlsZHJlbkl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxJdGVtIGtleT17aW5kZXh9IHsuLi5pdGVtfSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC8+XG4gICk7XG59O1xuXG5Ob2RlLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW5JdGVtczogUHJvcFR5cGVzLmFycmF5LCAvLyBhbiBhcnJheSBvZiBkcm9wZG93biBpdGVtcyB1c2VkIGFzIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IGl0ZW1cbn07XG5cbmNvbnN0IEJvb3RzdHJhcERyb3Bkb3duID0gKHtcbiAgbGFiZWwsXG4gIGxhYmVsSWQsXG4gIHRyaWdnZXIsXG4gIG1lbnVJdGVtcyxcbiAgbWVudUNvbnRlbnRzLFxuICB2YXJpYW50ID0gXCJkcm9wZG93blwiLFxuICBidXR0b25Qcm9wcyxcbiAgLi4uZHJvcGRvd25Qcm9wc1xufSkgPT4ge1xuICBjb25zdCBDb21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCBtZW51Qm9keSA9IG1lbnVDb250ZW50c1xuICAgID8gbWVudUNvbnRlbnRzXG4gICAgOiBtZW51SXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoaXRlbSA9PT0gXCJkaXZpZGVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gPERyb3Bkb3duLkRpdmlkZXIga2V5PXtpbmRleH0gLz47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIDxOb2RlIHsuLi5pdGVtfSBrZXk9e2luZGV4fSBpbmRleD17aW5kZXh9IC8+O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICBpZiAodmFyaWFudCA9PT0gXCJmbGF0XCIpIHtcbiAgICByZXR1cm4gbWVudUJvZHk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRyaWdnZXIpIHtcbiAgICAgIC8vIGlmIGEgdHJpZ2dlciBjb21wb25lbnQgaGFzIGJlZW4gcHJvdmlkZWQsIHVzZSBpdFxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERyb3Bkb3duIHsuLi5kcm9wZG93blByb3BzfT5cbiAgICAgICAgICA8RHJvcGRvd24uVG9nZ2xlPnt0cmlnZ2VyfTwvRHJvcGRvd24uVG9nZ2xlPlxuICAgICAgICAgIDxEcm9wZG93bi5NZW51PnttZW51Qm9keX08L0Ryb3Bkb3duLk1lbnU+XG4gICAgICAgIDwvRHJvcGRvd24+XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbHNlIGRlZmF1bHQgdG8gRHJvcGRvd25CdXR0b25cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxEcm9wZG93bkJ1dHRvblxuICAgICAgICAgIHsuLi5idXR0b25Qcm9wc31cbiAgICAgICAgICB0aXRsZT17bGFiZWxJZCA/IDxDb21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2UgaWQ9e2xhYmVsSWR9IC8+IDogbGFiZWx9XG4gICAgICAgICAgey4uLmRyb3Bkb3duUHJvcHN9XG4gICAgICAgID5cbiAgICAgICAgICB7bWVudUJvZHl9XG4gICAgICAgIDwvRHJvcGRvd25CdXR0b24+XG4gICAgICApO1xuICAgIH1cbiAgfVxufTtcblxuQm9vdHN0cmFwRHJvcGRvd24ucHJvcFR5cGVzID0ge1xuICBsYWJlbElkOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyBtZW51IHRpdGxlL2xhYmVsIGkxOG4gc3RyaW5nXG4gIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyBtZW51IHRpdGxlL2xhYmVsXG4gIHRyaWdnZXI6IFByb3BUeXBlcy5vYmplY3QsIC8vIGNvbXBvbmVudCB1c2VkIGFzIG1lbnUgdHJpZ2dlciAodGhlIHBhcnQgeW91IGNsaWNrIHRvIG9wZW4gdGhlIG1lbnUpXG4gIG1lbnVDb250ZW50czogUHJvcFR5cGVzLm9iamVjdCwgLy8gYSBjb21wb25lbnQgc3BlY2lmeWluZyB0aGUgbWVudSBjb250ZW50c1xuICBtZW51SXRlbXM6IFByb3BUeXBlcy5hcnJheSwgLy8gYW4gYXJyYXkgb2YgbWVudSBpdGVtcywgdXNlZCBpZiBtZW51Q29udGVudHMgaXMgbm90IHByb3ZpZGVkXG4gIHZhcmlhbnQ6IFByb3BUeXBlcy5zdHJpbmcsIC8vIGRyb3Bkb3duIChkZWZhdWx0KSBvciBmbGF0XG4gIGJ1dHRvblByb3BzOiBQcm9wVHlwZXMub2JqZWN0LCAvLyBwcm9wcyBzcGVjaWZpYyB0byB0aGUgZHJvcGRvd24gYnV0dG9uXG59O1xuXG5leHBvcnQgZGVmYXVsdCBCb290c3RyYXBEcm9wZG93bjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWJvb3RzdHJhcC9Ecm9wZG93blwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1ib290c3RyYXAvRHJvcGRvd25JdGVtXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWJvb3RzdHJhcC9Ecm9wZG93bkJ1dHRvblwiKTsiLCJleHBvcnQgKiBmcm9tIFwiLi9Db25zdW1lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUHJvdmlkZXJcIjtcbiIsIi8qKlxuICogTk9URTogS0VFUCBTRVBBUkFURUQgRlJPTSBUSEUgSE9PS1MgVE8gQ09OU1VNRSBUSEUgQ09OVEVYVFxuICogb3RoZXJ3aXNlIHlvdSdsbCBlbmQgdXAgd2l0aCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmVjYXVzZSBvZiB0aGUgZGVmYXVsdCBjb21wb25lbnRzXG4gKi9cbi8vIFRPRE86IHdlIG1pZ2h0IG5lZWQgdG8gYWRhcHQgdGhlIHByb3ZpZGVyIHRvIG1lcmdlIGl0cyB2YWx1ZSB3aXRoIGEgcG90ZW50aWFsbHkgaGlnaGVyIHVwIGNvbnRleHRcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHtcbiAgVnVsY2FuQ3VycmVudFVzZXJDb250ZXh0LFxuICBWdWxjYW5DdXJyZW50VXNlckNvbnRleHRUeXBlLFxufSBmcm9tIFwiLi9Db250ZXh0XCI7XG5cbi8vIFNvIHRoYXQgeW91IGNhbiBvdmVycmlkZSBvbmx5IHNvbWUgY29tcG9uZW50cyBieSBhZGRpbmcgYW4gYWRkaXRpb25hbCBjb250ZXh0IHdoaWxlIGtlZXBpbmcgdGhlIGRlZmF1bHRzXG5leHBvcnQgY29uc3QgVnVsY2FuQ3VycmVudFVzZXJQcm92aWRlciA9ICh7XG4gIHZhbHVlLFxuICAuLi5wcm9wc1xufToge1xuICB2YWx1ZTogVnVsY2FuQ3VycmVudFVzZXJDb250ZXh0VHlwZTtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pID0+IChcbiAgPFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dC5Qcm92aWRlclxuICAgIHZhbHVlPXt2YWx1ZX0gLy8gbWVyZ2UgcHJvdmlkZWQgY29tcG9uZW50cyBzbyB0aGUgdXNlciBjYW4gcHJvdmlkZSBvbmx5IGEgcGFydGlhbCByZXBsYWNlbWVudFxuICAgIHsuLi5wcm9wc31cbiAgLz5cbik7XG4iLCIvLyBpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSBcInJlY29tcG9zZVwiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGRpZmZlcmVuY2UgZnJvbSBcImxvZGFzaC9kaWZmZXJlbmNlXCI7XG5cbmV4cG9ydCBjb25zdCBDb21wb25lbnRzID0ge307IC8vIHdpbGwgYmUgcG9wdWxhdGVkIG9uIHN0YXJ0dXBcbmV4cG9ydCBjb25zdCBDb21wb25lbnRzVGFibGUgPSB7fTsgLy8gc3RvcmFnZSBmb3IgaW5mb3MgYWJvdXQgY29tcG9uZW50c1xuXG5leHBvcnQgY29uc3QgY29yZUNvbXBvbmVudHMgPSBbXG4gIFwiQWxlcnRcIixcbiAgXCJCdXR0b25cIixcbiAgXCJNb2RhbFwiLFxuICBcIk1vZGFsVHJpZ2dlclwiLFxuICBcIlRhYmxlXCIsXG4gIFwiRm9ybUNvbXBvbmVudENoZWNrYm94XCIsXG4gIFwiRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXBcIixcbiAgXCJGb3JtQ29tcG9uZW50RGF0ZVwiLFxuICBcIkZvcm1Db21wb25lbnREYXRlMlwiLFxuICBcIkZvcm1Db21wb25lbnREYXRlVGltZVwiLFxuICBcIkZvcm1Db21wb25lbnREZWZhdWx0XCIsXG4gIFwiRm9ybUNvbXBvbmVudFRleHRcIixcbiAgXCJGb3JtQ29tcG9uZW50RW1haWxcIixcbiAgXCJGb3JtQ29tcG9uZW50TnVtYmVyXCIsXG4gIFwiRm9ybUNvbXBvbmVudFJhZGlvR3JvdXBcIixcbiAgXCJGb3JtQ29tcG9uZW50U2VsZWN0XCIsXG4gIFwiRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlXCIsXG4gIFwiRm9ybUNvbXBvbmVudFN0YXRpY1RleHRcIixcbiAgXCJGb3JtQ29tcG9uZW50VGV4dGFyZWFcIixcbiAgXCJGb3JtQ29tcG9uZW50VGltZVwiLFxuICBcIkZvcm1Db21wb25lbnRVcmxcIixcbiAgXCJGb3JtQ29tcG9uZW50SW5uZXJcIixcbiAgXCJGb3JtQ29udHJvbFwiLFxuICBcIkZvcm1FbGVtZW50XCIsXG5dO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgVnVsY2FuIGNvbXBvbmVudCB3aXRoIGEgbmFtZSwgYSByYXcgY29tcG9uZW50IHRoYW4gY2FuIGJlIGV4dGVuZGVkXG4gKiBhbmQgb25lIG9yIG1vcmUgb3B0aW9uYWwgaGlnaGVyIG9yZGVyIGNvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byByZWdpc3Rlci5cbiAqIEBwYXJhbSB7Q29tcG9uZW50fSByYXdDb21wb25lbnQgSW50ZXJjaGFuZ2VhYmxlL2V4dGVuZGFibGUgcmVhY3QgY29tcG9uZW50LlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258QXJyYXkpfSBob2NzIFRoZSBIT0NzIHRvIGNvbXBvc2Ugd2l0aCB0aGUgcmF3IGNvbXBvbmVudC5cbiAqXG4gKiBOb3RlOiB3aGVuIGEgY29tcG9uZW50IGlzIHJlZ2lzdGVyZWQgd2l0aG91dCBoaWdoZXIgb3JkZXIgY29tcG9uZW50LCBgaG9jc2Agd2lsbCBiZVxuICogYW4gZW1wdHkgYXJyYXksIGFuZCBpdCdzIG9rIVxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlZHV4L2Jsb2IvbWFzdGVyL3NyYy9jb21wb3NlLmpzI0wxMy1MMTVcbiAqXG4gKiBAcmV0dXJucyBTdHJ1Y3R1cmUgb2YgYSBjb21wb25lbnQgaW4gdGhlIGxpc3Q6XG4gKlxuICogQ29tcG9uZW50c1RhYmxlLkZvbyA9IHtcbiAqICAgIG5hbWU6ICdGb28nLFxuICogICAgaG9jczogW2ZuMSwgZm4yXSxcbiAqICAgIHJhd0NvbXBvbmVudDogUmVhY3QuQ29tcG9uZW50LFxuICogICAgY2FsbDogKCkgPT4gY29tcG9zZSguLi5ob2NzKShyYXdDb21wb25lbnQpLFxuICogfVxuICpcbiAqL1xuLypcbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudChuYW1lLCByYXdDb21wb25lbnQsIC4uLmhvY3MpIHtcbiAgLy8gc3VwcG9ydCBzaW5nbGUtYXJndW1lbnQgc3ludGF4XG4gIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgLy8gbm90ZTogY2Fubm90IHVzZSBgY29uc3RgIGJlY2F1c2UgbmFtZSwgY29tcG9uZW50cywgaG9jcyBhcmUgYWxyZWFkeSBkZWZpbmVkXG4gICAgLy8gYXMgYXJndW1lbnRzIHNvIGRlc3RydWN0dXJpbmcgY2Fubm90IHdvcmtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG4gICAgdmFyIHtcbiAgICAgIG5hbWUsXG4gICAgICBjb21wb25lbnQsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBob2NzID0gW10sXG4gICAgfSA9IGFyZ3VtZW50c1swXTtcbiAgICByYXdDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gIH1cbiAgLy8gc3RvcmUgdGhlIGNvbXBvbmVudCBpbiB0aGUgdGFibGVcbiAgQ29tcG9uZW50c1RhYmxlW25hbWVdID0ge1xuICAgIG5hbWUsXG4gICAgcmF3Q29tcG9uZW50LFxuICAgIGhvY3MsXG4gIH07XG59XG4qL1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIGNvbXBvbmVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aFxuICogcmVnaXN0ZXJDb21wb25lbnQobmFtZSwgY29tcG9uZW50LCAuLi5ob2NzKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGdldC5cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5leHBvcnQgY29uc3QgY29tcG9uZW50RXhpc3RzID0gKG5hbWUpID0+IHtcbiAgY29uc3QgY29tcG9uZW50ID0gQ29tcG9uZW50c1RhYmxlW25hbWVdO1xuICByZXR1cm4gISFjb21wb25lbnQ7XG59O1xuXG4vKipcbiAqIEdldCBhIGNvbXBvbmVudCByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJDb21wb25lbnQobmFtZSwgY29tcG9uZW50LCAuLi5ob2NzKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxSZWFjdCBDb21wb25lbnR9IEEgKHdyYXBwZWQpIFJlYWN0IGNvbXBvbmVudFxuICovXG4vKlxuZXhwb3J0IGNvbnN0IGdldENvbXBvbmVudCA9IChuYW1lKSA9PiB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IENvbXBvbmVudHNUYWJsZVtuYW1lXTtcbiAgaWYgKCFjb21wb25lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBvbmVudCAke25hbWV9IG5vdCByZWdpc3RlcmVkLmApO1xuICB9XG4gIGlmIChjb21wb25lbnQuaG9jcyAmJiBjb21wb25lbnQuaG9jcy5sZW5ndGgpIHtcbiAgICBjb25zdCBob2NzID0gY29tcG9uZW50LmhvY3MubWFwKChob2MpID0+IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShob2MpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaG9jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgSW4gcmVnaXN0ZXJlZCBjb21wb25lbnQgJHtuYW1lfSwgYW4gaG9jIGlzIG9mIHR5cGUgJHt0eXBlb2YgaG9jfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBob2M7XG4gICAgICB9XG4gICAgICBjb25zdCBbYWN0dWFsSG9jLCAuLi5hcmdzXSA9IGhvYztcbiAgICAgIGlmICh0eXBlb2YgYWN0dWFsSG9jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbiByZWdpc3RlcmVkIGNvbXBvbmVudCAke25hbWV9LCBhbiBob2MgaXMgb2YgdHlwZSAke3R5cGVvZiBhY3R1YWxIb2N9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjdHVhbEhvYyguLi5hcmdzKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29tcG9zZSguLi5ob2NzKShjb21wb25lbnQucmF3Q29tcG9uZW50KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29tcG9uZW50LnJhd0NvbXBvbmVudDtcbiAgfVxufTtcbiovXG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGxvb2t1cCB0YWJsZSBmb3IgY29tcG9uZW50cyB0byBiZSBjYWxsYWJsZVxuICog4oS577iPIENhbGxlZCBvbmNlIG9uIGFwcCBzdGFydHVwXG4gKiovXG4vKlxuZXhwb3J0IGNvbnN0IHBvcHVsYXRlQ29tcG9uZW50c0FwcCA9ICgpID0+IHtcbiAgY29uc3QgcmVnaXN0ZXJlZENvbXBvbmVudHMgPSBPYmplY3Qua2V5cyhDb21wb25lbnRzVGFibGUpO1xuXG4gIC8vIGxvb3Agb3ZlciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgbGlzdFxuICByZWdpc3RlcmVkQ29tcG9uZW50cy5tYXAoKG5hbWUpID0+IHtcbiAgICAvLyBwb3B1bGF0ZSBhbiBlbnRyeSBpbiB0aGUgbG9va3VwIHRhYmxlXG4gICAgQ29tcG9uZW50c1tuYW1lXSA9IGdldENvbXBvbmVudChuYW1lKTtcblxuICAgIC8vIHVuY29tbWVudCBmb3IgZGVidWdcbiAgICAvLyBjb25zb2xlLmxvZygnaW5pdCBjb21wb25lbnQ6JywgbmFtZSk7XG4gIH0pO1xuXG4gIGNvbnN0IG1pc3NpbmdDb21wb25lbnRzID0gZGlmZmVyZW5jZShjb3JlQ29tcG9uZW50cywgcmVnaXN0ZXJlZENvbXBvbmVudHMpO1xuXG4gIGlmIChtaXNzaW5nQ29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBGb3VuZCB0aGUgZm9sbG93aW5nIG1pc3NpbmcgY29yZSBjb21wb25lbnRzOiAke21pc3NpbmdDb21wb25lbnRzLmpvaW4oXG4gICAgICAgIFwiLCBcIlxuICAgICAgKX0uIEluY2x1ZGUgYSBVSSBwYWNrYWdlIHN1Y2ggYXMgdnVsY2FuOnVpLWJvb3RzdHJhcCB0byBhZGQgdGhlbS5gXG4gICAgKTtcbiAgfVxufTtcbiovXG4vKipcbiAqIEdldCB0aGUgKipyYXcqKiAob3JpZ2luYWwpIGNvbXBvbmVudCByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJDb21wb25lbnRcbiAqIHdpdGhvdXQgdGhlIHBvc3NpYmxlIEhPQ3Mgd3JhcHBpbmcgaXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258UmVhY3QgQ29tcG9uZW50fSBBbiBpbnRlcmNoYW5nZWFibGUvZXh0ZW5kYWJsZSBSZWFjdCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJhd0NvbXBvbmVudCA9IChuYW1lKSA9PiB7XG4gIHJldHVybiBDb21wb25lbnRzVGFibGVbbmFtZV0ucmF3Q29tcG9uZW50O1xufTtcblxuLyoqXG4gKiBSZXBsYWNlIGEgVnVsY2FuIGNvbXBvbmVudCB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aCBhIG5ldyBjb21wb25lbnQgb3JcbiAqIGFuIGV4dGVuc2lvbiBvZiB0aGUgcmF3IGNvbXBvbmVudCBhbmQgb25lIG9yIG1vcmUgb3B0aW9uYWwgaGlnaGVyIG9yZGVyIGNvbXBvbmVudHMuXG4gKiBUaGlzIGZ1bmN0aW9uIGtlZXBzIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBIT0NzIGFuZCB3cmFwIHRoZSBuZXcgSE9DcyBhcm91bmQgcHJldmlvdXMgb25lc1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIuXG4gKiBAcGFyYW0ge1JlYWN0IENvbXBvbmVudH0gbmV3Q29tcG9uZW50IEludGVyY2hhbmdlYWJsZS9leHRlbmRhYmxlIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IG5ld0hvY3MgVGhlIEhPQ3MgdG8gY29tcG9zZSB3aXRoIHRoZSByYXcgY29tcG9uZW50LlxuICogQHJldHVybnMge0Z1bmN0aW9ufFJlYWN0IENvbXBvbmVudH0gQSBjb21wb25lbnQgY2FsbGFibGUgd2l0aCBDb21wb25lbnRzW25hbWVdXG4gKlxuICogTm90ZTogd2hlbiBhIGNvbXBvbmVudCBpcyByZWdpc3RlcmVkIHdpdGhvdXQgaGlnaGVyIG9yZGVyIGNvbXBvbmVudCwgYGhvY3NgIHdpbGwgYmVcbiAqIGFuIGVtcHR5IGFycmF5LCBhbmQgaXQncyBvayFcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWR1eC9ibG9iL21hc3Rlci9zcmMvY29tcG9zZS5qcyNMMTMtTDE1XG4gKi9cbi8qXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUNvbXBvbmVudChuYW1lLCBuZXdDb21wb25lbnQsIC4uLm5ld0hvY3MpIHtcbiAgLy8gc3VwcG9ydCBzaW5nbGUgYXJndW1lbnQgc3ludGF4XG4gIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuICAgIHZhciB7IG5hbWUsIGNvbXBvbmVudCwgaG9jcyA9IFtdIH0gPSBhcmd1bWVudHNbMF07XG4gICAgbmV3Q29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIG5ld0hvY3MgPSBob2NzO1xuICB9XG5cbiAgY29uc3QgcHJldmlvdXNDb21wb25lbnQgPSBDb21wb25lbnRzVGFibGVbbmFtZV07XG4gIGNvbnN0IHByZXZpb3VzSG9jcyA9IChwcmV2aW91c0NvbXBvbmVudCAmJiBwcmV2aW91c0NvbXBvbmVudC5ob2NzKSB8fCBbXTtcblxuICBpZiAoIXByZXZpb3VzQ29tcG9uZW50KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgVHJ5aW5nIHRvIHJlcGxhY2Ugbm9uLXJlZ2lzdGVyZWQgY29tcG9uZW50ICR7bmFtZX0uIFRoZSBjb21wb25lbnQgaXMgYCArXG4gICAgICAgIFwiYmVpbmcgcmVnaXN0ZXJlZC4gSWYgeW91IHdlcmUgdHJ5aW5nIHRvIHJlcGxhY2UgYSBjb21wb25lbnQgZGVmaW5lZCBieSBcIiArXG4gICAgICAgIFwiYW5vdGhlciBwYWNrYWdlLCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZW4ndCBtaXNzcGVsbGVkIHRoZSBuYW1lLiBDaGVjayBcIiArXG4gICAgICAgIFwiYWxzbyBpZiB0aGUgb3JpZ2luYWwgY29tcG9uZW50IGlzIHN0aWxsIGJlaW5nIHJlZ2lzdGVyZWQgb3IgdGhhdCBpdCBcIiArXG4gICAgICAgIFwiaGFzbid0IGJlZW4gcmVuYW1lZC5cIlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVnaXN0ZXJDb21wb25lbnQobmFtZSwgbmV3Q29tcG9uZW50LCAuLi5uZXdIb2NzLCAuLi5wcmV2aW91c0hvY3MpO1xufVxuKi9cblxuLypcbmV4cG9ydCBjb25zdCBjb3B5SG9DcyA9IChzb3VyY2VDb21wb25lbnQsIHRhcmdldENvbXBvbmVudCkgPT4ge1xuICByZXR1cm4gY29tcG9zZSguLi5zb3VyY2VDb21wb25lbnQuaG9jcykodGFyZ2V0Q29tcG9uZW50KTtcbn07XG4qL1xuXG4vKipcbiAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNvbXBvbmVudCBuYW1lIG9mIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbn0gY29tcG9uZW50ICBBIGNvbXBvbmVudCwgdGhlIG5hbWUgb2YgYSBjb21wb25lbnQsIG9yIGEgcmVhY3QgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wc10gIE9wdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgY29tcG9uZW50XG4gKi9cbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2Rpc3BsYXktbmFtZVxuLy8gbGVnYWN5XG5leHBvcnQgY29uc3QgaW5zdGFudGlhdGVDb21wb25lbnQgPSAoXG4gIGNvbXBvbmVudD86IFJlYWN0LkNvbXBvbmVudFR5cGUgfCBGdW5jdGlvbiB8IGFueSxcbiAgcHJvcHM/OiBhbnlcbikgPT4ge1xuICBpZiAoIWNvbXBvbmVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8qZWxzZSBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IENvbXBvbmVudCA9IENvbXBvbmVudHNbY29tcG9uZW50XTtcbiAgICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xuICB9ICovIGVsc2UgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNvbXBvbmVudCwgcHJvcHMpO1xuICB9IGVsc2UgaWYgKFxuICAgIHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIGNvbXBvbmVudC5wcm90b3R5cGUgJiZcbiAgICBjb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnRcbiAgKSB7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIFJlYWN0LkNvbXBvbmVudFR5cGU7XG4gICAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gY29tcG9uZW50KHByb3BzKTtcbiAgfSBlbHNlIGlmIChcbiAgICB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmXG4gICAgY29tcG9uZW50LiQkdHlwZW9mICYmXG4gICAgY29tcG9uZW50LnJlbmRlclxuICApIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBjb21wb25lbnQgYXMgUmVhY3QuQ29tcG9uZW50VHlwZTtcbiAgICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBvbmVudCB0aGF0IHdpbGwgcmVuZGVyIHRoZSByZWdpc3RlcmVkIGNvbXBvbmVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gIG1heSBiZSB1c2VmdWwgd2hlbiBpbiBuZWVkIGZvciBzb21lIHJlZ2lzdGVyZWQgY29tcG9uZW50LCBidXQgaW4gY29udGV4dHNcbiAqIHdoZXJlIHRoZXkgaGF2ZSBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQsIGZvciBleGFtcGxlIGF0IGNvbXBpbGUgdGltZSBleGVjdXRpb24uIEluIG90aGVyXG4gKiB3b3Jkcywgd2hlbiB1c2luZyBgQ29tcG9uZW50cy5Db21wb25lbnROYW1lYCBpcyBub3QgYWxsb3dlZCAoYmVjYXVzZSBpdCBoYXMgbm90IHlldCBiZWVuXG4gKiBwb3B1bGF0ZWQsIGhlbmNlIHdvdWxkIGJlIGB1bmRlZmluZWRgKSwgdGhlbiBgZGVsYXllZENvbXBvbmVudCgnQ29tcG9uZW50TmFtZScpYCBjYW4gYmVcbiAqIHVzZWQgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSBDcmVhdGUgYSBjb250YWluZXIgZm9yIGEgcmVnaXN0ZXJlZCBjb21wb25lbnRcbiAqICAvLyBTb21lQ29udGFpbmVyLmpzXG4gKiAgaW1wb3J0IGNvbXBvc2UgZnJvbSAncmVjb21wb3NlL2NvbXBvc2UnO1xuICogIGltcG9ydCB7IGRlbGF5ZWRDb21wb25lbnQgfSBmcm9tICdtZXRlb3IvdnVsY2FuOmNvcmUnO1xuICpcbiAqICBleHBvcnQgZGVmYXVsdCBjb21wb3NlKFxuICogICAgLy8gLi4uc29tZSBob2NzIHdpdGggY29udGFpbmVyIGxvZ2ljXG4gKiAgKShkZWxheWVkQ29tcG9uZW50KCdDb21wb25lbnROYW1lJykpOyAvLyBjYW5ub3QgdXNlIENvbXBvbmVudHMuQ29tcG9uZW50TmFtZSBpbiB0aGlzIGNvbnRleHQhXG4gKlxuICogQGV4YW1wbGUge0BsaW5rIGR5bmFtaWNMb2FkZXJ9XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBDb21wb25lbnQgbmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiAgRnVuY3Rpb25hbCBjb21wb25lbnQgdGhhdCB3aWxsIHJlbmRlciB0aGUgZ2l2ZW4gcmVnaXN0ZXJlZCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGF5ZWRDb21wb25lbnQgPSAobmFtZSkgPT4ge1xuICByZXR1cm4gKHByb3BzKSA9PiB7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gQ29tcG9uZW50c1tuYW1lXSB8fCBudWxsO1xuICAgIHJldHVybiBDb21wb25lbnQgJiYgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xuICB9O1xufTtcblxuLy8gRXhhbXBsZSB3aXRoIFByb3h5IChtaWdodCBiZSB1bnN0YWJsZS9oYXJkIHRvIHJlYXNvbiBhYm91dClcbi8vY29uc3QgbWVyZ2VXaXRoQ29tcG9uZW50cyA9IChteUNvbXBvbmVudHMgPSB7fSkgPT4ge1xuLy8gIGNvbnN0IGhhbmRsZXIgPSB7XG4vLyAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuLy8gICAgICByZXR1cm4gbmFtZSBpbiB0YXJnZXQgPyB0YXJnZXRbbmFtZV0gOiBDb21wb25lbnRzW25hbWVdO1xuLy8gICAgfVxuLy8gIH07XG4vLyAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkobXlDb21wb25lbnRzLCBoYW5kbGVyKTtcbi8vICByZXR1cm4gcHJveHk7XG4vL307XG5leHBvcnQgY29uc3QgbWVyZ2VXaXRoQ29tcG9uZW50cyA9IChteUNvbXBvbmVudHMpID0+XG4gIG15Q29tcG9uZW50cyA/IHsgLi4uQ29tcG9uZW50cywgLi4ubXlDb21wb25lbnRzIH0gOiBDb21wb25lbnRzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
7
+ `:c,[p]=i.useMutation(f,{variables:m}),b=u.default.createElement(t.LoadingButton,Object.assign({loading:n,onClick:t=>l(void 0,void 0,void 0,(function*(){t.preventDefault(),r(!0),a(void 0);const{submitCallback:n,successCallback:o,errorCallback:l}=e;try{n&&(yield n());const e=yield p();o&&(yield o(e))}catch(e){a(e),l&&(yield l(e))}finally{r(!1)}}))},d));return o?u.default.createElement(t.TooltipTrigger,{trigger:b,defaultShow:!0},o.message.replace("GraphQL error: ","")):b}},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.HeadTags=void 0;const l=a(n(0));class u extends l.PureComponent{render(){console.warn("HeadTags won't work in Next.js, because Head doesn't support nesting. Define meta directly in your app instead.");const{url:e,title:t,description:n,siteUrl:r,faviconUrl:o}=this.props;let a=this.props.image;return a&&-1===a.indexOf("//")&&("/"===a.charAt(0)&&(a=a.slice(1)),a=r+a),l.default.createElement(l.default.Fragment,null,l.default.createElement("title",null,t),l.default.createElement("meta",{charSet:"utf-8"}),l.default.createElement("meta",{name:"description",content:n}),l.default.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),l.default.createElement("meta",{property:"og:type",content:"article"}),l.default.createElement("meta",{property:"og:url",content:e}),l.default.createElement("meta",{property:"og:image",content:a}),l.default.createElement("meta",{property:"og:title",content:t}),l.default.createElement("meta",{property:"og:description",content:n}),l.default.createElement("meta",{name:"twitter:card",content:"summary"}),l.default.createElement("meta",{name:"twitter:image:src",content:a}),l.default.createElement("meta",{name:"twitter:title",content:t}),l.default.createElement("meta",{name:"twitter:description",content:n}),l.default.createElement("link",{rel:"canonical",href:e}),l.default.createElement("link",{rel:"shortcut icon",href:o||"/favicon.ico"}))}}t.HeadTags=u},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipTrigger=void 0;const o=r(n(0));t.TooltipTrigger=({children:e,trigger:t})=>o.default.createElement("div",{title:e},t)},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const a=o(n(0)),l=o(n(5)),u=o(n(100)),i=o(n(101)),s=o(n(102)),c=n(9),m=e=>{var{index:t,labelId:n,label:o,component:l,componentProps:u={},itemProps:s}=e,m=r(e,["index","labelId","label","component","componentProps","itemProps"]);const d=c.useVulcanComponents();let f;f=l?a.default.cloneElement(l,u):n?a.default.createElement(d.FormattedMessage,{id:n}):a.default.createElement("span",null,o);return a.default.createElement(i.default,Object.assign({eventKey:t},s,m),f)};m.propTypes={index:l.default.number,to:l.default.any,labelId:l.default.string,label:l.default.string,component:l.default.object,componentProps:l.default.object,itemProps:l.default.object};const d=e=>{var{childrenItems:t}=e,n=r(e,["childrenItems"]);return a.default.createElement(a.default.Fragment,null,a.default.createElement(m,Object.assign({},n)),t&&!!t.length&&a.default.createElement("div",{className:"menu-node-children"},t.map((e,t)=>a.default.createElement(m,Object.assign({key:t},e)))))};d.propTypes={childrenItems:l.default.array};const f=e=>{var{label:t,labelId:n,trigger:o,menuItems:l,menuContents:i,variant:m="dropdown",buttonProps:f}=e,p=r(e,["label","labelId","trigger","menuItems","menuContents","variant","buttonProps"]);const b=c.useVulcanComponents(),h=i||l.map((e,t)=>"divider"===e?a.default.createElement(u.default.Divider,{key:t}):a.default.createElement(d,Object.assign({},e,{key:t,index:t})));return"flat"===m?h:o?a.default.createElement(u.default,Object.assign({},p),a.default.createElement(u.default.Toggle,null,o),a.default.createElement(u.default.Menu,null,h)):a.default.createElement(s.default,Object.assign({},f,{title:n?a.default.createElement(b.FormattedMessage,{id:n}):t},p),h)};f.propTypes={labelId:l.default.string,label:l.default.string,trigger:l.default.object,menuContents:l.default.object,menuItems:l.default.array,variant:l.default.string,buttonProps:l.default.object},t.default=f},function(e,t){e.exports=require("react-bootstrap/Dropdown")},function(e,t){e.exports=require("react-bootstrap/DropdownItem")},function(e,t){e.exports=require("react-bootstrap/DropdownButton")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(19),t),o(n(105),t)},function(e,t,n){"use strict";var r=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanCurrentUserProvider=void 0;const a=o(n(0)),l=n(20);t.VulcanCurrentUserProvider=e=>{var{value:t}=e,n=r(e,["value"]);return a.default.createElement(l.VulcanCurrentUserContext.Provider,Object.assign({value:t},n))}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.mergeWithComponents=t.delayedComponent=t.instantiateComponent=t.getRawComponent=t.componentExists=t.coreComponents=t.ComponentsTable=t.Components=void 0;const o=r(n(0));t.Components={},t.ComponentsTable={},t.coreComponents=["Alert","Button","Modal","ModalTrigger","Table","FormComponentCheckbox","FormComponentCheckboxGroup","FormComponentDate","FormComponentDate2","FormComponentDateTime","FormComponentDefault","FormComponentText","FormComponentEmail","FormComponentNumber","FormComponentRadioGroup","FormComponentSelect","FormComponentSelectMultiple","FormComponentStaticText","FormComponentTextarea","FormComponentTime","FormComponentUrl","FormComponentInner","FormControl","FormElement"];t.componentExists=e=>!!t.ComponentsTable[e];t.getRawComponent=e=>t.ComponentsTable[e].rawComponent;t.instantiateComponent=(e,t)=>{if(e){if(o.default.isValidElement(e))return o.default.cloneElement(e,t);if("function"==typeof e&&e.prototype&&e.prototype.isReactComponent){const n=e;return o.default.createElement(n,Object.assign({},t))}if("function"==typeof e)return e(t);if("object"==typeof e&&e.$$typeof&&e.render){const n=e;return o.default.createElement(n,Object.assign({},t))}return e}return null};t.delayedComponent=e=>n=>{const r=t.Components[e]||null;return r&&o.default.createElement(r,Object.assign({},n))};t.mergeWithComponents=e=>e?Object.assign(Object.assign({},t.Components),e):t.Components}]);
8
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXIudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29udGV4dC50c3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL2kxOG5cIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJAdnVsY2FuanMvdXRpbHNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwcm9wLXR5cGVzXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQGFwb2xsby9jbGllbnRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvZ2V0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL29taXRcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkNvbXBvbmVudHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2NvbXBhY3RcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkNvbXBvbmVudHMvQ29udGV4dC50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvcGlja1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9tb2R1bGVzL3V0aWxzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImRlYnVnXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3VuaXFcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaW50ZXJzZWN0aW9uXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL2dyYXBocWxcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkN1cnJlbnRVc2VyL0NvbnN1bWVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkN1cnJlbnRVc2VyL0NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm0vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL21lcmdlXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3NldFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9pc0VtcHR5XCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL21vZHVsZXMvc2NoZW1hX3V0aWxzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9maW5kXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL21vZHVsZXMvcGF0aF91dGlscy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJzaW1wbC1zY2hlbWFcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vaW5wdXRzL2NvbnN0cy50cyIsIndlYnBhY2s6Ly8vLi9pbmRleC50cyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1Db250YWluZXIudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9tb2R1bGVzL2Zvcm1GcmFnbWVudHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL3NjaGVtYVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9yZWFjdC1ob29rc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvVnVsY2FuQ29tcG9uZW50cy9EdW1teS50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm0vRm9ybS50c3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL2NvcmVcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvY2xvbmVEZWVwXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2lzT2JqZWN0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL21hcFZhbHVlc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9vbWl0QnlcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvcGlja0J5XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3Vuc2V0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3VwZGF0ZVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC93aXRob3V0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2lzUGxhaW5PYmplY3RcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvc2l6ZVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC90b1BhdGhcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaW5pdGlhbFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9mcC9mbG93XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3Rha2VSaWdodFwiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtL2ZpZWxkcy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvbWFwXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3NvcnRCeVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC91bmlxQnlcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvZGlmZmVyZW5jZVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9yZWplY3RcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvZmlsdGVyXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm0vdXRpbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2lzRXF1YWxXaXRoXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL3VzZVdhcm5PblVuc2F2ZWQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL3VzZVdhcm5PblVuc2F2ZWQvdXNlV2Fybk9uVW5zYXZlZC50cyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vdXNlQmxvY2tUcmFuc2l0aW9uL3VzZUJsb2NrVHJhbnNpdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vdXNlQmxvY2tUcmFuc2l0aW9uL2Jsb2NrLnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvVnVsY2FuQ29tcG9uZW50cy9Qcm92aWRlci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9WdWxjYW5Db21wb25lbnRzL2RlZmF1bHRWdWxjYW5Db21wb25lbnRzLnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtRXJyb3IudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29tcG9uZW50LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUNvbXBvbmVudElubmVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vdWlfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY2xhc3NuYW1lc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29tcG9uZW50TG9hZGVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUVsZW1lbnQudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtR3JvdXAudHN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9zb21lXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1JbnRsLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUVycm9ycy50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1TdWJtaXQudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTGF5b3V0LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZEFycmF5LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZEFycmF5TGF5b3V0LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZEl0ZW0udHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTmVzdGVkRGl2aWRlci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0ZpZWxkRXJyb3JzLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZE9iamVjdC50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1PcHRpb25MYWJlbC50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2lucHV0cy9CYXNpY0lucHV0cy50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2lucHV0cy9BdXRvY29tcGxldGVNdWx0aXBsZS50c3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtYm9vdHN0cmFwLXR5cGVhaGVhZFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImdyYXBocWwtdGFnXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2NvcmUvQnV0dG9uLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vY29yZS9Mb2FkaW5nLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL0xvYWRpbmdCdXR0b24udHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvTXV0YXRpb25CdXR0b24udHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvSGVhZFRhZ3MudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvYm9vdHN0cmFwL1Rvb2x0aXBUcmlnZ2VyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Jvb3RzdHJhcC9Ecm9wZG93bi50c3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtYm9vdHN0cmFwL0Ryb3Bkb3duXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtYm9vdHN0cmFwL0Ryb3Bkb3duSXRlbVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInJlYWN0LWJvb3RzdHJhcC9Ecm9wZG93bkJ1dHRvblwiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvVnVsY2FuQ3VycmVudFVzZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9WdWxjYW5DdXJyZW50VXNlci9Qcm92aWRlci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50c0hlbHBlcnMudHN4Il0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIlZ1bGNhbkNvbXBvbmVudHNDb25zdW1lciIsIlZ1bGNhbkNvbXBvbmVudHNDb250ZXh0IiwiQ29uc3VtZXIiLCJ1c2VWdWxjYW5Db21wb25lbnRzIiwidXNlQ29udGV4dCIsIndpdGhWdWxjYW5Db21wb25lbnRzIiwiQyIsInByb3BzIiwidnVsY2FuQ29tcG9uZW50cyIsImRlcHJlY2F0ZSIsIkZvcm1Db250ZXh0IiwiY3JlYXRlQ29udGV4dCIsInVuZGVmaW5lZCIsInVzZUZvcm1Db250ZXh0IiwiZm9ybUNvbnRleHQiLCJFcnJvciIsIl9fbm90X2ludGlhbGl6ZWQiLCJBbGVydCIsIkR1bW15IiwiQnV0dG9uIiwiRmllbGRFcnJvcnMiLCJIZWFkVGFncyIsIkxvYWRpbmdCdXR0b24iLCJNdXRhdGlvbkJ1dHRvbiIsIlRvb2x0aXBUcmlnZ2VyIiwiRHJvcGRvd24iLCJGb3JtIiwiRm9ybUNvbXBvbmVudCIsIkZvcm1Db21wb25lbnRBdXRvY29tcGxldGUiLCJGb3JtQ29tcG9uZW50Q2hlY2tib3giLCJGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cCIsIkZvcm1Db21wb25lbnREYXRlIiwiRm9ybUNvbXBvbmVudERhdGVUaW1lIiwiRm9ybUNvbXBvbmVudERlZmF1bHQiLCJGb3JtQ29tcG9uZW50RW1haWwiLCJGb3JtQ29tcG9uZW50SW5uZXIiLCJGb3JtQ29tcG9uZW50TGlrZXJ0IiwiRm9ybUNvbXBvbmVudExvYWRlciIsIkZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZSIsIkZvcm1Db21wb25lbnROdW1iZXIiLCJGb3JtQ29tcG9uZW50UGFzc3dvcmQiLCJGb3JtQ29tcG9uZW50UmFkaW9Hcm91cCIsIkZvcm1Db21wb25lbnRTZWxlY3QiLCJGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGUiLCJGb3JtQ29tcG9uZW50U3RhdGljVGV4dCIsIkZvcm1Db21wb25lbnRUZXh0YXJlYSIsIkZvcm1Db21wb25lbnRUaW1lIiwiRm9ybUNvbXBvbmVudFVybCIsIkZvcm1FbGVtZW50IiwiRm9ybUVycm9yIiwiRm9ybUVycm9ycyIsIkZvcm1Hcm91cCIsIkZvcm1Hcm91cEhlYWRlciIsIkZvcm1Hcm91cExheW91dCIsIkZvcm1JbnRsIiwiRm9ybUludGxJdGVtTGF5b3V0IiwiRm9ybUludGxMYXlvdXQiLCJGb3JtTGF5b3V0IiwiRm9ybU5lc3RlZEFycmF5IiwiRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXQiLCJGb3JtTmVzdGVkQXJyYXlMYXlvdXQiLCJGb3JtTmVzdGVkRGl2aWRlciIsIkZvcm1OZXN0ZWRJdGVtIiwiRm9ybU5lc3RlZEl0ZW1MYXlvdXQiLCJGb3JtTmVzdGVkT2JqZWN0IiwiRm9ybU5lc3RlZE9iamVjdExheW91dCIsIkZvcm1PcHRpb25MYWJlbCIsIkZvcm1TdWJtaXQiLCJGb3JtYXR0ZWRNZXNzYWdlIiwiSWNvbiIsIkljb25BZGQiLCJJY29uUmVtb3ZlIiwiTG9hZGluZyIsIkZvcm1JdGVtIiwiZGVlcFZhbHVlIiwib2JqIiwicGF0aCIsInBhdGhBcnJheSIsInNwbGl0IiwibGVuZ3RoIiwiZmxhdHRlbiIsImRhdGEiLCJyZXN1bHQiLCJyZWN1cnNlIiwiY3VyIiwicHJvcCIsInRvU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5IiwiaXNFbXB0eSIsImlzRW1wdHlWYWx1ZSIsIm1lcmdlVmFsdWUiLCJjdXJyZW50VmFsdWUiLCJkb2N1bWVudFZhbHVlIiwiZGVsZXRlZFZhbHVlcyIsImRlbGV0ZWRGaWVsZHMiLCJsb2NhbGUiLCJkYXRhdHlwZSIsImdldE5lc3RlZERlbGV0ZWRWYWx1ZXMiLCJoYXNEZWxldGVkVmFsdWVzIiwiZ2V0RGVsZXRlZFZhbHVlcyIsImFjY3VtdWxhdG9yIiwicmVkdWNlIiwicHJlZml4IiwicmVtb3ZlUHJlZml4IiwiZmlsdGVyUGF0aHNCeVByZWZpeCIsImdldEZpZWxkVHlwZSIsImZpZWxkU2NoZW1hIiwidHlwZSIsImdldE51bGxWYWx1ZSIsImZpZWxkVHlwZSIsIkJvb2xlYW4iLCJTdHJpbmciLCJOdW1iZXIiLCJWdWxjYW5DdXJyZW50VXNlckNvbnN1bWVyIiwiVnVsY2FuQ3VycmVudFVzZXJDb250ZXh0IiwidXNlVnVsY2FuQ3VycmVudFVzZXIiLCJjdXJyZW50VXNlciIsImxvYWRpbmciLCJnZXRWYWxpZEZpZWxkcyIsInNjaGVtYSIsImtleXMiLCJmaWx0ZXIiLCJmaWVsZE5hbWUiLCJpbmNsdWRlcyIsImdldEluc2VydGFibGVGaWVsZHMiLCJ1c2VyIiwiZmllbGQiLCJjYW5DcmVhdGVGaWVsZCIsImdldEVkaXRhYmxlRmllbGRzIiwiZG9jdW1lbnQiLCJjYW5VcGRhdGVGaWVsZCIsImNvbnZlcnRTY2hlbWEiLCJvcHRpb25zIiwicmVtb3ZlQXJyYXlzIiwianNvblNjaGVtYSIsImZvckVhY2giLCJnZXRGaWVsZFNjaGVtYSIsInN1YlNjaGVtYU9yVHlwZSIsImdldE5lc3RlZEZpZWxkU2NoZW1hT3JUeXBlIiwiYXJyYXlGaWVsZFNjaGVtYSIsImlzTmVzdGVkU2NoZW1hIiwiY29udmVydGVkU3ViU2NoZW1hIiwiaXNTaW1wbGVBcnJheUZpZWxkIiwic2NoZW1hUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJnZXRTY2hlbWFUeXBlIiwiZ2V0T2JqZWN0TmVzdGVkU2NoZW1hIiwiaXNOZXN0ZWRTY2hlbWFGaWVsZCIsImFycmF5SXRlbVNjaGVtYSIsImdldEFycmF5TmVzdGVkU2NoZW1hIiwib2JqZWN0SXRlbVNjaGVtYSIsImZvcm1Qcm9wZXJ0aWVzIiwic3BsaXRQYXRoIiwic3RyaW5nIiwiam9pblBhdGgiLCJhcnJheSIsIml0ZW0iLCJpc05hTiIsImdldFBhcmVudFBhdGgiLCJwYXRocyIsImV4cGxvZGVkUHJlZml4IiwibWFwIiwiZXhwbG9kZWRQYXRoIiwiZXhwbG9kZWRTdWZmaXgiLCJzdGFydHNXaXRoIiwic3RhbmRhcmRJbnB1dHMiLCJjbGVhcmFibGVJbnB1dHMiLCJhZHZhbmNlZElucHV0cyIsImRlcml2ZWRJbnB1dHMiLCJhbGxWdWxjYW5JbnB1dHMiLCJnZXRBdXRvSW5wdXRGcm9tVHlwZSIsIkludGVnZXIiLCJEYXRlIiwiZGVidWdGb3JtIiwiZGVidWdWdWxjYW4iLCJGb3JtQ29udGFpbmVyIiwibW9kZWwiLCJkb2N1bWVudElkIiwic2x1ZyIsImZpZWxkcyIsImFkZEZpZWxkcyIsImN1cnJlbnRVc2VyRnJvbVByb3BzIiwibG9hZGluZ0N1cnJlbnRVc2VyIiwibG9hZGluZ0N1cnJlbnRVc2VyRnJvbVByb3BzIiwiaXNFZGl0IiwiZm9ybVR5cGUiLCJWdWxjYW5Db21wb25lbnRzIiwiY2hpbGRQcm9wcyIsImNhcGl0YWxpemUiLCJtdXRhdGlvbkZyYWdtZW50IiwibXV0YXRpb25GcmFnbWVudE5hbWUiLCJxdWVyeUZyYWdtZW50IiwicXVlcnlGcmFnbWVudE5hbWUiLCJhdXRvRm9ybUZyYWdtZW50cyIsImdxbCIsImdldEZyYWdtZW50TmFtZSIsInVzZUZyYWdtZW50cyIsIm11dGF0aW9uT3B0aW9ucyIsImZyYWdtZW50IiwiZnJhZ21lbnROYW1lIiwicXVlcnlPcHRpb25zIiwiaW5wdXQiLCJpZCIsImVuYWJsZUNhY2hlIiwiZmV0Y2hQb2xpY3kiLCJwb2xsSW50ZXJ2YWwiLCJza2lwIiwicmVmZXRjaCIsInVzZVNpbmdsZSIsImNyZWF0ZURvY3VtZW50IiwidXNlQ3JlYXRlIiwidXBkYXRlRG9jdW1lbnQiLCJ1c2VVcGRhdGUiLCJkZWxldGVEb2N1bWVudCIsInVzZURlbGV0ZSIsImN1cnJlbnRVc2VyRnJvbUNvbnRleHQiLCJsb2FkaW5nQ3VycmVudFVzZXJGcm9tQ29udGV4dCIsInNob3VsZEdldEN1cnJlbnRVc2VyRnJvbVByb3BzIiwidmFyaWFibGVzIiwiZXJyb3JzIiwiU21hcnRGb3JtIiwibXVsdGlUeXBlTmFtZSIsImZyYWdtZW50VHlwZSIsImpvaW4iLCJnZXRRdWVyeUZpZWxkTmFtZXMiLCJnZXRDcmVhdGVhYmxlRmllbGRzIiwiZ2V0VXBkYXRlYWJsZUZpZWxkcyIsImdldE11dGF0aW9uRmllbGROYW1lcyIsInJlYWRhYmxlRmllbGROYW1lcyIsInF1ZXJ5RmllbGROYW1lcyIsImNvbmNhdCIsImdldFNjaGVtYUZyYWdtZW50IiwiZmllbGROYW1lcyIsInByb3ZpZGVkRmllbGROYW1lcyIsImlzTXV0YXRpb24iLCJnZXRGcmFnbWVudEZpZWxkTmFtZXMiLCJvbmx5Vmlld2FibGUiLCJjaGlsZEZyYWdtZW50cyIsImdldEZpZWxkRnJhZ21lbnQiLCJnZXRPYmplY3RGcmFnbWVudCIsImYiLCJncmFwaHFsIiwidHlwZU5hbWUiLCJtdXRhdGlvbkZpZWxkTmFtZXMiLCJmaWVsZHNXaXRoSW50bFN1ZmZpeCIsImFsbEZpZWxkcyIsInVzZXJJZCIsInVuc2hpZnQiLCJfaWQiLCJxdWVyeUZyYWdtZW50VGV4dCIsImdlbmVyYXRlZFF1ZXJ5RnJhZ21lbnQiLCJtdXRhdGlvbkZyYWdtZW50VGV4dCIsImV4dHJhUXVlcmllcyIsInF1ZXJ5IiwiZ2V0SW5pdGlhbFN0YXRlRnJvbVByb3BzIiwibmV4dFByb3BzIiwiY29udmVydGVkU2NoZW1hIiwiZGVmYXVsdFZhbHVlcyIsImRlZmF1bHRWYWx1ZSIsImdldERlZmF1bHRWYWx1ZXMiLCJpbml0aWFsRG9jdW1lbnQiLCJwcmVmaWxsZWRQcm9wcyIsIm1pbkNvdW50IiwicHVzaCIsInJlbW92ZVByb3BlcnR5IiwiZGlzYWJsZWQiLCJjdXJyZW50VmFsdWVzIiwib3JpZ2luYWxTY2hlbWEiLCJmbGF0U2NoZW1hIiwiY3VycmVudERvY3VtZW50IiwiRm9ybVdhcm5VbnNhdmVkIiwiaXNDaGFuZ2VkIiwid2FyblVuc2F2ZWRDaGFuZ2VzIiwiY2hpbGRyZW4iLCJ1c2VXYXJuT25VbnNhdmVkIiwiZ2V0RGF0YSIsImN1c3RvbUFyZ3MiLCJzdGF0ZSIsInN1Ym1pdEZvcm1DYWxsYmFja3MiLCJmb3JtIiwiZW5kc1dpdGgiLCJhcmdzIiwiZXhjbHVkZVJlbW92ZWRGaWVsZHMiLCJleGNsdWRlSGlkZGVuRmllbGRzIiwicmVwbGFjZUludGxGaWVsZHMiLCJhZGRFeHRyYUZpZWxkcyIsImdldEZpZWxkTmFtZXMiLCJwYXJlbnRQYXRoIiwieCIsImNvbXBhY3RQYXJlbnQiLCJydW5DYWxsYmFja3MiLCJjYWxsYmFja3MiLCJpdGVyYXRvciIsImluaXRDYWxsYmFjayIsImluaXRpYWxTdGF0ZSIsImlzRmlyc3RSZW5kZXIiLCJ1c2VSZWYiLCJ1c2VFZmZlY3QiLCJjdXJyZW50IiwibGF5b3V0IiwicmVwZWF0RXJyb3JzIiwic2hvd1JlbW92ZSIsInNob3dEZWxldGUiLCJzdWNjZXNzRm9ybUNhbGxiYWNrcyIsImZhaWx1cmVGb3JtQ2FsbGJhY2tzIiwiaW50bCIsInVzZUludGxDb250ZXh0Iiwic2V0RXJyb3JzIiwidXNlU3RhdGUiLCJ0aHJvd0Vycm9yIiwiZXJyb3IiLCJmb3JtRXJyb3JzIiwiZ2V0RXJyb3JzIiwiY29uc29sZSIsImxvZyIsInByZXZFcnJvcnMiLCJzZXREZWxldGVkVmFsdWVzIiwic2V0Q2FsbGJhY2tzIiwic2V0Q3VycmVudFZhbHVlcyIsInNldEN1cnJlbnREb2N1bWVudCIsInJlZmV0Y2hGb3JtIiwic2V0RGlzYWJsZWQiLCJzdWNjZXNzIiwic2V0U3VjY2VzcyIsImNsZWFyRm9ybSIsIm9wdGlvbnNEb2N1bWVudCIsImZvcm1SZWYiLCJtdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayIsIm11dGF0aW9uVHlwZSIsInN1Y2Nlc3NDYWxsYmFjayIsInRoaXMiLCJtdXRhdGlvbkVycm9yQ2FsbGJhY2siLCJlcnJvckNhbGxiYWNrIiwic3VibWl0Rm9ybSIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJjb250ZXh0TmFtZSIsIm11dGFibGVGaWVsZHMiLCJzdWJtaXRDYWxsYmFjayIsIm5ld011dGF0aW9uU3VjY2Vzc0NhbGxiYWNrIiwiZWRpdE11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrIiwic3VjY2Vzc0NvbXBvbmVudCIsIkZvcm1Db21wb25lbnRzIiwiZm9ybUxheW91dFByb3BzIiwiZm9ybUdyb3VwUHJvcHMiLCJzdWJtaXRMYWJlbCIsImNhbmNlbExhYmVsIiwicmV2ZXJ0TGFiZWwiLCJjYW5jZWxDYWxsYmFjayIsInJldmVydENhbGxiYWNrIiwiaXRlbVByb3BlcnRpZXMiLCJjb21tb25Qcm9wcyIsImRvY0NsYXNzTmFtZSIsIm1vZGVsTmFtZSIsInRvTG93ZXJDYXNlIiwiZm9ybVN1Ym1pdFByb3BzIiwiZ3JvdXAiLCJmb3JtUHJvcHMiLCJjbGFzc05hbWUiLCJzdWJtaXRQcm9wcyIsImdldENoaWxkcmVuUHJvcHMiLCJkb2N1bWVudFRpdGxlIiwidGl0bGUiLCJkZWxldGVEb2N1bWVudENvbmZpcm0iLCJmb3JtYXRNZXNzYWdlIiwiY29uZmlybSIsInRoZW4iLCJtdXRhdGlvblJlc3VsdCIsInJlbW92ZVN1Y2Nlc3NDYWxsYmFjayIsImNhdGNoIiwiaXNOb3RTYW1lRG9jdW1lbnQiLCJQcm92aWRlciIsInN1Ym1pdEZvcm1Db250ZXh0IiwiYWRkVG9EZWxldGVkVmFsdWVzIiwicHJldkRlbGV0ZWRWYWx1ZXMiLCJ1cGRhdGVDdXJyZW50VmFsdWVzIiwibmV3VmFsdWVzIiwiY2hhbmdlQ2FsbGJhY2siLCJuZXdTdGF0ZSIsIm9sZFZhbHVlIiwiZ2V0RG9jdW1lbnQiLCJnZXRMYWJlbCIsImZpZWxkTG9jYWxlIiwiYWRkVG9TdWJtaXRGb3JtIiwiY2FsbGJhY2siLCJjYnMiLCJhZGRUb1N1Y2Nlc3NGb3JtIiwiYWRkVG9GYWlsdXJlRm9ybSIsImNsZWFyRm9ybUNhbGxiYWNrcyIsImNsZWFyRmllbGRFcnJvcnMiLCJnZXRGaWVsZEdyb3VwcyIsImNvbnRleHQiLCJjb2xsZWN0aW9uTmFtZSIsImxhYmVsIiwiZm9ybWF0TGFiZWwiLCJkZWZhdWx0TWVzc2FnZSIsImdldE9wdGlvbkxhYmVsIiwib3B0aW9uIiwiaW50bElkIiwib3B0aW9uc0Zyb21BcmdzIiwicmVtb3ZlRmllbGRzIiwicmVsZXZhbnRGaWVsZHMiLCJoaWRkZW4iLCJpc0ludGxGaWVsZCIsImluaXRGaWVsZCIsImNvbnRyb2wiLCJpdGVtRmllbGRTY2hlbWEiLCJpdGVtRGF0YXR5cGUiLCJpbnRsS2V5cyIsImdldEludGxLZXlzIiwiaW50bElucHV0IiwiaW5wdXRQcm9wZXJ0aWVzIiwiZGVzY3JpcHRpb24iLCJnZXRJbnRsTGFiZWwiLCJpc0Rlc2NyaXB0aW9uIiwiZ2V0RGVzY3JpcHRpb24iLCJoZWxwIiwiaGFuZGxlRmllbGRQYXRoIiwiZmllbGRQYXRoIiwiaGFuZGxlUGVybWlzc2lvbnMiLCJjcmVhdGVGaWVsZCIsInBhcmVudEZpZWxkTmFtZSIsImhhbmRsZUZpZWxkUGFyZW50IiwiYXJyYXlGaWVsZCIsImNyZWF0ZUFycmF5U3ViRmllbGQiLCJuZXN0ZWRTY2hlbWEiLCJuZXN0ZWRJbnB1dCIsIm5lc3RlZEZpZWxkcyIsInN1YkZpZWxkTmFtZSIsImhhbmRsZUZpZWxkQ2hpbGRyZW4iLCJzdWJGaWVsZFNjaGVtYSIsInN1YkZpZWxkIiwiZ3JvdXBzV2l0aEZpZWxkcyIsImciLCJncm91cEZpZWxkcyIsImRlZmF1bHRHcm91cEZpZWxkcyIsIm9yZGVyIiwiY2hhbmdlZERvY3VtZW50IiwiY29sbGVjdGlvbiIsIm9ialZhbHVlIiwib3RoVmFsdWUiLCJkZWJ1Z1RyYW5zaXRpb25zIiwidXNlQmxvY2tUcmFuc2l0aW9uIiwic2hvdWxkQmxvY2siLCJnZXRCbG9ja2VkTWVzc2FnZSIsInVuYmxvY2tSZWYiLCJpc0Jsb2NraW5nIiwib25VbmJsb2NrIiwib25CbG9ja2VkIiwiZXZ0IiwibWVzc2FnZSIsInJldHVyblZhbHVlIiwiYmxvY2siLCJibG9ja0JlZm9yZVVubG9hZCIsIkJMT0NLX1RSQU5TSVRJT05fRVZFTlRfVFlQRSIsIlVOQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFIiwic2V0Q29uZmlybWF0aW9uTWVzc2FnZSIsImJsb2NrRXZlbnQiLCJFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwidW5ibG9ja0V2ZW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uYmVmb3JldW5sb2FkIiwiVnVsY2FuQ29tcG9uZW50c1Byb3ZpZGVyIiwiY3VycmVudENvbXBvbmVudHMiLCJtZXJnZWRDb21wb25lbnRzIiwiZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHMiLCJjb21wb25lbnROYW1lIiwiZGlzcGxheU5hbWUiLCJkZWZhdWx0Q29yZUNvbXBvbmVudHMiLCJkZWZhdWx0Rm9ybUNvbXBvbmVudHMiLCJBdXRvY29tcGxldGVNdWx0aXBsZSIsImVycm9yQ29udGV4dCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtZXNzYWdlUHJvcHMiLCJ2YWx1ZXMiLCJwcm9wZXJ0aWVzIiwiZXJyb3JOYW1lIiwic2xpY2UiLCJleGNlcHRpb24iLCJodG1sIiwiZGVmYXVsdFByb3BzIiwiZ2V0Q2hhcmFjdGVyQ291bnRzIiwibWF4IiwiY2hhcmFjdGVyQ291bnQiLCJjaGFyc1JlbWFpbmluZyIsImNoYXJzQ291bnQiLCJnZXRQYXRoIiwiZ2V0SW5wdXROYW1lIiwiZ2V0Rm9ybUlucHV0IiwiaW5wdXROYW1lIiwiY291bnRGcm9tUHJvcHMiLCJpbnRsT3JSZWd1bGFyVmFsdWUiLCJnZXRDaGFyYWN0ZXJDb3VudHNGcm9tUHJvcHMiLCJjaGFyc0NvdW50U3RhdGUiLCJzZXRDaGFyYWN0ZXJDb3VudHMiLCJ1cGRhdGVDaGFyYWN0ZXJDb3VudCIsInNob3dDaGFyc1JlbWFpbmluZyIsImdldFZhbHVlIiwibnVsbFZhbHVlIiwiaXNBcnJheUZpZWxkIiwiZm9ybUNvbXBvbmVudHMiLCJpc09iamVjdEZpZWxkIiwiZmNpUHJvcHMiLCJpbnB1dFR5cGUiLCJoYW5kbGVDaGFuZ2UiLCJwYXJzZUludCIsInVwZGF0ZVZhbHVlIiwiY2xlYXJGaWVsZCIsImZvcm1JbnB1dCIsImZjaSIsImZvcm1Db21wb25lbnRzRGVwZW5kZW5jaWVzIiwiaW5wdXRDbGFzc05hbWUiLCJiZWZvcmVDb21wb25lbnQiLCJhZnRlckNvbXBvbmVudCIsInJlbmRlckNvbXBvbmVudCIsImhhc0Vycm9ycyIsImlucHV0Q2xhc3MiLCJ3aGl0ZWxpc3RJbnB1dFByb3BzIiwib25DaGFuZ2UiLCJpbnB1dFZhbHVlIiwidGFyZ2V0IiwiY2hlY2tlZCIsIkNvbXBvbmVudHMiLCJnZXRQcm9wZXJ0aWVzIiwiRm9ybUlucHV0Iiwib25DbGljayIsInJlbmRlckNsZWFyIiwiZGFuZ2VyIiwiZ2V0SHRtbElucHV0UHJvcHMiLCJvbkJsdXIiLCJxdWVyeVdhaXRzRm9yVmFsdWUiLCJxdWVyeVRleHQiLCJsb2FkRmllbGRRdWVyeSIsInVzZUxhenlRdWVyeSIsInZhbHVlSXNFbXB0eSIsImV4dHJhUHJvcHMiLCJxdWVyeURhdGEiLCJxdWVyeUVycm9yIiwib3B0aW9uc0Z1bmN0aW9uIiwiaXNWYWxpZEVsZW1lbnQiLCJjbG9uZUVsZW1lbnQiLCJwcm9wVHlwZXMiLCJmb3J3YXJkUmVmIiwicmVmIiwib3RoZXJQcm9wcyIsIm9uU3VibWl0IiwiYW5jaG9yTmFtZSIsImNvbGxhcHNlZCIsInRvZ2dsZSIsInNldENvbGxhcHNlZCIsInN0YXJ0Q29sbGFwc2VkIiwiaXNIaWRkZW4iLCJoZWFkaW5nIiwiYWRtaW5zT25seSIsImlzQWRtaW4iLCJkZWZhdWx0SW5kZXgiLCJ2YXJpYW50IiwiaW5kZXgiLCJlIiwiY2FuRGVsZXRlRG9jdW1lbnQiLCJub2RlIiwiZnVuYyIsImNsYXNzZXMiLCJhZGRJdGVtIiwiQmVmb3JlQ29tcG9uZW50IiwiQWZ0ZXJDb21wb25lbnQiLCJpc0RlbGV0ZWQiLCJvcGVuTmVzdGVkIiwidmlzaWJsZUl0ZW1JbmRleGVzIiwiY3VycmVudEluZGV4Iiwic3ViRG9jdW1lbnQiLCJzdWJEb2N1bWVudEluZHgiLCJjb21wdXRlVmlzaWJsZUluZGV4IiwibWF4Q291bnQiLCJhcnJheUxlbmd0aCIsInNpbmdsZVZhbHVlIiwibmVzdGVkQXJyYXlFcnJvcnMiLCJ2aXNpYmxlSXRlbUluZGV4IiwiaXRlbUluZGV4IiwicmVtb3ZlSXRlbSIsImhpZGVSZW1vdmUiLCJ3aWR0aCIsImhlaWdodCIsInhtbG5zIiwidmlld0JveCIsImZpbGwiLCJzaXplIiwiYm9vbCIsImlzUmVxdWlyZWQiLCJoaWRlTGFiZWwiLCJjb250ZW50IiwicmVtb3ZlQnV0dG9uIiwiaWNvbkJ1dHRvbiIsInRhYkluZGV4IiwibnVtYmVyIiwiY29udGV4dFR5cGVzIiwiaW50bFNoYXBlIiwib25lT2ZUeXBlIiwibmVzdGVkT2JqZWN0RXJyb3JzIiwiSFRNTElucHV0QWRhcHRlciIsIm90aGVySW5wdXRQcm9wZXJ0aWVzIiwiaHRtbEZvciIsIkhUTUxTZWxlY3RBZGFwdGVyIiwibXVsdGlwbGUiLCJyZWZGdW5jdGlvbiIsImF1dG9jb21wbGV0ZVF1ZXJ5IiwicXVlcnlTdHJpbmciLCJzZXRRdWVyeVN0cmluZyIsImxvYWRBdXRvY29tcGxldGVPcHRpb25zIiwiYXV0b2NvbXBsZXRlT3B0aW9ucyIsInNlbGVjdGVkSXRlbXMiLCJBc3luY1R5cGVhaGVhZCIsInNlbGVjdGVkIiwic2VsZWN0ZWRJZHMiLCJpbnB1dFByb3BzIiwib25TZWFyY2giLCJpc0xvYWRpbmciLCJyZXN0IiwibGFiZWxTdHlsZSIsIm9wYWNpdHkiLCJsb2FkaW5nU3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImRpc3BsYXkiLCJqdXN0aWZ5Q29udGVudCIsImFsaWduSXRlbXMiLCJzdHlsZSIsInNldExvYWRpbmciLCJzZXRFcnJvciIsIm11dGF0aW9uIiwibXV0YXRpb25Bcmd1bWVudHMiLCJsb2FkaW5nQnV0dG9uUHJvcHMiLCJtdXRhdGlvbkFzTm9kZSIsIm11dGF0aW9uRnVuYyIsInVzZU11dGF0aW9uIiwibG9hZGluZ0J1dHRvbiIsInRyaWdnZXIiLCJkZWZhdWx0U2hvdyIsInJlcGxhY2UiLCJQdXJlQ29tcG9uZW50Iiwid2FybiIsInVybCIsInNpdGVVcmwiLCJmYXZpY29uVXJsIiwiaW1hZ2UiLCJpbmRleE9mIiwiY2hhckF0IiwiY2hhclNldCIsInJlbCIsImhyZWYiLCJJdGVtIiwibGFiZWxJZCIsImNvbXBvbmVudCIsImNvbXBvbmVudFByb3BzIiwiaXRlbVByb3BzIiwibWVudUNvbXBvbmVudCIsImV2ZW50S2V5IiwidG8iLCJhbnkiLCJOb2RlIiwiY2hpbGRyZW5JdGVtcyIsIkJvb3RzdHJhcERyb3Bkb3duIiwibWVudUl0ZW1zIiwibWVudUNvbnRlbnRzIiwiYnV0dG9uUHJvcHMiLCJkcm9wZG93blByb3BzIiwibWVudUJvZHkiLCJEaXZpZGVyIiwiVG9nZ2xlIiwiTWVudSIsIlZ1bGNhbkN1cnJlbnRVc2VyUHJvdmlkZXIiLCJDb21wb25lbnRzVGFibGUiLCJjb3JlQ29tcG9uZW50cyIsImNvbXBvbmVudEV4aXN0cyIsImdldFJhd0NvbXBvbmVudCIsInJhd0NvbXBvbmVudCIsImluc3RhbnRpYXRlQ29tcG9uZW50IiwiaXNSZWFjdENvbXBvbmVudCIsIkNvbXBvbmVudCIsIiQkdHlwZW9mIiwicmVuZGVyIiwiZGVsYXllZENvbXBvbmVudCIsIm1lcmdlV2l0aENvbXBvbmVudHMiLCJteUNvbXBvbmVudHMiXSwibWFwcGluZ3MiOiIyQkFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUEwRGYsT0FyREFGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVBQUVYLEVBQVNTLElBQ2xDRyxPQUFPQyxlQUFlYixFQUFTUyxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVaLEVBQW9Ca0IsRUFBSSxTQUFTaEIsR0FDWCxvQkFBWGlCLFFBQTBCQSxPQUFPQyxhQUMxQ04sT0FBT0MsZUFBZWIsRUFBU2lCLE9BQU9DLFlBQWEsQ0FBRUMsTUFBTyxXQUU3RFAsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLEtBUXZEckIsRUFBb0JzQixFQUFJLFNBQVNELEVBQU9FLEdBRXZDLEdBRFUsRUFBUEEsSUFBVUYsRUFBUXJCLEVBQW9CcUIsSUFDL0IsRUFBUEUsRUFBVSxPQUFPRixFQUNwQixHQUFXLEVBQVBFLEdBQThCLGlCQUFWRixHQUFzQkEsR0FBU0EsRUFBTUcsV0FBWSxPQUFPSCxFQUNoRixJQUFJSSxFQUFLWCxPQUFPWSxPQUFPLE1BR3ZCLEdBRkExQixFQUFvQmtCLEVBQUVPLEdBQ3RCWCxPQUFPQyxlQUFlVSxFQUFJLFVBQVcsQ0FBRVQsWUFBWSxFQUFNSyxNQUFPQSxJQUN0RCxFQUFQRSxHQUE0QixpQkFBVEYsRUFBbUIsSUFBSSxJQUFJTSxLQUFPTixFQUFPckIsRUFBb0JVLEVBQUVlLEVBQUlFLEVBQUssU0FBU0EsR0FBTyxPQUFPTixFQUFNTSxJQUFRQyxLQUFLLEtBQU1ELElBQzlJLE9BQU9GLEdBSVJ6QixFQUFvQjZCLEVBQUksU0FBUzFCLEdBQ2hDLElBQUlTLEVBQVNULEdBQVVBLEVBQU9xQixXQUM3QixXQUF3QixPQUFPckIsRUFBZ0IsU0FDL0MsV0FBOEIsT0FBT0EsR0FFdEMsT0FEQUgsRUFBb0JVLEVBQUVFLEVBQVEsSUFBS0EsR0FDNUJBLEdBSVJaLEVBQW9CYSxFQUFJLFNBQVNpQixFQUFRQyxHQUFZLE9BQU9qQixPQUFPa0IsVUFBVUMsZUFBZTFCLEtBQUt1QixFQUFRQyxJQUd6Ry9CLEVBQW9Ca0MsRUFBSSxHQUlqQmxDLEVBQW9CQSxFQUFvQm1DLEVBQUksSSxnQkNsRnJEaEMsRUFBT0QsUUFBVWtDLFFBQVEsVSwwckJDQXpCLGFBQ0EsVUFDQSxRQUVhLEVBQUFDLHlCQUEyQixFQUFBQyx3QkFBd0JDLFNBRW5ELEVBQUFDLG9CQUFzQixJQUNyQixFQUFBQyxXQUFXLEVBQUFILHlCQUlaLEVBQUFJLHFCQUF3QkMsR0FBT0MsSUFDMUMsTUFBTUMsRUFBbUIsRUFBQUwsc0JBS3pCLE9BSkEsRUFBQU0sVUFDRSxRQUNBLDJFQUVLLHdCQUFDSCxFQUFDLGVBQUNFLGlCQUFrQkEsR0FBc0JELE0saXBCQ2pCcEQsZ0JBMEJhLEVBQUFHLFlBQ1gsVUFBTUMsbUJBQTRDQyxHQUV2QyxFQUFBQyxlQUFpQixLQUM1QixNQUFNQyxFQUFjLEVBQUFWLFdBQVcsRUFBQU0sYUFDL0IsSUFBS0ksRUFDSCxNQUFNLElBQUlDLE1BQ1IsK0dBRUosT0FBT0QsSSxjQ25DVGhELEVBQU9ELFFBQVVrQyxRQUFRLG1CLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsb0IsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxlLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsbUIsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxlLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsZ0IsdVpDQXpCLFdBQ0EsV0FDQSxVQUNBLGEsY0NIQWpDLEVBQU9ELFFBQVVrQyxRQUFRLG1CLG1NQ0F6QixnQkFFQSxRQUlhLEVBQUFFLHdCQUNYLFVBQU1VLGNBQXdDLENBQzVDSyxrQkFBa0IsRUFDbEJDLE1BQU8sRUFBQUMsTUFDUEMsT0FBUSxFQUFBRCxNQUNSRSxZQUFhLEVBQUFGLE1BQ2JHLFNBQVUsRUFBQUgsTUFDVkksY0FBZSxFQUFBSixNQUNmSyxlQUFnQixFQUFBTCxNQUNoQk0sZUFBZ0IsRUFBQU4sTUFDaEJPLFNBQVUsRUFBQVAsTUFFVlEsS0FBTSxFQUFBUixNQUNOUyxjQUFlLEVBQUFULE1BQ2ZVLDBCQUEyQixFQUFBVixNQUMzQlcsc0JBQXVCLEVBQUFYLE1BQ3ZCWSwyQkFBNEIsRUFBQVosTUFDNUJhLGtCQUFtQixFQUFBYixNQUNuQmMsc0JBQXVCLEVBQUFkLE1BQ3ZCZSxxQkFBc0IsRUFBQWYsTUFDdEJnQixtQkFBb0IsRUFBQWhCLE1BQ3BCaUIsbUJBQW9CLEVBQUFqQixNQUNwQmtCLG9CQUFxQixFQUFBbEIsTUFDckJtQixvQkFBcUIsRUFBQW5CLE1BQ3JCb0IsK0JBQWdDLEVBQUFwQixNQUNoQ3FCLG9CQUFxQixFQUFBckIsTUFDckJzQixzQkFBdUIsRUFBQXRCLE1BQ3ZCdUIsd0JBQXlCLEVBQUF2QixNQUN6QndCLG9CQUFxQixFQUFBeEIsTUFDckJ5Qiw0QkFBNkIsRUFBQXpCLE1BQzdCMEIsd0JBQXlCLEVBQUExQixNQUN6QjJCLHNCQUF1QixFQUFBM0IsTUFDdkI0QixrQkFBbUIsRUFBQTVCLE1BQ25CNkIsaUJBQWtCLEVBQUE3QixNQUNsQjhCLFlBQWEsRUFBQTlCLE1BQ2IrQixVQUFXLEVBQUEvQixNQUNYZ0MsV0FBWSxFQUFBaEMsTUFDWmlDLFVBQVcsRUFBQWpDLE1BQ1hrQyxnQkFBaUIsRUFBQWxDLE1BQ2pCbUMsZ0JBQWlCLEVBQUFuQyxNQUNqQm9DLFNBQVUsRUFBQXBDLE1BQ1ZxQyxtQkFBb0IsRUFBQXJDLE1BQ3BCc0MsZUFBZ0IsRUFBQXRDLE1BQ2hCdUMsV0FBWSxFQUFBdkMsTUFDWndDLGdCQUFpQixFQUFBeEMsTUFDakJ5QywyQkFBNEIsRUFBQXpDLE1BQzVCMEMsc0JBQXVCLEVBQUExQyxNQUN2QjJDLGtCQUFtQixFQUFBM0MsTUFDbkI0QyxlQUFnQixFQUFBNUMsTUFDaEI2QyxxQkFBc0IsRUFBQTdDLE1BQ3RCOEMsaUJBQWtCLEVBQUE5QyxNQUNsQitDLHVCQUF3QixFQUFBL0MsTUFDeEJnRCxnQkFBaUIsRUFBQWhELE1BQ2pCaUQsV0FBWSxFQUFBakQsTUFDWmtELGlCQUFrQixFQUFBbEQsTUFDbEJtRCxLQUFNLEVBQUFuRCxNQUNOb0QsUUFBUyxFQUFBcEQsTUFDVHFELFdBQVksRUFBQXJELE1BQ1pzRCxRQUFTLEVBQUF0RCxNQUNUdUQsU0FBVSxFQUFBdkQsUyxjQ2pFZHBELEVBQU9ELFFBQVVrQyxRQUFRLGdCLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsMEIscVNDQXpCLGlCQUNBLFdBQ0EsV0FDQSxXQUNBLFdBRUEsUUFJYSxFQUFBMkUsVUFBWSxTQUFVQyxFQUFLQyxHQUN0QyxNQUFNQyxFQUFZRCxFQUFLRSxNQUFNLEtBRTdCLElBQUssSUFBSS9HLEVBQUksRUFBR0EsRUFBSThHLEVBQVVFLE9BQVFoSCxJQUNwQzRHLEVBQU1BLEVBQUlFLEVBQVU5RyxJQUd0QixPQUFPNEcsR0FJSSxFQUFBSyxRQUFVLFNBQVVDLEdBQy9CLElBQUlDLEVBQVMsR0FrQmIsT0FqQkEsU0FBU0MsRUFBUUMsRUFBS0MsR0FDcEIsR0FBNEMsb0JBQXhDNUcsT0FBT2tCLFVBQVUyRixTQUFTcEgsS0FBS2tILEdBQ2pDRixFQUFPRyxHQUFRRCxPQUNWLEdBQUlHLE1BQU1DLFFBQVFKLEdBQU0sQ0FDN0IsSUFBSyxJQUFJckgsRUFBSSxFQUFHQyxFQUFJb0gsRUFBSUwsT0FBUWhILEVBQUlDLEVBQUdELElBQ3JDb0gsRUFBUUMsRUFBSXJILEdBQUlzSCxFQUFPLElBQU10SCxFQUFJLEtBQzFCLEdBQUxDLElBQVFrSCxFQUFPRyxHQUFRLFFBQ3RCLENBQ0wsSUFBSUksR0FBVSxFQUNkLElBQUssSUFBSTVGLEtBQUt1RixFQUNaSyxHQUFVLEVBQ1ZOLEVBQVFDLEVBQUl2RixHQUFJd0YsRUFBT0EsRUFBTyxJQUFNeEYsRUFBSUEsR0FFdEM0RixHQUFXSixJQUFNSCxFQUFPRyxHQUFRLEtBR3hDRixDQUFRRixFQUFNLElBQ1BDLEdBR0ksRUFBQVEsYUFBZ0IxRyxHQUMzQixNQUFPQSxHQUVHLEtBQVZBLEdBQ0N1RyxNQUFNQyxRQUFReEcsSUFBMkIsSUFBakJBLEVBQU0rRixPQWVwQixFQUFBWSxXQUFhLEVBQ3hCQyxlQUNBQyxnQkFDQUMsY0FBZUMsRUFDZm5CLE9BQ0FvQixTQUNBQyxlQUVBLEdBQUlELEVBRUYsT0FBT0osR0FBZ0JDLEdBQWlCLEdBTTFDLE1BQU1DLEVBQWdCLEVBQUFJLHVCQUF1QnRCLEVBQU1tQixHQUM3Q0ksSUFBcUIsVUFBS0wsR0FDaEMsT0FDR1AsTUFBTUMsUUFBUUksSUFBaUJPLElBQ2hDLFVBQUtGLEVBQVUsQ0FBQyxPQUFRVixRQUVqQixVQUFNLEdBQUlNLEVBQWVELEVBQWNFLElBRTdDLFVBQWNGLElBQWlCTyxJQUNoQyxVQUFLRixFQUFVLENBQUMsT0FBUXhILFNBRWpCLFVBQU0sR0FBSW9ILEVBQWVELEVBQWNFLFFBSnpDLEdBNkJJLEVBQUFNLGlCQUFtQixDQUFDTCxFQUFlTSxFQUFjLEtBQzVETixFQUFjTyxPQUNaLENBQUNSLEVBQWVsQixJQUFTLFVBQUlrQixFQUFlbEIsRUFBTSxNQUNsRHlCLEdBNkJTLEVBQUFILHVCQUF5QixDQUNwQ0ssRUFDQVIsRUFDQU0sRUFBYyxLQUVkLEVBQUFELGlCQUNFLEVBQUFJLGFBQWFELEVBQVEsRUFBQUUsb0JBQW9CRixFQUFRUixJQUNqRE0sR0FLUyxFQUFBSyxhQUFnQkMsR0FDM0JBLEVBQVlDLEtBT0QsRUFBQUMsYUFBZ0JaLElBQzNCLE1BQU1hLEVBQVksRUFBQUosYUFBYVQsR0FDL0IsT0FBSWEsSUFBY3ZCLE1BQ1QsR0FDRXVCLElBQWNDLFVBRWRELElBQWNFLFFBRWRGLElBQWNHLE9BRGhCLEdBS0EsUSxjQ2xMWG5KLEVBQU9ELFFBQVVrQyxRQUFRLFUsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxnQixjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLHdCLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsc0Isd0lDQXpCLGFBQ0EsUUFFYSxFQUFBbUgsMEJBQTRCLEVBQUFDLHlCQUF5QmpILFNBRXJELEVBQUFrSCxxQkFBdUIsSUFBTSxFQUFBaEgsV0FBVyxFQUFBK0csMkIsb01DTHJELGdCQVFhLEVBQUFBLHlCQUNYLFVBQU14RyxjQUE0QyxDQUNoRDBHLFlBQWEsS0FDYkMsU0FBUyxLLHVaQ1hiLFdBQ0EsWSxjQ0RBeEosRUFBT0QsUUFBVWtDLFFBQVEsaUIsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxlLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsbUIsa1FDR3pCLGNBRUEsUUFJYSxFQUFBd0gsZUFBa0JDLEdBQ3RCL0ksT0FBT2dKLEtBQUtELEdBQVFFLE9BQ3hCQyxJQUFlQSxFQUFVQyxTQUFTLE9BQVNELEVBQVVDLFNBQVMsTUFnQnRELEVBQUFDLG9CQUFzQixTQUFVTCxFQUFRTSxHQUtuRCxPQUplckosT0FBT2dKLEtBQUtELEdBQVFFLFFBQU8sU0FBVUMsR0FDbEQsSUFBSUksRUFBUVAsRUFBT0csR0FDbkIsT0FBTyxFQUFBSyxlQUFlRixFQUFNQyxPQVVuQixFQUFBRSxrQkFBb0IsU0FBVVQsRUFBUU0sRUFBTUksR0FLdkQsT0FKZXpKLE9BQU9nSixLQUFLRCxHQUFRRSxRQUFPLFNBQVVDLEdBQ2xELElBQUlJLEVBQVFQLEVBQU9HLEdBQ25CLE9BQU8sRUFBQVEsZUFBZUwsRUFBTUMsRUFBT0csT0FnQjFCLEVBQUFFLGNBQWdCLENBQzNCWixFQUNBYSxFQUF5RCxNQUV6RCxNQUFNLFFBQUVyRCxHQUFVLEVBQVosYUFBbUJzRCxHQUFlLEdBQVNELEVBRWpELElBQUlFLEVBQWEsR0FzQ2pCLE9BcENBOUosT0FBT2dKLEtBQUtELEdBQVFnQixRQUFTYixJQUUzQixHQUFJVyxHQUFnQlgsRUFBVUMsU0FBUyxLQUNyQyxPQUlGVyxFQUFXWixHQUFhLEVBQUFjLGVBQWVkLEVBQVdILEdBSWxELE1BQU1rQixFQUFrQixFQUFBQywyQkFBMkJoQixFQUFXSCxHQUM5RCxHQUFJa0IsRUFTRixHQVBBSCxFQUFXWixHQUFXaUIsaUJBQW1CLEVBQUFILGVBQ3BDZCxFQUFILEtBQ0FILEdBbkNnQkEsSUFDRyxpQkFBWEEsRUF1Q05xQixDQUFlSCxHQUFrQixDQUVuQyxNQUFNSSxFQUFxQixFQUFBVixjQUFjTSxFQUFpQkwsR0FFdERyRCxFQUNGdUQsRUFBYSxPQUFILHdCQUFRQSxHQUFlTyxHQUVqQ1AsRUFBV1osR0FBV0gsT0FBU3NCLE9BSWpDUCxFQUFXWixHQUFXb0Isb0JBQXFCLElBSTFDUixHQVFJLEVBQUFFLGVBQWlCLENBQUNkLEVBQW1CSCxLQUNoRCxJQUFJYixFQUFjLEdBT2xCLE9BTkEsRUFBQXFDLGlCQUFpQlIsUUFBUzlJLEksTUFDeEIsTUFBTXVKLEVBQWlDLFFBQWpCLEVBQUF6QixFQUFPRyxVQUFVLGVBQUdqSSxHQUN0Q3VKLElBQ0Z0QyxFQUFZakgsR0FBWXVKLEtBR3JCdEMsR0FLSSxFQUFBdUMsY0FBaUJ2QyxHQUM1QixFQUFBRCxhQUFhQyxHQUVmLE1BV013QyxFQUF3QixDQUFDeEIsRUFBbUJILEtBQ2hELE1BQU1iLEVBQWNhLEVBQU9HLEdBQzNCLElBTjJCaEIsS0FDM0IsTUFBTUcsRUFBWSxFQUFBb0MsY0FBY3ZDLEdBQ2hDLE9BQU9HLEdBQWtDLGlCQUFkQSxHQUl0QnNDLENBQW9CekMsR0FBYyxPQUFPLEtBRTlDLE9BRHFCQSxHQUFlLEVBQUF1QyxjQUFjdkMsSUFRdkMsRUFBQWdDLDJCQUE2QixDQUFDaEIsRUFBV0gsS0FDcEQsTUFBTTZCLEVBdkJxQixFQUFDMUIsRUFBbUJILEtBQy9DLE1BQU02QixFQUFrQjdCLEVBQVVHLEVBQUgsTUFFL0IsT0FEcUIwQixHQUFtQixFQUFBSCxjQUFjRyxJQXFCOUJDLENBQXFCM0IsRUFBV0gsR0FDeEQsSUFBSzZCLEVBQWlCLENBRXBCLE1BQU1FLEVBQW1CSixFQUFzQnhCLEVBQVdILEdBRTFELE9BQUsrQixHQUF5QixLQUdoQyxPQUFPRixHQUdJLEVBQUFMLGlCQUFtQixDQUM5QixPQUNBLFFBQ0EsV0FDQSxXQUNBLE1BQ0EsTUFDQSxlQUNBLGVBQ0EsV0FDQSxXQUNBLGdCQUNBLFFBQ0EsV0FDQSxPQUNBLFNBQ0EsZUFDQSxZQUNBLFNBQ0EsZUFDQSxPQUNBLGtCQUNBLGlCQUNBLFVBQ0EsUUFDQSxXQUNBLFFBQ0EsUUFDQSxXQUNBLFdBQ0EsV0FDQSxXQUNBLFNBQ0EsV0FDQSxVQUNBLFlBQ0EsWUFDQSxhQUNBLGVBQ0EsYUFDQSxZQUNBLGFBQ0EsY0FDQSxrQkFDQSxpQkFDQSxjQUNBLFVBQ0EsUUFDQSxxQkFDQSxvQkFDQSxrQkFDQSxPQUNBLFVBR1csRUFBQVEsZUFBaUIsQ0FDNUIsV0FDQSxXQUNBLE1BQ0EsTUFDQSxlQUNBLGVBQ0EsV0FDQSxXQUNBLGdCQUNBLFFBQ0EsV0FDQSxPQUNBLFNBQ0EsZUFDQSxZQUNBLGVBQ0EsT0FDQSxrQkFDQSxpQkFDQSxVQUNBLFFBQ0EsUUFDQSxRQUNBLGNBQ0Esa0JBQ0EsaUJBQ0EsY0FDQSxVQUNBLFFBQ0EscUJBQ0Esb0JBQ0Esb0IsY0N4UEYxTCxFQUFPRCxRQUFVa0MsUUFBUSxnQixxUENBekIsaUJBQ0EsV0FDQSxXQUNBLFdBS2EsRUFBQTBKLFVBQWFDLEdBQW1CLFVBQU9BLEdBS3ZDLEVBQUFDLFNBQVlDLEdBQ3ZCQSxFQUFNdEQsT0FDSixDQUFDb0QsRUFBUUcsSUFDUEgsR0FDQ3pDLE9BQU82QyxNQUFNN0MsT0FBTzRDLElBQ2pCLEdBQWMsS0FBWEgsRUFBZ0IsR0FBSyxNQUFNRyxJQUM5QixJQUFJQSxNQUNWLElBVVMsRUFBQUUsY0FBZ0IsVUFBSyxFQUFBTixVQUFXLFVBQVMsRUFBQUUsVUFTekMsRUFBQW5ELGFBQWUsQ0FDMUJELEVBQ0F5RCxLQUVBLE1BQU1DLEVBQWlCLEVBQUFSLFVBQVVsRCxHQUNqQyxPQUFPeUQsRUFBTUUsSUFBS3RGLElBQ2hCLEdBQUlBLElBQVMyQixFQUNYLE9BQU8zQixFQUVULE1BQU11RixFQUFlLEVBQUFWLFVBQVU3RSxHQUN6QndGLEVBQWlCLFVBQ3JCRCxFQUNBQSxFQUFhcEYsT0FBU2tGLEVBQWVsRixRQUV2QyxPQUFPLEVBQUE0RSxTQUFTUyxNQVdQLEVBQUEzRCxvQkFBc0IsQ0FBQ0YsRUFBZ0J5RCxJQUNsREEsRUFBTXRDLE9BQ0g5QyxHQUNDQSxJQUFTMkIsR0FDVDNCLEVBQUt5RixXQUFjOUQsRUFBSCxNQUNoQjNCLEVBQUt5RixXQUFjOUQsRUFBSCxPLGNDckV0QnpJLEVBQU9ELFFBQVVrQyxRQUFRLGlCLHNSQ0t6QixpQkFFYSxFQUFBdUssZUFBeUMsQ0FDcEQsU0FDQSxNQUNBLFFBQ0EsV0FDQSxXQUNBLGdCQUNBLGFBQ0EsU0FDQSxpQkFDQSxXQUNBLE9BQ0EsT0FDQSxPQUNBLFlBR1csRUFBQUMsZ0JBQTBDLENBQ3JELE9BRUEsV0FDQSxPQUNBLFNBQ0EsY0FFVyxFQUFBQyxlQUF5QyxDQUNwRCxTQUNBLGVBQ0EscUJBR1csRUFBQUMsY0FBcUMsQ0FBQyxVQUN0QyxFQUFBQyxnQkFBeUQsSUFDakUsRUFBQUosa0JBQ0EsRUFBQUUsa0JBR0EsRUFBQUMsZUFHUSxFQUFBRSxxQkFDWDdELEdBR0VBLElBQWNHLFFBQVVILElBQWMsVUFBYThELFFBQy9DLFNBQ0E5RCxJQUFjQyxRQUNkLFdBQ0FELElBQWMrRCxLQUNkLE9BQ0EsUSx1WkN6RFIsV0FDQSxVQUNBLFlBQ0EsYSx1WkNIQSxXQUNBLFdBRUEsVyxpZ0JDb0NBLGdCQUtBLE9BRUEsV0FFQSxRQU9BLE9BQ0EsUUFPQSxPQUdBLE9BQ0EsUUFHTUMsRUFBWSxFQUFBQyxZQUFZLFFBcUlqQixFQUFBQyxjQUFpQnpLLElBQzVCLE1BQU0sTUFDSjBLLEVBREksV0FFSkMsRUFGSSxLQUdKQyxFQUhJLE9BSUpDLEVBSkksVUFLSkMsRUFDQWhFLFlBQWFpRSxFQUNiQyxtQkFBb0JDLEdBQ2xCakwsR0FDRSxPQUFFaUgsR0FBV3lELEVBRWJRLEVBQVNQLEdBQWNDLEVBS3ZCTyxFQUFXRCxFQUFTLE9BQVMsTUFDN0JFLEVBQW1CLEVBQUF4TCxzQkFXbkJ5TCxHQUZZWCxFQUFNM00sS0FBTyxFQUFBdU4sV0FBV0gsR0FFdkIsQ0FDakJBLFdBQ0FsRSxZQUdJLGlCQUNKc0UsRUFESSxxQkFFSkMsRUFGSSxjQUdKQyxFQUhJLGtCQUlKQyxHQWhJaUIsRUFDbkIxTCxFQVdBbUwsS0FNQSxJQUFJTSxFQUNBQyxFQUNBSCxFQUNBQyxFQXlDQUcsRUFyQ0osR0FBSTNMLEVBQU15TCxjQUNSLEdBQW1DLGlCQUF4QnpMLEVBQU15TCxjQUE0QixDQUkzQyxHQUhBQSxFQUFnQixFQUFBRyxHQUFHO1VBQ2Y1TCxFQUFNeUw7U0FFTHpMLEVBQU0wTCxrQkFDVCxNQUFNLElBQUlsTCxNQUNSLHFFQUVKa0wsRUFBb0IxTCxFQUFNMEwsdUJBRzFCRCxFQUFnQnpMLEVBQU15TCxjQUV0QkMsRUFDRTFMLEVBQU0wTCxtQkFBcUIsRUFBQUcsZ0JBQWdCN0wsRUFBTXlMLGVBR3ZELEdBQUl6TCxFQUFNdUwsaUJBQ1IsR0FBc0MsaUJBQTNCdkwsRUFBTXVMLGlCQUErQixDQUk5QyxHQUhBQSxFQUFtQixFQUFBSyxHQUFHO1VBQ2xCNUwsRUFBTXVMO1NBRUx2TCxFQUFNd0wscUJBQ1QsTUFBTSxJQUFJaEwsTUFDUiwyRUFFSmtMLEVBQW9CMUwsRUFBTXdMLDBCQUcxQkQsRUFBbUJ2TCxFQUFNdUwsaUJBRXpCQyxFQUNFeEwsRUFBTXdMLHNCQUF3QixFQUFBSyxnQkFBZ0I3TCxFQUFNdUwsa0JBSzFELElBQUt2TCxFQUFNeUwsZ0JBQWtCekwsRUFBTXVMLGlCQUFrQixDQUNuRCxNQUFNLE1BQUViLEVBQUYsT0FBU0csRUFBVCxVQUFpQkMsR0FBYzlLLEVBRXJDMkwsRUFBb0IsVUFBaUIsQ0FDbkNSLFdBQ0FULFFBQ0FHLFNBQ0FDLGNBWUosT0FSSzlLLEVBQU15TCxnQkFDVEEsRUFBZ0JFLEVBQWtCRixjQUNsQ0MsRUFBb0JDLEVBQWtCRCxtQkFFbkMxTCxFQUFNdUwsbUJBQ1RBLEVBQW1CSSxFQUFrQkosaUJBQ3JDQyxFQUF1QkcsRUFBa0JILHNCQUVwQyxDQUNMRCxpQkFBa0JBLEVBQ2xCQyxxQkFBc0JBLEVBQ3RCQyxjQUFlQSxFQUNmQyxrQkFBbUJBLElBMkNqQkksQ0FBYTlMLEVBQU9tTCxHQUdsQlksRUFBa0IsQ0FDdEJyQixRQUVBc0IsU0FBVVQsRUFDVlUsYUFBY1QsR0FHVlUsRUFBc0MsQ0FDMUN4QixRQUdBc0IsU0FBVVAsRUFDVlEsYUFBY1AsRUFFZFMsTUFBTyxDQUNMQyxHQUFJekIsRUFDSjBCLGFBQWEsR0FHZkgsYUFBYyxDQUVaSSxZQUFhLGVBQ2JDLGFBQWMsRUFDZEMsS0FBbUIsUUFBYnJCLEtBY0osS0FBRXpHLEVBQUYsU0FBUWlELEVBQVIsUUFBa0JaLEVBQWxCLFFBQTJCMEYsR0FBWSxFQUFBQyxVQUFVUixHQUN0QyxRQUFiZixHQUNGWixFQUNFLG1CQUNBLE9BQ0E3RixFQUNBLFdBQ0FpRCxFQUNBLFVBQ0FaLEdBSUosTUFBTzRGLEdBQWtCLEVBQUFDLFVBQVViLElBQzVCYyxHQUFrQixFQUFBQyxVQUFVZixJQUM1QmdCLEdBQWtCLEVBQUFDLFVBQVVqQixJQUdqQ2pGLFlBQWFtRyxFQUNibEcsUUFBU21HLEdBQ1AsRUFBQXJHLHVCQUNFc0csT0FDNEIsSUFBekJwQyxFQUNIakUsRUFBY3FHLEVBQ2hCcEMsRUFDQWtDLEVBQ0VqQyxFQUFxQm1DLEVBQ3ZCbEMsRUFDQWlDLEVBdURKLE9BQUloQyxHQUFVbkUsRUFDTCx3QkFBQ3FFLEVBQWlCbkgsUUFBTyxNQUdoQyx3QkFBQ21ILEVBQWlCakssS0FBSSxlQUNwQndHLFNBQVVBLEVBQ1ZaLFFBQVNBLEdBQVdpRSxFQUNwQjJCLGVBNUJtQ1MsR0FBOEIsb0NBQ25FLE1BQU16SSxRQUFlZ0ksRUFBZVMsSUFDOUIsT0FBRUMsRUFBRixTQUFVMUYsR0FBYWhELEVBQzdCLE1BQU8sQ0FDTGdELFdBQ0EwRixhQXdCQVIsZUFyQm1DTyxHQUE4QixvQ0FDbkUsTUFBTXpJLFFBQWVrSSxFQUFlTyxJQUM5QixPQUFFQyxFQUFGLFNBQVUxRixHQUFhaEQsRUFDN0IsTUFBTyxDQUNMZ0QsV0FDQTBGLGFBaUJBTixlQWJvQ0ssR0FBOEIsMENBQzlETCxFQUFlSyxNQWFuQlgsUUFBU0EsRUFDVDNGLFlBQWFBLEdBQ1R1RSxFQUNBckwsS0F3REcsRUFBQXNOLFVBQVksRUFBQTdDLGNBRXpCLFVBQWUsRUFBQUEsZSxrS0MvYWYsaUJBQ0EsV0FDQSxPQUNBLFFBTUEsUUFLQSxPQUVBLFdBS01vQixFQUFrQixDQUN0QlYsRUFDQW9DLEVBQ0FDLElBRUEsQ0FBQ0QsRUFBZXBDLEVBQVUsT0FBUXFDLEVBQWMsWUFDN0M3RCxJQUFJLEVBQUEyQixZQUNKbUMsS0FBSyxJQUdKQyxFQUFxQixFQUFHekcsU0FBUWEsYUFFYixRQUFyQkEsRUFBUXFELFNBQ0osRUFBQXdDLG9CQUFvQjFHLEdBQ3BCLEVBQUEyRyxvQkFBb0IzRyxHQUl0QjRHLEVBQXdCLEVBQUdDLHFCQUFvQkMscUJBQzVDLFVBQU1BLEVBQWdCQyxPQUFPRixJQTJEaENHLEVBQW9CLEVBQ3hCaEgsU0FDQWdGLGVBQ0FuRSxVQUNBb0csV0FBWUMsTUFJWixNQUFNRCxFQUNKQyxJQUNDckcsRUFBUXNHLFdBQ0xQLEVBQXNCLENBQ3BCRSxnQkFBaUJMLEVBQW1CLENBQUV6RyxTQUFRYSxZQUM5Q2dHLG1CQUFvQixFQUFBTyxzQkFBc0IsQ0FDeENwSCxTQUNBYSxRQUFTLENBQUV3RyxjQUFjLE9BRzdCWixFQUFtQixDQUFFekcsU0FBUWEsYUFFN0J5RyxFQUNKTCxFQUFXMUosUUFDWDBKLEVBQ0d2RSxJQUFLdkMsR0FDSixFQUFBb0gsaUJBQWlCLENBQ2Z2SCxTQUNBRyxZQUNBVSxVQUNBMkcsa0JBQW1CUixLQUl0QjlHLE9BQVF1SCxLQUFRQSxHQUNyQixPQUFJSCxFQUFlL0osT0FDVixHQUFHeUgsT0FBa0JzQyxFQUFlZCxLQUFLLFVBRTNDLE1Ba0lULFVBNUh5QixFQUN2QnRDLFdBQVcsTUFDWFQsUUFDQUcsU0FDQUMsZ0JBT0EsTUFBTSxPQUFFN0QsRUFBRixLQUFVbEosRUFBVixRQUFnQjRRLEdBQVlqRSxHQUM1QixTQUFFa0UsRUFBRixjQUFZckIsR0FBa0JvQixFQUVwQyxJQUFJWixFQUFrQkwsRUFBbUIsQ0FBRXpHLFNBQVFhLFFBQVMsQ0FBRXFELGNBQzFEMEQsRUFBcUJoQixFQUFzQixDQUM3Q0Usa0JBQ0FELG1CQUFvQixFQUFBTyxzQkFBc0IsQ0FDeENwSCxTQUNBYSxRQUFTLENBQUV3RyxjQUFjLE9BSzdCLEdBQUl6RCxJQUFVQSxhQUFNLEVBQU5BLEVBQVFyRyxRQUFTLEVBQUcsQ0FFaEMsTUFBTXNLLEVBQXVCakUsRUFBT2xCLElBQUtuQyxHQUFhQSxFQUFILFNBQzdDdUgsRUFBWSxJQUFJbEUsS0FBV2lFLEdBQ2pDZixFQUFrQixVQUFjQSxFQUFpQmdCLEdBQ2pERixFQUFxQixVQUFjQSxFQUFvQkUsR0F3QnpELElBcEJJakUsYUFBUyxFQUFUQSxFQUFXdEcsVUFDYnVKLEVBQWtCQSxFQUFnQkMsT0FBT2xELEdBQ3pDK0QsRUFBcUJBLEVBQW1CYixPQUFPbEQsSUFJN0M3RCxFQUFPK0gsU0FDVGpCLEVBQWdCa0IsUUFBUSxVQUN4QkosRUFBbUJJLFFBQVEsV0FHekJoSSxFQUFPaUksTUFDVG5CLEVBQWdCa0IsUUFBUSxPQUN4QkosRUFBbUJJLFFBQVEsUUFJN0JsQixFQUFrQixVQUFNQSxHQUN4QmMsRUFBcUIsVUFBTUEsR0FFSSxJQUEzQmQsRUFBZ0J2SixPQUlsQixNQUFNLElBQUloRSxNQUNSLFVBQVVrSyxFQUFNM00scUlBRXBCLEdBQWtDLElBQTlCOFEsRUFBbUJySyxPQUNyQixNQUFNLElBQUloRSxNQUNSLFVBQVVrSyxFQUFNM00sc0hBR3BCLE1BQU0yTixFQUFvQkcsRUFDeEJWLEVBQ0FvQyxFQUNBLFNBSUk0QixFQUFvQmxCLEVBQWtCLENBQzFDaEgsU0FDQWdGLGFBQWMsWUFBWVAsUUFBd0JrRCxJQUNsRDlHLFFBQVMsQ0FBRXFELFdBQVVpRCxZQUFZLEdBQ2pDRixXQUFZSCxJQUVkLElBQUtvQixFQUVILE1BQU0sSUFBSTNPLE1BQ1IsU0FBU2tLLEVBQU0zTSxvQkFBb0JnUSxvQ0FHdkMsTUFBTXFCLEVBQXlCLEVBQUF4RCxJQUFJdUQsR0FFN0IzRCxFQUF1QkssRUFDM0JWLEVBQ0FvQyxFQUNBLFlBRUk4QixFQUF1QnBCLEVBQWtCLENBQzdDaEgsU0FDQWdGLGFBQWMsWUFBWVQsUUFBMkJvRCxJQUNyRDlHLFFBQVMsQ0FBRXFELFdBQVVpRCxZQUFZLEdBQ2pDRixXQUFZVyxJQUVkLElBQUtRLEVBRUgsTUFBTSxJQUFJN08sTUFDUixTQUFTa0ssRUFBTTNNLG9CQUFvQjhRLHVDQWV2QyxNQUFPLENBQ0xwRCxjQUFlMkQsRUFDZjdELGlCQVpnQyxFQUFBSyxJQUFJeUQsR0FhcEMzRCxvQkFDQUYsdUJBQ0E4RCxhQVptQixVQUNuQjVCLEVBQW1CLENBQUV6RyxTQUFRYSxRQUFTLENBQUVxRCxjQUFjeEIsSUFBS3ZDLEdBQzNDSCxFQUFPRyxHQUNSbUksVyxjQ2pRbkJoUyxFQUFPRCxRQUFVa0MsUUFBUSxxQixjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLDBCLGlMQ0F6QixnQkFHYSxFQUFBbUIsTUFBUSxJQUNuQixvQyxzRkFFWSxJQUNWLG9DQUFPLDRKLHFnQ0NPWCxnQkFDQSxRQUNBLE9BQ0EsT0FFQSxXQUNBLFdBQ0EsVUFDQSxXQUNBLFdBQ0EsV0FDQSxVQUNBLFdBQ0EsV0FDQSxXQUNBLFdBQ0EsV0FDQSxXQUNBLFdBQ0EsV0FJQSxRQUtBLFFBQ0EsUUFFQSxPQUNBLFFBQ0EsUUFDQSxRQUNBLE9BMkNNNk8sRUFBNEJDLElBQ2hDLE1BQU14SSxFQUFTd0ksRUFBVXhJLFFBQVV3SSxFQUFVL0UsTUFBTXpELE9BQzdDeUksRUFBa0IsRUFBQTdILGNBQWNaLEdBR2hDMEksRUFDUyxTQUhZRixFQUFVOUgsU0FBVyxPQUFTLE9BYmpDK0gsSUFFakIsVUFDTCxVQUFVQSxFQUFrQmxJLEdBQVVBLEVBQU1vSSxjQUMzQ25SLEdBQVVBLEdBWVVvUixDQUFpQkgsR0FBbUIsR0FFckRJLEVBQWtCLFVBQ3RCLEdBQ0FILEVBQ0FGLEVBQVVNLGdCQWJTOVIsRUFjTHdSLEVBQVU5SCxTQWRDLFVBQU8xSixFQUFJeVEsR0FBTUEsV0FBdkJ6USxNQThCckIsT0FaQUMsT0FBT2dKLEtBQUt3SSxHQUFpQnpILFFBQVNsSixJQUNwQyxJQUFJaVIsRUFBV04sRUFBZ0IzUSxHQUFLaVIsU0FDcEMsR0FBSUEsRUFFRixJQURBRixFQUFnQi9RLEdBQU8rUSxFQUFnQi9RLElBQVEsR0FDeEMrUSxFQUFnQi9RLEdBQUt5RixPQUFTd0wsR0FDbkNGLEVBQWdCL1EsR0FBS2tSLEtBQUssTUFLaEMsRUFBQUMsZUFBZUosRUFBaUIsY0FFekIsQ0FDTEssU0FBVVYsRUFBVVUsU0FDcEI5QyxPQUFRLEdBQ1I5SCxjQUFlLEdBQ2Y2SyxjQUFlLEdBQ2ZDLGVBQWdCLEVBQUF4SSxjQUFjWixFQUFRLENBQUVjLGNBQWMsSUFFdERkLE9BQVF5SSxFQUVSWSxXQUFZLEVBQUF6SSxjQUFjWixFQUFRLENBQUV4QyxTQUFTLElBRTdDcUwsa0JBRUFTLGdCQUFpQlQsSUErRmZVLEVBQWtCLEVBQ3RCQyxZQUNBQyxxQkFDQUMsZUFNQSxFQUFBQyxpQkFBaUIsQ0FDZkgsWUFDQUMsdUJBRUssZ0RBQUdDLElBV05FLEVBQVUsQ0FDZEMsRUFDQTlRLEVBQ0ErUSxHQUVFQyxzQkFBcUJDLFdBRXZCLE1BQU0sZ0JBQUVWLEdBQW9CUSxHQUN0QixNQUFFckcsRUFBRixlQUFTcUYsR0FBbUIvUCxFQUVsQyxJQUFJMEUsRUFBT3FMLEdBQWtCLEdBRzdCckwsRUFBTyxVQUFPQSxFQUFNLENBQUNqRyxFQUFPTSxJQUFRQSxFQUFJbVMsU0FBUyxPQUVqRCxNQUFNQyxFQUFPLE9BQUgsUUFDUmxLLE9BQVF5RCxFQUFNekQsT0FDZG1LLHNCQUFzQixFQUN0QkMscUJBQXFCLEVBQ3JCQyxtQkFBbUIsRUFDbkJDLGdCQUFnQixHQUNiVCxHQUtDakcsRUFBUyxFQUFBMkcsY0FBY3hSLEVBQU91USxFQUFpQlksR0E4QnJELE9BN0JBek0sRUFBTyxPQUFILHdCQUFRQSxHQUFTLFVBQUs2TCxLQUFvQjFGLElBRzlDa0csRUFBTXhMLGNBQWMwQyxRQUFTNUQsSUFDdkJBLEVBQUtnRCxTQUFTLE1BbE5BLEVBQUNuSSxFQUFRbUYsS0FDN0IsTUFBTW9OLEVBQWEsRUFBQWpJLGNBQWNuRixHQUtqQyxVQUFPbkYsRUFBUXVTLEVBRlNDLEdBQU8xTSxNQUFNQyxRQUFReU0sR0FBSyxVQUFRQSxHQUFLQSxJQXdOM0RDLENBQWNqTixFQUFNTCxLQUt4QkssRUFBTyxFQUFBa04sYUFBYSxDQUNsQkMsVUFBV2IsRUFDWGMsU0FBVXBOLEVBQ1Z5TSxLQUFNLENBQ0osTUFNR3pNLEdBR0ksRUFBQXZELEtBQVFuQixJQUNuQixNQUFNLGFBQUUrUixFQUFGLGVBQWdCcEYsRUFBaEIsZUFBZ0NFLEVBQWhDLGVBQWdERSxHQUNwRC9NLEVBQ0lnUyxFQUFleEMsRUFBeUJ4UCxJQUN4QyxPQUFFaUgsRUFBRixlQUFVb0osRUFBVixXQUEwQkMsRUFBMUIsZ0JBQXNDUixHQUFvQmtDLEVBQzFEQyxFQUFnQixFQUFBQyxRQUFPLEdBQzdCLEVBQUFDLFVBQVUsS0FDSkYsRUFBY0csUUFDaEJILEVBQWNHLFNBQVUsRUFHdEJMLEdBQWNBLEVBQWFDLEVBQWF6QixrQkFDM0MsQ0FBQ3dCLElBUWEsT0FBSCx3QkFQTyxDQUNuQk0sT0FBUSxhQUNSdEMsZUFBZ0IsR0FDaEJ1QyxjQUFjLEVBQ2RDLFlBQVksRUFDWkMsWUFBWSxJQUV5QnhTLEdBUHZDLE1BU01nUixFQUF1QyxHQUN2Q3lCLEVBQXdDLEdBQ3hDQyxFQUF3QyxHQUN4Q0MsRUFBTyxFQUFBQyxrQkFpQk52RixFQUFRd0YsR0FBYSxFQUFBQyxTQUFxQixJQUMzQ0MsRUFBY0MsSUFDbEIsSUFBSUMsRUFBYSxFQUFBQyxVQUFVRixHQUczQkcsUUFBUUMsSUFBSUgsR0FHWkosRUFBV1EsR0FBZSxJQUFJQSxLQUFlSixNQWtCeEMxTixFQUFlK04sR0FBb0IsRUFBQVIsU0FBcUIsS0FZeERqQixFQUFXMEIsR0FBZ0IsRUFBQVQsU0FBb0IsQ0FDcEQ5QixvQkFBcUIsR0FDckJ5QixxQkFBc0IsR0FDdEJDLHFCQUFzQixNQXdDakJ0QyxFQUFlb0QsR0FBb0IsRUFBQVYsU0FBaUIsS0EwQ3BEdkMsRUFBaUJrRCxHQUN0QixFQUFBWCxTQUlHaEQsR0EyREM0RCxFQUFjLEtBQ2QxVCxFQUFNeU0sU0FDUnpNLEVBQU15TSxZQUlIMEQsRUFBVXdELEdBQWUsRUFBQWIsVUFBa0IsSUFDM0NjLEVBQVNDLEdBQWMsRUFBQWYsVUFBa0IsR0F3QjFDZ0IsRUFBWSxDQUFDaE0sRUFBOEIsTUFDL0MsTUFBUUgsU0FBVW9NLEdBQW9Cak0sRUFDaENILEVBQVdvTSxFQUNiLFVBQU0sR0FBSS9ULEVBQU0rUCxlQUFnQmdFLEdBQ2hDLEtBRUpsQixFQUFVLElBQ1ZXLEVBQWlCLElBQ2pCRixFQUFpQixJQUNqQkcsRUFBbUI5TCxHQUFZbUksR0FFL0I2RCxHQUFZLElBZVJLLEdBQVUsRUFBQTlCLE9BQU8sTUFDakIrQixHQUEwQixTQUU5QnRQLEVBQ0F1UCxHQUdBUCxHQUFZLEdBQ1pFLEdBQVcsR0FJVSxRQUFqQkssR0FBd0JSLElBQzVCLElBQUksU0FBRS9MLEdBQWFoRCxFQUtmcVAsR0FBUTVCLFNBQ1YwQixFQUFVLENBQ1JuTSxTQUEyQixTQUFqQnVNLEVBQTBCdk0sT0FBV3RILElBS25Ec0gsRUFBVyxFQUFBaUssYUFBYSxDQUN0QkMsVUFBV1ksRUFDWFgsU0FBVW5LLEVBQ1Z3SixLQUFNLENBQUMsQ0FBRUYsS0FBTStDLEdBQVE1QixZQUlyQnBTLEVBQU1tVSxpQkFBaUJuVSxFQUFNbVUsZ0JBQWdCeE0sRUFBVSxDQUFFc0osS0FBTW1ELFFBSS9EQyxHQUF3QixDQUFDMU0sRUFBVXFMLEtBQ3ZDVyxHQUFZLEdBR1pSLFFBQVFILE1BQU0sb0JBRWRHLFFBQVFILE1BQU1BLEdBR2QsRUFBQXBCLGFBQWEsQ0FDWEMsVUFBV2EsRUFDWFosU0FBVWtCLEVBQ1Y3QixLQUFNLENBQUMsQ0FBRTZCLFFBQU8vQixLQUFNK0MsR0FBUTVCLFlBRzNCLFVBQVFZLElBRVhELEVBQVdDLEdBSVRoVCxFQUFNc1UsZUFDUnRVLEVBQU1zVSxjQUFjM00sRUFBVXFMLEVBQU8sQ0FBRS9CLEtBQU1tRCxRQVkzQ0csR0FBY3BKLEdBQThCcUosR0FBaUIsb0MsUUFDakVBLEdBQVNBLEVBQU1DLGlCQUNmRCxHQUFTQSxFQUFNRSxrQkFFZixNQUFNLFlBQUVDLEdBQWdCM1UsRUFHeEIsR0FBSW1RLEVBQ0YsT0FJRjBDLEVBQVUsSUFDVmMsR0FBWSxHQUlaLElBQUlqUCxFQUFPbU0sRUFDVCxDQUFFUyxtQkFBbUIsRUFBTUMsZ0JBQWdCLEVBQU9xRCxrQkFDbEQ1VSxFQUNBLENBQ0V1USxrQkFDQWhMLGlCQUVGLENBQUUwTCxLQUFNK0MsR0FBUTVCLFFBQVNwQix3QkFRM0IsR0FKSWhSLEVBQU02VSxpQkFDUm5RLEVBQU8xRSxFQUFNNlUsZUFBZW5RLElBQVNBLEdBR3RCLFFBQWJ5RyxFQUVGLElBQ0UsTUFBTXhHLFFBQWVnSSxFQUFlLENBQ2xDUixNQUFPLENBQ0x6SCxPQUNBaVEsa0JBR2EsUUFBYixFQUFBaFEsRUFBTzBJLGNBQU0sZUFBRTdJLFFBRWpCNlAsR0FBc0IxTSxHQUFVaEQsRUFBTzBJLE9BQU8sSUE3SG5CLFNBQ2pDMUksR0FFQXNQLEdBQXdCdFAsRUFBUSxPQTRIMUJtUSxDQUEyQm5RLEdBRTdCLE1BQU9xTyxHQUNQcUIsR0FBc0IxTSxHQUFVcUwsUUFJbEMsSUFDRSxNQUFNckksRUFBYTRGLEVBQWdCckIsSUFDN0J2SyxRQUFla0ksRUFBZSxDQUNsQ1YsTUFBTyxDQUNMQyxHQUFJekIsRUFDSmpHLE9BQ0FpUSxrQkFJYSxRQUFiLEVBQUFoUSxFQUFPMEksY0FBTSxlQUFFN0ksUUFDakI2UCxHQUFzQjFNLEdBQVVoRCxFQUFPMEksT0FBTyxJQTNJbEIsU0FDbEMxSSxHQUVBc1AsR0FBd0J0UCxFQUFRLFFBMEkxQm9RLENBQTRCcFEsR0FFOUIsTUFBT3FPLEdBQ1BxQixHQUFzQjFNLEdBQVVxTCxRQTJDaEMsaUJBQUVnQyxHQUFGLFNBQW9Cck4sR0FBcEIsWUFBOEJiLEdBQTlCLE1BQTJDNEQsR0FBM0MsbUJBQWtEZ0csSUFDdEQxUSxFQUNJaVYsR0FBaUIsRUFBQXJWLHNCQUVqQnVMLEdBQTJCeEQsR0FBVyxPQUFTLE1BRy9DaU4sR0FDUyxTQUFiekosR0FDSSxFQUFBekQsa0JBQWtCVCxFQUFRSCxHQUFhZ0osR0FDdkMsRUFBQXhJLG9CQUFvQkwsRUFBUUgsS0FFNUIsZ0JBQUVvTyxHQUFGLGVBQW1CQyxJQTdvQkYsRUFDdkJuVixFQUNBK1EsRUFDQWpKLEVBRUErSixLQU9BLE1BQU0sWUFDSi9LLEVBREksYUFFSndMLEVBRkksWUFHSjhDLEVBSEksWUFJSkMsRUFKSSxZQUtKQyxFQUxJLGVBTUpDLEVBTkksZUFPSkMsRUFQSSxHQVFKcEosRUFSSSxNQVNKMUIsRUFUSSxlQVVKcUYsRUFWSSxlQVdKMEYsRUFYSSxZQVlKZCxFQVpJLFdBYUpwQyxFQWJJLFdBY0pDLEdBQ0V4UyxHQUNFLFNBQUVtUSxFQUFGLGdCQUFZSSxHQUFvQlEsR0FDaEMsU0FBRTVGLEdBQWFyRCxHQUNmLGVBQUVpRixHQUFtQjhFLEVBQ3JCNkQsRUFBYyxDQUNsQi9OLFNBQVU0SSxFQUNWcEYsV0FDQXJFLGNBQ0FxSixXQUNBSixpQkFDQTBGLGlCQUNBZCxlQUdJZ0IsRUFBZSxZQUFZeEssRUFDM0J5SyxFQUFZbEwsRUFBTTNNLEtBQUs4WCxjQW1CdkJDLEVBQWtCLENBQ3RCcEwsUUFDQTVELGNBQ0FzTyxjQUNBQyxjQUNBQyxjQUNBQyxpQkFDQUMsaUJBQ0E3TixTQUFVNEksRUFFVnhELGVBQ2dCLFNBQWI1QixHQUF1Qm9ILEdBQWNDLEdBQWN6RixHQUNwRCxNQVNKLE1BQU8sQ0FDTDJJLGNBQ0FJLGtCQUNBWCxlQS9Cc0JZLEdBQVUsMkNBQ2hDaFgsSUFBS2dYLEVBQU1oWSxNQUNSZ1ksR0FBSyxDQUNSQSxNQUFPLFVBQUtBLEVBQU8sQ0FBQyxhQUNqQkwsR0E0QkhSLGdCQVZzQixDQUN0QmMsVUFsQ2dCLENBQ2hCQyxVQUFXLEdBQUdOLEtBQWdCQSxLQUFnQkMsSUFDOUN4SixHQUFJQSxHQWlDSmtHLGFBQWNBLEVBQ2Q0RCxZQUFhSixFQUNiSixpQkE2akIwQ1MsQ0FDMUNuVyxFQUNBLENBQUVtUSxXQUFVSSxtQkFDWixDQUNFcEYsYUFFRixDQUNFNEIsZUFwRDhCLEtBQ2hDLE1BQU1wRixFQUFXNEksRUFDWDVGLEVBQWEzSyxFQUFNMkgsU0FBU3VILElBQzVCa0gsRUFBZ0J6TyxFQUFTME8sT0FBUzFPLEVBQVM1SixNQUFRLEdBRW5EdVksRUFBd0IzRCxFQUFLNEQsY0FDakMsQ0FBRW5LLEdBQUksd0JBQ04sQ0FBRWlLLE1BQU9ELElBR1AsS0FBT0ksUUFBUUYsSUFDakJ2SixFQUFlLENBQUVaLE1BQU8sQ0FBRUMsR0FBSXpCLEtBQzNCOEwsS0FBTUMsSUFFRDFXLEVBQU0yVyx1QkFDUjNXLEVBQU0yVyxzQkFBc0IsQ0FBRWhNLGFBQVl5TCxrQkFDNUMxQyxNQUVEa0QsTUFBTzVELElBRU5HLFFBQVFDLElBQUlKLFFBbUNkdkMsR0FBWSxFQUFBb0csa0JBQWtCL0csRUFBaUJTLEdBRXJELE9BQU9xRCxHQUFXb0IsR0FDaEJBLEdBRUEsd0JBQUN4RSxFQUFlLENBQ2RDLFVBQVdBLEdBQ1hDLG1CQUFvQkEsSUFFcEIsd0JBQUMsRUFBQXZRLFlBQVkyVyxTQUFRLENBQ25CclksTUFBTyxDQUNMc1UsYUFDQWUsWUFDQUosY0FDQWpELGFBQ0E4RCxXQTNYbUJwSixJQUF3QnFKLElBWWpERCxHQUFXcEosRUFBWG9KLENBQXFCQyxJQStXSHVDLENBQWtCNUwsSUFHOUI2TCxtQkFwYm9CalosSUFDMUJ1VixFQUFrQjJELEdBQXNCLElBQUlBLEVBQW1CbFosS0FvYnpEbVosb0JBM1VvQixDQUFDQyxFQUFXclAsRUFBNkIsTUFFbkUsTUFBTSxLQUFFbkosRUFBTyxhQUFnQm1KLEdBQ3pCLGVBQUVzUCxHQUFtQnBYLEVBSXJCcVgsRUFBVyxDQUNmakgsY0FBZSxVQUFVQSxHQUN6QkcsZ0JBQWlCLFVBQVVBLEdBQzNCaEwsY0FBZSxVQUFVQSxJQUczQnJILE9BQU9nSixLQUFLaVEsR0FBV2xQLFFBQVNsSixJQUM5QixNQUFNc0YsRUFBT3RGLEVBQ2IsSUFBSU4sRUFBUTBZLEVBQVVwWSxHQUV0QixHQUFJLEVBQUFvRyxhQUFhMUcsR0FFZixVQUFNNFksRUFBU2pILGNBQWUvTCxHQUM5QixVQUFJZ1QsRUFBUzlHLGdCQUFpQmxNLEVBQU0sTUFDcENnVCxFQUFTOVIsY0FBZ0IsSUFBSThSLEVBQVM5UixjQUFlbEIsT0FDaEQsQ0FNTCxHQUpBLFVBQUlnVCxFQUFTakgsY0FBZS9MLEVBQU01RixHQUlyQixVQUFURSxJQUFxQnFHLE1BQU1DLFFBQVF4RyxJQUFVLFVBQVNBLElBQVMsQ0FDakUsTUFBTTZZLEVBQVcsVUFBSUQsRUFBUzlHLGdCQUFpQmxNLEdBQy9DLFVBQUlnVCxFQUFTOUcsZ0JBQWlCbE0sRUFBTSxVQUFNaVQsRUFBVTdZLFNBRXBELFVBQUk0WSxFQUFTOUcsZ0JBQWlCbE0sRUFBTTVGLEdBSXRDNFksRUFBUzlSLGNBQWdCLFVBQVE4UixFQUFTOVIsY0FBZWxCLE1BR3pEK1MsR0FBZ0JBLEVBQWVDLEVBQVM5RyxpQkFHNUNpRCxFQUFpQjZELEVBQVNqSCxlQUMxQnFELEVBQW1CNEQsRUFBUzlHLGlCQUM1QitDLEVBQWlCK0QsRUFBUzlSLGdCQWdTcEJnUyxZQUFhLElBQU1oSCxFQUNuQmlILFNBQVUsQ0FBQ3BRLEVBQVdxUSxJQUNwQixFQUFBRCxTQUFTOU0sR0FBTzRGLEVBQVlxQyxFQUFNdkwsRUFBV3FRLEdBQy9DM0gsZ0JBQWlCQSxFQUdqQjRILGdCQTdhaUJDLElBQ3ZCcEUsRUFBY3FFLEdBQVEsaUJBQ2pCQSxLQTRhQ0MsaUJBdGFrQkYsSUFDeEJwRSxFQUFjcUUsR0FBUSwrQkFDakJBLEdBQUcsQ0FDTm5GLHFCQUFzQixJQUFJbUYsRUFBSW5GLHFCQUFzQmtGLE9Bb2FoREcsaUJBL1prQkgsSUFDeEJwRSxFQUFjcUUsR0FBUSwrQkFDakJBLEdBQUcsQ0FDTmxGLHFCQUFzQixJQUFJa0YsRUFBSWxGLHFCQUFzQmlGLE9BNlpoREksbUJBelptQixLQUN6QnhFLEVBQWEsQ0FDWHZDLG9CQUFxQixHQUNyQnlCLHFCQUFzQixHQUN0QkMscUJBQXNCLE1Bc1psQnJGLFNBQ0ErQyxnQkFDQTdLLGdCQUNBeVMsaUJBaGRrQjNULElBQ3hCd08sRUFBV1EsR0FDVEEsRUFBV2xNLE9BQVE2TCxHQUFVQSxFQUFNM08sT0FBU0EsT0FpZDFDLHdCQUFDNFEsR0FBZS9SLFdBQVUsaUJBQUtnUyxJQUM1QixFQUFBK0MsZUFDQ2pZLEVBQ0EsQ0FDRXVRLGtCQUNBdEosU0FDQXFKLGFBQ0FELGtCQUVGc0MsRUFDQWlDLEdBQ0FqQyxFQUFLNEQsZUFDTDVNLElBQUksQ0FBQ29NLEVBQU92WSxJQUNaLHdCQUFDeVgsR0FBZXJTLFVBQVMsZUFBQzdELElBQUt2QixHQUFPMlgsR0FBZVksVUFxQmpFLFVBQWUsRUFBQTVVLE0sY0N0MkJmNUQsRUFBT0QsUUFBVWtDLFFBQVEsbUIsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxxQixjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLG9CLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEscUIsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxrQixjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLGtCLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsaUIsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxrQixjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLG1CLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEseUIsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxnQixjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLGtCLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsbUIsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxtQixjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLHFCLHFOQ0F6QixjQVVBLFdBQ0EsV0FDQSxVQUNBLFdBQ0EsT0FRQSxXQUNBLFdBQ0EsV0FDQSxXQUNBLFdBQ0EsV0FDQSxXQUNBLE9BMkJhLEVBQUFnWSxTQUFXLENBQ3RCOU0sRUFDQTRGLEVBQ0E0SCxFQUNBOVEsRUFDQXFRLEtBRUEsTUFBTVUsRUFBaUJ6TixFQUFNM00sS0FBSzhYLGNBQzVCdUMsRUFBUSxFQUFBQyxZQUFZLENBQ3hCMUYsS0FBTXVGLEVBQ045USxVQUFXQSxFQUNYK1EsZUFBZ0JBLEVBQ2hCbFIsT0FBUXFKLElBRVYsR0FBSW1ILEVBQWEsQ0FLZixNQUFPLEdBQUdXLE1BSmNGLEVBQVEzQixjQUFjLENBQzVDbkssR0FBSSxXQUFXcUwsRUFDZmEsZUFBZ0JiLE9BSWxCLE9BQU9XLEdBVVgsTUFzQk1HLEVBQWlCLENBQ3JCN04sRUFDQXdOLEVBQ0E5USxFQUNBb1IsS0FFQSxNQUFNTCxFQUFpQnpOLEVBQU0zTSxLQUFLOFgsY0FDNUI0QyxFQUNKRCxFQUFPQyxRQUFVLEdBQUdOLEtBQWtCL1EsS0FBYW9SLEVBQU8vWixRQUM1RCxPQUFPeVosRUFBUTNCLGNBQWMsQ0FDM0JuSyxHQUFJcU0sRUFDSkgsZUFBZ0JFLEVBQU9KLFNBV2QsRUFBQTVHLGNBQWdCLENBQzNCeFIsRUFDQXVRLEVBQ0FtSSxLQVNBLE1BQU0sT0FBRTdOLEVBQUYsVUFBVUMsRUFBVixhQUFxQjZOLEdBQWlCM1ksRUFPdEM4SCxFQUFVLE9BQUgsd0JBTlUsQ0FDckJ1SixxQkFBcUIsRUFDckJELHNCQUFzQixFQUN0QkUsbUJBQW1CLEVBQ25CQyxnQkFBZ0IsSUFJYm1ILElBRUMsT0FDSnpSLEVBREksY0FFSjJOLEVBRkkscUJBR0p4RCxFQUhJLG9CQUlKQyxFQUpJLGVBS0pFLEVBTEksa0JBTUpELEdBQ0V4SixFQUdKLElBQUk4USxFQUFpQmhFLEVBMEJyQixRQXZCc0IsSUFBWC9KLEdBQTBCQSxFQUFPckcsT0FBUyxJQUNuRG9VLEVBQWlCLFVBQWFBLEVBQWdCL04sSUFJNUN1RyxRQUcwQixJQUFqQnVILEdBQWdDQSxFQUFhblUsT0FBUyxJQUMvRG9VLEVBQWlCLFVBQVdBLEVBQWdCRCxJQU05Q3BILFFBQ3FCLElBQWR6RyxHQUNQQSxFQUFVdEcsT0FBUyxJQUVuQm9VLEVBQWlCQSxhQUFjLEVBQWRBLEVBQWdCNUssT0FBT2xELElBSXRDdUcsRUFBcUIsQ0FDdkIsTUFBTTFKLEVBQVc0SSxFQUNqQnFJLEVBQWlCLFVBQU9BLEVBQWlCeFIsSUFDdkMsTUFBTXlSLEVBQVM1UixhQUFNLEVBQU5BLEVBQVNHLEdBQVd5UixPQUNuQyxNQUF5QixtQkFBWEEsRUFDVkEsRUFBTyxDQUFFN1ksUUFBTzJILGFBQ2hCa1IsSUFjUixPQVRJdkgsSUFDRnNILEVBQWlCQSxhQUFjLEVBQWRBLEVBQWdCalAsSUFBS3ZDLEdBQ3BDLEVBQUEwUixZQUFZN1IsYUFBTSxFQUFOQSxFQUFTRyxJQUFpQkEsRUFBSCxRQUFzQkEsSUFLN0R3UixFQUFpQixVQUFLQSxHQUVmQSxHQU9ULE1BQU1HLEVBQVksQ0FDaEIvWSxFQUNBK1EsRUFDQW1ILEVBQ0E5USxFQUNBaEIsS0FFQSxNQUFNLE1BQUVzRSxHQUFVMUssR0FDWixnQkFBRXVRLEVBQUYsV0FBbUJELEdBQWVTLEVBQ2xDOUwsRUFBVSxVQUFJbUIsRUFBYSxpQkFBbUJwQixNQUdwRCxJQUFJd0MsRUFBSywrQkFDSixVQUFLcEIsRUFBYSxFQUFBNkMsaUJBQWUsQ0FDcENsTCxLQUFNcUosRUFDTjFCLFNBQVVVLEVBQVlDLEtBQ3RCZ00sT0FBUXJTLEVBQU1xUyxPQUNkbEcsTUFBTy9GLEVBQVkrRixPQUFTL0YsRUFBWTRTLFVBSTFDLEdBQUkvVCxFQUFTLENBQ1gsTUFBTWdVLEVBQWtCbEksRUFBTVYsZUFBa0JqSixFQUFILE1BQzdDSSxFQUFNMFIsYUFBZSxVQUFJRCxFQUFpQixlQUc1Q3pSLEVBQU00USxNQUFRLEVBQUFaLFNBQVM5TSxFQUFPNEYsRUFBWTRILEVBQVM5USxHQUNuREksRUFBTTJSLFNBQVcsRUFBQUMsWUFBWWhTLEdBVzdCLE1BQU1PLEVBQVc0SSxFQUNqQi9JLEVBQU1HLFNBQVdBLEVBR2JILEVBQU1NLFNBQVc5QyxNQUFNQyxRQUFRdUMsRUFBTU0sV0FDdkNOLEVBQU1NLFFBQVVOLEVBQU1NLFFBQVE2QixJQUFLNk8sR0FBVywrQkFDekNBLEdBQU0sQ0FDVEosTUFBT0csRUFBZTdOLEVBQU93TixFQUFTOVEsRUFBV29SLE9BS2pELEVBQUFNLFlBQVkxUyxLQUNkb0IsRUFBTTZSLFdBQVksR0FLcEIsTUFBTUMsRUFBa0JsVCxFQUFZNkssTUFBUTdLLEVBQVlrVCxpQkFBbUIsR0FDM0UsSUFBSyxNQUFNeFUsS0FBUXdVLEVBQWlCLENBQ2xDLE1BQU1uYSxFQUFXbWEsRUFBZ0J4VSxHQUNqQzBDLEVBQU0xQyxHQUNnQixtQkFBYjNGLEVBQ0hBLEVBQVN4QixLQUFLeUksRUFBVywrQkFDcEJwRyxHQUFLLENBQ1JvSCxZQUNBTyxXQUNBZ0wsS0FBTXVGLEtBRVIvWSxFQUlSLE1BQU1vYSxFQXpNZSxFQUNyQjdPLEVBQ0E0RixFQUNBNEgsRUFDQTlRLEtBRUEsTUFBTStRLEVBQWlCek4sRUFBTTNNLEtBQUs4WCxjQVFsQyxPQVBvQixFQUFBMkQsYUFBYSxDQUMvQjdHLEtBQU11RixFQUNOOVEsVUFBV0EsRUFDWCtRLGVBQWdCQSxFQUNoQmxSLE9BQVFxSixFQUNSbUosZUFBZSxLQUVLLE1BMkxGQyxDQUFlaFAsRUFBTzRGLEVBQVk0SCxFQUFTOVEsR0FLL0QsT0FKSW1TLElBQ0YvUixFQUFNbVMsS0FBT0osR0FHUi9SLEdBRUhvUyxFQUFrQixDQUN0QnBTLEVBQ0FKLEVBQ0FxSyxLQUVBLE1BQU1vSSxFQUFZcEksRUFBYSxHQUFHQSxLQUFjckssSUFBY0EsRUFROUQsT0FQQUksRUFBTW5ELEtBQU93VixFQU9OclMsR0FVSHNTLEVBQW9CLENBQUN0UyxFQUFPSixFQUFXd04sS0FFdENBLEVBQWN2TixTQUFTRCxLQUMxQkksRUFBTTJJLFVBQVcsR0FFWjNJLEdBMkRIdVMsRUFBYyxDQUNsQi9aLEVBQ0ErUSxFQUNBbUgsRUFDQTlRLEVBQ0FILEVBQ0EyTixFQUNBb0YsRUFDQXZJLEtBRUEsTUFBTXJMLEVBQWNhLEVBQU9HLEdBQzNCLElBQUlJLEVBQVF1UixFQUFVL1ksRUFBTytRLEVBQU9tSCxFQUFTOVEsRUFBV2hCLEdBY3hELE9BYkFvQixFQUFRb1MsRUFBZ0JwUyxFQUFPSixFQUFXcUssR0FDMUNqSyxFQXJGd0IsRUFBQ0EsRUFBT3dTLEtBRTVCQSxJQUNGeFMsRUFBTXdTLGdCQUFrQkEsR0FHbkJ4UyxHQStFQ3lTLENBQWtCelMsRUFBT3dTLEdBQ2pDeFMsRUFBUXNTLEVBQWtCdFMsRUFBT0osRUFBV3dOLEdBQzVDcE4sRUF4RTBCLEVBQzFCeEgsRUFDQStRLEVBQ0FtSCxFQUNBMVEsRUFDQUosRUFDQWhCLEVBQ0FhLEVBQ0EyTixLQUVBLE1BQU0sZ0JBQUVyRSxHQUFvQlEsRUF1QzVCLE9BckNJM0ssRUFBWWlDLG1CQUNkYixFQUFNYSxpQkFBbUJqQyxFQUFZaUMsaUJBRXJDYixFQUFNMFMsV0FBYUMsRUFDakJuYSxFQUNBK1EsRUFDQW1ILEVBQ0E5USxFQUNBSSxFQUFNYSxpQkFDTnBCLEVBQ0EyTixJQUtBeE8sRUFBWWEsU0FDZE8sRUFBTTRTLGFBQWVoVSxFQUFZYSxPQUNqQ08sRUFBTTZTLGFBQWMsRUFJcEI3UyxFQUFNOFMsYUFBZSxFQUFBOUksY0FBY3hSLEVBQU91USxFQUFpQixDQUN6RHRKLE9BQVFPLEVBQU00UyxhQUNkN0ksZ0JBQWdCLElBQ2Y1SCxJQUFLNFEsR0FDQ1IsRUFDTC9aLEVBQ0ErUSxFQUNBbUgsRUFDQXFDLEVBQ0EvUyxFQUFNNFMsYUFDTnhGLEVBQ0F4TixFQUNBSSxFQUFNbkQsUUFJTG1ELEdBdUJDZ1QsQ0FDTnhhLEVBQ0ErUSxFQUNBbUgsRUFDQTFRLEVBQ0FKLEVBQ0FoQixFQUNBYSxFQUNBMk4sR0FFS3BOLEdBRUgyUyxFQUFzQixDQUMxQm5hLEVBQ0ErUSxFQUNBbUgsRUFDQTlRLEVBQ0FxVCxFQUNBeFQsRUFDQTJOLEtBR0EsSUFBSThGLEVBQVczQixFQUFVL1ksRUFBTytRLEVBQU9tSCxFQURmOVEsRUFBSCxLQUN5Q3FULEdBTzlELE9BSkFDLEVBQVdkLEVBQWdCYyxFQUFVdFQsR0FDckNzVCxFQUFXWixFQUFrQlksRUFBVXRULEVBQVd3TixHQUczQzhGLEdBa0JJLEVBQUF6QyxlQUFpQixDQUM1QmpZLEVBQ0ErUSxFQUNBbUgsRUFDQXRELEVBQ0EyQixLQUVBLE1BQU0sT0FBRXRQLEVBQUYsZ0JBQVVzSixHQUFvQlEsRUFFcEMsSUFBSWxHLEVBQVMsRUFBQTJHLGNBQWN4UixFQUFPdVEsRUFBaUIsQ0FDakRxRSxnQkFDQTNOLFdBQ0MwQyxJQUFLdkMsR0FFQzJTLEVBQVkvWixFQUFPK1EsRUFBT21ILEVBQVM5USxFQUFXSCxFQUFRMk4sSUFHL0QvSixFQUFTLFVBQU9BLEVBQVEsU0FHeEIsSUFHSThQLEVBSFMsVUFBUSxVQUFPLFVBQUk5UCxFQUFRLFNBQVcrUCxHQUFPQSxFQUFJQSxFQUFFN2MsS0FBTyxLQUd6QzRMLElBQUtvTSxJQUNqQyxNQUFNcUMsRUFDSnJDLEVBQU1xQyxPQUVOLEVBQUE5TSxXQUFXeUssRUFBTWhZLE1BQ2I4YyxFQUFjLFVBQW1CaFEsRUFBU3JELEdBQ3ZDQSxFQUFNdU8sT0FBU3ZPLEVBQU11TyxNQUFNaFksT0FBU2dZLEVBQU1oWSxNQU9uRCxPQUxxQiwrQkFDaEJnWSxHQUFLLENBQ1JxQyxRQUNBdk4sT0FBUWdRLE1BTVosTUFBTUMsRUFBcUIsVUFBUWpRLEVBQVNyRCxJQUFXQSxFQUFNdU8sT0FDN0QsR0FBSStFLEVBQW1CdFcsT0FBUSxDQU83Qm1XLEVBQW1CLENBTm1CLENBQ3BDNWMsS0FBTSxVQUNOcWEsTUFBTyxVQUNQMkMsTUFBTyxFQUNQbFEsT0FBUWlRLElBRXdCOU0sT0FBTzJNLEdBUTNDLE9BSkFBLEVBQW1CLFVBQU9BLEVBQWtCLFNBSXJDQSxJLGNDcGZUcGQsRUFBT0QsUUFBVWtDLFFBQVEsZSxjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLGtCLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsa0IsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxzQixjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLGtCLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsa0IsNkxDQXpCLGlCQUNBLFdBQ2EsRUFBQXFYLGtCQUFvQixDQUFDL0csRUFBaUJrTCxTQU1sQixJQUxWLFVBQUtBLEVBQWlCLENBQUN2YyxFQUFPTSxFQUFLa2MsS0FDOUMsVUFBWXhjLEVBQU9xUixFQUFnQi9RLEdBQU0sQ0FBQ21jLEVBQVVDLEtBQzFELElBQUtELElBQWFDLEVBQVUsT0FBTyxNLGNDTHpDNWQsRUFBT0QsUUFBVWtDLFFBQVEsdUIsdVpDQXpCLFksNExDQUEsY0FDQSxXQUNBLE9BQ000YixFQUFtQixVQUFNLHdCQVlsQixFQUFBeEssaUJBQW1CLEVBQzlCSCxZQUNBQyx5QkFLQSxNQUFNd0gsRUFBVSxFQUFBdEYsaUJBZ0JoQixFQUFBeUksbUJBQW1CLENBQ2pCQyxlQUFnQjVLLElBQXNCRCxHQUN0QzhLLGtCQVZ5Qi9HLElBQ3pCNEcsRUFBaUIsMEJBQTJCNUcsR0FLNUMsT0FKZ0IwRCxFQUFRM0IsY0FBYyxDQUNwQ25LLEdBQUksd0JBQ0prTSxlQUFnQix3RCw4TENsQ3RCLGFBQ0EsUUFFTThDLEVBRE4sU0FDeUIsUUFBTSx5QkFZbEIsRUFBQUMsbUJBQXFCLEVBQ2hDQyxjQUNBQyx3QkFNQSxNQUFNQyxFQUFhLEVBQUF0SixTQUVuQixFQUFBQyxVQUFVLEtBQ1IsTUFBTXNKLElBQWVELEVBQVdwSixRQUNoQ2dKLEVBQ0UsaUJBQ0EsZUFDQUUsRUFDQSxvQkFDQUcsR0FHRixNQUFNQyxFQUFZLEtBQ2hCTixFQUFpQiwrQkFDWkUsR0FDQ0UsRUFBV3BKLFNBQ2JvSixFQUFXcEosV0FLWHVKLEVBQWFDLElBQ2pCLE1BQU1DLEVBQVVOLEVBQWtCSyxHQVFsQyxPQVBBUixFQUNFLHVFQUNFUyxHQUVBRCxJQUNGQSxFQUFJRSxZQUFjRCxHQUViQSxHQUVMUCxJQUNGRixFQUNFLCtEQUVGSSxFQUFXcEosUUFBVSxFQUFBMkosTUFBTUosRUFBV0QsS0FHbkNKLEdBQWVHLElBQ2xCTCxFQUFpQixpREFDYkksRUFBV3BKLFNBQ2JvSixFQUFXcEosWUFLZCxDQUFDa0osTSwrT0N0RU4sTUFDTUYsRUFETixTQUN5QixRQUFNLHVCQWlDL0IsU0FBU1ksRUFBa0J4SCxHQUV6QkEsRUFBTUMsaUJBRU5ELEVBQU1zSCxZQUFjLEdBakJULEVBQUFHLDRCQUE4QixrQkFNOUIsRUFBQUMsOEJBQWdDLG9CQXlCaEMsRUFBQUgsTUFBUSxDQUNuQkksRUFDQVQsS0FFQU4sRUFBaUIsMEJBR2pCLE1BQU1nQixFQUFhLElBQUlDLE1BQU0sRUFBQUosNkJBQzdCLEtBQU9LLGNBQWNGLEdBRXJCLEtBQU9HLGlCQTVEcUIsZUE0RG1CUCxHQUMvQyxLQUFPTyxpQkE3RHFCLGVBNkRtQkosR0FrQi9DLE1BaEJnQixLQUNkZixFQUFpQiw0QkFDYk0sSUFDRk4sRUFBaUIsaUNBQ2pCTSxLQUdGLE1BQU1jLEVBQWUsSUFBSUgsTUFBTSxFQUFBSCwrQkFDL0IsS0FBT0ksY0FBY0UsR0FFckIsS0FBT0Msb0JBekVtQixlQXlFd0JULEdBQ2xELEtBQU9TLG9CQTFFbUIsZUEwRXdCTixHQUdsRCxLQUFPTyxvQkFBaUJyYyxLLGtuQkMxRTVCLGdCQUVBLFFBRUEsUUFDQSxPQU1hLEVBQUFzYyx5QkFBNEIsSSxJQUFBLE1BQ3ZDbGUsR0FBSyxFQUNGdUIsRUFBSyxJQUYrQixXQU92QyxNQUFNNGMsRUFBb0IsRUFBQWhkLHNCQUNwQmlkLEVBQW1CLE9BQUgsc0NBQ2pCLEVBQUFDLDBCQUVDRixhQUFpQixFQUFqQkEsRUFBbUJuYyxrQkFBbUIsR0FBS21jLEdBQXFCLElBQ2hFbmUsR0FBUyxJQU1mLE9BSEFQLE9BQU9nSixLQUFLMlYsR0FBa0I1VSxRQUFTOFUsSUFDckNGLEVBQWlCRSxHQUFlQyxZQUFjLFVBQVlELElBRzFELHdCQUFDLEVBQUFyZCx3QkFBd0JvWCxTQUFRLGVBQy9CclksTUFBT29lLEdBQ0g3YyxNLG1NQ3JDVixhQUNBLFFBRUEsV0FDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFNQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFFBSUEsUUFDQSxRQUVBLFFBcUJBLFFBQ0EsUUFDQSxRQUVBLFFBQ0EsUUFDQSxRQUdBLFFBQ0EsV0FJTWlkLEVBQWdELENBRXBEaFosUUFBQSxFQUFBQSxRQUNBdkQsTUFBTyxJQUFNLEtBQ2JFLE9BQUEsRUFBQUEsT0FDQWtELEtBQU0sSUFBTSxLQUVaRCxpQkFBQSxFQUFBQSxpQkFFQTlDLGNBQUEsRUFBQUEsY0FDQUMsZUFBQSxFQUFBQSxlQUNBRixTQUFBLEVBQUFBLFNBRUFHLGVBQUEsRUFBQUEsZUFDQUMsU0FBQSxXQUVJZ2MsRUFBZ0QsQ0FDcER4YSxVQUFBLEVBQUFBLFVBR0FoQixxQkFBQSxFQUFBQSxxQkFDQU8sc0JBQUEsRUFBQUEsc0JBQ0FELG9CQUFBLEVBQUFBLG9CQUNBUSxpQkFBQSxFQUFBQSxpQkFDQWIsbUJBQUEsRUFBQUEsbUJBQ0FXLHNCQUFBLEVBQUFBLHNCQUNBaEIsc0JBQUEsRUFBQUEsc0JBQ0FDLDJCQUFBLEVBQUFBLDJCQUNBVyx3QkFBQSxFQUFBQSx3QkFDQUMsb0JBQUEsRUFBQUEsb0JBQ0FDLDRCQUFBLEVBQUFBLDRCQUNBWCxzQkFBQSxFQUFBQSxzQkFDQUQsa0JBQUEsRUFBQUEsa0JBRUFlLGtCQUFBLEVBQUFBLGtCQUNBRix3QkFBQSxFQUFBQSx3QkFDQVIsb0JBQUEsRUFBQUEsb0JBSUFULGNBQUEsVUFDQVEsbUJBQUEsRUFBQUEsbUJBQ0FFLG9CQUFBLEVBQUFBLG9CQUNBVyxZQUFBLEVBQUFBLFlBQ0FHLFVBQUEsRUFBQUEsVUFDQUUsZ0JBQUEsRUFBQUEsZ0JBQ0FELGdCQUFBLEVBQUFBLGdCQUNBRSxTQUFBLEVBQUFBLFNBQ0FDLG1CQUFBLEVBQUFBLG1CQUNBQyxlQUFBLEVBQUFBLGVBR0FwQyxZQUFBLEVBQUFBLFlBQ0E4QixXQUFBLEVBQUFBLFdBQ0FpQixXQUFBLEVBQUFBLFdBQ0FWLFdBQUEsRUFBQUEsV0FFQUMsZ0JBQUEsRUFBQUEsZ0JBQ0FDLDJCQUFBLEVBQUFBLDJCQUNBQyxzQkFBQSxFQUFBQSxzQkFDQUUsZUFBQSxFQUFBQSxlQUNBUSxRQUFBLEVBQUFBLFFBQ0FDLFdBQUEsRUFBQUEsV0FDQVYsa0JBQUEsRUFBQUEsa0JBRUFFLHFCQUFBLEVBQUFBLHFCQUNBRSx1QkFBQSxFQUFBQSx1QkFDQUQsaUJBQUEsRUFBQUEsaUJBQ0FFLGdCQUFBLEVBQUFBLGdCQUVBeEMsS0FBQSxFQUFBQSxLQUVBK0MsU0FBQSxFQUFBQSxTQUNBN0MsMEJBQUEsRUFBQUEsMEJBQ0FVLCtCQUFnQyxFQUFBb2Isc0JBR3JCLEVBQUFMLHdCQUF1QiwrQkFDL0JHLEdBQ0FDLEkscUxDL0lMLGdCQUlBLFVBQ0EsT0FDQSxPQUVhLEVBQUF4YSxVQUFZLEVBQUdzUSxRQUFPb0ssbUJBQ2pDLE1BQU1oUyxFQUFtQixFQUFBeEwsdUJBQ25CLFNBQUU0WCxHQUFhLEVBQUFsWCxpQkFFZmdZLEVBQWlCK0UsS0FBS0MsVUFBVXRLLEVBQU02SSxTQUFXN0ksR0FJdkQsSUFBSXVLLEVBQWUsQ0FDakJuUixHQUpTNEcsRUFBTTVHLElBQU0sbUJBS3JCa00saUJBQ0FrRixPQUFRLENBQ05KLGVBQ0E5RSxtQkFLSixHQUFJdEYsRUFBTXlLLFdBQVksQ0FFcEIsTUFBTUMsRUFDSjFLLEVBQU15SyxXQUFXMWYsTUFBUWlWLEVBQU15SyxXQUFXMWYsS0FBS3dHLE1BQU0sS0FBS29aLE9BQU8sR0FBRyxHQUN0RUosRUFBYUMsT0FBTSw2Q0FDZEQsRUFBYUMsUUFBTSxDQUV0QnBGLE1BQU9zRixHQUFhbEcsRUFBU2tHLEVBQVcxSyxFQUFNeUssV0FBV2hZLFVBQ3REdU4sRUFBTXlLLFlBSVR6SyxFQUFNdE8sT0FDUjZZLEVBQWFDLE9BQU0sK0JBQ2RELEVBQWFDLFFBQ2J4SyxFQUFNdE8sT0FJYixNQUFNa1osRUFBWSxVQUFJNUssRUFBTyx3QkFRN0IsT0FQSTRLLElBQ0ZMLEVBQWUsT0FBSCx3QkFDUEEsR0FBWSxDQUNmblIsR0FBSXdSLEVBQVV4UixHQUNkb1IsT0FBUUksRUFBVWxaLFFBR2Ysd0JBQUMwRyxFQUFpQnZILGlCQUFnQixlQUFDZ2EsTUFBTSxHQUFVTixLQUc1RCxFQUFBN2EsVUFBVW9iLGFBQWUsQ0FDdkJWLGFBQWMsSywrdUJDbERoQixnQkFDQSxVQUNBLFdBQ0EsUUFLQSxPQU9BLFFBQ0EsT0FFTVcsRUFBcUIsQ0FBQ3RmLEVBQVl1ZixLQUN0QyxNQUFNQyxFQUF5QnhmLEdBQVNBLEVBQU0rRixPQUFTL0YsRUFBTStGLE9BQVMsRUFDdEUsTUFBTyxDQUFFMFosZUFBZ0JGLEVBQU1DLEVBQWdCRSxXQUFZRixJQU12REcsRUFBVSxFQUNkL0UsWUFDQWhWLFVBS09nVixFQUFlaFYsRUFBSCxRQUFpQkEsRUFvQ2hDZ2EsRUFBZSxDQUFDOVgsRUFBNEI0RixJQUM1Q0EsR0FDRyxFQUFBL0IscUJBQXFCN0QsR0FvQnhCK1gsRUFBZSxFQUNuQmpZLE9BQ0E4RixRQUNBOEkscUJBU0EsR0FBcUIsbUJBQVY5SSxFQUFzQixDQUUvQixPQUR1QkEsRUFFbEIsQ0FDTCxNQUFNb1MsRUFBWUYsRUFBYWhZLEVBQU04RixHQUVyQyxPQUFRb1MsR0FDTixJQUFLLE9BQ0gsT0FBT3RKLEVBQWV2VCxxQkFFeEIsSUFBSyxXQUNILE9BQU91VCxFQUFlaFQsc0JBRXhCLElBQUssU0FDSCxPQUFPZ1QsRUFBZWpULG9CQUV4QixJQUFLLE1BQ0gsT0FBT2lULEVBQWV6UyxpQkFFeEIsSUFBSyxRQUNILE9BQU95UyxFQUFldFQsbUJBRXhCLElBQUssV0FDSCxPQUFPc1QsRUFBZTNTLHNCQUV4QixJQUFLLFdBQ0gsT0FBTzJTLEVBQWUzVCxzQkFFeEIsSUFBSyxnQkFDSCxPQUFPMlQsRUFBZTFULDJCQUV4QixJQUFLLGFBQ0gsT0FBTzBULEVBQWUvUyx3QkFFeEIsSUFBSyxTQUNILE9BQU8rUyxFQUFlOVMsb0JBRXhCLElBQUssaUJBQ0gsT0FBTzhTLEVBQWU3Uyw0QkFFeEIsSUFBSyxXQUNILE9BQU82UyxFQUFleFQsc0JBRXhCLElBQUssT0FDSCxPQUFPd1QsRUFBZXpULGtCQUt4QixJQUFLLE9BQ0gsT0FBT3lULEVBQWUxUyxrQkFFeEIsSUFBSyxhQUNILE9BQU8wUyxFQUFlNVMsd0JBRXhCLElBQUssU0FDSCxPQUFPNFMsRUFBZXBULG9CQUV4QixJQUFLLGVBQ0gsT0FBT29ULEVBQWU1VCwwQkFFeEIsSUFBSyxvQkFDSCxPQUFPNFQsRUFBZWxULCtCQUV4QixRQUVFLE1BQU0sSUFBSXZCLE1BQ1IsZUFBZStkLGlEQUF5RGxZLGFBQWdCOEYsU0FpQ3JGLEVBQUEvSyxjQUFpQnBCLElBdUM1QixNQUFNLE9BQ0p5RixFQURJLElBRUp1WSxFQUZJLEtBR0ozWixFQUhJLFNBS0pxQixFQUxJLE1BTUp5RyxFQU5JLFVBT0prTixFQVBJLFlBUUpnQixFQVJJLE1BU0o5SyxFQVRJLFFBVUp6SCxHQUNFOUgsR0FDRSxvQkFBRWtYLEVBQUYsY0FBdUIzUixFQUF2QixpQkFBc0N5UyxHQUMxQyxFQUFBMVgsaUJBRUkrRixFQUFPWCxFQUNQOFksRUE5TjRCLEdBQ2xDN1csV0FDQXFXLE1BQ0EzRSxZQUNBaFYsV0FFQSxJQUFLMlosRUFDSCxPQUFPLEtBRVQsTUFBTW5FLEVBQVl1RSxFQUFRLENBQUUvRSxZQUFXaFYsU0FDakNvYSxFQUFxQjlXLGFBQVEsRUFBUkEsRUFBV2tTLEdBQ2hDcGIsRUFDSmdnQixHQUFvRCxpQkFBdkJBLEVBQ3pCQSxFQUFtQmhnQixNQUNuQmdnQixFQUNOLE9BQU9WLEVBQW1CdGYsRUFBT3VmLElBK01WVSxDQUE0QjFlLElBRTVDMmUsRUFBaUJDLEdBQ3RCLEVBQUE5TCxTQUdVMEwsR0FPTkssRUFBd0JwZ0IsSUFDNUIsSUFBS3VmLEVBQ0gsTUFBTSxJQUFJeGQsTUFDUiwyREFFSm9lLEVBQW1CYixFQUFtQnRmLEVBQU91ZixLQUUvQyxFQUFBN0wsVUFBVSxLQUNKcU0sR0FDRkksRUFBbUJKLElBRXBCLENBQUNBLGFBQWMsRUFBZEEsRUFBZ0JMLFdBQVlLLGFBQWMsRUFBZEEsRUFBZ0JOLGlCQU1oRCxJQUFJWSxHQUFxQixFQUNyQlAsRUFBWSxLQUNLLGlCQUFWcFMsSUFDVG9TLEVBQVlGLEVBQWFoWSxFQUFNOEYsR0FDL0IyUyxTQUNpQixJQUFSZCxJQUNQTyxJQUNBLENBQUMsTUFBTyxRQUFTLFdBQVksUUFBUWxYLFNBQVNrWCxLQVNsRCxNQTRCTVEsRUFBVyxLQUVmLE1BQU0sT0FBRXRaLEVBQUYsYUFBVW1LLEVBQVYsU0FBd0J6RSxFQUF4QixTQUFrQ3pGLEdBQWExRixFQUMvQ3FFLEVBQU9vQixFQUFZMlksRUFBUXBlLEdBQVgsU0FBNEJvZSxFQUFRcGUsR0FDcER1USxFQUFrQnZRLEVBQU0ySCxTQUM5QixJQUFJbEosRUFBUSxVQUFJOFIsRUFBaUJsTSxHQUVqQyxNQUFNMmEsRUFBWXZaLEVBQVMsR0FBSyxFQUFBYSxhQUFhWixHQVM3QyxPQU5JSCxFQUFjOEIsU0FBU2hELEdBQ3pCNUYsRUFBUXVnQixFQUNDLEVBQUE3WixhQUFhMUcsS0FFdEJBLEVBQXFCLFFBQWIwTSxHQUFzQnlFLEVBQWVBLEVBQWVvUCxHQUV2RHZnQixHQVVIeVUsRUFBYTdGLElBQ2pCQSxFQUFTQSxHQUFVck4sRUFBTXFOLFFBQVUsSUFDUmxHLE9BQ3hCNkwsR0FBVUEsRUFBTTNPLE1BQVEyTyxFQUFNM08sS0FBS2dELFNBQVNoRCxJQW1CM0M0USxFQUFpQixFQUFBclYsc0JBRXZCLEdBQUl5WixFQUNGLE9BQU8sd0JBQUNwRSxFQUFlbFMsU0FBUSxpQkFBSy9DLElBQy9CLElBQUttTSxHQUFTa08sRUFBYSxDQUNoQyxHQTFVa0JoVSxJQUNiQSxJQUFTckIsTUF5VVZpYSxDQUFhNVksR0FDZixPQUNFLHdCQUFDNE8sRUFBZTlSLGdCQUFlLGlCQUN6Qm5ELEVBQUssQ0FDVGtmLGVBQWdCakssRUFDaEI1SCxPQUFRNkYsSUFDUnpVLE1BQU9zZ0IsT0FHTixHQTlVWTFZLElBQ2RBLGFBQWdCLFVBNlVWOFksQ0FBYzlZLEdBQ3ZCLE9BQ0Usd0JBQUM0TyxFQUFleFIsaUJBQWdCLGlCQUMxQnpELEVBQUssQ0FDVGtmLGVBQWdCakssRUFDaEI1SCxPQUFRNkYsSUFDUnpVLE1BQU9zZ0IsT0FNZixNQUFNSyxFQUFXLE9BQUgsc0NBQ1RwZixHQUNDMmUsR0FBbUIsSUFBRyxDQUMxQlUsVUFBV2hCLEVBQWFoWSxFQUFNOEYsR0FDOUIxTixNQUFPc2dCLElBQ1AxUixPQUFRNkYsSUFDUjRMLHFCQUFzQkEsRUFDdEJRLGFBN0dvQjdnQixJQVlwQixHQVZjLEtBQVZBLElBQ0ZBLEVBQVEsTUFHTjRILElBQVNLLFFBQW1CLE1BQVRqSSxFQUNyQkEsRUFBUWlJLE9BQU9qSSxHQUNONEgsSUFBUyxVQUFhZ0UsU0FBb0IsTUFBVDVMLElBQzFDQSxFQUFROGdCLFNBQVM5Z0IsSUFHZkEsSUFBVXNnQixJQUFZLENBQ3hCLE1BQU1TLEVBQWMvWixFQUFTLENBQUVBLE9BQVFBLEVBQVFoSCxTQUFVQSxFQUN6RHlZLEVBQW9CLENBQUUsQ0FBQ2tILEVBQVFwZSxJQUFTd2YsSUFDeEN4SCxFQUFpQm9HLEVBQVFwZSxJQUl2QjhlLEdBQ0ZELEVBQXFCcGdCLElBMEZ2QmdoQixXQTNDa0JqTCxJQUNsQkEsRUFBTUMsaUJBQ05ELEVBQU1FLGtCQUNOd0MsRUFBb0IsQ0FBRSxDQUFDN1MsR0FBTyxPQUMxQnlhLEdBQ0ZELEVBQXFCLE9BdUN2QmEsVUFBV3BCLEVBQWEsQ0FBRXJKLGlCQUFnQjlJLFFBQU85RixXQUs5Q2tKLEdBQTRCLG1CQUFaekgsSUFDbkJzWCxFQUFTdFgsUUFBVUEsRUFBUXNYLElBRzdCLE1BQU1PLEVBQU0sd0JBQUMxSyxFQUFlclQsbUJBQWtCLGlCQUFLd2QsSUFFbkQsT0FBTzdQLEVBQ0wsd0JBQUMwRixFQUFlblQsb0JBQW1CLGlCQUFLc2QsR0FDckNPLEdBR0hBLEdBSVMsRUFBQUMsMkJBQTZCLENBQ3hDLHVCQUNBLHdCQUNBLHNCQUNBLG1CQUNBLHFCQUNBLHdCQUNBLHdCQUNBLDZCQUNBLDBCQUNBLHNCQUNBLDhCQUNBLHdCQUNBLG9CQUNBLHFCQUNBLG9CQUNBLDBCQUNBLHNCQUNBLDRCQUNBLGtDQUdGLFVBQWUsRUFBQXhlLGUsOExDaGRmLGdCQUNBLE9BQ0EsUUFRQSxXQUdBLFFBQ0EsT0FnQ2EsRUFBQVEsbUJBQXNCNUIsSUFDakMsTUFBTTJTLEVBQU8sRUFBQUMsa0JBQ1AsVUFBRXlNLEVBQUYsU0FBYWxQLEVBQWIsV0FBdUJzUCxHQUFlemYsR0FzRnRDLGVBQ0o2ZixFQURJLEtBRUo5aEIsRUFGSSxNQUdKb08sRUFISSxnQkFLSjJULEVBTEksZUFNSkMsRUFOSSxPQU9KMVMsRUFQSSxtQkFRSnlSLEVBUkksZUFTSlosRUFUSSxnQkFVSjhCLEVBVkksVUFXSk4sR0FDRTFmLEVBRUVpVixFQUFpQixFQUFBclYsc0JBR2pCcWdCLEVBQVk1UyxHQUFVQSxFQUFPN0ksT0FFN0IrWixFQUE2QixtQkFBVnBTLEVBQXVCQSxFQUFNcE8sS0FBT3NoQixFQUN2RGEsRUFBYSxVQUNqQixhQUNBTCxFQUNBLFNBQVM5aEIsRUFDVCxtQkFBa0J3Z0IsR0FBYSxXQUMvQixDQUNFLGNBQWUwQixJQUdieEMsRUEvRWdCLE1BQ3BCLE1BQU0sYUFDSjZCLEVBREksVUFFSkQsRUFGSSxlQUdKNUosRUFISSxLQUlKa0UsRUFKSSxZQUtKSixFQUxJLFFBTUp4UyxFQU5JLFdBT0p3TixFQVBJLGVBUUoySyxFQVJJLFNBU0ovRixHQUNFblosRUFvQ0osT0FuQ21CLE9BQUgsd0JBQ1hBLEdBQUssQ0FDUnNaLGdCQUFpQixPQUFGLHdCQUNWLEVBQUE2RyxvQkFBb0JuZ0IsSUFBTSxDQUM3Qm9nQixTQUFXNUwsSUFFVCxNQUFNNkwsRUFDVSxhQUFkaEIsRUFHSTdLLEVBQU04TCxPQUFPQyxRQUViL0wsRUFBTThMLE9BQU83aEIsTUFDZjZnQixHQUNGQSxFQUFhZSxNQWFuQjVLLGVBQWdCLE9BQUYsd0JBQ1RBLEdBQWMsQ0FDakIwRCxXQUNBcUgsV0FBWXRCLEVBQ1ozRixZQUFhQSxHQUFlSSxFQUM1QjVTLGVBbUNhMFosR0FFYkMsRUFBWWhCLEVBRWxCLE9BQ0UsK0JBQUt6SixVQUFXaUssR0FFZCx3QkFBQ1EsRUFBUyxpQkFBS2pELElBQ2R3QyxFQUFZLHdCQUFDaEwsRUFBZXBVLFlBQVcsQ0FBQ3dNLE9BQVFBLElBQWEsS0F6SDlDLE1BQ2xCLEdBQUksRUFBQXJELGdCQUFnQjNDLFNBQVNnWSxLQUFlbFAsRUFtQjFDLE9BQ0Usa0NBQ0U4RixVQUFVLHVCQUNWSSxNQUFPMUQsRUFBSzRELGNBQWMsQ0FDeEJuSyxHQUFJLHNCQUVOdVUsUUFBU2xCLEdBRVQsMkNBOEZIbUIsR0FDQTlCLEdBQ0MsK0JBQ0U3SSxVQUFXLFVBQVcscUJBQXNCLENBQzFDNEssT0FBUTNDLEVBQWlCLE1BRzFCQSxNLG1OQ25MWCxpQkFPYSxFQUFBNEMsa0JBQXFCOWdCLElBQ2hDLE1BQU0sS0FBRWpDLEVBQUYsS0FBUXNHLEVBQVIsUUFBY3lELEVBQWQsTUFBdUJzUSxFQUF2QixTQUE4QmdJLEVBQTlCLE9BQXdDVyxFQUF4QyxNQUFnRHRpQixFQUFoRCxTQUF1RDBSLEdBQzNEblEsRUFJSXNaLEVBQWtCLE9BQUgsd0JBQ2hCdFosRUFBTXNaLGlCQUFlLENBQ3hCdmIsT0FDQXNHLE9BQ0F5RCxVQUNBc1EsUUFDQWdJLFdBQ0FXLFNBQ0F0aUIsUUFDQTBSLGFBR0Ysc0NBQ0tuUSxHQUFLLENBQ1JzWixxQkFTUyxFQUFBNkcsb0JBQ1huZ0IsR0FhTyxVQUFLQSxFQVhNLENBQ2hCLE9BQ0EsT0FDQSxVQUNBLFFBQ0EsV0FDQSxTQUNBLFFBQ0EsV0FDQSxpQixjQ2hESnpDLEVBQU9ELFFBQVVrQyxRQUFRLGUsd3RCQ0l6QixnQkFJQSxPQUNBLFdBQ0EsT0FVYSxFQUFBc0Msb0JBQXVCOUIsSUFDbEMsTUFBTW9MLEVBQW1CLEVBQUF4TCx1QkFDbkIsTUFBRTJQLEVBQUYsU0FBU29CLEVBQVQsUUFBbUI3SSxFQUFuQixNQUE0QnJKLEVBQTVCLG1CQUFtQ3VpQixHQUF1QmhoQixFQUcxRGloQixFQUE2QixtQkFBVjFSLEVBQXVCQSxFQUFNLENBQUU5USxVQUFXOFEsR0FFNUQyUixHQUFnQixRQUFFbmEsRUFBRixNQUFXaU0sRUFBWCxLQUFrQnRPLElBQVUsRUFBQXljLGFBQ2pELEVBQUF2VixJQUFJcVYsSUFJQUcsRUFDSixVQUFRM2lCLElBQXFELEtBQTFDdUcsTUFBTUMsUUFBUXhHLElBQVVBLEVBQU0rRixRQWFuRCxHQVhBLEVBQUEyTixVQUFVLEtBQ0o2TyxHQUFzQkksR0FJeEJGLEVBQWUsQ0FDYjlULFVBQVcsQ0FBRTNPLFlBR2hCLENBQUMyaUIsRUFBYzNpQixFQUFPdWlCLElBRXJCaE8sRUFDRixNQUFNLElBQUl4UyxNQUFNd1MsRUFBTWpPLFlBR3hCLEdBQUlnQyxFQUNGLE9BQ0UsK0JBQUtrUCxVQUFVLHlCQUNiLHdCQUFDN0ssRUFBaUJuSCxRQUFPLE9BTS9CLE1BQU1vZCxFQU9GLENBQUUzYyxPQUFNNGMsVUFBVzVjLEVBQU02YyxXQUFZdk8sRUFBT2pNLFdBS2hELEdBSnVCLG1CQUFaZSxJQUNUdVosRUFBV0csZ0JBQWtCMVosRUFDN0J1WixFQUFXdlosUUFBVUEsRUFBUW5LLEtBQUssR0FBRSwrQkFBT3FDLEdBQUssQ0FBRTBFLFlBRS9DLFVBQU0rYyxlQUFlOVEsR0FDeEIsTUFBTSxJQUFJblEsTUFDUixnRUFBa0VtUSxHQUd0RSxNQUFNZ1AsRUFBTSxVQUFNK0IsYUFBYS9RLEVBQVUwUSxHQUV6QyxPQUFPLCtCQUFLcEwsVUFBVSx5QkFBeUIwSixJQUdqRCxFQUFBN2Qsb0JBQW9CNmYsVUFBWSxJLHNoQkNqRmhDLGdCQUNBLE9BTWEsRUFBQWxmLFlBQWMsVUFBTW1mLFdBQy9CLENBQUMsRUFBa0VDLEssSUFBbEUsU0FBRWxSLEdBQVEsRUFBS21SLEVBQVUsSUFBekIsY0FDQyxNQUFNLFdBQUV2TixHQUFlLEVBQUFqVSxpQkFDdkIsT0FDRSxnREFDTXdoQixFQUFVLENBRWRDLFNBQVV4TixFQUNWc04sSUFBS0EsSUFFSmxSLE0saWxDQ2pCVCxnQkFDQSxXQUNBLFFBR0EsT0FDQSxPQXdCYSxFQUFBN04sZ0JBQW1CLEksSUFBQSxXQUM5QmtmLEVBRDhCLFVBRTlCQyxFQUY4QixVQUc5QmhDLEVBSDhCLE1BSTlCbEssRUFKOEIsU0FLOUJwTyxFQUw4QixPQU05QnVhLEdBQU0sRUFDSGxpQixFQUFLLElBUHNCLG9FQVM5QixPQUFPLG9EQUFjQSxLQUdWLEVBQUE2QyxnQkFBbUI3QyxHQUFVLDhDQUFRQSxJQUVyQyxFQUFBNEMsVUFDWDVDLElBR0EsTUFBTSxLQUNKakMsRUFESSxNQUVKcWEsRUFGSSxNQUdKckMsRUFISSxPQUlKbEwsRUFKSSxPQUtKZ08sRUFMSSxTQU1KbFIsRUFOSSxZQU9KYixFQVBJLFNBUUpxSixFQVJJLGVBU0pzRixFQVRJLGVBVUoxRixFQVZJLFNBV0o1RSxHQUNFbkwsR0FDRSxPQUFFcU4sRUFBRixpQkFBVTJLLEdBQXFCLEVBQUExWCxrQkFDOUIyaEIsRUFBV0UsR0FBZ0IsRUFBQXJQLFNBQ2hDaUQsRUFBTXFNLGlCQUFrQixHQUVwQkYsRUFBUyxJQUFNQyxFQUFjRixJQUFlQSxHQUU1Q2hDLEVBQVksVUFBTXBWLEVBQVNyRCxLQUN0QjZGLEVBQU9sRyxPQUFRNkwsR0FBVUEsRUFBTTNPLE9BQVNtRCxFQUFNbkQsTUFBTUcsUUFFekQ0RyxFQUFtQixFQUFBeEwsc0JBRW5CeWlCLEVBQ2MsbUJBQVh4SixFQUNIQSxFQUFPLE9BQUQsd0JBQU03WSxHQUFLLENBQUUySCxjQUNuQmtSLElBQVUsRUFxQlZ5SixFQUNKLHdCQUFDbFgsRUFBaUJ2SSxnQkFBZSxDQUMvQnFmLE9BQVFBLEVBQ1I5SixNQUFPQSxFQUNQNkosVUFBV0EsRUFDWHBKLE9BQVF3SixFQUNSdE0sTUFBT0EsSUFJWCxHQUFJQSxFQUFNd00sYUFBZSxFQUFBQyxRQUFRMWIsR0FDL0IsT0FBTyxLQUVULE1BQU1rYixFQUFhamtCLEVBQUt3RyxNQUFNLEtBQUtDLE9BQVMsRUFBSXpHLEVBQUt3RyxNQUFNLEtBQUssR0FBS3hHLEVBRXJFLE9BQ0Usd0JBQUNxTixFQUFpQnRJLGdCQUFlLENBQy9Cc1YsTUFBT0EsRUFDUDRKLFdBQVlBLEVBQ1pFLE9BQVFBLEVBQ1JELFVBQVdBLEVBQ1hwSixPQUFRd0osRUFDUnRNLE1BQU9BLEVBQ1B1TSxRQUFrQixZQUFUdmtCLEVBQXFCLEtBQU91a0IsRUFDckNyQyxVQUFXQSxFQUNYdFksU0FBVUEsR0FPVGtELEVBQU9sQixJQUFLbkMsR0FDWCx3QkFBQzRELEVBQWlCaEssY0FBYSxlQUM3QnJDLElBQUt5SSxFQUFNekosS0FDWG9TLFNBQVVBLEdBQ04zSSxFQUFLLENBQ1RHLFNBQVVBLEVBQ1Y4TixlQUFjLCtCQUNUQSxHQUNBak8sRUFBTWlPLGdCQUVYdUMsaUJBQWtCQSxFQUNsQjdNLFNBQVVBLEVBQ1ZyRSxZQUFhQSxFQUNiaUosZUFBZ0JBLFFBUzFCLFVBQWUsRUFBQW5OLFcsY0N0SmZyRixFQUFPRCxRQUFVa0MsUUFBUSxnQiwwTkNBekIsZ0JBQ0EsVUFDQSxPQUNBLE9BSWEsRUFBQXlELGVBQWlCLEVBQUcwTixjQUMvQiwrQkFBS3NGLFVBQVUsYUFBYXRGLEdBRWpCLEVBQUEzTixtQkFBcUIsRUFBR3lDLFNBQVFrTCxjQUMzQywrQkFBS3NGLFVBQVcsYUFBYXhRLEVBQU8yRyxJQUFPdUUsR0FVaEMsRUFBQTVOLFNBQVkvQyxJQUN2QixNQUFNaVYsRUFBaUIsRUFBQXJWLHVCQUNqQixTQUFFNFgsR0FBYSxFQUFBbFgsa0JBZWYsS0FBRXZDLEdBQVNpQyxFQUdYeWQsRUFBYSxVQUNqQnpkLEVBQ0EsUUFDQSxrQkFDQSxZQUNBLGVBRUYsT0FDRSx3QkFBQ2lWLEVBQWVoUyxlQUFjLEtBdEJKLEdBdUJmMEcsSUFBSSxDQUFDbEUsRUFBUWpJLEtBQ3BCLCtCQUFDeVgsRUFBZWpTLG1CQUFrQixDQUFDakUsSUFBSzBHLEVBQU8yRyxHQUFJM0csT0FBUUEsR0FDekQsd0JBQUN3UCxFQUFlN1QsY0FBYSxpQkFDdkJxYyxFQUFVLENBQ2RyRixNQUFPWixFQUFTelosRUFBTTBILEVBQU8yRyxJQUM3Qi9ILE1BckJhb2UsRUFxQk9qbEIsRUFwQnJCLEdBQUd3QyxFQUFNcUUsYUFBYW9lLEtBcUJyQmhkLE9BQVFBLEVBQU8yRyxPQXRCRnFXLFcsc0xDbEN6QixnQkFDQSxPQUNBLE9BS2EsRUFBQTlmLFdBQWEsS0FDeEIsTUFBTXlJLEVBQW1CLEVBQUF4TCx1QkFDbkIsT0FBRXlOLEdBQVcsRUFBQS9NLGlCQUVuQixPQUNFLCtCQUFLMlYsVUFBVSxpQkFDVjVJLEVBQU83SSxRQUNSLHdCQUFDNEcsRUFBaUIxSyxNQUFLLENBQUN1VixVQUFVLGdCQUFnQnlNLFFBQVEsVUFDeEQsa0NBQ0dyVixFQUFPMUQsSUFBSSxDQUFDcUosRUFBTzJQLElBQ2xCLDhCQUFJNWpCLElBQUs0akIsR0FDUCx3QkFBQ3ZYLEVBQWlCMUksVUFBUyxDQUFDc1EsTUFBT0EsRUFBT29LLGFBQWEsZ0Isc0xDZHZFLGdCQUNBLFVBQ0EsUUFDQSxPQUNBLE9BY2EsRUFBQXhaLFdBQWEsRUFDeEJ3UixjQUNBQyxjQUNBRSxpQkFDQUQsY0FDQUUsaUJBQ0E3TixXQUNBb0YsaUJBQ0FyQyxRQUVBNUQsa0JBRUEsTUFBTXNFLEVBQW1CLEVBQUF4TCx1QkFDbkIsVUFBRWtVLEdBQWMsRUFBQXhULGlCQUN0QixPQUNFLCtCQUFLMlYsVUFBVSxlQUNiLHdCQUFDN0ssRUFBaUJ4SyxPQUFNLENBQUN5RixLQUFLLFNBQVNxYyxRQUFRLFdBQzVDdE4sR0FHQyx3QkFBQ2hLLEVBQWlCdkgsaUJBQWdCLENBQ2hDdUksR0FBRyxlQUNIa00sZUFBZSxZQUtwQi9DLEVBQ0MsNkJBQ0VVLFVBQVUsY0FDVjBLLFFBQVVpQyxJQUNSQSxFQUFFbk8saUJBQ0ZjLEVBQWU1TixLQUdoQjBOLEdBR0Msd0JBQUNqSyxFQUFpQnZILGlCQUFnQixDQUNoQ3VJLEdBQUcsZUFDSGtNLGVBQWUsWUFJbkIsS0FFSDlDLEVBQ0MsNkJBQ0VTLFVBQVUsY0FDVjBLLFFBQVVpQyxJQUNSQSxFQUFFbk8saUJBQ0ZYLElBQ0EwQixFQUFlN04sS0FHaEIyTixHQUdDLHdCQUFDbEssRUFBaUJ2SCxpQkFBZ0IsQ0FDaEN1SSxHQUFHLGVBQ0hrTSxlQUFlLFlBSW5CLEtBRUh2TCxHQUNELEVBQUE4VixrQkFBa0IsQ0FDaEJ0YixLQUFNVCxFQUNOYSxXQUNBK0MsVUFFQSxtQ0FDRSxtQ0FDQSx3QkFBQ1UsRUFBaUJ4SyxPQUFNLENBQ3RCOGhCLFFBQVEsT0FDUi9CLFFBQVM1VCxFQUNUa0osVUFBVyxlQUFldkwsRUFBTTNNLG9CQUVoQyx3QkFBQ3FOLEVBQWlCdEgsS0FBSSxDQUFDL0YsS0FBSyxVQUFXLElBQ3ZDLHdCQUFDcU4sRUFBaUJ2SCxpQkFBZ0IsQ0FDaEN1SSxHQUFHLGVBQ0hrTSxlQUFlLGFBSW5CLE9BS1YsRUFBQTFVLFdBQVcrZCxVQUFZLENBQ3JCdk0sWUFBYSxVQUFVME4sS0FDdkJ6TixZQUFhLFVBQVV5TixLQUN2QnZOLGVBQWdCLFVBQVV3TixLQUMxQnpOLFlBQWEsVUFBVXdOLEtBQ3ZCdE4sZUFBZ0IsVUFBVXVOLEtBQzFCcGIsU0FBVSxVQUFVekksT0FDcEI2TixlQUFnQixVQUFVZ1csS0FDMUI1SyxlQUFnQixVQUFVaFAsT0FDMUI2WixRQUFTLFVBQVU5akIsUyxtTkMxSHJCLGdCQUNBLE9BUWEsRUFBQWdFLFdBQXdDLEVBQ25Ed1MsY0FDQU0sWUFDQTFELGVBQ0E0RCxjQUNBdkYsZUFFQSxNQUFNdkYsRUFBbUIsRUFBQXhMLHNCQUN6QixPQUNFLHdCQUFDd0wsRUFBaUIzSSxZQUFXLGlCQUFLdVQsR0FDaEMsd0JBQUM1SyxFQUFpQnpJLFdBQVUsaUJBQUsrUyxJQUVoQy9FLEVBRUEyQixHQUFnQix3QkFBQ2xILEVBQWlCekksV0FBVSxpQkFBSytTLElBRWxELHdCQUFDdEssRUFBaUJ4SCxXQUFVLGlCQUFLOFIsRUFBaUJRLE1BSzNDLEVBQUEwSiwyQkFBNkIsQ0FDeEMsYUFDQSxhQUNBLGdCLHF5QkM3QkYsZ0JBQ0EsVUFDQSxVQUNBLE9BQ0EsT0FJYSxFQUFBeGMsMkJBQThCcEQsSUFDekMsTUFBTSxNQUFFb1ksRUFBRixTQUFTekgsRUFBVCxRQUFtQnNTLEVBQW5CLGdCQUE0QkMsRUFBNUIsZUFBNkNDLEdBQW1CbmpCLEVBQ2hFaVYsRUFBaUIsRUFBQXJWLHNCQUN2QixPQUNFLCtCQUFLcVcsVUFBVSxrQ0FDYix3QkFBQ2lOLEVBQWUsaUJBQUtsakIsSUFDcEIyUSxFQUNELHdCQUFDc0UsRUFBZTNSLGtCQUFpQixDQUFDOFUsTUFBT0EsRUFBTzZLLFFBQVNBLElBQ3pELHdCQUFDRSxFQUFjLGlCQUFLbmpCLE1BbUJiLEVBQUFtRCxnQkFBbUJuRCxJQUM5QixNQUFNLG9CQUFFa1gsRUFBRixjQUF1QjNSLEVBQXZCLE9BQXNDOEgsR0FBVyxFQUFBL00saUJBSWpEN0IsRUFBUXVCLEVBQU12QixPQUFTLEdBRXZCd2tCLEVBQVUsS0FDZCxNQUFNLGVBQUVsVCxFQUFGLEtBQWtCMUwsR0FBU3JFLEVBQ2pDa1gsRUFDRSxDQUFFLENBQUMsR0FBRzdTLEtBQVE1RixFQUFNK0YsVUFBVyxVQUFLdUwsRUFBbUIxTCxFQUFILE9BQWdCLElBQ3BFLENBQUUxRixLQUFNLFdBY055a0IsRUFBYVQsR0FDVnBkLEVBQWM4QixTQUFTLEdBQUdySCxFQUFNcUUsUUFBUXNlLEtBZ0JqRCxFQUFBeFEsVUFBVSxLQUNKblMsRUFBTXlWLGVBQWU0TixZQUFZSixLQUNwQyxJQUVILE1BQU1LLEVBakJ1QjlGLEtBQzNCLElBQUkrRixFQUFlLEVBU25CLE9BUnVCL0YsRUFBTzdULElBQUksQ0FBQzZaLEVBQWFDLElBQzFDTCxFQUFVSyxHQUNMLEdBRVBGLEdBQThCLEVBQ3ZCQSxLQVVjRyxDQUFvQmpsQixHQUV6Q2dmLEVBQWEsT0FBSCxVQUNYLFVBQ0R6ZCxFQUNBLFFBQ0EsUUFDQSxrQkFDQSxjQUNBLGtCQUNBLG9CQUdFLEtBQUVxRSxFQUFGLFNBQVEyTCxFQUFSLFNBQWtCMlQsRUFBbEIsV0FBNEJ6SixHQUFlbGEsRUFDM0NpVixFQUFpQixFQUFBclYsc0JBR3ZCLElBQUlna0IsRUFBY25sQixFQUFNMEksT0FBUTBjLEdBQ3ZCLE1BQU9BLEdBQ2JyZixPQVdILE9BVkFpWixFQUFXd0YsU0FBV1UsR0FBWUMsRUFBY0QsRUFBV1YsRUFBVSxLQUdyRXhGLEVBQVdxRyxrQkFBb0J6VyxFQUFPbEcsT0FDbkM2TCxHQUFVQSxFQUFNM08sTUFBUTJPLEVBQU0zTyxPQUFTQSxHQUUxQ29aLEVBQVd3QyxhQUNUeEMsRUFBV3FHLG9CQUFxQnJHLEVBQVdxRyxrQkFBa0J0ZixRQUk3RCx3QkFBQ3lRLEVBQWU1UixzQkFBcUIsaUJBQUtvYSxHQUN2Q2hmLEVBQU1rTCxJQUFJLENBQUM2WixFQUFhaG1CLEtBQ3ZCLEdBQUk0bEIsRUFBVTVsQixHQUFJLE9BQU8sS0FDekIsTUFBTTZHLEVBQU8sR0FBR3JFLEVBQU1xRSxRQUFRN0csSUFDeEJ1bUIsRUFBbUJULEVBQW1COWxCLEdBQzVDLE9BQ0Usd0JBQUN5WCxFQUFlN1IsMkJBQTBCLGlCQUNwQzhXLEVBQVUsQ0FDZG5iLElBQUtzRixFQUNMNGUsUUFBU0EsRUFDVGUsVUFBV3htQixFQUNYdW1CLGlCQUFrQkEsRUFDbEIxZixLQUFNQSxJQUVOLHdCQUFDNFEsRUFBZTFSLGVBQWMsaUJBQ3hCa2EsRUFBVSxDQUNkdUcsVUFBV3htQixFQUNYdW1CLGlCQUFrQkEsRUFDbEIxZixLQUFNQSxFQUNONGYsV0FBWSxLQWpGSnRCLFFBa0ZLbmxCLEVBakZ2QjBaLEVBQW9CLENBQUUsQ0FBQyxHQUFHbFgsRUFBTXFFLFFBQVFzZSxLQUFVLFFBbUZ4Q3VCLGFBQWNsVSxHQUFZNFQsR0FBZTVULFVBUzFDLEVBQUE0UCwyQkFBNkIsQ0FDeEMsNkJBQ0EseUJBR0YsVUFBZSxFQUFBemMsZ0JBRUYsRUFBQVksUUFBVSxFQUFHb2dCLFFBQVEsR0FBSUMsU0FBUyxNQUM3QywrQkFDRUQsTUFBT0EsRUFDUEMsT0FBUUEsRUFDUkMsTUFBTSw2QkFDTkMsUUFBUSxlQUVSLGdDQUNFQyxLQUFLLGVBQ0x6bUIsRUFBRSx1UEFLSyxFQUFBa0csV0FBYSxFQUFHbWdCLFFBQVEsR0FBSUMsU0FBUyxNQUNoRCwrQkFDRUQsTUFBT0EsRUFDUEMsT0FBUUEsRUFDUkMsTUFBTSw2QkFDTkMsUUFBUSxlQUVSLGdDQUNFQyxLQUFLLGVBQ0x6bUIsRUFBRSx5SCxpTUNqTFIsZ0JBQ0EsVUFDQSxPQUdhLEVBQUF1RixzQkFBeUJyRCxJQUNwQyxNQUFNLFVBQ0ppZ0IsRUFESSxrQkFFSjZELEVBRkksTUFHSjFMLEVBSEksUUFJSjZLLEVBSkksZ0JBS0pDLEVBTEksZUFNSkMsRUFOSSxTQU9KeFMsR0FDRTNRLEVBQ0VvTCxFQUFtQixFQUFBeEwsc0JBRXpCLE9BQ0UsK0JBQ0VxVyxVQUFXLCtCQUE4QmdLLEVBQVksY0FBZ0IsS0FFcEVpRCxHQUFtQix3QkFBQ0EsRUFBZSxpQkFBS2xqQixJQUV6QyxpQ0FBT2lXLFVBQVUsMEJBQTBCbUMsR0FFM0MsK0JBQUtuQyxVQUFVLFlBQ1p0RixFQUNBc1MsR0FDQyx3QkFBQzdYLEVBQWlCeEssT0FBTSxDQUN0QnFWLFVBQVUscUNBQ1Z1TyxLQUFLLEtBQ0w5QixRQUFRLFVBQ1IvQixRQUFTc0MsR0FFVCx3QkFBQzdYLEVBQWlCckgsUUFBTyxDQUFDcWdCLE9BQVEsR0FBSUQsTUFBTyxNQUdoRG5rQixFQUFNaWdCLFVBQ0wsd0JBQUM3VSxFQUFpQnZLLFlBQVcsQ0FDM0I5QixJQUFJLHFCQUNKc08sT0FBUXlXLElBRVIsTUFHTFgsR0FBa0Isd0JBQUNBLEVBQWMsaUJBQUtuakIsTUFLN0MsRUFBQXFELHNCQUFzQnNlLFVBQVksQ0FDaEMxQixVQUFXLFVBQVV3RSxLQUFLQyxXQUMxQlosa0JBQW1CLFVBQVV6YSxNQUM3QitPLE1BQU8sVUFBVTBLLEtBQ2pCNkIsVUFBVyxVQUFVRixLQUNyQnhCLFFBQVMsVUFBVUYsS0FDbkJqRCxnQkFBaUIsVUFBVWdELEtBQzNCL0MsZUFBZ0IsVUFBVStDLEtBQzFCNUQsZUFBZ0IsVUFBVWhnQixPQUMxQnlSLFNBQVUsVUFBVW1TLE1BR3RCLFVBQWUsRUFBQXpmLHVCLGdqQkM5RGYsZ0JBQ0EsVUFDQSxPQUNBLE9BQ0EsT0FFYSxFQUFBRyxxQkFBdUIsRUFBR29oQixVQUFTQyxrQkFDOUMsK0JBQUs1TyxVQUFVLG9CQUNiLCtCQUFLQSxVQUFVLDBCQUEwQjJPLEdBQ3hDQyxHQUFnQixDQUNmLCtCQUFLOWxCLElBQUksZ0JBQWdCa1gsVUFBVSwyQkFDaEM0TyxHQUVILCtCQUNFOWxCLElBQUksd0JBQ0prWCxVQUFVLHVDQUtsQixFQUFBelMscUJBQXFCbWUsVUFBWSxDQUMvQmlELFFBQVMsVUFBVTlCLEtBQUs0QixXQUN4QkcsYUFBYyxVQUFVL0IsTUFHYixFQUFBdmYsZUFBa0IsSSxJQUFBLGFBQzdCK1csRUFENkIsS0FFN0J2YyxFQUY2QixLQUc3QnNHLEVBSDZCLFdBSTdCNGYsRUFKNkIsVUFLN0JELEVBTDZCLGVBTTdCOUUsRUFONkIsV0FPN0JnRixFQVA2QixNQVE3QjlMLEdBQUssRUFDRnBZLEVBQUssSUFUcUIsK0ZBVzdCLE1BQU1vTCxFQUFtQixFQUFBeEwsc0JBQ25CK1MsRUFBTyxFQUFBQyxpQkFDUDNOLE9BQStCLElBQWQrZSxFQUN2QixPQUNFLHdCQUFDNVksRUFBaUI1SCxxQkFBb0IsQ0FDcENvaEIsUUFBU3RLLEVBQWEzUSxJQUFJLENBQUNuQyxFQUFPaEssSUFFOUIsd0JBQUM0TixFQUFpQmhLLGNBQWEsZUFDN0JyQyxJQUFLdkIsR0FDRHdDLEVBQ0F3SCxFQUFLLENBQ1RuRCxLQUFNLEdBQUdBLEtBQVFtRCxFQUFNekosT0FDdkJpbUIsVUFBV0EsTUFJakJhLGFBQ0U1ZixJQUNDaWYsR0FBYyxDQUNiLCtCQUFLbmxCLElBQUksZ0JBQWdCa1gsVUFBVSwyQkFDakMsd0JBQUM3SyxFQUFpQnhLLE9BQU0sQ0FDdEJxVixVQUFVLHFCQUNWeU0sUUFBUSxTQUNSOEIsS0FBSyxLQUNMTSxZQUFVLEVBQ1ZDLFVBQVcsRUFDWHBFLFFBQVMsS0FDUHNELEVBQVdsbUIsSUFDWixhQUNXNFUsRUFBSzRELGNBQ2YsQ0FBRW5LLEdBQUksNkJBQ04sQ0FBRWdNLE1BQU9BLEtBR1gsd0JBQUNoTixFQUFpQnBILFdBQVUsQ0FBQ29nQixPQUFRLEdBQUlELE1BQU8sT0FHcEQsK0JBQ0VwbEIsSUFBSSx3QkFDSmtYLFVBQVUseUNBUXRCLEVBQUExUyxlQUFlb2UsVUFBWSxDQUN6QnRkLEtBQU0sVUFBVThFLE9BQU91YixXQUN2QlYsVUFBVyxVQUFVZ0IsT0FDckI5RixlQUFnQixVQUFVaGdCLE9BQzFCZ2xCLFdBQVksVUFBVU8sTUFHeEIsRUFBQWxoQixlQUFlMGhCLGFBQWUsQ0FDNUI1WCxPQUFRLFVBQVVoRSxNQUNsQnNKLEtBQU0sRUFBQXVTLFksNkxDNUZSLGdCQUNBLFVBRWEsRUFBQTVoQixrQkFBb0IsRUFBRzhVLFFBQU82SyxhQUFjLG9DQUV6RCxFQUFBM2Ysa0JBQWtCcWUsVUFBWSxDQUM1QnZKLE1BQU8sVUFBVWpQLE9BQ2pCOFosUUFBUyxVQUFVRixPLG9OQ1ByQixnQkFFQSxPQUdhLEVBQUFuRCwyQkFBNkIsQ0FBQyxhQU05QixFQUFBL2UsWUFBYyxFQUN6QndNLGFBT0EsTUFBTWpDLEVBQW1CLEVBQUF4TCxzQkFDekIsT0FDRSw4QkFBSXFXLFVBQVUscUJBQ1g1SSxFQUFPMUQsSUFBSSxDQUFDcUosRUFBTzJQLElBQ2xCLDhCQUFJNWpCLElBQUs0akIsR0FDUCx3QkFBQ3ZYLEVBQWlCMUksVUFBUyxDQUFDc1EsTUFBT0EsRUFBT29LLGFBQWEsZSxxTkN4QmpFLGdCQUNBLFVBQ0EsVUFDQSxPQUNBLE9BR2EsRUFBQTFaLHVCQUF5QixFQUFHdWMsWUFBVzdILFFBQU93TSxhQUN6RCwrQkFDRTNPLFVBQVcsK0JBQThCZ0ssRUFBWSxjQUFnQixLQUVyRSxpQ0FBT2hLLFVBQVUsMEJBQTBCbUMsR0FDM0MsK0JBQUtuQyxVQUFVLFlBQVkyTyxJQUcvQixFQUFBbGhCLHVCQUF1QmllLFVBQVksQ0FDakMxQixVQUFXLFVBQVVrRixVQUFVLENBQUMsVUFBVUgsT0FBUSxVQUFVUCxPQUM1RHJNLE1BQU8sVUFBVTBLLEtBQ2pCOEIsUUFBUyxVQUFVOUIsTUFZUixFQUFBcmYsaUJBQW9CekQsSUFDL0IsTUFBTW9MLEVBQW1CLEVBQUF4TCxzQkFHbkI2ZCxFQUFhLFVBQ2pCemQsRUFDQSxRQUNBLFFBQ0Esa0JBQ0EsZ0JBRUksT0FBRXFOLEdBQVcsRUFBQS9NLGlCQUViOGtCLEVBQXFCL1gsRUFBT2xHLE9BQy9CNkwsR0FBVUEsRUFBTTNPLE1BQVEyTyxFQUFNM08sT0FBU3JFLEVBQU1xRSxNQUUxQzRiLEVBQVltRixHQUFzQkEsRUFBbUI1Z0IsT0FDM0QsT0FDRSx3QkFBQzRHLEVBQWlCMUgsdUJBQXNCLENBQ3RDdWMsVUFBV0EsRUFDWDdILE1BQU9wWSxFQUFNb1ksTUFDYndNLFFBQVMsQ0FDUCx3QkFBQ3haLEVBQWlCN0gsZUFBYyxlQUM5QnhFLElBQUksb0JBQ0EwZSxFQUFVLENBQ2RwWixLQUFNLEdBQUdyRSxFQUFNcUUsUUFFakI0YixFQUNFLHdCQUFDN1UsRUFBaUJ2SyxZQUFXLENBQzNCOUIsSUFBSSxxQkFDSnNPLE9BQVErWCxJQUVSLFNBTVosRUFBQTNoQixpQkFBaUJrZSxVQUFZLENBQzNCdlIsY0FBZSxVQUFVbFIsT0FDekJtRixLQUFNLFVBQVU4RSxPQUNoQmlQLE1BQU8sVUFBVWpQLE9BQ2pCa0UsT0FBUSxVQUFVaEUsTUFBTXFiLFdBQ3hCeEYsZUFBZ0IsVUFBVWhnQixRQUc1QixVQUFlLEVBQUF1RSxrQiwyTEM1RWYsZ0JBRWEsRUFBQUUsZ0JBQWtCLEVBQUc2VSxhQUNoQyxNQUFNLE1BQUVKLEdBQVVJLEVBRWxCLE9BQU8sZ0NBQU12QyxVQUFVLHFCQUFxQm1DLEssdTZCQ0w5QyxnQkFFQSxPQVFNaU4sRUFBb0JybEIsSUFDeEIsTUFBTXdnQixFQUFhLEVBQUE1Z0IsdUJBQ2IsZ0JBQUUwWixHQUFvQnRaLEdBQ3RCLE1BQUVvWSxFQUFGLEtBQVNyYSxHQUFrQ3ViLEVBQXpCZ00sRUFBb0IsRUFBS2hNLEVBQTNDLGtCQUVOLE9BQ0Usd0JBQUNrSCxFQUFXdGMsU0FBUSxDQUNsQm5HLEtBQU1BLEVBQ05xYSxNQUFPQSxFQUNQa0IsZ0JBQWlCQSxHQUVqQixpREFDTWdNLEVBQW9CLENBQ3hCbFosR0FBSXJPLEVBRUpBLEtBQU1BLEVBQ05zSSxLQUFNckcsRUFBTXFHLFVBT1AsRUFBQW5DLFNBQ1hsRSxJQUdBLE1BQU0sZ0JBQUVzWixFQUFGLE1BQW1CbEIsRUFBbkIsS0FBMEJyYSxHQUFTaUMsRUFDekMsT0FDRSwrQkFBS2lXLFVBQVcsYUFBYWxZLEdBQzNCLGlDQUFPd25CLFFBQVN4bkIsR0FBT3FhLEdBQ3RCcFksRUFBTTJRLFdBS2IsTUFBTTZVLEVBQXFCeGxCLElBQ3pCLE1BQU0sZ0JBQUVzWixFQUFGLFFBQW1CeFIsRUFBVSxJQUFPOUgsR0FDcEMsTUFBRW9ZLEVBQUYsS0FBU3JhLEdBQVN1YixFQUN4QixJQUFLdFUsTUFBTUMsUUFBUTZDLEdBQ2pCLE1BQU0sSUFBSXRILE1BQU0sNERBRWxCLE1BQU1nZ0IsRUFBYSxFQUFBNWdCLHNCQUNuQixPQUNFLHdCQUFDNGdCLEVBQVd0YyxTQUFRLENBQ2xCbkcsS0FBTUEsRUFDTnFhLE1BQU9BLEVBQ1BrQixnQkFBaUJBLEdBR2pCLGtEQUNPQSxHQUVKeFIsRUFBUTZCLElBQUksRUFBR3lPLFFBQU8zWixXQUNyQixrQ0FBUU0sSUFBS04sRUFBTzJaLE1BQU9BLEVBQU8zWixNQUFPQSxRQU10QyxFQUFBaUQscUJBQXdCMUIsR0FDbkMsd0JBQUNxbEIsRUFBZ0IsZUFBQ2hmLEtBQUssUUFBV3JHLElBRXZCLEVBQUFpQyxzQkFBeUJqQyxHQUNwQyx3QkFBQ3FsQixFQUFnQixlQUFDaGYsS0FBSyxZQUFlckcsSUFFM0IsRUFBQWdDLG9CQUF1QmhDLEdBQ2xDLHdCQUFDcWxCLEVBQWdCLGVBQUNoZixLQUFLLFVBQWFyRyxJQUV6QixFQUFBd0MsaUJBQW9CeEMsR0FDL0Isd0JBQUNxbEIsRUFBZ0IsZUFBQ2hmLEtBQUssT0FBVXJHLElBRXRCLEVBQUEyQixtQkFBc0IzQixHQUNqQyx3QkFBQ3FsQixFQUFnQixlQUFDaGYsS0FBSyxTQUFZckcsSUFFeEIsRUFBQXNDLHNCQUF5QnRDLEdBQVUsb0RBQWNBLElBRWpELEVBQUFzQixzQkFBeUJ0QixHQUNwQyx3QkFBQ3dsQixFQUFpQixlQUFDbmYsS0FBSyxZQUFlckcsSUFHNUIsRUFBQXVCLDJCQUE4QnZCLEdBQ3pDLHdCQUFDLEVBQUFvQyw0QkFBMkIsaUJBQUtwQyxJQUd0QixFQUFBa0Msd0JBQTJCbEMsSUFDdEMsTUFBTSxnQkFBRXNaLEVBQUYsUUFBbUJ4UixFQUFVLElBQU85SCxHQUNwQyxNQUFFb1ksRUFBRixLQUFTcmEsR0FBU3ViLEVBQ3hCLElBQUt0VSxNQUFNQyxRQUFRNkMsR0FDakIsTUFBTSxJQUFJdEgsTUFBTSxvREFFbEIsTUFBTWdnQixFQUFhLEVBQUE1Z0Isc0JBQ25CLE9BQ0Usd0JBQUM0Z0IsRUFBV3RjLFNBQVEsQ0FDbEJuRyxLQUFNQSxFQUNOcWEsTUFBT0EsRUFDUGtCLGdCQUFpQkEsR0FHaEJ4UixFQUFRNkIsSUFBSzZPLElBRVosTUFBTSxNQUFFL1osRUFBRixNQUFTMlosR0FBVUksRUFDekIsT0FDRSwrQkFBS3paLElBQUtOLEVBQU93WCxVQUFVLCtCQUN6Qix3QkFBQ3VLLEVBQVc3YyxnQkFBZSxDQUFDNlUsT0FBUUEsSUFDcEMsaUNBQ0VuUyxLQUFLLFFBQ0wrRixHQUFJM04sRUFDSlYsS0FBTUEsRUFDTmdCLElBQUtOLEVBQ0xBLE1BQU9BLFNBUVIsRUFBQTBELG9CQUF1Qm5DLEdBQ2xDLHdCQUFDd2xCLEVBQWlCLGlCQUFLeGxCLElBRVosRUFBQW9DLDRCQUErQnBDLElBQzFDLE1BQU13Z0IsRUFBYSxFQUFBNWdCLHNCQUNuQixPQUFPLHdCQUFDNGdCLEVBQVdyZSxvQkFBbUIsZUFBQ3NqQixVQUFRLEdBQUt6bEIsS0FFekMsRUFBQXdCLGtCQUFxQnhCLEdBQ2hDLHdCQUFDcWxCLEVBQWdCLGVBQUNoZixLQUFLLFFBQVdyRyxJQU92QixFQUFBeUIsc0JBQXlCekIsR0FDcEMsd0JBQUNxbEIsRUFBZ0IsZUFBQ2hmLEtBQUssa0JBQXFCckcsSUFFakMsRUFBQXVDLGtCQUFxQnZDLEdBQ2hDLHdCQUFDcWxCLEVBQWdCLGVBQUNoZixLQUFLLFFBQVdyRyxJQUV2QixFQUFBcUMsd0JBQTJCckMsR0FBVSwrQ0FBT21RLFVBQVEsR0FBS25RLElBQ3pELEVBQUE2QixvQkFBdUI3QixHQUNsQyx1Q0FDVyxFQUFBcUIsMEJBQTZCckIsR0FDeEMsOEMseXRCQ2pKRixjQUNBLFVBSUEsT0FDQSxXQUNBLE9BRUEsT0FHYSxFQUFBbWQscUJBQXdCbmQsSUFFbkMsTUFBTSxVQUNKc2hCLEVBREksWUFHSm9FLEVBSEksS0FJSnJoQixFQUpJLGdCQUtKaVYsRUFBa0IsR0FMZCxlQU1KN0QsRUFBaUIsR0FOYixrQkFPSmtRLEVBUEksZ0JBUUpuRSxHQUNFeGhCLEdBRUUsb0JBQUVrWCxHQUF3QixFQUFBNVcsaUJBRTFCa2dCLEVBQWEsRUFBQTVnQix1QkFNYixNQUFFbkIsRUFBRixNQUFTMlosR0FBVWtCLEdBR2xCc00sRUFBYUMsR0FBa0IsRUFBQS9TLFlBSy9CZ1QsR0FBeUIsUUFBRS9lLEVBQUYsTUFBV2lNLEVBQVgsS0FBa0J0TyxJQUFVLEVBQUF5YyxhQUMxRCxVQUE4QndFLEtBQzlCLENBQ0V2WSxVQUFXLENBQUV3WSxpQkFJakIsR0FBSTVTLEVBRUYsTUFBTSxJQUFJeFMsTUFBTXdTLEVBQU02SSxTQUd4QixNQUFNa0ssRUFBc0JyaEIsR0FBUThjLEVBQWdCLENBQUU5YyxTQUloRHNoQixFQUNKMUUsR0FDQUUsRUFBZ0IsQ0FBRTljLEtBQU00YyxJQUFhbmEsT0FBUXJKLEdBQzFDVyxFQUFxQjRJLFNBQVN2SixFQUFFVyxRQVFyQyxPQUNFLHdCQUFDK2hCLEVBQVd0YyxTQUFRLGlCQUNkbEUsRUFBSyxDQUNUakMsS0FBTXNHLElBR04sd0JBQUMsRUFBQTRoQixlQUFjLGlCQUNUM00sRUFBZSxDQUNuQm1NLFVBQVEsRUFDUnJGLFNBQVc4RixJQUNULE1BQU1DLEVBQWNELEVBQVN2YyxJQUUzQixFQUFHbEwsV0FBWUEsR0FFakJ5WSxFQUFvQixDQUFFLENBQUM3UyxHQUFPOGhCLEtBRWhDcmUsUUFBU2llLEVBQ1QzWixHQUFJL0gsRUFFSitoQixXQUFZLENBQUVoYSxHQUFJL0gsR0FDbEJ3ZCxJQUFLNkQsRUFDTFcsU0FBV1QsSUFDVEMsRUFBZUQsR0FDZkUsS0FFRlEsVUFBV3ZmLEVBQ1htZixTQUFVRixRLGNDdEdsQnpvQixFQUFPRCxRQUFVa0MsUUFBUSw4QixjQ0F6QmpDLEVBQU9ELFFBQVVrQyxRQUFRLGdCLGloQkNBekIsZ0JBR2EsRUFBQW9CLE9BQW9CLEksSUFBQSxTQUFFK1AsR0FBUSxFQUFLM1EsRUFBSyxJQUFwQixjQUEyQixPQUMxRCxrREFBWUEsR0FBUTJRLEssbUxDSnRCLGdCQUVhLEVBQUExTSxRQUFVLElBQ3JCLDRDQUFnQixTQUFRLFlBQVcsUUFBTSxlLHdoQkNIM0MsZ0JBQ0EsT0FFYSxFQUFBbEQsY0FBaUIsSSxJQUFBLFFBQzVCZ0csRUFENEIsTUFFNUJxUixFQUY0QixRQUc1QnVJLEVBSDRCLFNBSTVCaFEsRUFKNEIsVUFLNUJzRixFQUFZLElBQUUsRUFDWHNRLEVBQUksSUFOcUIsc0RBUTVCLE1BQU0vRixFQUFhLEVBQUE1Z0Isc0JBTWI0bUIsRUFBYXpmLEVBQVUsQ0FBRTBmLFFBQVMsSUFBUSxHQUUxQ0MsRUFBOEIzZixFQUNoQyxDQUNFNGYsU0FBVSxXQUNWQyxJQUFLLEVBQ0xDLE9BQVEsRUFDUkMsS0FBTSxFQUNOQyxNQUFPLEVBQ1BDLFFBQVMsT0FDVEMsZUFBZ0IsU0FDaEJDLFdBQVksVUFFZCxDQUFFRixRQUFTLFFBRWYsT0FDRSx3QkFBQ3hHLEVBQVc1ZixPQUFNLGVBQ2hCcVYsVUFBVyxrQkFDVGxQLEVBQVUseUJBQTJCLCtCQUNuQ2tQLElBQ0owSyxRQUFTQSxHQUNMNEYsR0FFSixnQ0FBTVksTUEzQjBCLENBQ2xDUixTQUFVLGFBMkJOLGdDQUFNUSxNQUFPWCxHQUFhcE8sR0FBU3pILEdBQ25DLGdDQUFNd1csTUFBT1QsR0FDWCx3QkFBQ2xHLEVBQVd2YyxRQUFPLFcsKzdCQ3pCN0IsZ0JBRUEsT0FDQSxPQW1EYSxFQUFBakQsZUFBa0JoQixJQUM3QixNQUFNd2dCLEVBQWEsRUFBQTVnQix1QkFDWm1ILEVBQVNxZ0IsR0FBYyxFQUFBdFUsVUFBa0IsSUFDekNFLEVBQU9xVSxHQUFZLEVBQUF2VSxZQUVwQixTQUVKd1UsRUFGSSxrQkFHSkMsRUFISSxtQkFJSkMsR0FDRXhuQixFQUNFeW5CLEVBQ2dCLGlCQUFiSCxFQUNILEVBQUExYixHQUFHO1lBQ0MwYjtVQUVKQSxHQUNDSSxHQUFnQixFQUFBQyxZQUFZRixFQUFnQixDQUNqRHJhLFVBQVdtYSxJQW1EUEssRUFDSix3QkFBQ3BILEVBQVd6ZixjQUFhLGVBQ3ZCZ0csUUFBU0EsRUFDVDRaLFFBbkR1QmlDLEdBQUssb0NBQzlCQSxFQUFFbk8saUJBQ0YyUyxHQUFXLEdBQ1hDLE9BQVNobkIsR0FDVCxNQUFNLGVBRUp3VSxFQUZJLGdCQUdKVixFQUhJLGNBSUpHLEdBQ0V0VSxFQUlKLElBQ002VSxVQUNJQSxLQUVSLE1BQU1sUSxRQUFlK2lCLElBQ2pCdlQsVUFDSUEsRUFBZ0J4UCxJQUV4QixNQUFPcU8sR0FFUHFVLEVBQVNyVSxHQUNMc0IsVUFDSUEsRUFBY3RCLElBWnhCLFFBZUVvVSxHQUFXLFFBd0JQSSxJQUlSLE9BQUl4VSxFQUVBLHdCQUFDd04sRUFBV3ZmLGVBQWMsQ0FBQzRtQixRQUFTRCxFQUFlRSxhQUFhLEdBQzdEOVUsRUFBTTZJLFFBQVFrTSxRQUFRLGtCQUFtQixLQUl6Q0gsSSw2bkJDNUpULGdCQWdDQSxNQUFhOW1CLFVBQWlCLEVBQUFrbkIsY0FDNUIsU0FDRTdVLFFBQVE4VSxLQUNOLG1IQUVGLE1BQU0sSUFBRUMsRUFBRixNQUFPN1IsRUFBUCxZQUFja0QsRUFBZCxRQUEyQjRPLEVBQTNCLFdBQW9DQyxHQUFlaFUsS0FBS3BVLE1BQzlELElBQUlxb0IsRUFBUWpVLEtBQUtwVSxNQUFNcW9CLE1BMEJ2QixPQVJNQSxJQUFrQyxJQUF6QkEsRUFBTUMsUUFBUSxRQUVILE1BQXBCRCxFQUFNRSxPQUFPLEtBQ2ZGLEVBQVFBLEVBQU0xSyxNQUFNLElBRXRCMEssRUFBeUJGLEVBQVVFLEdBSW5DLGdEQUNFLHFDQUFRaFMsR0FFUixnQ0FBTW1TLFFBQVEsVUFDZCxnQ0FBTXpxQixLQUFLLGNBQWM2bUIsUUFBU3JMLElBQ2xDLGdDQUFNeGIsS0FBSyxXQUFXNm1CLFFBQVEsd0NBRzlCLGdDQUFNemxCLFNBQVMsVUFBVXlsQixRQUFRLFlBQ2pDLGdDQUFNemxCLFNBQVMsU0FBU3lsQixRQUFTc0QsSUFDakMsZ0NBQU0vb0IsU0FBUyxXQUFXeWxCLFFBQVN5RCxJQUNuQyxnQ0FBTWxwQixTQUFTLFdBQVd5bEIsUUFBU3ZPLElBQ25DLGdDQUFNbFgsU0FBUyxpQkFBaUJ5bEIsUUFBU3JMLElBR3pDLGdDQUFNeGIsS0FBSyxlQUFlNm1CLFFBQVEsWUFDbEMsZ0NBQU03bUIsS0FBSyxvQkFBb0I2bUIsUUFBU3lELElBQ3hDLGdDQUFNdHFCLEtBQUssZ0JBQWdCNm1CLFFBQVN2TyxJQUNwQyxnQ0FBTXRZLEtBQUssc0JBQXNCNm1CLFFBQVNyTCxJQUUxQyxnQ0FBTWtQLElBQUksWUFBWUMsS0FBTVIsSUFDNUIsZ0NBRUVPLElBQUksZ0JBQ0pDLEtBQU1OLEdBQWMsbUJBekQ5QixjLDBMQzFCQSxnQkFPYSxFQUFBbm5CLGVBQWlCLEVBQzVCMFAsV0FDQWtYLGFBSU8sK0JBQUt4UixNQUFPMUYsR0FBV2tYLEksaWdCQ2xCaEMsZ0JBQ0EsVUFDQSxZQUNBLFlBQ0EsWUFDQSxPQVNNYyxFQUFRLEksSUFBQSxNQUNaaEcsRUFEWSxRQUdaaUcsRUFIWSxNQUlaeFEsRUFKWSxVQUtaeVEsRUFMWSxlQU1aQyxFQUFpQixHQU5MLFVBT1pDLEdBQVMsRUFFTnhDLEVBQUksSUFUSyxzRUFXWixNQUFNL0YsRUFBYSxFQUFBNWdCLHNCQUNuQixJQUFJb3BCLEVBR0ZBLEVBREVILEVBQ2MsVUFBTW5ILGFBQWFtSCxFQUFXQyxHQUNyQ0YsRUFDTyx3QkFBQ3BJLEVBQVczYyxpQkFBZ0IsQ0FBQ3VJLEdBQUl3YyxJQUVqQyxvQ0FBT3hRLEdBa0J6QixPQWRFLHdCQUFDLFVBQVksZUFBQzZRLFNBQVV0RyxHQUFXb0csRUFBZXhDLEdBQy9DeUMsSUFnQlBMLEVBQUtoSCxVQUFZLENBQ2ZnQixNQUFPLFVBQVVxQyxPQUNqQmtFLEdBQUksVUFBVUMsSUFDZFAsUUFBUyxVQUFVemYsT0FDbkJpUCxNQUFPLFVBQVVqUCxPQUNqQjBmLFVBQVcsVUFBVTNwQixPQUNyQjRwQixlQUFnQixVQUFVNXBCLE9BQzFCNnBCLFVBQVcsVUFBVTdwQixRQU92QixNQUFNa3FCLEVBQVEsSSxJQUFBLGNBQUVDLEdBQWEsRUFBSzlDLEVBQUksSUFBeEIsbUJBQ1osT0FDRSxnREFDRSx3QkFBQ29DLEVBQUksaUJBQUtwQyxJQUNUOEMsS0FBbUJBLEVBQWM3a0IsUUFDaEMsK0JBQUt5UixVQUFVLHNCQUNab1QsRUFBYzFmLElBQUksQ0FBQ0wsRUFBTXFaLElBQ3hCLHdCQUFDZ0csRUFBSSxlQUFDNXBCLElBQUs0akIsR0FBV3JaLFFBUWxDOGYsRUFBS3pILFVBQVksQ0FDZjBILGNBQWUsVUFBVWhnQixPQUczQixNQUFNaWdCLEVBQXFCLEksSUFBQSxNQUN6QmxSLEVBRHlCLFFBRXpCd1EsRUFGeUIsUUFHekJmLEVBSHlCLFVBSXpCMEIsRUFKeUIsYUFLekJDLEVBTHlCLFFBTXpCOUcsRUFBVSxXQU5lLFlBT3pCK0csR0FBVyxFQUNSQyxFQUFhLElBUlMsa0ZBVXpCLE1BQU1sSixFQUFhLEVBQUE1Z0Isc0JBQ2IrcEIsRUFBV0gsR0FFYkQsRUFBVTVmLElBQUksQ0FBQ0wsRUFBTXFaLElBQ04sWUFBVHJaLEVBQ0ssd0JBQUMsVUFBU3NnQixRQUFPLENBQUM3cUIsSUFBSzRqQixJQUV2Qix3QkFBQ3lHLEVBQUksaUJBQUs5ZixFQUFJLENBQUV2SyxJQUFLNGpCLEVBQU9BLE1BQU9BLE1BSWxELE1BQWdCLFNBQVpELEVBQ0tpSCxFQUVIOUIsRUFHQSx3QkFBQyxVQUFRLGlCQUFLNkIsR0FDWix3QkFBQyxVQUFTRyxPQUFNLEtBQUVoQyxHQUNsQix3QkFBQyxVQUFTaUMsS0FBSSxLQUFFSCxJQU1sQix3QkFBQyxVQUFjLGlCQUNURixFQUFXLENBQ2ZwVCxNQUFPdVMsRUFBVSx3QkFBQ3BJLEVBQVczYyxpQkFBZ0IsQ0FBQ3VJLEdBQUl3YyxJQUFjeFEsR0FDNURzUixHQUVIQyxJQU9YTCxFQUFrQjNILFVBQVksQ0FDNUJpSCxRQUFTLFVBQVV6ZixPQUNuQmlQLE1BQU8sVUFBVWpQLE9BQ2pCMGUsUUFBUyxVQUFVM29CLE9BQ25Cc3FCLGFBQWMsVUFBVXRxQixPQUN4QnFxQixVQUFXLFVBQVVsZ0IsTUFDckJxWixRQUFTLFVBQVV2WixPQUNuQnNnQixZQUFhLFVBQVV2cUIsUUFHekIsVUFBZW9xQixHLGNDakpmL3JCLEVBQU9ELFFBQVVrQyxRQUFRLDZCLGNDQXpCakMsRUFBT0QsUUFBVWtDLFFBQVEsaUMsY0NBekJqQyxFQUFPRCxRQUFVa0MsUUFBUSxtQyxzZUNBekIsV0FDQSxhLG9pQkNJQSxnQkFFQSxRQU1hLEVBQUF1cUIsMEJBQTZCLEksSUFBQSxNQUN4Q3RyQixHQUFLLEVBQ0Z1QixFQUFLLElBRmdDLFdBTXBDLE9BQ0osd0JBQUMsRUFBQTRHLHlCQUF5QmtRLFNBQVEsZUFDaENyWSxNQUFPQSxHQUNIdUIsTSw2VENyQlIsZ0JBR2EsRUFBQXdnQixXQUFhLEdBQ2IsRUFBQXdKLGdCQUFrQixHQUVsQixFQUFBQyxlQUFpQixDQUM1QixRQUNBLFNBQ0EsUUFDQSxlQUNBLFFBQ0Esd0JBQ0EsNkJBQ0Esb0JBQ0EscUJBQ0Esd0JBQ0EsdUJBQ0Esb0JBQ0EscUJBQ0Esc0JBQ0EsMEJBQ0Esc0JBQ0EsOEJBQ0EsMEJBQ0Esd0JBQ0Esb0JBQ0EsbUJBQ0EscUJBQ0EsY0FDQSxlQXdEVyxFQUFBQyxnQkFBbUJuc0IsS0FDWixFQUFBaXNCLGdCQUFnQmpzQixHQTZFdkIsRUFBQW9zQixnQkFBbUJwc0IsR0FDdkIsRUFBQWlzQixnQkFBZ0Jqc0IsR0FBTXFzQixhQTBEbEIsRUFBQUMscUJBQXVCLENBQ2xDeEIsRUFDQTdvQixLQUVBLEdBQUs2b0IsRUFLSyxJQUFJLFVBQU1wSCxlQUFlb0gsR0FDakMsT0FBTyxVQUFNbkgsYUFBYW1ILEVBQVc3b0IsR0FDaEMsR0FDZ0IsbUJBQWQ2b0IsR0FDUEEsRUFBVXpwQixXQUNWeXBCLEVBQVV6cEIsVUFBVWtyQixpQkFDcEIsQ0FDQSxNQUFNQyxFQUFZMUIsRUFDbEIsT0FBTyx3QkFBQzBCLEVBQVMsaUJBQUt2cUIsSUFDakIsR0FBeUIsbUJBQWQ2b0IsRUFDaEIsT0FBT0EsRUFBVTdvQixHQUNaLEdBQ2dCLGlCQUFkNm9CLEdBQ1BBLEVBQVUyQixVQUNWM0IsRUFBVTRCLE9BQ1YsQ0FDQSxNQUFNRixFQUFZMUIsRUFDbEIsT0FBTyx3QkFBQzBCLEVBQVMsaUJBQUt2cUIsSUFFdEIsT0FBTzZvQixFQXZCUCxPQUFPLE1Ba0RFLEVBQUE2QixpQkFBb0Izc0IsR0FDdkJpQyxJQUNOLE1BQU11cUIsRUFBWSxFQUFBL0osV0FBV3ppQixJQUFTLEtBQ3RDLE9BQU93c0IsR0FBYSx3QkFBQ0EsRUFBUyxpQkFBS3ZxQixLQWMxQixFQUFBMnFCLG9CQUF1QkMsR0FDbENBLEVBQWMsK0JBQU0sRUFBQXBLLFlBQWVvSyxHQUFpQixFQUFBcEsiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMzApO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7IiwiaW1wb3J0IHsgZGVwcmVjYXRlIH0gZnJvbSBcIkB2dWxjYW5qcy91dGlsc1wiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgVnVsY2FuQ29tcG9uZW50c0NvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5cbmV4cG9ydCBjb25zdCBWdWxjYW5Db21wb25lbnRzQ29uc3VtZXIgPSBWdWxjYW5Db21wb25lbnRzQ29udGV4dC5Db25zdW1lcjtcblxuZXhwb3J0IGNvbnN0IHVzZVZ1bGNhbkNvbXBvbmVudHMgPSAoKSA9PiB7XG4gIGNvbnN0IHZhbCA9IHVzZUNvbnRleHQoVnVsY2FuQ29tcG9uZW50c0NvbnRleHQpO1xuICByZXR1cm4gdmFsO1xufTtcblxuZXhwb3J0IGNvbnN0IHdpdGhWdWxjYW5Db21wb25lbnRzID0gKEMpID0+IChwcm9wcykgPT4ge1xuICBjb25zdCB2dWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBkZXByZWNhdGUoXG4gICAgXCIwLjAuMFwiLFxuICAgIFwiVXNpbmcgd2l0aFZ1bGNhbkNvbXBvbmVudHMgSE9DID0+IHByZWZlciB1c2VWdWxjYW5Db21wb25lbnRzIHdpdGggaG9va3NcIlxuICApO1xuICByZXR1cm4gPEMgdnVsY2FuQ29tcG9uZW50cz17dnVsY2FuQ29tcG9uZW50c30gey4uLnByb3BzfSAvPjtcbn07XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbnRlcmZhY2UgRm9ybUNvbnRleHRWYWx1ZSB7XG4gIGFkZFRvRGVsZXRlZFZhbHVlczogRnVuY3Rpb247XG4gIGFkZFRvRmFpbHVyZUZvcm06IEZ1bmN0aW9uO1xuICBhZGRUb1N1Ym1pdEZvcm06IEZ1bmN0aW9uO1xuICBhZGRUb1N1Y2Nlc3NGb3JtOiBGdW5jdGlvbjtcbiAgY2xlYXJGb3JtOiBGdW5jdGlvbjtcbiAgY2xlYXJGb3JtQ2FsbGJhY2tzOiBGdW5jdGlvbjtcbiAgY2xlYXJGaWVsZEVycm9yczogRnVuY3Rpb247XG4gIGN1cnJlbnRWYWx1ZXM6IG9iamVjdDtcbiAgZGVsZXRlZFZhbHVlczogQXJyYXk8YW55PjtcbiAgZXJyb3JzOiBBcnJheTxhbnk+O1xuICBnZXREb2N1bWVudDogRnVuY3Rpb247XG4gIGdldExhYmVsOiAoZmllbGROYW1lOiBzdHJpbmcsIGZpZWxkTG9jYWxlPzogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIGluaXRpYWxEb2N1bWVudDogb2JqZWN0O1xuICBpc0NoYW5nZWQ6IGJvb2xlYW47XG4gIHJlZmV0Y2hGb3JtOiBGdW5jdGlvbjtcbiAgLy8gVE9ETzogd2UgZGVwcmVjYXRlIHRoaXMsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBhbGxvdyBhIGNoaWxkIHRvIHNldFN0YXRlIHRoaXMgd2F5XG4gIC8vIHNldEZvcm1TdGF0ZTogRnVuY3Rpb247XG4gIC8vIEZJWE1FOiB0aGlzIHR5cGUgZG9lc24ndCB3b3JrLCBpdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgdGhlIGV2ZW50ICsgaXQgaGFzIHRvIGJlIGRlZmluZWRcbiAgc3VibWl0Rm9ybTogRnVuY3Rpb247IC8vUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTEZvcm1FbGVtZW50PltcIm9uU3VibWl0XCJdO1xuICB0aHJvd0Vycm9yOiBGdW5jdGlvbjtcbiAgdXBkYXRlQ3VycmVudFZhbHVlczogRnVuY3Rpb247XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtQ29udGV4dCA9XG4gIFJlYWN0LmNyZWF0ZUNvbnRleHQ8Rm9ybUNvbnRleHRWYWx1ZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuZXhwb3J0IGNvbnN0IHVzZUZvcm1Db250ZXh0ID0gKCkgPT4ge1xuICBjb25zdCBmb3JtQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICBpZiAoIWZvcm1Db250ZXh0KVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQSBjb21wb25lbnQgaXMgdHJ5aW5nIHRvIGFjY2VzcyBmb3JtIGNvbnRleHQgYnV0IGl0IGlzIHVuZGVmaW5lZC4gUGxlYXNlIHdyYXAgeW91ciBjb21wb25lbnQgd2l0aCBhIDxGb3JtPi5cIlxuICAgICk7XG4gIHJldHVybiBmb3JtQ29udGV4dDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvaTE4blwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvdXRpbHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJvcC10eXBlc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYXBvbGxvL2NsaWVudFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvZ2V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9vbWl0XCIpOyIsImV4cG9ydCAqIGZyb20gXCIuL1Byb3ZpZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Db250ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Db25zdW1lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwaW5nc1wiO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2NvbXBhY3RcIik7IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQgeyBEdW1teSB9IGZyb20gXCIuL0R1bW15XCI7XG5cbi8vIFdlIG5lZWQgdGhpcyB0byBzaHV0IFR5cGVTY3JpcHQgdXBcbi8vIFlvdSBzaG91bGQgdXNlIHRoZSBQcm92aWRlciB0byBnZXQgdGhlIHJpZ2h0IGRlZmF1bHQgdmFsdWVzXG5leHBvcnQgY29uc3QgVnVsY2FuQ29tcG9uZW50c0NvbnRleHQgPVxuICBSZWFjdC5jcmVhdGVDb250ZXh0PFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cz4oe1xuICAgIF9fbm90X2ludGlhbGl6ZWQ6IHRydWUsXG4gICAgQWxlcnQ6IER1bW15LFxuICAgIEJ1dHRvbjogRHVtbXksXG4gICAgRmllbGRFcnJvcnM6IER1bW15LFxuICAgIEhlYWRUYWdzOiBEdW1teSxcbiAgICBMb2FkaW5nQnV0dG9uOiBEdW1teSxcbiAgICBNdXRhdGlvbkJ1dHRvbjogRHVtbXksXG4gICAgVG9vbHRpcFRyaWdnZXI6IER1bW15LFxuICAgIERyb3Bkb3duOiBEdW1teSxcbiAgICAvLyBmb3JtXG4gICAgRm9ybTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudEF1dG9jb21wbGV0ZTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudENoZWNrYm94OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudERhdGU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnREYXRlVGltZTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudERlZmF1bHQ6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRFbWFpbDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudElubmVyOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50TGlrZXJ0OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50TG9hZGVyOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnROdW1iZXI6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRQYXNzd29yZDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudFJhZGlvR3JvdXA6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRTZWxlY3Q6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRTZWxlY3RNdWx0aXBsZTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudFN0YXRpY1RleHQ6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRUZXh0YXJlYTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudFRpbWU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRVcmw6IER1bW15LFxuICAgIEZvcm1FbGVtZW50OiBEdW1teSxcbiAgICBGb3JtRXJyb3I6IER1bW15LFxuICAgIEZvcm1FcnJvcnM6IER1bW15LFxuICAgIEZvcm1Hcm91cDogRHVtbXksXG4gICAgRm9ybUdyb3VwSGVhZGVyOiBEdW1teSxcbiAgICBGb3JtR3JvdXBMYXlvdXQ6IER1bW15LFxuICAgIEZvcm1JbnRsOiBEdW1teSxcbiAgICBGb3JtSW50bEl0ZW1MYXlvdXQ6IER1bW15LFxuICAgIEZvcm1JbnRsTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkQXJyYXk6IER1bW15LFxuICAgIEZvcm1OZXN0ZWRBcnJheUlubmVyTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkQXJyYXlMYXlvdXQ6IER1bW15LFxuICAgIEZvcm1OZXN0ZWREaXZpZGVyOiBEdW1teSxcbiAgICBGb3JtTmVzdGVkSXRlbTogRHVtbXksXG4gICAgRm9ybU5lc3RlZEl0ZW1MYXlvdXQ6IER1bW15LFxuICAgIEZvcm1OZXN0ZWRPYmplY3Q6IER1bW15LFxuICAgIEZvcm1OZXN0ZWRPYmplY3RMYXlvdXQ6IER1bW15LFxuICAgIEZvcm1PcHRpb25MYWJlbDogRHVtbXksXG4gICAgRm9ybVN1Ym1pdDogRHVtbXksXG4gICAgRm9ybWF0dGVkTWVzc2FnZTogRHVtbXksXG4gICAgSWNvbjogRHVtbXksXG4gICAgSWNvbkFkZDogRHVtbXksXG4gICAgSWNvblJlbW92ZTogRHVtbXksXG4gICAgTG9hZGluZzogRHVtbXksXG4gICAgRm9ybUl0ZW06IER1bW15LFxuICB9KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9waWNrXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiKTsiLCJpbXBvcnQgbWVyZ2UgZnJvbSBcImxvZGFzaC9tZXJnZVwiO1xuaW1wb3J0IGZpbmQgZnJvbSBcImxvZGFzaC9maW5kXCI7XG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tIFwibG9kYXNoL2lzUGxhaW5PYmplY3RcIjtcbmltcG9ydCBzZXQgZnJvbSBcImxvZGFzaC9zZXRcIjtcbmltcG9ydCBzaXplIGZyb20gXCJsb2Rhc2gvc2l6ZVwiO1xuXG5pbXBvcnQgeyByZW1vdmVQcmVmaXgsIGZpbHRlclBhdGhzQnlQcmVmaXggfSBmcm9tIFwiLi9wYXRoX3V0aWxzXCI7XG5pbXBvcnQgeyBWdWxjYW5GaWVsZFNjaGVtYSB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5cbi8vIGFkZCBzdXBwb3J0IGZvciBuZXN0ZWQgcHJvcGVydGllc1xuZXhwb3J0IGNvbnN0IGRlZXBWYWx1ZSA9IGZ1bmN0aW9uIChvYmosIHBhdGgpIHtcbiAgY29uc3QgcGF0aEFycmF5ID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBvYmogPSBvYmpbcGF0aEFycmF5W2ldXTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG4vLyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTA5ODc5Ny9mYXN0ZXN0LXdheS10by1mbGF0dGVuLXVuLWZsYXR0ZW4tbmVzdGVkLWpzb24tb2JqZWN0c1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZ1bmN0aW9uIHJlY3Vyc2UoY3VyLCBwcm9wKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjdXIpICE9PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBjdXI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY3VyLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAgcmVjdXJzZShjdXJbaV0sIHByb3AgKyBcIltcIiArIGkgKyBcIl1cIik7XG4gICAgICBpZiAobCA9PSAwKSByZXN1bHRbcHJvcF0gPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlzRW1wdHkgPSB0cnVlO1xuICAgICAgZm9yICh2YXIgcCBpbiBjdXIpIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICByZWN1cnNlKGN1cltwXSwgcHJvcCA/IHByb3AgKyBcIi5cIiArIHAgOiBwKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VtcHR5ICYmIHByb3ApIHJlc3VsdFtwcm9wXSA9IHt9O1xuICAgIH1cbiAgfVxuICByZWN1cnNlKGRhdGEsIFwiXCIpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRW1wdHlWYWx1ZSA9ICh2YWx1ZSkgPT5cbiAgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiIHx8XG4gIHZhbHVlID09PSBudWxsIHx8XG4gIHZhbHVlID09PSBcIlwiIHx8XG4gIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApO1xuXG4vKipcbiAqIE1lcmdlcyB2YWx1ZXMuIEl0IHRha2VzIGludG8gYWNjb3VudCB0aGUgY3VycmVudCwgb3JpZ2luYWwgYW5kIGRlbGV0ZWQgdmFsdWVzLFxuICogYW5kIHRoZSBtZXJnZSBwcm9kdWNlcyB0aGUgcHJvcGVyIHR5cGUgZm9yIHNpbXBsZSBvYmplY3RzIG9yIGFycmF5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAqICBGb3JtIGNvbXBvbmVudCBwcm9wcy4gT25seSBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciB0aGlzIGZ1bmN0aW9uIGFyZSBkb2N1bWVudGVkLlxuICogQHBhcmFtIHsqfSBwcm9wcy5jdXJyZW50VmFsdWVcbiAqICBDdXJyZW50IHZhbHVlIG9mIHRoZSBmaWVsZFxuICogQHBhcmFtIHsqfSBwcm9wcy5kb2N1bWVudFZhbHVlXG4gKiAgT3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZpZWxkXG4gKiBAcmV0dXJuIHsqfHVuZGVmaW5lZH1cbiAqICBNZXJnZWQgdmFsdWUgb3IgdW5kZWZpbmVkIGlmIG5vIG1lcmdlIHdhcyBwZXJmb3JtZWRcbiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlVmFsdWUgPSAoe1xuICBjdXJyZW50VmFsdWUsXG4gIGRvY3VtZW50VmFsdWUsXG4gIGRlbGV0ZWRWYWx1ZXM6IGRlbGV0ZWRGaWVsZHMsXG4gIHBhdGgsXG4gIGxvY2FsZSxcbiAgZGF0YXR5cGUsXG59KSA9PiB7XG4gIGlmIChsb2NhbGUpIHtcbiAgICAvLyBub3RlOiBpbnRsIGZpZWxkcyBhcmUgb2YgdHlwZSBPYmplY3QgYnV0IHNob3VsZCBiZSB0cmVhdGVkIGFzIFN0cmluZ3NcbiAgICByZXR1cm4gY3VycmVudFZhbHVlIHx8IGRvY3VtZW50VmFsdWUgfHwgXCJcIjtcbiAgfVxuXG4gIC8vIG5vdGU6IHJldHJpZXZlIG5lc3RlZCBkZWxldGVkIHZhbHVlcyBpcyBwZXJmb3JtZWQgaGVyZSB0byBhdm9pZCBza2lwcGluZ1xuICAvLyB0aGUgbWVyZ2UgaW4gY2FzZSB0aGUgY3VycmVudCBmaWVsZCBpcyBub3QgaW4gYGN1cnJlbnRWYWx1ZXNgIGJ1dCBhIG5lc3RlZFxuICAvLyBwcm9wZXJ0eSBoYXMgYmVlbiByZW1vdmVkIGRpcmVjdGx5IGJ5IHBhdGhcbiAgY29uc3QgZGVsZXRlZFZhbHVlcyA9IGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMocGF0aCwgZGVsZXRlZEZpZWxkcyk7XG4gIGNvbnN0IGhhc0RlbGV0ZWRWYWx1ZXMgPSAhIXNpemUoZGVsZXRlZFZhbHVlcyk7XG4gIGlmIChcbiAgICAoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpIHx8IGhhc0RlbGV0ZWRWYWx1ZXMpICYmXG4gICAgZmluZChkYXRhdHlwZSwgW1widHlwZVwiLCBBcnJheV0pXG4gICkge1xuICAgIHJldHVybiBtZXJnZShbXSwgZG9jdW1lbnRWYWx1ZSwgY3VycmVudFZhbHVlLCBkZWxldGVkVmFsdWVzKTtcbiAgfSBlbHNlIGlmIChcbiAgICAoaXNQbGFpbk9iamVjdChjdXJyZW50VmFsdWUpIHx8IGhhc0RlbGV0ZWRWYWx1ZXMpICYmXG4gICAgZmluZChkYXRhdHlwZSwgW1widHlwZVwiLCBPYmplY3RdKVxuICApIHtcbiAgICByZXR1cm4gbWVyZ2Uoe30sIGRvY3VtZW50VmFsdWUsIGN1cnJlbnRWYWx1ZSwgZGVsZXRlZFZhbHVlcyk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBsaXN0IG9mIGZpZWxkIG5hbWVzIHRvIGFuIG9iamVjdCBvZiBkZWxldGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfE9iamVjdC48c3RyaW5nfHN0cmluZz59IGRlbGV0ZWRGaWVsZHNcbiAqICBMaXN0IG9mIGRlbGV0ZWQgZmllbGQgbmFtZXMgb3IgcGF0aHNcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5PX0gYWNjdW11bGF0b3I9e31cbiAqICBWYWx1ZSB0byByZWR1Y2UgdGhlIHZhbHVlcyB0b1xuICogQHJldHVybiB7T2JqZWN0fEFycmF5fVxuICogIERlbGV0ZWQgdmFsdWVzLCB3aXRoIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lZCBieSB0YWtpbmcgdGhlIHJlY2VpdmVkIGRlbGV0ZWRcbiAqICBmaWVsZHMgYXMgcGF0aHNcbiAqIEBleGFtcGxlXG4gKiAgY29uc3QgZGVsZXRlZEZpZWxkcyA9IFtcbiAqICAgICdmaWVsZC5zdWJGaWVsZCcsXG4gKiAgICAnZmllbGQuc3ViRmllbGRBcnJheVswXScsXG4gKiAgICAnZmllbGRBcnJheVswXScsXG4gKiAgICAnZmllbGRBcnJheVsyXS5uYW1lJyxcbiAqICBdO1xuICogIGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMoZGVsZXRlZEZpZWxkcyk7XG4gKiAgLy8gPT4geyAnZmllbGQnOiB7ICdzdWJGaWVsZCc6IG51bGwsICdzdWJGaWVsZEFycmF5JzogW251bGxdIH0sICdmaWVsZEFycmF5JzogW251bGwsIHVuZGVmaW5lZCwgeyBuYW1lOiBudWxsIH0gfVxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlZFZhbHVlcyA9IChkZWxldGVkRmllbGRzLCBhY2N1bXVsYXRvciA9IHt9KSA9PlxuICBkZWxldGVkRmllbGRzLnJlZHVjZShcbiAgICAoZGVsZXRlZFZhbHVlcywgcGF0aCkgPT4gc2V0KGRlbGV0ZWRWYWx1ZXMsIHBhdGgsIG51bGwpLFxuICAgIGFjY3VtdWxhdG9yXG4gICk7XG5cbi8qKlxuICogRmlsdGVycyB0aGUgZ2l2ZW4gZmllbGQgbmFtZXMgYnkgcHJlZml4LCByZW1vdmVzIGl0IGZyb20gZWFjaCBvbmUgb2YgdGhlbVxuICogYW5kIGNvbnZlcnQgdGhlIGxpc3QgdG8gYW4gb2JqZWN0IG9mIGRlbGV0ZWQgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcHJlZml4XG4gKiAgUHJlZml4IHRvIGZpbHRlciBhbmQgcmVtb3ZlIGZyb20gZGVsZXRlZCBmaWVsZHNcbiAqIEBwYXJhbSB7c3RyaW5nW118T2JqZWN0LjxzdHJpbmd8c3RyaW5nPn0gZGVsZXRlZEZpZWxkc1xuICogIExpc3Qgb2YgZGVsZXRlZCBmaWVsZCBuYW1lcyBvciBwYXRoc1xuICogQHBhcmFtIHtPYmplY3R8QXJyYXk9fSBhY2N1bXVsYXRvcj17fVxuICogIFZhbHVlIHRvIHJlZHVjZSB0aGUgdmFsdWVzIHRvXG4gKiBAcmV0dXJuIHtPYmplY3QuPHN0cmluZywgbnVsbD59XG4gKiAgT2JqZWN0IGtleWVkIHdpdGggdGhlIGdpdmVuIGRlbGV0ZWQgZmllbGRzLCB2YWx1ZWQgd2l0aCBgbnVsbGBcbiAqIEBleGFtcGxlXG4gKiAgY29uc3QgZGVsZXRlZEZpZWxkcyA9IFtcbiAqICAgICdmaWVsZC5zdWJGaWVsZCcsXG4gKiAgICAnZmllbGQuc3ViRmllbGRBcnJheVswXScsXG4gKiAgICAnZmllbGRBcnJheVswXScsXG4gKiAgICAnZmllbGRBcnJheVsyXS5uYW1lJyxcbiAqICBdO1xuICogIGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMoJ2ZpZWxkJywgZGVsZXRlZEZpZWxkcyk7XG4gKiAgLy8gPT4geyAnc3ViRmllbGQnOiBudWxsLCAnc3ViRmllbGRBcnJheSc6IFtudWxsXSB9XG4gKiAgZ2V0TmVzdGVkRGVsZXRlZFZhbHVlcygnZmllbGRBcnJheScsIGRlbGV0ZWRGaWVsZHMpO1xuICogIC8vID0+IHsgJzAnOiBudWxsLCAnMic6IHsgJ25hbWUnOiBudWxsIH0gfVxuICogIGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMoJ2ZpZWxkQXJyYXknLCBkZWxldGVkRmllbGRzLCBbXSk7XG4gKiAgLy8gPT4gW251bGwsIHVuZGVmaW5lZCwgeyAnbmFtZSc6IG51bGwgfSBdXG4gKi9cbmV4cG9ydCBjb25zdCBnZXROZXN0ZWREZWxldGVkVmFsdWVzID0gKFxuICBwcmVmaXgsXG4gIGRlbGV0ZWRGaWVsZHMsXG4gIGFjY3VtdWxhdG9yID0ge31cbikgPT5cbiAgZ2V0RGVsZXRlZFZhbHVlcyhcbiAgICByZW1vdmVQcmVmaXgocHJlZml4LCBmaWx0ZXJQYXRoc0J5UHJlZml4KHByZWZpeCwgZGVsZXRlZEZpZWxkcykpLFxuICAgIGFjY3VtdWxhdG9yXG4gICk7XG5cbi8vVE9ETzogY2hlY2sgaWYgaXQgc3RpbGwgd29ya3MgYXMgZXhwZWN0ZWRcbi8vIHByZXZpb3VzbHkgd2FzIGRhdGFUeXBlWzBdLnR5cGVcbmV4cG9ydCBjb25zdCBnZXRGaWVsZFR5cGUgPSAoZmllbGRTY2hlbWE6IFZ1bGNhbkZpZWxkU2NoZW1hKSA9PlxuICBmaWVsZFNjaGVtYS50eXBlO1xuLyoqXG4gKiBHZXQgYXBwcm9wcmlhdGUgbnVsbCB2YWx1ZSBmb3IgdmFyaW91cyBmaWVsZCB0eXBlc1xuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGF0eXBlXG4gKiBGaWVsZCdzIGRhdGF0eXBlIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBjb25zdCBnZXROdWxsVmFsdWUgPSAoZGF0YXR5cGUpID0+IHtcbiAgY29uc3QgZmllbGRUeXBlID0gZ2V0RmllbGRUeXBlKGRhdGF0eXBlKTtcbiAgaWYgKGZpZWxkVHlwZSA9PT0gQXJyYXkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gZWxzZSBpZiAoZmllbGRUeXBlID09PSBCb29sZWFuKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PT0gU3RyaW5nKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0gZWxzZSBpZiAoZmllbGRUeXBlID09PSBOdW1iZXIpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfSBlbHNlIHtcbiAgICAvLyBub3JtYWxpemUgdG8gbnVsbFxuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZGVidWdcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3VuaXFcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2ludGVyc2VjdGlvblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvZ3JhcGhxbFwiKTsiLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBWdWxjYW5DdXJyZW50VXNlckNvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5cbmV4cG9ydCBjb25zdCBWdWxjYW5DdXJyZW50VXNlckNvbnN1bWVyID0gVnVsY2FuQ3VycmVudFVzZXJDb250ZXh0LkNvbnN1bWVyO1xuXG5leHBvcnQgY29uc3QgdXNlVnVsY2FuQ3VycmVudFVzZXIgPSAoKSA9PiB1c2VDb250ZXh0KFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dCk7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFZ1bGNhblVzZXIgfSBmcm9tIFwiQHZ1bGNhbmpzL3Blcm1pc3Npb25zXCI7XG5cbmV4cG9ydCB0eXBlIFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dFR5cGUgPVxuICB8IHsgY3VycmVudFVzZXI6IFZ1bGNhblVzZXIgfCBudWxsOyBsb2FkaW5nOiBmYWxzZSB9XG4gIHwgeyBsb2FkaW5nOiB0cnVlOyBjdXJyZW50VXNlcjogYW55IH07XG4vLyBXZSBuZWVkIHRoaXMgdG8gc2h1dCBUeXBlU2NyaXB0IHVwXG4vLyBZb3Ugc2hvdWxkIHVzZSB0aGUgUHJvdmlkZXIgdG8gZ2V0IHRoZSByaWdodCBkZWZhdWx0IHZhbHVlc1xuZXhwb3J0IGNvbnN0IFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dCA9XG4gIFJlYWN0LmNyZWF0ZUNvbnRleHQ8VnVsY2FuQ3VycmVudFVzZXJDb250ZXh0VHlwZT4oe1xuICAgIGN1cnJlbnRVc2VyOiBudWxsLFxuICAgIGxvYWRpbmc6IGZhbHNlLFxuICB9KTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL0Zvcm1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGluZ3NcIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9tZXJnZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvc2V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pc0VtcHR5XCIpOyIsIi8qXG4gKiBTY2hlbWEgY29udmVydGVyL2dldHRlcnNcbiAqL1xuaW1wb3J0IHsgY2FuQ3JlYXRlRmllbGQsIGNhblVwZGF0ZUZpZWxkIH0gZnJvbSBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgVnVsY2FuRmllbGRTY2hlbWEsIFZ1bGNhblNjaGVtYSB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBnZXRGaWVsZFR5cGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKiBnZXR0ZXJzICovXG4vLyBmaWx0ZXIgb3V0IGZpZWxkcyB3aXRoIFwiLlwiIG9yIFwiJFwiXG5leHBvcnQgY29uc3QgZ2V0VmFsaWRGaWVsZHMgPSAoc2NoZW1hKSA9PiB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcihcbiAgICAoZmllbGROYW1lKSA9PiAhZmllbGROYW1lLmluY2x1ZGVzKFwiJFwiKSAmJiAhZmllbGROYW1lLmluY2x1ZGVzKFwiLlwiKVxuICApO1xufTtcblxuLypcblxuQ29udmVydCBhIG5lc3RlZCBTaW1wbGVTY2hlbWEgc2NoZW1hIGludG8gYSBKU09OIG9iamVjdFxuSWYgZmxhdHRlbiA9IHRydWUsIHdpbGwgY3JlYXRlIGEgZmxhdCBvYmplY3QgaW5zdGVhZCBvZiBuZXN0ZWQgdHJlZVxuXG4vKiBwZXJtaXNzaW9ucyAqL1xuXG4vKipcbiAqIEBtZXRob2QgTW9uZ28uQ29sbGVjdGlvbi5nZXRJbnNlcnRhYmxlRmllbGRzXG4gKiBHZXQgYW4gYXJyYXkgb2YgYWxsIGZpZWxkcyBlZGl0YWJsZSBieSBhIHNwZWNpZmljIHVzZXIgZm9yIGEgZ2l2ZW4gY29sbGVjdGlvblxuICogQHBhcmFtIHtPYmplY3R9IHVzZXIg4oCTIHRoZSB1c2VyIGZvciB3aGljaCB0byBjaGVjayBmaWVsZCBwZXJtaXNzaW9uc1xuICovXG5leHBvcnQgY29uc3QgZ2V0SW5zZXJ0YWJsZUZpZWxkcyA9IGZ1bmN0aW9uIChzY2hlbWEsIHVzZXIpIHtcbiAgY29uc3QgZmllbGRzID0gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoZnVuY3Rpb24gKGZpZWxkTmFtZSkge1xuICAgIHZhciBmaWVsZCA9IHNjaGVtYVtmaWVsZE5hbWVdO1xuICAgIHJldHVybiBjYW5DcmVhdGVGaWVsZCh1c2VyLCBmaWVsZCk7XG4gIH0pO1xuICByZXR1cm4gZmllbGRzO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIE1vbmdvLkNvbGxlY3Rpb24uZ2V0RWRpdGFibGVGaWVsZHNcbiAqIEdldCBhbiBhcnJheSBvZiBhbGwgZmllbGRzIGVkaXRhYmxlIGJ5IGEgc3BlY2lmaWMgdXNlciBmb3IgYSBnaXZlbiBjb2xsZWN0aW9uIChhbmQgb3B0aW9uYWxseSBkb2N1bWVudClcbiAqIEBwYXJhbSB7T2JqZWN0fSB1c2VyIOKAkyB0aGUgdXNlciBmb3Igd2hpY2ggdG8gY2hlY2sgZmllbGQgcGVybWlzc2lvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRhYmxlRmllbGRzID0gZnVuY3Rpb24gKHNjaGVtYSwgdXNlciwgZG9jdW1lbnQpIHtcbiAgY29uc3QgZmllbGRzID0gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoZnVuY3Rpb24gKGZpZWxkTmFtZSkge1xuICAgIHZhciBmaWVsZCA9IHNjaGVtYVtmaWVsZE5hbWVdO1xuICAgIHJldHVybiBjYW5VcGRhdGVGaWVsZCh1c2VyLCBmaWVsZCwgZG9jdW1lbnQpO1xuICB9KTtcbiAgcmV0dXJuIGZpZWxkcztcbn07XG5cbmNvbnN0IGlzTmVzdGVkU2NoZW1hID0gKHNjaGVtYTogYW55KTogc2NoZW1hIGlzIFZ1bGNhblNjaGVtYSA9PiB7XG4gIHJldHVybiB0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiO1xufTtcblxuLyoqXG4gKiBWdWxjYW4gU2NoZW1hID0+IEZvcm0gU2NoZW1hXG4gKiBUT0RPOiB0eXBlIHRoaXMgYmV0dGVyXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRTY2hlbWEgPSAoXG4gIHNjaGVtYTogVnVsY2FuU2NoZW1hLFxuICBvcHRpb25zOiB7IGZsYXR0ZW4/OiBib29sZWFuOyByZW1vdmVBcnJheXM/OiBib29sZWFuIH0gPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHsgZmxhdHRlbiA9IGZhbHNlLCByZW1vdmVBcnJheXMgPSB0cnVlIH0gPSBvcHRpb25zO1xuXG4gIGxldCBqc29uU2NoZW1hID0ge307XG5cbiAgT2JqZWN0LmtleXMoc2NoZW1hKS5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcbiAgICAvLyBleGNsdWRlIGFycmF5IGZpZWxkc1xuICAgIGlmIChyZW1vdmVBcnJheXMgJiYgZmllbGROYW1lLmluY2x1ZGVzKFwiJFwiKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGV4dHJhY3Qgc2NoZW1hXG4gICAganNvblNjaGVtYVtmaWVsZE5hbWVdID0gZ2V0RmllbGRTY2hlbWEoZmllbGROYW1lLCBzY2hlbWEpO1xuXG4gICAgLy8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBuZXN0ZWQgZmllbGRcbiAgICAvLyBhbmQgZ2V0IGl0cyBzY2hlbWEgaWYgcG9zc2libGUgb3IgaXRzIHR5cGUgb3RoZXJ3aXNlXG4gICAgY29uc3Qgc3ViU2NoZW1hT3JUeXBlID0gZ2V0TmVzdGVkRmllbGRTY2hlbWFPclR5cGUoZmllbGROYW1lLCBzY2hlbWEpO1xuICAgIGlmIChzdWJTY2hlbWFPclR5cGUpIHtcbiAgICAgIC8vIHJlbWVtYmVyIHRoZSBzdWJzY2hlbWEgaWYgaXQgZXhpc3RzLCBhbGxvdyB0byBjdXN0b21pemUgbGFiZWxzIGZvciBlYWNoIGdyb3VwIG9mIGl0ZW1zIGZvciBhcnJheXMgb2Ygb2JqZWN0c1xuICAgICAganNvblNjaGVtYVtmaWVsZE5hbWVdLmFycmF5RmllbGRTY2hlbWEgPSBnZXRGaWVsZFNjaGVtYShcbiAgICAgICAgYCR7ZmllbGROYW1lfS4kYCxcbiAgICAgICAgc2NoZW1hXG4gICAgICApO1xuXG4gICAgICAvLyBuZXN0ZWQgc2NoZW1hIGNhbiBiZSBhIGZpZWxkIHNjaGVtYSAoe3R5cGUsIGNhblJlYWQsIGV0Yy59KSAoY29udmVydGVkU2NoZW1hIHdpbGwgYmUgbnVsbClcbiAgICAgIC8vIG9yIGEgc2NoZW1hIG9uIGl0cyBvd24gd2l0aCBzdWJmaWVsZHMgKGNvbnZlcnRlZFNjaGVtYSB3aWxsIHJldHVybiBzbXRoKVxuICAgICAgaWYgKGlzTmVzdGVkU2NoZW1hKHN1YlNjaGVtYU9yVHlwZSkpIHtcbiAgICAgICAgLy8gY2FsbCBjb252ZXJ0U2NoZW1hIHJlY3Vyc2l2ZWx5IG9uIHRoZSBzdWJTY2hlbWFcbiAgICAgICAgY29uc3QgY29udmVydGVkU3ViU2NoZW1hID0gY29udmVydFNjaGVtYShzdWJTY2hlbWFPclR5cGUsIG9wdGlvbnMpO1xuICAgICAgICAvLyBzdWJTY2hlbWEgaXMgYSBmdWxsIHNjaGVtYSB3aXRoIG11bHRpcGxlIGZpZWxkcyAoZWcgYXJyYXkgb2Ygb2JqZWN0cylcbiAgICAgICAgaWYgKGZsYXR0ZW4pIHtcbiAgICAgICAgICBqc29uU2NoZW1hID0geyAuLi5qc29uU2NoZW1hLCAuLi5jb252ZXJ0ZWRTdWJTY2hlbWEgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uU2NoZW1hW2ZpZWxkTmFtZV0uc2NoZW1hID0gY29udmVydGVkU3ViU2NoZW1hO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdWJTY2hlbWEgaXMgYSBzaW1wbGUgZmllbGQgaW4gdGhpcyBjYXNlIChlZyBhcnJheSBvZiBudW1iZXJzKVxuICAgICAgICBqc29uU2NoZW1hW2ZpZWxkTmFtZV0uaXNTaW1wbGVBcnJheUZpZWxkID0gdHJ1ZTsgLy9nZXRGaWVsZFNjaGVtYShgJHtmaWVsZE5hbWV9LiRgLCBzY2hlbWEpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBqc29uU2NoZW1hO1xufTtcblxuLypcblxuR2V0IGEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIGEgZmllbGQncyBzY2hlbWFcblxuKi9cbmV4cG9ydCBjb25zdCBnZXRGaWVsZFNjaGVtYSA9IChmaWVsZE5hbWU6IHN0cmluZywgc2NoZW1hOiBWdWxjYW5TY2hlbWEpID0+IHtcbiAgbGV0IGZpZWxkU2NoZW1hID0ge307XG4gIHNjaGVtYVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gc2NoZW1hW2ZpZWxkTmFtZV0/Lltwcm9wZXJ0eV07XG4gICAgaWYgKHByb3BlcnR5VmFsdWUpIHtcbiAgICAgIGZpZWxkU2NoZW1hW3Byb3BlcnR5XSA9IHByb3BlcnR5VmFsdWU7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpZWxkU2NoZW1hO1xufTtcblxuLy8gdHlwZSBpcyBhbiBhcnJheSBkdWUgdG8gdGhlIHBvc3NpYmlsaXR5IG9mIHVzaW5nIFNpbXBsZVNjaGVtYS5vbmVPZlxuLy8gcmlnaHQgbm93IHdlIHN1cHBvcnQgb25seSBmaWVsZHMgd2l0aCBvbmUgdHlwZVxuZXhwb3J0IGNvbnN0IGdldFNjaGVtYVR5cGUgPSAoZmllbGRTY2hlbWE6IFZ1bGNhbkZpZWxkU2NoZW1hKSA9PlxuICBnZXRGaWVsZFR5cGUoZmllbGRTY2hlbWEpO1xuXG5jb25zdCBnZXRBcnJheU5lc3RlZFNjaGVtYSA9IChmaWVsZE5hbWU6IHN0cmluZywgc2NoZW1hOiBWdWxjYW5TY2hlbWEpID0+IHtcbiAgY29uc3QgYXJyYXlJdGVtU2NoZW1hID0gc2NoZW1hW2Ake2ZpZWxkTmFtZX0uJGBdO1xuICBjb25zdCBuZXN0ZWRTY2hlbWEgPSBhcnJheUl0ZW1TY2hlbWEgJiYgZ2V0U2NoZW1hVHlwZShhcnJheUl0ZW1TY2hlbWEpO1xuICByZXR1cm4gbmVzdGVkU2NoZW1hO1xufTtcblxuLy8gVE9ETzogbm90IDEwMCUgaXQncyB2YWxpZCB3aXRoIGN1cnJlbnQgaW1wbGVtZW50YXRpb25cbmNvbnN0IGlzTmVzdGVkU2NoZW1hRmllbGQgPSAoZmllbGRTY2hlbWE6IFZ1bGNhbkZpZWxkU2NoZW1hKSA9PiB7XG4gIGNvbnN0IGZpZWxkVHlwZSA9IGdldFNjaGVtYVR5cGUoZmllbGRTY2hlbWEpO1xuICByZXR1cm4gZmllbGRUeXBlICYmIHR5cGVvZiBmaWVsZFR5cGUgPT09IFwib2JqZWN0XCI7XG59O1xuY29uc3QgZ2V0T2JqZWN0TmVzdGVkU2NoZW1hID0gKGZpZWxkTmFtZTogc3RyaW5nLCBzY2hlbWE6IFZ1bGNhblNjaGVtYSkgPT4ge1xuICBjb25zdCBmaWVsZFNjaGVtYSA9IHNjaGVtYVtmaWVsZE5hbWVdO1xuICBpZiAoIWlzTmVzdGVkU2NoZW1hRmllbGQoZmllbGRTY2hlbWEpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmVzdGVkU2NoZW1hID0gZmllbGRTY2hlbWEgJiYgZ2V0U2NoZW1hVHlwZShmaWVsZFNjaGVtYSk7XG4gIHJldHVybiBuZXN0ZWRTY2hlbWE7XG59O1xuLypcblxuR2l2ZW4gYW4gYXJyYXkgZmllbGQsIGdldCBpdHMgbmVzdGVkIHNjaGVtYVxuSWYgdGhlIGZpZWxkIGlzIG5vdCBhbiBvYmplY3QsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHN1YmZpZWxkIHR5cGUgaW5zdGVhZFxuKi9cbmV4cG9ydCBjb25zdCBnZXROZXN0ZWRGaWVsZFNjaGVtYU9yVHlwZSA9IChmaWVsZE5hbWUsIHNjaGVtYSkgPT4ge1xuICBjb25zdCBhcnJheUl0ZW1TY2hlbWEgPSBnZXRBcnJheU5lc3RlZFNjaGVtYShmaWVsZE5hbWUsIHNjaGVtYSk7XG4gIGlmICghYXJyYXlJdGVtU2NoZW1hKSB7XG4gICAgLy8gbG9vayBmb3IgYW4gb2JqZWN0IHNjaGVtYVxuICAgIGNvbnN0IG9iamVjdEl0ZW1TY2hlbWEgPSBnZXRPYmplY3ROZXN0ZWRTY2hlbWEoZmllbGROYW1lLCBzY2hlbWEpO1xuICAgIC8vIG5vIHNjaGVtYSB3YXMgZm91bmRcbiAgICBpZiAoIW9iamVjdEl0ZW1TY2hlbWEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBvYmplY3RJdGVtU2NoZW1hO1xuICB9XG4gIHJldHVybiBhcnJheUl0ZW1TY2hlbWE7XG59O1xuXG5leHBvcnQgY29uc3Qgc2NoZW1hUHJvcGVydGllcyA9IFtcbiAgXCJ0eXBlXCIsXG4gIFwibGFiZWxcIixcbiAgXCJvcHRpb25hbFwiLFxuICBcInJlcXVpcmVkXCIsXG4gIFwibWluXCIsXG4gIFwibWF4XCIsXG4gIFwiZXhjbHVzaXZlTWluXCIsXG4gIFwiZXhjbHVzaXZlTWF4XCIsXG4gIFwibWluQ291bnRcIixcbiAgXCJtYXhDb3VudFwiLFxuICBcImFsbG93ZWRWYWx1ZXNcIixcbiAgXCJyZWdFeFwiLFxuICBcImJsYWNrYm94XCIsXG4gIFwidHJpbVwiLFxuICBcImN1c3RvbVwiLFxuICBcImRlZmF1bHRWYWx1ZVwiLFxuICBcImF1dG9WYWx1ZVwiLFxuICBcImhpZGRlblwiLCAvLyBoaWRkZW46IHRydWUgbWVhbnMgdGhlIGZpZWxkIGlzIG5ldmVyIHNob3duIGluIGEgZm9ybSBubyBtYXR0ZXIgd2hhdFxuICBcIm11c3RDb21wbGV0ZVwiLCAvLyBtdXN0Q29tcGxldGU6IHRydWUgbWVhbnMgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSBjb21wbGV0ZSBwcm9maWxlXG4gIFwiZm9ybVwiLCAvLyBmb3JtIHBsYWNlaG9sZGVyXG4gIFwiaW5wdXRQcm9wZXJ0aWVzXCIsIC8vIGZvcm0gcGxhY2Vob2xkZXJcbiAgXCJpdGVtUHJvcGVydGllc1wiLFxuICBcImNvbnRyb2xcIiwgLy8gU21hcnRGb3JtIGNvbnRyb2wgKFN0cmluZyBvciBSZWFjdCBjb21wb25lbnQpXG4gIFwiaW5wdXRcIiwgLy8gU21hcnRGb3JtIGNvbnRyb2wgKFN0cmluZyBvciBSZWFjdCBjb21wb25lbnQpXG4gIFwiYXV0b2Zvcm1cIiwgLy8gbGVnYWN5IGZvcm0gcGxhY2Vob2xkZXI7IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKG5vdCB1c2VkIGFueW1vcmUpXG4gIFwib3JkZXJcIiwgLy8gcG9zaXRpb24gaW4gdGhlIGZvcm1cbiAgXCJncm91cFwiLCAvLyBmb3JtIGZpZWxkc2V0IGdyb3VwXG4gIFwib25DcmVhdGVcIiwgLy8gZmllbGQgaW5zZXJ0IGNhbGxiYWNrXG4gIFwib25VcGRhdGVcIiwgLy8gZmllbGQgZWRpdCBjYWxsYmFja1xuICBcIm9uRGVsZXRlXCIsIC8vIGZpZWxkIHJlbW92ZSBjYWxsYmFja1xuICBcIm9uSW5zZXJ0XCIsIC8vIE9wZW5DUlVEIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIFwib25FZGl0XCIsIC8vIE9wZW5DUlVEIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIFwib25SZW1vdmVcIiwgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgXCJjYW5SZWFkXCIsXG4gIFwiY2FuQ3JlYXRlXCIsXG4gIFwiY2FuVXBkYXRlXCIsXG4gIFwidmlld2FibGVCeVwiLCAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBcImluc2VydGFibGVCeVwiLCAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBcImVkaXRhYmxlQnlcIiwgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgXCJyZXNvbHZlQXNcIixcbiAgXCJzZWFyY2hhYmxlXCIsXG4gIFwiZGVzY3JpcHRpb25cIixcbiAgXCJiZWZvcmVDb21wb25lbnRcIixcbiAgXCJhZnRlckNvbXBvbmVudFwiLFxuICBcInBsYWNlaG9sZGVyXCIsXG4gIFwib3B0aW9uc1wiLFxuICBcInF1ZXJ5XCIsXG4gIFwicXVlcnlXYWl0c0ZvclZhbHVlXCIsXG4gIFwiYXV0b2NvbXBsZXRlUXVlcnlcIixcbiAgXCJmaWVsZFByb3BlcnRpZXNcIixcbiAgXCJpbnRsXCIsXG4gIFwiaW50bElkXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgZm9ybVByb3BlcnRpZXMgPSBbXG4gIFwib3B0aW9uYWxcIixcbiAgXCJyZXF1aXJlZFwiLFxuICBcIm1pblwiLFxuICBcIm1heFwiLFxuICBcImV4Y2x1c2l2ZU1pblwiLFxuICBcImV4Y2x1c2l2ZU1heFwiLFxuICBcIm1pbkNvdW50XCIsXG4gIFwibWF4Q291bnRcIixcbiAgXCJhbGxvd2VkVmFsdWVzXCIsXG4gIFwicmVnRXhcIixcbiAgXCJibGFja2JveFwiLFxuICBcInRyaW1cIixcbiAgXCJjdXN0b21cIixcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJhdXRvVmFsdWVcIixcbiAgXCJtdXN0Q29tcGxldGVcIiwgLy8gbXVzdENvbXBsZXRlOiB0cnVlIG1lYW5zIHRoZSBmaWVsZCBpcyByZXF1aXJlZCB0byBoYXZlIGEgY29tcGxldGUgcHJvZmlsZVxuICBcImZvcm1cIiwgLy8gZm9ybSBwbGFjZWhvbGRlclxuICBcImlucHV0UHJvcGVydGllc1wiLCAvLyBmb3JtIHBsYWNlaG9sZGVyXG4gIFwiaXRlbVByb3BlcnRpZXNcIixcbiAgXCJjb250cm9sXCIsIC8vIFNtYXJ0Rm9ybSBjb250cm9sIChTdHJpbmcgb3IgUmVhY3QgY29tcG9uZW50KVxuICBcImlucHV0XCIsIC8vIFNtYXJ0Rm9ybSBjb250cm9sIChTdHJpbmcgb3IgUmVhY3QgY29tcG9uZW50KVxuICBcIm9yZGVyXCIsIC8vIHBvc2l0aW9uIGluIHRoZSBmb3JtXG4gIFwiZ3JvdXBcIiwgLy8gZm9ybSBmaWVsZHNldCBncm91cFxuICBcImRlc2NyaXB0aW9uXCIsXG4gIFwiYmVmb3JlQ29tcG9uZW50XCIsXG4gIFwiYWZ0ZXJDb21wb25lbnRcIixcbiAgXCJwbGFjZWhvbGRlclwiLFxuICBcIm9wdGlvbnNcIixcbiAgXCJxdWVyeVwiLFxuICBcInF1ZXJ5V2FpdHNGb3JWYWx1ZVwiLFxuICBcImF1dG9jb21wbGV0ZVF1ZXJ5XCIsXG4gIFwiZmllbGRQcm9wZXJ0aWVzXCIsXG5dO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2ZpbmRcIik7IiwiaW1wb3J0IHRvUGF0aCBmcm9tIFwibG9kYXNoL3RvUGF0aFwiO1xuaW1wb3J0IGluaXRpYWwgZnJvbSBcImxvZGFzaC9pbml0aWFsXCI7XG5pbXBvcnQgZmxvdyBmcm9tIFwibG9kYXNoL2ZwL2Zsb3dcIjtcbmltcG9ydCB0YWtlUmlnaHQgZnJvbSBcImxvZGFzaC90YWtlUmlnaHRcIjtcblxuLyoqXG4gKiBTcGxpdHMgYSBwYXRoIGluIHN0cmluZyBmb3JtYXQgaW50byBhbiBhcnJheS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNwbGl0UGF0aCA9IChzdHJpbmc6IHN0cmluZykgPT4gdG9QYXRoKHN0cmluZyk7XG5cbi8qKlxuICogSm9pbnMgYSBwYXRoIGluIGFycmF5IGZvcm1hdCBpbnRvIGEgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3Qgam9pblBhdGggPSAoYXJyYXk6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pOiBzdHJpbmcgPT5cbiAgYXJyYXkucmVkdWNlPHN0cmluZz4oXG4gICAgKHN0cmluZywgaXRlbSkgPT5cbiAgICAgIHN0cmluZyArXG4gICAgICAoTnVtYmVyLmlzTmFOKE51bWJlcihpdGVtKSlcbiAgICAgICAgPyBgJHtzdHJpbmcgPT09IFwiXCIgPyBcIlwiIDogXCIuXCJ9JHtpdGVtfWBcbiAgICAgICAgOiBgWyR7aXRlbX1dYCksXG4gICAgXCJcIlxuICApO1xuXG4vKipcbiAqIFJldHJpZXZlcyBwYXJlbnQgcGF0aCBmcm9tIHRoZSBnaXZlbiBvbmUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogIFBhdGggaW4gc3RyaW5nIGZvcm1hdFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgZ2V0UGFyZW50UGF0aCA9IGZsb3coc3BsaXRQYXRoLCBpbml0aWFsLCBqb2luUGF0aCk7XG5cbi8qKlxuICogUmVtb3ZlcyBwcmVmaXggZnJvbSB0aGUgZ2l2ZW4gcGF0aHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtTdHJpbmdbXX0gcGF0aHNcbiAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlUHJlZml4ID0gKFxuICBwcmVmaXg6IHN0cmluZyxcbiAgcGF0aHM6IEFycmF5PHN0cmluZz5cbik6IEFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBleHBsb2RlZFByZWZpeCA9IHNwbGl0UGF0aChwcmVmaXgpO1xuICByZXR1cm4gcGF0aHMubWFwKChwYXRoKSA9PiB7XG4gICAgaWYgKHBhdGggPT09IHByZWZpeCkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIGNvbnN0IGV4cGxvZGVkUGF0aCA9IHNwbGl0UGF0aChwYXRoKTtcbiAgICBjb25zdCBleHBsb2RlZFN1ZmZpeCA9IHRha2VSaWdodChcbiAgICAgIGV4cGxvZGVkUGF0aCxcbiAgICAgIGV4cGxvZGVkUGF0aC5sZW5ndGggLSBleHBsb2RlZFByZWZpeC5sZW5ndGhcbiAgICApO1xuICAgIHJldHVybiBqb2luUGF0aChleHBsb2RlZFN1ZmZpeCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBGaWx0ZXJzIHBhdGhzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gcHJlZml4LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7U3RyaW5nW119IHBhdGhzXG4gKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGNvbnN0IGZpbHRlclBhdGhzQnlQcmVmaXggPSAocHJlZml4OiBzdHJpbmcsIHBhdGhzOiBBcnJheTxzdHJpbmc+KSA9PlxuICBwYXRocy5maWx0ZXIoXG4gICAgKHBhdGgpID0+XG4gICAgICBwYXRoID09PSBwcmVmaXggfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChgJHtwcmVmaXh9LmApIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoYCR7cHJlZml4fVtgKVxuICApO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic2ltcGwtc2NoZW1hXCIpOyIsImltcG9ydCB7XG4gIFZ1bGNhbkZpZWxkVHlwZSxcbiAgVnVsY2FuQ29yZUlucHV0LFxuICBWdWxjYW5GaWVsZElucHV0LFxufSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IFNpbXBsZVNjaGVtYSBmcm9tIFwic2ltcGwtc2NoZW1hXCI7XG5cbmV4cG9ydCBjb25zdCBzdGFuZGFyZElucHV0czogQXJyYXk8VnVsY2FuQ29yZUlucHV0PiA9IFtcbiAgXCJudW1iZXJcIixcbiAgXCJ1cmxcIixcbiAgXCJlbWFpbFwiLFxuICBcInRleHRhcmVhXCIsXG4gIFwiY2hlY2tib3hcIixcbiAgXCJjaGVja2JveGdyb3VwXCIsXG4gIFwicmFkaW9ncm91cFwiLFxuICBcInNlbGVjdFwiLFxuICBcInNlbGVjdG11bHRpcGxlXCIsXG4gIFwiZGF0ZXRpbWVcIixcbiAgXCJkYXRlXCIsXG4gIFwidGltZVwiLFxuICBcInRleHRcIixcbiAgXCJwYXNzd29yZFwiLFxuXTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyYWJsZUlucHV0czogQXJyYXk8VnVsY2FuQ29yZUlucHV0PiA9IFtcbiAgXCJkYXRlXCIsXG4gIC8vICBcImRhdGUyXCIsXG4gIFwiZGF0ZXRpbWVcIixcbiAgXCJ0aW1lXCIsXG4gIFwic2VsZWN0XCIsXG4gIFwicmFkaW9ncm91cFwiLFxuXTtcbmV4cG9ydCBjb25zdCBhZHZhbmNlZElucHV0czogQXJyYXk8VnVsY2FuQ29yZUlucHV0PiA9IFtcbiAgXCJsaWtlcnRcIixcbiAgXCJhdXRvY29tcGxldGVcIixcbiAgXCJtdWx0aWF1dG9jb21wbGV0ZVwiLFxuXTtcbmV4cG9ydCB0eXBlIERlcml2ZWRJbnB1dCA9IFwibmVzdGVkXCI7XG5leHBvcnQgY29uc3QgZGVyaXZlZElucHV0czogQXJyYXk8RGVyaXZlZElucHV0PiA9IFtcIm5lc3RlZFwiXTtcbmV4cG9ydCBjb25zdCBhbGxWdWxjYW5JbnB1dHM6IEFycmF5PFZ1bGNhbkNvcmVJbnB1dCB8IERlcml2ZWRJbnB1dD4gPSBbXG4gIC4uLnN0YW5kYXJkSW5wdXRzLFxuICAuLi5hZHZhbmNlZElucHV0cyxcbiAgLy8gZGVyaXZlZCBpbnB1dHMgYXJlIHNwZWNpZmljIHRvIHRoZSBGb3JtIGludGVybmFsIGNvbXB1dGF0aW9uc1xuICAvLyBpdCBjYW4ndCBiZSBzZXQgYnkgdGhlIHVzZXJcbiAgLi4uZGVyaXZlZElucHV0cyxcbl07XG5cbmV4cG9ydCBjb25zdCBnZXRBdXRvSW5wdXRGcm9tVHlwZSA9IChcbiAgZmllbGRUeXBlOiBWdWxjYW5GaWVsZFR5cGVcbik6IFZ1bGNhbkNvcmVJbnB1dCA9PiB7XG4gIGNvbnN0IGF1dG9UeXBlID1cbiAgICBmaWVsZFR5cGUgPT09IE51bWJlciB8fCBmaWVsZFR5cGUgPT09IFNpbXBsZVNjaGVtYS5JbnRlZ2VyXG4gICAgICA/IFwibnVtYmVyXCJcbiAgICAgIDogZmllbGRUeXBlID09PSBCb29sZWFuXG4gICAgICA/IFwiY2hlY2tib3hcIlxuICAgICAgOiBmaWVsZFR5cGUgPT09IERhdGVcbiAgICAgID8gXCJkYXRlXCJcbiAgICAgIDogXCJ0ZXh0XCI7XG4gIHJldHVybiBhdXRvVHlwZTtcbn07XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jb21wb25lbnRzL2Zvcm1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbXBvbmVudHMvVnVsY2FuQ29tcG9uZW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50cy9WdWxjYW5DdXJyZW50VXNlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50c0hlbHBlcnNcIjtcbiIsImV4cG9ydCAqIGZyb20gXCIuL0Zvcm1Db250YWluZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Zvcm1cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcbiIsIi8qXG5cbkZvcm1Db250YWluZXIgYWthIFNtYXJ0Rm9ybVxuXG5DaGFuZ2VzIGNvbXBhcmVkIHRvIFZ1bGNhbiBNZXRlb3I6XG5cbi0gcHJldmlvdXNseSB3YXMgbmFtZWQgRm9ybVdyYXBwZXJcbi0gYWNjZXB0cyBhIG1vZGVsIGluc3RlYWQgb2YgY29sbGVjdGlvblxuLSBubyBxdWVyeUZyYWdtZW50TmFtZSAocmVzcC4gbXV0YXRpb24gbmFtZSksIGluc3RlYWQgeW91IG5lZWQgdG8gcGFzcyB0aGUgZnJhZ21lbnQgZXhwbGljaXRlbHlcblxuVGVjaG5pY2FsbHksIHRoaXMgaXMgYSBHcmFwaHFsU21hcnRGb3JtLCB3aGlsZSBGb3JtLnRzeCBpcyB0aGUgbW9yZVxuZ2VuZXJpYyBTbWFydEZvcm0sIG9yIGEgXCJNb2RlbEZvcm1cIi5cblxuXG4tLS1cblxuR2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGZyYWdtZW50IGZvciB0aGUgY3VycmVudCBmb3JtLCB0aGVuXG53cmFwIHRoZSBtYWluIEZvcm0gY29tcG9uZW50IHdpdGggdGhlIG5lY2Vzc2FyeSBIb0NzIHdoaWxlIHBhc3NpbmdcbnRoZW0gdGhlIGZyYWdtZW50LlxuXG5UaGlzIGNvbXBvbmVudCBpcyBpdHNlbGYgd3JhcHBlZCB3aXRoOlxuXG4tIHdpdGhDdXJyZW50VXNlclxuLSB3aXRoQXBvbGxvICh1c2VkIHRvIGFjY2VzcyB0aGUgQXBvbGxvIGNsaWVudCBmb3IgZm9ybSBwcmUtcG9wdWxhdGlvbilcblxuQW5kIHdyYXBzIHRoZSBGb3JtIGNvbXBvbmVudCB3aXRoOlxuXG4tIHdpdGhOZXdcblxuT3I6XG5cbi0gd2l0aFNpbmdsZVxuLSB3aXRoVXBkYXRlXG4tIHdpdGhEZWxldGVcblxuKFdoZW4gd3JhcHBpbmcgd2l0aCB3aXRoU2luZ2xlLCB3aXRoVXBkYXRlLCBhbmQgd2l0aERlbGV0ZSwgYSBzcGVjaWFsIExvYWRlclxuY29tcG9uZW50IGlzIGFsc28gYWRkZWQgdG8gd2FpdCBmb3Igd2l0aFNpbmdsZSdzIGxvYWRpbmcgcHJvcCB0byBiZSBmYWxzZSlcblxuKi9cbmltcG9ydCBSZWFjdCwgeyB1c2VSZWYgfSBmcm9tIFwicmVhY3RcIjtcbi8vIGltcG9ydCAvLyB3aXRoQ3VycmVudFVzZXIsXG4vLyBVdGlscyxcbi8vIGdldEZyYWdtZW50LFxuLy9cIm1ldGVvci92dWxjYW46Y29yZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnROb2RlLCBncWwgfSBmcm9tIFwiQGFwb2xsby9jbGllbnRcIjtcblxuaW1wb3J0IGdldEZvcm1GcmFnbWVudHMgZnJvbSBcIi4vbW9kdWxlcy9mb3JtRnJhZ21lbnRzXCI7XG4vLyBpbXBvcnQgeyBWdWxjYW5Nb2RlbCB9IGZyb20gXCJAdnVsY2FuanMvbW9kZWxcIjtcbmltcG9ydCB7XG4gIFZ1bGNhbkdyYXBocWxNb2RlbCxcbiAgQ3JlYXRlVmFyaWFibGVzLFxuICBVcGRhdGVWYXJpYWJsZXMsXG4gIERlbGV0ZVZhcmlhYmxlcyxcbiAgZ2V0RnJhZ21lbnROYW1lLFxufSBmcm9tIFwiQHZ1bGNhbmpzL2dyYXBocWxcIjtcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tIFwiQHZ1bGNhbmpzL3V0aWxzXCI7XG5pbXBvcnQge1xuICB1c2VTaW5nbGUsXG4gIHVzZUNyZWF0ZSxcbiAgdXNlVXBkYXRlLFxuICB1c2VEZWxldGUsXG4gIFVzZVNpbmdsZU9wdGlvbnMsXG59IGZyb20gXCJAdnVsY2FuanMvcmVhY3QtaG9va3NcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgRmV0Y2hSZXN1bHQgfSBmcm9tIFwiQGFwb2xsby9jbGllbnRcIjtcbi8vIGltcG9ydCB7IEZvcm1UeXBlIH0gZnJvbSBcIi4vdHlwaW5nc1wiO1xuaW1wb3J0IHsgZGVidWdWdWxjYW4gfSBmcm9tIFwiQHZ1bGNhbmpzL3V0aWxzXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5DdXJyZW50VXNlciB9IGZyb20gXCIuLi9WdWxjYW5DdXJyZW50VXNlci9Db25zdW1lclwiO1xuaW1wb3J0IHsgVnVsY2FuVXNlciB9IGZyb20gXCJAdnVsY2FuanMvcGVybWlzc2lvbnNcIjtcbmltcG9ydCB7IFBhc3NlZERvd25Gb3JtUHJvcHMgfSBmcm9tIFwiLi9Gb3JtL3R5cGluZ3NcIjtcbmNvbnN0IGRlYnVnRm9ybSA9IGRlYnVnVnVsY2FuKFwiZm9ybVwiKTtcblxuLy8gTXV0YXRpb24gdGhhdCB5aWVsZCBhIHN1Y2Nlc3MgcmVzdWx0XG50eXBlIFN1Y2Nlc3NmdWxGZXRjaFJlc3VsdDxURGF0YSA9IE9iamVjdD4gPSBGZXRjaFJlc3VsdDxURGF0YT4gJiB7XG4gIGRhdGE6IFREYXRhO1xufTtcbi8qKlxuICogVHlwZWd1YXJlZCB0byBhbGxvdyBjb25zaWRlcmluZyB0aGUgcmVxdWVzdCBhcyBzdWNjZXNzZnVsXG4gKi9cbmNvbnN0IGlzU3VjY2Vzc2Z1bCA9IGZ1bmN0aW9uIDxUID0gYW55PihcbiAgcmVzdWx0OiBGZXRjaFJlc3VsdDxUPiB8IHVuZGVmaW5lZFxuKTogcmVzdWx0IGlzIFN1Y2Nlc3NmdWxGZXRjaFJlc3VsdDxUPiB7XG4gIHJldHVybiAhIXJlc3VsdD8uZGF0YTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbnRhaW5lclByb3BzIGV4dGVuZHMgUGFzc2VkRG93bkZvcm1Qcm9wcyB7XG4gIG1vZGVsOiBWdWxjYW5HcmFwaHFsTW9kZWw7XG4gIC8qKiBEb2N1bWVudCBpZCBmb3IgZWRpdGlvbiBtb2RlLCB3aWxsIGF1dG9tYXRpY2FsbHkgZmV0Y2ggdGhlIGRvY3VtZW50ICovXG4gIGRvY3VtZW50SWQ/OiBzdHJpbmc7XG4gIC8qKiBTbHVnICg9IGh1bWFuIHJlYWRhYmxlIHVuaXF1ZSBpZCkgZm9yIGVkaXRpb24gbW9kZSwgd2lsbCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSBkb2N1bWVudCAqL1xuICBzbHVnPzogc3RyaW5nO1xuICAvKipcbiAgICogTGlzdCBvbmx5IHRob3NlIGZpZWxkcyBpbiB0aGUgZm9ybVxuICAgKi9cbiAgZmllbGRzPzogQXJyYXk8c3RyaW5nPjtcbiAgLyoqXG4gICAqIExpc3QgZGVmYXVsdCBmaWVsZHMgKyB0aG9zZSBhZGRpdGlvbmFsIGZpZWxkcyBhcyB3ZWxsXG4gICAqL1xuICBhZGRGaWVsZHM/OiBBcnJheTxzdHJpbmc+O1xuICAvKipcbiAgICogRm9yY2UgYSBjdXJyZW50VXNlciwgb3ZlcnJpZGluZyB0aGUgY3VycmVudFVzZXIgb2J0YWluZWRcbiAgICogdmlhIENvbnRleHRcbiAgICpcbiAgICogSWYgeW91IHVzZSBtYW55IGZvcm1zIGluIHlvdXIgYXBwLFxuICAgKiBpdCBtaWdodCBiZSBiZXR0ZXIgdG8gc2V0IFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dFxuICAgKiBhdCB0aGUgdG9wLWxldmVsIG9mIHlvdXIgYXBwXG4gICAqIChlZyBpbiBcInBhZ2VzL19hcHAuanNcIiBmb3IgTmV4dC5qcylcbiAgICovXG4gIGN1cnJlbnRVc2VyPzogVnVsY2FuVXNlciB8IG51bGw7XG4gIGxvYWRpbmdDdXJyZW50VXNlcj86IGJvb2xlYW47XG59XG5leHBvcnQgdHlwZSBTbWFydEZvcm1Qcm9wcyA9IEZvcm1Db250YWluZXJQcm9wcztcblxuY29uc3QgdXNlRnJhZ21lbnRzID0gKFxuICBwcm9wczogUGljazxcbiAgICBGb3JtQ29udGFpbmVyUHJvcHMsXG4gICAgfCBcIm11dGF0aW9uRnJhZ21lbnRcIlxuICAgIHwgXCJtdXRhdGlvbkZyYWdtZW50TmFtZVwiXG4gICAgfCBcInF1ZXJ5RnJhZ21lbnRcIlxuICAgIHwgXCJxdWVyeUZyYWdtZW50TmFtZVwiXG4gICAgLy8gZm9yIGF1dG8gZ2VuZXJhdGlvblxuICAgIHwgXCJtb2RlbFwiXG4gICAgfCBcImZpZWxkc1wiXG4gICAgfCBcImFkZEZpZWxkc1wiXG4gID4sXG4gIGZvcm1UeXBlOiBcImVkaXRcIiB8IFwibmV3XCJcbikgPT4ge1xuICAvLyBnZXQgZnJhZ21lbnQgdXNlZCB0byBkZWNpZGUgd2hhdCBkYXRhIHRvIGxvYWQgZnJvbSB0aGUgc2VydmVyIHRvIHBvcHVsYXRlIHRoZSBmb3JtLFxuICAvLyBhcyB3ZWxsIGFzIHdoYXQgZGF0YSB0byBhc2sgZm9yIGFzIHJldHVybiB2YWx1ZSBmb3IgdGhlIG11dGF0aW9uXG4gIC8vIFRPRE86IG1vdmUgb3V0IG9mIHRoZSBjb21wb25lbnRcbiAgLy9jb25zdCBnZXRGcmFnbWVudHMgPSAoKSA9PiB7XG4gIGxldCBxdWVyeUZyYWdtZW50OiBEb2N1bWVudE5vZGUgfCB1bmRlZmluZWQ7XG4gIGxldCBxdWVyeUZyYWdtZW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgbXV0YXRpb25GcmFnbWVudDogRG9jdW1lbnROb2RlIHwgdW5kZWZpbmVkO1xuICBsZXQgbXV0YXRpb25GcmFnbWVudE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBpZiBxdWVyeUZyYWdtZW50IG9yIG11dGF0aW9uRnJhZ21lbnQgcHJvcHMgYXJlIHNwZWNpZmllZCwgYWNjZXB0IGVpdGhlciBmcmFnbWVudCBvYmplY3Qgb3IgZnJhZ21lbnQgc3RyaW5nXG4gIC8vIFRPRE86IG5vdCBzdXJlIHdlIGFjdHVhbGx5IG5lZWQgdGhhdCwgZ0Fwb2xsbyBhY2NlcHRzIGZyYWdtZW50cyBvciBzdHJpbmcgbm9ybWFsbHlcbiAgaWYgKHByb3BzLnF1ZXJ5RnJhZ21lbnQpIHtcbiAgICBpZiAodHlwZW9mIHByb3BzLnF1ZXJ5RnJhZ21lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHF1ZXJ5RnJhZ21lbnQgPSBncWxgXG4gICAgICAgICR7cHJvcHMucXVlcnlGcmFnbWVudH1cbiAgICAgIGA7XG4gICAgICBpZiAoIXByb3BzLnF1ZXJ5RnJhZ21lbnROYW1lKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJXaGVuIHVzaW5nIGEgc3RyaW5nIHF1ZXJ5RnJhZ21lbnQsIHF1ZXJ5RnJhZ21lbnROYW1lIGlzIG1hbmRhdG9yeVwiXG4gICAgICAgICk7XG4gICAgICBxdWVyeUZyYWdtZW50TmFtZSA9IHByb3BzLnF1ZXJ5RnJhZ21lbnROYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEb2N1bWVudE5vZGVcbiAgICAgIHF1ZXJ5RnJhZ21lbnQgPSBwcm9wcy5xdWVyeUZyYWdtZW50O1xuICAgICAgLy8gYXV0b21hdGljYWxseSBjb21wdXRlIHRoZSBmcmFnbWVudCBuYW1lXG4gICAgICBxdWVyeUZyYWdtZW50TmFtZSA9XG4gICAgICAgIHByb3BzLnF1ZXJ5RnJhZ21lbnROYW1lIHx8IGdldEZyYWdtZW50TmFtZShwcm9wcy5xdWVyeUZyYWdtZW50KTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb3BzLm11dGF0aW9uRnJhZ21lbnQpIHtcbiAgICBpZiAodHlwZW9mIHByb3BzLm11dGF0aW9uRnJhZ21lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG11dGF0aW9uRnJhZ21lbnQgPSBncWxgXG4gICAgICAgICR7cHJvcHMubXV0YXRpb25GcmFnbWVudH1cbiAgICAgIGA7XG4gICAgICBpZiAoIXByb3BzLm11dGF0aW9uRnJhZ21lbnROYW1lKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJXaGVuIHVzaW5nIGEgc3RyaW5nIG11dGF0aW9uRnJhZ21lbnQsIG11dGF0aW9uRnJhZ21lbnROYW1lIGlzIG1hbmRhdG9yeVwiXG4gICAgICAgICk7XG4gICAgICBxdWVyeUZyYWdtZW50TmFtZSA9IHByb3BzLm11dGF0aW9uRnJhZ21lbnROYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEb2N1bWVudE5vZGVcbiAgICAgIG11dGF0aW9uRnJhZ21lbnQgPSBwcm9wcy5tdXRhdGlvbkZyYWdtZW50O1xuICAgICAgLy8gYXV0b21hdGljYWxseSBjb21wdXRlIHRoZSBmcmFnbWVudCBuYW1lXG4gICAgICBtdXRhdGlvbkZyYWdtZW50TmFtZSA9XG4gICAgICAgIHByb3BzLm11dGF0aW9uRnJhZ21lbnROYW1lIHx8IGdldEZyYWdtZW50TmFtZShwcm9wcy5tdXRhdGlvbkZyYWdtZW50KTtcbiAgICB9XG4gIH1cbiAgLy8gYXV0byBnZW5lcmF0ZSBmcmFnbWVudHNcbiAgbGV0IGF1dG9Gb3JtRnJhZ21lbnRzO1xuICBpZiAoIXByb3BzLnF1ZXJ5RnJhZ21lbnQgfHwgIXByb3BzLm11dGF0aW9uRnJhZ21lbnQpIHtcbiAgICBjb25zdCB7IG1vZGVsLCBmaWVsZHMsIGFkZEZpZWxkcyB9ID0gcHJvcHM7XG4gICAgLy8gYXV0b2dlbmVyYXRlZCBmcmFnbWVudHNcbiAgICBhdXRvRm9ybUZyYWdtZW50cyA9IGdldEZvcm1GcmFnbWVudHMoe1xuICAgICAgZm9ybVR5cGUsXG4gICAgICBtb2RlbCxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGFkZEZpZWxkcyxcbiAgICB9KTtcbiAgfVxuICAvLyB1c2UgYXV0b2dlbmVyYXRlZCB2YWx1ZSBpZiBuZWNlc3NhcnlcbiAgaWYgKCFwcm9wcy5xdWVyeUZyYWdtZW50KSB7XG4gICAgcXVlcnlGcmFnbWVudCA9IGF1dG9Gb3JtRnJhZ21lbnRzLnF1ZXJ5RnJhZ21lbnQ7XG4gICAgcXVlcnlGcmFnbWVudE5hbWUgPSBhdXRvRm9ybUZyYWdtZW50cy5xdWVyeUZyYWdtZW50TmFtZTtcbiAgfVxuICBpZiAoIXByb3BzLm11dGF0aW9uRnJhZ21lbnQpIHtcbiAgICBtdXRhdGlvbkZyYWdtZW50ID0gYXV0b0Zvcm1GcmFnbWVudHMubXV0YXRpb25GcmFnbWVudDtcbiAgICBtdXRhdGlvbkZyYWdtZW50TmFtZSA9IGF1dG9Gb3JtRnJhZ21lbnRzLm11dGF0aW9uRnJhZ21lbnROYW1lO1xuICB9XG4gIHJldHVybiB7XG4gICAgbXV0YXRpb25GcmFnbWVudDogbXV0YXRpb25GcmFnbWVudCBhcyBEb2N1bWVudE5vZGUsXG4gICAgbXV0YXRpb25GcmFnbWVudE5hbWU6IG11dGF0aW9uRnJhZ21lbnROYW1lIGFzIHN0cmluZyxcbiAgICBxdWVyeUZyYWdtZW50OiBxdWVyeUZyYWdtZW50IGFzIERvY3VtZW50Tm9kZSxcbiAgICBxdWVyeUZyYWdtZW50TmFtZTogcXVlcnlGcmFnbWVudE5hbWUgYXMgc3RyaW5nLFxuICB9O1xufTtcbi8vIEZvbmN0aW9ubmFsIHZlcnNpb24gdG8gYmUgYWJsZSB0byB1c2UgaG9va3NcbmV4cG9ydCBjb25zdCBGb3JtQ29udGFpbmVyID0gKHByb3BzOiBGb3JtQ29udGFpbmVyUHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIG1vZGVsLFxuICAgIGRvY3VtZW50SWQsXG4gICAgc2x1ZyxcbiAgICBmaWVsZHMsXG4gICAgYWRkRmllbGRzLFxuICAgIGN1cnJlbnRVc2VyOiBjdXJyZW50VXNlckZyb21Qcm9wcyxcbiAgICBsb2FkaW5nQ3VycmVudFVzZXI6IGxvYWRpbmdDdXJyZW50VXNlckZyb21Qcm9wcyxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7IHNjaGVtYSB9ID0gbW9kZWw7XG4gIC8vIGlmIGEgZG9jdW1lbnQgaXMgYmVpbmcgcGFzc2VkLCB0aGlzIGlzIGFuIGVkaXQgZm9ybVxuICBjb25zdCBpc0VkaXQgPSBkb2N1bWVudElkIHx8IHNsdWc7XG4gIGNvbnN0IHNlbGVjdG9yID0ge1xuICAgIGRvY3VtZW50SWQsXG4gICAgc2x1ZyxcbiAgfTtcbiAgY29uc3QgZm9ybVR5cGUgPSBpc0VkaXQgPyBcImVkaXRcIiA6IFwibmV3XCI7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG5cbiAgLy8gZ2V0IHF1ZXJ5ICYgbXV0YXRpb24gZnJhZ21lbnRzIGZyb20gcHJvcHMgb3IgZWxzZSBkZWZhdWx0IHRvIHNhbWUgYXMgZ2VuZXJhdGVkRnJhZ21lbnRcbiAgLy9yZXR1cm4ge1xuICAvLyAgcXVlcnlGcmFnbWVudCxcbiAgLy8gIG11dGF0aW9uRnJhZ21lbnQsXG4gIC8vfTtcbiAgLy99XG5cbiAgY29uc3QgcHJlZml4ID0gYCR7bW9kZWwubmFtZX0ke2NhcGl0YWxpemUoZm9ybVR5cGUpfWA7XG4gIC8vIHByb3BzIHRvIHBhc3Mgb24gdG8gY2hpbGQgY29tcG9uZW50IChpLmUuIDxGb3JtIC8+KVxuICBjb25zdCBjaGlsZFByb3BzID0ge1xuICAgIGZvcm1UeXBlLFxuICAgIHNjaGVtYSxcbiAgfTtcblxuICBjb25zdCB7XG4gICAgbXV0YXRpb25GcmFnbWVudCxcbiAgICBtdXRhdGlvbkZyYWdtZW50TmFtZSxcbiAgICBxdWVyeUZyYWdtZW50LFxuICAgIHF1ZXJ5RnJhZ21lbnROYW1lLFxuICB9ID0gdXNlRnJhZ21lbnRzKHByb3BzLCBmb3JtVHlwZSk7XG5cbiAgLy8gb3B0aW9ucyBmb3IgdXNlQ3JlYXRlLCB1c2VVcGRhdGUgYW5kIHVzZURlbGV0ZVxuICBjb25zdCBtdXRhdGlvbk9wdGlvbnMgPSB7XG4gICAgbW9kZWwsXG4gICAgLy8gY29sbGVjdGlvbjogdGhpcy5wcm9wcy5jb2xsZWN0aW9uLFxuICAgIGZyYWdtZW50OiBtdXRhdGlvbkZyYWdtZW50LFxuICAgIGZyYWdtZW50TmFtZTogbXV0YXRpb25GcmFnbWVudE5hbWUsXG4gIH07XG5cbiAgY29uc3QgcXVlcnlPcHRpb25zOiBVc2VTaW5nbGVPcHRpb25zPGFueT4gPSB7XG4gICAgbW9kZWwsXG4gICAgLy8gVE9ETzogd2hhdCB0aGlzIG9wdGlvbiBkb2VzP1xuICAgIC8vIHF1ZXJ5TmFtZTogYCR7cHJlZml4fUZvcm1RdWVyeWAsXG4gICAgZnJhZ21lbnQ6IHF1ZXJ5RnJhZ21lbnQsXG4gICAgZnJhZ21lbnROYW1lOiBxdWVyeUZyYWdtZW50TmFtZSxcbiAgICAvLyBmcmFnbWVudE5hbWU/XG4gICAgaW5wdXQ6IHtcbiAgICAgIGlkOiBkb2N1bWVudElkLFxuICAgICAgZW5hYmxlQ2FjaGU6IGZhbHNlLFxuICAgICAgLy8gVE9ETzogc3VwcG9ydCBzbHVnXG4gICAgfSxcbiAgICBxdWVyeU9wdGlvbnM6IHtcbiAgICAgIC8vIHdlIGFsd2F5cyB3YW50IHRvIGxvYWQgYSBmcmVzaCBjb3B5IG9mIHRoZSBkb2N1bWVudFxuICAgICAgZmV0Y2hQb2xpY3k6IFwibmV0d29yay1vbmx5XCIgYXMgXCJuZXR3b3JrLW9ubHlcIiwgLy8gY2FzdCBpcyBmb3IgZml4aW5nIGFubm95aW5nIFRTIGlzc3VlLi4uIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtYXBvbGxvL2lzc3Vlcy85MzZcbiAgICAgIHBvbGxJbnRlcnZhbDogMCwgLy8gbm8gcG9sbGluZywgb25seSBsb2FkIGRhdGEgb25jZVxuICAgICAgc2tpcDogZm9ybVR5cGUgPT09IFwibmV3XCIsXG4gICAgfSxcbiAgfTtcbiAgLyogZGVidWdcbiAgY29uc29sZS5sb2coXG4gICAgXCJNVVRcIixcbiAgICAobXV0YXRpb25GcmFnbWVudCBhcyBhbnkpLmxvYy5zb3VyY2UuYm9keSxcbiAgICBtdXRhdGlvbkZyYWdtZW50TmFtZVxuICApO1xuICBjb25zb2xlLmxvZyhcbiAgICBcIlFVRVJZXCIsXG4gICAgKHF1ZXJ5RnJhZ21lbnQgYXMgYW55KS5sb2Muc291cmNlLmJvZHksXG4gICAgcXVlcnlGcmFnbWVudE5hbWVcbiAgKTsqL1xuICBjb25zdCB7IGRhdGEsIGRvY3VtZW50LCBsb2FkaW5nLCByZWZldGNoIH0gPSB1c2VTaW5nbGUocXVlcnlPcHRpb25zKTtcbiAgaWYgKGZvcm1UeXBlICE9PSBcIm5ld1wiKSB7XG4gICAgZGVidWdGb3JtKFxuICAgICAgXCJ1c2VTaW5nbGUgcmVzdWx0XCIsXG4gICAgICBcImRhdGFcIixcbiAgICAgIGRhdGEsXG4gICAgICBcImRvY3VtZW50XCIsXG4gICAgICBkb2N1bWVudCxcbiAgICAgIFwibG9hZGluZ1wiLFxuICAgICAgbG9hZGluZ1xuICAgICk7XG4gIH1cbiAgLy8gVE9ETzogcGFzcyB0aGUgY3JlYXRpb24gZnVuY3Rpb25zIGRvd24gdG8gdGhlIEZvcm1cbiAgY29uc3QgW2NyZWF0ZURvY3VtZW50XSA9IHVzZUNyZWF0ZShtdXRhdGlvbk9wdGlvbnMpO1xuICBjb25zdCBbdXBkYXRlRG9jdW1lbnRdID0gdXNlVXBkYXRlKG11dGF0aW9uT3B0aW9ucyk7XG4gIGNvbnN0IFtkZWxldGVEb2N1bWVudF0gPSB1c2VEZWxldGUobXV0YXRpb25PcHRpb25zKTtcblxuICBjb25zdCB7XG4gICAgY3VycmVudFVzZXI6IGN1cnJlbnRVc2VyRnJvbUNvbnRleHQsXG4gICAgbG9hZGluZzogbG9hZGluZ0N1cnJlbnRVc2VyRnJvbUNvbnRleHQsXG4gIH0gPSB1c2VWdWxjYW5DdXJyZW50VXNlcigpO1xuICBjb25zdCBzaG91bGRHZXRDdXJyZW50VXNlckZyb21Qcm9wcyA9XG4gICAgdHlwZW9mIGN1cnJlbnRVc2VyRnJvbVByb3BzICE9PSBcInVuZGVmaW5lZFwiO1xuICBjb25zdCBjdXJyZW50VXNlciA9IHNob3VsZEdldEN1cnJlbnRVc2VyRnJvbVByb3BzXG4gICAgPyBjdXJyZW50VXNlckZyb21Qcm9wc1xuICAgIDogY3VycmVudFVzZXJGcm9tQ29udGV4dDtcbiAgY29uc3QgbG9hZGluZ0N1cnJlbnRVc2VyID0gc2hvdWxkR2V0Q3VycmVudFVzZXJGcm9tUHJvcHNcbiAgICA/IGxvYWRpbmdDdXJyZW50VXNlckZyb21Qcm9wc1xuICAgIDogbG9hZGluZ0N1cnJlbnRVc2VyRnJvbUNvbnRleHQ7XG5cbiAgLy8gY2FsbGJhY2tzXG4gIC8qXG4gIGNvbnN0IGZvcm1SZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IG5ld011dGF0aW9uU3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24gPFREYXRhID0gT2JqZWN0PihcbiAgICByZXN1bHQ6IFN1Y2Nlc3NmdWxGZXRjaFJlc3VsdDxURGF0YT5cbiAgKSB7XG4gICAgZ2V0RG9jdW1lbnRGcm9tUmVzdWx0KHJlc3VsdCwgXCJuZXdcIik7XG4gIH07XG4gIGNvbnN0IGVkaXRNdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayA9IGZ1bmN0aW9uIDxURGF0YSA9IE9iamVjdD4oXG4gICAgcmVzdWx0OiBTdWNjZXNzZnVsRmV0Y2hSZXN1bHQ8VERhdGE+XG4gICkge1xuICAgIGdldERvY3VtZW50RnJvbVJlc3VsdChyZXN1bHQsIFwiZWRpdFwiKTtcbiAgfTtcbiAgKi9cblxuICAvKlxuICBUaGUgY3JlYXRlIGhvb2sgYWxyZWFkeSBjcmVhdGVzIGEgZG9jdW1lbnQgcHJvcCBpbiBhIG1vcmUgc3RhYmxlIHdheVxuICBjb25zdCBnZXREb2N1bWVudEZyb21SZXN1bHQgPSBmdW5jdGlvbiA8VERhdGEgPSBPYmplY3Q+KFxuICAgIC8vIG11c3QgYmUgY2FsbGVkIG9ubHkgb24gdmFsaWQgcmVzdWx0c1xuICAgIHJlc3VsdDogU3VjY2Vzc2Z1bEZldGNoUmVzdWx0PFREYXRhPiB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBUT0RPOiBxdWl0ZSByaXNreS4uLiB3ZSBzaG91bGQgaGF2ZSBhIGJldHRlciB3YXkgdG8gZ2V0IHRoZSBkb2N1bWVudFxuICAgIGxldCBkb2N1bWVudCA9IHJlc3VsdC5kYXRhW09iamVjdC5rZXlzKHJlc3VsdC5kYXRhKVswXV0uZGF0YTsgLy8gZG9jdW1lbnQgaXMgYWx3YXlzIG9uIGZpcnN0IHByb3BlcnR5XG5cbiAgICByZXR1cm4gZG9jdW1lbnQ7XG4gIH07Ki9cbiAgLy8gZm9yIG5ldyBtdXRhdGlvbiwgcnVuIHJlZmV0Y2ggZnVuY3Rpb24gaWYgaXQgZXhpc3RzXG4gIC8qXG4gIGlmIChtdXRhdGlvblR5cGUgPT09IFwibmV3XCIgJiYgcmVmZXRjaCkgcmVmZXRjaCgpO1xuICAqL1xuXG4gIGNvbnN0IGNyZWF0ZUFuZFJldHVybkRvY3VtZW50ID0gYXN5bmMgKHZhcmlhYmxlczogQ3JlYXRlVmFyaWFibGVzKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRG9jdW1lbnQodmFyaWFibGVzKTtcbiAgICBjb25zdCB7IGVycm9ycywgZG9jdW1lbnQgfSA9IHJlc3VsdDtcbiAgICByZXR1cm4ge1xuICAgICAgZG9jdW1lbnQsXG4gICAgICBlcnJvcnMsXG4gICAgfTtcbiAgfTtcbiAgY29uc3QgdXBkYXRlQW5kUmV0dXJuRG9jdW1lbnQgPSBhc3luYyAodmFyaWFibGVzOiBVcGRhdGVWYXJpYWJsZXMpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGRhdGVEb2N1bWVudCh2YXJpYWJsZXMpO1xuICAgIGNvbnN0IHsgZXJyb3JzLCBkb2N1bWVudCB9ID0gcmVzdWx0O1xuICAgIHJldHVybiB7XG4gICAgICBkb2N1bWVudCxcbiAgICAgIGVycm9ycyxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGRlbGV0ZURvY3VtZW50QW5kUmVmZXRjaCA9IGFzeW5jICh2YXJpYWJsZXM6IERlbGV0ZVZhcmlhYmxlcykgPT4ge1xuICAgIGF3YWl0IGRlbGV0ZURvY3VtZW50KHZhcmlhYmxlcyBhcyBhbnkpO1xuICB9O1xuXG4gIGlmIChpc0VkaXQgJiYgbG9hZGluZykge1xuICAgIHJldHVybiA8VnVsY2FuQ29tcG9uZW50cy5Mb2FkaW5nIC8+O1xuICB9XG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybVxuICAgICAgZG9jdW1lbnQ9e2RvY3VtZW50fVxuICAgICAgbG9hZGluZz17bG9hZGluZyB8fCBsb2FkaW5nQ3VycmVudFVzZXJ9XG4gICAgICBjcmVhdGVEb2N1bWVudD17Y3JlYXRlQW5kUmV0dXJuRG9jdW1lbnQgLypjcmVhdGVEb2N1bWVudCovfVxuICAgICAgdXBkYXRlRG9jdW1lbnQ9e3VwZGF0ZUFuZFJldHVybkRvY3VtZW50fVxuICAgICAgZGVsZXRlRG9jdW1lbnQ9e2RlbGV0ZURvY3VtZW50QW5kUmVmZXRjaH1cbiAgICAgIHJlZmV0Y2g9e3JlZmV0Y2h9XG4gICAgICBjdXJyZW50VXNlcj17Y3VycmVudFVzZXJ9XG4gICAgICB7Li4uY2hpbGRQcm9wc31cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApO1xufTtcblxuLypcbkZvcm1Db250YWluZXIucHJvcFR5cGVzID0ge1xuICAvLyBtYWluIG9wdGlvbnNcbiAgZG9jdW1lbnRJZDogUHJvcFR5cGVzLnN0cmluZywgLy8gaWYgYSBkb2N1bWVudCBpcyBwYXNzZWQsIHRoaXMgd2lsbCBiZSBhbiBlZGl0IGZvcm1cbiAgbXV0YXRpb25GcmFnbWVudDogUHJvcFR5cGVzLm9iamVjdCxcbiAgbXV0YXRpb25GcmFnbWVudE5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLy8gZ3JhcGhRTFxuICAvLyBjcmVhdGVGb28sIGRlbGV0ZUZvbywgdXBkYXRlRm9vXG4gIC8vIG5ld011dGF0aW9uOiBQcm9wVHlwZXMuZnVuYywgLy8gdGhlIG5ldyBtdXRhdGlvblxuICAvLyBlZGl0TXV0YXRpb246IFByb3BUeXBlcy5mdW5jLCAvLyB0aGUgZWRpdCBtdXRhdGlvblxuICAvLyByZW1vdmVNdXRhdGlvbjogUHJvcFR5cGVzLmZ1bmMsIC8vIHRoZSByZW1vdmUgbXV0YXRpb25cblxuICAvLyBmb3JtXG4gIHByZWZpbGxlZFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBsYXlvdXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGZpZWxkczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gIGhpZGVGaWVsZHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICBhZGRGaWVsZHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICBzaG93UmVtb3ZlOiBQcm9wVHlwZXMuYm9vbCxcbiAgc3VibWl0TGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBjYW5jZWxMYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIHJldmVydExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgcmVwZWF0RXJyb3JzOiBQcm9wVHlwZXMuYm9vbCxcbiAgd2FyblVuc2F2ZWRDaGFuZ2VzOiBQcm9wVHlwZXMuYm9vbCxcbiAgZm9ybUNvbXBvbmVudHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgaXRlbVByb3BlcnRpZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIHN1Y2Nlc3NDb21wb25lbnQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5lbGVtZW50XSksXG4gIGNvbnRleHROYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8vIGNhbGxiYWNrc1xuICAuLi5jYWxsYmFja1Byb3BzLFxuXG4gIGN1cnJlbnRVc2VyOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjbGllbnQ6IFByb3BUeXBlcy5vYmplY3QsXG59O1xuXG5Gb3JtQ29udGFpbmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgbGF5b3V0OiBcImhvcml6b250YWxcIixcbn07XG4qL1xuXG4vKlxucmVnaXN0ZXJDb21wb25lbnQoe1xuICBuYW1lOiAnU21hcnRGb3JtJyxcbiAgY29tcG9uZW50OiBGb3JtQ29udGFpbmVyLFxuICBob2NzOiBbd2l0aEN1cnJlbnRVc2VyLCB3aXRoQXBvbGxvLCB3aXRoUm91dGVyLCB3aXRoQ29sbGVjdGlvblByb3BzXSxcbn0pO1xuKi9cblxuZXhwb3J0IGNvbnN0IFNtYXJ0Rm9ybSA9IEZvcm1Db250YWluZXI7XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1Db250YWluZXI7XG4iLCIvKipcbiAqIEdlbmVyYXRlIG11dGF0aW9uIGFuZCBxdWVyeSBmcmFnbWVudHMgZm9yIGEgZm9ybSBiYXNlZCBvbiB0aGUgc2NoZW1hXG4gKiBUT0RPOiByZWZhY3RvciB0byBtdXR1YWxpemUgbW9yZSBjb2RlIHdpdGggdnVsY2FuLWNvcmUgZGVmYXVsdEZyYWdtZW50IGZ1bmN0aW9uc1xuICogVE9ETzogbW92ZSB0byBsaWIgd2hlbiByZWZhY3RvcmVkXG4gKi9cbmltcG9ydCBfdW5pcSBmcm9tIFwibG9kYXNoL3VuaXFcIjtcbmltcG9ydCBfaW50ZXJzZWN0aW9uIGZyb20gXCJsb2Rhc2gvaW50ZXJzZWN0aW9uXCI7XG5pbXBvcnQgeyBncWwgfSBmcm9tIFwiQGFwb2xsby9jbGllbnRcIjtcbmltcG9ydCB7XG4gIGdldENyZWF0ZWFibGVGaWVsZHMsXG4gIGdldFVwZGF0ZWFibGVGaWVsZHMsXG4gIGdldEZyYWdtZW50RmllbGROYW1lcyxcbiAgLy9pc0JsYWNrYm94LFxufSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHtcbiAgZ2V0RmllbGRGcmFnbWVudCxcbiAgVnVsY2FuR3JhcGhxbE1vZGVsLFxuICAvL2lzQmxhY2tib3gsXG59IGZyb20gXCJAdnVsY2FuanMvZ3JhcGhxbFwiO1xuaW1wb3J0IHsgY2FwaXRhbGl6ZSB9IGZyb20gXCJAdnVsY2FuanMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgRm9ybVR5cGUgfSBmcm9tIFwiLi4vdHlwaW5nc1wiO1xuaW1wb3J0IGNvbXBhY3QgZnJvbSBcImxvZGFzaC9jb21wYWN0XCI7XG4vLyAgZ2V0RmllbGRGcmFnbWVudCxcbmNvbnN0IGludGxTdWZmaXggPSBcIl9pbnRsXCI7XG5cbi8vIFBvc3RzRWRpdEZvcm1RdWVyeUZyYWdtZW50L1Bvc3RzTmV3Rm9ybU11dGF0aW9uRnJhZ21lbnQvZXRjLlxuY29uc3QgZ2V0RnJhZ21lbnROYW1lID0gKFxuICBmb3JtVHlwZTogRm9ybVR5cGUsXG4gIG11bHRpVHlwZU5hbWU6IHN0cmluZyxcbiAgZnJhZ21lbnRUeXBlOiBcIm11dGF0aW9uXCIgfCBcInF1ZXJ5XCJcbikgPT5cbiAgW211bHRpVHlwZU5hbWUsIGZvcm1UeXBlLCBcImZvcm1cIiwgZnJhZ21lbnRUeXBlLCBcImZyYWdtZW50XCJdXG4gICAgLm1hcChjYXBpdGFsaXplKVxuICAgIC5qb2luKFwiXCIpO1xuXG4vLyBnZXQgbW9kaWZpYWJsZSBmaWVsZHMgaW4gdGhlIHF1ZXJ5IGVpdGhlciBmb3IgdXBkYXRlIG9yIGNyZWF0ZSBvcGVyYXRpb25zXG5jb25zdCBnZXRRdWVyeUZpZWxkTmFtZXMgPSAoeyBzY2hlbWEsIG9wdGlvbnMgfSkgPT4ge1xuICBjb25zdCBxdWVyeUZpZWxkcyA9XG4gICAgb3B0aW9ucy5mb3JtVHlwZSA9PT0gXCJuZXdcIlxuICAgICAgPyBnZXRDcmVhdGVhYmxlRmllbGRzKHNjaGVtYSlcbiAgICAgIDogZ2V0VXBkYXRlYWJsZUZpZWxkcyhzY2hlbWEpO1xuICByZXR1cm4gcXVlcnlGaWVsZHM7XG59O1xuLy8gYWRkIHJlYWRhYmxlIGZpZWxkcyB0byBtdXRhdGlvbiBmaWVsZHNcbmNvbnN0IGdldE11dGF0aW9uRmllbGROYW1lcyA9ICh7IHJlYWRhYmxlRmllbGROYW1lcywgcXVlcnlGaWVsZE5hbWVzIH0pID0+IHtcbiAgcmV0dXJuIF91bmlxKHF1ZXJ5RmllbGROYW1lcy5jb25jYXQocmVhZGFibGVGaWVsZE5hbWVzKSk7XG59O1xuXG4vKlxuY29uc3QgZ2V0RmllbGRGcmFnbWVudCA9ICh7IHNjaGVtYSwgZmllbGROYW1lLCBvcHRpb25zIH0pID0+IHtcbiAgICBsZXQgZmllbGRGcmFnbWVudCA9IGZpZWxkTmFtZTtcbiAgICBjb25zdCBmaWVsZCA9IHNjaGVtYVtmaWVsZE5hbWVdO1xuICAgIGlmICghKGZpZWxkICYmIGZpZWxkLnR5cGUpKSByZXR1cm4gZmllbGROYW1lO1xuICAgIGNvbnN0IGZpZWxkVHlwZSA9IGZpZWxkLnR5cGUuc2luZ2xlVHlwZTtcbiAgICBjb25zdCBmaWVsZFR5cGVOYW1lID1cbiAgICAgICAgdHlwZW9mIGZpZWxkVHlwZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgID8gJ09iamVjdCdcbiAgICAgICAgICAgIDogdHlwZW9mIGZpZWxkVHlwZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgID8gZmllbGRUeXBlLm5hbWVcbiAgICAgICAgICAgICAgICA6IGZpZWxkVHlwZTtcblxuICAgIGlmIChmaWVsZE5hbWUuc2xpY2UoLTUpID09PSBpbnRsU3VmZml4KSB7XG4gICAgICAgIGZpZWxkRnJhZ21lbnQgPSBgJHtmaWVsZE5hbWV9eyBsb2NhbGUgdmFsdWUgfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoIChmaWVsZFR5cGVOYW1lKSB7XG4gICAgICAgICAgICAvLyByZWN1cnNpdmUgY2FsbCBmb3IgbmVzdGVkIGFycmF5cyBhbmQgb2JqZWN0c1xuICAgICAgICAgICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgICAgICAgICAgICBpZiAoIWlzQmxhY2tib3goZmllbGQpICYmIGZpZWxkVHlwZS5fc2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkRnJhZ21lbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NoZW1hRnJhZ21lbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50TmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogZmllbGRUeXBlLl9zY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5SXRlbUZpZWxkTmFtZSA9IGAke2ZpZWxkTmFtZX0uJGA7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlJdGVtRmllbGQgPSBzY2hlbWFbYXJyYXlJdGVtRmllbGROYW1lXTtcbiAgICAgICAgICAgICAgICAvLyBub3RlOiBtYWtlIHN1cmUgZmllbGQgaGFzIGFuIGFzc29jaWF0ZWQgYXJyYXkgaXRlbSBmaWVsZFxuICAgICAgICAgICAgICAgIGlmIChhcnJheUl0ZW1GaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGlsZCB3aWxsIGVpdGhlciBiZSBuYXRpdmUgdmFsdWUgb3IgYSBhbiBvYmplY3QgKGZpcnN0IGNhc2UpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5SXRlbUZpZWxkVHlwZSA9IGFycmF5SXRlbUZpZWxkLnR5cGUuc2luZ2xlVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheUl0ZW1GaWVsZC5ibGFja2JveCAmJiBhcnJheUl0ZW1GaWVsZFR5cGUuX3NjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGcmFnbWVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NoZW1hRnJhZ21lbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBhcnJheUl0ZW1GaWVsZFR5cGUuX3NjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaW50bCBvciByZXR1cm4gZmllbGROYW1lXG4gICAgICAgICAgICAgICAgZmllbGRGcmFnbWVudCA9IGZpZWxkTmFtZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmllbGRGcmFnbWVudDtcbn07XG4qL1xuXG4vLyBnZXQgZnJhZ21lbnQgZm9yIGEgd2hvbGUgc2NoZW1hIChyb290IHNjaGVtYSBvciBuZXN0ZWQgc2NoZW1hIG9mIGFuIG9iamVjdCBvciBhbiBhcnJheSlcbmNvbnN0IGdldFNjaGVtYUZyYWdtZW50ID0gKHtcbiAgc2NoZW1hLFxuICBmcmFnbWVudE5hbWUsXG4gIG9wdGlvbnMsXG4gIGZpZWxkTmFtZXM6IHByb3ZpZGVkRmllbGROYW1lcyxcbn0pID0+IHtcbiAgLy8gZGlmZmVyZW50aWF0ZSBtdXRhdGlvbi9xdWVyeSBhbmQgY3JlYXRlL3VwZGF0ZSBjYXNlc1xuICAvLyByZXNwZWN0IHByb3ZpZGVkIGZpZWxkTmFtZXMgaWYgYW55IChuZWVkZWQgZm9yIHRoZSByb290IHNjaGVtYSlcbiAgY29uc3QgZmllbGROYW1lcyA9XG4gICAgcHJvdmlkZWRGaWVsZE5hbWVzIHx8XG4gICAgKG9wdGlvbnMuaXNNdXRhdGlvblxuICAgICAgPyBnZXRNdXRhdGlvbkZpZWxkTmFtZXMoe1xuICAgICAgICAgIHF1ZXJ5RmllbGROYW1lczogZ2V0UXVlcnlGaWVsZE5hbWVzKHsgc2NoZW1hLCBvcHRpb25zIH0pLFxuICAgICAgICAgIHJlYWRhYmxlRmllbGROYW1lczogZ2V0RnJhZ21lbnRGaWVsZE5hbWVzKHtcbiAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgb25seVZpZXdhYmxlOiB0cnVlIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pXG4gICAgICA6IGdldFF1ZXJ5RmllbGROYW1lcyh7IHNjaGVtYSwgb3B0aW9ucyB9KSk7XG5cbiAgY29uc3QgY2hpbGRGcmFnbWVudHMgPVxuICAgIGZpZWxkTmFtZXMubGVuZ3RoICYmXG4gICAgZmllbGROYW1lc1xuICAgICAgLm1hcCgoZmllbGROYW1lKSA9PlxuICAgICAgICBnZXRGaWVsZEZyYWdtZW50KHtcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgZ2V0T2JqZWN0RnJhZ21lbnQ6IGdldFNjaGVtYUZyYWdtZW50LCAvLyBhbGxvdyB0byByZXVzZSB0aGUgY29kZSBmcm9tIGRlZmF1bHRGcmFnbWVudCB3aXRoIGFub3RoZXIgYmVoYXZpb3VyXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAvLyByZW1vdmUgZW1wdHkgdmFsdWVzXG4gICAgICAuZmlsdGVyKChmKSA9PiAhIWYpO1xuICBpZiAoY2hpbGRGcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGAke2ZyYWdtZW50TmFtZX0geyAke2NoaWxkRnJhZ21lbnRzLmpvaW4oXCJcXG5cIil9IH1gO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBxdWVyeSBhbmQgbXV0YXRpb24gZnJhZ21lbnRzIGZvciBmb3JtcywgZHluYW1pY2FsbHkgIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBmaWVsZHNcbiAqL1xuY29uc3QgZ2V0Rm9ybUZyYWdtZW50cyA9ICh7XG4gIGZvcm1UeXBlID0gXCJuZXdcIixcbiAgbW9kZWwsXG4gIGZpZWxkcywgLy8gcmVzdHJpY3Qgb24gY2VydGFpbiBmaWVsZHNcbiAgYWRkRmllbGRzLCAvLyBhZGQgYWRkaXRpb25hbCBmaWVsZHMgKGVnIHRvIGRpc3BsYXkgc3RhdGljIGZpZWxkcylcbn06IHtcbiAgbW9kZWw6IFZ1bGNhbkdyYXBocWxNb2RlbDtcbiAgZm9ybVR5cGU6IEZvcm1UeXBlO1xuICBmaWVsZHM/OiBBcnJheTxzdHJpbmc+OyAvLyByZXN0cmljdCBvbiBjZXJ0YWluIGZpZWxkc1xuICBhZGRGaWVsZHM/OiBBcnJheTxzdHJpbmc+OyAvLyBhZGQgYWRkaXRpb25hbCBmaWVsZHMgKGVnIHRvIGRpc3BsYXkgc3RhdGljIGZpZWxkcylcbn0pID0+IHtcbiAgY29uc3QgeyBzY2hlbWEsIG5hbWUsIGdyYXBocWwgfSA9IG1vZGVsO1xuICBjb25zdCB7IHR5cGVOYW1lLCBtdWx0aVR5cGVOYW1lIH0gPSBncmFwaHFsO1xuICAvLyBnZXQgdGhlIHJvb3Qgc2NoZW1hIGZpZWxkTmFtZXNcbiAgbGV0IHF1ZXJ5RmllbGROYW1lcyA9IGdldFF1ZXJ5RmllbGROYW1lcyh7IHNjaGVtYSwgb3B0aW9uczogeyBmb3JtVHlwZSB9IH0pO1xuICBsZXQgbXV0YXRpb25GaWVsZE5hbWVzID0gZ2V0TXV0YXRpb25GaWVsZE5hbWVzKHtcbiAgICBxdWVyeUZpZWxkTmFtZXMsXG4gICAgcmVhZGFibGVGaWVsZE5hbWVzOiBnZXRGcmFnbWVudEZpZWxkTmFtZXMoe1xuICAgICAgc2NoZW1hLFxuICAgICAgb3B0aW9uczogeyBvbmx5Vmlld2FibGU6IHRydWUgfSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgLy8gaWYgXCJmaWVsZHNcIiBwcm9wIGlzIHNwZWNpZmllZCwgcmVzdHJpY3QgbGlzdCBvZiBmaWVsZHMgdG8gaXRcbiAgaWYgKGZpZWxkcyAmJiBmaWVsZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAvLyBhZGQgXCJfaW50bFwiIHN1ZmZpeCB0byBhbGwgZmllbGRzIGluIGNhc2Ugc29tZSBvZiB0aGVtIGFyZSBpbnRsIGZpZWxkc1xuICAgIGNvbnN0IGZpZWxkc1dpdGhJbnRsU3VmZml4ID0gZmllbGRzLm1hcCgoZmllbGQpID0+IGAke2ZpZWxkfSR7aW50bFN1ZmZpeH1gKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSBbLi4uZmllbGRzLCAuLi5maWVsZHNXaXRoSW50bFN1ZmZpeF07XG4gICAgcXVlcnlGaWVsZE5hbWVzID0gX2ludGVyc2VjdGlvbihxdWVyeUZpZWxkTmFtZXMsIGFsbEZpZWxkcyk7XG4gICAgbXV0YXRpb25GaWVsZE5hbWVzID0gX2ludGVyc2VjdGlvbihtdXRhdGlvbkZpZWxkTmFtZXMsIGFsbEZpZWxkcyk7XG4gIH1cblxuICAvLyBhZGQgXCJhZGRGaWVsZHNcIiBwcm9wIGNvbnRlbnRzIHRvIGxpc3Qgb2YgZmllbGRzXG4gIGlmIChhZGRGaWVsZHM/Lmxlbmd0aCkge1xuICAgIHF1ZXJ5RmllbGROYW1lcyA9IHF1ZXJ5RmllbGROYW1lcy5jb25jYXQoYWRkRmllbGRzKTtcbiAgICBtdXRhdGlvbkZpZWxkTmFtZXMgPSBtdXRhdGlvbkZpZWxkTmFtZXMuY29uY2F0KGFkZEZpZWxkcyk7XG4gIH1cblxuICAvLyB1c2VySWQgaXMgdXNlZCB0byBjaGVjayBmb3IgcGVybWlzc2lvbnMsIHNvIGFkZCBpdCB0byBmcmFnbWVudHMgaWYgcG9zc2libGVcbiAgaWYgKHNjaGVtYS51c2VySWQpIHtcbiAgICBxdWVyeUZpZWxkTmFtZXMudW5zaGlmdChcInVzZXJJZFwiKTtcbiAgICBtdXRhdGlvbkZpZWxkTmFtZXMudW5zaGlmdChcInVzZXJJZFwiKTtcbiAgfVxuXG4gIGlmIChzY2hlbWEuX2lkKSB7XG4gICAgcXVlcnlGaWVsZE5hbWVzLnVuc2hpZnQoXCJfaWRcIik7XG4gICAgbXV0YXRpb25GaWVsZE5hbWVzLnVuc2hpZnQoXCJfaWRcIik7XG4gIH1cblxuICAvLyBjaGVjayB1bmljaXR5IChfaWQgY2FuIGJlIGFkZGVkIHR3aWNlKVxuICBxdWVyeUZpZWxkTmFtZXMgPSBfdW5pcShxdWVyeUZpZWxkTmFtZXMpO1xuICBtdXRhdGlvbkZpZWxkTmFtZXMgPSBfdW5pcShtdXRhdGlvbkZpZWxkTmFtZXMpO1xuXG4gIGlmIChxdWVyeUZpZWxkTmFtZXMubGVuZ3RoID09PSAwKVxuICAgIC8vIE5PVEU6IGluIHRoZW9yeSwgeW91IGNvdWxkIGhhdmUgbm8gcXVlcmlhYmxlIGZpZWxkcywgYnV0IG11dGFibGUgZmllbGRzID0+XG4gICAgLy8gYSBmb3JtIGZvciBkYXRhIHRoYXQgeW91IGNhbiBjcmVhdGUgYnV0IGNhbiBuZXZlciBzZWUuLi5cbiAgICAvLyBTaW5jZSB0aGF0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLCB3ZSB0aHJvdyBhbiBlcnJvciB0byBzZWN1cmUgdGhlIGVuZCB1c2VyXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1vZGVsIFwiJHttb2RlbC5uYW1lfVwiIGhhcyBubyBxdWVyeWFibGUgZmllbGRzLCBjYW5ub3QgY3JlYXRlIGEgZm9ybSBmb3IgaXQuIFBsZWFzZSBhZGQgcmVhZGFibGUvY3JlYXRlYWJsZS91cGRhdGVhYmxlIGZpZWxkcyB0byB0aGUgbW9kZWwgc2NoZW1hLmBcbiAgICApO1xuICBpZiAobXV0YXRpb25GaWVsZE5hbWVzLmxlbmd0aCA9PT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9kZWwgXCIke21vZGVsLm5hbWV9XCIgaGFzIG5vIG11dGFibGUgZmllbGRzLCBjYW5ub3QgY3JlYXRlIGEgZm9ybSBmb3IgaXQuIFBsZWFzZSBhZGQgY3JlYXRlYWJsZS91cGRhdGVhYmxlIGZpZWxkcyB0byBtb2RlbCBzY2hlbWEuYFxuICAgICk7XG5cbiAgY29uc3QgcXVlcnlGcmFnbWVudE5hbWUgPSBnZXRGcmFnbWVudE5hbWUoXG4gICAgZm9ybVR5cGUsXG4gICAgbXVsdGlUeXBlTmFtZSwgLy8gcHJldmlvdXNseSBjb2xsZWN0aW9uTmFtZSAvL25hbWUsXG4gICAgXCJxdWVyeVwiXG4gICk7XG4gIC8vIGdlbmVyYXRlIHF1ZXJ5IGZyYWdtZW50IGJhc2VkIG9uIHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgZWRpdGVkLiBOb3RlOiBhbHdheXMgYWRkIF9pZCwgYW5kIHVzZXJJZCBpZiBwb3NzaWJsZS5cbiAgLy8gVE9ETzogc3VwcG9ydCBuZXN0aW5nXG4gIGNvbnN0IHF1ZXJ5RnJhZ21lbnRUZXh0ID0gZ2V0U2NoZW1hRnJhZ21lbnQoe1xuICAgIHNjaGVtYSxcbiAgICBmcmFnbWVudE5hbWU6IGBmcmFnbWVudCAke3F1ZXJ5RnJhZ21lbnROYW1lfSBvbiAke3R5cGVOYW1lfWAsXG4gICAgb3B0aW9uczogeyBmb3JtVHlwZSwgaXNNdXRhdGlvbjogZmFsc2UgfSxcbiAgICBmaWVsZE5hbWVzOiBxdWVyeUZpZWxkTmFtZXMsXG4gIH0pO1xuICBpZiAoIXF1ZXJ5RnJhZ21lbnRUZXh0KSB7XG4gICAgLy8gTk9URTogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGlmIHdlIGRvbid0IGhhdmUgYW4gZW1wdHkgYXJyYXkgZm9yIGZpZWxkIG5hbWVzXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwubmFtZX0gd2l0aCBmaWVsZHMgJHtxdWVyeUZpZWxkTmFtZXN9IHlpZWxkIGFuIGVtcHR5IHF1ZXJ5IGZyYWdtZW50LmBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbmVyYXRlZFF1ZXJ5RnJhZ21lbnQgPSBncWwocXVlcnlGcmFnbWVudFRleHQpO1xuXG4gIGNvbnN0IG11dGF0aW9uRnJhZ21lbnROYW1lID0gZ2V0RnJhZ21lbnROYW1lKFxuICAgIGZvcm1UeXBlLFxuICAgIG11bHRpVHlwZU5hbWUsIC8vIHByZXZpb3VzbHkgY29sbGVjdGlvbk5hbWUsXG4gICAgXCJtdXRhdGlvblwiXG4gICk7XG4gIGNvbnN0IG11dGF0aW9uRnJhZ21lbnRUZXh0ID0gZ2V0U2NoZW1hRnJhZ21lbnQoe1xuICAgIHNjaGVtYSxcbiAgICBmcmFnbWVudE5hbWU6IGBmcmFnbWVudCAke211dGF0aW9uRnJhZ21lbnROYW1lfSBvbiAke3R5cGVOYW1lfWAsXG4gICAgb3B0aW9uczogeyBmb3JtVHlwZSwgaXNNdXRhdGlvbjogdHJ1ZSB9LFxuICAgIGZpZWxkTmFtZXM6IG11dGF0aW9uRmllbGROYW1lcyxcbiAgfSk7XG4gIGlmICghbXV0YXRpb25GcmFnbWVudFRleHQpIHtcbiAgICAvLyBOT1RFOiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbXB0eSBhcnJheSBmb3IgZmllbGQgbmFtZXNcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9kZWwgJHttb2RlbC5uYW1lfSB3aXRoIGZpZWxkcyAke211dGF0aW9uRmllbGROYW1lc30geWllbGQgYW4gZW1wdHkgbXV0YXRpb24gZnJhZ21lbnQuYFxuICAgICk7XG4gIH1cbiAgLy8gZ2VuZXJhdGUgbXV0YXRpb24gZnJhZ21lbnQgYmFzZWQgb24gdGhlIGZpZWxkcyB0aGF0IGNhbiBiZSBlZGl0ZWQgYW5kL29yIHZpZXdlZC4gTm90ZTogYWx3YXlzIGFkZCBfaWQsIGFuZCB1c2VySWQgaWYgcG9zc2libGUuXG4gIC8vIFRPRE86IHN1cHBvcnQgbmVzdGluZ1xuICBjb25zdCBnZW5lcmF0ZWRNdXRhdGlvbkZyYWdtZW50ID0gZ3FsKG11dGF0aW9uRnJhZ21lbnRUZXh0KTtcblxuICAvLyBpZiBhbnkgZmllbGQgc3BlY2lmaWVzIGV4dHJhIHF1ZXJpZXMsIGFkZCB0aGVtXG4gIGNvbnN0IGV4dHJhUXVlcmllcyA9IGNvbXBhY3QoXG4gICAgZ2V0UXVlcnlGaWVsZE5hbWVzKHsgc2NoZW1hLCBvcHRpb25zOiB7IGZvcm1UeXBlIH0gfSkubWFwKChmaWVsZE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gICAgICByZXR1cm4gZmllbGQucXVlcnk7XG4gICAgfSlcbiAgKTtcbiAgLy8gZ2V0IHF1ZXJ5ICYgbXV0YXRpb24gZnJhZ21lbnRzIGZyb20gcHJvcHMgb3IgZWxzZSBkZWZhdWx0IHRvIHNhbWUgYXMgZ2VuZXJhdGVkRnJhZ21lbnRcbiAgcmV0dXJuIHtcbiAgICBxdWVyeUZyYWdtZW50OiBnZW5lcmF0ZWRRdWVyeUZyYWdtZW50LFxuICAgIG11dGF0aW9uRnJhZ21lbnQ6IGdlbmVyYXRlZE11dGF0aW9uRnJhZ21lbnQsXG4gICAgcXVlcnlGcmFnbWVudE5hbWUsXG4gICAgbXV0YXRpb25GcmFnbWVudE5hbWUsXG4gICAgZXh0cmFRdWVyaWVzLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0Rm9ybUZyYWdtZW50cztcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkB2dWxjYW5qcy9zY2hlbWFcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL3JlYWN0LWhvb2tzXCIpOyIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmV4cG9ydCBpbnRlcmZhY2UgRHVtbXlQcm9wcyB7fVxuXG5leHBvcnQgY29uc3QgRHVtbXkgPSAoKSA9PiAoXG4gIDxzcGFuPlxuICAgIFlvdSBoYXZlIG5vdCBzZXR1cCBWdWxjYW5Db21wb25lbnRzUHJvdmlkZXIuIFBsZWFzZSBhZGQgZm9sbG93aW5nIGNvZGUgaW5cbiAgICB5b3VyIGFwcDp7XCIgXCJ9XG4gICAgPGNvZGU+e2BpbXBvcnQgeyBWdWxjYW5Db21wb25lbnRzUHJvdmlkZXIgfSBmcm9tIFwiQHZ1bGNhbmpzL3JlYWN0LXVpXCI7IGNvbnN0IFlvdXJBcHAgPSA8VnVsY2FuQ29tcG9uZW50c1Byb3ZpZGVyPnsvKiB5b3VyIGFwcCAqL308L1Z1bGNhbkNvbXBvbmVudHNQcm92aWRlcj47fWB9PC9jb2RlPlxuICA8L3NwYW4+XG4pO1xuIiwiLypcblxuTWFpbiBmb3JtIGNvbXBvbmVudC5cblxuVGhpcyBjb21wb25lbnQgZXhwZWN0czpcblxuIyMjIEFsbCBGb3JtczpcblxuLSBjb2xsZWN0aW9uXG4tIGN1cnJlbnRVc2VyXG4tIGNsaWVudCAoQXBvbGxvIGNsaWVudClcblxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgcnVuQ2FsbGJhY2tzLCBnZXRFcnJvcnMgfSBmcm9tIFwiQHZ1bGNhbmpzL2NvcmVcIjtcbmltcG9ydCB7IHVzZUludGxDb250ZXh0IH0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5pbXBvcnQgeyByZW1vdmVQcm9wZXJ0eSB9IGZyb20gXCJAdnVsY2FuanMvdXRpbHNcIjtcbmltcG9ydCBfZmlsdGVyIGZyb20gXCJsb2Rhc2gvZmlsdGVyXCI7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gXCJsb2Rhc2gvY2xvbmVEZWVwXCI7XG5pbXBvcnQgY29tcGFjdCBmcm9tIFwibG9kYXNoL2NvbXBhY3RcIjtcbmltcG9ydCBnZXQgZnJvbSBcImxvZGFzaC9nZXRcIjtcbmltcG9ydCBpc09iamVjdCBmcm9tIFwibG9kYXNoL2lzT2JqZWN0XCI7XG5pbXBvcnQgbWFwVmFsdWVzIGZyb20gXCJsb2Rhc2gvbWFwVmFsdWVzXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcImxvZGFzaC9tZXJnZVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcImxvZGFzaC9vbWl0XCI7XG5pbXBvcnQgb21pdEJ5IGZyb20gXCJsb2Rhc2gvb21pdEJ5XCI7XG5pbXBvcnQgcGljayBmcm9tIFwibG9kYXNoL3BpY2tcIjtcbmltcG9ydCBwaWNrQnkgZnJvbSBcImxvZGFzaC9waWNrQnlcIjtcbmltcG9ydCBzZXQgZnJvbSBcImxvZGFzaC9zZXRcIjtcbmltcG9ydCB1bnNldCBmcm9tIFwibG9kYXNoL3Vuc2V0XCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCJsb2Rhc2gvdXBkYXRlXCI7XG5pbXBvcnQgd2l0aG91dCBmcm9tIFwibG9kYXNoL3dpdGhvdXRcIjtcbmltcG9ydCBpc0VtcHR5IGZyb20gXCJsb2Rhc2gvaXNFbXB0eVwiO1xuaW1wb3J0IHR5cGUgeyBGb3JtTGF5b3V0UHJvcHMgfSBmcm9tIFwiLi4vRm9ybUxheW91dFwiO1xuaW1wb3J0IHR5cGUgeyBGb3JtU3VibWl0UHJvcHMgfSBmcm9tIFwiLi4vRm9ybVN1Ym1pdFwiO1xuXG5pbXBvcnQge1xuICBjb252ZXJ0U2NoZW1hLFxuICBnZXRFZGl0YWJsZUZpZWxkcyxcbiAgZ2V0SW5zZXJ0YWJsZUZpZWxkcyxcbn0gZnJvbSBcIi4uL21vZHVsZXMvc2NoZW1hX3V0aWxzXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IHsgZ2V0UGFyZW50UGF0aCB9IGZyb20gXCIuLi9tb2R1bGVzL3BhdGhfdXRpbHNcIjtcbi8vIGltcG9ydCB3aXRoQ29sbGVjdGlvblByb3BzIGZyb20gXCIuL3dpdGhDb2xsZWN0aW9uUHJvcHNcIjtcbmltcG9ydCB7IEZvcm1Db250ZXh0IH0gZnJvbSBcIi4uL0Zvcm1Db250ZXh0XCI7XG5pbXBvcnQgeyBnZXRGaWVsZEdyb3VwcywgZ2V0RmllbGROYW1lcywgZ2V0TGFiZWwgfSBmcm9tIFwiLi9maWVsZHNcIjtcbmltcG9ydCB7IGlzTm90U2FtZURvY3VtZW50IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IHVzZVdhcm5PblVuc2F2ZWQgfSBmcm9tIFwiLi4vdXNlV2Fybk9uVW5zYXZlZFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi8uLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbmltcG9ydCB0eXBlIHsgRm9ybVR5cGUgfSBmcm9tIFwiLi4vdHlwaW5nc1wiO1xuaW1wb3J0IHtcbiAgQ3JlYXRlRG9jdW1lbnRSZXN1bHQsXG4gIEZvcm1Qcm9wcyxcbiAgRm9ybVN0YXRlLFxuICBVcGRhdGVEb2N1bWVudFJlc3VsdCxcbn0gZnJvbSBcIi4vdHlwaW5nc1wiO1xuaW1wb3J0IHsgTXV0YXRpb25SZXN1bHQgfSBmcm9tIFwiQGFwb2xsby9jbGllbnRcIjtcblxuLy8gcHJvcHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGZvcm0gcmVzZXRcbmNvbnN0IFJFU0VUX1BST1BTID0gW1xuICBcIm1vZGVsXCIsXG4gIC8vIFwiY29sbGVjdGlvblwiLFxuICAvLyBcImNvbGxlY3Rpb25OYW1lXCIsXG4gIFwiZG9jdW1lbnRcIixcbiAgXCJzY2hlbWFcIixcbiAgXCJjdXJyZW50VXNlclwiLFxuICBcImZpZWxkc1wiLFxuICBcInJlbW92ZUZpZWxkc1wiLFxuICBcInByZWZpbGxlZFByb3BzXCIsIC8vIFRPRE86IHByZWZpbGxlZFByb3BzIHNob3VsZCBiZSBtZXJnZWQgaW5zdGVhZD9cbl07XG5cbmNvbnN0IGNvbXBhY3RQYXJlbnQgPSAob2JqZWN0LCBwYXRoKSA9PiB7XG4gIGNvbnN0IHBhcmVudFBhdGggPSBnZXRQYXJlbnRQYXRoKHBhdGgpO1xuXG4gIC8vIG5vdGU6IHdlIG9ubHkgd2FudCB0byBjb21wYWN0IGFycmF5cywgbm90IG9iamVjdHNcbiAgY29uc3QgY29tcGFjdElmQXJyYXkgPSAoeCkgPT4gKEFycmF5LmlzQXJyYXkoeCkgPyBjb21wYWN0KHgpIDogeCk7XG5cbiAgdXBkYXRlKG9iamVjdCwgcGFyZW50UGF0aCwgY29tcGFjdElmQXJyYXkpO1xufTtcblxuY29uc3QgZ2V0RGVmYXVsdFZhbHVlcyA9IChjb252ZXJ0ZWRTY2hlbWEpID0+IHtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIHdvcmsgd2l0aCBuZXN0ZWQgc2NoZW1hcywgdG9vXG4gIHJldHVybiBwaWNrQnkoXG4gICAgbWFwVmFsdWVzKGNvbnZlcnRlZFNjaGVtYSwgKGZpZWxkKSA9PiBmaWVsZC5kZWZhdWx0VmFsdWUpLFxuICAgICh2YWx1ZSkgPT4gdmFsdWVcbiAgKTtcbn07XG5cbmNvbnN0IGNvbXBhY3RPYmplY3QgPSAobykgPT4gb21pdEJ5KG8sIChmKSA9PiBmID09PSBudWxsIHx8IGYgPT09IHVuZGVmaW5lZCk7XG5cbmNvbnN0IGdldEluaXRpYWxTdGF0ZUZyb21Qcm9wcyA9IChuZXh0UHJvcHM6IEZvcm1Qcm9wcyk6IEZvcm1TdGF0ZSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IG5leHRQcm9wcy5zY2hlbWEgfHwgbmV4dFByb3BzLm1vZGVsLnNjaGVtYTtcbiAgY29uc3QgY29udmVydGVkU2NoZW1hID0gY29udmVydFNjaGVtYShzY2hlbWEpO1xuICBjb25zdCBmb3JtVHlwZTogRm9ybVR5cGUgPSBuZXh0UHJvcHMuZG9jdW1lbnQgPyBcImVkaXRcIiA6IFwibmV3XCI7XG4gIC8vIGZvciBuZXcgZG9jdW1lbnQgZm9ybXMsIGFkZCBkZWZhdWx0IHZhbHVlcyB0byBpbml0aWFsIGRvY3VtZW50XG4gIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPVxuICAgIGZvcm1UeXBlID09PSBcIm5ld1wiID8gZ2V0RGVmYXVsdFZhbHVlcyhjb252ZXJ0ZWRTY2hlbWEpIDoge307XG4gIC8vIG5vdGU6IHdlIHJlbW92ZSBudWxsL3VuZGVmaW5lZCB2YWx1ZXMgZnJvbSB0aGUgbG9hZGVkIGRvY3VtZW50IHNvIHRoZXkgZG9uJ3Qgb3ZlcndyaXRlIHBvc3NpYmxlIHByZWZpbGxlZFByb3BzXG4gIGNvbnN0IGluaXRpYWxEb2N1bWVudCA9IG1lcmdlKFxuICAgIHt9LFxuICAgIGRlZmF1bHRWYWx1ZXMsXG4gICAgbmV4dFByb3BzLnByZWZpbGxlZFByb3BzLFxuICAgIGNvbXBhY3RPYmplY3QobmV4dFByb3BzLmRvY3VtZW50KVxuICApO1xuXG4gIC8vaWYgbWluQ291bnQgaXMgc3BlY2lmaWVkLCBnbyBhaGVhZCBhbmQgY3JlYXRlIGVtcHR5IG5lc3RlZCBkb2N1bWVudHNcbiAgT2JqZWN0LmtleXMoY29udmVydGVkU2NoZW1hKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBsZXQgbWluQ291bnQgPSBjb252ZXJ0ZWRTY2hlbWFba2V5XS5taW5Db3VudDtcbiAgICBpZiAobWluQ291bnQpIHtcbiAgICAgIGluaXRpYWxEb2N1bWVudFtrZXldID0gaW5pdGlhbERvY3VtZW50W2tleV0gfHwgW107XG4gICAgICB3aGlsZSAoaW5pdGlhbERvY3VtZW50W2tleV0ubGVuZ3RoIDwgbWluQ291bnQpXG4gICAgICAgIGluaXRpYWxEb2N1bWVudFtrZXldLnB1c2goe30pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGBfX3R5cGVuYW1lYCBwcm9wZXJ0eSBmcm9tIGRvY3VtZW50XG4gIHJlbW92ZVByb3BlcnR5KGluaXRpYWxEb2N1bWVudCwgXCJfX3R5cGVuYW1lXCIpO1xuXG4gIHJldHVybiB7XG4gICAgZGlzYWJsZWQ6IG5leHRQcm9wcy5kaXNhYmxlZCxcbiAgICBlcnJvcnM6IFtdLFxuICAgIGRlbGV0ZWRWYWx1ZXM6IFtdLFxuICAgIGN1cnJlbnRWYWx1ZXM6IHt9LFxuICAgIG9yaWdpbmFsU2NoZW1hOiBjb252ZXJ0U2NoZW1hKHNjaGVtYSwgeyByZW1vdmVBcnJheXM6IGZhbHNlIH0pLFxuICAgIC8vIGNvbnZlcnQgU2ltcGxlU2NoZW1hIHNjaGVtYSBpbnRvIEpTT04gb2JqZWN0XG4gICAgc2NoZW1hOiBjb252ZXJ0ZWRTY2hlbWEsXG4gICAgLy8gQWxzbyBzdG9yZSBhbGwgZmllbGQgc2NoZW1hcyAoaW5jbHVkaW5nIG5lc3RlZCBzY2hlbWFzKSBpbiBhIGZsYXQgc3RydWN0dXJlXG4gICAgZmxhdFNjaGVtYTogY29udmVydFNjaGVtYShzY2hlbWEsIHsgZmxhdHRlbjogdHJ1ZSB9KSxcbiAgICAvLyB0aGUgaW5pdGlhbCBkb2N1bWVudCBwYXNzZWQgYXMgcHJvcHNcbiAgICBpbml0aWFsRG9jdW1lbnQsXG4gICAgLy8gaW5pdGlhbGl6ZSB0aGUgY3VycmVudCBkb2N1bWVudCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgaW5pdGlhbCBkb2N1bWVudFxuICAgIGN1cnJlbnREb2N1bWVudDogaW5pdGlhbERvY3VtZW50LFxuICB9O1xufTtcblxuY29uc3QgZ2V0Q2hpbGRyZW5Qcm9wcyA9IChcbiAgcHJvcHM6IEZvcm1Qcm9wcyxcbiAgc3RhdGU6IFBpY2s8Rm9ybVN0YXRlLCBcImRpc2FibGVkXCIgfCBcImN1cnJlbnREb2N1bWVudFwiPixcbiAgb3B0aW9uczogeyBmb3JtVHlwZTogRm9ybVR5cGUgfSxcbiAgLy8gVE9ETzogdGhhdCBiZWxvbmdzIHRvIHRoZSBjb250ZXh0IGluc3RlYWRcbiAgY2FsbGJhY2tzOiB7IGRlbGV0ZURvY3VtZW50OiBGdW5jdGlvbiB9XG4pOiB7XG4gIGZvcm1MYXlvdXRQcm9wczogRm9ybUxheW91dFByb3BzO1xuICBmb3JtR3JvdXBQcm9wczogRnVuY3Rpb247XG4gIGNvbW1vblByb3BzOiBhbnk7XG4gIGZvcm1TdWJtaXRQcm9wczogRm9ybVN1Ym1pdFByb3BzO1xufSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXJyZW50VXNlcixcbiAgICByZXBlYXRFcnJvcnMsXG4gICAgc3VibWl0TGFiZWwsXG4gICAgY2FuY2VsTGFiZWwsXG4gICAgcmV2ZXJ0TGFiZWwsXG4gICAgY2FuY2VsQ2FsbGJhY2ssXG4gICAgcmV2ZXJ0Q2FsbGJhY2ssXG4gICAgaWQsXG4gICAgbW9kZWwsXG4gICAgcHJlZmlsbGVkUHJvcHMsXG4gICAgaXRlbVByb3BlcnRpZXMsXG4gICAgY29udGV4dE5hbWUsXG4gICAgc2hvd1JlbW92ZSxcbiAgICBzaG93RGVsZXRlLFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgZGlzYWJsZWQsIGN1cnJlbnREb2N1bWVudCB9ID0gc3RhdGU7XG4gIGNvbnN0IHsgZm9ybVR5cGUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHsgZGVsZXRlRG9jdW1lbnQgfSA9IGNhbGxiYWNrcztcbiAgY29uc3QgY29tbW9uUHJvcHMgPSB7XG4gICAgZG9jdW1lbnQ6IGN1cnJlbnREb2N1bWVudCxcbiAgICBmb3JtVHlwZSxcbiAgICBjdXJyZW50VXNlcixcbiAgICBkaXNhYmxlZCxcbiAgICBwcmVmaWxsZWRQcm9wcyxcbiAgICBpdGVtUHJvcGVydGllcyxcbiAgICBjb250ZXh0TmFtZSxcbiAgfTtcblxuICBjb25zdCBkb2NDbGFzc05hbWUgPSBgZG9jdW1lbnQtJHtmb3JtVHlwZX1gO1xuICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGZvcm1Qcm9wcyA9IHtcbiAgICBjbGFzc05hbWU6IGAke2RvY0NsYXNzTmFtZX0gJHtkb2NDbGFzc05hbWV9LSR7bW9kZWxOYW1lfWAsXG4gICAgaWQ6IGlkLFxuICAgIC8vIEl0J3MgdGhlIGZvcm0gZWxlbWVudCByZXNwb25zaWJpbGl0eSB0byBnZXQgc3VibWl0Rm9ybSBmcm9tIGNvbnRleHRcbiAgICAvLyBvblN1Ym1pdDogdGhpcy5zdWJtaXRGb3JtKGZvcm1UeXBlKSxcbiAgICAvLyBUT0RPOiB1cGRhdGUgdG8gdXNlUmVmXG4gICAgLy9yZWY6IChlKSA9PiB7XG4gICAgLy8gIHRoaXMuZm9ybSA9IGU7XG4gICAgLy99LFxuICB9O1xuXG4gIGNvbnN0IGZvcm1Hcm91cFByb3BzID0gKGdyb3VwKSA9PiAoe1xuICAgIGtleTogZ3JvdXAubmFtZSxcbiAgICAuLi5ncm91cCxcbiAgICBncm91cDogb21pdChncm91cCwgW1wiZmllbGRzXCJdKSxcbiAgICAuLi5jb21tb25Qcm9wcyxcbiAgfSk7XG5cbiAgY29uc3QgZm9ybVN1Ym1pdFByb3BzID0ge1xuICAgIG1vZGVsLFxuICAgIGN1cnJlbnRVc2VyLFxuICAgIHN1Ym1pdExhYmVsLFxuICAgIGNhbmNlbExhYmVsLFxuICAgIHJldmVydExhYmVsLFxuICAgIGNhbmNlbENhbGxiYWNrLFxuICAgIHJldmVydENhbGxiYWNrLFxuICAgIGRvY3VtZW50OiBjdXJyZW50RG9jdW1lbnQsXG4gICAgLy8gVE9ETzogc2hvdWxkIHByb2JhYmx5IGJlIHBhc3NlZCB0aHJvdWdoIGNvbnRleHRcbiAgICBkZWxldGVEb2N1bWVudDpcbiAgICAgIChmb3JtVHlwZSA9PT0gXCJlZGl0XCIgJiYgc2hvd1JlbW92ZSAmJiBzaG93RGVsZXRlICYmIGRlbGV0ZURvY3VtZW50KSB8fFxuICAgICAgbnVsbCxcbiAgfTtcblxuICBjb25zdCBmb3JtTGF5b3V0UHJvcHMgPSB7XG4gICAgZm9ybVByb3BzOiBmb3JtUHJvcHMsXG4gICAgcmVwZWF0RXJyb3JzOiByZXBlYXRFcnJvcnMsXG4gICAgc3VibWl0UHJvcHM6IGZvcm1TdWJtaXRQcm9wcyxcbiAgICBjb21tb25Qcm9wcyxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBjb21tb25Qcm9wcyxcbiAgICBmb3JtU3VibWl0UHJvcHMsXG4gICAgZm9ybUdyb3VwUHJvcHMsXG4gICAgZm9ybUxheW91dFByb3BzLFxuICB9O1xufTtcblxuLy8gY29tcG9uZW50IGZvcm0gdW50aWwgd2UgZ28gc3RhdGVsZXNzXG5jb25zdCBGb3JtV2FyblVuc2F2ZWQgPSAoe1xuICBpc0NoYW5nZWQsXG4gIHdhcm5VbnNhdmVkQ2hhbmdlcyxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGlzQ2hhbmdlZDogYm9vbGVhbjtcbiAgd2FyblVuc2F2ZWRDaGFuZ2VzPzogYm9vbGVhbjtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pID0+IHtcbiAgdXNlV2Fybk9uVW5zYXZlZCh7XG4gICAgaXNDaGFuZ2VkLFxuICAgIHdhcm5VbnNhdmVkQ2hhbmdlcyxcbiAgfSk7XG4gIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG59O1xuXG4vKlxuXG4gIExpa2UgZ2V0RG9jdW1lbnQsIGJ1dCBjcm9zcy1yZWZlcmVuY2Ugd2l0aCBnZXRGaWVsZE5hbWVzKClcbiAgdG8gb25seSByZXR1cm4gZmllbGRzIHRoYXQgYWN0dWFsbHkgbmVlZCB0byBiZSBzdWJtaXR0ZWRcblxuICBBbHNvIHJlbW92ZSBhbnkgZGVsZXRlZCB2YWx1ZXMuXG5cbiAgKi9cbmNvbnN0IGdldERhdGEgPSAoXG4gIGN1c3RvbUFyZ3MsXG4gIHByb3BzOiBGb3JtUHJvcHMsXG4gIHN0YXRlOiBQaWNrPEZvcm1TdGF0ZSwgXCJjdXJyZW50RG9jdW1lbnRcIiB8IFwiZGVsZXRlZFZhbHVlc1wiPixcbiAgLy8gcHJldmlvdXNseSBmcm9tIFwidGhpc1wiIG9iamVjdFxuICB7IHN1Ym1pdEZvcm1DYWxsYmFja3MsIGZvcm0gfTogYW55XG4pID0+IHtcbiAgY29uc3QgeyBjdXJyZW50RG9jdW1lbnQgfSA9IHN0YXRlO1xuICBjb25zdCB7IG1vZGVsLCBwcmVmaWxsZWRQcm9wcyB9ID0gcHJvcHM7XG4gIC8vIHdlIHdhbnQgdG8ga2VlcCBwcmVmaWxsZWQgZGF0YSBldmVuIGZvciBoaWRkZW4vcmVtb3ZlZCBmaWVsZHNcbiAgbGV0IGRhdGEgPSBwcmVmaWxsZWRQcm9wcyB8fCB7fTtcblxuICAvLyBvbWl0IHByZWZpbGxlZCBwcm9wcyBmb3IgbmVzdGVkIGZpZWxkc1xuICBkYXRhID0gb21pdEJ5KGRhdGEsICh2YWx1ZSwga2V5KSA9PiBrZXkuZW5kc1dpdGgoXCIuJFwiKSk7XG5cbiAgY29uc3QgYXJncyA9IHtcbiAgICBzY2hlbWE6IG1vZGVsLnNjaGVtYSxcbiAgICBleGNsdWRlUmVtb3ZlZEZpZWxkczogZmFsc2UsXG4gICAgZXhjbHVkZUhpZGRlbkZpZWxkczogZmFsc2UsXG4gICAgcmVwbGFjZUludGxGaWVsZHM6IHRydWUsXG4gICAgYWRkRXh0cmFGaWVsZHM6IGZhbHNlLFxuICAgIC4uLmN1c3RvbUFyZ3MsXG4gIH07XG5cbiAgLy8gb25seSBrZWVwIHJlbGV2YW50IGZpZWxkc1xuICAvLyBmb3IgaW50bCBmaWVsZHMsIG1ha2Ugc3VyZSB3ZSBsb29rIGluIGZvb19pbnRsIGFuZCBub3QgZm9vXG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkTmFtZXMocHJvcHMsIGN1cnJlbnREb2N1bWVudCwgYXJncyk7XG4gIGRhdGEgPSB7IC4uLmRhdGEsIC4uLnBpY2soY3VycmVudERvY3VtZW50LCAuLi5maWVsZHMpIH07XG5cbiAgLy8gY29tcGFjdCBkZWxldGVkIHZhbHVlc1xuICBzdGF0ZS5kZWxldGVkVmFsdWVzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBpZiAocGF0aC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIC8qXG5cbiAgICAgICAgSWYgZGVsZXRlZCBmaWVsZCBpcyBhIG5lc3RlZCBmaWVsZCwgbmVzdGVkIGFycmF5LCBvciBuZXN0ZWQgYXJyYXkgaXRlbSwgdHJ5IHRvIGNvbXBhY3QgaXRzIHBhcmVudCBhcnJheVxuXG4gICAgICAgIC0gTmVzdGVkIGZpZWxkOiAnYWRkcmVzcy5jaXR5J1xuICAgICAgICAtIE5lc3RlZCBhcnJheTogJ2FkZHJlc3Nlcy4xJ1xuICAgICAgICAtIE5lc3RlZCBhcnJheSBpdGVtOiAnYWRkcmVzc2VzLjEuY2l0eSdcblxuICAgICAgICAqL1xuICAgICAgY29tcGFjdFBhcmVudChkYXRhLCBwYXRoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHJ1biBkYXRhIG9iamVjdCB0aHJvdWdoIHN1Ym1pdEZvcm0gY2FsbGJhY2tzXG4gIGRhdGEgPSBydW5DYWxsYmFja3Moe1xuICAgIGNhbGxiYWNrczogc3VibWl0Rm9ybUNhbGxiYWNrcyxcbiAgICBpdGVyYXRvcjogZGF0YSxcbiAgICBhcmdzOiBbXG4gICAgICB7XG4gICAgICAgIC8qZm9ybTogdGhpcyovXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IEZvcm0gPSAocHJvcHM6IEZvcm1Qcm9wcykgPT4ge1xuICBjb25zdCB7IGluaXRDYWxsYmFjaywgY3JlYXRlRG9jdW1lbnQsIHVwZGF0ZURvY3VtZW50LCBkZWxldGVEb2N1bWVudCB9ID1cbiAgICBwcm9wcztcbiAgY29uc3QgaW5pdGlhbFN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlRnJvbVByb3BzKHByb3BzKTtcbiAgY29uc3QgeyBzY2hlbWEsIG9yaWdpbmFsU2NoZW1hLCBmbGF0U2NoZW1hLCBpbml0aWFsRG9jdW1lbnQgfSA9IGluaXRpYWxTdGF0ZTtcbiAgY29uc3QgaXNGaXJzdFJlbmRlciA9IHVzZVJlZih0cnVlKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNGaXJzdFJlbmRlci5jdXJyZW50KSB7XG4gICAgICBpc0ZpcnN0UmVuZGVyLmN1cnJlbnQgPSBmYWxzZTsgLy8gdG9nZ2xlIGZsYWcgYWZ0ZXIgZmlyc3QgcmVuZGVyL21vdW50aW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbml0Q2FsbGJhY2spIGluaXRDYWxsYmFjayhpbml0aWFsU3RhdGUuY3VycmVudERvY3VtZW50KTtcbiAgfSwgW2luaXRDYWxsYmFja10pO1xuICBjb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gICAgbGF5b3V0OiBcImhvcml6b250YWxcIixcbiAgICBwcmVmaWxsZWRQcm9wczoge30sXG4gICAgcmVwZWF0RXJyb3JzOiBmYWxzZSxcbiAgICBzaG93UmVtb3ZlOiB0cnVlLFxuICAgIHNob3dEZWxldGU6IHRydWUsXG4gIH07XG4gIGNvbnN0IGFsbFByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIC4uLnByb3BzIH07XG4gIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSB7fTtcbiAgY29uc3Qgc3VibWl0Rm9ybUNhbGxiYWNrczogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gIGNvbnN0IHN1Y2Nlc3NGb3JtQ2FsbGJhY2tzOiBBcnJheTxGdW5jdGlvbj4gPSBbXTtcbiAgY29uc3QgZmFpbHVyZUZvcm1DYWxsYmFja3M6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xuICBjb25zdCBpbnRsID0gdXNlSW50bENvbnRleHQoKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFcnJvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIC8qXG5cbiAgQWRkIGVycm9yIHRvIGZvcm0gc3RhdGVcblxuICBFcnJvcnMgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgIC0gaWQ6IHVzZWQgYXMgYW4gaW50ZXJuYXRpb25hbGl6YXRpb24ga2V5LCBmb3IgZXhhbXBsZSBgZXJyb3JzLnJlcXVpcmVkYFxuICAgIC0gcGF0aDogZm9yIGZpZWxkLXNwZWNpZmljIGVycm9ycywgdGhlIHBhdGggb2YgdGhlIGZpZWxkIHdpdGggdGhlIGlzc3VlXG4gICAgLSBwcm9wZXJ0aWVzOiBhZGRpdGlvbmFsIGRhdGEuIFdpbGwgYmUgcGFzc2VkIHRvIHZ1bGNhbi1pMThuIGFzIHZhbHVlc1xuICAgIC0gbWVzc2FnZTogaWYgaWQgY2Fubm90IGJlIHVzZWQgYXMgaTgxbiBrZXksIG1lc3NhZ2Ugd2lsbCBiZSB1c2VkXG5cbiAgKi9cbiAgY29uc3QgW2Vycm9ycywgc2V0RXJyb3JzXSA9IHVzZVN0YXRlPEFycmF5PGFueT4+KFtdKTtcbiAgY29uc3QgdGhyb3dFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIGxldCBmb3JtRXJyb3JzID0gZ2V0RXJyb3JzKGVycm9yKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coZm9ybUVycm9ycyk7XG5cbiAgICAvLyBhZGQgZXJyb3IocykgdG8gc3RhdGVcbiAgICBzZXRFcnJvcnMoKHByZXZFcnJvcnMpID0+IFsuLi5wcmV2RXJyb3JzLCAuLi5mb3JtRXJyb3JzXSk7XG4gIH07XG5cbiAgLypcblxuICBDbGVhciBlcnJvcnMgZm9yIGEgZmllbGRcblxuICAqL1xuICBjb25zdCBjbGVhckZpZWxkRXJyb3JzID0gKHBhdGgpID0+IHtcbiAgICBzZXRFcnJvcnMoKHByZXZFcnJvcnMpID0+XG4gICAgICBwcmV2RXJyb3JzLmZpbHRlcigoZXJyb3IpID0+IGVycm9yLnBhdGggIT09IHBhdGgpXG4gICAgKTtcbiAgfTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIGNvbnN0IFtkZWxldGVkVmFsdWVzLCBzZXREZWxldGVkVmFsdWVzXSA9IHVzZVN0YXRlPEFycmF5PGFueT4+KFtdKTtcblxuICAvLyBhZGQgc29tZXRoaW5nIHRvIGRlbGV0ZWQgdmFsdWVzXG4gIGNvbnN0IGFkZFRvRGVsZXRlZFZhbHVlcyA9IChuYW1lKSA9PiB7XG4gICAgc2V0RGVsZXRlZFZhbHVlcygocHJldkRlbGV0ZWRWYWx1ZXMpID0+IFsuLi5wcmV2RGVsZXRlZFZhbHVlcywgbmFtZV0pO1xuICB9O1xuXG4gIGludGVyZmFjZSBDYWxsYmFja3Mge1xuICAgIHN1Ym1pdEZvcm1DYWxsYmFja3M6IEFycmF5PGFueT47XG4gICAgc3VjY2Vzc0Zvcm1DYWxsYmFja3M6IEFycmF5PGFueT47XG4gICAgZmFpbHVyZUZvcm1DYWxsYmFja3M6IEFycmF5PGFueT47XG4gIH1cbiAgY29uc3QgW2NhbGxiYWNrcywgc2V0Q2FsbGJhY2tzXSA9IHVzZVN0YXRlPENhbGxiYWNrcz4oe1xuICAgIHN1Ym1pdEZvcm1DYWxsYmFja3M6IFtdLFxuICAgIHN1Y2Nlc3NGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgICBmYWlsdXJlRm9ybUNhbGxiYWNrczogW10sXG4gIH0pO1xuICAvLyBhZGQgYSBjYWxsYmFjayB0byB0aGUgZm9ybSBzdWJtaXNzaW9uXG4gIGNvbnN0IGFkZFRvU3VibWl0Rm9ybSA9IChjYWxsYmFjaykgPT4ge1xuICAgIHNldENhbGxiYWNrcygoY2JzKSA9PiAoe1xuICAgICAgLi4uY2JzLFxuICAgICAgLy8gc3VibWl0Rm9ybUNhbGxiYWNrczogWy4uLmNicy5zdWJtaXRGb3JtQ2FsbGJhY2tzLCBjYWxsYmFja10sXG4gICAgfSkpO1xuICB9O1xuXG4gIC8vIGFkZCBhIGNhbGxiYWNrIHRvIGZvcm0gc3VibWlzc2lvbiBzdWNjZXNzXG4gIGNvbnN0IGFkZFRvU3VjY2Vzc0Zvcm0gPSAoY2FsbGJhY2spID0+IHtcbiAgICBzZXRDYWxsYmFja3MoKGNicykgPT4gKHtcbiAgICAgIC4uLmNicyxcbiAgICAgIHN1Y2Nlc3NGb3JtQ2FsbGJhY2tzOiBbLi4uY2JzLnN1Y2Nlc3NGb3JtQ2FsbGJhY2tzLCBjYWxsYmFja10sXG4gICAgfSkpO1xuICB9O1xuXG4gIC8vIGFkZCBhIGNhbGxiYWNrIHRvIGZvcm0gc3VibWlzc2lvbiBmYWlsdXJlXG4gIGNvbnN0IGFkZFRvRmFpbHVyZUZvcm0gPSAoY2FsbGJhY2spID0+IHtcbiAgICBzZXRDYWxsYmFja3MoKGNicykgPT4gKHtcbiAgICAgIC4uLmNicyxcbiAgICAgIGZhaWx1cmVGb3JtQ2FsbGJhY2tzOiBbLi4uY2JzLmZhaWx1cmVGb3JtQ2FsbGJhY2tzLCBjYWxsYmFja10sXG4gICAgfSkpO1xuICB9O1xuXG4gIGNvbnN0IGNsZWFyRm9ybUNhbGxiYWNrcyA9ICgpID0+IHtcbiAgICBzZXRDYWxsYmFja3Moe1xuICAgICAgc3VibWl0Rm9ybUNhbGxiYWNrczogW10sXG4gICAgICBzdWNjZXNzRm9ybUNhbGxiYWNrczogW10sXG4gICAgICBmYWlsdXJlRm9ybUNhbGxiYWNrczogW10sXG4gICAgfSk7XG4gIH07XG5cbiAgLypcbiAgc2V0Rm9ybVN0YXRlID0gKGZuKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZShmbik7XG4gIH07XG4gICovXG5cbiAgY29uc3QgW2N1cnJlbnRWYWx1ZXMsIHNldEN1cnJlbnRWYWx1ZXNdID0gdXNlU3RhdGU8T2JqZWN0Pih7fSk7XG5cbiAgY29uc3Qgc3VibWl0Rm9ybUNvbnRleHQgPSAoZm9ybVR5cGU6IEZvcm1UeXBlKSA9PiAoZXZlbnQgLypuZXdWYWx1ZXMqLykgPT4ge1xuICAgIC8qXG4gICAgVE9ETzogcHJldmlvdXNseSB0aGlzIGNhbGxiYWNrIHdhcyB1cGRhdGluZyB0aGUgY3VycmVudCB2YWx1ZXMgd2l0aCBuZXcgdmFsdWVzIGFmdGVyIHRoaXMgY2FsbFxuICAgIE5lZWQgdG8gY2hlY2sgaG93IHRoaXMgd29ya2VkIGluIFZ1bGNhbiBpbml0aWFsbHlcbiAgICBzZXRDdXJyZW50VmFsdWVzKChwcmV2Q3VycmVudFZhbHVlcykgPT4gKHtcbiAgICAgIC4uLnByZXZDdXJyZW50VmFsdWVzLFxuICAgICAgLi4ubmV3VmFsdWVzLFxuICAgIH0pKTtcbiAgICAqL1xuICAgIC8vIFRPRE86IHByZXZpb3VzbHksIHRoaXMgd2FzIHVzaW5nIGEgY2FsbGJhY2sgZnJvbSBzZXRDdXJyZW50VmFsdWVzXG4gICAgLy8gdGhpcyBuZWVkcyB0byBiZSByZWFyY2hpdGVjdHVyZWQgdG8gd29yayB3aXRob3V0LCB3aWxsIG5lZWQgc29tZSBjaGVja1xuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU2MjQ3NDMzL2hvdy10by11c2Utc2V0c3RhdGUtY2FsbGJhY2stb24tcmVhY3QtaG9va3NcbiAgICBzdWJtaXRGb3JtKGZvcm1UeXBlKShldmVudCk7XG4gIH07XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvKlxuXG4gIFdoZW4gcHJvcHMgY2hhbmdlLCByZWluaXRpYWxpemUgdGhlIGZvcm0gIHN0YXRlXG4gIFRyaWdnZXJlZCBvbmx5IGZvciBkYXRhIHJlbGF0ZWQgcHJvcHMgKGNvbGxlY3Rpb24sIGRvY3VtZW50LCBjdXJyZW50VXNlciBldGMuKVxuXG4gIEBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9ibG9nLzIwMTgvMDYvMDcveW91LXByb2JhYmx5LWRvbnQtbmVlZC1kZXJpdmVkLXN0YXRlLmh0bWxcblxuICAqL1xuICAvKlxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBjb25zdCBuZWVkUmVzZXQgPSAhIVJFU0VUX1BST1BTLmZpbmQoXG4gICAgICAocHJvcCkgPT4gIWlzRXF1YWwodGhpcy5wcm9wc1twcm9wXSwgbmV4dFByb3BzW3Byb3BdKVxuICAgICk7XG4gICAgaWYgKG5lZWRSZXNldCkge1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSBnZXRJbml0aWFsU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgICAgaWYgKG5leHRQcm9wcy5pbml0Q2FsbGJhY2spXG4gICAgICAgIG5leHRQcm9wcy5pbml0Q2FsbGJhY2sobmV3U3RhdGUuY3VycmVudERvY3VtZW50KTtcbiAgICB9XG4gIH0qL1xuXG4gIGNvbnN0IFtjdXJyZW50RG9jdW1lbnQsIHNldEN1cnJlbnREb2N1bWVudF0gPVxuICAgIHVzZVN0YXRlPHtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgX2lkPzogc3RyaW5nO1xuICAgICAgbmFtZT86IHN0cmluZztcbiAgICB9Pihpbml0aWFsRG9jdW1lbnQpO1xuXG4gIC8qXG5cbiAgTWFudWFsbHkgdXBkYXRlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBvbmUgb3IgbW9yZSBmaWVsZHMoaS5lLiBvbiBjaGFuZ2Ugb3IgYmx1cikuXG5cbiAgKi9cbiAgY29uc3QgdXBkYXRlQ3VycmVudFZhbHVlcyA9IChuZXdWYWx1ZXMsIG9wdGlvbnM6IHsgbW9kZT86IHN0cmluZyB9ID0ge30pID0+IHtcbiAgICAvLyBkZWZhdWx0IHRvIG92ZXJ3cml0aW5nIG9sZCB2YWx1ZSB3aXRoIG5ld1xuICAgIGNvbnN0IHsgbW9kZSA9IFwib3ZlcndyaXRlXCIgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBjaGFuZ2VDYWxsYmFjayB9ID0gcHJvcHM7XG5cbiAgICAvLyBrZWVwIHRoZSBwcmV2aW91cyBvbmVzIGFuZCBleHRlbmQgKHdpdGggcG9zc2libGUgcmVwbGFjZW1lbnQpIHdpdGggbmV3IG9uZXNcbiAgICAvLyBrZWVwIG9ubHkgdGhlIHJlbGV2YW50IHByb3BlcnRpZXNcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgIGN1cnJlbnRWYWx1ZXM6IGNsb25lRGVlcChjdXJyZW50VmFsdWVzKSxcbiAgICAgIGN1cnJlbnREb2N1bWVudDogY2xvbmVEZWVwKGN1cnJlbnREb2N1bWVudCksXG4gICAgICBkZWxldGVkVmFsdWVzOiBjbG9uZURlZXAoZGVsZXRlZFZhbHVlcyksXG4gICAgfTtcblxuICAgIE9iamVjdC5rZXlzKG5ld1ZhbHVlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0ga2V5O1xuICAgICAgbGV0IHZhbHVlID0gbmV3VmFsdWVzW2tleV07XG5cbiAgICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpKSB7XG4gICAgICAgIC8vIGRlbGV0ZSB2YWx1ZVxuICAgICAgICB1bnNldChuZXdTdGF0ZS5jdXJyZW50VmFsdWVzLCBwYXRoKTtcbiAgICAgICAgc2V0KG5ld1N0YXRlLmN1cnJlbnREb2N1bWVudCwgcGF0aCwgbnVsbCk7XG4gICAgICAgIG5ld1N0YXRlLmRlbGV0ZWRWYWx1ZXMgPSBbLi4ubmV3U3RhdGUuZGVsZXRlZFZhbHVlcywgcGF0aF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAxLiB1cGRhdGUgY3VycmVudFZhbHVlc1xuICAgICAgICBzZXQobmV3U3RhdGUuY3VycmVudFZhbHVlcywgcGF0aCwgdmFsdWUpO1xuXG4gICAgICAgIC8vIDIuIHVwZGF0ZSBjdXJyZW50RG9jdW1lbnRcbiAgICAgICAgLy8gRm9yIGFycmF5cyBhbmQgb2JqZWN0cywgZ2l2ZSBvcHRpb24gdG8gbWVyZ2UgaW5zdGVhZCBvZiBvdmVyd3JpdGVcbiAgICAgICAgaWYgKG1vZGUgPT09IFwibWVyZ2VcIiAmJiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNPYmplY3QodmFsdWUpKSkge1xuICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZ2V0KG5ld1N0YXRlLmN1cnJlbnREb2N1bWVudCwgcGF0aCk7XG4gICAgICAgICAgc2V0KG5ld1N0YXRlLmN1cnJlbnREb2N1bWVudCwgcGF0aCwgbWVyZ2Uob2xkVmFsdWUsIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0KG5ld1N0YXRlLmN1cnJlbnREb2N1bWVudCwgcGF0aCwgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gaW4gY2FzZSB2YWx1ZSBoYWQgcHJldmlvdXNseSBiZWVuIGRlbGV0ZWQsIFwidW5kZWxldGVcIiBpdFxuICAgICAgICBuZXdTdGF0ZS5kZWxldGVkVmFsdWVzID0gd2l0aG91dChuZXdTdGF0ZS5kZWxldGVkVmFsdWVzLCBwYXRoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoY2hhbmdlQ2FsbGJhY2spIGNoYW5nZUNhbGxiYWNrKG5ld1N0YXRlLmN1cnJlbnREb2N1bWVudCk7XG5cbiAgICAvLyBUT0RPOiBwcmVmZXIgIGEgcmVkdWNlclxuICAgIHNldEN1cnJlbnRWYWx1ZXMobmV3U3RhdGUuY3VycmVudFZhbHVlcyk7XG4gICAgc2V0Q3VycmVudERvY3VtZW50KG5ld1N0YXRlLmN1cnJlbnREb2N1bWVudCk7XG4gICAgc2V0RGVsZXRlZFZhbHVlcyhuZXdTdGF0ZS5kZWxldGVkVmFsdWVzKTtcbiAgfTtcblxuICAvKlxuXG4gIFJlZmV0Y2ggdGhlIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlIChpbiBjYXNlIGl0IHdhcyB1cGRhdGVkIGJ5IGFub3RoZXIgcHJvY2VzcyBvciB0byByZXNldCB0aGUgZm9ybSlcblxuICAqL1xuICBjb25zdCByZWZldGNoRm9ybSA9ICgpID0+IHtcbiAgICBpZiAocHJvcHMucmVmZXRjaCkge1xuICAgICAgcHJvcHMucmVmZXRjaCgpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBbZGlzYWJsZWQsIHNldERpc2FibGVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTsgLy8gVE9ET1xuICBjb25zdCBbc3VjY2Vzcywgc2V0U3VjY2Vzc10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7IC8vIFRPRE9cbiAgLyoqXG4gICAqIENsZWFycyBmb3JtIGVycm9ycyBhbmQgdmFsdWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZSBDbGVhciBmb3JtXG4gICAqICAvLyBmb3JtIHdpbGwgYmUgZnVsbHkgZW1wdGllZCwgd2l0aCBleGNlcHRpb24gb2YgcHJlZmlsbGVkIHZhbHVlc1xuICAgKiAgY2xlYXJGb3JtKHsgZG9jdW1lbnQ6IHt9IH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZSBSZXNldC9yZXZlcnQgZm9ybVxuICAgKiAgLy8gZm9ybSB3aWxsIGJlIHJldmVydGVkIHRvIGl0cyBpbml0aWFsIHN0YXRlXG4gICAqICBjbGVhckZvcm0oKTtcbiAgICpcbiAgICogQGV4YW1wbGUgQ2xlYXIgd2l0aCBuZXcgdmFsdWVzXG4gICAqICAvLyBmb3JtIHdpbGwgYmUgY2xlYXJlZCBidXQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbmV3IGRvY3VtZW50XG4gICAqICBjb25zdCBkb2N1bWVudCA9IHtcbiAgICogICAgLy8gLi4uIHNvbWUgdmFsdWVzXG4gICAqICB9O1xuICAgKiAgY2xlYXJGb3JtKHsgZG9jdW1lbnQgfSk7XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMuZG9jdW1lbnRcbiAgICogIERvY3VtZW50IHRvIHVzZSBhcyBuZXcgaW5pdGlhbCBkb2N1bWVudCB3aGVuIHZhbHVlcyBhcmUgY2xlYXJlZCBpbnN0ZWFkIG9mXG4gICAqICB0aGUgZXhpc3Rpbmcgb25lLiBOb3RlIHRoYXQgcHJlZmlsbGVkIHByb3BzIHdpbGwgYmUgbWVyZ2VkXG4gICAqL1xuICBjb25zdCBjbGVhckZvcm0gPSAob3B0aW9uczogeyBkb2N1bWVudD86IGFueSB9ID0ge30pID0+IHtcbiAgICBjb25zdCB7IGRvY3VtZW50OiBvcHRpb25zRG9jdW1lbnQgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgZG9jdW1lbnQgPSBvcHRpb25zRG9jdW1lbnRcbiAgICAgID8gbWVyZ2Uoe30sIHByb3BzLnByZWZpbGxlZFByb3BzLCBvcHRpb25zRG9jdW1lbnQpXG4gICAgICA6IG51bGw7XG4gICAgLy8gVE9ETzogcHJlZmVyIGEgcmVkdWNlclxuICAgIHNldEVycm9ycyhbXSk7XG4gICAgc2V0Q3VycmVudFZhbHVlcyh7fSk7XG4gICAgc2V0RGVsZXRlZFZhbHVlcyhbXSk7XG4gICAgc2V0Q3VycmVudERvY3VtZW50KGRvY3VtZW50IHx8IGluaXRpYWxEb2N1bWVudCk7XG4gICAgLy8gc2V0SW5pdGlhbERvY3VtZW50KGRvY3VtZW50IHx8IGluaXRpYWxEb2N1bWVudCk7XG4gICAgc2V0RGlzYWJsZWQoZmFsc2UpO1xuICB9O1xuXG4gIGNvbnN0IG5ld011dGF0aW9uU3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24gPFRNb2RlbCA9IE9iamVjdD4oXG4gICAgcmVzdWx0OiBDcmVhdGVEb2N1bWVudFJlc3VsdDxUTW9kZWw+XG4gICkge1xuICAgIG11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrKHJlc3VsdCwgXCJuZXdcIik7XG4gIH07XG5cbiAgY29uc3QgZWRpdE11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24gPFRNb2RlbCA9IE9iamVjdD4oXG4gICAgcmVzdWx0OiBVcGRhdGVEb2N1bWVudFJlc3VsdDxUTW9kZWw+XG4gICkge1xuICAgIG11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrKHJlc3VsdCwgXCJlZGl0XCIpO1xuICB9O1xuXG4gIGNvbnN0IGZvcm1SZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IG11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24gPFRNb2RlbCA9IE9iamVjdD4oXG4gICAgLy8gbXVzdCBiZSBjYWxsZWQgb25seSBvbiB2YWxpZCByZXN1bHRzXG4gICAgcmVzdWx0OiBDcmVhdGVEb2N1bWVudFJlc3VsdDxUTW9kZWw+LFxuICAgIG11dGF0aW9uVHlwZTogRm9ybVR5cGVcbiAgKSB7XG4gICAgLy8gVE9ETzogdXNlIGEgcmVkdWNlclxuICAgIHNldERpc2FibGVkKGZhbHNlKTtcbiAgICBzZXRTdWNjZXNzKHRydWUpO1xuICAgIC8vIGZvciBuZXcgbXV0YXRpb24sIHJ1biByZWZldGNoIGZ1bmN0aW9uIGlmIGl0IGV4aXN0c1xuICAgIC8vIFRPRE86IHRoZSBjcmVhdGUgbXV0YXRpb24gc2hvdWxkIGFscmVhZHkgcmV0dXJuIHRoZSBmcmVzaGVzdCB2YWx1ZSwgZG8gd2UgcmVhbGx5IG5lZWQgdGhhdD9cbiAgICAvLyBpbnN0ZWFkIHdlIG1pZ2h0IHdhbnQgdG8gdXBkYXRlIGN1cnJlbnRSZXN1bHQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBjcmVhdGlvblxuICAgIGlmIChtdXRhdGlvblR5cGUgPT09IFwibmV3XCIpIHJlZmV0Y2hGb3JtKCk7XG4gICAgbGV0IHsgZG9jdW1lbnQgfSA9IHJlc3VsdDtcblxuICAgIC8vIGNhbGwgdGhlIGNsZWFyIGZvcm0gbWV0aG9kIChpLmUuIHRyaWdnZXIgc2V0U3RhdGUpIG9ubHkgaWYgdGhlIGZvcm0gaGFzIG5vdCBiZWVuIHVubW91bnRlZFxuICAgIC8vICh3ZSBhcmUgaW4gYW4gYXN5bmMgY2FsbGJhY2ssIGV2ZXJ5dGhpbmcgY2FuIGhhcHBlbiEpXG4gICAgLy8gVE9ETzogdGhpcyBzaG91bGQgcmVseSBvbiBhIHJlZlxuICAgIGlmIChmb3JtUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyRm9ybSh7XG4gICAgICAgIGRvY3VtZW50OiBtdXRhdGlvblR5cGUgPT09IFwiZWRpdFwiID8gZG9jdW1lbnQgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBydW4gZG9jdW1lbnQgdGhyb3VnaCBtdXRhdGlvbiBzdWNjZXNzIGNhbGxiYWNrc1xuICAgIGRvY3VtZW50ID0gcnVuQ2FsbGJhY2tzKHtcbiAgICAgIGNhbGxiYWNrczogc3VjY2Vzc0Zvcm1DYWxsYmFja3MsXG4gICAgICBpdGVyYXRvcjogZG9jdW1lbnQsXG4gICAgICBhcmdzOiBbeyBmb3JtOiBmb3JtUmVmLmN1cnJlbnQgfV0sXG4gICAgfSk7XG5cbiAgICAvLyBydW4gc3VjY2VzcyBjYWxsYmFjayBpZiBpdCBleGlzdHNcbiAgICBpZiAocHJvcHMuc3VjY2Vzc0NhbGxiYWNrKSBwcm9wcy5zdWNjZXNzQ2FsbGJhY2soZG9jdW1lbnQsIHsgZm9ybTogdGhpcyB9KTtcbiAgfTtcblxuICAvLyBjYXRjaCBncmFwaHFsIGVycm9yc1xuICBjb25zdCBtdXRhdGlvbkVycm9yQ2FsbGJhY2sgPSAoZG9jdW1lbnQsIGVycm9yKSA9PiB7XG4gICAgc2V0RGlzYWJsZWQoZmFsc2UpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmVycm9yKFwiLy8gZ3JhcGhRTCBFcnJvclwiKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgLy8gcnVuIG11dGF0aW9uIGZhaWx1cmUgY2FsbGJhY2tzIG9uIGVycm9yLCB3ZSBkbyBub3QgYWxsb3cgdGhlIGNhbGxiYWNrcyB0byBjaGFuZ2UgdGhlIGVycm9yXG4gICAgcnVuQ2FsbGJhY2tzKHtcbiAgICAgIGNhbGxiYWNrczogZmFpbHVyZUZvcm1DYWxsYmFja3MsXG4gICAgICBpdGVyYXRvcjogZXJyb3IsXG4gICAgICBhcmdzOiBbeyBlcnJvciwgZm9ybTogZm9ybVJlZi5jdXJyZW50IH1dLFxuICAgIH0pO1xuXG4gICAgaWYgKCFpc0VtcHR5KGVycm9yKSkge1xuICAgICAgLy8gYWRkIGVycm9yIHRvIHN0YXRlXG4gICAgICB0aHJvd0Vycm9yKGVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBydW4gZXJyb3IgY2FsbGJhY2sgaWYgaXQgZXhpc3RzXG4gICAgaWYgKHByb3BzLmVycm9yQ2FsbGJhY2spXG4gICAgICBwcm9wcy5lcnJvckNhbGxiYWNrKGRvY3VtZW50LCBlcnJvciwgeyBmb3JtOiB0aGlzIH0pO1xuXG4gICAgLy8gc2Nyb2xsIGJhY2sgdXAgdG8gc2hvdyBlcnJvciBtZXNzYWdlc1xuICAgIC8vIFRPRE86IG1pZ3JhdGUgdGhpcyB0byBzY3JvbGwgb24gdG9wIG9mIHRoZSBmb3JtXG4gICAgLy9VdGlscy5zY3JvbGxJbnRvVmlldyhcIi5mbGFzaC1tZXNzYWdlXCIpO1xuICB9O1xuXG4gIC8qXG5cbiAgU3VibWl0IGZvcm0gaGFuZGxlclxuXG4gICovXG4gIGNvbnN0IHN1Ym1pdEZvcm0gPSAoZm9ybVR5cGU6IEZvcm1UeXBlKSA9PiBhc3luYyAoZXZlbnQ/OiBFdmVudCkgPT4ge1xuICAgIGV2ZW50ICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQgJiYgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCB7IGNvbnRleHROYW1lIH0gPSBwcm9wcztcblxuICAgIC8vIGlmIGZvcm0gaXMgZGlzYWJsZWQgKHRoZXJlIGlzIGFscmVhZHkgYSBzdWJtaXQgaGFuZGxlciBydW5uaW5nKSBkb24ndCBkbyBhbnl0aGluZ1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNsZWFyIGVycm9ycyBhbmQgZGlzYWJsZSBmb3JtIHdoaWxlIGl0J3Mgc3VibWl0dGluZ1xuICAgIHNldEVycm9ycyhbXSk7XG4gICAgc2V0RGlzYWJsZWQodHJ1ZSk7XG5cbiAgICAvLyBjb21wbGV0ZSB0aGUgZGF0YSB3aXRoIHZhbHVlcyBmcm9tIGN1c3RvbSBjb21wb25lbnRzXG4gICAgLy8gbm90ZTogaXQgZm9sbG93cyB0aGUgc2FtZSBsb2dpYyBhcyBTbWFydEZvcm0ncyBnZXREb2N1bWVudCBtZXRob2RcbiAgICBsZXQgZGF0YSA9IGdldERhdGEoXG4gICAgICB7IHJlcGxhY2VJbnRsRmllbGRzOiB0cnVlLCBhZGRFeHRyYUZpZWxkczogZmFsc2UsIG11dGFibGVGaWVsZHMgfSxcbiAgICAgIHByb3BzLFxuICAgICAge1xuICAgICAgICBjdXJyZW50RG9jdW1lbnQsXG4gICAgICAgIGRlbGV0ZWRWYWx1ZXMsXG4gICAgICB9LFxuICAgICAgeyBmb3JtOiBmb3JtUmVmLmN1cnJlbnQsIHN1Ym1pdEZvcm1DYWxsYmFja3MgfVxuICAgICk7XG5cbiAgICAvLyBpZiB0aGVyZSdzIGEgc3VibWl0IGNhbGxiYWNrLCBydW4gaXRcbiAgICBpZiAocHJvcHMuc3VibWl0Q2FsbGJhY2spIHtcbiAgICAgIGRhdGEgPSBwcm9wcy5zdWJtaXRDYWxsYmFjayhkYXRhKSB8fCBkYXRhO1xuICAgIH1cblxuICAgIGlmIChmb3JtVHlwZSA9PT0gXCJuZXdcIikge1xuICAgICAgLy8gY3JlYXRlIGRvY3VtZW50IGZvcm1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZURvY3VtZW50KHtcbiAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGNvbnRleHROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LmVycm9ycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gVE9ETzogcHJldmlvdXNseSBnb3QgZnJvbSBtZXRhLCB3ZSBjb3VsZCBoYXZlIG1vcmUgdGhhbiAxIGVycm9yXG4gICAgICAgICAgbXV0YXRpb25FcnJvckNhbGxiYWNrKGRvY3VtZW50LCByZXN1bHQuZXJyb3JzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdNdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBtdXRhdGlvbkVycm9yQ2FsbGJhY2soZG9jdW1lbnQsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXBkYXRlIGRvY3VtZW50IGZvcm1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50SWQgPSBjdXJyZW50RG9jdW1lbnQuX2lkO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGRhdGVEb2N1bWVudCh7XG4gICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgIGlkOiBkb2N1bWVudElkLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGNvbnRleHROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgbW9yZSB0aGFuIDEgZXJyb3JcbiAgICAgICAgaWYgKHJlc3VsdC5lcnJvcnM/Lmxlbmd0aCkge1xuICAgICAgICAgIG11dGF0aW9uRXJyb3JDYWxsYmFjayhkb2N1bWVudCwgcmVzdWx0LmVycm9yc1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWRpdE11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG11dGF0aW9uRXJyb3JDYWxsYmFjayhkb2N1bWVudCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKlxuXG4gIERlbGV0ZSBkb2N1bWVudCBoYW5kbGVyXG5cbiAgKi9cbiAgY29uc3QgZGVsZXRlRG9jdW1lbnRXaXRoQ29uZmlybSA9ICgpID0+IHtcbiAgICBjb25zdCBkb2N1bWVudCA9IGN1cnJlbnREb2N1bWVudDtcbiAgICBjb25zdCBkb2N1bWVudElkID0gcHJvcHMuZG9jdW1lbnQuX2lkO1xuICAgIGNvbnN0IGRvY3VtZW50VGl0bGUgPSBkb2N1bWVudC50aXRsZSB8fCBkb2N1bWVudC5uYW1lIHx8IFwiXCI7XG5cbiAgICBjb25zdCBkZWxldGVEb2N1bWVudENvbmZpcm0gPSBpbnRsLmZvcm1hdE1lc3NhZ2UoXG4gICAgICB7IGlkOiBcImZvcm1zLmRlbGV0ZV9jb25maXJtXCIgfSxcbiAgICAgIHsgdGl0bGU6IGRvY3VtZW50VGl0bGUgfVxuICAgICk7XG5cbiAgICBpZiAod2luZG93LmNvbmZpcm0oZGVsZXRlRG9jdW1lbnRDb25maXJtKSkge1xuICAgICAgZGVsZXRlRG9jdW1lbnQoeyBpbnB1dDogeyBpZDogZG9jdW1lbnRJZCB9IH0pXG4gICAgICAgIC50aGVuKChtdXRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIC8vIHRoZSBtdXRhdGlvbiByZXN1bHQgbG9va3MgbGlrZSB7ZGF0YTp7Y29sbGVjdGlvblJlbW92ZTogbnVsbH19IGlmIHN1Y2NlZWRlZFxuICAgICAgICAgIGlmIChwcm9wcy5yZW1vdmVTdWNjZXNzQ2FsbGJhY2spXG4gICAgICAgICAgICBwcm9wcy5yZW1vdmVTdWNjZXNzQ2FsbGJhY2soeyBkb2N1bWVudElkLCBkb2N1bWVudFRpdGxlIH0pO1xuICAgICAgICAgIHJlZmV0Y2hGb3JtKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BzIHRvIFBhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlbmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICBjb25zdCB7IHN1Y2Nlc3NDb21wb25lbnQsIGRvY3VtZW50LCBjdXJyZW50VXNlciwgbW9kZWwsIHdhcm5VbnNhdmVkQ2hhbmdlcyB9ID1cbiAgICBwcm9wcztcbiAgY29uc3QgRm9ybUNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG5cbiAgY29uc3QgZm9ybVR5cGU6IFwiZWRpdFwiIHwgXCJuZXdcIiA9IGRvY3VtZW50ID8gXCJlZGl0XCIgOiBcIm5ld1wiO1xuXG4gIC8vIEZpZWxkcyBjb21wdXRhdGlvblxuICBjb25zdCBtdXRhYmxlRmllbGRzID1cbiAgICBmb3JtVHlwZSA9PT0gXCJlZGl0XCJcbiAgICAgID8gZ2V0RWRpdGFibGVGaWVsZHMoc2NoZW1hLCBjdXJyZW50VXNlciwgaW5pdGlhbERvY3VtZW50KVxuICAgICAgOiBnZXRJbnNlcnRhYmxlRmllbGRzKHNjaGVtYSwgY3VycmVudFVzZXIpO1xuXG4gIGNvbnN0IHsgZm9ybUxheW91dFByb3BzLCBmb3JtR3JvdXBQcm9wcyB9ID0gZ2V0Q2hpbGRyZW5Qcm9wcyhcbiAgICBwcm9wcyxcbiAgICB7IGRpc2FibGVkLCBjdXJyZW50RG9jdW1lbnQgfSxcbiAgICB7XG4gICAgICBmb3JtVHlwZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlbGV0ZURvY3VtZW50OiBkZWxldGVEb2N1bWVudFdpdGhDb25maXJtLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgaXNDaGFuZ2VkID0gaXNOb3RTYW1lRG9jdW1lbnQoaW5pdGlhbERvY3VtZW50LCBjdXJyZW50RG9jdW1lbnQpO1xuXG4gIHJldHVybiBzdWNjZXNzICYmIHN1Y2Nlc3NDb21wb25lbnQgPyAoXG4gICAgc3VjY2Vzc0NvbXBvbmVudFxuICApIDogKFxuICAgIDxGb3JtV2FyblVuc2F2ZWRcbiAgICAgIGlzQ2hhbmdlZD17aXNDaGFuZ2VkfVxuICAgICAgd2FyblVuc2F2ZWRDaGFuZ2VzPXt3YXJuVW5zYXZlZENoYW5nZXN9XG4gICAgPlxuICAgICAgPEZvcm1Db250ZXh0LlByb3ZpZGVyXG4gICAgICAgIHZhbHVlPXt7XG4gICAgICAgICAgdGhyb3dFcnJvcixcbiAgICAgICAgICBjbGVhckZvcm0sXG4gICAgICAgICAgcmVmZXRjaEZvcm0sXG4gICAgICAgICAgaXNDaGFuZ2VkLFxuICAgICAgICAgIHN1Ym1pdEZvcm06IHN1Ym1pdEZvcm1Db250ZXh0KGZvcm1UeXBlKSwgLy9DaGFuZ2UgaW4gbmFtZSBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSBhIGZ1bmN0aW9uXG4gICAgICAgICAgLy8gY2FsbGVkIHN1Ym1pdEZvcm0sIGJ1dCBubyByZWFzb24gZm9yIHRoZSB1c2VyIHRvIGtub3dcbiAgICAgICAgICAvLyBhYm91dCB0aGF0XG4gICAgICAgICAgYWRkVG9EZWxldGVkVmFsdWVzOiBhZGRUb0RlbGV0ZWRWYWx1ZXMsXG4gICAgICAgICAgdXBkYXRlQ3VycmVudFZhbHVlczogdXBkYXRlQ3VycmVudFZhbHVlcyxcbiAgICAgICAgICBnZXREb2N1bWVudDogKCkgPT4gY3VycmVudERvY3VtZW50LFxuICAgICAgICAgIGdldExhYmVsOiAoZmllbGROYW1lLCBmaWVsZExvY2FsZSkgPT5cbiAgICAgICAgICAgIGdldExhYmVsKG1vZGVsLCBmbGF0U2NoZW1hLCBpbnRsLCBmaWVsZE5hbWUsIGZpZWxkTG9jYWxlKSxcbiAgICAgICAgICBpbml0aWFsRG9jdW1lbnQ6IGluaXRpYWxEb2N1bWVudCxcbiAgICAgICAgICAvLyBUT0RPIEJBRDogY2hlY2sgd2hlcmUgdXNlZFxuICAgICAgICAgIC8vc2V0Rm9ybVN0YXRlOiB0aGlzLnNldEZvcm1TdGF0ZSxcbiAgICAgICAgICBhZGRUb1N1Ym1pdEZvcm0sXG4gICAgICAgICAgYWRkVG9TdWNjZXNzRm9ybSxcbiAgICAgICAgICBhZGRUb0ZhaWx1cmVGb3JtLFxuICAgICAgICAgIGNsZWFyRm9ybUNhbGxiYWNrcyxcbiAgICAgICAgICBlcnJvcnMsXG4gICAgICAgICAgY3VycmVudFZhbHVlcyxcbiAgICAgICAgICBkZWxldGVkVmFsdWVzLFxuICAgICAgICAgIGNsZWFyRmllbGRFcnJvcnMsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTGF5b3V0IHsuLi5mb3JtTGF5b3V0UHJvcHN9PlxuICAgICAgICAgIHtnZXRGaWVsZEdyb3VwcyhcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjdXJyZW50RG9jdW1lbnQsXG4gICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICAgZmxhdFNjaGVtYSxcbiAgICAgICAgICAgICAgb3JpZ2luYWxTY2hlbWEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW50bCxcbiAgICAgICAgICAgIG11dGFibGVGaWVsZHMsXG4gICAgICAgICAgICBpbnRsLmZvcm1hdE1lc3NhZ2VcbiAgICAgICAgICApLm1hcCgoZ3JvdXAsIGkpID0+IChcbiAgICAgICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtR3JvdXAga2V5PXtpfSB7Li4uZm9ybUdyb3VwUHJvcHMoZ3JvdXApfSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L0Zvcm1Db21wb25lbnRzLkZvcm1MYXlvdXQ+XG4gICAgICA8L0Zvcm1Db250ZXh0LlByb3ZpZGVyPlxuICAgIDwvRm9ybVdhcm5VbnNhdmVkPlxuICApO1xufTtcblxuLy8gTXV0YXRpb24gdGhhdCB5aWVsZCBhIHN1Y2Nlc3MgcmVzdWx0XG50eXBlIFN1Y2Nlc3NmdWxNdXRhdGlvblJlc3VsdDxURGF0YSA9IE9iamVjdD4gPSBNdXRhdGlvblJlc3VsdDxURGF0YT4gJiB7XG4gIGRhdGE6IFREYXRhO1xufTtcbi8qKlxuICogVHlwZWd1YXJlZCB0byBhbGxvdyBjb25zaWRlcmluZyB0aGUgcmVxdWVzdCBhcyBzdWNjZXNzZnVsXG4gKi9cbmNvbnN0IGlzU3VjY2Vzc2Z1bCA9IGZ1bmN0aW9uIDxUID0gYW55PihcbiAgcmVzdWx0OiBNdXRhdGlvblJlc3VsdDxUPiB8IHVuZGVmaW5lZFxuKTogcmVzdWx0IGlzIFN1Y2Nlc3NmdWxNdXRhdGlvblJlc3VsdDxUPiB7XG4gIHJldHVybiAhIXJlc3VsdD8uZGF0YTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvY29yZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvY2xvbmVEZWVwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pc09iamVjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvbWFwVmFsdWVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9vbWl0QnlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3BpY2tCeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvdW5zZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3VwZGF0ZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvd2l0aG91dFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvaXNQbGFpbk9iamVjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvc2l6ZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvdG9QYXRoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pbml0aWFsXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9mcC9mbG93XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC90YWtlUmlnaHRcIik7IiwiaW1wb3J0IHsgZm9ybVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vbW9kdWxlcy9zY2hlbWFfdXRpbHNcIjtcbmltcG9ydCB7IEZpZWxkR3JvdXAgfSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHsgRm9ybUZpZWxkIH0gZnJvbSBcIi4uL3R5cGluZ3NcIjtcbmltcG9ydCB7IEZvcm1Qcm9wcywgRm9ybVN0YXRlIH0gZnJvbSBcIi4vdHlwaW5nc1wiO1xuXG4vKipcbiAqIEZpZWxkIHJlbGF0ZWQgZnVuY3Rpb25zXG4gKi9cblxuaW1wb3J0IHsgVnVsY2FuU2NoZW1hIH0gZnJvbSBcIkB2dWxjYW5qcy9zY2hlbWFcIjtcbmltcG9ydCB1bmlxIGZyb20gXCJsb2Rhc2gvdW5pcVwiO1xuaW1wb3J0IGNvbXBhY3QgZnJvbSBcImxvZGFzaC9jb21wYWN0XCI7XG5pbXBvcnQgZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgcGljayBmcm9tIFwibG9kYXNoL3BpY2tcIjtcbmltcG9ydCB7XG4gIGlzSW50bEZpZWxkLFxuICBmb3JtYXRMYWJlbCxcbiAgZ2V0SW50bEtleXMsXG4gIGdldEludGxMYWJlbCxcbiAgSW50bFByb3ZpZGVyQ29udGV4dFZhbHVlLFxufSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcblxuaW1wb3J0IG1hcCBmcm9tIFwibG9kYXNoL21hcFwiO1xuaW1wb3J0IHNvcnRCeSBmcm9tIFwibG9kYXNoL3NvcnRCeVwiO1xuaW1wb3J0IHVuaXFCeSBmcm9tIFwibG9kYXNoL3VuaXFCeVwiO1xuaW1wb3J0IGRpZmZlcmVuY2UgZnJvbSBcImxvZGFzaC9kaWZmZXJlbmNlXCI7XG5pbXBvcnQgcmVqZWN0IGZyb20gXCJsb2Rhc2gvcmVqZWN0XCI7XG5pbXBvcnQgaW50ZXJzZWN0aW9uIGZyb20gXCJsb2Rhc2gvaW50ZXJzZWN0aW9uXCI7XG5pbXBvcnQgX2ZpbHRlciBmcm9tIFwibG9kYXNoL2ZpbHRlclwiO1xuaW1wb3J0IHsgY2FwaXRhbGl6ZSB9IGZyb20gXCJAdnVsY2FuanMvdXRpbHNcIjtcbmltcG9ydCB7IFZ1bGNhbkZpZWxkU2NoZW1hIH0gZnJvbSBcIkB2dWxjYW5qcy9zY2hlbWFcIjtcbmltcG9ydCB7IFZ1bGNhbk1vZGVsIH0gZnJvbSBcIkB2dWxjYW5qcy9tb2RlbFwiO1xuXG4vKlxuXG4gIEdldCBhIGZpZWxkJ3MgaW50bCBrZXlzICh1c2VmdWwgZm9yIGRlYnVnZ2luZylcblxuICAqL1xuY29uc3QgZ2V0TW9kZWxJbnRsS2V5cyA9IChcbiAgbW9kZWw6IFZ1bGNhbk1vZGVsLFxuICBmbGF0U2NoZW1hOiBhbnksXG4gIGZpZWxkTmFtZTogc3RyaW5nXG4pID0+IHtcbiAgY29uc3QgY29sbGVjdGlvbk5hbWUgPSBtb2RlbC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBnZXRJbnRsS2V5cyh7XG4gICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgc2NoZW1hOiBmbGF0U2NoZW1hLFxuICB9KTtcbn07XG5cbi8qXG5cbiAgIEdldCBhIGZpZWxkJ3MgbGFiZWxcblxuICAgKi9cbmV4cG9ydCBjb25zdCBnZXRMYWJlbCA9IChcbiAgbW9kZWw6IFZ1bGNhbk1vZGVsLFxuICBmbGF0U2NoZW1hOiBhbnksXG4gIGNvbnRleHQ6IEludGxQcm92aWRlckNvbnRleHRWYWx1ZSxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIGZpZWxkTG9jYWxlPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3QgY29sbGVjdGlvbk5hbWUgPSBtb2RlbC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGxhYmVsID0gZm9ybWF0TGFiZWwoe1xuICAgIGludGw6IGNvbnRleHQsXG4gICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgY29sbGVjdGlvbk5hbWU6IGNvbGxlY3Rpb25OYW1lLFxuICAgIHNjaGVtYTogZmxhdFNjaGVtYSxcbiAgfSk7XG4gIGlmIChmaWVsZExvY2FsZSkge1xuICAgIGNvbnN0IGludGxGaWVsZExvY2FsZSA9IGNvbnRleHQuZm9ybWF0TWVzc2FnZSh7XG4gICAgICBpZDogYGxvY2FsZXMuJHtmaWVsZExvY2FsZX1gLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6IGZpZWxkTG9jYWxlLFxuICAgIH0pO1xuICAgIHJldHVybiBgJHtsYWJlbH0gKCR7aW50bEZpZWxkTG9jYWxlfSlgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsYWJlbDtcbiAgfVxufTtcblxuLypcblxuICAgR2V0IGEgZmllbGQncyBkZXNjcmlwdGlvblxuXG4gICAoU2FtZSBhcyBnZXRMYWJlbCBidXQgcGFzcyBpc0Rlc2NyaXB0aW9uOiB0cnVlIClcbiAgICovXG5jb25zdCBnZXREZXNjcmlwdGlvbiA9IChcbiAgbW9kZWw6IFZ1bGNhbk1vZGVsLFxuICBmbGF0U2NoZW1hOiBhbnksXG4gIGNvbnRleHQ6IGFueSxcbiAgZmllbGROYW1lOiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBjb2xsZWN0aW9uTmFtZSA9IG1vZGVsLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBnZXRJbnRsTGFiZWwoe1xuICAgIGludGw6IGNvbnRleHQsXG4gICAgZmllbGROYW1lOiBmaWVsZE5hbWUsXG4gICAgY29sbGVjdGlvbk5hbWU6IGNvbGxlY3Rpb25OYW1lLFxuICAgIHNjaGVtYTogZmxhdFNjaGVtYSxcbiAgICBpc0Rlc2NyaXB0aW9uOiB0cnVlLFxuICB9KTtcbiAgcmV0dXJuIGRlc2NyaXB0aW9uIHx8IG51bGw7XG59O1xuXG4vKlxuXG4gIEdldCBhIGZpZWxkIG9wdGlvbidzIGxhYmVsXG5cbiAgKi9cbmNvbnN0IGdldE9wdGlvbkxhYmVsID0gKFxuICBtb2RlbDogVnVsY2FuTW9kZWwsXG4gIGNvbnRleHQ6IHsgZm9ybWF0TWVzc2FnZTogRnVuY3Rpb24gfSxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIG9wdGlvbjogeyBpbnRsSWQ/OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZhbHVlPzogYW55IH1cbikgPT4ge1xuICBjb25zdCBjb2xsZWN0aW9uTmFtZSA9IG1vZGVsLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaW50bElkID1cbiAgICBvcHRpb24uaW50bElkIHx8IGAke2NvbGxlY3Rpb25OYW1lfS4ke2ZpZWxkTmFtZX0uJHtvcHRpb24udmFsdWV9YDtcbiAgcmV0dXJuIGNvbnRleHQuZm9ybWF0TWVzc2FnZSh7XG4gICAgaWQ6IGludGxJZCxcbiAgICBkZWZhdWx0TWVzc2FnZTogb3B0aW9uLmxhYmVsLFxuICB9KTtcbn07XG5cbi8qXG5cbiAgR2V0IGEgbGlzdCBvZiB0aGUgZmllbGRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IGZvcm1cblxuICBOb3RlOiB3aGVuIHN1Ym1pdHRpbmcgdGhlIGZvcm0gKGdldERhdGEoKSksIGRvIG5vdCBpbmNsdWRlIGFueSBleHRyYSBmaWVsZHMuXG5cbiAgKi9cbmV4cG9ydCBjb25zdCBnZXRGaWVsZE5hbWVzID0gKFxuICBwcm9wczogUGljazxGb3JtUHJvcHMsIFwiZmllbGRzXCIgfCBcImFkZEZpZWxkc1wiIHwgXCJyZW1vdmVGaWVsZHNcIj4sXG4gIGN1cnJlbnREb2N1bWVudCxcbiAgb3B0aW9uc0Zyb21BcmdzOiB7XG4gICAgZXhjbHVkZUhpZGRlbkZpZWxkcz86IGJvb2xlYW47XG4gICAgZXhjbHVkZVJlbW92ZWRGaWVsZHM/OiBib29sZWFuO1xuICAgIHJlcGxhY2VJbnRsRmllbGRzPzogYm9vbGVhbjtcbiAgICBhZGRFeHRyYUZpZWxkcz86IGJvb2xlYW47XG4gICAgc2NoZW1hPzogVnVsY2FuU2NoZW1hO1xuICAgIG11dGFibGVGaWVsZHM/OiBBcnJheTxhbnk+O1xuICB9XG4pID0+IHtcbiAgY29uc3QgeyBmaWVsZHMsIGFkZEZpZWxkcywgcmVtb3ZlRmllbGRzIH0gPSBwcm9wcztcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgZXhjbHVkZUhpZGRlbkZpZWxkczogdHJ1ZSxcbiAgICBleGNsdWRlUmVtb3ZlZEZpZWxkczogdHJ1ZSxcbiAgICByZXBsYWNlSW50bEZpZWxkczogZmFsc2UsXG4gICAgYWRkRXh0cmFGaWVsZHM6IGZhbHNlLFxuICB9O1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgIC4uLm9wdGlvbnNGcm9tQXJncyxcbiAgfTtcbiAgY29uc3Qge1xuICAgIHNjaGVtYSxcbiAgICBtdXRhYmxlRmllbGRzLFxuICAgIGV4Y2x1ZGVSZW1vdmVkRmllbGRzLFxuICAgIGV4Y2x1ZGVIaWRkZW5GaWVsZHMsXG4gICAgYWRkRXh0cmFGaWVsZHMsXG4gICAgcmVwbGFjZUludGxGaWVsZHMsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8vIGdldCBhbGwgZWRpdGFibGUvaW5zZXJ0YWJsZSBmaWVsZHMgKGRlcGVuZGluZyBvbiBjdXJyZW50IGZvcm0gdHlwZSlcbiAgbGV0IHJlbGV2YW50RmllbGRzID0gbXV0YWJsZUZpZWxkcztcblxuICAvLyBpZiBcImZpZWxkc1wiIHByb3AgaXMgc3BlY2lmaWVkLCByZXN0cmljdCBsaXN0IG9mIGZpZWxkcyB0byBpdFxuICBpZiAodHlwZW9mIGZpZWxkcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuICAgIHJlbGV2YW50RmllbGRzID0gaW50ZXJzZWN0aW9uKHJlbGV2YW50RmllbGRzLCBmaWVsZHMpO1xuICB9XG5cbiAgLy8gaWYgXCJoaWRlRmllbGRzXCIgcHJvcCBpcyBzcGVjaWZpZWQsIHJlbW92ZSBpdHMgZmllbGRzXG4gIGlmIChleGNsdWRlUmVtb3ZlZEZpZWxkcykge1xuICAgIC8vIE9wZW5DUlVEIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgLy9jb25zdCByZW1vdmVGaWVsZHMgPSByZW1vdmVGaWVsZHMgfHwgaGlkZUZpZWxkcztcbiAgICBpZiAodHlwZW9mIHJlbW92ZUZpZWxkcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiByZW1vdmVGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgcmVsZXZhbnRGaWVsZHMgPSBkaWZmZXJlbmNlKHJlbGV2YW50RmllbGRzLCByZW1vdmVGaWVsZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIFwiYWRkRmllbGRzXCIgcHJvcCBpcyBzcGVjaWZpZWQsIGFkZCBpdHMgZmllbGRzXG4gIGlmIChcbiAgICBhZGRFeHRyYUZpZWxkcyAmJlxuICAgIHR5cGVvZiBhZGRGaWVsZHMgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICBhZGRGaWVsZHMubGVuZ3RoID4gMFxuICApIHtcbiAgICByZWxldmFudEZpZWxkcyA9IHJlbGV2YW50RmllbGRzPy5jb25jYXQoYWRkRmllbGRzKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBhbGwgaGlkZGVuIGZpZWxkc1xuICBpZiAoZXhjbHVkZUhpZGRlbkZpZWxkcykge1xuICAgIGNvbnN0IGRvY3VtZW50ID0gY3VycmVudERvY3VtZW50O1xuICAgIHJlbGV2YW50RmllbGRzID0gcmVqZWN0KHJlbGV2YW50RmllbGRzLCAoZmllbGROYW1lKSA9PiB7XG4gICAgICBjb25zdCBoaWRkZW4gPSBzY2hlbWE/LltmaWVsZE5hbWVdLmhpZGRlbjtcbiAgICAgIHJldHVybiB0eXBlb2YgaGlkZGVuID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBoaWRkZW4oeyBwcm9wcywgZG9jdW1lbnQgfSlcbiAgICAgICAgOiBoaWRkZW47XG4gICAgfSk7XG4gIH1cblxuICAvLyByZXBsYWNlIGludGwgZmllbGRzXG4gIGlmIChyZXBsYWNlSW50bEZpZWxkcykge1xuICAgIHJlbGV2YW50RmllbGRzID0gcmVsZXZhbnRGaWVsZHM/Lm1hcCgoZmllbGROYW1lKSA9PlxuICAgICAgaXNJbnRsRmllbGQoc2NoZW1hPy5bZmllbGROYW1lXSkgPyBgJHtmaWVsZE5hbWV9X2ludGxgIDogZmllbGROYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBhbnkgZHVwbGljYXRlc1xuICByZWxldmFudEZpZWxkcyA9IHVuaXEocmVsZXZhbnRGaWVsZHMpO1xuXG4gIHJldHVybiByZWxldmFudEZpZWxkcztcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuY29uc3QgaW5pdEZpZWxkID0gKFxuICBwcm9wcyxcbiAgc3RhdGU6IFBpY2s8Rm9ybVN0YXRlLCBcImN1cnJlbnREb2N1bWVudFwiIHwgXCJmbGF0U2NoZW1hXCIgfCBcIm9yaWdpbmFsU2NoZW1hXCI+LFxuICBjb250ZXh0LFxuICBmaWVsZE5hbWUsXG4gIGZpZWxkU2NoZW1hXG4pID0+IHtcbiAgY29uc3QgeyBtb2RlbCB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgY3VycmVudERvY3VtZW50LCBmbGF0U2NoZW1hIH0gPSBzdGF0ZTtcbiAgY29uc3QgaXNBcnJheSA9IGdldChmaWVsZFNjaGVtYSwgXCJ0eXBlLjAudHlwZVwiKSA9PT0gQXJyYXk7XG5cbiAgLy8gaW50aWFsaXplIHByb3BlcnRpZXNcbiAgbGV0IGZpZWxkOiBQYXJ0aWFsPEZvcm1GaWVsZD4gPSB7XG4gICAgLi4ucGljayhmaWVsZFNjaGVtYSwgZm9ybVByb3BlcnRpZXMpLFxuICAgIG5hbWU6IGZpZWxkTmFtZSxcbiAgICBkYXRhdHlwZTogZmllbGRTY2hlbWEudHlwZSxcbiAgICBsYXlvdXQ6IHByb3BzLmxheW91dCwgLy8gQSBsYXlvdXQgcHJvcGVydHkgdXNlZCB0byBjb250cm9sIGhvdyB0aGUgZm9ybSBmaWVsZHMgYXJlIGRpc3BsYXllZC4gRGVmYXVsdHMgdG8gaG9yaXpvbnRhbC5cbiAgICBpbnB1dDogZmllbGRTY2hlbWEuaW5wdXQgfHwgZmllbGRTY2hlbWEuY29udHJvbCwgLy8gVE9ET1xuICB9O1xuXG4gIC8vIGlmIHRoaXMgaXMgYW4gYXJyYXkgZmllbGQgYWxzbyBzdG9yZSBpdHMgYXJyYXkgaXRlbSB0eXBlXG4gIGlmIChpc0FycmF5KSB7XG4gICAgY29uc3QgaXRlbUZpZWxkU2NoZW1hID0gc3RhdGUub3JpZ2luYWxTY2hlbWFbYCR7ZmllbGROYW1lfS4kYF07XG4gICAgZmllbGQuaXRlbURhdGF0eXBlID0gZ2V0KGl0ZW1GaWVsZFNjaGVtYSwgXCJ0eXBlLjAudHlwZVwiKTtcbiAgfVxuXG4gIGZpZWxkLmxhYmVsID0gZ2V0TGFiZWwobW9kZWwsIGZsYXRTY2hlbWEsIGNvbnRleHQsIGZpZWxkTmFtZSk7XG4gIGZpZWxkLmludGxLZXlzID0gZ2V0SW50bEtleXMoZmllbGROYW1lKTtcbiAgLy8gLy8gcmVwbGFjZSB2YWx1ZSBieSBwcmVmaWxsZWQgdmFsdWUgaWYgdmFsdWUgaXMgZW1wdHlcbiAgLy8gY29uc3QgcHJlZmlsbCA9IGZpZWxkU2NoZW1hLnByZWZpbGwgfHwgKGZpZWxkU2NoZW1hLmZvcm0gJiYgZmllbGRTY2hlbWEuZm9ybS5wcmVmaWxsKTtcbiAgLy8gaWYgKHByZWZpbGwpIHtcbiAgLy8gICBjb25zdCBwcmVmaWxsZWRWYWx1ZSA9IHR5cGVvZiBwcmVmaWxsID09PSAnZnVuY3Rpb24nID8gcHJlZmlsbC5jYWxsKGZpZWxkU2NoZW1hKSA6IHByZWZpbGw7XG4gIC8vICAgaWYgKCEhcHJlZmlsbGVkVmFsdWUgJiYgIWZpZWxkLnZhbHVlKSB7XG4gIC8vICAgICBmaWVsZC5wcmVmaWxsZWRWYWx1ZSA9IHByZWZpbGxlZFZhbHVlO1xuICAvLyAgICAgZmllbGQudmFsdWUgPSBwcmVmaWxsZWRWYWx1ZTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICBjb25zdCBkb2N1bWVudCA9IGN1cnJlbnREb2N1bWVudDtcbiAgZmllbGQuZG9jdW1lbnQgPSBkb2N1bWVudDtcblxuICAvLyBpbnRlcm5hdGlvbmFsaXplIGZpZWxkIG9wdGlvbnMgbGFiZWxzXG4gIGlmIChmaWVsZC5vcHRpb25zICYmIEFycmF5LmlzQXJyYXkoZmllbGQub3B0aW9ucykpIHtcbiAgICBmaWVsZC5vcHRpb25zID0gZmllbGQub3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gKHtcbiAgICAgIC4uLm9wdGlvbixcbiAgICAgIGxhYmVsOiBnZXRPcHRpb25MYWJlbChtb2RlbCwgY29udGV4dCwgZmllbGROYW1lLCBvcHRpb24pLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIGlmIHRoaXMgYW4gaW50bCdkIGZpZWxkLCB1c2UgYSBzcGVjaWFsIGludGxJbnB1dFxuICBpZiAoaXNJbnRsRmllbGQoZmllbGRTY2hlbWEpKSB7XG4gICAgZmllbGQuaW50bElucHV0ID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGFkZCBhbnkgcHJvcGVydGllcyBzcGVjaWZpZWQgaW4gZmllbGRTY2hlbWEuZm9ybSBhcyBleHRyYSBwcm9wcyBwYXNzZWQgb25cbiAgLy8gdG8gdGhlIGZvcm0gY29tcG9uZW50LCBjYWxsaW5nIHRoZW0gaWYgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGNvbnN0IGlucHV0UHJvcGVydGllcyA9IGZpZWxkU2NoZW1hLmZvcm0gfHwgZmllbGRTY2hlbWEuaW5wdXRQcm9wZXJ0aWVzIHx8IHt9O1xuICBmb3IgKGNvbnN0IHByb3AgaW4gaW5wdXRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgcHJvcGVydHkgPSBpbnB1dFByb3BlcnRpZXNbcHJvcF07XG4gICAgZmllbGRbcHJvcF0gPVxuICAgICAgdHlwZW9mIHByb3BlcnR5ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBwcm9wZXJ0eS5jYWxsKGZpZWxkU2NoZW1hLCB7XG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICAgIGRvY3VtZW50LFxuICAgICAgICAgICAgaW50bDogY29udGV4dCxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHByb3BlcnR5O1xuICB9XG5cbiAgLy8gYWRkIGRlc2NyaXB0aW9uIGFzIGhlbHAgcHJvcFxuICBjb25zdCBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKG1vZGVsLCBmbGF0U2NoZW1hLCBjb250ZXh0LCBmaWVsZE5hbWUpO1xuICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICBmaWVsZC5oZWxwID0gZGVzY3JpcHRpb247XG4gIH1cblxuICByZXR1cm4gZmllbGQgYXMgRm9ybUZpZWxkO1xufTtcbmNvbnN0IGhhbmRsZUZpZWxkUGF0aCA9IChcbiAgZmllbGQ6IEZvcm1GaWVsZCxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIHBhcmVudFBhdGg/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBmaWVsZFBhdGggPSBwYXJlbnRQYXRoID8gYCR7cGFyZW50UGF0aH0uJHtmaWVsZE5hbWV9YCA6IGZpZWxkTmFtZTtcbiAgZmllbGQucGF0aCA9IGZpZWxkUGF0aDtcbiAgLy8gVE9ETzogcmVpbnRyb2R1Y2UgdGhpcyBzaWRlIGVmZmVjdCB0byBjb3JyZWN0bHkgc2V0IHRoZSBkZWZhdWx0IHZhbHVlc1xuICAvLyAocHJldmlvdXNseSB3YXMgaW4gRm9ybS50c3gpXG4gIC8vIE5vdGUgc3VyZSBpZiB0aGlzIGlzIGFjdHVhbGx5IG5lZWRlZFxuICAvLyBpZiAoZmllbGQuZGVmYXVsdFZhbHVlKSB7XG4gIC8vICAgc2V0KHRoaXMuZGVmYXVsdFZhbHVlcywgZmllbGRQYXRoLCBmaWVsZC5kZWZhdWx0VmFsdWUpO1xuICAvLyB9XG4gIHJldHVybiBmaWVsZDtcbn07XG5jb25zdCBoYW5kbGVGaWVsZFBhcmVudCA9IChmaWVsZCwgcGFyZW50RmllbGROYW1lKSA9PiB7XG4gIC8vIGlmIGZpZWxkIGhhcyBhIHBhcmVudCBmaWVsZCwgcGFzcyBpdCBvblxuICBpZiAocGFyZW50RmllbGROYW1lKSB7XG4gICAgZmllbGQucGFyZW50RmllbGROYW1lID0gcGFyZW50RmllbGROYW1lO1xuICB9XG5cbiAgcmV0dXJuIGZpZWxkO1xufTtcbmNvbnN0IGhhbmRsZVBlcm1pc3Npb25zID0gKGZpZWxkLCBmaWVsZE5hbWUsIG11dGFibGVGaWVsZHM6IEFycmF5PGFueT4pID0+IHtcbiAgLy8gaWYgZmllbGQgaXMgbm90IGNyZWF0YWJsZS91cGRhdGFibGUsIGRpc2FibGUgaXRcbiAgaWYgKCFtdXRhYmxlRmllbGRzLmluY2x1ZGVzKGZpZWxkTmFtZSkpIHtcbiAgICBmaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGZpZWxkO1xufTtcbmNvbnN0IGhhbmRsZUZpZWxkQ2hpbGRyZW4gPSAoXG4gIHByb3BzOiBGb3JtUHJvcHMsXG4gIHN0YXRlOiBQaWNrPEZvcm1TdGF0ZSwgXCJjdXJyZW50RG9jdW1lbnRcIiB8IFwiZmxhdFNjaGVtYVwiIHwgXCJvcmlnaW5hbFNjaGVtYVwiPixcbiAgY29udGV4dDogYW55LFxuICBmaWVsZCxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIGZpZWxkU2NoZW1hOiBhbnksIC8vIFRPRE86IG5vdCBhIFZ1bGNhbkZpZWxkLCBtb3JlIGEgRm9ybUZpZWxkXG4gIHNjaGVtYTogVnVsY2FuU2NoZW1hLFxuICBtdXRhYmxlRmllbGRzOiBBcnJheTxhbnk+XG4pID0+IHtcbiAgY29uc3QgeyBjdXJyZW50RG9jdW1lbnQgfSA9IHN0YXRlO1xuICAvLyBhcnJheSBmaWVsZFxuICBpZiAoZmllbGRTY2hlbWEuYXJyYXlGaWVsZFNjaGVtYSkge1xuICAgIGZpZWxkLmFycmF5RmllbGRTY2hlbWEgPSBmaWVsZFNjaGVtYS5hcnJheUZpZWxkU2NoZW1hO1xuICAgIC8vIGNyZWF0ZSBhIGZpZWxkIHRoYXQgY2FuIGJlIGV4cGxvaXRlZCBieSB0aGUgZm9ybVxuICAgIGZpZWxkLmFycmF5RmllbGQgPSBjcmVhdGVBcnJheVN1YkZpZWxkKFxuICAgICAgcHJvcHMsXG4gICAgICBzdGF0ZSxcbiAgICAgIGNvbnRleHQsXG4gICAgICBmaWVsZE5hbWUsXG4gICAgICBmaWVsZC5hcnJheUZpZWxkU2NoZW1hLFxuICAgICAgc2NoZW1hLFxuICAgICAgbXV0YWJsZUZpZWxkc1xuICAgICk7XG4gICAgLy9maWVsZC5uZXN0ZWRJbnB1dCA9IHRydWVcbiAgfVxuICAvLyBuZXN0ZWQgZmllbGRzOiBzZXQgaW5wdXQgdG8gXCJuZXN0ZWRcIlxuICBpZiAoZmllbGRTY2hlbWEuc2NoZW1hKSB7XG4gICAgZmllbGQubmVzdGVkU2NoZW1hID0gZmllbGRTY2hlbWEuc2NoZW1hO1xuICAgIGZpZWxkLm5lc3RlZElucHV0ID0gdHJ1ZTtcblxuICAgIC8vIGdldCBuZXN0ZWQgc2NoZW1hXG4gICAgLy8gZm9yIGVhY2ggbmVzdGVkIGZpZWxkLCBnZXQgZmllbGQgb2JqZWN0IGJ5IGNhbGxpbmcgY3JlYXRlRmllbGQgcmVjdXJzaXZlbHlcbiAgICBmaWVsZC5uZXN0ZWRGaWVsZHMgPSBnZXRGaWVsZE5hbWVzKHByb3BzLCBjdXJyZW50RG9jdW1lbnQsIHtcbiAgICAgIHNjaGVtYTogZmllbGQubmVzdGVkU2NoZW1hLFxuICAgICAgYWRkRXh0cmFGaWVsZHM6IGZhbHNlLFxuICAgIH0pLm1hcCgoc3ViRmllbGROYW1lKSA9PiB7XG4gICAgICByZXR1cm4gY3JlYXRlRmllbGQoXG4gICAgICAgIHByb3BzLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgc3ViRmllbGROYW1lLFxuICAgICAgICBmaWVsZC5uZXN0ZWRTY2hlbWEsXG4gICAgICAgIG11dGFibGVGaWVsZHMsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgZmllbGQucGF0aFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZmllbGQ7XG59O1xuXG4vKlxuICBHaXZlbiBhIGZpZWxkJ3MgbmFtZSwgdGhlIGNvbnRhaW5pbmcgc2NoZW1hLCBhbmQgcGFyZW50LCBjcmVhdGUgdGhlXG4gIGNvbXBsZXRlIGZpZWxkIG9iamVjdCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudFxuXG4gICovXG5jb25zdCBjcmVhdGVGaWVsZCA9IChcbiAgcHJvcHM6IEZvcm1Qcm9wcyxcbiAgc3RhdGU6IFBpY2s8Rm9ybVN0YXRlLCBcImN1cnJlbnREb2N1bWVudFwiIHwgXCJmbGF0U2NoZW1hXCIgfCBcIm9yaWdpbmFsU2NoZW1hXCI+LFxuICBjb250ZXh0OiBhbnksXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBzY2hlbWE6IGFueSxcbiAgbXV0YWJsZUZpZWxkczogQXJyYXk8YW55PixcbiAgcGFyZW50RmllbGROYW1lPzogc3RyaW5nLFxuICBwYXJlbnRQYXRoPzogc3RyaW5nXG4pOiBGb3JtRmllbGQgPT4ge1xuICBjb25zdCBmaWVsZFNjaGVtYSA9IHNjaGVtYVtmaWVsZE5hbWVdO1xuICBsZXQgZmllbGQgPSBpbml0RmllbGQocHJvcHMsIHN0YXRlLCBjb250ZXh0LCBmaWVsZE5hbWUsIGZpZWxkU2NoZW1hKTtcbiAgZmllbGQgPSBoYW5kbGVGaWVsZFBhdGgoZmllbGQsIGZpZWxkTmFtZSwgcGFyZW50UGF0aCk7XG4gIGZpZWxkID0gaGFuZGxlRmllbGRQYXJlbnQoZmllbGQsIHBhcmVudEZpZWxkTmFtZSk7XG4gIGZpZWxkID0gaGFuZGxlUGVybWlzc2lvbnMoZmllbGQsIGZpZWxkTmFtZSwgbXV0YWJsZUZpZWxkcyk7XG4gIGZpZWxkID0gaGFuZGxlRmllbGRDaGlsZHJlbihcbiAgICBwcm9wcyxcbiAgICBzdGF0ZSxcbiAgICBjb250ZXh0LFxuICAgIGZpZWxkLFxuICAgIGZpZWxkTmFtZSxcbiAgICBmaWVsZFNjaGVtYSxcbiAgICBzY2hlbWEsXG4gICAgbXV0YWJsZUZpZWxkc1xuICApO1xuICByZXR1cm4gZmllbGQ7XG59O1xuY29uc3QgY3JlYXRlQXJyYXlTdWJGaWVsZCA9IChcbiAgcHJvcHM6IEZvcm1Qcm9wcyxcbiAgc3RhdGU6IFBpY2s8Rm9ybVN0YXRlLCBcImN1cnJlbnREb2N1bWVudFwiIHwgXCJmbGF0U2NoZW1hXCIgfCBcIm9yaWdpbmFsU2NoZW1hXCI+LFxuICBjb250ZXh0OiBhbnksXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBzdWJGaWVsZFNjaGVtYTogVnVsY2FuRmllbGRTY2hlbWEsXG4gIHNjaGVtYTogVnVsY2FuU2NoZW1hLFxuICBtdXRhYmxlRmllbGRzOiBBcnJheTxzdHJpbmc+XG4pID0+IHtcbiAgY29uc3Qgc3ViRmllbGROYW1lID0gYCR7ZmllbGROYW1lfS4kYDtcbiAgbGV0IHN1YkZpZWxkID0gaW5pdEZpZWxkKHByb3BzLCBzdGF0ZSwgY29udGV4dCwgc3ViRmllbGROYW1lLCBzdWJGaWVsZFNjaGVtYSk7XG4gIC8vIGFycmF5IHN1YmZpZWxkIGhhcyB0aGUgc2FtZSBwYXRoIGFuZCBwZXJtaXNzaW9ucyBhcyBpdHMgcGFyZW50XG4gIC8vIHNvIHdlIHVzZSBwYXJlbnQgbmFtZSAoZmllbGROYW1lKSBhbmQgbm90IHN1YmZpZWxkTmFtZVxuICBzdWJGaWVsZCA9IGhhbmRsZUZpZWxkUGF0aChzdWJGaWVsZCwgZmllbGROYW1lKTtcbiAgc3ViRmllbGQgPSBoYW5kbGVQZXJtaXNzaW9ucyhzdWJGaWVsZCwgZmllbGROYW1lLCBtdXRhYmxlRmllbGRzIC8qc2NoZW1hKi8pO1xuICAvLyB3ZSBkbyBub3QgYWxsb3cgbmVzdGluZyB5ZXRcbiAgLy9zdWJGaWVsZCA9IHRoaXMuaGFuZGxlRmllbGRDaGlsZHJlbihmaWVsZCwgZmllbGRTY2hlbWEpXG4gIHJldHVybiBzdWJGaWVsZDtcbn07XG5cbi8vIEdyb3VwIG9mIG11bHRpcGxlIGZpZWxkcyAob2J0YWluZWQgYnkgcGFyc2luZyB0aGUgd2hvbGUgc2NoZW1hKVxuaW50ZXJmYWNlIEdyb3VwV2l0aEZpZWxkcyBleHRlbmRzIEZpZWxkR3JvdXAge1xuICBmaWVsZHM6IEFycmF5PEZvcm1GaWVsZD47XG59XG5cbnR5cGUgRm9ybVNjaGVtYVN0YXRlID0gUGljazxcbiAgRm9ybVN0YXRlLFxuICBcImN1cnJlbnREb2N1bWVudFwiIHwgXCJzY2hlbWFcIiB8IFwiZmxhdFNjaGVtYVwiIHwgXCJvcmlnaW5hbFNjaGVtYVwiXG4+O1xuXG4vKlxuXG4gIEdldCBhbGwgZmllbGQgZ3JvdXBzXG5cbiAgKi9cbmV4cG9ydCBjb25zdCBnZXRGaWVsZEdyb3VwcyA9IChcbiAgcHJvcHM6IEZvcm1Qcm9wcyxcbiAgc3RhdGU6IEZvcm1TY2hlbWFTdGF0ZSxcbiAgY29udGV4dDogSW50bFByb3ZpZGVyQ29udGV4dFZhbHVlLFxuICBtdXRhYmxlRmllbGRzOiBBcnJheTxzdHJpbmc+LFxuICBmb3JtYXRNZXNzYWdlOiBGdW5jdGlvblxuKSA9PiB7XG4gIGNvbnN0IHsgc2NoZW1hLCBjdXJyZW50RG9jdW1lbnQgfSA9IHN0YXRlO1xuICAvLyBidWlsZCBmaWVsZHMgYXJyYXkgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIGxpc3Qgb2YgZmllbGQgbmFtZXNcbiAgbGV0IGZpZWxkcyA9IGdldEZpZWxkTmFtZXMocHJvcHMsIGN1cnJlbnREb2N1bWVudCwge1xuICAgIG11dGFibGVGaWVsZHMsXG4gICAgc2NoZW1hLFxuICB9KS5tYXAoKGZpZWxkTmFtZSkgPT4ge1xuICAgIC8vIGdldCBzY2hlbWEgZm9yIHRoZSBjdXJyZW50IGZpZWxkXG4gICAgcmV0dXJuIGNyZWF0ZUZpZWxkKHByb3BzLCBzdGF0ZSwgY29udGV4dCwgZmllbGROYW1lLCBzY2hlbWEsIG11dGFibGVGaWVsZHMpO1xuICB9KTtcblxuICBmaWVsZHMgPSBzb3J0QnkoZmllbGRzLCBcIm9yZGVyXCIpO1xuXG4gIC8vIGdldCBsaXN0IG9mIGFsbCB1bmlxdWUgZ3JvdXBzIChiYXNlZCBvbiB0aGVpciBuYW1lKSB1c2VkIGluIGN1cnJlbnQgZmllbGRzLCByZW1vdmUgXCJlbXB0eVwiIGdyb3VwXG4gIGxldCBncm91cHMgPSBjb21wYWN0KHVuaXFCeShtYXAoZmllbGRzLCBcImdyb3VwXCIpLCAoZykgPT4gKGcgPyBnLm5hbWUgOiBcIlwiKSkpO1xuXG4gIC8vIGZvciBlYWNoIGdyb3VwLCBhZGQgcmVsZXZhbnQgZmllbGRzXG4gIGxldCBncm91cHNXaXRoRmllbGRzID0gZ3JvdXBzLm1hcCgoZ3JvdXApID0+IHtcbiAgICBjb25zdCBsYWJlbCA9XG4gICAgICBncm91cC5sYWJlbCB8fFxuICAgICAgLy90aGlzLmNvbnRleHQuZm9ybWF0TWVzc2FnZSh7IGlkOiBncm91cC5uYW1lIH0pIHx8XG4gICAgICBjYXBpdGFsaXplKGdyb3VwLm5hbWUpO1xuICAgIGNvbnN0IGdyb3VwRmllbGRzID0gX2ZpbHRlcjxGb3JtRmllbGQ+KGZpZWxkcywgKGZpZWxkKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQuZ3JvdXAgJiYgZmllbGQuZ3JvdXAubmFtZSA9PT0gZ3JvdXAubmFtZTtcbiAgICB9KTtcbiAgICBjb25zdCBncm91cFdpdGhGaWVsZHM6IEdyb3VwV2l0aEZpZWxkcyA9IHtcbiAgICAgIC4uLmdyb3VwLFxuICAgICAgbGFiZWwsXG4gICAgICBmaWVsZHM6IGdyb3VwRmllbGRzLFxuICAgIH07XG4gICAgcmV0dXJuIGdyb3VwV2l0aEZpZWxkcztcbiAgfSk7XG5cbiAgLy8gYWRkIGRlZmF1bHQgZ3JvdXAgaWYgbmVjZXNzYXJ5XG4gIGNvbnN0IGRlZmF1bHRHcm91cEZpZWxkcyA9IF9maWx0ZXIoZmllbGRzLCAoZmllbGQpID0+ICFmaWVsZC5ncm91cCk7XG4gIGlmIChkZWZhdWx0R3JvdXBGaWVsZHMubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVmYXVsdEdyb3VwOiBHcm91cFdpdGhGaWVsZHMgPSB7XG4gICAgICBuYW1lOiBcImRlZmF1bHRcIixcbiAgICAgIGxhYmVsOiBcImRlZmF1bHRcIixcbiAgICAgIG9yZGVyOiAwLFxuICAgICAgZmllbGRzOiBkZWZhdWx0R3JvdXBGaWVsZHMsXG4gICAgfTtcbiAgICBncm91cHNXaXRoRmllbGRzID0gW2RlZmF1bHRHcm91cF0uY29uY2F0KGdyb3Vwc1dpdGhGaWVsZHMpO1xuICB9XG5cbiAgLy8gc29ydCBieSBvcmRlclxuICBncm91cHNXaXRoRmllbGRzID0gc29ydEJ5KGdyb3Vwc1dpdGhGaWVsZHMsIFwib3JkZXJcIik7XG5cbiAgLy8gY29uc29sZS5sb2coZ3JvdXBzKTtcblxuICByZXR1cm4gZ3JvdXBzV2l0aEZpZWxkcztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvbWFwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9zb3J0QnlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3VuaXFCeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvZGlmZmVyZW5jZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvcmVqZWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9maWx0ZXJcIik7IiwiaW1wb3J0IGZpbmQgZnJvbSBcImxvZGFzaC9maW5kXCI7XG5pbXBvcnQgaXNFcXVhbFdpdGggZnJvbSBcImxvZGFzaC9pc0VxdWFsV2l0aFwiO1xuZXhwb3J0IGNvbnN0IGlzTm90U2FtZURvY3VtZW50ID0gKGluaXRpYWxEb2N1bWVudCwgY2hhbmdlZERvY3VtZW50KSA9PiB7XG4gIGNvbnN0IGNoYW5nZWRWYWx1ZSA9IGZpbmQoY2hhbmdlZERvY3VtZW50LCAodmFsdWUsIGtleSwgY29sbGVjdGlvbikgPT4ge1xuICAgIHJldHVybiAhaXNFcXVhbFdpdGgodmFsdWUsIGluaXRpYWxEb2N1bWVudFtrZXldLCAob2JqVmFsdWUsIG90aFZhbHVlKSA9PiB7XG4gICAgICBpZiAoIW9ialZhbHVlICYmICFvdGhWYWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdHlwZW9mIGNoYW5nZWRWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIjtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvaXNFcXVhbFdpdGhcIik7IiwiZXhwb3J0ICogZnJvbSBcIi4vdXNlV2Fybk9uVW5zYXZlZFwiO1xuIiwiaW1wb3J0IHsgdXNlQmxvY2tUcmFuc2l0aW9uIH0gZnJvbSBcIi4uL3VzZUJsb2NrVHJhbnNpdGlvbi91c2VCbG9ja1RyYW5zaXRpb25cIjtcbmltcG9ydCBkZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB7IHVzZUludGxDb250ZXh0IH0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5jb25zdCBkZWJ1Z1RyYW5zaXRpb25zID0gZGVidWcoXCJ2bjpyb3V0ZS10cmFuc2l0aW9uc1wiKTtcblxuLyoqXG4gKiBDYW4gdHJpZ2dlciBhbiBhbGVydCBvbiB1bnNhdmVkIGNoYW5nZXNcbiAqXG4gKiBUcmlnZ2VycyBldmVudCBzbyB5b3UgY2FuIGFsc28gYmxvY2sgU1BBIHRyYW5zaXRpb24gKGltcGxlbWVudGF0aW9uIGlzIE5PVCBwcm92aWRlZCBieSB0aGlzIGhvb2ssIHlvdVxuICogbmVlZCBsaXN0ZW5lcnMgd2hvc2UgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiB5b3VyIHJvdXRlciAoUmVhY3QgUm91dGVyLCBOZXh0IFJvdXRlci4uLiksIHNlZSBibG9jay50cylcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdFRyYWluaW5nL2hpc3RvcnkvYmxvYi9tYXN0ZXIvZG9jcy9ibG9ja2luZy10cmFuc2l0aW9ucy5tZFxuICpcbiAqIEBwYXJhbSBwYXJhbTBcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVdhcm5PblVuc2F2ZWQgPSAoe1xuICBpc0NoYW5nZWQsXG4gIHdhcm5VbnNhdmVkQ2hhbmdlcyxcbn06IHtcbiAgaXNDaGFuZ2VkOiBib29sZWFuO1xuICB3YXJuVW5zYXZlZENoYW5nZXM/OiBib29sZWFuO1xufSkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlSW50bENvbnRleHQoKTtcbiAgLyoqXG4gICAqIFRvIGJlIHBhc3NlZCB0byBvbmJlZm9yZXVubG9hZCBldmVudC4gVGhlIHJldHVybmVkIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWRcbiAgICogYnkgdGhlIHByb21wdC5cbiAgICpcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3dFdmVudEhhbmRsZXJzL29uYmVmb3JldW5sb2FkXG4gICAqIHRoZSBtZXNzYWdlIHJldHVybmVkIGlzIGFjdHVhbGx5IGlnbm9yZWQgYnkgbW9zdCBicm93c2VycyBhbmQgYSBkZWZhdWx0IG1lc3NhZ2UgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZSB0aGlzIHBhZ2U/IFlvdSBtaWdodCBoYXZlIHVuc2F2ZWQgY2hhbmdlcycgaXMgZGlzcGxheWVkLiBTZWUgdGhlIE5vdGVzIHNlY3Rpb24gb24gdGhlIG1vemlsbGEgZG9jcyBhYm92ZVxuICAgKi9cbiAgY29uc3QgZ2V0QmxvY2tlZE1lc3NhZ2UgPSAoZXZlbnQ/OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICAgIGRlYnVnVHJhbnNpdGlvbnMoXCJydW5uaW5nIGhhbmRsZVBhZ2VMZWF2ZVwiLCBldmVudCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNvbnRleHQuZm9ybWF0TWVzc2FnZSh7XG4gICAgICBpZDogXCJmb3Jtcy5jb25maXJtX2Rpc2NhcmRcIixcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkaXNjYXJkIHlvdXIgY2hhbmdlcz9cIixcbiAgICB9KTtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfTtcbiAgdXNlQmxvY2tUcmFuc2l0aW9uKHtcbiAgICBzaG91bGRCbG9jazogISEod2FyblVuc2F2ZWRDaGFuZ2VzICYmIGlzQ2hhbmdlZCksXG4gICAgZ2V0QmxvY2tlZE1lc3NhZ2U6IGdldEJsb2NrZWRNZXNzYWdlLFxuICB9KTtcbn07XG4iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgYmxvY2sgfSBmcm9tIFwiLi9ibG9ja1wiO1xuaW1wb3J0IGRlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuY29uc3QgZGVidWdUcmFuc2l0aW9ucyA9IGRlYnVnKFwidm46cm91dGVyLXRyYW5zaXRpb25zXCIpO1xuXG4vKipcbiAqIENhbiB0cmlnZ2VyIGFuIGFsZXJ0IG9uIHVuc2F2ZWQgY2hhbmdlc1xuICpcbiAqIFRyaWdnZXJzIGV2ZW50IHNvIHlvdSBjYW4gYWxzbyBibG9jayBTUEEgdHJhbnNpdGlvbiAoaW1wbGVtZW50YXRpb24gaXMgTk9UIHByb3ZpZGVkIGJ5IHRoaXMgaG9vaywgeW91XG4gKiBuZWVkIGxpc3RlbmVycyB3aG9zZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRzIG9uIHlvdXIgcm91dGVyIChSZWFjdCBSb3V0ZXIsIE5leHQgUm91dGVyLi4uKSwgc2VlIGJsb2NrLnRzKVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0VHJhaW5pbmcvaGlzdG9yeS9ibG9iL21hc3Rlci9kb2NzL2Jsb2NraW5nLXRyYW5zaXRpb25zLm1kXG4gKlxuICogQHBhcmFtIHBhcmFtMFxuICovXG5leHBvcnQgY29uc3QgdXNlQmxvY2tUcmFuc2l0aW9uID0gKHtcbiAgc2hvdWxkQmxvY2ssXG4gIGdldEJsb2NrZWRNZXNzYWdlLFxufToge1xuICBzaG91bGRCbG9jazogYm9vbGVhbjtcbiAgZ2V0QmxvY2tlZE1lc3NhZ2U6IChldnQ/OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4gc3RyaW5nO1xufSkgPT4ge1xuICAvLyBmdW5jdGlvbiB0byB1bmJsb2NrIHRoZSBmb3JtXG4gIGNvbnN0IHVuYmxvY2tSZWYgPSB1c2VSZWY8RnVuY3Rpb24gfCB1bmRlZmluZWQ+KCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBpc0Jsb2NraW5nID0gISF1bmJsb2NrUmVmLmN1cnJlbnQ7XG4gICAgZGVidWdUcmFuc2l0aW9ucyhcbiAgICAgIFwicnVubmluZyBlZmZlY3RcIixcbiAgICAgIFwic2hvdWxkIGJsb2NrXCIsXG4gICAgICBzaG91bGRCbG9jayxcbiAgICAgIFwiY3VycmVudGx5IGJsb2NrZWRcIixcbiAgICAgIGlzQmxvY2tpbmdcbiAgICApO1xuXG4gICAgY29uc3Qgb25VbmJsb2NrID0gKCkgPT4ge1xuICAgICAgZGVidWdUcmFuc2l0aW9ucyhcInJ1bm5pbmcgdW5ibG9jayBmcm9tIGVmZmVjdFwiKTtcbiAgICAgIGlmICghc2hvdWxkQmxvY2spIHtcbiAgICAgICAgaWYgKHVuYmxvY2tSZWYuY3VycmVudCkge1xuICAgICAgICAgIHVuYmxvY2tSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBibG9ja1xuICAgIGNvbnN0IG9uQmxvY2tlZCA9IChldnQ/OiBCZWZvcmVVbmxvYWRFdmVudCk6IHN0cmluZyA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZ2V0QmxvY2tlZE1lc3NhZ2UoZXZ0KTtcbiAgICAgIGRlYnVnVHJhbnNpdGlvbnMoXG4gICAgICAgIFwidXNlciBpcyBiZWluZyBibG9ja2VkIGFmdGVyIHRyeWluZyB0byBsZWF2ZSB0aGUgcGFnZSwgd2l0aCBtZXNzYWdlOiBcIiArXG4gICAgICAgICAgbWVzc2FnZVxuICAgICAgKTtcbiAgICAgIGlmIChldnQpIHtcbiAgICAgICAgZXZ0LnJldHVyblZhbHVlID0gbWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH07XG4gICAgaWYgKHNob3VsZEJsb2NrKSB7XG4gICAgICBkZWJ1Z1RyYW5zaXRpb25zKFxuICAgICAgICBcInNob3VsZCBibG9jayB0cmFuc2l0aW9uLCBzZXR0aW5nIHVwIHJlbGV2YW50IGV2ZW50IGxpc3RlbmVyXCJcbiAgICAgICk7XG4gICAgICB1bmJsb2NrUmVmLmN1cnJlbnQgPSBibG9jayhvbkJsb2NrZWQsIG9uVW5ibG9jayk7XG4gICAgfVxuICAgIC8vIHVuYmxvY2sgaWYgbm90IGJsb2NraW5nIGFueW1vcmUgYW5kIHdhcyBibG9ja2luZyBwcmV2aW91c2x5XG4gICAgaWYgKCFzaG91bGRCbG9jayAmJiBpc0Jsb2NraW5nKSB7XG4gICAgICBkZWJ1Z1RyYW5zaXRpb25zKFwic2hvdWxkIHVuYmxvY2sgKHN0YXRlIGhhcyBiZWVuIHJlaW5pdGlhbGl6ZWQpXCIpO1xuICAgICAgaWYgKHVuYmxvY2tSZWYuY3VycmVudCkge1xuICAgICAgICB1bmJsb2NrUmVmLmN1cnJlbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdHJpZ2dlciB0aGUgcG90ZW50aWFsbHkgcmVnaXN0ZXJlZCB1bmJsb2NrIGZ1bmN0aW9uIHdoZW4gY29tcG9uZW50IHVubW91bnRzXG4gICAgLy9yZXR1cm4gb25VbmJsb2NrO1xuICB9LCBbc2hvdWxkQmxvY2tdKTtcbn07XG4iLCJpbXBvcnQgZGVidWcgZnJvbSBcImRlYnVnXCI7XG5jb25zdCBkZWJ1Z1RyYW5zaXRpb25zID0gZGVidWcoXCJ2bjpyb3V0ZS10cmFuc2l0aW9uXCIpO1xuY29uc3QgQmVmb3JlVW5sb2FkRXZlbnRUeXBlID0gXCJiZWZvcmV1bmxvYWRcIjtcbi8qKlxuICogRXZlbnQgdHJpZ2dlcmVkIHdoZW4gYSB3YXJuaW5nIG9uIHVuc2F2ZWQgY2hhbmdlcyBpcyBuZWNlc3NhcnlcbiAqIFRoZSBhcHAgc2hvdWxkIGxpc3RlbiBmb3IgdGhpcyBldmVudCB0byBzZXR1cCByZWxldmFudCBibG9ja2luZyBtZXRob2RzIGRlcGVuZGluZyBvbiB0aGUgZnJhbWV3b3JrXG4gKlxuICogRm9yIGluc3RhbmNlIHdpdGggUmVhY3QgUm91dGVyOlxuICpcbiAqIGxldCB1bmJsb2NrXG4gKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsb2NrdHJhbnNpdGlvblwiLCAoKSA9PiB7XG4gKiAgICB1bmJsb2NrID0gcm91dGVyLmhpc3RvcnkuYmxvY2soLi4uKVxuICogfSlcbiAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidW5ibG9ja3RyYW5zaXRpb25cIiwgKCkgPT4ge1xuICogICAgdW5ibG9jaygpXG4gKiB9KVxuICpcbiAqIEZvciBOZXh0LmpzLCB5b3Ugd291bGQgZG8gc29tZXRoaW5nIHNpbWlsYXJcbiAqIENoZWNrIGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvbmV4dC5qcy9kaXNjdXNzaW9ucy8xMjM0OFxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IEJMT0NLX1RSQU5TSVRJT05fRVZFTlRfVFlQRSA9IFwiYmxvY2t0cmFuc2l0aW9uXCI7XG4vKipcbiAqIENhbGxlZCB3aGVuIGJsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkgYW55bW9yZTpcbiAqIC0gdGhlcmUgYXJlIG5vIHVuc2F2ZWQgY2hhbmdlcyBhbnltb3JlXG4gKiAtIHVzZXIgaGFzIGNvbmZpcm1lZCB0aGV5IHdhbnQgdG8gbGVhdmVcbiAqL1xuZXhwb3J0IGNvbnN0IFVOQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFID0gXCJ1bmJsb2NrdHJhbnNpdGlvblwiO1xuLyoqXG4gKiBJbnRlcmNlcHRzIHRoZSBiZWZvcmV1bmxvYWQgZXZlbnRcbiAqXG4gKiBDb2RlIHRha2VuIGZyb20gUmVhY3QgUm91dGVyIGhpc3RvcnkgZmVhdHVyZVxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RUcmFpbmluZy9oaXN0b3J5L2Jsb2IvbWFzdGVyL2RvY3MvYmxvY2tpbmctdHJhbnNpdGlvbnMubWRcbiAqL1xuZnVuY3Rpb24gYmxvY2tCZWZvcmVVbmxvYWQoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSB7XG4gIC8vIENhbmNlbCB0aGUgZXZlbnQuXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vIENocm9tZSAoYW5kIGxlZ2FjeSBJRSkgcmVxdWlyZXMgcmV0dXJuVmFsdWUgdG8gYmUgc2V0LlxuICBldmVudC5yZXR1cm5WYWx1ZSA9IFwiXCI7XG59XG5cbi8qKlxuICogQmxvY2tzIHRyYW5zaXRpb25cbiAqXG4gKiAvIVxcIEluIG9yZGVyIHRvIGNhdGNoIFNQQSB0cmFuc2l0aW9uLCB5b3UgbmVlZCB0byBpbXBsZW1lbnRcbiAqIGFuIGV2ZW50IGxpc3RlbmVyIGluIHlvdXIgb3duIGFwcC5cbiAqXG4gKlxuICogQHBhcmFtIG9uVW5ibG9jayBDYWxsYmFjayB0byBjYWxsIG9uIHVuYmxvY2ssIGZvciBjdXN0b20gYmVoYXZpb3VyXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRvIHVuYmxvY2sgdGhlIHRyYW5zaXRpb24gKGVnIGlmIHRoZSBmb3JtIGlzIGJhY2sgdG9cbiAqIGl0cyBvcmlnaW5hbCBzdGF0ZSlcbiAqL1xuZXhwb3J0IGNvbnN0IGJsb2NrID0gKFxuICBzZXRDb25maXJtYXRpb25NZXNzYWdlOiAoZXZlbnQ/OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4gc3RyaW5nLFxuICBvblVuYmxvY2s/OiBGdW5jdGlvblxuKSA9PiB7XG4gIGRlYnVnVHJhbnNpdGlvbnMoXCJydW5uaW5nIGJsb2NrIGZ1bmN0aW9uXCIpO1xuICAvLyB0cmlnZ2VyIGEgYmxvY2sgZXZlbnQsIHRvIGJlIGhhbmRsZWQgYXQgdGhlIGZyYW1ld29yayBsZXZlbFxuICAvLyBUT0RPOiBzZXRDb25maXJtYXRpb25NZXNzYWdlIHNob3VsZCBiZSBwYXNzZWQgYXMgd2VsbFxuICBjb25zdCBibG9ja0V2ZW50ID0gbmV3IEV2ZW50KEJMT0NLX1RSQU5TSVRJT05fRVZFTlRfVFlQRSk7XG4gIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGJsb2NrRXZlbnQpO1xuICAvLyBibG9jayBhdCBicm93c2VyIGxldmVsXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEJlZm9yZVVubG9hZEV2ZW50VHlwZSwgYmxvY2tCZWZvcmVVbmxvYWQpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihCZWZvcmVVbmxvYWRFdmVudFR5cGUsIHNldENvbmZpcm1hdGlvbk1lc3NhZ2UpO1xuICAvLyByZXR1cm4gYW4gdW5ibG9jayBmdW5jdGlvbiB0byBjYW5jZWxcbiAgY29uc3QgdW5ibG9jayA9ICgpID0+IHtcbiAgICBkZWJ1Z1RyYW5zaXRpb25zKFwicnVubmluZyB1bmJsb2NrIGZ1bmN0aW9uXCIpO1xuICAgIGlmIChvblVuYmxvY2spIHtcbiAgICAgIGRlYnVnVHJhbnNpdGlvbnMoXCJydW5uaW5nIHVzZXIgZGVmaW5lZCBmdW5jdGlvblwiKTtcbiAgICAgIG9uVW5ibG9jaygpOyAvLyBjYWxsYmFjayBmcm9tIHVzZXIgbGFuZFxuICAgIH1cbiAgICAvLyB0cmlnZ2VyIGFuIHVuYmxvY2sgZXZlbnQsIHRvIGJlIGhhbmRsZWQgYXQgdGhlIGZyYW1ld29yayBsZXZlbFxuICAgIGNvbnN0IHVuYmxvY2tFdmVudCA9IG5ldyBFdmVudChVTkJMT0NLX1RSQU5TSVRJT05fRVZFTlRfVFlQRSk7XG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQodW5ibG9ja0V2ZW50KTtcbiAgICAvLyByZW1vdmUgdGhlIGJyb3dzZXIgbGV2ZWwgZXZlbnRzXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoQmVmb3JlVW5sb2FkRXZlbnRUeXBlLCBibG9ja0JlZm9yZVVubG9hZCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoQmVmb3JlVW5sb2FkRXZlbnRUeXBlLCBzZXRDb25maXJtYXRpb25NZXNzYWdlKTtcbiAgICAvLyB1bmJsb2NrIGJyb3dzZXIgY2hhbmdlXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IHVuZGVmaW5lZDsgLy91bmRlZmluZWQgaW5zdGVhZCBvZiBudWxsIHRvIHN1cHBvcnQgSUVcbiAgfTtcbiAgcmV0dXJuIHVuYmxvY2s7XG59O1xuIiwiLyoqXG4gKiBOT1RFOiBLRUVQIFNFUEFSQVRFRCBGUk9NIFRIRSBIT09LUyBUTyBDT05TVU1FIFRIRSBDT05URVhUXG4gKiBvdGhlcndpc2UgeW91J2xsIGVuZCB1cCB3aXRoIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBiZWNhdXNlIG9mIHRoZSBkZWZhdWx0IGNvbXBvbmVudHNcbiAqL1xuLy8gVE9ETzogd2UgbWlnaHQgbmVlZCB0byBhZGFwdCB0aGUgcHJvdmlkZXIgdG8gbWVyZ2UgaXRzIHZhbHVlIHdpdGggYSBwb3RlbnRpYWxseSBoaWdoZXIgdXAgY29udGV4dFxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgeyBkZWZhdWx0VnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL2RlZmF1bHRWdWxjYW5Db21wb25lbnRzXCI7XG5pbXBvcnQgeyBQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQgeyBWdWxjYW5Db21wb25lbnRzQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9Db25zdW1lclwiO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucy52YWx1ZSBBbiBvYmplY3Qgb2YgVnVsY2FuIGNvbXBvbmVudHMgdG8gYmUgb3ZlcnJpZGVuLlxuICovXG5leHBvcnQgY29uc3QgVnVsY2FuQ29tcG9uZW50c1Byb3ZpZGVyID0gKHtcbiAgdmFsdWUsXG4gIC4uLnByb3BzXG59OiB7XG4gIHZhbHVlPzogUGFydGlhbDxQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHM+O1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkgPT4ge1xuICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgbWVyZ2VkQ29tcG9uZW50cyA9IHtcbiAgICAuLi5kZWZhdWx0VnVsY2FuQ29tcG9uZW50cyxcbiAgICAvLyBtZXJnZSB3aXRoIGEgcGFyZW50IFByb3ZpZGVyIGlmIG5lZWRlZFxuICAgIC4uLihjdXJyZW50Q29tcG9uZW50cz8uX19ub3RfaW50aWFsaXplZCA/IHt9IDogY3VycmVudENvbXBvbmVudHMgfHwge30pLFxuICAgIC4uLih2YWx1ZSB8fCB7fSksXG4gIH07XG4gIC8vIEZvciBwcmVzZXJ2aW5nIGRpc3BsYXlOYW1lLCB0aGF0IGlzIGxvc3QgYWZ0ZXIgYnVpbGQgc29tZWhvd1xuICBPYmplY3Qua2V5cyhtZXJnZWRDb21wb25lbnRzKS5mb3JFYWNoKChjb21wb25lbnROYW1lKSA9PiB7XG4gICAgbWVyZ2VkQ29tcG9uZW50c1tjb21wb25lbnROYW1lXS5kaXNwbGF5TmFtZSA9IFwiVnVsY2FuLlwiICsgY29tcG9uZW50TmFtZTtcbiAgfSk7XG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0LlByb3ZpZGVyXG4gICAgICB2YWx1ZT17bWVyZ2VkQ29tcG9uZW50c30gLy8gbWVyZ2UgcHJvdmlkZWQgY29tcG9uZW50cyBzbyB0aGUgdXNlciBjYW4gcHJvdmlkZSBvbmx5IGEgcGFydGlhbCByZXBsYWNlbWVudFxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gXCJAdnVsY2FuanMvaTE4blwiO1xuaW1wb3J0IHsgRm9ybUVycm9yIH0gZnJvbSBcIi4uL2Zvcm0vRm9ybUVycm9yXCI7XG4vLyBUT0RPOiBjdXJyZW50bHkgd2UgbmVlZCB0aGUgZGVmYXVsdCBleHBvcnQgYmVjYXVzZSB3ZSBwYXNzIGNvbXBvbmVudHMgbWFudWFsbHlcbmltcG9ydCBGb3JtQ29tcG9uZW50IGZyb20gXCIuLi9mb3JtL0Zvcm1Db21wb25lbnRcIjtcbmltcG9ydCB7IEZvcm1Db21wb25lbnRJbm5lciB9IGZyb20gXCIuLi9mb3JtL0Zvcm1Db21wb25lbnRJbm5lclwiO1xuaW1wb3J0IHsgRm9ybUNvbXBvbmVudExvYWRlciB9IGZyb20gXCIuLi9mb3JtL0Zvcm1Db21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uL2Zvcm0vRm9ybUVsZW1lbnRcIjtcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUdyb3VwTGF5b3V0LCBGb3JtR3JvdXBIZWFkZXIgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtR3JvdXBcIjtcbmltcG9ydCB7IEZvcm1JbnRsLCBGb3JtSW50bEl0ZW1MYXlvdXQsIEZvcm1JbnRsTGF5b3V0IH0gZnJvbSBcIi4uL2Zvcm0vRm9ybUludGxcIjtcbmltcG9ydCB7IEZvcm1FcnJvcnMgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtRXJyb3JzXCI7XG5pbXBvcnQgeyBGb3JtU3VibWl0IH0gZnJvbSBcIi4uL2Zvcm0vRm9ybVN1Ym1pdFwiO1xuaW1wb3J0IHsgRm9ybUxheW91dCB9IGZyb20gXCIuLi9mb3JtL0Zvcm1MYXlvdXRcIjtcbmltcG9ydCB7XG4gIEZvcm1OZXN0ZWRBcnJheSxcbiAgRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXQsXG4gIEljb25BZGQsXG4gIEljb25SZW1vdmUsXG59IGZyb20gXCIuLi9mb3JtL0Zvcm1OZXN0ZWRBcnJheVwiO1xuaW1wb3J0IHsgRm9ybU5lc3RlZEFycmF5TGF5b3V0IH0gZnJvbSBcIi4uL2Zvcm0vRm9ybU5lc3RlZEFycmF5TGF5b3V0XCI7XG5pbXBvcnQgeyBGb3JtTmVzdGVkSXRlbSwgRm9ybU5lc3RlZEl0ZW1MYXlvdXQgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtTmVzdGVkSXRlbVwiO1xuaW1wb3J0IHsgRm9ybU5lc3RlZERpdmlkZXIgfSBmcm9tIFwiLi4vZm9ybS9Gb3JtTmVzdGVkRGl2aWRlclwiO1xuaW1wb3J0IHsgRmllbGRFcnJvcnMgfSBmcm9tIFwiLi4vZm9ybS9GaWVsZEVycm9yc1wiO1xuaW1wb3J0IHtcbiAgRm9ybU5lc3RlZE9iamVjdCxcbiAgRm9ybU5lc3RlZE9iamVjdExheW91dCxcbn0gZnJvbSBcIi4uL2Zvcm0vRm9ybU5lc3RlZE9iamVjdFwiO1xuaW1wb3J0IHsgRm9ybU9wdGlvbkxhYmVsIH0gZnJvbSBcIi4uL2Zvcm0vRm9ybU9wdGlvbkxhYmVsXCI7XG5pbXBvcnQgeyBGb3JtIH0gZnJvbSBcIi4uL2Zvcm0vRm9ybVwiO1xuXG5pbXBvcnQge1xuICBGb3JtQ29tcG9uZW50RGVmYXVsdCxcbiAgRm9ybUNvbXBvbmVudFBhc3N3b3JkLFxuICBGb3JtQ29tcG9uZW50TnVtYmVyLFxuICBGb3JtQ29tcG9uZW50VXJsLFxuICBGb3JtQ29tcG9uZW50RW1haWwsXG4gIEZvcm1Db21wb25lbnRUZXh0YXJlYSxcbiAgRm9ybUNvbXBvbmVudENoZWNrYm94LFxuICBGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cCxcbiAgRm9ybUNvbXBvbmVudFJhZGlvR3JvdXAsXG4gIEZvcm1Db21wb25lbnRTZWxlY3QsXG4gIEZvcm1Db21wb25lbnRTZWxlY3RNdWx0aXBsZSxcbiAgRm9ybUNvbXBvbmVudERhdGVUaW1lLFxuICBGb3JtQ29tcG9uZW50RGF0ZSxcbiAgRm9ybUNvbXBvbmVudFRpbWUsXG4gIEZvcm1Db21wb25lbnRTdGF0aWNUZXh0LFxuICBGb3JtQ29tcG9uZW50TGlrZXJ0LFxuICAvLyB1c2VkIGJ5IHVpLWJvb3RzdHJhcCBhbmQgdWktbWF0ZXJpYWxcbiAgRm9ybUl0ZW0sXG4gIEZvcm1Db21wb25lbnRBdXRvY29tcGxldGUsXG59IGZyb20gXCIuLi9mb3JtL2lucHV0cy9CYXNpY0lucHV0c1wiO1xuaW1wb3J0IHsgQXV0b2NvbXBsZXRlTXVsdGlwbGUgfSBmcm9tIFwiLi4vZm9ybS9pbnB1dHMvQXV0b2NvbXBsZXRlTXVsdGlwbGVcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCIuLi9mb3JtL2NvcmUvQnV0dG9uXCI7XG5pbXBvcnQgeyBMb2FkaW5nIH0gZnJvbSBcIi4uL2Zvcm0vY29yZS9Mb2FkaW5nXCI7XG5cbmltcG9ydCB7IExvYWRpbmdCdXR0b24gfSBmcm9tIFwiLi4vTG9hZGluZ0J1dHRvblwiO1xuaW1wb3J0IHsgTXV0YXRpb25CdXR0b24gfSBmcm9tIFwiLi4vTXV0YXRpb25CdXR0b25cIjtcbmltcG9ydCB7IEhlYWRUYWdzIH0gZnJvbSBcIi4uL0hlYWRUYWdzXCI7XG5cbi8vIFRPRE86IHJld3JpdGUgdG8gcmVtb3ZlIGRlcCB0byByZWFjdC1ib290c3RyYXBcbmltcG9ydCB7IFRvb2x0aXBUcmlnZ2VyIH0gZnJvbSBcIi4uL2Jvb3RzdHJhcC9Ub29sdGlwVHJpZ2dlclwiO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuLi9ib290c3RyYXAvRHJvcGRvd25cIjtcblxuaW1wb3J0IHsgUG9zc2libGVDb3JlQ29tcG9uZW50cywgUG9zc2libGVGb3JtQ29tcG9uZW50cyB9IGZyb20gXCIuL3R5cGluZ3NcIjtcblxuY29uc3QgZGVmYXVsdENvcmVDb21wb25lbnRzOiBQb3NzaWJsZUNvcmVDb21wb25lbnRzID0ge1xuICAvLyBjb3JlIGNvbXBvbmVudHMgdGFodCB3ZXJlIHVzZWQgaW4gZm9ybXNcbiAgTG9hZGluZyxcbiAgQWxlcnQ6ICgpID0+IG51bGwsXG4gIEJ1dHRvbixcbiAgSWNvbjogKCkgPT4gbnVsbCxcbiAgLy8gaTE4blxuICBGb3JtYXR0ZWRNZXNzYWdlLFxuICAvLyBjb3JlXG4gIExvYWRpbmdCdXR0b24sXG4gIE11dGF0aW9uQnV0dG9uLFxuICBIZWFkVGFncyxcbiAgLy9cbiAgVG9vbHRpcFRyaWdnZXIsXG4gIERyb3Bkb3duLFxufTtcbmNvbnN0IGRlZmF1bHRGb3JtQ29tcG9uZW50czogUG9zc2libGVGb3JtQ29tcG9uZW50cyA9IHtcbiAgRm9ybUVycm9yLCAvLyB1c2VkIGJ5OiBGaWVsZEVycm9yc1xuICAvLyBUbyBiZSBkZWZpbmVkIGJ5IHRoZSBVSSBmcmFtZXdvcmtcbiAgLy8gVE9ETzogYWRkIGRlZmF1bHRzIGluIFJlYWN0IGNvbXBvbmVudHNcbiAgRm9ybUNvbXBvbmVudERlZmF1bHQsXG4gIEZvcm1Db21wb25lbnRQYXNzd29yZCxcbiAgRm9ybUNvbXBvbmVudE51bWJlcixcbiAgRm9ybUNvbXBvbmVudFVybCxcbiAgRm9ybUNvbXBvbmVudEVtYWlsLFxuICBGb3JtQ29tcG9uZW50VGV4dGFyZWEsXG4gIEZvcm1Db21wb25lbnRDaGVja2JveCxcbiAgRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXAsXG4gIEZvcm1Db21wb25lbnRSYWRpb0dyb3VwLFxuICBGb3JtQ29tcG9uZW50U2VsZWN0LFxuICBGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGUsXG4gIEZvcm1Db21wb25lbnREYXRlVGltZSxcbiAgRm9ybUNvbXBvbmVudERhdGUsXG4gIC8vRm9ybUNvbXBvbmVudERhdGUyLFxuICBGb3JtQ29tcG9uZW50VGltZSxcbiAgRm9ybUNvbXBvbmVudFN0YXRpY1RleHQsXG4gIEZvcm1Db21wb25lbnRMaWtlcnQsXG4gIC8vRm9ybUNvbXBvbmVudEF1dG9jb21wbGV0ZSxcbiAgLy9Gb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGUsXG4gIC8vIENvbXBvbmVudHMgZGVmaW5lZCBpbiBkZWZhdWx0IHZ1bGNhbi9mb3Jtc1xuICBGb3JtQ29tcG9uZW50LFxuICBGb3JtQ29tcG9uZW50SW5uZXIsXG4gIEZvcm1Db21wb25lbnRMb2FkZXIsXG4gIEZvcm1FbGVtZW50LFxuICBGb3JtR3JvdXAsXG4gIEZvcm1Hcm91cExheW91dCxcbiAgRm9ybUdyb3VwSGVhZGVyLFxuICBGb3JtSW50bCxcbiAgRm9ybUludGxJdGVtTGF5b3V0LFxuICBGb3JtSW50bExheW91dCxcblxuICAvLyBMYXlvdXRcbiAgRmllbGRFcnJvcnMsXG4gIEZvcm1FcnJvcnMsXG4gIEZvcm1TdWJtaXQsXG4gIEZvcm1MYXlvdXQsXG5cbiAgRm9ybU5lc3RlZEFycmF5LFxuICBGb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dCxcbiAgRm9ybU5lc3RlZEFycmF5TGF5b3V0LFxuICBGb3JtTmVzdGVkSXRlbSxcbiAgSWNvbkFkZCxcbiAgSWNvblJlbW92ZSxcbiAgRm9ybU5lc3RlZERpdmlkZXIsXG4gIC8vIG5lc3RlZCBpdGVtXG4gIEZvcm1OZXN0ZWRJdGVtTGF5b3V0LFxuICBGb3JtTmVzdGVkT2JqZWN0TGF5b3V0LFxuICBGb3JtTmVzdGVkT2JqZWN0LFxuICBGb3JtT3B0aW9uTGFiZWwsXG4gIC8vXG4gIEZvcm0sXG4gIC8vXG4gIEZvcm1JdGVtLFxuICBGb3JtQ29tcG9uZW50QXV0b2NvbXBsZXRlLFxuICBGb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGU6IEF1dG9jb21wbGV0ZU11bHRpcGxlLFxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRWdWxjYW5Db21wb25lbnRzID0ge1xuICAuLi5kZWZhdWx0Q29yZUNvbXBvbmVudHMsXG4gIC4uLmRlZmF1bHRGb3JtQ29tcG9uZW50cyxcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG4vLyBpbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG4vLyBpbXBvcnQgZ2V0Q29udGV4dCBmcm9tICdyZWNvbXBvc2UvZ2V0Q29udGV4dCc7XG4vLyBpbXBvcnQgeyBDb21wb25lbnRzLCByZWdpc3RlckNvbXBvbmVudCB9IGZyb20gJ21ldGVvci92dWxjYW46Y29yZSc7XG5pbXBvcnQgZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1FcnJvciA9ICh7IGVycm9yLCBlcnJvckNvbnRleHQgfSkgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCB7IGdldExhYmVsIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICAvLyB1c2UgdGhlIGVycm9yIG9yIGVycm9yIG1lc3NhZ2UgYXMgZGVmYXVsdCBtZXNzYWdlXG4gIGNvbnN0IGRlZmF1bHRNZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZSB8fCBlcnJvcik7XG4gIGNvbnN0IGlkID0gZXJyb3IuaWQgfHwgXCJhcHAuZGVmYXVsdEVycm9yXCI7XG5cbiAgLy8gZGVmYXVsdCBwcm9wcyBmb3IgYWxsIGVycm9yc1xuICBsZXQgbWVzc2FnZVByb3BzID0ge1xuICAgIGlkLFxuICAgIGRlZmF1bHRNZXNzYWdlLFxuICAgIHZhbHVlczoge1xuICAgICAgZXJyb3JDb250ZXh0LFxuICAgICAgZGVmYXVsdE1lc3NhZ2UsXG4gICAgfSxcbiAgfTtcblxuICAvLyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gZW5oYW5jZSB0aGUgbWVzc2FnZVxuICBpZiAoZXJyb3IucHJvcGVydGllcykge1xuICAgIC8vIGluIGNhc2UgdGhpcyBpcyBhIG5lc3RlZCBmaWVsZHMsIG9ubHkga2VlcCBsYXN0IHNlZ21lbnQgb2YgcGF0aFxuICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICBlcnJvci5wcm9wZXJ0aWVzLm5hbWUgJiYgZXJyb3IucHJvcGVydGllcy5uYW1lLnNwbGl0KFwiLlwiKS5zbGljZSgtMSlbMF07XG4gICAgbWVzc2FnZVByb3BzLnZhbHVlcyA9IHtcbiAgICAgIC4uLm1lc3NhZ2VQcm9wcy52YWx1ZXMsXG4gICAgICAvLyBpZiB0aGUgZXJyb3IgaXMgdHJpZ2dlcmVkIGJ5IGEgZmllbGQsIGdldCB0aGUgcmVsZXZhbnQgbGFiZWxcbiAgICAgIGxhYmVsOiBlcnJvck5hbWUgJiYgZ2V0TGFiZWwoZXJyb3JOYW1lLCBlcnJvci5wcm9wZXJ0aWVzLmxvY2FsZSksXG4gICAgICAuLi5lcnJvci5wcm9wZXJ0aWVzLFxuICAgIH07XG4gIH1cblxuICBpZiAoZXJyb3IuZGF0YSkge1xuICAgIG1lc3NhZ2VQcm9wcy52YWx1ZXMgPSB7XG4gICAgICAuLi5tZXNzYWdlUHJvcHMudmFsdWVzLFxuICAgICAgLi4uZXJyb3IuZGF0YSwgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZXhjZXB0aW9uID0gZ2V0KGVycm9yLCBcImV4dGVuc2lvbnMuZXhjZXB0aW9uXCIpO1xuICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgbWVzc2FnZVByb3BzID0ge1xuICAgICAgLi4ubWVzc2FnZVByb3BzLFxuICAgICAgaWQ6IGV4Y2VwdGlvbi5pZCxcbiAgICAgIHZhbHVlczogZXhjZXB0aW9uLmRhdGEsXG4gICAgfTtcbiAgfVxuICByZXR1cm4gPFZ1bGNhbkNvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZSBodG1sPXt0cnVlfSB7Li4ubWVzc2FnZVByb3BzfSAvPjtcbn07XG5cbkZvcm1FcnJvci5kZWZhdWx0UHJvcHMgPSB7XG4gIGVycm9yQ29udGV4dDogXCJcIiwgLy8gZGVmYXVsdCBjb250ZXh0IHNvIGZvcm1hdCBtZXNzYWdlIGRvZXMgbm90IGNvbXBsYWluXG59O1xuIiwiLyoqXG4gKiBUT0RPOiByZW5hbWUgXCJGaWVsZENvbXBvbmVudFwiIHRvIGNsYXJpZnlcbiAqIENoYW5nZSBjb21wYXJlZCB0byBNZXRlb3I6XG4gKiAtIGN1c3RvbSBpbnB1dHMgY2Fubm90IGJlIGEgcmVmZXJlbmNlIGFueW1vcmUsIHlvdSBuZWVkIHRvIHBhc3MgdGhlIHdob2xlIGNvbXBvbmVudCBhbmQgbm90IGp1c3QgdGhlIG5hbWVcbiAqIC0gRm9ybUNvbXBvbmVudHMgY29udGV4dCBpcyBsaW1pdGVkIHRvIGRlZmF1bHQgY29tcG9uZW50LiBPdGhlciBjb21wb25lbnRzIG11c3QgYmUgcGFzc2VkIHRocm91Z2ggdGhlIHNjaGVtYSBpbnN0ZWFkXG4gKiAoaXQgbWVhbnMgeW91IGNhbid0IGV4dGVuZCB0aGUgU21hcnRGb3JtIHdpdGggbmV3IGlucHV0VHlwZSwgaW5zdGVhZCB1c2UgYSBmdWxseSBjdXN0b20gaW5wdXQpXG4gKi9cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnRUeXBlLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgU2ltcGxlU2NoZW1hIGZyb20gXCJzaW1wbC1zY2hlbWFcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSwgZ2V0TnVsbFZhbHVlIH0gZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBQb3NzaWJsZUZvcm1Db21wb25lbnRzLFxuICBQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHMsXG59IGZyb20gXCIuLi9WdWxjYW5Db21wb25lbnRzL3R5cGluZ3NcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgRm9ybUZpZWxkIH0gZnJvbSBcIi4vdHlwaW5nc1wiO1xuaW1wb3J0IHtcbiAgVnVsY2FuRmllbGRTY2hlbWEsXG4gIFZ1bGNhbkZpZWxkSW5wdXQsXG4gIFZ1bGNhbkZpZWxkVHlwZSxcbn0gZnJvbSBcIkB2dWxjYW5qcy9zY2hlbWFcIjtcbmltcG9ydCB7IGdldEF1dG9JbnB1dEZyb21UeXBlIH0gZnJvbSBcIi4vaW5wdXRzL2NvbnN0c1wiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuXG5jb25zdCBnZXRDaGFyYWN0ZXJDb3VudHMgPSAodmFsdWU6IGFueSwgbWF4OiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcmFjdGVyQ291bnQ6IG51bWJlciA9IHZhbHVlICYmIHZhbHVlLmxlbmd0aCA/IHZhbHVlLmxlbmd0aCA6IDA7XG4gIHJldHVybiB7IGNoYXJzUmVtYWluaW5nOiBtYXggLSBjaGFyYWN0ZXJDb3VudCwgY2hhcnNDb3VudDogY2hhcmFjdGVyQ291bnQgfTtcbn07XG5cbi8qKlxuICogR2V0IGZpZWxkIHBhdGgsIHRha2luZyBpbnRsSW5wdXQgZmllbGRzIGludG8gYWNjb3VudFxuICovXG5jb25zdCBnZXRQYXRoID0gKHtcbiAgaW50bElucHV0LFxuICBwYXRoLFxufToge1xuICBpbnRsSW5wdXQ/OiBib29sZWFuO1xuICBwYXRoOiBzdHJpbmc7XG59KSA9PiB7XG4gIHJldHVybiBpbnRsSW5wdXQgPyBgJHtwYXRofV9pbnRsYCA6IHBhdGg7XG59O1xuXG5jb25zdCBnZXRDaGFyYWN0ZXJDb3VudHNGcm9tUHJvcHMgPSAoe1xuICBkb2N1bWVudCxcbiAgbWF4LFxuICBpbnRsSW5wdXQsXG4gIHBhdGgsXG59OiBQaWNrPEZvcm1Db21wb25lbnRQcm9wcywgXCJkb2N1bWVudFwiIHwgXCJtYXhcIiB8IFwiaW50bElucHV0XCIgfCBcInBhdGhcIj4pID0+IHtcbiAgaWYgKCFtYXgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBmaWVsZFBhdGggPSBnZXRQYXRoKHsgaW50bElucHV0LCBwYXRoIH0pO1xuICBjb25zdCBpbnRsT3JSZWd1bGFyVmFsdWUgPSBkb2N1bWVudD8uW2ZpZWxkUGF0aF07XG4gIGNvbnN0IHZhbHVlID1cbiAgICBpbnRsT3JSZWd1bGFyVmFsdWUgJiYgdHlwZW9mIGludGxPclJlZ3VsYXJWYWx1ZSA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBpbnRsT3JSZWd1bGFyVmFsdWUudmFsdWVcbiAgICAgIDogaW50bE9yUmVndWxhclZhbHVlO1xuICByZXR1cm4gZ2V0Q2hhcmFjdGVyQ291bnRzKHZhbHVlLCBtYXgpO1xufTtcblxuLy8gVE9ETzogbW92ZSB0byBzY2hlbWEgaGVscGVyc1xuY29uc3QgaXNBcnJheUZpZWxkID0gKHR5cGU6IFZ1bGNhbkZpZWxkU2NoZW1hW1widHlwZVwiXSkgPT4ge1xuICByZXR1cm4gdHlwZSA9PT0gQXJyYXk7XG59O1xuXG4vLyBUT0RPOiBub3QgdXAgdG8gZGF0ZVxuY29uc3QgaXNPYmplY3RGaWVsZCA9ICh0eXBlOiBWdWxjYW5GaWVsZFNjaGVtYVtcInR5cGVcIl0pID0+IHtcbiAgcmV0dXJuIHR5cGUgaW5zdGFuY2VvZiBTaW1wbGVTY2hlbWE7XG59O1xuXG4vKlxuXG4gIEdldCBmb3JtIGlucHV0IHR5cGUsIGVpdGhlciBiYXNlZCBvbiBpbnB1dCBwcm9wcywgb3IgYnkgZ3Vlc3NpbmcgYmFzZWQgb24gZm9ybSBmaWVsZCB0eXBlXG5cbiAgKi9cbmNvbnN0IGdldElucHV0TmFtZSA9IChmaWVsZFR5cGU6IFZ1bGNhbkZpZWxkVHlwZSwgaW5wdXQ/OiBWdWxjYW5GaWVsZElucHV0KSA9PiB7XG4gIGlmIChpbnB1dCkgcmV0dXJuIGlucHV0O1xuICByZXR1cm4gZ2V0QXV0b0lucHV0RnJvbVR5cGUoZmllbGRUeXBlKTtcbn07XG5cbi8qXG4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIGlucHV0IHR5cGUgaXMgYSBjdXN0b21cbiAgTk9URTogaXQgYWxzbyBhY2NlcHQgbm9uLXN0YW5kYXJkIG5hbWUsIGlmIHlvdSB3YW50IHRvIGFkZCBhIG5ldyB0eXBlIG9mIElucHV0IGluIHRoZSBjb250ZXh0XG4gICovXG4vKlxuY29uc3QgaXNDdXN0b21JbnB1dCA9IChpbnB1dFR5cGU6IFZ1bGNhbkZpZWxkSW5wdXQpID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dFR5cGUgIT09IFwic3RyaW5nXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBpc1N0YW5kYXJkSW5wdXQgPSBhbGxWdWxjYW5JbnB1dHMuaW5jbHVkZXMoaW5wdXRUeXBlKTtcbiAgcmV0dXJuICFpc1N0YW5kYXJkSW5wdXQ7XG59O1xuKi9cblxuLypcblxuICBGdW5jdGlvbiBwYXNzZWQgdG8gRm9ybUNvbXBvbmVudElubmVyIHRvIGhlbHAgd2l0aCByZW5kZXJpbmcgdGhlIGNvbXBvbmVudFxuXG4gICovXG5jb25zdCBnZXRGb3JtSW5wdXQgPSAoe1xuICB0eXBlLFxuICBpbnB1dCxcbiAgRm9ybUNvbXBvbmVudHMsXG59OiB7XG4gIHR5cGU6IFZ1bGNhbkZpZWxkVHlwZTtcbiAgaW5wdXQ6IFZ1bGNhbkZpZWxkSW5wdXQ7XG4gIEZvcm1Db21wb25lbnRzOiBQb3NzaWJsZUZvcm1Db21wb25lbnRzO1xufSk6IC8vIFRPRE86IHdlIGNvdWxkIHR5cGUgdGhlIHByb3BzIGhlcmUsIGl0J3MgYW4gSW5wdXRDb21wb25lbnQgdG8gYmUgbW9yZSBwcmVjaXNlXG5Db21wb25lbnRUeXBlID0+IHtcbiAgLy8gaWYgaW5wdXQgaXMgYSBSZWFjdCBjb21wb25lbnQsIHVzZSBpdFxuICAvLyBOT1RFOiBkb2VzIGl0IHdvcmsgd2l0aCBjbGFzcyBjb21wb25lbnRzP1xuICBpZiAodHlwZW9mIGlucHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBJbnB1dENvbXBvbmVudCA9IGlucHV0O1xuICAgIHJldHVybiBJbnB1dENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbnB1dE5hbWUgPSBnZXRJbnB1dE5hbWUodHlwZSwgaW5wdXQpO1xuICAgIC8vIGVsc2UgcGljayBhIHByZWRlZmluZWQgY29tcG9uZW50XG4gICAgc3dpdGNoIChpbnB1dE5hbWUpIHtcbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50RGVmYXVsdDtcblxuICAgICAgY2FzZSBcInBhc3N3b3JkXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50UGFzc3dvcmQ7XG5cbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnROdW1iZXI7XG5cbiAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRVcmw7XG5cbiAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudEVtYWlsO1xuXG4gICAgICBjYXNlIFwidGV4dGFyZWFcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRUZXh0YXJlYTtcblxuICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50Q2hlY2tib3g7XG5cbiAgICAgIGNhc2UgXCJjaGVja2JveGdyb3VwXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cDtcblxuICAgICAgY2FzZSBcInJhZGlvZ3JvdXBcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRSYWRpb0dyb3VwO1xuXG4gICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50U2VsZWN0O1xuXG4gICAgICBjYXNlIFwic2VsZWN0bXVsdGlwbGVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRTZWxlY3RNdWx0aXBsZTtcblxuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50RGF0ZVRpbWU7XG5cbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50RGF0ZTtcblxuICAgICAgLy8gY2FzZSBcImRhdGUyXCI6XG4gICAgICAvLyAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50RGF0ZTI7XG5cbiAgICAgIGNhc2UgXCJ0aW1lXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50VGltZTtcblxuICAgICAgY2FzZSBcInN0YXRpY3RleHRcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRTdGF0aWNUZXh0O1xuXG4gICAgICBjYXNlIFwibGlrZXJ0XCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50TGlrZXJ0O1xuXG4gICAgICBjYXNlIFwiYXV0b2NvbXBsZXRlXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50QXV0b2NvbXBsZXRlO1xuXG4gICAgICBjYXNlIFwibXVsdGlhdXRvY29tcGxldGVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vVnVsY2FuSlMvdnVsY2FuLW5wbS9wdWxsLzMxIGRpc2N1c3Npb25zIGFib3V0IGN1c3RvbSBjb21wb25lbnRzIHN1cHBvcnQgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYElucHV0IG5hbWUgXCIke2lucHV0TmFtZX1cIiBpcyBub3QgYSBzdGFuZGFyZCBWdWxjYW4gZm9ybSBpbnB1dCAodHlwZTogJHt0eXBlfSwgaW5wdXQ6ICR7aW5wdXR9KWBcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbnR5cGUgT3B0aW9uczxURmllbGQgPSBhbnk+ID0gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogVEZpZWxkIH0+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db21wb25lbnRQcm9wczxURmllbGQgPSBhbnk+IGV4dGVuZHMgRm9ybUZpZWxkIHtcbiAgZG9jdW1lbnQ6IGFueTtcbiAgZGF0YXR5cGU6IFZ1bGNhbkZpZWxkVHlwZTsgLy8gVE9ETzogdHlwZSBvZiB0aGUgZmllbGQsIHJlcGxhY2UgdGhpcyBieSBhIGNsZWFuZXIgdmFsdWUgbGlrZSB3ZSBkbyBpbiBncmFwaHFsIHRvIGdldCB0aGUgZmllbGQgdHlwZVxuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBBcnJheTxhbnk+O1xuICAvKiogSGVscCB0ZXh0IGZvciB0aGUgZm9ybSAqL1xuICBoZWxwPzogc3RyaW5nO1xuICAvKiogUGF0aCBvZiB0aGUgZmllbGQgaWYgbmVzdGVkICovXG4gIHBhdGg6IHN0cmluZztcbiAgZGVmYXVsdFZhbHVlPzogVEZpZWxkO1xuICBtYXg/OiBudW1iZXI7XG4gIGxvY2FsZT86IHN0cmluZztcbiAgLyoqIElucHV0IGZvciB0aGlzIGZpZWxkICovXG4gIGlucHV0PzogVnVsY2FuRmllbGRJbnB1dCB8IHN0cmluZyB8IFJlYWN0LkNvbXBvbmVudDtcbiAgZm9ybVR5cGU6IFwibmV3XCIgfCBcImVkaXRcIjsgLy8gbmV3IG9yIGVkaXRcbiAgaW50bElucHV0PzogYm9vbGVhbjtcbiAgbmVzdGVkSW5wdXQ/OiBib29sZWFuO1xuICAvKiogR3JhcGhxbCBxdWVyeSB5b3UgY2FuIHBhc3MgdG8gZmV0Y2ggdGhlIG9wdGlvbnMgYXN5bmNocm9ub3VzbHkgKi9cbiAgcXVlcnk/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBPcHRpb25zIHwgKChmY2lQcm9wcz86IGFueSkgPT4gT3B0aW9ucyk7XG4gIHZ1bGNhbkNvbXBvbmVudHM/OiBQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHM7XG59XG4vKipcbiAqIENvbXBvbmVudCBmb3IgdGhlIGRpc3BsYXkgb2YgYW55IGZpZWxkIG9mIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50ID0gKHByb3BzOiBGb3JtQ29tcG9uZW50UHJvcHMpID0+IHtcbiAgLypcbiAgVE9ETzogcmVwbGFjZSB3aXRoIGEgdXNlTWVtb1xuICBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICAvLyBhbGxvdyBjdXN0b20gY29udHJvbHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgc2hvdWxkIHVwZGF0ZVxuICAgIGlmICh0aGlzLmlzQ3VzdG9tSW5wdXQodGhpcy5nZXRJbnB1dFR5cGUobmV4dFByb3BzKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZG9jdW1lbnQsIGRlbGV0ZWRWYWx1ZXMsIGVycm9ycyB9ID0gbmV4dFByb3BzO1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKHRoaXMucHJvcHMpO1xuXG4gICAgLy8gd2hlbiBjaGVja2luZyBmb3IgZGVsZXRlZCB2YWx1ZXMsIGJvdGggY3VycmVudCBwYXRoICgnZm9vJykgYW5kIGNoaWxkIHBhdGggKCdmb28uMC5iYXInKSBzaG91bGQgdHJpZ2dlciB1cGRhdGVzXG4gICAgY29uc3QgaW5jbHVkZXNQYXRoT3JDaGlsZHJlbiA9IChkZWxldGVkVmFsdWVzKSA9PlxuICAgICAgZGVsZXRlZFZhbHVlcy5zb21lKChkZWxldGVkUGF0aCkgPT4gZGVsZXRlZFBhdGguaW5jbHVkZXMocGF0aCkpO1xuXG4gICAgY29uc3QgdmFsdWVDaGFuZ2VkID0gIWlzRXF1YWwoXG4gICAgICBnZXQoZG9jdW1lbnQsIHBhdGgpLFxuICAgICAgZ2V0KHRoaXMucHJvcHMuZG9jdW1lbnQsIHBhdGgpXG4gICAgKTtcbiAgICBjb25zdCBlcnJvckNoYW5nZWQgPSAhaXNFcXVhbCh0aGlzLmdldEVycm9ycyhlcnJvcnMpLCB0aGlzLmdldEVycm9ycygpKTtcbiAgICBjb25zdCBkZWxldGVDaGFuZ2VkID1cbiAgICAgIGluY2x1ZGVzUGF0aE9yQ2hpbGRyZW4oZGVsZXRlZFZhbHVlcykgIT09XG4gICAgICBpbmNsdWRlc1BhdGhPckNoaWxkcmVuKHRoaXMucHJvcHMuZGVsZXRlZFZhbHVlcyk7XG4gICAgY29uc3QgY2hhcnNDaGFuZ2VkID0gbmV4dFN0YXRlLmNoYXJzUmVtYWluaW5nICE9PSB0aGlzLnN0YXRlLmNoYXJzUmVtYWluaW5nO1xuICAgIGNvbnN0IGRpc2FibGVkQ2hhbmdlZCA9IG5leHRQcm9wcy5kaXNhYmxlZCAhPT0gdGhpcy5wcm9wcy5kaXNhYmxlZDtcbiAgICBjb25zdCBoZWxwQ2hhbmdlZCA9IG5leHRQcm9wcy5oZWxwICE9PSB0aGlzLnByb3BzLmhlbHA7XG5cbiAgICBjb25zdCBzaG91bGRVcGRhdGUgPVxuICAgICAgdmFsdWVDaGFuZ2VkIHx8XG4gICAgICBlcnJvckNoYW5nZWQgfHxcbiAgICAgIGRlbGV0ZUNoYW5nZWQgfHxcbiAgICAgIGNoYXJzQ2hhbmdlZCB8fFxuICAgICAgZGlzYWJsZWRDaGFuZ2VkIHx8XG4gICAgICBoZWxwQ2hhbmdlZDtcblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH0qL1xuXG4gIGNvbnN0IHtcbiAgICBsb2NhbGUsXG4gICAgbWF4LFxuICAgIHBhdGgsXG4gICAgLy90eXBlLFxuICAgIGRhdGF0eXBlLFxuICAgIGlucHV0LFxuICAgIGludGxJbnB1dCxcbiAgICBuZXN0ZWRJbnB1dCxcbiAgICBxdWVyeSxcbiAgICBvcHRpb25zLFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgdXBkYXRlQ3VycmVudFZhbHVlcywgZGVsZXRlZFZhbHVlcywgY2xlYXJGaWVsZEVycm9ycyB9ID1cbiAgICB1c2VGb3JtQ29udGV4dCgpO1xuXG4gIGNvbnN0IHR5cGUgPSBkYXRhdHlwZTtcbiAgY29uc3QgY291bnRGcm9tUHJvcHMgPSBnZXRDaGFyYWN0ZXJDb3VudHNGcm9tUHJvcHMocHJvcHMpO1xuICAvLyBlcXVpdmFsZW50IHRvIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1xuICBjb25zdCBbY2hhcnNDb3VudFN0YXRlLCBzZXRDaGFyYWN0ZXJDb3VudHNdID1cbiAgICB1c2VTdGF0ZTx7XG4gICAgICBjaGFyc0NvdW50OiBudW1iZXI7XG4gICAgICBjaGFyc1JlbWFpbmluZzogbnVtYmVyO1xuICAgIH0gfCBudWxsPihjb3VudEZyb21Qcm9wcyk7XG5cbiAgLy8gVE9ETzogbW92ZSB0aGlzIGxvZ2ljIHNvbWV3aGVyZSBlbHNlLCBhcyBpdCBpcyBzcGVjaWZpYyB0byBTdHJpbmcgY29tcG9uZW50cy5cbiAgLy8gRWcgdXNpbmcgYW4gaW50ZXJtZWRpYXRlIEZvcm1Db21wb25lbnRUZXh0XG4gIC8qXG4gIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIGNoYXJzQ291bnQgYW5kIGNoYXJzUmVtYWluaW5nIGFzIHRoZSB1c2VycyB0eXBlc1xuICAqL1xuICBjb25zdCB1cGRhdGVDaGFyYWN0ZXJDb3VudCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghbWF4KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCB1cGRhdGUgY2hhcmFjdGVyIGNvdW50IHdoZW4gbm8gbWF4IHZhbHVlIGlzIHNldC5cIlxuICAgICAgKTtcbiAgICBzZXRDaGFyYWN0ZXJDb3VudHMoZ2V0Q2hhcmFjdGVyQ291bnRzKHZhbHVlLCBtYXgpKTtcbiAgfTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY291bnRGcm9tUHJvcHMpIHtcbiAgICAgIHNldENoYXJhY3RlckNvdW50cyhjb3VudEZyb21Qcm9wcyk7XG4gICAgfVxuICB9LCBbY291bnRGcm9tUHJvcHM/LmNoYXJzQ291bnQsIGNvdW50RnJvbVByb3BzPy5jaGFyc1JlbWFpbmluZ10pO1xuICAvKlxuXG4gIFdoZXRoZXIgdG8ga2VlcCB0cmFjayBvZiBhbmQgc2hvdyByZW1haW5pbmcgY2hhcnNcblxuICAqL1xuICBsZXQgc2hvd0NoYXJzUmVtYWluaW5nID0gZmFsc2U7XG4gIGxldCBpbnB1dE5hbWUgPSBudWxsO1xuICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgaW5wdXROYW1lID0gZ2V0SW5wdXROYW1lKHR5cGUsIGlucHV0KTtcbiAgICBzaG93Q2hhcnNSZW1haW5pbmcgPSAhIShcbiAgICAgIHR5cGVvZiBtYXggIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgIGlucHV0TmFtZSAmJlxuICAgICAgW1widXJsXCIsIFwiZW1haWxcIiwgXCJ0ZXh0YXJlYVwiLCBcInRleHRcIl0uaW5jbHVkZXMoaW5wdXROYW1lKVxuICAgICk7XG4gIH1cbiAgLy8gY29uc3QgaW5wdXRUeXBlID0gaW5wdXROYW1lOyAvLyBUT0RPOiByZW5hbWUgaW5wdXRUeXBlIGluIHRoZSBjb3JyZXNwb25kaW5nIGNoaWxkIGNvbXBvbmVudHNcblxuICAvKlxuICBGdW5jdGlvbiBwYXNzZWQgdG8gZm9ybSBjb250cm9scyAoYWx3YXlzIGNvbnRyb2xsZWQpIHRvIHVwZGF0ZSB0aGVpciB2YWx1ZVxuICAoTm90ZTogd2UgY291bGQgdXNlIHRoZSBjb250ZXh0IGluc3RlYWQ/KVxuICAqL1xuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAodmFsdWUpID0+IHtcbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcsIGRlbGV0ZSB0aGUgZmllbGRcbiAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgLy8gaWYgdGhpcyBpcyBhIG51bWJlciBmaWVsZCwgY29udmVydCB2YWx1ZSBiZWZvcmUgc2VuZGluZyBpdCB1cCB0byBGb3JtXG4gICAgaWYgKHR5cGUgPT09IE51bWJlciAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBTaW1wbGVTY2hlbWEuSW50ZWdlciAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgIT09IGdldFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZVZhbHVlID0gbG9jYWxlID8geyBsb2NhbGU6IGxvY2FsZSwgdmFsdWUgfSA6IHZhbHVlO1xuICAgICAgdXBkYXRlQ3VycmVudFZhbHVlcyh7IFtnZXRQYXRoKHByb3BzKV06IHVwZGF0ZVZhbHVlIH0pO1xuICAgICAgY2xlYXJGaWVsZEVycm9ycyhnZXRQYXRoKHByb3BzKSk7XG4gICAgfVxuXG4gICAgLy8gZm9yIHRleHQgZmllbGRzLCB1cGRhdGUgY2hhcmFjdGVyIGNvdW50IG9uIGNoYW5nZVxuICAgIGlmIChzaG93Q2hhcnNSZW1haW5pbmcpIHtcbiAgICAgIHVwZGF0ZUNoYXJhY3RlckNvdW50KHZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgLypcbiAgR2V0IHZhbHVlIGZyb20gRm9ybSBzdGF0ZSB0aHJvdWdoIGRvY3VtZW50IGFuZCBjdXJyZW50VmFsdWVzIHByb3BzXG4gICAgLy8gVE9ETzogZ2V0IGRvY3VtZW50IGZyb20gY29udGV4dFxuICAqL1xuICBjb25zdCBnZXRWYWx1ZSA9ICgpID0+IHtcbiAgICAvL2NvbnN0IGMgPSBjb250ZXh0IHx8IHRoaXMuY29udGV4dDtcbiAgICBjb25zdCB7IGxvY2FsZSwgZGVmYXVsdFZhbHVlLCBmb3JtVHlwZSwgZGF0YXR5cGUgfSA9IHByb3BzO1xuICAgIGNvbnN0IHBhdGggPSBsb2NhbGUgPyBgJHtnZXRQYXRoKHByb3BzKX0udmFsdWVgIDogZ2V0UGF0aChwcm9wcyk7XG4gICAgY29uc3QgY3VycmVudERvY3VtZW50ID0gcHJvcHMuZG9jdW1lbnQ7XG4gICAgbGV0IHZhbHVlID0gZ2V0KGN1cnJlbnREb2N1bWVudCwgcGF0aCk7XG4gICAgLy8gbm90ZTogZm9yY2UgaW50bCBmaWVsZHMgdG8gYmUgdHJlYXRlZCBsaWtlIHN0cmluZ3NcbiAgICBjb25zdCBudWxsVmFsdWUgPSBsb2NhbGUgPyBcIlwiIDogZ2V0TnVsbFZhbHVlKGRhdGF0eXBlKTtcblxuICAgIC8vIGhhbmRsZSBkZWxldGVkICYgZW1wdHkgdmFsdWVcbiAgICBpZiAoZGVsZXRlZFZhbHVlcy5pbmNsdWRlcyhwYXRoKSkge1xuICAgICAgdmFsdWUgPSBudWxsVmFsdWU7XG4gICAgfSBlbHNlIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpKSB7XG4gICAgICAvLyByZXBsYWNlIGVtcHR5IHZhbHVlIGJ5IHRoZSBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIHNjaGVtYSBpZiBpdCBleGlzdHMg4oCTIGZvciBuZXcgZm9ybXMgb25seVxuICAgICAgdmFsdWUgPSBmb3JtVHlwZSA9PT0gXCJuZXdcIiAmJiBkZWZhdWx0VmFsdWUgPyBkZWZhdWx0VmFsdWUgOiBudWxsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICAvKlxuXG4gIEdldCBlcnJvcnMgZnJvbSBGb3JtIHN0YXRlIHRocm91Z2ggY29udGV4dFxuXG4gIE5vdGU6IHdlIHVzZSBgaW5jbHVkZXNgIHRvIGdldCBhbGwgZXJyb3JzIGZyb20gbmVzdGVkIGNvbXBvbmVudHMsIHdoaWNoIGhhdmUgbG9uZ2VyIHBhdGhzXG5cbiAgKi9cbiAgY29uc3QgZ2V0RXJyb3JzID0gKGVycm9ycz86IEFycmF5PGFueT4pID0+IHtcbiAgICBlcnJvcnMgPSBlcnJvcnMgfHwgcHJvcHMuZXJyb3JzIHx8IFtdO1xuICAgIGNvbnN0IGZpZWxkRXJyb3JzID0gZXJyb3JzLmZpbHRlcihcbiAgICAgIChlcnJvcikgPT4gZXJyb3IucGF0aCAmJiBlcnJvci5wYXRoLmluY2x1ZGVzKHBhdGgpXG4gICAgKTtcbiAgICByZXR1cm4gZmllbGRFcnJvcnM7XG4gIH07XG5cbiAgLypcblxuICBGdW5jdGlvbiBwYXNzZWQgdG8gZm9ybSBjb250cm9scyB0byBjbGVhciB0aGVpciBjb250ZW50cyAoc2V0IHRoZWlyIHZhbHVlIHRvIG51bGwpXG5cbiAgKi9cbiAgY29uc3QgY2xlYXJGaWVsZCA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdXBkYXRlQ3VycmVudFZhbHVlcyh7IFtwYXRoXTogbnVsbCB9KTtcbiAgICBpZiAoc2hvd0NoYXJzUmVtYWluaW5nKSB7XG4gICAgICB1cGRhdGVDaGFyYWN0ZXJDb3VudChudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgRm9ybUNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG5cbiAgaWYgKGludGxJbnB1dCkge1xuICAgIHJldHVybiA8Rm9ybUNvbXBvbmVudHMuRm9ybUludGwgey4uLnByb3BzfSAvPjtcbiAgfSBlbHNlIGlmICghaW5wdXQgJiYgbmVzdGVkSW5wdXQpIHtcbiAgICBpZiAoaXNBcnJheUZpZWxkKHR5cGUpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZEFycmF5XG4gICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgIGZvcm1Db21wb25lbnRzPXtGb3JtQ29tcG9uZW50c31cbiAgICAgICAgICBlcnJvcnM9e2dldEVycm9ycygpfVxuICAgICAgICAgIHZhbHVlPXtnZXRWYWx1ZSgpfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0RmllbGQodHlwZSkpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkT2JqZWN0XG4gICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgIGZvcm1Db21wb25lbnRzPXtGb3JtQ29tcG9uZW50c31cbiAgICAgICAgICBlcnJvcnM9e2dldEVycm9ycygpfVxuICAgICAgICAgIHZhbHVlPXtnZXRWYWx1ZSgpfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBmY2lQcm9wcyA9IHtcbiAgICAuLi5wcm9wcyxcbiAgICAuLi4oY2hhcnNDb3VudFN0YXRlIHx8IHt9KSxcbiAgICBpbnB1dFR5cGU6IGdldElucHV0TmFtZSh0eXBlLCBpbnB1dCksXG4gICAgdmFsdWU6IGdldFZhbHVlKCksXG4gICAgZXJyb3JzOiBnZXRFcnJvcnMoKSxcbiAgICBzaG93Q2hhcnNSZW1haW5pbmc6ICEhc2hvd0NoYXJzUmVtYWluaW5nLFxuICAgIGhhbmRsZUNoYW5nZTogaGFuZGxlQ2hhbmdlLFxuICAgIGNsZWFyRmllbGQ6IGNsZWFyRmllbGQsXG4gICAgZm9ybUlucHV0OiBnZXRGb3JtSW5wdXQoeyBGb3JtQ29tcG9uZW50cywgaW5wdXQsIHR5cGUgfSksXG4gIH07XG5cbiAgLy8gaWYgdGhlcmUgaXMgbm8gcXVlcnksIGhhbmRsZSBvcHRpb25zIGhlcmU7IG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgaGFuZGxlZCBieVxuICAvLyB0aGUgRm9ybUNvbXBvbmVudExvYWRlciBjb21wb25lbnRcbiAgaWYgKCFxdWVyeSAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZmNpUHJvcHMub3B0aW9ucyA9IG9wdGlvbnMoZmNpUHJvcHMpO1xuICB9XG5cbiAgY29uc3QgZmNpID0gPEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRJbm5lciB7Li4uZmNpUHJvcHN9IC8+O1xuXG4gIHJldHVybiBxdWVyeSA/IChcbiAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudExvYWRlciB7Li4uZmNpUHJvcHN9PlxuICAgICAge2ZjaX1cbiAgICA8L0Zvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRMb2FkZXI+XG4gICkgOiAoXG4gICAgZmNpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybUNvbXBvbmVudHNEZXBlbmRlbmNpZXMgPSBbXG4gIFwiRm9ybUNvbXBvbmVudERlZmF1bHRcIixcbiAgXCJGb3JtQ29tcG9uZW50UGFzc3dvcmRcIixcbiAgXCJGb3JtQ29tcG9uZW50TnVtYmVyXCIsXG4gIFwiRm9ybUNvbXBvbmVudFVybFwiLFxuICBcIkZvcm1Db21wb25lbnRFbWFpbFwiLFxuICBcIkZvcm1Db21wb25lbnRUZXh0YXJlYVwiLFxuICBcIkZvcm1Db21wb25lbnRDaGVja2JveFwiLFxuICBcIkZvcm1Db21wb25lbnRDaGVja2JveEdyb3VwXCIsXG4gIFwiRm9ybUNvbXBvbmVudFJhZGlvR3JvdXBcIixcbiAgXCJGb3JtQ29tcG9uZW50U2VsZWN0XCIsXG4gIFwiRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlXCIsXG4gIFwiRm9ybUNvbXBvbmVudERhdGVUaW1lXCIsXG4gIFwiRm9ybUNvbXBvbmVudERhdGVcIixcbiAgXCJGb3JtQ29tcG9uZW50RGF0ZTJcIixcbiAgXCJGb3JtQ29tcG9uZW50VGltZVwiLFxuICBcIkZvcm1Db21wb25lbnRTdGF0aWNUZXh0XCIsXG4gIFwiRm9ybUNvbXBvbmVudExpa2VydFwiLFxuICBcIkZvcm1Db21wb25lbnRBdXRvY29tcGxldGVcIixcbiAgXCJGb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGVcIixcbl07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1Db21wb25lbnQ7XG4iLCJpbXBvcnQgUmVhY3QsIHsgTW91c2VFdmVudEhhbmRsZXIgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUludGxDb250ZXh0IH0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5pbXBvcnQgeyB3aGl0ZWxpc3RJbnB1dFByb3BzIH0gZnJvbSBcIi4vdWlfdXRpbHNcIjtcbmltcG9ydCB7IEZvcm1Db21wb25lbnRQcm9wcyB9IGZyb20gXCIuL0Zvcm1Db21wb25lbnRcIjtcbi8qXG5pbXBvcnQge1xuICBpbnN0YW50aWF0ZUNvbXBvbmVudCxcbiAgd2hpdGVsaXN0SW5wdXRQcm9wcyxcbn0gZnJvbSBcIm1ldGVvci92dWxjYW46Y29yZVwiO1xuKi9cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5pbXBvcnQgeyBWdWxjYW5Db3JlSW5wdXQgfSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHsgUG9zc2libGVWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvdHlwaW5nc1wiO1xuaW1wb3J0IHsgY2xlYXJhYmxlSW5wdXRzIH0gZnJvbSBcIi4vaW5wdXRzL2NvbnN0c1wiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbXBvbmVudElubmVyUHJvcHMgZXh0ZW5kcyBGb3JtQ29tcG9uZW50UHJvcHMge1xuICBpbnB1dFR5cGU6IFZ1bGNhbkNvcmVJbnB1dDtcbiAgLy9kaXNhYmxlZD86IGJvb2xlYW47XG4gIC8vIGhlbHA/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBjbGlja2luZyBvbiB0aGUgXCJjbGVhciBpbnB1dFwiIGJ1dHRvblxuICAgKi9cbiAgY2xlYXJGaWVsZD86IE1vdXNlRXZlbnRIYW5kbGVyPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgLyoqXG4gICAqIFRPRE86IG5vdCBzdXJlIGlmIGl0IHNob3VsZCBiZSBtYW5kYXRvcnkgb3Igbm90IChlZyBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHM/KVxuICAgKi9cbiAgaGFuZGxlQ2hhbmdlPzogRnVuY3Rpb247XG4gIGl0ZW1Qcm9wZXJ0aWVzPzogYW55O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbG9hZGluZz86IGJvb2xlYW47XG4gIHN1Ym1pdEZvcm06IGFueTtcbiAgZm9ybUNvbXBvbmVudHM6IFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cztcbiAgaW50bEtleXM/OiBhbnk7XG4gIGlucHV0Q2xhc3NOYW1lOiBhbnk7XG4gIG5hbWU6IGFueTtcbiAgaW5wdXQ6IGFueTtcbiAgYmVmb3JlQ29tcG9uZW50OiBhbnk7XG4gIGFmdGVyQ29tcG9uZW50OiBhbnk7XG4gIGVycm9yczogYW55O1xuICBzaG93Q2hhcnNSZW1haW5pbmc6IGFueTtcbiAgY2hhcnNSZW1haW5pbmc6IGFueTtcbiAgcmVuZGVyQ29tcG9uZW50OiBhbnk7XG4gIGZvcm1JbnB1dDogYW55O1xufVxuXG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudElubmVyID0gKHByb3BzOiBGb3JtQ29tcG9uZW50SW5uZXJQcm9wcykgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bENvbnRleHQoKTtcbiAgY29uc3QgeyBpbnB1dFR5cGUsIGRpc2FibGVkLCBjbGVhckZpZWxkIH0gPSBwcm9wcztcblxuICBjb25zdCByZW5kZXJDbGVhciA9ICgpID0+IHtcbiAgICBpZiAoY2xlYXJhYmxlSW5wdXRzLmluY2x1ZGVzKGlucHV0VHlwZSkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAvKlxuICAgICAgRnJvbSBib290c3RyYXA6XG4gICAgICAgIDxDb21wb25lbnRzLlRvb2x0aXBUcmlnZ2VyXG4gICAgICAgICAgdHJpZ2dlcj17XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29tcG9uZW50LWNsZWFyXCJcbiAgICAgICAgICAgICAgdGl0bGU9e3RoaXMuY29udGV4dC5pbnRsLmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBcImZvcm1zLmNsZWFyX2ZpZWxkXCIsXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLmNsZWFyRmllbGR9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuPuKclTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPlxuICAgICAgICAgIDxDb21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2UgaWQ9XCJmb3Jtcy5jbGVhcl9maWVsZFwiIC8+XG4gICAgICAgIDwvQ29tcG9uZW50cy5Ub29sdGlwVHJpZ2dlcj5cbiAgICAgICAgKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLWNvbXBvbmVudC1jbGVhclwiXG4gICAgICAgICAgdGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICBpZDogXCJmb3Jtcy5jbGVhcl9maWVsZFwiLFxuICAgICAgICAgIH0pfVxuICAgICAgICAgIG9uQ2xpY2s9e2NsZWFyRmllbGR9XG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj7inJU8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0UHJvcGVydGllcyA9ICgpOiBGb3JtSW5wdXRQcm9wcyA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgaGFuZGxlQ2hhbmdlLFxuICAgICAgaW5wdXRUeXBlLFxuICAgICAgaXRlbVByb3BlcnRpZXMsXG4gICAgICBoZWxwLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBsb2FkaW5nLFxuICAgICAgc3VibWl0Rm9ybSxcbiAgICAgIGZvcm1Db21wb25lbnRzLFxuICAgICAgaW50bEtleXMsXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGlucHV0UHJvcGVydGllczoge1xuICAgICAgICAuLi53aGl0ZWxpc3RJbnB1dFByb3BzKHByb3BzKSxcbiAgICAgICAgb25DaGFuZ2U6IChldmVudCkgPT4ge1xuICAgICAgICAgIC8vIEZvcm1Db21wb25lbnQncyBoYW5kbGVDaGFuZ2UgZXhwZWN0cyB2YWx1ZSBhcyBhcmd1bWVudDsgbG9vayBpbiB0YXJnZXQuY2hlY2tlZCBvciB0YXJnZXQudmFsdWVcbiAgICAgICAgICBjb25zdCBpbnB1dFZhbHVlID1cbiAgICAgICAgICAgIGlucHV0VHlwZSA9PT0gXCJjaGVja2JveFwiXG4gICAgICAgICAgICAgID8gLy8gVE9ETzogbm90IHN1cmUgd2h5IHdlIG5lZWQgYW4gaWdub3JlIHRoZXJlXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC5jaGVja2VkXG4gICAgICAgICAgICAgIDogLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgICBpZiAoaGFuZGxlQ2hhbmdlKSB7XG4gICAgICAgICAgICBoYW5kbGVDaGFuZ2UoaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKlxuICAgICAgICBUT0RPOiBjaGVjayBpZiB0aGlzIGNyZWF0ZXMgcmVncmVzc2lvblxuICAgICAgICBvbktleVByZXNzOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgJiYgaW5wdXRUeXBlICE9PSBcInRleHRhcmVhXCIpIHtcbiAgICAgICAgICAgIHN1Ym1pdEZvcm0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICovXG4gICAgICB9LFxuXG4gICAgICBpdGVtUHJvcGVydGllczoge1xuICAgICAgICAuLi5pdGVtUHJvcGVydGllcyxcbiAgICAgICAgaW50bEtleXMsXG4gICAgICAgIENvbXBvbmVudHM6IGZvcm1Db21wb25lbnRzLFxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfHwgaGVscCxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gcHJvcGVydGllcztcbiAgfTtcblxuICBjb25zdCB7XG4gICAgaW5wdXRDbGFzc05hbWUsXG4gICAgbmFtZSxcbiAgICBpbnB1dCxcbiAgICAvL2lucHV0VHlwZSxcbiAgICBiZWZvcmVDb21wb25lbnQsXG4gICAgYWZ0ZXJDb21wb25lbnQsXG4gICAgZXJyb3JzLFxuICAgIHNob3dDaGFyc1JlbWFpbmluZyxcbiAgICBjaGFyc1JlbWFpbmluZyxcbiAgICByZW5kZXJDb21wb25lbnQsXG4gICAgZm9ybUlucHV0LFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgRm9ybUNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIC8vY29uc3QgRm9ybUNvbXBvbmVudHMgPSBmb3JtQ29tcG9uZW50cztcblxuICBjb25zdCBoYXNFcnJvcnMgPSBlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aDtcblxuICBjb25zdCBpbnB1dE5hbWUgPSB0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIiA/IGlucHV0Lm5hbWUgOiBpbnB1dFR5cGU7XG4gIGNvbnN0IGlucHV0Q2xhc3MgPSBjbGFzc05hbWVzKFxuICAgIFwiZm9ybS1pbnB1dFwiLFxuICAgIGlucHV0Q2xhc3NOYW1lLFxuICAgIGBpbnB1dC0ke25hbWV9YCxcbiAgICBgZm9ybS1jb21wb25lbnQtJHtpbnB1dE5hbWUgfHwgXCJkZWZhdWx0XCJ9YCxcbiAgICB7XG4gICAgICBcImlucHV0LWVycm9yXCI6IGhhc0Vycm9ycyxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKCk7XG5cbiAgY29uc3QgRm9ybUlucHV0ID0gZm9ybUlucHV0O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2lucHV0Q2xhc3N9PlxuICAgICAgey8qaW5zdGFudGlhdGVDb21wb25lbnQoYmVmb3JlQ29tcG9uZW50LCBwcm9wZXJ0aWVzKSovfVxuICAgICAgPEZvcm1JbnB1dCB7Li4ucHJvcGVydGllc30gLz5cbiAgICAgIHtoYXNFcnJvcnMgPyA8Rm9ybUNvbXBvbmVudHMuRmllbGRFcnJvcnMgZXJyb3JzPXtlcnJvcnN9IC8+IDogbnVsbH1cbiAgICAgIHtyZW5kZXJDbGVhcigpfVxuICAgICAge3Nob3dDaGFyc1JlbWFpbmluZyAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXCJmb3JtLWNvbnRyb2wtbGltaXRcIiwge1xuICAgICAgICAgICAgZGFuZ2VyOiBjaGFyc1JlbWFpbmluZyA8IDEwLFxuICAgICAgICAgIH0pfVxuICAgICAgICA+XG4gICAgICAgICAge2NoYXJzUmVtYWluaW5nfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICB7LyppbnN0YW50aWF0ZUNvbXBvbmVudChhZnRlckNvbXBvbmVudCwgcHJvcGVydGllcykqL31cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUlucHV0UHJvcHMgZXh0ZW5kcyBGb3JtQ29tcG9uZW50SW5uZXJQcm9wcyB7XG4gIC8vIFRPRE86IG5vdGUgc3VyZSBhYm91dCB0aGlzLCB0aGVyZSBhbHNvIHNlZW1zIHRvIGJlIGxhYmVsIGFuZCBvdGhlciBwcm9wcyB0aGF0IGFyZSBub3QgSFRNTElucHV0IHByb3BzIHBlciBzZVxuICAvLyBJdCBtYXkgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIGlucHV0IGFzIHdlbGwsIG1heWJlIHRoZSB0eXBlIGlzIG1vcmUgYW4gdW5pb25cbiAgaW5wdXRQcm9wZXJ0aWVzOiBSZWFjdC5IVE1MUHJvcHM8SFRNTElucHV0RWxlbWVudD47XG4gIGl0ZW1Qcm9wZXJ0aWVzOiBhbnk7IC8vIFRPRE9cbn1cbiIsImltcG9ydCBwaWNrIGZyb20gXCJsb2Rhc2gvcGlja1wiO1xuXG4vKipcbiAqIEV4dHJhY3QgaW5wdXQgcHJvcHMgZm9yIHRoZSBGb3JtQ29tcG9uZW50SW5uZXJcbiAqIEBwYXJhbSB7Kn0gcHJvcHMgQWxsIGNvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgSW5pdGlhbCBwcm9wcyArIHByb3BzIHNwZWNpZmljIHRvIHRoZSBIVE1MIGlucHV0IGluIGFuIGlucHV0UHJvcGVydGllcyBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEh0bWxJbnB1dFByb3BzID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgbmFtZSwgcGF0aCwgb3B0aW9ucywgbGFiZWwsIG9uQ2hhbmdlLCBvbkJsdXIsIHZhbHVlLCBkaXNhYmxlZCB9ID1cbiAgICBwcm9wcztcblxuICAvLyB0aGVzZSBwcm9wZXJ0aWVzIGFyZSB3aGl0ZWxpc3RlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHNhZmVseSBwYXNzZWQgdG8gdGhlIGFjdHVhbCBmb3JtIGlucHV0XG4gIC8vIGFuZCBhdm9pZCBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC93YXJuaW5ncy91bmtub3duLXByb3AuaHRtbCB3YXJuaW5nc1xuICBjb25zdCBpbnB1dFByb3BlcnRpZXMgPSB7XG4gICAgLi4ucHJvcHMuaW5wdXRQcm9wZXJ0aWVzLFxuICAgIG5hbWUsXG4gICAgcGF0aCxcbiAgICBvcHRpb25zLFxuICAgIGxhYmVsLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uQmx1cixcbiAgICB2YWx1ZSxcbiAgICBkaXNhYmxlZCxcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnByb3BzLFxuICAgIGlucHV0UHJvcGVydGllcyxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdCBpbnB1dCBwcm9wcyBmb3IgdGhlIEZvcm1Db21wb25lbnRJbm5lclxuICogQHBhcmFtIHsqfSBwcm9wcyBBbGwgY29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBJbml0aWFsIHByb3BzICsgcHJvcHMgc3BlY2lmaWMgdG8gdGhlIEhUTUwgaW5wdXQgaW4gYW4gaW5wdXRQcm9wZXJ0aWVzIG9iamVjdFxuICovXG5leHBvcnQgY29uc3Qgd2hpdGVsaXN0SW5wdXRQcm9wcyA9IChcbiAgcHJvcHM6IGFueVxuKTogUmVhY3QuSFRNTFByb3BzPEhUTUxJbnB1dEVsZW1lbnQ+ID0+IHtcbiAgY29uc3Qgd2hpdGVsaXN0ID0gW1xuICAgIFwibmFtZVwiLFxuICAgIFwicGF0aFwiLFxuICAgIFwib3B0aW9uc1wiLFxuICAgIFwibGFiZWxcIixcbiAgICBcIm9uQ2hhbmdlXCIsXG4gICAgXCJvbkJsdXJcIixcbiAgICBcInZhbHVlXCIsXG4gICAgXCJkaXNhYmxlZFwiLFxuICAgIFwicGxhY2Vob2xkZXJcIixcbiAgXTtcbiAgcmV0dXJuIHBpY2socHJvcHMsIHdoaXRlbGlzdCk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTsiLCIvKipcbiAqIENoYW5nZXMgZnJvbSBWdWxjYW4gTWV0ZW9yOlxuICogLSBxdWVyeSBpcyBub3QgZXhwYW5kZWQ6IHlvdSBuZWVkIHRvIHBhc3MgdGhlIGZ1bGwgcXVlcnkgd2l0aCBmcmFnbWVudHMgYWxyZWFkeVxuICovXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG4vL8KgQHNlZSBwYWNrYWdlcy92dWxjYW4tbGliL2xpYi9tb2R1bGVzL2ZyYWdtZW50cy5qcyBpbiBWdWxjYW5cbi8vIHNob3VsZCB3ZSByZWVuYWJsZSB0aGlzP1xuLy8gaW1wb3J0IHsgZXhwYW5kUXVlcnlGcmFnbWVudHMgfSBmcm9tIFwibWV0ZW9yL3Z1bGNhbjpjb3JlXCI7XG5pbXBvcnQgeyB1c2VMYXp5UXVlcnksIGdxbCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29tcG9uZW50TG9hZGVyUHJvcHMge1xuICBxdWVyeTogc3RyaW5nIHwgKCh7IHZhbHVlOiBhbnkgfSkgPT4gc3RyaW5nKTtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgb3B0aW9uczogYW55O1xuICB2YWx1ZTogYW55O1xuICAvKiogUnVuIHRoZSBxdWVyeSBvbmx5IHdoZW4gdmFsdWUgaXMgbm90IGVtcHR5ICovXG4gIHF1ZXJ5V2FpdHNGb3JWYWx1ZT86IGJvb2xlYW47XG59XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudExvYWRlciA9IChwcm9wczogRm9ybUNvbXBvbmVudExvYWRlclByb3BzKSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IHsgcXVlcnksIGNoaWxkcmVuLCBvcHRpb25zLCB2YWx1ZSwgcXVlcnlXYWl0c0ZvclZhbHVlIH0gPSBwcm9wcztcblxuICAvLyBpZiBxdWVyeSBpcyBhIGZ1bmN0aW9uLCBleGVjdXRlIGl0XG4gIGNvbnN0IHF1ZXJ5VGV4dCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJmdW5jdGlvblwiID8gcXVlcnkoeyB2YWx1ZSB9KSA6IHF1ZXJ5O1xuXG4gIGNvbnN0IFtsb2FkRmllbGRRdWVyeSwgeyBsb2FkaW5nLCBlcnJvciwgZGF0YSB9XSA9IHVzZUxhenlRdWVyeShcbiAgICBncWwocXVlcnlUZXh0KVxuICAgIC8vIGdxbChleHBhbmRRdWVyeUZyYWdtZW50cyhxdWVyeVRleHQpKVxuICApO1xuXG4gIGNvbnN0IHZhbHVlSXNFbXB0eSA9XG4gICAgaXNFbXB0eSh2YWx1ZSkgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkgPT09IDA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocXVlcnlXYWl0c0ZvclZhbHVlICYmIHZhbHVlSXNFbXB0eSkge1xuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBydW4gdGhpcyBxdWVyeSB1bnRpbCB3ZSBoYXZlIGEgdmFsdWUgdG8gcGFzcyB0byBpdFxuICAgICAgLy8gc28gZG8gbm90aGluZ1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkRmllbGRRdWVyeSh7XG4gICAgICAgIHZhcmlhYmxlczogeyB2YWx1ZSB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbdmFsdWVJc0VtcHR5LCB2YWx1ZSwgcXVlcnlXYWl0c0ZvclZhbHVlXSk7XG5cbiAgaWYgKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWNvbXBvbmVudC1sb2FkZXJcIj5cbiAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuTG9hZGluZyAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIC8vIHBhc3MgbmV3bHkgbG9hZGVkIGRhdGEgKGFuZCBvcHRpb25zIGlmIG5lZWRlZCkgdG8gY2hpbGQgY29tcG9uZW50XG4gIGNvbnN0IGV4dHJhUHJvcHM6IHtcbiAgICBkYXRhOiBhbnk7XG4gICAgcXVlcnlEYXRhOiBhbnk7XG4gICAgcXVlcnlFcnJvcjogYW55O1xuICAgIGxvYWRpbmc6IGJvb2xlYW47XG4gICAgb3B0aW9uc0Z1bmN0aW9uPzogRnVuY3Rpb247XG4gICAgb3B0aW9ucz86IEFycmF5PGFueT47XG4gIH0gPSB7IGRhdGEsIHF1ZXJ5RGF0YTogZGF0YSwgcXVlcnlFcnJvcjogZXJyb3IsIGxvYWRpbmcgfTtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBleHRyYVByb3BzLm9wdGlvbnNGdW5jdGlvbiA9IG9wdGlvbnM7XG4gICAgZXh0cmFQcm9wcy5vcHRpb25zID0gb3B0aW9ucy5jYWxsKHt9LCB7IC4uLnByb3BzLCBkYXRhIH0pO1xuICB9XG4gIGlmICghUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJDaGlsZHJlbiBvZiBGb3JtQ29tcG9uZW50TG9hZGVyIG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBnb3QgXCIgKyBjaGlsZHJlblxuICAgICk7XG4gIH1cbiAgY29uc3QgZmNpID0gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBleHRyYVByb3BzKTtcblxuICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJmb3JtLWNvbXBvbmVudC1sb2FkZXJcIj57ZmNpfTwvZGl2Pjtcbn07XG5cbkZvcm1Db21wb25lbnRMb2FkZXIucHJvcFR5cGVzID0ge307XG4iLCJpbXBvcnQgUmVhY3QsIHsgSFRNTEF0dHJpYnV0ZXMsIFByb3BzV2l0aENoaWxkcmVuIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIEZvcm1FbGVtZW50UHJvcHMgPSBIVE1MQXR0cmlidXRlczxIVE1MRm9ybUVsZW1lbnQ+O1xuLyoqXG4gKiBUaGUgYWN0dWFsIHdyYXBwZXIgb2YgdGhlIGZvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IEZvcm1FbGVtZW50ID0gUmVhY3QuZm9yd2FyZFJlZjxIVE1MRm9ybUVsZW1lbnQ+KFxuICAoeyBjaGlsZHJlbiwgLi4ub3RoZXJQcm9wcyB9OiBQcm9wc1dpdGhDaGlsZHJlbjxGb3JtRWxlbWVudFByb3BzPiwgcmVmKSA9PiB7XG4gICAgY29uc3QgeyBzdWJtaXRGb3JtIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIHJldHVybiAoXG4gICAgICA8Zm9ybVxuICAgICAgICB7Li4ub3RoZXJQcm9wc31cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBvblN1Ym1pdD17c3VibWl0Rm9ybX1cbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvZm9ybT5cbiAgICApO1xuICB9XG4pO1xuIiwiaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgX3NvbWUgZnJvbSBcImxvZGFzaC9zb21lXCI7XG5pbXBvcnQgeyBWdWxjYW5Vc2VyLCBpc0FkbWluIH0gZnJvbSBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgRmllbGRHcm91cCB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBGb3JtRmllbGQgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR3JvdXBQcm9wcyB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZ3JvdXA6IEZpZWxkR3JvdXAgLyp7XG4gICAgYWRtaW5zT25seT86IGJvb2xlYW47XG4gICAgYmVmb3JlQ29tcG9uZW50PzogYW55O1xuICB9OyovO1xuICBmaWVsZHM6IEFycmF5PEZvcm1GaWVsZD47XG4gIGhpZGRlbj86IGJvb2xlYW4gfCBGdW5jdGlvbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBkb2N1bWVudDogYW55O1xuICBjdXJyZW50VXNlcj86IFZ1bGNhblVzZXI7XG4gIGl0ZW1Qcm9wZXJ0aWVzOiBhbnk7XG4gIGZvcm1UeXBlOiBhbnk7XG4gIHByZWZpbGxlZFByb3BzOiBhbnk7XG59XG5cbi8qKlxuICogVE9ETzogdGFrZSB1bnVzZWQgcHJvcHMgaW50byBhY2NvdW50XG4gKiBAcGFyYW0gcGFyYW0wXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgRm9ybUdyb3VwTGF5b3V0ID0gKHtcbiAgYW5jaG9yTmFtZSxcbiAgY29sbGFwc2VkLFxuICBoYXNFcnJvcnMsXG4gIGdyb3VwLFxuICBkb2N1bWVudCxcbiAgdG9nZ2xlLFxuICAuLi5wcm9wc1xufSkgPT4ge1xuICByZXR1cm4gPGZpZWxkc2V0IHsuLi5wcm9wc30gLz47XG59O1xuXG5leHBvcnQgY29uc3QgRm9ybUdyb3VwSGVhZGVyID0gKHByb3BzKSA9PiA8aDIgey4uLnByb3BzfSAvPjtcblxuZXhwb3J0IGNvbnN0IEZvcm1Hcm91cCAvKjxGb3JtR3JvdXBQcm9wcywgRm9ybUdyb3VwU3RhdGU+Ki8gPSAoXG4gIHByb3BzOiBGb3JtR3JvdXBQcm9wc1xuKSA9PiB7XG4gIC8vIFRPRE86IGdldCB2YWx1ZS91cGRhdGUgbWV0aG9kcyBmcm9tIGNvbnRleHQgaW5zdGVhZFxuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBsYWJlbCxcbiAgICBncm91cCxcbiAgICBmaWVsZHMsXG4gICAgaGlkZGVuLFxuICAgIGRvY3VtZW50LFxuICAgIGN1cnJlbnRVc2VyLFxuICAgIGRpc2FibGVkLFxuICAgIGl0ZW1Qcm9wZXJ0aWVzLFxuICAgIHByZWZpbGxlZFByb3BzLFxuICAgIGZvcm1UeXBlLFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgZXJyb3JzLCBjbGVhckZpZWxkRXJyb3JzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICBjb25zdCBbY29sbGFwc2VkLCBzZXRDb2xsYXBzZWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oXG4gICAgZ3JvdXAuc3RhcnRDb2xsYXBzZWQgfHwgZmFsc2VcbiAgKTtcbiAgY29uc3QgdG9nZ2xlID0gKCkgPT4gc2V0Q29sbGFwc2VkKChjb2xsYXBzZWQpID0+ICFjb2xsYXBzZWQpO1xuICAvLyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZpZWxkcyBpbiB0aGUgZ3JvdXAgaGFzIGFuIGVycm9yLCB0aGUgZ3JvdXAgYXMgYSB3aG9sZSBoYXMgYW4gZXJyb3JcbiAgY29uc3QgaGFzRXJyb3JzID0gX3NvbWUoZmllbGRzLCAoZmllbGQpID0+IHtcbiAgICByZXR1cm4gISFlcnJvcnMuZmlsdGVyKChlcnJvcikgPT4gZXJyb3IucGF0aCA9PT0gZmllbGQucGF0aCkubGVuZ3RoO1xuICB9KTtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICBjb25zdCBpc0hpZGRlbiA9XG4gICAgdHlwZW9mIGhpZGRlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGhpZGRlbih7IC4uLnByb3BzLCBkb2N1bWVudCB9KVxuICAgICAgOiBoaWRkZW4gfHwgZmFsc2U7XG4gIC8qXG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBsYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBvcmRlcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBoaWRkZW46IFByb3BUeXBlcy5mdW5jLFxuICAgIGZpZWxkczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgZ3JvdXA6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBlcnJvcnM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICAgIHRocm93RXJyb3I6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgY3VycmVudFZhbHVlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIHVwZGF0ZUN1cnJlbnRWYWx1ZXM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZGVsZXRlZFZhbHVlczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgYWRkVG9EZWxldGVkVmFsdWVzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGNsZWFyRmllbGRFcnJvcnM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZm9ybVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICBjdXJyZW50VXNlcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBwcmVmaWxsZWRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgfTsqL1xuXG4gIGNvbnN0IGhlYWRpbmcgPSAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUdyb3VwSGVhZGVyXG4gICAgICB0b2dnbGU9e3RvZ2dsZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGNvbGxhcHNlZD17Y29sbGFwc2VkfVxuICAgICAgaGlkZGVuPXtpc0hpZGRlbn1cbiAgICAgIGdyb3VwPXtncm91cH1cbiAgICAvPlxuICApO1xuXG4gIGlmIChncm91cC5hZG1pbnNPbmx5ICYmICFpc0FkbWluKGN1cnJlbnRVc2VyKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGFuY2hvck5hbWUgPSBuYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxID8gbmFtZS5zcGxpdChcIi5cIilbMV0gOiBuYW1lO1xuXG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUdyb3VwTGF5b3V0XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBhbmNob3JOYW1lPXthbmNob3JOYW1lfVxuICAgICAgdG9nZ2xlPXt0b2dnbGV9XG4gICAgICBjb2xsYXBzZWQ9e2NvbGxhcHNlZH1cbiAgICAgIGhpZGRlbj17aXNIaWRkZW59XG4gICAgICBncm91cD17Z3JvdXB9XG4gICAgICBoZWFkaW5nPXtuYW1lID09PSBcImRlZmF1bHRcIiA/IG51bGwgOiBoZWFkaW5nfVxuICAgICAgaGFzRXJyb3JzPXtoYXNFcnJvcnN9XG4gICAgICBkb2N1bWVudD17ZG9jdW1lbnR9XG4gICAgPlxuICAgICAgey8qIFRPRE86IGNyZWF0ZSBUUyBlcnJvciBhdCB0aGUgbW9tZW50OiBncm91cC5iZWZvcmVDb21wb25lbnQgJiYgPGdyb3VwLmJlZm9yZUNvbXBvbmVudCB7Li4ucHJvcHN9IC8+Ki99XG4gICAgICB7LyoqIFRPRE86IHdlIHBhc3MgYWxsIHRoZSBmdW5jdGlvbnMgYXMgcHJvcHMgdG8gdGhlIEZvcm1Db21wb25lbnQsXG4gICAgICAgKiBidXQgaXQgc2hvdWxkIHJlbHkgb24gdGhlIGNvbnRleHQgaW5zdGVhZCBmb3IgbWV0aG9kc1xuICAgICAgICovfVxuXG4gICAgICB7ZmllbGRzLm1hcCgoZmllbGQpID0+IChcbiAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFxuICAgICAgICAgIGtleT17ZmllbGQubmFtZX1cbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgey4uLmZpZWxkfVxuICAgICAgICAgIGRvY3VtZW50PXtkb2N1bWVudH1cbiAgICAgICAgICBpdGVtUHJvcGVydGllcz17e1xuICAgICAgICAgICAgLi4uaXRlbVByb3BlcnRpZXMsXG4gICAgICAgICAgICAuLi5maWVsZC5pdGVtUHJvcGVydGllcyxcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsZWFyRmllbGRFcnJvcnM9e2NsZWFyRmllbGRFcnJvcnN9XG4gICAgICAgICAgZm9ybVR5cGU9e2Zvcm1UeXBlfVxuICAgICAgICAgIGN1cnJlbnRVc2VyPXtjdXJyZW50VXNlcn1cbiAgICAgICAgICBwcmVmaWxsZWRQcm9wcz17cHJlZmlsbGVkUHJvcHN9XG4gICAgICAgIC8+XG4gICAgICApKX1cblxuICAgICAgey8qIFRPRE86IGNyZWF0ZSBUUyBlcnJvciBhdCB0aGUgbW9tZW50OiBncm91cC5hZnRlckNvbXBvbmVudCAmJiA8Z3JvdXAuYWZ0ZXJDb21wb25lbnQgey4uLnByb3BzfSAvPiovfVxuICAgIDwvVnVsY2FuQ29tcG9uZW50cy5Gb3JtR3JvdXBMYXlvdXQ+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGb3JtR3JvdXA7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvc29tZVwiKTsiLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuLy9pbXBvcnQgdHlwZSB7IExvY2FsZVR5cGUgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcblxuLy8gY29uc3QgTG9jYWxlczogQXJyYXk8eyBpZDogc3RyaW5nIH0+ID0gW107IC8vID8/IG1pZ2h0IG5lZWQgdG8gZ2V0IHRoaXMgZnJvbSBjb250ZXh0XG5leHBvcnQgY29uc3QgRm9ybUludGxMYXlvdXQgPSAoeyBjaGlsZHJlbiB9KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1pbnRsXCI+e2NoaWxkcmVufTwvZGl2PlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtSW50bEl0ZW1MYXlvdXQgPSAoeyBsb2NhbGUsIGNoaWxkcmVuIH0pID0+IChcbiAgPGRpdiBjbGFzc05hbWU9e2Bmb3JtLWludGwtJHtsb2NhbGUuaWR9YH0+e2NoaWxkcmVufTwvZGl2PlxuKTtcblxuaW50ZXJmYWNlIEZvcm1JbnRsUHJvcHMge1xuICBwYXRoOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLy8gVE9ETzogdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgcHJvdmlkZWQgYnkgaTE4biBjb250ZXh0IGluc3RlYWRcbiAgLy9Mb2NhbGVzOiBBcnJheTxMb2NhbGVUeXBlPjtcbn1cblxuZXhwb3J0IGNvbnN0IEZvcm1JbnRsID0gKHByb3BzOiBGb3JtSW50bFByb3BzKSA9PiB7XG4gIGNvbnN0IEZvcm1Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCB7IGdldExhYmVsIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICAvLyBUT0RPOiB3ZSBkb24ndCBoYXZlIGEgZ2xvYmFsZSBcIkxvY2FsZXNcIiBvYmplY3QgYW55bW9yZVxuICAvLyBzbyB3ZSBuZWVkIHRvIGdldCB0aGlzIGZyb20gY29udGV4dCBzb21laG93XG4gIC8vY29uc3QgeyBMb2NhbGVzIH0gPSBwcm9wcztcbiAgY29uc3QgTG9jYWxlczogQXJyYXk8YW55PiA9IFtdOyAvLyBUT0RPOiBnZXQgaXQgZnJvbSBpMThuIGNvbnRleHQgaW5zdGVhZCB0aGF0IGV4cG9zZXMgdGhlIExvY2FsZXNSZWdpc3RyeVxuICAvKlxuICBOb3RlOiBpZGVhbGx5IHdlJ2QgdHJ5IHRvIG1ha2Ugc3VyZSB0byByZXR1cm4gdGhlIHJpZ2h0IHBhdGggbm8gbWF0dGVyXG4gIHRoZSBvcmRlciB0cmFuc2xhdGlvbnMgYXJlIHN0b3JlZCBpbiwgYnV0IGluIHByYWN0aWNlIHdlIGNhbid0IGd1YXJhbnRlZSBpdFxuICBzbyB3ZSBqdXN0IHVzZSB0aGUgb3JkZXIgb2YgdGhlIExvY2FsZXMgYXJyYXkuXG5cbiAgKi9cbiAgY29uc3QgZ2V0TG9jYWxlUGF0aCA9IChkZWZhdWx0SW5kZXgpID0+IHtcbiAgICByZXR1cm4gYCR7cHJvcHMucGF0aH1faW50bC4ke2RlZmF1bHRJbmRleH1gO1xuICB9O1xuXG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvcHM7XG5cbiAgLy8gZG8gbm90IHBhc3MgRm9ybUludGwncyBvd24gdmFsdWUsIGlucHV0UHJvcGVydGllcywgYW5kIGludGxJbnB1dCBwcm9wcyBkb3duXG4gIGNvbnN0IHByb3BlcnRpZXMgPSBvbWl0KFxuICAgIHByb3BzLFxuICAgIFwidmFsdWVcIixcbiAgICBcImlucHV0UHJvcGVydGllc1wiLFxuICAgIFwiaW50bElucHV0XCIsXG4gICAgXCJuZXN0ZWRJbnB1dFwiXG4gICk7XG4gIHJldHVybiAoXG4gICAgPEZvcm1Db21wb25lbnRzLkZvcm1JbnRsTGF5b3V0PlxuICAgICAge0xvY2FsZXMubWFwKChsb2NhbGUsIGkpID0+IChcbiAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1JbnRsSXRlbUxheW91dCBrZXk9e2xvY2FsZS5pZH0gbG9jYWxlPXtsb2NhbGV9PlxuICAgICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50XG4gICAgICAgICAgICB7Li4ucHJvcGVydGllc31cbiAgICAgICAgICAgIGxhYmVsPXtnZXRMYWJlbChuYW1lLCBsb2NhbGUuaWQpfVxuICAgICAgICAgICAgcGF0aD17Z2V0TG9jYWxlUGF0aChpKX1cbiAgICAgICAgICAgIGxvY2FsZT17bG9jYWxlLmlkfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybUludGxJdGVtTGF5b3V0PlxuICAgICAgKSl9XG4gICAgPC9Gb3JtQ29tcG9uZW50cy5Gb3JtSW50bExheW91dD5cbiAgKTtcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuLyoqXG4gKiBEaXNwbGF5IGVycm9ycyBmb3IgdGhlIGN1cnJlbnQgZm9ybSwgYmFzZWQgb24gdGhlIGNvbnRleHRcbiAqL1xuZXhwb3J0IGNvbnN0IEZvcm1FcnJvcnMgPSAoKSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IHsgZXJyb3JzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWVycm9yc1wiPlxuICAgICAgeyEhZXJyb3JzLmxlbmd0aCAmJiAoXG4gICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkFsZXJ0IGNsYXNzTmFtZT1cImZsYXNoLW1lc3NhZ2VcIiB2YXJpYW50PVwiZGFuZ2VyXCI+XG4gICAgICAgICAgPHVsPlxuICAgICAgICAgICAge2Vycm9ycy5tYXAoKGVycm9yLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8bGkga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUVycm9yIGVycm9yPXtlcnJvcn0gZXJyb3JDb250ZXh0PVwiZm9ybVwiIC8+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L1Z1bGNhbkNvbXBvbmVudHMuQWxlcnQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuLy8gLypcblxuLy8gICBSZW5kZXIgZXJyb3JzXG5cbi8vICAgKi9cbi8vICByZW5kZXJFcnJvcnMgPSAoKSA9PiB7XG4vLyAgIHJldHVybiAoXG4vLyAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWVycm9yc1wiPlxuLy8gICAgICAge3RoaXMuc3RhdGUuZXJyb3JzLm1hcCgoZXJyb3IsIGluZGV4KSA9PiB7XG4vLyAgICAgICAgIGxldCBtZXNzYWdlO1xuXG4vLyAgICAgICAgIGlmIChlcnJvci5kYXRhICYmIGVycm9yLmRhdGEuZXJyb3JzKSB7XG4vLyAgICAgICAgICAgLy8gdGhpcyBlcnJvciBpcyBhIFwibXVsdGktZXJyb3JcIiB3aXRoIG11bHRpcGxlIHN1Yi1lcnJvcnNcblxuLy8gICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5kYXRhLmVycm9ycy5tYXAoZXJyb3IgPT4ge1xuLy8gICAgICAgICAgICAgcmV0dXJuIHtcbi8vICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpLFxuLy8gICAgICAgICAgICAgICBkYXRhOiBlcnJvci5kYXRhLFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICB9KTtcbi8vICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAvLyB0aGlzIGlzIGEgcmVndWxhciBlcnJvclxuXG4vLyAgICAgICAgICAgbWVzc2FnZSA9IHtcbi8vICAgICAgICAgICAgIGNvbnRlbnQ6XG4vLyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgfHxcbi8vICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmludGwuZm9ybWF0TWVzc2FnZSh7IGlkOiBlcnJvci5pZCwgZGVmYXVsdE1lc3NhZ2U6IGVycm9yLmlkIH0sIGVycm9yLmRhdGEpLFxuLy8gICAgICAgICAgIH07XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICByZXR1cm4gPENvbXBvbmVudHMuRm9ybUZsYXNoIGtleT17aW5kZXh9IG1lc3NhZ2U9e21lc3NhZ2V9IHR5cGU9XCJlcnJvclwiIC8+O1xuLy8gICAgICAgfSl9XG4vLyAgICAgPC9kaXY+XG4vLyAgICk7XG4vLyB9O1xuIiwiLyoqXG4gKiBDaGFuZ2UgY29tcGFyZWQgdG8gVnVsY2FuOlxuICogLSB1c2luZyBhIG1vZGVsIGluc3RlYWQgb2YgYSBjb2xsZWN0aW9uTmFtZVxuICovXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyBjYW5EZWxldGVEb2N1bWVudCB9IGZyb20gXCJAdnVsY2FuanMvcGVybWlzc2lvbnNcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TdWJtaXRQcm9wcyB7XG4gIHN1Ym1pdExhYmVsOiBhbnk7XG4gIGNhbmNlbExhYmVsOiBhbnk7XG4gIGNhbmNlbENhbGxiYWNrOiBhbnk7XG4gIHJldmVydExhYmVsOiBhbnk7XG4gIHJldmVydENhbGxiYWNrOiBhbnk7XG4gIGRvY3VtZW50OiBhbnk7XG4gIGRlbGV0ZURvY3VtZW50OiBhbnk7XG4gIG1vZGVsOiBhbnk7XG4gIC8vIGNsYXNzZXM6IGFueSxcbiAgY3VycmVudFVzZXI6IGFueTtcbn1cbmV4cG9ydCBjb25zdCBGb3JtU3VibWl0ID0gKHtcbiAgc3VibWl0TGFiZWwsXG4gIGNhbmNlbExhYmVsLFxuICBjYW5jZWxDYWxsYmFjayxcbiAgcmV2ZXJ0TGFiZWwsXG4gIHJldmVydENhbGxiYWNrLFxuICBkb2N1bWVudCxcbiAgZGVsZXRlRG9jdW1lbnQsXG4gIG1vZGVsLFxuICAvLyBjbGFzc2VzLFxuICBjdXJyZW50VXNlcixcbn0pID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgeyBjbGVhckZvcm0gfSA9IHVzZUZvcm1Db250ZXh0KCk7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLXN1Ym1pdFwiPlxuICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuQnV0dG9uIHR5cGU9XCJzdWJtaXRcIiB2YXJpYW50PVwicHJpbWFyeVwiPlxuICAgICAgICB7c3VibWl0TGFiZWwgPyAoXG4gICAgICAgICAgc3VibWl0TGFiZWxcbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICBpZD1cImZvcm1zLnN1Ym1pdFwiXG4gICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT1cIlN1Ym1pdFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvVnVsY2FuQ29tcG9uZW50cy5CdXR0b24+XG5cbiAgICAgIHtjYW5jZWxDYWxsYmFjayA/IChcbiAgICAgICAgPGFcbiAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLWNhbmNlbFwiXG4gICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGNhbmNlbENhbGxiYWNrKGRvY3VtZW50KTtcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge2NhbmNlbExhYmVsID8gKFxuICAgICAgICAgICAgY2FuY2VsTGFiZWxcbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICBpZD1cImZvcm1zLmNhbmNlbFwiXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPVwiQ2FuY2VsXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9hPlxuICAgICAgKSA6IG51bGx9XG5cbiAgICAgIHtyZXZlcnRDYWxsYmFjayA/IChcbiAgICAgICAgPGFcbiAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLWNhbmNlbFwiXG4gICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGNsZWFyRm9ybSgpO1xuICAgICAgICAgICAgcmV2ZXJ0Q2FsbGJhY2soZG9jdW1lbnQpO1xuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7cmV2ZXJ0TGFiZWwgPyAoXG4gICAgICAgICAgICByZXZlcnRMYWJlbFxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICAgIGlkPVwiZm9ybXMucmV2ZXJ0XCJcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9XCJSZXZlcnRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2E+XG4gICAgICApIDogbnVsbH1cblxuICAgICAge2RlbGV0ZURvY3VtZW50ICYmXG4gICAgICBjYW5EZWxldGVEb2N1bWVudCh7XG4gICAgICAgIHVzZXI6IGN1cnJlbnRVc2VyLFxuICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgbW9kZWwsXG4gICAgICB9KSA/IChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aHIgLz5cbiAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5CdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJsaW5rXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e2RlbGV0ZURvY3VtZW50fVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtgZGVsZXRlLWxpbmsgJHttb2RlbC5uYW1lfS1kZWxldGUtbGlua2B9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuSWNvbiBuYW1lPVwiY2xvc2VcIiAvPntcIiBcIn1cbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgaWQ9XCJmb3Jtcy5kZWxldGVcIlxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvVnVsY2FuQ29tcG9uZW50cy5CdXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IG51bGx9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5Gb3JtU3VibWl0LnByb3BUeXBlcyA9IHtcbiAgc3VibWl0TGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBjYW5jZWxMYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIGNhbmNlbENhbGxiYWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgcmV2ZXJ0TGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICByZXZlcnRDYWxsYmFjazogUHJvcFR5cGVzLmZ1bmMsXG4gIGRvY3VtZW50OiBQcm9wVHlwZXMub2JqZWN0LFxuICBkZWxldGVEb2N1bWVudDogUHJvcFR5cGVzLmZ1bmMsXG4gIGNvbGxlY3Rpb25OYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1MYXlvdXRQcm9wcyB7XG4gIGNvbW1vblByb3BzOiBhbnk7XG4gIGZvcm1Qcm9wczogYW55O1xuICBzdWJtaXRQcm9wczogYW55O1xuICByZXBlYXRFcnJvcnM/OiBib29sZWFuO1xufVxuZXhwb3J0IGNvbnN0IEZvcm1MYXlvdXQ6IFJlYWN0LkZDPEZvcm1MYXlvdXRQcm9wcz4gPSAoe1xuICBjb21tb25Qcm9wcyxcbiAgZm9ybVByb3BzLFxuICByZXBlYXRFcnJvcnMsXG4gIHN1Ym1pdFByb3BzLFxuICBjaGlsZHJlbixcbn0pID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIChcbiAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtRWxlbWVudCB7Li4uZm9ybVByb3BzfT5cbiAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1FcnJvcnMgey4uLmNvbW1vblByb3BzfSAvPlxuXG4gICAgICB7Y2hpbGRyZW59XG5cbiAgICAgIHtyZXBlYXRFcnJvcnMgJiYgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUVycm9ycyB7Li4uY29tbW9uUHJvcHN9IC8+fVxuXG4gICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtU3VibWl0IHsuLi5jb21tb25Qcm9wc30gey4uLnN1Ym1pdFByb3BzfSAvPlxuICAgIDwvVnVsY2FuQ29tcG9uZW50cy5Gb3JtRWxlbWVudD5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtQ29tcG9uZW50c0RlcGVuZGVuY2llcyA9IFtcbiAgXCJGb3JtRXJyb3JzXCIsXG4gIFwiRm9ybVN1Ym1pdFwiLFxuICBcIkZvcm1FbGVtZW50XCIsXG5dO1xuIiwiLyoqXG4gKiBDaGFuZ2UgY29tcGFyZWQgdG8gVnVsY2FuIE1ldGVvcjpcbiAqIGFmdGVyL2JlZm9yZSA9PiBBZnRlciwgQmVmb3JlIHdpdGggdGl0bGVjYXNlXG4gKi9cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBfb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcbmltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuLy8gV3JhcHMgdGhlIEZvcm1OZXN0ZWRJdGVtLCByZXBlYXRlZCBmb3IgZWFjaCBvYmplY3Rcbi8vIEFsbG93IGZvciBleGFtcGxlIHRvIGhhdmUgYSBsYWJlbCBwZXIgb2JqZWN0XG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXQgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBsYWJlbCwgY2hpbGRyZW4sIGFkZEl0ZW0sIEJlZm9yZUNvbXBvbmVudCwgQWZ0ZXJDb21wb25lbnQgfSA9IHByb3BzO1xuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tbmVzdGVkLWFycmF5LWlubmVyLWxheW91dFwiPlxuICAgICAgPEJlZm9yZUNvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZERpdmlkZXIgbGFiZWw9e2xhYmVsfSBhZGRJdGVtPXthZGRJdGVtfSAvPlxuICAgICAgPEFmdGVyQ29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybU5lc3RlZEFycmF5UHJvcHM8VFZhbHVlID0gYW55PiB7XG4gIHZhbHVlOiBUVmFsdWU7XG4gIC8qKiBQYXRoIGZvciB0aGUgbmVzdGVkIG9iamVjdCAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIGl0ZW1Qcm9wZXJ0aWVzOiBhbnk7XG4gIG1pbkNvdW50PzogbnVtYmVyO1xuICBtYXhDb3VudD86IG51bWJlcjtcbiAgYXJyYXlGaWVsZD86IGJvb2xlYW47XG4gIG5lc3RlZEFycmF5RXJyb3JzOiBhbnk7XG4gIGhhc0Vycm9ycz86IGJvb2xlYW47XG4gIC8vIFRPRE86IGdldCBmcm9tIGNvbnRleHRcbiAgcHJlZmlsbGVkUHJvcHM/OiBhbnk7XG4gIGFkZEl0ZW06IEZ1bmN0aW9uIHwgbnVsbDtcbn1cbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkQXJyYXkgPSAocHJvcHM6IEZvcm1OZXN0ZWRBcnJheVByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdXBkYXRlQ3VycmVudFZhbHVlcywgZGVsZXRlZFZhbHVlcywgZXJyb3JzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICAvKnN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgaXRlbVByb3BlcnRpZXM6IHt9LFxuICB9OyovXG4gIGNvbnN0IHZhbHVlID0gcHJvcHMudmFsdWUgfHwgW107XG5cbiAgY29uc3QgYWRkSXRlbSA9ICgpID0+IHtcbiAgICBjb25zdCB7IHByZWZpbGxlZFByb3BzLCBwYXRoIH0gPSBwcm9wcztcbiAgICB1cGRhdGVDdXJyZW50VmFsdWVzKFxuICAgICAgeyBbYCR7cGF0aH0uJHt2YWx1ZS5sZW5ndGh9YF06IF9nZXQocHJlZmlsbGVkUHJvcHMsIGAke3BhdGh9LiRgKSB8fCB7fSB9LFxuICAgICAgeyBtb2RlOiBcIm1lcmdlXCIgfVxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlSXRlbSA9IChpbmRleCkgPT4ge1xuICAgIHVwZGF0ZUN1cnJlbnRWYWx1ZXMoeyBbYCR7cHJvcHMucGF0aH0uJHtpbmRleH1gXTogbnVsbCB9KTtcbiAgfTtcblxuICAvKlxuXG4gIEdvIHRocm91Z2ggdGhpcy5jb250ZXh0LmRlbGV0ZWRWYWx1ZXMgYW5kIHNlZSBpZiBhbnkgdmFsdWUgbWF0Y2hlcyBib3RoIHRoZSBjdXJyZW50IGZpZWxkXG4gIGFuZCB0aGUgZ2l2ZW4gaW5kZXggKGV4OiBpZiB3ZSB3YW50IHRvIGtub3cgaWYgdGhlIHNlY29uZCBhZGRyZXNzIGlzIGRlbGV0ZWQsIHdlXG4gIGxvb2sgZm9yIHRoZSBwcmVzZW5jZSBvZiAnYWRkcmVzc2VzLjEnKVxuICAqL1xuICBjb25zdCBpc0RlbGV0ZWQgPSAoaW5kZXgpID0+IHtcbiAgICByZXR1cm4gZGVsZXRlZFZhbHVlcy5pbmNsdWRlcyhgJHtwcm9wcy5wYXRofS4ke2luZGV4fWApO1xuICB9O1xuXG4gIGNvbnN0IGNvbXB1dGVWaXNpYmxlSW5kZXggPSAodmFsdWVzKSA9PiB7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgY29uc3QgdmlzaWJsZUluZGV4ZXMgPSB2YWx1ZXMubWFwKChzdWJEb2N1bWVudCwgc3ViRG9jdW1lbnRJbmR4KSA9PiB7XG4gICAgICBpZiAoaXNEZWxldGVkKHN1YkRvY3VtZW50SW5keCkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2aXNpYmxlSW5kZXhlcztcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwcm9wcy5pdGVtUHJvcGVydGllcy5vcGVuTmVzdGVkKSBhZGRJdGVtKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCB2aXNpYmxlSXRlbUluZGV4ZXMgPSBjb21wdXRlVmlzaWJsZUluZGV4KHZhbHVlKTtcbiAgLy8gZG8gbm90IHBhc3MgRm9ybU5lc3RlZCdzIG93biB2YWx1ZSwgaW5wdXQgYW5kIGlucHV0UHJvcGVydGllcyBwcm9wcyBkb3duXG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgLi4uX29taXQoXG4gICAgICBwcm9wcyxcbiAgICAgIFwidmFsdWVcIixcbiAgICAgIFwiaW5wdXRcIixcbiAgICAgIFwiaW5wdXRQcm9wZXJ0aWVzXCIsXG4gICAgICBcIm5lc3RlZElucHV0XCIsXG4gICAgICBcImJlZm9yZUNvbXBvbmVudFwiLFxuICAgICAgXCJhZnRlckNvbXBvbmVudFwiXG4gICAgKSxcbiAgfTtcbiAgY29uc3QgeyBwYXRoLCBtaW5Db3VudCwgbWF4Q291bnQsIGFycmF5RmllbGQgfSA9IHByb3BzO1xuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICAvL2ZpbHRlciBvdXQgbnVsbCB2YWx1ZXMgdG8gY2FsY3VsYXRlIGFycmF5IGxlbmd0aFxuICBsZXQgYXJyYXlMZW5ndGggPSB2YWx1ZS5maWx0ZXIoKHNpbmdsZVZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBzaW5nbGVWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzaW5nbGVWYWx1ZSAhPT0gbnVsbDtcbiAgfSkubGVuZ3RoO1xuICBwcm9wZXJ0aWVzLmFkZEl0ZW0gPSAhbWF4Q291bnQgfHwgYXJyYXlMZW5ndGggPCBtYXhDb3VudCA/IGFkZEl0ZW0gOiBudWxsO1xuXG4gIC8vIG9ubHkga2VlcCBlcnJvcnMgc3BlY2lmaWMgdG8gdGhlIG5lc3RlZCBhcnJheSAoYW5kIG5vdCBpdHMgc3ViZmllbGRzKVxuICBwcm9wZXJ0aWVzLm5lc3RlZEFycmF5RXJyb3JzID0gZXJyb3JzLmZpbHRlcihcbiAgICAoZXJyb3IpID0+IGVycm9yLnBhdGggJiYgZXJyb3IucGF0aCA9PT0gcGF0aFxuICApO1xuICBwcm9wZXJ0aWVzLmhhc0Vycm9ycyA9ICEhKFxuICAgIHByb3BlcnRpZXMubmVzdGVkQXJyYXlFcnJvcnMgJiYgcHJvcGVydGllcy5uZXN0ZWRBcnJheUVycm9ycy5sZW5ndGhcbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkQXJyYXlMYXlvdXQgey4uLnByb3BlcnRpZXN9PlxuICAgICAge3ZhbHVlLm1hcCgoc3ViRG9jdW1lbnQsIGkpID0+IHtcbiAgICAgICAgaWYgKGlzRGVsZXRlZChpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHBhdGggPSBgJHtwcm9wcy5wYXRofS4ke2l9YDtcbiAgICAgICAgY29uc3QgdmlzaWJsZUl0ZW1JbmRleCA9IHZpc2libGVJdGVtSW5kZXhlc1tpXTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXRcbiAgICAgICAgICAgIHsuLi5hcnJheUZpZWxkfVxuICAgICAgICAgICAga2V5PXtwYXRofVxuICAgICAgICAgICAgYWRkSXRlbT17YWRkSXRlbX1cbiAgICAgICAgICAgIGl0ZW1JbmRleD17aX1cbiAgICAgICAgICAgIHZpc2libGVJdGVtSW5kZXg9e3Zpc2libGVJdGVtSW5kZXh9XG4gICAgICAgICAgICBwYXRoPXtwYXRofVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkSXRlbVxuICAgICAgICAgICAgICB7Li4ucHJvcGVydGllc31cbiAgICAgICAgICAgICAgaXRlbUluZGV4PXtpfVxuICAgICAgICAgICAgICB2aXNpYmxlSXRlbUluZGV4PXt2aXNpYmxlSXRlbUluZGV4fVxuICAgICAgICAgICAgICBwYXRoPXtwYXRofVxuICAgICAgICAgICAgICByZW1vdmVJdGVtPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlSXRlbShpKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgaGlkZVJlbW92ZT17ISFtaW5Db3VudCAmJiBhcnJheUxlbmd0aCA8PSBtaW5Db3VudH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9Gb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dD5cbiAgICAgICAgKTtcbiAgICAgIH0pfVxuICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZEFycmF5TGF5b3V0PlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1Db21wb25lbnRzRGVwZW5kZW5jaWVzID0gW1xuICBcIkZvcm1OZXN0ZWRBcnJheUlubmVyTGF5b3V0XCIsXG4gIFwiRm9ybU5lc3RlZEFycmF5TGF5b3V0XCIsXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBGb3JtTmVzdGVkQXJyYXk7XG5cbmV4cG9ydCBjb25zdCBJY29uQWRkID0gKHsgd2lkdGggPSAyNCwgaGVpZ2h0ID0gMjQgfSkgPT4gKFxuICA8c3ZnXG4gICAgd2lkdGg9e3dpZHRofVxuICAgIGhlaWdodD17aGVpZ2h0fVxuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgIHZpZXdCb3g9XCIwIDAgNDQ4IDUxMlwiXG4gID5cbiAgICA8cGF0aFxuICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICBkPVwiTTQ0OCAyOTQuMnYtNzYuNGMwLTEzLjMtMTAuNy0yNC0yNC0yNEgyODYuMlY1NmMwLTEzLjMtMTAuNy0yNC0yNC0yNGgtNzYuNGMtMTMuMyAwLTI0IDEwLjctMjQgMjR2MTM3LjhIMjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0djc2LjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRoMTM3LjhWNDU2YzAgMTMuMyAxMC43IDI0IDI0IDI0aDc2LjRjMTMuMyAwIDI0LTEwLjcgMjQtMjRWMzE4LjJINDI0YzEzLjMgMCAyNC0xMC43IDI0LTI0elwiXG4gICAgLz5cbiAgPC9zdmc+XG4pO1xuXG5leHBvcnQgY29uc3QgSWNvblJlbW92ZSA9ICh7IHdpZHRoID0gMjQsIGhlaWdodCA9IDI0IH0pID0+IChcbiAgPHN2Z1xuICAgIHdpZHRoPXt3aWR0aH1cbiAgICBoZWlnaHQ9e2hlaWdodH1cbiAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIlxuICA+XG4gICAgPHBhdGhcbiAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgZD1cIk00MjQgMzE4LjJjMTMuMyAwIDI0LTEwLjcgMjQtMjR2LTc2LjRjMC0xMy4zLTEwLjctMjQtMjQtMjRIMjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0djc2LjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRoNDAwelwiXG4gICAgLz5cbiAgPC9zdmc+XG4pO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbi8vIFJlcGxhY2VhYmxlIGxheW91dCwgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRBcnJheUxheW91dCA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgaGFzRXJyb3JzLFxuICAgIG5lc3RlZEFycmF5RXJyb3JzLFxuICAgIGxhYmVsLFxuICAgIGFkZEl0ZW0sXG4gICAgQmVmb3JlQ29tcG9uZW50LFxuICAgIEFmdGVyQ29tcG9uZW50LFxuICAgIGNoaWxkcmVuLFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Bmb3JtLWdyb3VwIHJvdyBmb3JtLW5lc3RlZCAke2hhc0Vycm9ycyA/IFwiaW5wdXQtZXJyb3JcIiA6IFwiXCJ9YH1cbiAgICA+XG4gICAgICB7QmVmb3JlQ29tcG9uZW50ICYmIDxCZWZvcmVDb21wb25lbnQgey4uLnByb3BzfSAvPn1cblxuICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImNvbnRyb2wtbGFiZWwgY29sLXNtLTNcIj57bGFiZWx9PC9sYWJlbD5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc20tOVwiPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIHthZGRJdGVtICYmIChcbiAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5CdXR0b25cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tbmVzdGVkLWJ1dHRvbiBmb3JtLW5lc3RlZC1hZGRcIlxuICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJzdWNjZXNzXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e2FkZEl0ZW19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuSWNvbkFkZCBoZWlnaHQ9ezEyfSB3aWR0aD17MTJ9IC8+XG4gICAgICAgICAgPC9WdWxjYW5Db21wb25lbnRzLkJ1dHRvbj5cbiAgICAgICAgKX1cbiAgICAgICAge3Byb3BzLmhhc0Vycm9ycyA/IChcbiAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5GaWVsZEVycm9yc1xuICAgICAgICAgICAga2V5PVwiZm9ybS1uZXN0ZWQtZXJyb3JzXCJcbiAgICAgICAgICAgIGVycm9ycz17bmVzdGVkQXJyYXlFcnJvcnN9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L2Rpdj5cblxuICAgICAge0FmdGVyQ29tcG9uZW50ICYmIDxBZnRlckNvbXBvbmVudCB7Li4ucHJvcHN9IC8+fVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuRm9ybU5lc3RlZEFycmF5TGF5b3V0LnByb3BUeXBlcyA9IHtcbiAgaGFzRXJyb3JzOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBuZXN0ZWRBcnJheUVycm9yczogUHJvcFR5cGVzLmFycmF5LFxuICBsYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIGhpZGVMYWJlbDogUHJvcFR5cGVzLmJvb2wsXG4gIGFkZEl0ZW06IFByb3BUeXBlcy5mdW5jLFxuICBiZWZvcmVDb21wb25lbnQ6IFByb3BUeXBlcy5ub2RlLFxuICBhZnRlckNvbXBvbmVudDogUHJvcFR5cGVzLm5vZGUsXG4gIGZvcm1Db21wb25lbnRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBGb3JtTmVzdGVkQXJyYXlMYXlvdXQ7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyBpbnRsU2hhcGUgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgdXNlSW50bENvbnRleHQgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRJdGVtTGF5b3V0ID0gKHsgY29udGVudCwgcmVtb3ZlQnV0dG9uIH0pID0+IChcbiAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtXCI+XG4gICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtLWlubmVyXCI+e2NvbnRlbnR9PC9kaXY+XG4gICAge3JlbW92ZUJ1dHRvbiAmJiBbXG4gICAgICA8ZGl2IGtleT1cInJlbW92ZS1idXR0b25cIiBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtLXJlbW92ZVwiPlxuICAgICAgICB7cmVtb3ZlQnV0dG9ufVxuICAgICAgPC9kaXY+LFxuICAgICAgPGRpdlxuICAgICAgICBrZXk9XCJyZW1vdmUtYnV0dG9uLW92ZXJsYXlcIlxuICAgICAgICBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtLWRlbGV0ZWQtb3ZlcmxheVwiXG4gICAgICAvPixcbiAgICBdfVxuICA8L2Rpdj5cbik7XG5Gb3JtTmVzdGVkSXRlbUxheW91dC5wcm9wVHlwZXMgPSB7XG4gIGNvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIHJlbW92ZUJ1dHRvbjogUHJvcFR5cGVzLm5vZGUsXG59O1xuXG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZEl0ZW0gPSAoe1xuICBuZXN0ZWRGaWVsZHMsXG4gIG5hbWUsXG4gIHBhdGgsXG4gIHJlbW92ZUl0ZW0sXG4gIGl0ZW1JbmRleCxcbiAgZm9ybUNvbXBvbmVudHMsXG4gIGhpZGVSZW1vdmUsXG4gIGxhYmVsLFxuICAuLi5wcm9wc1xufSkgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCBpbnRsID0gdXNlSW50bENvbnRleHQoKTtcbiAgY29uc3QgaXNBcnJheSA9IHR5cGVvZiBpdGVtSW5kZXggIT09IFwidW5kZWZpbmVkXCI7XG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybU5lc3RlZEl0ZW1MYXlvdXRcbiAgICAgIGNvbnRlbnQ9e25lc3RlZEZpZWxkcy5tYXAoKGZpZWxkLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFxuICAgICAgICAgICAga2V5PXtpfVxuICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgey4uLmZpZWxkfVxuICAgICAgICAgICAgcGF0aD17YCR7cGF0aH0uJHtmaWVsZC5uYW1lfWB9XG4gICAgICAgICAgICBpdGVtSW5kZXg9e2l0ZW1JbmRleH1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfSl9XG4gICAgICByZW1vdmVCdXR0b249e1xuICAgICAgICBpc0FycmF5ICYmXG4gICAgICAgICFoaWRlUmVtb3ZlICYmIFtcbiAgICAgICAgICA8ZGl2IGtleT1cInJlbW92ZS1idXR0b25cIiBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtLXJlbW92ZVwiPlxuICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuQnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tbmVzdGVkLWJ1dHRvblwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICBpY29uQnV0dG9uXG4gICAgICAgICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW92ZUl0ZW0obmFtZSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICAgICAgICB7IGlkOiBcImZvcm1zLmRlbGV0ZV9uZXN0ZWRfZmllbGRcIiB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6IGxhYmVsIH1cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuSWNvblJlbW92ZSBoZWlnaHQ9ezEyfSB3aWR0aD17MTJ9IC8+XG4gICAgICAgICAgICA8L1Z1bGNhbkNvbXBvbmVudHMuQnV0dG9uPlxuICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9XCJyZW1vdmUtYnV0dG9uLW92ZXJsYXlcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1kZWxldGVkLW92ZXJsYXlcIlxuICAgICAgICAgIC8+LFxuICAgICAgICBdXG4gICAgICB9XG4gICAgLz5cbiAgKTtcbn07XG5cbkZvcm1OZXN0ZWRJdGVtLnByb3BUeXBlcyA9IHtcbiAgcGF0aDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBpdGVtSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gIGZvcm1Db21wb25lbnRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBoaWRlUmVtb3ZlOiBQcm9wVHlwZXMuYm9vbCxcbn07XG5cbkZvcm1OZXN0ZWRJdGVtLmNvbnRleHRUeXBlcyA9IHtcbiAgZXJyb3JzOiBQcm9wVHlwZXMuYXJyYXksXG4gIGludGw6IGludGxTaGFwZSxcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkRGl2aWRlciA9ICh7IGxhYmVsLCBhZGRJdGVtIH0pID0+IDxkaXYgLz47XG5cbkZvcm1OZXN0ZWREaXZpZGVyLnByb3BUeXBlcyA9IHtcbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGFkZEl0ZW06IFByb3BUeXBlcy5mdW5jLFxufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG4vLyBUcmFjayBkZXBlbmRlbmNpZXMsIG5vdCB1c2VkIHlldFxuZXhwb3J0IGNvbnN0IGZvcm1Db21wb25lbnRzRGVwZW5kZW5jaWVzID0gW1wiRm9ybUVycm9yXCJdO1xuXG4vKipcbiAqIEVycm9ycyBmb3Igb25lIHNwZWNpZiBmaWVsZHNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBGaWVsZEVycm9ycyA9ICh7XG4gIGVycm9ycyxcbn06IHtcbiAgLyoqXG4gICAqIEVycm9ycyBmb3IgdGhpcyBzcGVjaWZpYyBmaWVsZCBvbmx5XG4gICAqL1xuICBlcnJvcnM6IEFycmF5PGFueT47XG59KSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIHJldHVybiAoXG4gICAgPHVsIGNsYXNzTmFtZT1cImZvcm0taW5wdXQtZXJyb3JzXCI+XG4gICAgICB7ZXJyb3JzLm1hcCgoZXJyb3IsIGluZGV4KSA9PiAoXG4gICAgICAgIDxsaSBrZXk9e2luZGV4fT5cbiAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtRXJyb3IgZXJyb3I9e2Vycm9yfSBlcnJvckNvbnRleHQ9XCJmaWVsZFwiIC8+XG4gICAgICAgIDwvbGk+XG4gICAgICApKX1cbiAgICA8L3VsPlxuICApO1xufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBfb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuXG4vLyBSZXBsYWNlYWJsZSBsYXlvdXRcbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkT2JqZWN0TGF5b3V0ID0gKHsgaGFzRXJyb3JzLCBsYWJlbCwgY29udGVudCB9KSA9PiAoXG4gIDxkaXZcbiAgICBjbGFzc05hbWU9e2Bmb3JtLWdyb3VwIHJvdyBmb3JtLW5lc3RlZCAke2hhc0Vycm9ycyA/IFwiaW5wdXQtZXJyb3JcIiA6IFwiXCJ9YH1cbiAgPlxuICAgIDxsYWJlbCBjbGFzc05hbWU9XCJjb250cm9sLWxhYmVsIGNvbC1zbS0zXCI+e2xhYmVsfTwvbGFiZWw+XG4gICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc20tOVwiPntjb250ZW50fTwvZGl2PlxuICA8L2Rpdj5cbik7XG5Gb3JtTmVzdGVkT2JqZWN0TGF5b3V0LnByb3BUeXBlcyA9IHtcbiAgaGFzRXJyb3JzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuYm9vbF0pLFxuICBsYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIGNvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxufTtcblxuaW50ZXJmYWNlIEZvcm1OZXN0ZWRPYmplY3RQcm9wcyB7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YWx1ZTogYW55O1xuICBpbnB1dDogYW55O1xuICBpbnB1dFByb3BlcnRpZXM6IGFueTtcbiAgbmVzdGVkSW5wdXQ6IGFueTtcbiAgZXJyb3JzOiBBcnJheTxhbnk+O1xuICBwYXRoOiBzdHJpbmc7XG59XG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZE9iamVjdCA9IChwcm9wczogRm9ybU5lc3RlZE9iamVjdFByb3BzKSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIC8vY29uc3QgdmFsdWUgPSB0aGlzLmdldEN1cnJlbnRWYWx1ZSgpXG4gIC8vIGRvIG5vdCBwYXNzIEZvcm1OZXN0ZWQncyBvd24gdmFsdWUsIGlucHV0IGFuZCBpbnB1dFByb3BlcnRpZXMgcHJvcHMgZG93blxuICBjb25zdCBwcm9wZXJ0aWVzID0gX29taXQoXG4gICAgcHJvcHMsXG4gICAgXCJ2YWx1ZVwiLFxuICAgIFwiaW5wdXRcIixcbiAgICBcImlucHV0UHJvcGVydGllc1wiLFxuICAgIFwibmVzdGVkSW5wdXRcIlxuICApO1xuICBjb25zdCB7IGVycm9ycyB9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgLy8gb25seSBrZWVwIGVycm9ycyBzcGVjaWZpYyB0byB0aGUgbmVzdGVkIGFycmF5IChhbmQgbm90IGl0cyBzdWJmaWVsZHMpXG4gIGNvbnN0IG5lc3RlZE9iamVjdEVycm9ycyA9IGVycm9ycy5maWx0ZXIoXG4gICAgKGVycm9yKSA9PiBlcnJvci5wYXRoICYmIGVycm9yLnBhdGggPT09IHByb3BzLnBhdGhcbiAgKTtcbiAgY29uc3QgaGFzRXJyb3JzID0gbmVzdGVkT2JqZWN0RXJyb3JzICYmIG5lc3RlZE9iamVjdEVycm9ycy5sZW5ndGg7XG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybU5lc3RlZE9iamVjdExheW91dFxuICAgICAgaGFzRXJyb3JzPXtoYXNFcnJvcnN9XG4gICAgICBsYWJlbD17cHJvcHMubGFiZWx9XG4gICAgICBjb250ZW50PXtbXG4gICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1OZXN0ZWRJdGVtXG4gICAgICAgICAga2V5PVwiZm9ybS1uZXN0ZWQtaXRlbVwiXG4gICAgICAgICAgey4uLnByb3BlcnRpZXN9XG4gICAgICAgICAgcGF0aD17YCR7cHJvcHMucGF0aH1gfVxuICAgICAgICAvPixcbiAgICAgICAgaGFzRXJyb3JzID8gKFxuICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZpZWxkRXJyb3JzXG4gICAgICAgICAgICBrZXk9XCJmb3JtLW5lc3RlZC1lcnJvcnNcIlxuICAgICAgICAgICAgZXJyb3JzPXtuZXN0ZWRPYmplY3RFcnJvcnN9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGwsXG4gICAgICBdfVxuICAgIC8+XG4gICk7XG59O1xuXG5Gb3JtTmVzdGVkT2JqZWN0LnByb3BUeXBlcyA9IHtcbiAgY3VycmVudFZhbHVlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgcGF0aDogUHJvcFR5cGVzLnN0cmluZyxcbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGVycm9yczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIGZvcm1Db21wb25lbnRzOiBQcm9wVHlwZXMub2JqZWN0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybU5lc3RlZE9iamVjdDtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1PcHRpb25MYWJlbCA9ICh7IG9wdGlvbiB9KSA9PiB7XG4gIGNvbnN0IHsgbGFiZWwgfSA9IG9wdGlvbjtcbiAgLy8gTk9URTogZm9yIHJhZGlvIGdyb3VwcyB3ZSBtaWdodCBuZWVkIHRvIHdyYXAgdGhpcyB3aXRoIGEgbGFiZWw/IEFuZCBtYXliZSBldmVuIGZvciBzZWxlY3Q/XG4gIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJmb3JtLW9wdGlvbi1sYWJlbFwiPntsYWJlbH08L3NwYW4+O1xufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEZvcm1JbnB1dFByb3BzIH0gZnJvbSBcIi4uL0Zvcm1Db21wb25lbnRJbm5lclwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi8uLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbi8qKlxuICogQ29udmVydHMgcHJvcHMgcGFzc2VkIGJ5IFZ1bGNhbiB0byBhbiBIVE1MIElucHV0XG4gKiBAc2VlIHBhY2thZ2VzL3Z1bGNhbi11aS1ib290c3RyYXAvbGliL2NvbXBvbmVudHMvZm9ybXMvRm9ybUl0ZW0uanN4IGluIFZ1bGNhblxuICogQHBhcmFtIHBhcmFtMFxuICogQHJldHVybnNcbiAqL1xuY29uc3QgSFRNTElucHV0QWRhcHRlciA9IChwcm9wczogRm9ybUlucHV0UHJvcHMgJiB7IHR5cGU6IHN0cmluZyB9KSA9PiB7XG4gIGNvbnN0IENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IHsgaW5wdXRQcm9wZXJ0aWVzIH0gPSBwcm9wcztcbiAgY29uc3QgeyBsYWJlbCwgbmFtZSwgLi4ub3RoZXJJbnB1dFByb3BlcnRpZXMgfSA9IGlucHV0UHJvcGVydGllcztcblxuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnRzLkZvcm1JdGVtXG4gICAgICBuYW1lPXtuYW1lfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgaW5wdXRQcm9wZXJ0aWVzPXtpbnB1dFByb3BlcnRpZXN9XG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIHsuLi5vdGhlcklucHV0UHJvcGVydGllc31cbiAgICAgICAgaWQ9e25hbWV9IC8vIG5lZWRlZCBmb3IgYWNjZXNzaWJpbGl0eS4gTk9URTogd2UgbWlnaHQgbmVlZCB0byB1c2UgXCJjb250ZXh0XCIgYXMgYSBwcmVmaXggd2hlbiBoYXZpbmdcbiAgICAgICAgLy8gbXVsdGlwbGUgZm9ybXMgZm9yIHRoZSBzYW1lIGtpbmQgb2YgZGF0YVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB0eXBlPXtwcm9wcy50eXBlfVxuICAgICAgLz5cbiAgICA8L0NvbXBvbmVudHMuRm9ybUl0ZW0+XG4gICk7XG59OyAvLyBUT0RPOiBtaWdodCBuZWVkIHNvbWUgc2FuaXRpemF0aW9uXG4vLyBGb3IgY29uc2lzdGVuY3kgd2l0aCBWdWxjYW4gTWV0ZW9yIHVpIGJvb3RzdHJhcCBhbmQgdWkgbWF0ZXJpYWxcbi8vwqBAc2VlIHBhY2thZ2VzL3Z1bGNhbi11aS1ib290c3RyYXAvbGliL2NvbXBvbmVudHMvZm9ybXMvRm9ybUl0ZW0uanN4XG5leHBvcnQgY29uc3QgRm9ybUl0ZW0gPSAoXG4gIHByb3BzOiBGb3JtSW5wdXRQcm9wc1tcIml0ZW1Qcm9wZXJ0aWVzXCJdICZcbiAgICBQaWNrPEZvcm1JbnB1dFByb3BzW1wiaW5wdXRQcm9wZXJ0aWVzXCJdLCBcImxhYmVsXCIgfCBcIm5hbWVcIj5cbikgPT4ge1xuICBjb25zdCB7IGlucHV0UHJvcGVydGllcywgbGFiZWwsIG5hbWUgfSA9IHByb3BzO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtgZm9ybS1pdGVtICR7bmFtZX1gfT5cbiAgICAgIDxsYWJlbCBodG1sRm9yPXtuYW1lfT57bGFiZWx9PC9sYWJlbD5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmNvbnN0IEhUTUxTZWxlY3RBZGFwdGVyID0gKHByb3BzOiBGb3JtSW5wdXRQcm9wcykgPT4ge1xuICBjb25zdCB7IGlucHV0UHJvcGVydGllcywgb3B0aW9ucyA9IFtdIH0gPSBwcm9wcztcbiAgY29uc3QgeyBsYWJlbCwgbmFtZSB9ID0gaW5wdXRQcm9wZXJ0aWVzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSFRNTFNlbGVjdEFkYXBhdGVyIG5vdCB5ZXQgc3VwcG9ydGluZyBmdW5jdGlvbmFsIG9wdGlvbnNcIik7XG5cbiAgY29uc3QgQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50cy5Gb3JtSXRlbVxuICAgICAgbmFtZT17bmFtZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGlucHV0UHJvcGVydGllcz17aW5wdXRQcm9wZXJ0aWVzfVxuICAgID5cbiAgICAgIHsvKiogVE9ETzogd2hpdGVsaXN0aW5nIGZlYXR1cmUgc2hvdWxkIGJlIHNtYXJ0ZXIgdG8gZGlmZmVyZW50aWF0ZSBzZWxlY3QgYW5kIGlucHV0ICovfVxuICAgICAgPHNlbGVjdFxuICAgICAgICB7Li4uKGlucHV0UHJvcGVydGllcyBhcyB1bmtub3duIGFzIFJlYWN0LkhUTUxQcm9wczxIVE1MU2VsZWN0RWxlbWVudD4pfVxuICAgICAgPlxuICAgICAgICB7b3B0aW9ucy5tYXAoKHsgbGFiZWwsIHZhbHVlIH0pID0+IChcbiAgICAgICAgICA8b3B0aW9uIGtleT17dmFsdWV9IGxhYmVsPXtsYWJlbH0gdmFsdWU9e3ZhbHVlfT48L29wdGlvbj5cbiAgICAgICAgKSl9XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L0NvbXBvbmVudHMuRm9ybUl0ZW0+XG4gICk7XG59O1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnREZWZhdWx0ID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJ0ZXh0XCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50UGFzc3dvcmQgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cInBhc3N3b3JkXCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50TnVtYmVyID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJudW1iZXJcIiB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRVcmwgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cInVybFwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudEVtYWlsID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJlbWFpbFwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFRleHRhcmVhID0gKHByb3BzKSA9PiA8dGV4dGFyZWEgey4uLnByb3BzfSAvPjtcbi8vIFRPRE86IGF0IHRoZSBtb21lbnQgd2UgdXNlIGEgc2VsZWN0IGluc3RlYWRcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50Q2hlY2tib3ggPSAocHJvcHMpID0+IChcbiAgPEhUTUxTZWxlY3RBZGFwdGVyIHR5cGU9XCJjaGVja2JveFwiIHsuLi5wcm9wc30gLz5cbik7XG4vLyBUT0RPOiBhdG0gd2UgdXNlIGEgc2VsZWN0IG11bHRpcGxlIGluc3RlYWQgb2YgY2hlY2tib3hlc1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRDaGVja2JveEdyb3VwID0gKHByb3BzKSA9PiAoXG4gIDxGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGUgey4uLnByb3BzfSAvPlxuKTtcbi8vIFRPRE86IGF0bSB3ZSB1c2UgYSBzZWxlY3QgaW5zdGVhZCBvZiByYWRpb1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRSYWRpb0dyb3VwID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgaW5wdXRQcm9wZXJ0aWVzLCBvcHRpb25zID0gW10gfSA9IHByb3BzO1xuICBjb25zdCB7IGxhYmVsLCBuYW1lIH0gPSBpbnB1dFByb3BlcnRpZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYWRpb0dyb3VwIG5vdCB5ZXQgc3VwcG9ydGluZyBmdW5jdGlvbmFsIG9wdGlvbnNcIik7XG5cbiAgY29uc3QgQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50cy5Gb3JtSXRlbVxuICAgICAgbmFtZT17bmFtZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGlucHV0UHJvcGVydGllcz17aW5wdXRQcm9wZXJ0aWVzfVxuICAgID5cbiAgICAgIHsvKiogVE9ETzogd2hpdGVsaXN0aW5nIGZlYXR1cmUgc2hvdWxkIGJlIHNtYXJ0ZXIgdG8gZGlmZmVyZW50aWF0ZSBzZWxlY3QgYW5kIGlucHV0ICovfVxuICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgLy8gTk9URTogb3B0aW9uIGNhbiBhbHNvIGhhdmUgY3VzdG9tIHZhbHVlcywgdXNlZCBieSB0aGUgRm9ybU9wdGlvbkxhYmVsIGNvbXBvbmVudFxuICAgICAgICBjb25zdCB7IHZhbHVlLCBsYWJlbCB9ID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxkaXYga2V5PXt2YWx1ZX0gY2xhc3NOYW1lPVwiZm9ybS1yYWRpby1ncm91cC1yYWRpby1pdGVtXCI+XG4gICAgICAgICAgICA8Q29tcG9uZW50cy5Gb3JtT3B0aW9uTGFiZWwgb3B0aW9uPXtvcHRpb259IC8+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgaWQ9e3ZhbHVlfVxuICAgICAgICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICAgICAgICBrZXk9e3ZhbHVlfVxuICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgICAgfSl9XG4gICAgPC9Db21wb25lbnRzLkZvcm1JdGVtPlxuICApO1xufTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50U2VsZWN0ID0gKHByb3BzOiBGb3JtSW5wdXRQcm9wcykgPT4gKFxuICA8SFRNTFNlbGVjdEFkYXB0ZXIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGUgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIDxDb21wb25lbnRzLkZvcm1Db21wb25lbnRTZWxlY3QgbXVsdGlwbGUgey4uLnByb3BzfSAvPjtcbn07XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudERhdGUgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cImRhdGVcIiB7Li4ucHJvcHN9IC8+XG4pO1xuLypcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50RGF0ZTIgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgey4uLnByb3BzfSAvPlxuKTtcbiovXG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudERhdGVUaW1lID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFRpbWUgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cInRpbWVcIiB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRTdGF0aWNUZXh0ID0gKHByb3BzKSA9PiA8aW5wdXQgZGlzYWJsZWQgey4uLnByb3BzfSAvPjtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50TGlrZXJ0ID0gKHByb3BzKSA9PlxuICBcIkxpa2VydCBjb21wb25lbnQgbm90IHlldCBpbXBsZW1lbnRlZFwiO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRBdXRvY29tcGxldGUgPSAocHJvcHMpID0+XG4gIFwiQXV0b2NvbXBsZXRlIGNvbXBvbmVudCBub3QgeWV0IGltcGxlbWVudGVkXCI7XG4vL2V4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGUgPSAocHJvcHMpID0+XG4vLyAgXCJNdWx0aUF1dG9jb21wbGV0ZSBjb21wb25lbnQgbm90IHlldCBpbXBsZW1lbnRlZFwiO1xuIiwiLyoqXG4gKlxuICogLy8gQ29waWVkIGZvciBib290c3RyYXAgcGFja2FnZVxuICogLy8gVE9ETzogZmluZCBhIG1vcmUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvblxuICpcbiAqIElkZWFsbHkgZm9yIHN1Y2ggYSByaWNoIGNvbXBvbmVudCB3ZSBzaG91bGQgYWxzbyBleHBvc2VcbiAqIGhvb2tzIGFuZCBpbnRlcm5hbCBsb2dpYyBzbyB1c2VycyBjYW4gYnVpbGQgdGhlaXIgb3duXG4gKi9cbmltcG9ydCB7IEFzeW5jVHlwZWFoZWFkIH0gZnJvbSBcInJlYWN0LWJvb3RzdHJhcC10eXBlYWhlYWRcIjsgLy8gRVMyMDE1XG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbi8vIFdlIGRvbid0IGF1dG8tZXhwYW5kIHF1ZXJpZXMgaW4gVnVsY2FuIE5QTSwgc2luY2Ugd2UgZG9uJ3QgdXNlIHRoZSByZWdpc3RyeSBwYXR0ZXJuXG4vLyBhbnltb3JlLiBJbnN0ZWFkLCBwcm92aWRlIHRoZSByaWdodCBmcmFnbWVudHMgZGlyZWN0bHksIHVzaW5nIGNvbXBvc2l0aW9uIHdpdGggc3RyaW5nIHRlbXBsYXRlcy5cbi8vaW1wb3J0IHsgZXhwYW5kUXVlcnlGcmFnbWVudHMgfSBmcm9tIFwibWV0ZW9yL3Z1bGNhbjpjb3JlXCI7XG5pbXBvcnQgeyB1c2VMYXp5UXVlcnkgfSBmcm9tIFwiQGFwb2xsby9jbGllbnRcIjtcbmltcG9ydCBncWwgZnJvbSBcImdyYXBocWwtdGFnXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uLy4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IEZvcm1JbnB1dFByb3BzIH0gZnJvbSBcIi4uL0Zvcm1Db21wb25lbnRJbm5lclwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi4vRm9ybUNvbnRleHRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXRvY29tcGxldGVNdWx0aXBsZVByb3BzIGV4dGVuZHMgRm9ybUlucHV0UHJvcHMge31cbmV4cG9ydCBjb25zdCBBdXRvY29tcGxldGVNdWx0aXBsZSA9IChwcm9wczogQXV0b2NvbXBsZXRlTXVsdGlwbGVQcm9wcykgPT4ge1xuICAvLyBUT0RPOiBzb21lIHByb3BzIGFyZSBub3cgY29tbWluZyBmcm9tIHRoZSBjb250ZXh0XG4gIGNvbnN0IHtcbiAgICBxdWVyeURhdGEsXG4gICAgLy91cGRhdGVDdXJyZW50VmFsdWVzLFxuICAgIHJlZkZ1bmN0aW9uLFxuICAgIHBhdGgsXG4gICAgaW5wdXRQcm9wZXJ0aWVzID0ge30sXG4gICAgaXRlbVByb3BlcnRpZXMgPSB7fSxcbiAgICBhdXRvY29tcGxldGVRdWVyeSxcbiAgICBvcHRpb25zRnVuY3Rpb24sXG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7IHVwZGF0ZUN1cnJlbnRWYWx1ZXMgfSA9IHVzZUZvcm1Db250ZXh0KCk7XG5cbiAgY29uc3QgQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgLy8gTWVyZ2VXaXRoQ29tcG9uZW50cyBzaG91bGQgYmUgaGFuZGxlZCBhdCB0aGUgRm9ybSBsZXZlbFxuICAvLyBieSBjcmVhdGluZyBhIG5ldyBWdWxjYW5Db21wb25lbnRzIGNvbnRleHQgdGhhdCBtZXJnZXMgZGVmYXVsdCBjb21wb25lbnRzXG4gIC8vIGFuZCBjb21wb25lbnRzIHBhc3NlZCB2aWEgcHJvcHNcbiAgLy9jb25zdCBDb21wb25lbnRzID0gbWVyZ2VXaXRoQ29tcG9uZW50cyhmb3JtQ29tcG9uZW50cyk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgbGFiZWwgfSA9IGlucHV0UHJvcGVydGllcztcblxuICAvLyBzdG9yZSBjdXJyZW50IGF1dG9jb21wbGV0ZSBxdWVyeSBzdHJpbmcgaW4gbG9jYWwgY29tcG9uZW50IHN0YXRlXG4gIGNvbnN0IFtxdWVyeVN0cmluZywgc2V0UXVlcnlTdHJpbmddID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuXG4gIC8vIGdldCBjb21wb25lbnQncyBhdXRvY29tcGxldGUgcXVlcnkgYW5kIHVzZSBpdCB0byBsb2FkIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uc1xuICAvLyBub3RlOiB3ZSB1c2UgdXNlTGF6eVF1ZXJ5IGJlY2F1c2VcbiAgLy8gd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIHRoZSBxdWVyeSB1bnRpbCB0aGUgdXNlciBoYXMgYWN0dWFsbHkgdHlwZWQgaW4gc29tZXRoaW5nXG4gIGNvbnN0IFtsb2FkQXV0b2NvbXBsZXRlT3B0aW9ucywgeyBsb2FkaW5nLCBlcnJvciwgZGF0YSB9XSA9IHVzZUxhenlRdWVyeShcbiAgICBncWwoLypleHBhbmRRdWVyeUZyYWdtZW50cygqLyBhdXRvY29tcGxldGVRdWVyeSgpIC8qKSovKSxcbiAgICB7XG4gICAgICB2YXJpYWJsZXM6IHsgcXVlcnlTdHJpbmcgfSxcbiAgICB9XG4gICk7XG5cbiAgaWYgKGVycm9yKSB7XG4gICAgLy8gVE9ETzogcHJvYmFibHkgbm90IHRoZSBiZXN0IHdheSB0byBkaXNwbGF0IHRoZSBlcnJvclxuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgfVxuICAvLyBhcHBseSBvcHRpb25zIGZ1bmN0aW9uIHRvIGRhdGEgdG8gZ2V0IHN1Z2dlc3Rpb25zIGluIHsgdmFsdWUsIGxhYmVsIH0gcGFpcnNcbiAgY29uc3QgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGRhdGEgJiYgb3B0aW9uc0Z1bmN0aW9uKHsgZGF0YSB9KTtcblxuICAvLyBhcHBseSBzYW1lIGZ1bmN0aW9uIHRvIGxvYWRlZCBkYXRhOyBmaWx0ZXIgYnkgY3VycmVudCB2YWx1ZSB0byBhdm9pZCBkaXNwbGF5aW5nIGFueVxuICAvLyBleHRyYSB1bndhbnRlZCBpdGVtcyBpZiBmaWVsZC1sZXZlbCBkYXRhIGxvYWRpbmcgbG9hZGVkIHRvbyBtYW55IGl0ZW1zXG4gIGNvbnN0IHNlbGVjdGVkSXRlbXMgPVxuICAgIHF1ZXJ5RGF0YSAmJlxuICAgIG9wdGlvbnNGdW5jdGlvbih7IGRhdGE6IHF1ZXJ5RGF0YSB9KS5maWx0ZXIoKGQpID0+XG4gICAgICAodmFsdWUgYXMgQXJyYXk8YW55PikuaW5jbHVkZXMoZC52YWx1ZSlcbiAgICApO1xuXG4gIC8vIGNvbnNvbGUubG9nKHF1ZXJ5RGF0YSlcbiAgLy8gY29uc29sZS5sb2cocXVlcnlEYXRhICYmIG9wdGlvbnNGdW5jdGlvbih7IGRhdGE6IHF1ZXJ5RGF0YSB9KSk7XG4gIC8vIGNvbnNvbGUubG9nKHZhbHVlKVxuICAvLyBjb25zb2xlLmxvZyhzZWxlY3RlZEl0ZW1zKVxuXG4gIHJldHVybiAoXG4gICAgPENvbXBvbmVudHMuRm9ybUl0ZW1cbiAgICAgIHsuLi5wcm9wc30gLypwYXRoPXtwYXRofSBsYWJlbD17bGFiZWx9IHsuLi5pdGVtUHJvcGVydGllc30qL1xuICAgICAgbmFtZT17cGF0aH1cbiAgICA+XG4gICAgICB7LyoqIEB0cy1pZ25vcmUgKi99XG4gICAgICA8QXN5bmNUeXBlYWhlYWRcbiAgICAgICAgey4uLmlucHV0UHJvcGVydGllc31cbiAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgb25DaGFuZ2U9eyhzZWxlY3RlZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gc2VsZWN0ZWQubWFwKFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBUeXBpbmcgaXMgd3JvbmcgZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICAoeyB2YWx1ZSB9KSA9PiB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQ3VycmVudFZhbHVlcyh7IFtwYXRoXTogc2VsZWN0ZWRJZHMgfSk7XG4gICAgICAgIH19XG4gICAgICAgIG9wdGlvbnM9e2F1dG9jb21wbGV0ZU9wdGlvbnN9XG4gICAgICAgIGlkPXtwYXRofVxuICAgICAgICAvLyBwYXNzaW5nIGlkIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLCB3ZSBuZWVkIGlucHV0IHByb3BzXG4gICAgICAgIGlucHV0UHJvcHM9e3sgaWQ6IHBhdGggfX1cbiAgICAgICAgcmVmPXtyZWZGdW5jdGlvbn1cbiAgICAgICAgb25TZWFyY2g9eyhxdWVyeVN0cmluZykgPT4ge1xuICAgICAgICAgIHNldFF1ZXJ5U3RyaW5nKHF1ZXJ5U3RyaW5nKTtcbiAgICAgICAgICBsb2FkQXV0b2NvbXBsZXRlT3B0aW9ucygpO1xuICAgICAgICB9fVxuICAgICAgICBpc0xvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZEl0ZW1zfVxuICAgICAgLz5cbiAgICA8L0NvbXBvbmVudHMuRm9ybUl0ZW0+XG4gICk7XG59O1xuXG4vL3JlZ2lzdGVyQ29tcG9uZW50KFwiRm9ybUNvbXBvbmVudE11bHRpQXV0b2NvbXBsZXRlXCIsIE11bHRpQXV0b2NvbXBsZXRlKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWJvb3RzdHJhcC10eXBlYWhlYWRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZ3JhcGhxbC10YWdcIik7IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG4vLyBUT0RPOiB3aGl0ZWxpc3QgSFRNTEJ1dHRvbiBwcm9wc1xuZXhwb3J0IGNvbnN0IEJ1dHRvbjogUmVhY3QuRkMgPSAoeyBjaGlsZHJlbiwgLi4ucHJvcHMgfSkgPT4gKFxuICA8YnV0dG9uIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYnV0dG9uPlxuKTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbi8vIEBzZWUgaHR0cHM6Ly9kb2NreWFyZC5jb20vYmxvZy8yMDIwLzAzLzAyL2FjY2Vzc2libGUtbG9hZGluZy1pbmRpY2F0b3Jzd2l0aC1uby1leHRyYS1lbGVtZW50c1xuZXhwb3J0IGNvbnN0IExvYWRpbmcgPSAoKSA9PiAoXG4gIDxzcGFuIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYnVzeT1cInRydWVcIj5cbiAgICBMb2FkaW5nLi4uXG4gIDwvc3Bhbj5cbik7XG4iLCJpbXBvcnQgUmVhY3QsIHsgQ1NTUHJvcGVydGllcyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHNcIjtcblxuZXhwb3J0IGNvbnN0IExvYWRpbmdCdXR0b24gPSAoe1xuICBsb2FkaW5nLFxuICBsYWJlbCxcbiAgb25DbGljayxcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSA9IFwiXCIsXG4gIC4uLnJlc3Rcbn0pID0+IHtcbiAgY29uc3QgQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICBjb25zdCB3cmFwcGVyU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgfTtcblxuICBjb25zdCBsYWJlbFN0eWxlID0gbG9hZGluZyA/IHsgb3BhY2l0eTogMC41IH0gOiB7fTtcblxuICBjb25zdCBsb2FkaW5nU3R5bGU6IENTU1Byb3BlcnRpZXMgPSBsb2FkaW5nXG4gICAgPyB7XG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgfVxuICAgIDogeyBkaXNwbGF5OiBcIm5vbmVcIiB9O1xuXG4gIHJldHVybiAoXG4gICAgPENvbXBvbmVudHMuQnV0dG9uXG4gICAgICBjbGFzc05hbWU9e2Bsb2FkaW5nLWJ1dHRvbiAke1xuICAgICAgICBsb2FkaW5nID8gXCJsb2FkaW5nLWJ1dHRvbi1sb2FkaW5nXCIgOiBcImxvYWRpbmctYnV0dG9uLW5vdGxvYWRpbmdcIlxuICAgICAgfSAke2NsYXNzTmFtZX1gfVxuICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgIHsuLi5yZXN0fVxuICAgID5cbiAgICAgIDxzcGFuIHN0eWxlPXt3cmFwcGVyU3R5bGV9PlxuICAgICAgICA8c3BhbiBzdHlsZT17bGFiZWxTdHlsZX0+e2xhYmVsIHx8IGNoaWxkcmVufTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9e2xvYWRpbmdTdHlsZX0+XG4gICAgICAgICAgPENvbXBvbmVudHMuTG9hZGluZyAvPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9Db21wb25lbnRzLkJ1dHRvbj5cbiAgKTtcbn07XG4iLCIvKlxuXG5FeGFtcGxlIFVzYWdlXG5cbjxDb21wb25lbnRzLk11dGF0aW9uQnV0dG9uXG4gIGxhYmVsPVwiQ2FuY2VsIFN1YnNjcmlwdGlvblwiXG4gIHZhcmlhbnQ9XCJwcmltYXJ5XCJcbiAgbXV0YXRpb25PcHRpb25zPXt7XG4gICAgbmFtZTogJ2NhbmNlbFN1YnNjcmlwdGlvbicsXG4gICAgYXJnczogeyBib29raW5nSWQ6ICdTdHJpbmcnIH0sXG4gICAgZnJhZ21lbnROYW1lOiAnQm9va2luZ3NTdHJpcGVEYXRhRnJhZ21lbnQnLFxuICB9fVxuICBtdXRhdGlvbkFyZ3VtZW50cz17eyBib29raW5nSWQ6IGJvb2tpbmcuX2lkIH19XG4gIHN1Ym1pdENhbGxiYWNrPXsoKSA9PiB7fX1cbiAgc3VjY2Vzc0NhbGxiYWNrPXtyZXN1bHQgPT4geyBjb25zb2xlLmxvZyhyZXN1bHQpIH19XG4vPlxuXG4qL1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBEb2N1bWVudE5vZGUgfSBmcm9tIFwiZ3JhcGhxbFwiO1xuaW1wb3J0IHsgZ3FsLCBNdXRhdGlvbkhvb2tPcHRpb25zLCB1c2VNdXRhdGlvbiB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHNcIjtcbi8vIGltcG9ydCB3aXRoTXV0YXRpb24gZnJvbSAnLi4vY29udGFpbmVycy9yZWdpc3RlcmVkTXV0YXRpb24nO1xuXG4vLyBUT0RPOlxuLyoqXG4gKiBEaWZmZXJlbmNlIHdpdGggVnVsY2FuIE1ldGVvcjogdGhlcmUgaXMgbm9cbiAqIHJlZ2lzdGVyZWQgbXV0YXRpb24gYW55bW9yZSxcbiAqIHNvIHlvdSBuZWVkIHRvIHBhc3MgeW91ciBtdXRhdGlvbnMgZXhwbGljaXRlbHksIHVzaW5nIGdyYXBocWxcbiAqL1xuLypcbmV4cG9ydCBjbGFzcyBNdXRhdGlvbkJ1dHRvbiBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmJ1dHRvbiA9IHdpdGhNdXRhdGlvbihwcm9wcy5tdXRhdGlvbk9wdGlvbnMpKE11dGF0aW9uQnV0dG9uSW5uZXIpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IENvbXBvbmVudCA9IHRoaXMuYnV0dG9uO1xuICAgIHJldHVybiA8Q29tcG9uZW50IHsuLi50aGlzLnByb3BzfSAvPjtcbiAgfVxufSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgTXV0YXRpb25CdXR0b25Qcm9wcyB7XG4gIC8qKlxuICAgKiBOT1RFOiBpbiBWdWxjYW4gTWV0ZW9yIHlvdSBoYWQgdG8gd3JpdGU6XG4gICAqIG11dGF0aW9uT3B0aW9uczogeyBuYW1lOiBcImZvb2JhclwiLCBtdXRhdGlvbk9wdGlvbnM6IHtyZWZldGNoUXVlcmllczpbXCJoZWxsb1wiXX19XG4gICAqXG4gICAqIEluIFZ1bGNhbiBOZXh0LCB5b3UgY2FuIG9ubHkgcGFzcyB0aGUgXCJtdXRhdGlvbk9wdGlvbnNcIiBvYmplY3Q6XG4gICAqIG11dGF0aW9uT3B0aW9uczogeyByZWZldGNoUXVlcmllczpbXCJoZWxsb1wiXX1cbiAgICogYW5kIHRoZSBtdXRhdGlvbiBpcyBwcm92aWRlZCB2aWEgdGhlIG5ldyBcIm11dGF0aW9uXCIgcHJvcFxuICAgKi9cbiAgbXV0YXRpb25PcHRpb25zOiBNdXRhdGlvbkhvb2tPcHRpb25zO1xuICAvKipcbiAgICogQGV4YW1wbGVcbiAgICBtdXRhdGlvbjogZ3FsYFxuICAgICAgbXV0YXRpb24gc2FtcGxlTXV0YXRpb24oJGlucHV0OiBJbnB1dCkge1xuICAgICAgICBoZWxsb1xuICAgICAgfVxuICAgIGAsXG4gICAqL1xuICBtdXRhdGlvbjogc3RyaW5nIHwgRG9jdW1lbnROb2RlO1xuICAvKiogVmFyaWFibGVzIHBhc3NlZCB0byB0aGUgbXV0YXRpb24gKE5PVEU6IHdlIGNhbid0IHBhc3Mgb3RoZXIgb3B0aW9ucyBhdCB0aGUgbW9tZW50KSAqL1xuICBtdXRhdGlvbkFyZ3VtZW50czogTXV0YXRpb25Ib29rT3B0aW9uczxhbnk+W1widmFyaWFibGVzXCJdO1xuICBzdWJtaXRDYWxsYmFjazogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHN1Y2Nlc3NDYWxsYmFjazogKHJlczogYW55KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgZXJyb3JDYWxsYmFjazogKGVycjogYW55KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgLy8gTm93IGlzb2xhdGVkIGludG8gdGhlaXIgb3duIG9iamVjdCB0byBhdm9pZCBuZWVkZWQgdG8gZXhwbGljaXRlbHkgcGljay9vbWl0XG4gIGxvYWRpbmdCdXR0b25Qcm9wczoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gIH07XG59XG5leHBvcnQgY29uc3QgTXV0YXRpb25CdXR0b24gPSAocHJvcHM6IE11dGF0aW9uQnV0dG9uUHJvcHMpID0+IHtcbiAgY29uc3QgQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPGFueSB8IHVuZGVmaW5lZD4oKTtcblxuICBjb25zdCB7XG4gICAgLy9tdXRhdGlvbk9wdGlvbnMsXG4gICAgbXV0YXRpb24sXG4gICAgbXV0YXRpb25Bcmd1bWVudHMsXG4gICAgbG9hZGluZ0J1dHRvblByb3BzLFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IG11dGF0aW9uQXNOb2RlID1cbiAgICB0eXBlb2YgbXV0YXRpb24gPT09IFwic3RyaW5nXCJcbiAgICAgID8gZ3FsYFxuICAgICAgICAgICR7bXV0YXRpb259XG4gICAgICAgIGBcbiAgICAgIDogbXV0YXRpb247XG4gIGNvbnN0IFttdXRhdGlvbkZ1bmNdID0gdXNlTXV0YXRpb24obXV0YXRpb25Bc05vZGUsIHtcbiAgICB2YXJpYWJsZXM6IG11dGF0aW9uQXJndW1lbnRzLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVDbGljayA9IGFzeW5jIChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgc2V0RXJyb3IodW5kZWZpbmVkKTtcbiAgICBjb25zdCB7XG4gICAgICAvL211dGF0aW9uT3B0aW9ucyxcbiAgICAgIHN1Ym1pdENhbGxiYWNrLFxuICAgICAgc3VjY2Vzc0NhbGxiYWNrLFxuICAgICAgZXJyb3JDYWxsYmFjayxcbiAgICB9ID0gcHJvcHM7XG4gICAgLy9jb25zdCBtdXRhdGlvbk5hbWUgPSBtdXRhdGlvbk9wdGlvbnMubmFtZTtcbiAgICAvL2NvbnN0IG11dGF0aW9uID0gdGhpcy5wcm9wc1ttdXRhdGlvbk5hbWVdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdWJtaXRDYWxsYmFjaykge1xuICAgICAgICBhd2FpdCBzdWJtaXRDYWxsYmFjaygpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbXV0YXRpb25GdW5jKCk7XG4gICAgICBpZiAoc3VjY2Vzc0NhbGxiYWNrKSB7XG4gICAgICAgIGF3YWl0IHN1Y2Nlc3NDYWxsYmFjayhyZXN1bHQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBUT0RPOiBtYXkgbm90IHdvcmsgYmVjYXVzZSB0aGUgbXV0YXRpb25GdW5jIG1heSBub3QgdGhyb3cgaW4gY2FzZSBvZiBlcnJvclxuICAgICAgc2V0RXJyb3IoZXJyb3IpO1xuICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgYXdhaXQgZXJyb3JDYWxsYmFjayhlcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIG11dGF0aW9uKG11dGF0aW9uQXJndW1lbnRzKVxuICAgIC8vICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAvLyAgICAgdGhpcy5zZXRTdGF0ZSh7IGxvYWRpbmc6IGZhbHNlIH0pO1xuICAgIC8vICAgICBpZiAoc3VjY2Vzc0NhbGxiYWNrKSB7XG4gICAgLy8gICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc3VsdCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0pXG4gICAgLy8gICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgIC8vICAgICB0aGlzLnNldFN0YXRlKHsgbG9hZGluZzogZmFsc2UgfSk7XG4gICAgLy8gICAgIGlmIChlcnJvckNhbGxiYWNrKSB7XG4gICAgLy8gICAgICAgZXJyb3JDYWxsYmFjayhlcnJvcik7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0pO1xuICB9O1xuXG4gIC8vY29uc3QgbXV0YXRpb25OYW1lID0gdGhpcy5wcm9wcy5tdXRhdGlvbk9wdGlvbnMubmFtZTtcblxuICBjb25zdCBsb2FkaW5nQnV0dG9uID0gKFxuICAgIDxDb21wb25lbnRzLkxvYWRpbmdCdXR0b25cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgIHsuLi5sb2FkaW5nQnV0dG9uUHJvcHN9XG4gICAgLz5cbiAgKTtcblxuICBpZiAoZXJyb3IpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPENvbXBvbmVudHMuVG9vbHRpcFRyaWdnZXIgdHJpZ2dlcj17bG9hZGluZ0J1dHRvbn0gZGVmYXVsdFNob3c9e3RydWV9PlxuICAgICAgICB7ZXJyb3IubWVzc2FnZS5yZXBsYWNlKFwiR3JhcGhRTCBlcnJvcjogXCIsIFwiXCIpfVxuICAgICAgPC9Db21wb25lbnRzLlRvb2x0aXBUcmlnZ2VyPlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGxvYWRpbmdCdXR0b247XG59O1xuIiwiaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbi8vIGltcG9ydCB7IEhlbG1ldCB9IGZyb20gJ3JlYWN0LWhlbG1ldCc7XG4vLyBpbXBvcnQgeyByZWdpc3RlckNvbXBvbmVudCwgVXRpbHMsIGdldFNldHRpbmcsIHJlZ2lzdGVyU2V0dGluZywgSGVhZCB9IGZyb20gJ21ldGVvci92dWxjYW46bGliJztcbi8vIGltcG9ydCBjb21wb3NlIGZyb20gXCJyZWNvbXBvc2UvY29tcG9zZVwiO1xuXG4vLyByZWdpc3RlclNldHRpbmcoJ2xvZ29VcmwnLCBudWxsLCAnQWJzb2x1dGUgVVJMIGZvciB0aGUgbG9nbyBpbWFnZScpO1xuLy8gcmVnaXN0ZXJTZXR0aW5nKCd0aXRsZScsICdNeSBBcHAnLCAnQXBwIHRpdGxlJyk7XG4vLyByZWdpc3RlclNldHRpbmcoJ3RhZ2xpbmUnLCBudWxsLCAnQXBwIHRhZ2xpbmUnKTtcbi8vIHJlZ2lzdGVyU2V0dGluZygnZGVzY3JpcHRpb24nKTtcbi8vIHJlZ2lzdGVyU2V0dGluZygnc2l0ZUltYWdlJywgbnVsbCwgJ0FuIGltYWdlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBzaXRlIG9uIHNvY2lhbCBtZWRpYScpO1xuLy8gcmVnaXN0ZXJTZXR0aW5nKCdmYXZpY29uVXJsJywgJy9pbWcvZmF2aWNvbi5pY28nLCAnRmF2aWNvbiBhYnNvbHV0ZSBVUkwnKTtcblxuZXhwb3J0IGludGVyZmFjZSBIZWFkVGFnc1Byb3BzIHtcbiAgdXJsOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBpbWFnZTogc3RyaW5nO1xuICBzaXRlVXJsOiBzdHJpbmc7XG4gIGZhdmljb25Vcmw/OiBzdHJpbmc7XG59XG4vKipcbiAqXG4gKiBDcmVhdGUgYmFzaWMgc29jaWFsIG1ldGEgdGFncyBmb3IgYSBwYWdlXG4gKiAoRmFjZWJvb2ssIFR3aXR0ZXIpXG4gKlxuICogTk9URTogeW91IGFyZSByZXNwb25zaWJsZSBmb3Igd3JhcHBpbmcgdGhvc2UgdGFncyBpblxuICogbmV4dC9oZWFkLCBIZWxtZXQgb3Igd2hhdGV2ZXIgc29sdXRpb24geW91IHVzZSBmb3JcbiAqIGhlYWQgdGFncyBkZWNlbnRyYWxpemF0aW9uXG4gKlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEhlYWRUYWdzIGV4dGVuZHMgUHVyZUNvbXBvbmVudDxIZWFkVGFnc1Byb3BzPiB7XG4gIHJlbmRlcigpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIkhlYWRUYWdzIHdvbid0IHdvcmsgaW4gTmV4dC5qcywgYmVjYXVzZSBIZWFkIGRvZXNuJ3Qgc3VwcG9ydCBuZXN0aW5nLiBEZWZpbmUgbWV0YSBkaXJlY3RseSBpbiB5b3VyIGFwcCBpbnN0ZWFkLlwiXG4gICAgKTtcbiAgICBjb25zdCB7IHVybCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBzaXRlVXJsLCBmYXZpY29uVXJsIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCBpbWFnZSA9IHRoaXMucHJvcHMuaW1hZ2U7XG4gICAgLypcbiAgICBjb25zdCB1cmwgPSB1cmw7IC8vfHwgVXRpbHMuZ2V0U2l0ZVVybCgpO1xuICAgIGNvbnN0IHRpdGxlID0gdGl0bGU7IC8vfHwgZ2V0U2V0dGluZyhcInRpdGxlXCIsIFwiTXkgQXBwXCIpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247IC8qICB8fFxuICAgICAgZ2V0U2V0dGluZyhcInRhZ2xpbmVcIikgfHxcbiAgICAgIGdldFNldHRpbmcoXCJkZXNjcmlwdGlvblwiKTsgKi9cbiAgICAvLyBkZWZhdWx0IGltYWdlIG1ldGE6IGxvZ28gdXJsLCBlbHNlIHNpdGUgaW1hZ2UgZGVmaW5lZCBpbiBzZXR0aW5nc1xuICAgIC8vbGV0IGltYWdlID0gbG9nb1VybDsgLyohIWdldFNldHRpbmcoXCJzaXRlSW1hZ2VcIilcbiAgICAvLz8gZ2V0U2V0dGluZyhcInNpdGVJbWFnZVwiKVxuICAgIC8vOiBnZXRTZXR0aW5nKFwibG9nb1VybFwiKTsqL1xuXG4gICAgLy8gb3ZlcndyaXRlIGRlZmF1bHQgaW1hZ2UgaWYgb25lIGlzIHBhc3NlZCBhcyBwcm9wc1xuICAgIC8vaWYgKCEhdGhpcy5wcm9wcy5pbWFnZSkge1xuICAgIC8vICBpbWFnZSA9IHRoaXMucHJvcHMuaW1hZ2U7XG4gICAgLy99XG5cbiAgICAvLyBhZGQgc2l0ZSB1cmwgYmFzZSBpZiB0aGUgaW1hZ2UgaXMgc3RvcmVkIGxvY2FsbHlcbiAgICBpZiAoISFpbWFnZSAmJiBpbWFnZS5pbmRleE9mKFwiLy9cIikgPT09IC0xKSB7XG4gICAgICAvLyByZW1vdmUgc3RhcnRpbmcgc2xhc2ggZnJvbSBpbWFnZSBwYXRoIGlmIG5lZWRlZFxuICAgICAgaWYgKGltYWdlLmNoYXJBdCgwKSA9PT0gXCIvXCIpIHtcbiAgICAgICAgaW1hZ2UgPSBpbWFnZS5zbGljZSgxKTtcbiAgICAgIH1cbiAgICAgIGltYWdlID0gLypnZXRTaXRlVXJsKCkqLyBzaXRlVXJsICsgaW1hZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDx0aXRsZT57dGl0bGV9PC90aXRsZT5cblxuICAgICAgICA8bWV0YSBjaGFyU2V0PVwidXRmLThcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwiZGVzY3JpcHRpb25cIiBjb250ZW50PXtkZXNjcmlwdGlvbn0gLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCIgLz5cblxuICAgICAgICB7LyogZmFjZWJvb2sgKi99XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6dHlwZVwiIGNvbnRlbnQ9XCJhcnRpY2xlXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZzp1cmxcIiBjb250ZW50PXt1cmx9IC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6aW1hZ2VcIiBjb250ZW50PXtpbWFnZX0gLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZzp0aXRsZVwiIGNvbnRlbnQ9e3RpdGxlfSAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmRlc2NyaXB0aW9uXCIgY29udGVudD17ZGVzY3JpcHRpb259IC8+XG5cbiAgICAgICAgey8qIHR3aXR0ZXIgKi99XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ0d2l0dGVyOmNhcmRcIiBjb250ZW50PVwic3VtbWFyeVwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ0d2l0dGVyOmltYWdlOnNyY1wiIGNvbnRlbnQ9e2ltYWdlfSAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjp0aXRsZVwiIGNvbnRlbnQ9e3RpdGxlfSAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpkZXNjcmlwdGlvblwiIGNvbnRlbnQ9e2Rlc2NyaXB0aW9ufSAvPlxuXG4gICAgICAgIDxsaW5rIHJlbD1cImNhbm9uaWNhbFwiIGhyZWY9e3VybH0gLz5cbiAgICAgICAgPGxpbmtcbiAgICAgICAgICAvL25hbWU9XCJmYXZpY29uXCJcbiAgICAgICAgICByZWw9XCJzaG9ydGN1dCBpY29uXCJcbiAgICAgICAgICBocmVmPXtmYXZpY29uVXJsIHx8IFwiL2Zhdmljb24uaWNvXCJ9XG4gICAgICAgIC8+XG5cbiAgICAgICAgey8qKlxuICogIE5vdCBuZWVkZWQgYXMgd2UgZXhwZWN0IHRoZSBlbmQgYXBwbGljYXRpb24gdXNlIGVpdGhlciBIZWxtZXQgYXQgYXBwIGxldmVsXG4gKiBvciBuZXh0L2hlYWRcbiAqIFxuICAgICAgICAgIHtIZWFkLm1ldGEubWFwKCh0YWcsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8bWV0YSBrZXk9e2luZGV4fSB7Li4udGFnfSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICAgIHtIZWFkLmxpbmsubWFwKCh0YWcsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8bGluayBrZXk9e2luZGV4fSB7Li4udGFnfSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICAgIHtIZWFkLnNjcmlwdC5tYXAoKHRhZywgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxzY3JpcHQga2V5PXtpbmRleH0gey4uLnRhZ30+XG4gICAgICAgICAgICAgIHt0YWcuY29udGVudHN9XG4gICAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgICApKX1cblxuICAgICAgICB7SGVhZC5jb21wb25lbnRzLm1hcCgoY29tcG9uZW50T3JBcnJheSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBsZXQgSGVhZENvbXBvbmVudDtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnRPckFycmF5KSkge1xuICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudCwgLi4uaG9jc10gPSBjb21wb25lbnRPckFycmF5O1xuICAgICAgICAgICAgSGVhZENvbXBvbmVudCA9IGNvbXBvc2UoLi4uaG9jcykoY29tcG9uZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgSGVhZENvbXBvbmVudCA9IGNvbXBvbmVudE9yQXJyYXk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiA8SGVhZENvbXBvbmVudCBrZXk9e2luZGV4fSAvPjtcbiAgICAgICAgfSl9XG4gKi99XG4gICAgICA8Lz5cbiAgICApO1xuICB9XG59XG5cbi8qXG5IZWFkVGFncy5wcm9wVHlwZXMgPSB7XG4gIHVybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBpbWFnZTogUHJvcFR5cGVzLnN0cmluZyxcbn07XG4qL1xuIiwiLypcblxuY2hpbGRyZW46IHRoZSBjb250ZW50IG9mIHRoZSB0b29sdGlwXG50cmlnZ2VyOiB0aGUgY29tcG9uZW50IHRoYXQgdHJpZ2dlcnMgdGhlIHRvb2x0aXAgdG8gYXBwZWFyXG5cbiovXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG4vLyBpbXBvcnQgVG9vbHRpcCBmcm9tICdyZWFjdC1ib290c3RyYXAvVG9vbHRpcCc7XG4vLyBpbXBvcnQgT3ZlcmxheVRyaWdnZXIgZnJvbSAncmVhY3QtYm9vdHN0cmFwL092ZXJsYXlUcmlnZ2VyJztcblxuLyoqXG4gKiBEaXNwbGF5IGEgdG9vbHRpcCB3aGVuIGhvdmVyaW5nIGFuIGl0ZW1cbiAqL1xuZXhwb3J0IGNvbnN0IFRvb2x0aXBUcmlnZ2VyID0gKHtcbiAgY2hpbGRyZW4sXG4gIHRyaWdnZXIsXG4gIC8vcGxhY2VtZW50ID0gXCJ0b3BcIixcbiAgLy8uLi5yZXN0XG59KSA9PiB7XG4gIHJldHVybiA8ZGl2IHRpdGxlPXtjaGlsZHJlbn0+e3RyaWdnZXJ9PC9kaXY+O1xuICAvKlxuICBjb25zdCB0b29sdGlwID0gPFRvb2x0aXAgaWQ9XCJ0b29sdGlwXCI+e2NoaWxkcmVufTwvVG9vbHRpcD47XG5cbiAgcmV0dXJuIChcbiAgICA8T3ZlcmxheVRyaWdnZXIgcGxhY2VtZW50PXtwbGFjZW1lbnR9IHsuLi5yZXN0fSBvdmVybGF5PXt0b29sdGlwfT5cbiAgICAgIHt0cmlnZ2VyfVxuICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICk7Ki9cbn07XG4iLCIvLyBUT0RPOiB1c2VzIHJlYWN0IGJvb3RzdHJhcCBhIGxvdCwgbmVlZCBhIHJlZmFjdG9yXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcInJlYWN0LWJvb3RzdHJhcC9Ecm9wZG93blwiO1xuaW1wb3J0IERyb3Bkb3duSXRlbSBmcm9tIFwicmVhY3QtYm9vdHN0cmFwL0Ryb3Bkb3duSXRlbVwiO1xuaW1wb3J0IERyb3Bkb3duQnV0dG9uIGZyb20gXCJyZWFjdC1ib290c3RyYXAvRHJvcGRvd25CdXR0b25cIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50c1wiO1xuLy8gaW1wb3J0IHsgTGlua0NvbnRhaW5lciB9IGZyb20gXCJyZWFjdC1yb3V0ZXItYm9vdHN0cmFwXCI7XG5cbi8qXG5cbk5vdGU6IGByZXN0YCBpcyB1c2VkIHRvIGVuc3VyZSBhdXRvLWdlbmVyYXRlZCBwcm9wcyBmcm9tIHBhcmVudCBkcm9wZG93blxuY29tcG9uZW50cyBhcmUgcHJvcGVybHkgcGFzc2VkIGRvd24gdG8gTWVudUl0ZW1cblxuKi9cbmNvbnN0IEl0ZW0gPSAoe1xuICBpbmRleCxcbiAgLy90byxcbiAgbGFiZWxJZCxcbiAgbGFiZWwsXG4gIGNvbXBvbmVudCxcbiAgY29tcG9uZW50UHJvcHMgPSB7fSxcbiAgaXRlbVByb3BzLFxuICAvL2xpbmtQcm9wcyxcbiAgLi4ucmVzdFxufTogYW55KSA9PiB7XG4gIGNvbnN0IENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGxldCBtZW51Q29tcG9uZW50O1xuXG4gIGlmIChjb21wb25lbnQpIHtcbiAgICBtZW51Q29tcG9uZW50ID0gUmVhY3QuY2xvbmVFbGVtZW50KGNvbXBvbmVudCwgY29tcG9uZW50UHJvcHMpO1xuICB9IGVsc2UgaWYgKGxhYmVsSWQpIHtcbiAgICBtZW51Q29tcG9uZW50ID0gPENvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZSBpZD17bGFiZWxJZH0gLz47XG4gIH0gZWxzZSB7XG4gICAgbWVudUNvbXBvbmVudCA9IDxzcGFuPntsYWJlbH08L3NwYW4+O1xuICB9XG5cbiAgY29uc3QgaXRlbSA9IChcbiAgICA8RHJvcGRvd25JdGVtIGV2ZW50S2V5PXtpbmRleH0gey4uLml0ZW1Qcm9wc30gey4uLnJlc3R9PlxuICAgICAge21lbnVDb21wb25lbnR9XG4gICAgPC9Ecm9wZG93bkl0ZW0+XG4gICk7XG5cbiAgLypcbiAgQGRlcHJlYWN0ZWQgSW5zdGVhZCB3cmFwIHRoZSBpdGVtIHlvdXJzZWxmIHdpdGggdGhlIHJlbGV2YW50IGxpbmtcbiAgcmV0dXJuIHRvID8gKFxuICAgIDxMaW5rQ29udGFpbmVyIHRvPXt0b30gey4uLmxpbmtQcm9wc30+XG4gICAgICB7aXRlbX1cbiAgICA8L0xpbmtDb250YWluZXI+XG4gICkgOiAoXG4gICAgaXRlbVxuICApOyovXG4gIHJldHVybiBpdGVtO1xufTtcblxuSXRlbS5wcm9wVHlwZXMgPSB7XG4gIGluZGV4OiBQcm9wVHlwZXMubnVtYmVyLCAvLyBpbmRleFxuICB0bzogUHJvcFR5cGVzLmFueSwgLy8gYSBzdHJpbmcgb3Igb2JqZWN0LCB1c2VkIHRvIGdlbmVyYXRlIHRoZSByb3V0ZXIgcGF0aCBmb3IgdGhlIG1lbnUgaXRlbVxuICBsYWJlbElkOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyBhbiBpMThuIGlkIGZvciB0aGUgaXRlbSBsYWJlbFxuICBsYWJlbDogUHJvcFR5cGVzLnN0cmluZywgLy8gaXRlbSBsYWJlbCBzdHJpbmcsIHVzZWQgaWYgaWQgaXMgbm90IHByb3ZpZGVkXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzLm9iamVjdCwgLy8gYSBjb21wb25lbnQgdG8gdXNlIGFzIG1lbnUgaXRlbVxuICBjb21wb25lbnRQcm9wczogUHJvcFR5cGVzLm9iamVjdCwgLy8gcHJvcHMgcGFzc2VkIHRvIHRoZSBjb21wb25lbnRcbiAgaXRlbVByb3BzOiBQcm9wVHlwZXMub2JqZWN0LCAvLyBwcm9wcyBmb3IgdGhlIDxNZW51SXRlbS8+IGNvbXBvbmVudFxufTtcbi8qXG5cbkEgbm9kZSBjb250YWlucyBhIG1lbnUgaXRlbSwgYW5kIG9wdGlvbmFsbHkgYSBsaXN0IG9mIGNoaWxkIGl0ZW1zXG5cbiovXG5jb25zdCBOb2RlID0gKHsgY2hpbGRyZW5JdGVtcywgLi4ucmVzdCB9KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxJdGVtIHsuLi5yZXN0fSAvPlxuICAgICAge2NoaWxkcmVuSXRlbXMgJiYgISFjaGlsZHJlbkl0ZW1zLmxlbmd0aCAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVudS1ub2RlLWNoaWxkcmVuXCI+XG4gICAgICAgICAge2NoaWxkcmVuSXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPEl0ZW0ga2V5PXtpbmRleH0gey4uLml0ZW19IC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8Lz5cbiAgKTtcbn07XG5cbk5vZGUucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbkl0ZW1zOiBQcm9wVHlwZXMuYXJyYXksIC8vIGFuIGFycmF5IG9mIGRyb3Bkb3duIGl0ZW1zIHVzZWQgYXMgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgaXRlbVxufTtcblxuY29uc3QgQm9vdHN0cmFwRHJvcGRvd24gPSAoe1xuICBsYWJlbCxcbiAgbGFiZWxJZCxcbiAgdHJpZ2dlcixcbiAgbWVudUl0ZW1zLFxuICBtZW51Q29udGVudHMsXG4gIHZhcmlhbnQgPSBcImRyb3Bkb3duXCIsXG4gIGJ1dHRvblByb3BzLFxuICAuLi5kcm9wZG93blByb3BzXG59KSA9PiB7XG4gIGNvbnN0IENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IG1lbnVCb2R5ID0gbWVudUNvbnRlbnRzXG4gICAgPyBtZW51Q29udGVudHNcbiAgICA6IG1lbnVJdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpdGVtID09PSBcImRpdmlkZXJcIikge1xuICAgICAgICAgIHJldHVybiA8RHJvcGRvd24uRGl2aWRlciBrZXk9e2luZGV4fSAvPjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gPE5vZGUgey4uLml0ZW19IGtleT17aW5kZXh9IGluZGV4PXtpbmRleH0gLz47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gIGlmICh2YXJpYW50ID09PSBcImZsYXRcIikge1xuICAgIHJldHVybiBtZW51Qm9keTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHJpZ2dlcikge1xuICAgICAgLy8gaWYgYSB0cmlnZ2VyIGNvbXBvbmVudCBoYXMgYmVlbiBwcm92aWRlZCwgdXNlIGl0XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RHJvcGRvd24gey4uLmRyb3Bkb3duUHJvcHN9PlxuICAgICAgICAgIDxEcm9wZG93bi5Ub2dnbGU+e3RyaWdnZXJ9PC9Ecm9wZG93bi5Ub2dnbGU+XG4gICAgICAgICAgPERyb3Bkb3duLk1lbnU+e21lbnVCb2R5fTwvRHJvcGRvd24uTWVudT5cbiAgICAgICAgPC9Ecm9wZG93bj5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVsc2UgZGVmYXVsdCB0byBEcm9wZG93bkJ1dHRvblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERyb3Bkb3duQnV0dG9uXG4gICAgICAgICAgey4uLmJ1dHRvblByb3BzfVxuICAgICAgICAgIHRpdGxlPXtsYWJlbElkID8gPENvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZSBpZD17bGFiZWxJZH0gLz4gOiBsYWJlbH1cbiAgICAgICAgICB7Li4uZHJvcGRvd25Qcm9wc31cbiAgICAgICAgPlxuICAgICAgICAgIHttZW51Qm9keX1cbiAgICAgICAgPC9Ecm9wZG93bkJ1dHRvbj5cbiAgICAgICk7XG4gICAgfVxuICB9XG59O1xuXG5Cb290c3RyYXBEcm9wZG93bi5wcm9wVHlwZXMgPSB7XG4gIGxhYmVsSWQ6IFByb3BUeXBlcy5zdHJpbmcsIC8vIG1lbnUgdGl0bGUvbGFiZWwgaTE4biBzdHJpbmdcbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsIC8vIG1lbnUgdGl0bGUvbGFiZWxcbiAgdHJpZ2dlcjogUHJvcFR5cGVzLm9iamVjdCwgLy8gY29tcG9uZW50IHVzZWQgYXMgbWVudSB0cmlnZ2VyICh0aGUgcGFydCB5b3UgY2xpY2sgdG8gb3BlbiB0aGUgbWVudSlcbiAgbWVudUNvbnRlbnRzOiBQcm9wVHlwZXMub2JqZWN0LCAvLyBhIGNvbXBvbmVudCBzcGVjaWZ5aW5nIHRoZSBtZW51IGNvbnRlbnRzXG4gIG1lbnVJdGVtczogUHJvcFR5cGVzLmFycmF5LCAvLyBhbiBhcnJheSBvZiBtZW51IGl0ZW1zLCB1c2VkIGlmIG1lbnVDb250ZW50cyBpcyBub3QgcHJvdmlkZWRcbiAgdmFyaWFudDogUHJvcFR5cGVzLnN0cmluZywgLy8gZHJvcGRvd24gKGRlZmF1bHQpIG9yIGZsYXRcbiAgYnV0dG9uUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsIC8vIHByb3BzIHNwZWNpZmljIHRvIHRoZSBkcm9wZG93biBidXR0b25cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJvb3RzdHJhcERyb3Bkb3duO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtYm9vdHN0cmFwL0Ryb3Bkb3duXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWJvb3RzdHJhcC9Ecm9wZG93bkl0ZW1cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtYm9vdHN0cmFwL0Ryb3Bkb3duQnV0dG9uXCIpOyIsImV4cG9ydCAqIGZyb20gXCIuL0NvbnN1bWVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Qcm92aWRlclwiO1xuIiwiLyoqXG4gKiBOT1RFOiBLRUVQIFNFUEFSQVRFRCBGUk9NIFRIRSBIT09LUyBUTyBDT05TVU1FIFRIRSBDT05URVhUXG4gKiBvdGhlcndpc2UgeW91J2xsIGVuZCB1cCB3aXRoIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBiZWNhdXNlIG9mIHRoZSBkZWZhdWx0IGNvbXBvbmVudHNcbiAqL1xuLy8gVE9ETzogd2UgbWlnaHQgbmVlZCB0byBhZGFwdCB0aGUgcHJvdmlkZXIgdG8gbWVyZ2UgaXRzIHZhbHVlIHdpdGggYSBwb3RlbnRpYWxseSBoaWdoZXIgdXAgY29udGV4dFxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQge1xuICBWdWxjYW5DdXJyZW50VXNlckNvbnRleHQsXG4gIFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dFR5cGUsXG59IGZyb20gXCIuL0NvbnRleHRcIjtcblxuLy8gU28gdGhhdCB5b3UgY2FuIG92ZXJyaWRlIG9ubHkgc29tZSBjb21wb25lbnRzIGJ5IGFkZGluZyBhbiBhZGRpdGlvbmFsIGNvbnRleHQgd2hpbGUga2VlcGluZyB0aGUgZGVmYXVsdHNcbmV4cG9ydCBjb25zdCBWdWxjYW5DdXJyZW50VXNlclByb3ZpZGVyID0gKHtcbiAgdmFsdWUsXG4gIC4uLnByb3BzXG59OiB7XG4gIHZhbHVlOiBWdWxjYW5DdXJyZW50VXNlckNvbnRleHRUeXBlO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkgPT4gKFxuICA8VnVsY2FuQ3VycmVudFVzZXJDb250ZXh0LlByb3ZpZGVyXG4gICAgdmFsdWU9e3ZhbHVlfSAvLyBtZXJnZSBwcm92aWRlZCBjb21wb25lbnRzIHNvIHRoZSB1c2VyIGNhbiBwcm92aWRlIG9ubHkgYSBwYXJ0aWFsIHJlcGxhY2VtZW50XG4gICAgey4uLnByb3BzfVxuICAvPlxuKTtcbiIsIi8vIGltcG9ydCB7IGNvbXBvc2UgfSBmcm9tIFwicmVjb21wb3NlXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgZGlmZmVyZW5jZSBmcm9tIFwibG9kYXNoL2RpZmZlcmVuY2VcIjtcblxuZXhwb3J0IGNvbnN0IENvbXBvbmVudHMgPSB7fTsgLy8gd2lsbCBiZSBwb3B1bGF0ZWQgb24gc3RhcnR1cFxuZXhwb3J0IGNvbnN0IENvbXBvbmVudHNUYWJsZSA9IHt9OyAvLyBzdG9yYWdlIGZvciBpbmZvcyBhYm91dCBjb21wb25lbnRzXG5cbmV4cG9ydCBjb25zdCBjb3JlQ29tcG9uZW50cyA9IFtcbiAgXCJBbGVydFwiLFxuICBcIkJ1dHRvblwiLFxuICBcIk1vZGFsXCIsXG4gIFwiTW9kYWxUcmlnZ2VyXCIsXG4gIFwiVGFibGVcIixcbiAgXCJGb3JtQ29tcG9uZW50Q2hlY2tib3hcIixcbiAgXCJGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cFwiLFxuICBcIkZvcm1Db21wb25lbnREYXRlXCIsXG4gIFwiRm9ybUNvbXBvbmVudERhdGUyXCIsXG4gIFwiRm9ybUNvbXBvbmVudERhdGVUaW1lXCIsXG4gIFwiRm9ybUNvbXBvbmVudERlZmF1bHRcIixcbiAgXCJGb3JtQ29tcG9uZW50VGV4dFwiLFxuICBcIkZvcm1Db21wb25lbnRFbWFpbFwiLFxuICBcIkZvcm1Db21wb25lbnROdW1iZXJcIixcbiAgXCJGb3JtQ29tcG9uZW50UmFkaW9Hcm91cFwiLFxuICBcIkZvcm1Db21wb25lbnRTZWxlY3RcIixcbiAgXCJGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGVcIixcbiAgXCJGb3JtQ29tcG9uZW50U3RhdGljVGV4dFwiLFxuICBcIkZvcm1Db21wb25lbnRUZXh0YXJlYVwiLFxuICBcIkZvcm1Db21wb25lbnRUaW1lXCIsXG4gIFwiRm9ybUNvbXBvbmVudFVybFwiLFxuICBcIkZvcm1Db21wb25lbnRJbm5lclwiLFxuICBcIkZvcm1Db250cm9sXCIsXG4gIFwiRm9ybUVsZW1lbnRcIixcbl07XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBWdWxjYW4gY29tcG9uZW50IHdpdGggYSBuYW1lLCBhIHJhdyBjb21wb25lbnQgdGhhbiBjYW4gYmUgZXh0ZW5kZWRcbiAqIGFuZCBvbmUgb3IgbW9yZSBvcHRpb25hbCBoaWdoZXIgb3JkZXIgY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIHJlZ2lzdGVyLlxuICogQHBhcmFtIHtDb21wb25lbnR9IHJhd0NvbXBvbmVudCBJbnRlcmNoYW5nZWFibGUvZXh0ZW5kYWJsZSByZWFjdCBjb21wb25lbnQuXG4gKiBAcGFyYW0gey4uLihGdW5jdGlvbnxBcnJheSl9IGhvY3MgVGhlIEhPQ3MgdG8gY29tcG9zZSB3aXRoIHRoZSByYXcgY29tcG9uZW50LlxuICpcbiAqIE5vdGU6IHdoZW4gYSBjb21wb25lbnQgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IGhpZ2hlciBvcmRlciBjb21wb25lbnQsIGBob2NzYCB3aWxsIGJlXG4gKiBhbiBlbXB0eSBhcnJheSwgYW5kIGl0J3Mgb2shXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmVkdXgvYmxvYi9tYXN0ZXIvc3JjL2NvbXBvc2UuanMjTDEzLUwxNVxuICpcbiAqIEByZXR1cm5zIFN0cnVjdHVyZSBvZiBhIGNvbXBvbmVudCBpbiB0aGUgbGlzdDpcbiAqXG4gKiBDb21wb25lbnRzVGFibGUuRm9vID0ge1xuICogICAgbmFtZTogJ0ZvbycsXG4gKiAgICBob2NzOiBbZm4xLCBmbjJdLFxuICogICAgcmF3Q29tcG9uZW50OiBSZWFjdC5Db21wb25lbnQsXG4gKiAgICBjYWxsOiAoKSA9PiBjb21wb3NlKC4uLmhvY3MpKHJhd0NvbXBvbmVudCksXG4gKiB9XG4gKlxuICovXG4vKlxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29tcG9uZW50KG5hbWUsIHJhd0NvbXBvbmVudCwgLi4uaG9jcykge1xuICAvLyBzdXBwb3J0IHNpbmdsZS1hcmd1bWVudCBzeW50YXhcbiAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBub3RlOiBjYW5ub3QgdXNlIGBjb25zdGAgYmVjYXVzZSBuYW1lLCBjb21wb25lbnRzLCBob2NzIGFyZSBhbHJlYWR5IGRlZmluZWRcbiAgICAvLyBhcyBhcmd1bWVudHMgc28gZGVzdHJ1Y3R1cmluZyBjYW5ub3Qgd29ya1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbiAgICB2YXIge1xuICAgICAgbmFtZSxcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGhvY3MgPSBbXSxcbiAgICB9ID0gYXJndW1lbnRzWzBdO1xuICAgIHJhd0NvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgfVxuICAvLyBzdG9yZSB0aGUgY29tcG9uZW50IGluIHRoZSB0YWJsZVxuICBDb21wb25lbnRzVGFibGVbbmFtZV0gPSB7XG4gICAgbmFtZSxcbiAgICByYXdDb21wb25lbnQsXG4gICAgaG9jcyxcbiAgfTtcbn1cbiovXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgY29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoXG4gKiByZWdpc3RlckNvbXBvbmVudChuYW1lLCBjb21wb25lbnQsIC4uLmhvY3MpLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gZ2V0LlxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBjb25zdCBjb21wb25lbnRFeGlzdHMgPSAobmFtZSkgPT4ge1xuICBjb25zdCBjb21wb25lbnQgPSBDb21wb25lbnRzVGFibGVbbmFtZV07XG4gIHJldHVybiAhIWNvbXBvbmVudDtcbn07XG5cbi8qKlxuICogR2V0IGEgY29tcG9uZW50IHJlZ2lzdGVyZWQgd2l0aCByZWdpc3RlckNvbXBvbmVudChuYW1lLCBjb21wb25lbnQsIC4uLmhvY3MpLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufFJlYWN0IENvbXBvbmVudH0gQSAod3JhcHBlZCkgUmVhY3QgY29tcG9uZW50XG4gKi9cbi8qXG5leHBvcnQgY29uc3QgZ2V0Q29tcG9uZW50ID0gKG5hbWUpID0+IHtcbiAgY29uc3QgY29tcG9uZW50ID0gQ29tcG9uZW50c1RhYmxlW25hbWVdO1xuICBpZiAoIWNvbXBvbmVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50ICR7bmFtZX0gbm90IHJlZ2lzdGVyZWQuYCk7XG4gIH1cbiAgaWYgKGNvbXBvbmVudC5ob2NzICYmIGNvbXBvbmVudC5ob2NzLmxlbmd0aCkge1xuICAgIGNvbnN0IGhvY3MgPSBjb21wb25lbnQuaG9jcy5tYXAoKGhvYykgPT4ge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhvYykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBob2MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBJbiByZWdpc3RlcmVkIGNvbXBvbmVudCAke25hbWV9LCBhbiBob2MgaXMgb2YgdHlwZSAke3R5cGVvZiBob2N9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhvYztcbiAgICAgIH1cbiAgICAgIGNvbnN0IFthY3R1YWxIb2MsIC4uLmFyZ3NdID0gaG9jO1xuICAgICAgaWYgKHR5cGVvZiBhY3R1YWxIb2MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEluIHJlZ2lzdGVyZWQgY29tcG9uZW50ICR7bmFtZX0sIGFuIGhvYyBpcyBvZiB0eXBlICR7dHlwZW9mIGFjdHVhbEhvY31gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWN0dWFsSG9jKC4uLmFyZ3MpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb21wb3NlKC4uLmhvY3MpKGNvbXBvbmVudC5yYXdDb21wb25lbnQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21wb25lbnQucmF3Q29tcG9uZW50O1xuICB9XG59O1xuKi9cblxuLyoqXG4gKiBQb3B1bGF0ZSB0aGUgbG9va3VwIHRhYmxlIGZvciBjb21wb25lbnRzIHRvIGJlIGNhbGxhYmxlXG4gKiDihLnvuI8gQ2FsbGVkIG9uY2Ugb24gYXBwIHN0YXJ0dXBcbiAqKi9cbi8qXG5leHBvcnQgY29uc3QgcG9wdWxhdGVDb21wb25lbnRzQXBwID0gKCkgPT4ge1xuICBjb25zdCByZWdpc3RlcmVkQ29tcG9uZW50cyA9IE9iamVjdC5rZXlzKENvbXBvbmVudHNUYWJsZSk7XG5cbiAgLy8gbG9vcCBvdmVyIGVhY2ggY29tcG9uZW50IGluIHRoZSBsaXN0XG4gIHJlZ2lzdGVyZWRDb21wb25lbnRzLm1hcCgobmFtZSkgPT4ge1xuICAgIC8vIHBvcHVsYXRlIGFuIGVudHJ5IGluIHRoZSBsb29rdXAgdGFibGVcbiAgICBDb21wb25lbnRzW25hbWVdID0gZ2V0Q29tcG9uZW50KG5hbWUpO1xuXG4gICAgLy8gdW5jb21tZW50IGZvciBkZWJ1Z1xuICAgIC8vIGNvbnNvbGUubG9nKCdpbml0IGNvbXBvbmVudDonLCBuYW1lKTtcbiAgfSk7XG5cbiAgY29uc3QgbWlzc2luZ0NvbXBvbmVudHMgPSBkaWZmZXJlbmNlKGNvcmVDb21wb25lbnRzLCByZWdpc3RlcmVkQ29tcG9uZW50cyk7XG5cbiAgaWYgKG1pc3NpbmdDb21wb25lbnRzLmxlbmd0aCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYEZvdW5kIHRoZSBmb2xsb3dpbmcgbWlzc2luZyBjb3JlIGNvbXBvbmVudHM6ICR7bWlzc2luZ0NvbXBvbmVudHMuam9pbihcbiAgICAgICAgXCIsIFwiXG4gICAgICApfS4gSW5jbHVkZSBhIFVJIHBhY2thZ2Ugc3VjaCBhcyB2dWxjYW46dWktYm9vdHN0cmFwIHRvIGFkZCB0aGVtLmBcbiAgICApO1xuICB9XG59O1xuKi9cbi8qKlxuICogR2V0IHRoZSAqKnJhdyoqIChvcmlnaW5hbCkgY29tcG9uZW50IHJlZ2lzdGVyZWQgd2l0aCByZWdpc3RlckNvbXBvbmVudFxuICogd2l0aG91dCB0aGUgcG9zc2libGUgSE9DcyB3cmFwcGluZyBpdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxSZWFjdCBDb21wb25lbnR9IEFuIGludGVyY2hhbmdlYWJsZS9leHRlbmRhYmxlIFJlYWN0IGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3QgZ2V0UmF3Q29tcG9uZW50ID0gKG5hbWUpID0+IHtcbiAgcmV0dXJuIENvbXBvbmVudHNUYWJsZVtuYW1lXS5yYXdDb21wb25lbnQ7XG59O1xuXG4vKipcbiAqIFJlcGxhY2UgYSBWdWxjYW4gY29tcG9uZW50IHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoIGEgbmV3IGNvbXBvbmVudCBvclxuICogYW4gZXh0ZW5zaW9uIG9mIHRoZSByYXcgY29tcG9uZW50IGFuZCBvbmUgb3IgbW9yZSBvcHRpb25hbCBoaWdoZXIgb3JkZXIgY29tcG9uZW50cy5cbiAqIFRoaXMgZnVuY3Rpb24ga2VlcHMgdHJhY2sgb2YgdGhlIHByZXZpb3VzIEhPQ3MgYW5kIHdyYXAgdGhlIG5ldyBIT0NzIGFyb3VuZCBwcmV2aW91cyBvbmVzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byByZWdpc3Rlci5cbiAqIEBwYXJhbSB7UmVhY3QgQ29tcG9uZW50fSBuZXdDb21wb25lbnQgSW50ZXJjaGFuZ2VhYmxlL2V4dGVuZGFibGUgY29tcG9uZW50LlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbmV3SG9jcyBUaGUgSE9DcyB0byBjb21wb3NlIHdpdGggdGhlIHJhdyBjb21wb25lbnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258UmVhY3QgQ29tcG9uZW50fSBBIGNvbXBvbmVudCBjYWxsYWJsZSB3aXRoIENvbXBvbmVudHNbbmFtZV1cbiAqXG4gKiBOb3RlOiB3aGVuIGEgY29tcG9uZW50IGlzIHJlZ2lzdGVyZWQgd2l0aG91dCBoaWdoZXIgb3JkZXIgY29tcG9uZW50LCBgaG9jc2Agd2lsbCBiZVxuICogYW4gZW1wdHkgYXJyYXksIGFuZCBpdCdzIG9rIVxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlZHV4L2Jsb2IvbWFzdGVyL3NyYy9jb21wb3NlLmpzI0wxMy1MMTVcbiAqL1xuLypcbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlQ29tcG9uZW50KG5hbWUsIG5ld0NvbXBvbmVudCwgLi4ubmV3SG9jcykge1xuICAvLyBzdXBwb3J0IHNpbmdsZSBhcmd1bWVudCBzeW50YXhcbiAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG4gICAgdmFyIHsgbmFtZSwgY29tcG9uZW50LCBob2NzID0gW10gfSA9IGFyZ3VtZW50c1swXTtcbiAgICBuZXdDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgbmV3SG9jcyA9IGhvY3M7XG4gIH1cblxuICBjb25zdCBwcmV2aW91c0NvbXBvbmVudCA9IENvbXBvbmVudHNUYWJsZVtuYW1lXTtcbiAgY29uc3QgcHJldmlvdXNIb2NzID0gKHByZXZpb3VzQ29tcG9uZW50ICYmIHByZXZpb3VzQ29tcG9uZW50LmhvY3MpIHx8IFtdO1xuXG4gIGlmICghcHJldmlvdXNDb21wb25lbnQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBUcnlpbmcgdG8gcmVwbGFjZSBub24tcmVnaXN0ZXJlZCBjb21wb25lbnQgJHtuYW1lfS4gVGhlIGNvbXBvbmVudCBpcyBgICtcbiAgICAgICAgXCJiZWluZyByZWdpc3RlcmVkLiBJZiB5b3Ugd2VyZSB0cnlpbmcgdG8gcmVwbGFjZSBhIGNvbXBvbmVudCBkZWZpbmVkIGJ5IFwiICtcbiAgICAgICAgXCJhbm90aGVyIHBhY2thZ2UsIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlbid0IG1pc3NwZWxsZWQgdGhlIG5hbWUuIENoZWNrIFwiICtcbiAgICAgICAgXCJhbHNvIGlmIHRoZSBvcmlnaW5hbCBjb21wb25lbnQgaXMgc3RpbGwgYmVpbmcgcmVnaXN0ZXJlZCBvciB0aGF0IGl0IFwiICtcbiAgICAgICAgXCJoYXNuJ3QgYmVlbiByZW5hbWVkLlwiXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiByZWdpc3RlckNvbXBvbmVudChuYW1lLCBuZXdDb21wb25lbnQsIC4uLm5ld0hvY3MsIC4uLnByZXZpb3VzSG9jcyk7XG59XG4qL1xuXG4vKlxuZXhwb3J0IGNvbnN0IGNvcHlIb0NzID0gKHNvdXJjZUNvbXBvbmVudCwgdGFyZ2V0Q29tcG9uZW50KSA9PiB7XG4gIHJldHVybiBjb21wb3NlKC4uLnNvdXJjZUNvbXBvbmVudC5ob2NzKSh0YXJnZXRDb21wb25lbnQpO1xufTtcbiovXG5cbi8qKlxuICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY29tcG9uZW50IG5hbWUgb2YgZnVuY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9ufSBjb21wb25lbnQgIEEgY29tcG9uZW50LCB0aGUgbmFtZSBvZiBhIGNvbXBvbmVudCwgb3IgYSByZWFjdCBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzXSAgT3B0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBjb21wb25lbnRcbiAqL1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZGlzcGxheS1uYW1lXG4vLyBsZWdhY3lcbmV4cG9ydCBjb25zdCBpbnN0YW50aWF0ZUNvbXBvbmVudCA9IChcbiAgY29tcG9uZW50PzogUmVhY3QuQ29tcG9uZW50VHlwZSB8IEZ1bmN0aW9uIHwgYW55LFxuICBwcm9wcz86IGFueVxuKSA9PiB7XG4gIGlmICghY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLyplbHNlIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gQ29tcG9uZW50c1tjb21wb25lbnRdO1xuICAgIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG4gIH0gKi8gZWxzZSBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY29tcG9uZW50KSkge1xuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY29tcG9uZW50LCBwcm9wcyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgY29tcG9uZW50LnByb3RvdHlwZSAmJlxuICAgIGNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudFxuICApIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBjb21wb25lbnQgYXMgUmVhY3QuQ29tcG9uZW50VHlwZTtcbiAgICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBjb21wb25lbnQocHJvcHMpO1xuICB9IGVsc2UgaWYgKFxuICAgIHR5cGVvZiBjb21wb25lbnQgPT09IFwib2JqZWN0XCIgJiZcbiAgICBjb21wb25lbnQuJCR0eXBlb2YgJiZcbiAgICBjb21wb25lbnQucmVuZGVyXG4gICkge1xuICAgIGNvbnN0IENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBSZWFjdC5Db21wb25lbnRUeXBlO1xuICAgIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcG9uZW50IHRoYXQgd2lsbCByZW5kZXIgdGhlIHJlZ2lzdGVyZWQgY29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiAgbWF5IGJlIHVzZWZ1bCB3aGVuIGluIG5lZWQgZm9yIHNvbWUgcmVnaXN0ZXJlZCBjb21wb25lbnQsIGJ1dCBpbiBjb250ZXh0c1xuICogd2hlcmUgdGhleSBoYXZlIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZCwgZm9yIGV4YW1wbGUgYXQgY29tcGlsZSB0aW1lIGV4ZWN1dGlvbi4gSW4gb3RoZXJcbiAqIHdvcmRzLCB3aGVuIHVzaW5nIGBDb21wb25lbnRzLkNvbXBvbmVudE5hbWVgIGlzIG5vdCBhbGxvd2VkIChiZWNhdXNlIGl0IGhhcyBub3QgeWV0IGJlZW5cbiAqIHBvcHVsYXRlZCwgaGVuY2Ugd291bGQgYmUgYHVuZGVmaW5lZGApLCB0aGVuIGBkZWxheWVkQ29tcG9uZW50KCdDb21wb25lbnROYW1lJylgIGNhbiBiZVxuICogdXNlZCBpbnN0ZWFkLlxuICpcbiAqIEBleGFtcGxlIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgYSByZWdpc3RlcmVkIGNvbXBvbmVudFxuICogIC8vIFNvbWVDb250YWluZXIuanNcbiAqICBpbXBvcnQgY29tcG9zZSBmcm9tICdyZWNvbXBvc2UvY29tcG9zZSc7XG4gKiAgaW1wb3J0IHsgZGVsYXllZENvbXBvbmVudCB9IGZyb20gJ21ldGVvci92dWxjYW46Y29yZSc7XG4gKlxuICogIGV4cG9ydCBkZWZhdWx0IGNvbXBvc2UoXG4gKiAgICAvLyAuLi5zb21lIGhvY3Mgd2l0aCBjb250YWluZXIgbG9naWNcbiAqICApKGRlbGF5ZWRDb21wb25lbnQoJ0NvbXBvbmVudE5hbWUnKSk7IC8vIGNhbm5vdCB1c2UgQ29tcG9uZW50cy5Db21wb25lbnROYW1lIGluIHRoaXMgY29udGV4dCFcbiAqXG4gKiBAZXhhbXBsZSB7QGxpbmsgZHluYW1pY0xvYWRlcn1cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIENvbXBvbmVudCBuYW1lXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqICBGdW5jdGlvbmFsIGNvbXBvbmVudCB0aGF0IHdpbGwgcmVuZGVyIHRoZSBnaXZlbiByZWdpc3RlcmVkIGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3QgZGVsYXllZENvbXBvbmVudCA9IChuYW1lKSA9PiB7XG4gIHJldHVybiAocHJvcHMpID0+IHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBDb21wb25lbnRzW25hbWVdIHx8IG51bGw7XG4gICAgcmV0dXJuIENvbXBvbmVudCAmJiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG4gIH07XG59O1xuXG4vLyBFeGFtcGxlIHdpdGggUHJveHkgKG1pZ2h0IGJlIHVuc3RhYmxlL2hhcmQgdG8gcmVhc29uIGFib3V0KVxuLy9jb25zdCBtZXJnZVdpdGhDb21wb25lbnRzID0gKG15Q29tcG9uZW50cyA9IHt9KSA9PiB7XG4vLyAgY29uc3QgaGFuZGxlciA9IHtcbi8vICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4vLyAgICAgIHJldHVybiBuYW1lIGluIHRhcmdldCA/IHRhcmdldFtuYW1lXSA6IENvbXBvbmVudHNbbmFtZV07XG4vLyAgICB9XG4vLyAgfTtcbi8vICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShteUNvbXBvbmVudHMsIGhhbmRsZXIpO1xuLy8gIHJldHVybiBwcm94eTtcbi8vfTtcbmV4cG9ydCBjb25zdCBtZXJnZVdpdGhDb21wb25lbnRzID0gKG15Q29tcG9uZW50cykgPT5cbiAgbXlDb21wb25lbnRzID8geyAuLi5Db21wb25lbnRzLCAuLi5teUNvbXBvbmVudHMgfSA6IENvbXBvbmVudHM7XG4iXSwic291cmNlUm9vdCI6IiJ9