@worktif/runtime 0.3.0-edge.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +101 -0
  2. package/README.md +495 -0
  3. package/out/dist/bin/index.js +212 -0
  4. package/out/dist/bin/purenow.js +218 -0
  5. package/out/dist/bin/templates/runtime-web/cdk/.gitignore.template +25 -0
  6. package/out/dist/bin/templates/runtime-web/cdk/README.md.template +267 -0
  7. package/out/dist/bin/templates/runtime-web/cdk/bin/app.ts.template +173 -0
  8. package/out/dist/bin/templates/runtime-web/cdk/cdk.json.template +79 -0
  9. package/out/dist/bin/templates/runtime-web/cdk/package.json.template +28 -0
  10. package/out/dist/bin/templates/runtime-web/cdk/tsconfig.json.template +38 -0
  11. package/out/dist/bin/templates/runtime-web/purenow-basic/.env.example +15 -0
  12. package/out/dist/bin/templates/runtime-web/purenow-basic/README.md +118 -0
  13. package/out/dist/bin/templates/runtime-web/purenow-basic/gitignore.template +64 -0
  14. package/out/dist/bin/templates/runtime-web/purenow-basic/package.json +34 -0
  15. package/out/dist/bin/templates/runtime-web/purenow-basic/purenow.config.ts +105 -0
  16. package/out/dist/bin/templates/runtime-web/purenow-basic/src/app.tsx +35 -0
  17. package/out/dist/bin/templates/runtime-web/purenow-basic/src/handlers/users/index.ts +17 -0
  18. package/out/dist/bin/templates/runtime-web/purenow-basic/src/handlers/users/users.handlers.ts +222 -0
  19. package/out/dist/bin/templates/runtime-web/purenow-basic/src/index.tsx +71 -0
  20. package/out/dist/bin/templates/runtime-web/purenow-basic/src/pages/about-page.tsx +65 -0
  21. package/out/dist/bin/templates/runtime-web/purenow-basic/src/pages/home-page.tsx +55 -0
  22. package/out/dist/bin/templates/runtime-web/purenow-basic/src/pages/users-page.tsx +66 -0
  23. package/out/dist/bin/templates/runtime-web/purenow-basic/src/routes.tsx +61 -0
  24. package/out/dist/bin/templates/runtime-web/purenow-basic/src/services/index.ts +17 -0
  25. package/out/dist/bin/templates/runtime-web/purenow-basic/src/services/users.service.ts +133 -0
  26. package/out/dist/bin/templates/runtime-web/purenow-basic/src/ties/index.ts +17 -0
  27. package/out/dist/bin/templates/runtime-web/purenow-basic/src/ties/users.ties.ts +53 -0
  28. package/out/dist/bin/templates/runtime-web/purenow-basic/tsconfig.json +53 -0
  29. package/out/dist/lib/index.d.ts +4 -0
  30. package/out/dist/lib/index.js +4 -0
  31. package/out/dist/lib/lib/index.d.ts +3 -0
  32. package/out/dist/lib/lib/runtime-web/index.d.ts +17 -0
  33. package/out/dist/lib/lib/runtime-web/pipelines/browser-pipeline.d.ts +110 -0
  34. package/out/dist/lib/lib/runtime-web/pipelines/index.d.ts +2 -0
  35. package/out/dist/lib/lib/runtime-web/pureweb.d.ts +65 -0
  36. package/out/dist/lib/lib/runtime-web/types/config.types.d.ts +301 -0
  37. package/out/dist/lib/lib/runtime-web/types/http.types.d.ts +171 -0
  38. package/out/dist/lib/lib/runtime-web/types/index.d.ts +14 -0
  39. package/out/dist/lib/lib/runtime-web/types/infra.types.d.ts +225 -0
  40. package/out/dist/lib/lib/runtime-web/types/lambda.types.d.ts +175 -0
  41. package/out/dist/lib/lib/runtime-web/types/microservice.types.d.ts +70 -0
  42. package/out/dist/lib/lib/runtime-web/types/runtime.types.d.ts +55 -0
  43. package/out/dist/lib/utils/index.d.ts +2 -0
  44. package/out/dist/lib/utils/types/index.d.ts +3 -0
  45. package/out/dist/lib/utils/types/runtime.config.types.d.ts +71 -0
  46. package/out/dist/src/bin/index.d.ts +5 -0
  47. package/out/dist/src/bin/index.unix.d.ts +5 -0
  48. package/out/dist/src/bin/purenow-runtime-cli.d.ts +31 -0
  49. package/out/dist/src/bin/services/index.d.ts +8 -0
  50. package/out/dist/src/bin/services/purenow-runtime-deployment.strategy.d.ts +37 -0
  51. package/out/dist/src/bin/services/purenow-runtime-stacks-deploy.service.d.ts +58 -0
  52. package/out/dist/src/bin/services/purenow-runtime-stacks-deploy.service.types.d.ts +18 -0
  53. package/out/dist/src/bin/services/runtime-web-cli-extensions.d.ts +2 -0
  54. package/out/dist/src/bin/services/template.service.d.ts +53 -0
  55. package/out/dist/src/bin/services/utils/index.d.ts +2 -0
  56. package/out/dist/src/bin/utils/errors.d.ts +68 -0
  57. package/out/dist/src/lib/runtime-web/index.d.ts +17 -0
  58. package/out/dist/src/lib/runtime-web/pipelines/browser-pipeline.d.ts +110 -0
  59. package/out/dist/src/lib/runtime-web/pipelines/index.d.ts +2 -0
  60. package/out/dist/src/lib/runtime-web/pureweb.d.ts +65 -0
  61. package/out/dist/src/lib/runtime-web/types/config.types.d.ts +301 -0
  62. package/out/dist/src/lib/runtime-web/types/http.types.d.ts +171 -0
  63. package/out/dist/src/lib/runtime-web/types/index.d.ts +14 -0
  64. package/out/dist/src/lib/runtime-web/types/infra.types.d.ts +225 -0
  65. package/out/dist/src/lib/runtime-web/types/lambda.types.d.ts +175 -0
  66. package/out/dist/src/lib/runtime-web/types/microservice.types.d.ts +70 -0
  67. package/out/dist/src/lib/runtime-web/types/runtime.types.d.ts +55 -0
  68. package/package.json +133 -0
@@ -0,0 +1,212 @@
1
+ "use strict";var it=Object.create;var Z=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var lt=(h,r)=>()=>(r||h((r={exports:{}}).exports,r),r.exports),ct=(h,r)=>{for(var i in r)Z(h,i,{get:r[i],enumerable:!0})},Oe=(h,r,i,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let u of at(r))!ut.call(h,u)&&u!==i&&Z(h,u,{get:()=>r[u],enumerable:!(a=ot(r,u))||a.enumerable});return h};var I=(h,r,i)=>(i=h!=null?it(st(h)):{},Oe(r||!h||!h.__esModule?Z(i,"default",{value:h,enumerable:!0}):i,h)),ft=h=>Oe(Z({},"__esModule",{value:!0}),h);var X=lt(()=>{var _e;(function(h){(function(r){var i=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:M(),a=u(h);typeof i.Reflect<"u"&&(a=u(i.Reflect,a)),r(a,i),typeof i.Reflect>"u"&&(i.Reflect=h);function u(R,D){return function(_,j){Object.defineProperty(R,_,{configurable:!0,writable:!0,value:j}),D&&D(_,j)}}function d(){try{return Function("return this;")()}catch{}}function g(){try{return(0,eval)("(function() { return this; })()")}catch{}}function M(){return d()||g()}})(function(r,i){var a=Object.prototype.hasOwnProperty,u=typeof Symbol=="function",d=u&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",g=u&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",M=typeof Object.create=="function",R={__proto__:[]}instanceof Array,D=!M&&!R,_={create:M?function(){return ae(Object.create(null))}:R?function(){return ae({__proto__:null})}:function(){return ae({})},has:D?function(e,t){return a.call(e,t)}:function(e,t){return t in e},get:D?function(e,t){return a.call(e,t)?e[t]:void 0}:function(e,t){return e[t]}},j=Object.getPrototypeOf(Function),L=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:Ke(),W=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:et(),z=typeof WeakMap=="function"?WeakMap:tt(),A=u?Symbol.for("@reflect-metadata:registry"):void 0,Y=Ze(),ce=Xe(Y);function Pe(e,t,n,o){if(m(n)){if(!ve(e))throw new TypeError;if(!be(t))throw new TypeError;return ze(e,t)}else{if(!ve(e))throw new TypeError;if(!b(t))throw new TypeError;if(!b(o)&&!m(o)&&!F(o))throw new TypeError;return F(o)&&(o=void 0),n=C(n),Ue(e,t,n,o)}}r("decorate",Pe);function Ie(e,t){function n(o,p){if(!b(o))throw new TypeError;if(!m(p)&&!qe(p))throw new TypeError;me(e,t,o,p)}return n}r("metadata",Ie);function $e(e,t,n,o){if(!b(n))throw new TypeError;return m(o)||(o=C(o)),me(e,t,n,o)}r("defineMetadata",$e);function je(e,t,n){if(!b(t))throw new TypeError;return m(n)||(n=C(n)),fe(e,t,n)}r("hasMetadata",je);function Le(e,t,n){if(!b(t))throw new TypeError;return m(n)||(n=C(n)),re(e,t,n)}r("hasOwnMetadata",Le);function Ae(e,t,n){if(!b(t))throw new TypeError;return m(n)||(n=C(n)),de(e,t,n)}r("getMetadata",Ae);function Fe(e,t,n){if(!b(t))throw new TypeError;return m(n)||(n=C(n)),pe(e,t,n)}r("getOwnMetadata",Fe);function Ne(e,t){if(!b(e))throw new TypeError;return m(t)||(t=C(t)),he(e,t)}r("getMetadataKeys",Ne);function Be(e,t){if(!b(e))throw new TypeError;return m(t)||(t=C(t)),ye(e,t)}r("getOwnMetadataKeys",Be);function We(e,t,n){if(!b(t))throw new TypeError;if(m(n)||(n=C(n)),!b(t))throw new TypeError;m(n)||(n=C(n));var o=U(t,n,!1);return m(o)?!1:o.OrdinaryDeleteMetadata(e,t,n)}r("deleteMetadata",We);function ze(e,t){for(var n=e.length-1;n>=0;--n){var o=e[n],p=o(t);if(!m(p)&&!F(p)){if(!be(p))throw new TypeError;t=p}}return t}function Ue(e,t,n,o){for(var p=e.length-1;p>=0;--p){var S=e[p],T=S(t,n,o);if(!m(T)&&!F(T)){if(!b(T))throw new TypeError;o=T}}return o}function fe(e,t,n){var o=re(e,t,n);if(o)return!0;var p=oe(t);return F(p)?!1:fe(e,p,n)}function re(e,t,n){var o=U(t,n,!1);return m(o)?!1:ge(o.OrdinaryHasOwnMetadata(e,t,n))}function de(e,t,n){var o=re(e,t,n);if(o)return pe(e,t,n);var p=oe(t);if(!F(p))return de(e,p,n)}function pe(e,t,n){var o=U(t,n,!1);if(!m(o))return o.OrdinaryGetOwnMetadata(e,t,n)}function me(e,t,n,o){var p=U(n,o,!0);p.OrdinaryDefineOwnMetadata(e,t,n,o)}function he(e,t){var n=ye(e,t),o=oe(e);if(o===null)return n;var p=he(o,t);if(p.length<=0)return n;if(n.length<=0)return p;for(var S=new W,T=[],y=0,s=n;y<s.length;y++){var l=s[y],c=S.has(l);c||(S.add(l),T.push(l))}for(var f=0,w=p;f<w.length;f++){var l=w[f],c=S.has(l);c||(S.add(l),T.push(l))}return T}function ye(e,t){var n=U(e,t,!1);return n?n.OrdinaryOwnMetadataKeys(e,t):[]}function we(e){if(e===null)return 1;switch(typeof e){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return e===null?1:6;default:return 6}}function m(e){return e===void 0}function F(e){return e===null}function He(e){return typeof e=="symbol"}function b(e){return typeof e=="object"?e!==null:typeof e=="function"}function Ge(e,t){switch(we(e)){case 0:return e;case 1:return e;case 2:return e;case 3:return e;case 4:return e;case 5:return e}var n=t===3?"string":t===5?"number":"default",o=Se(e,d);if(o!==void 0){var p=o.call(e,n);if(b(p))throw new TypeError;return p}return Ve(e,n==="default"?"number":n)}function Ve(e,t){if(t==="string"){var n=e.toString;if(N(n)){var o=n.call(e);if(!b(o))return o}var p=e.valueOf;if(N(p)){var o=p.call(e);if(!b(o))return o}}else{var p=e.valueOf;if(N(p)){var o=p.call(e);if(!b(o))return o}var S=e.toString;if(N(S)){var o=S.call(e);if(!b(o))return o}}throw new TypeError}function ge(e){return!!e}function Je(e){return""+e}function C(e){var t=Ge(e,3);return He(t)?t:Je(t)}function ve(e){return Array.isArray?Array.isArray(e):e instanceof Object?e instanceof Array:Object.prototype.toString.call(e)==="[object Array]"}function N(e){return typeof e=="function"}function be(e){return typeof e=="function"}function qe(e){switch(we(e)){case 3:return!0;case 4:return!0;default:return!1}}function ie(e,t){return e===t||e!==e&&t!==t}function Se(e,t){var n=e[t];if(n!=null){if(!N(n))throw new TypeError;return n}}function xe(e){var t=Se(e,g);if(!N(t))throw new TypeError;var n=t.call(e);if(!b(n))throw new TypeError;return n}function ke(e){return e.value}function Me(e){var t=e.next();return t.done?!1:t}function Te(e){var t=e.return;t&&t.call(e)}function oe(e){var t=Object.getPrototypeOf(e);if(typeof e!="function"||e===j||t!==j)return t;var n=e.prototype,o=n&&Object.getPrototypeOf(n);if(o==null||o===Object.prototype)return t;var p=o.constructor;return typeof p!="function"||p===e?t:p}function Ye(){var e;!m(A)&&typeof i.Reflect<"u"&&!(A in i.Reflect)&&typeof i.Reflect.defineMetadata=="function"&&(e=Qe(i.Reflect));var t,n,o,p=new z,S={registerProvider:T,getProvider:s,setProvider:c};return S;function T(f){if(!Object.isExtensible(S))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case e===f:break;case m(t):t=f;break;case t===f:break;case m(n):n=f;break;case n===f:break;default:o===void 0&&(o=new W),o.add(f);break}}function y(f,w){if(!m(t)){if(t.isProviderFor(f,w))return t;if(!m(n)){if(n.isProviderFor(f,w))return t;if(!m(o))for(var v=xe(o);;){var x=Me(v);if(!x)return;var E=ke(x);if(E.isProviderFor(f,w))return Te(v),E}}}if(!m(e)&&e.isProviderFor(f,w))return e}function s(f,w){var v=p.get(f),x;return m(v)||(x=v.get(w)),m(x)&&(x=y(f,w),m(x)||(m(v)&&(v=new L,p.set(f,v)),v.set(w,x))),x}function l(f){if(m(f))throw new TypeError;return t===f||n===f||!m(o)&&o.has(f)}function c(f,w,v){if(!l(v))throw new Error("Metadata provider not registered.");var x=s(f,w);if(x!==v){if(!m(x))return!1;var E=p.get(f);m(E)&&(E=new L,p.set(f,E)),E.set(w,v)}return!0}}function Ze(){var e;return!m(A)&&b(i.Reflect)&&Object.isExtensible(i.Reflect)&&(e=i.Reflect[A]),m(e)&&(e=Ye()),!m(A)&&b(i.Reflect)&&Object.isExtensible(i.Reflect)&&Object.defineProperty(i.Reflect,A,{enumerable:!1,configurable:!1,writable:!1,value:e}),e}function Xe(e){var t=new z,n={isProviderFor:function(l,c){var f=t.get(l);return m(f)?!1:f.has(c)},OrdinaryDefineOwnMetadata:T,OrdinaryHasOwnMetadata:p,OrdinaryGetOwnMetadata:S,OrdinaryOwnMetadataKeys:y,OrdinaryDeleteMetadata:s};return Y.registerProvider(n),n;function o(l,c,f){var w=t.get(l),v=!1;if(m(w)){if(!f)return;w=new L,t.set(l,w),v=!0}var x=w.get(c);if(m(x)){if(!f)return;if(x=new L,w.set(c,x),!e.setProvider(l,c,n))throw w.delete(c),v&&t.delete(l),new Error("Wrong provider for target.")}return x}function p(l,c,f){var w=o(c,f,!1);return m(w)?!1:ge(w.has(l))}function S(l,c,f){var w=o(c,f,!1);if(!m(w))return w.get(l)}function T(l,c,f,w){var v=o(f,w,!0);v.set(l,c)}function y(l,c){var f=[],w=o(l,c,!1);if(m(w))return f;for(var v=w.keys(),x=xe(v),E=0;;){var Re=Me(x);if(!Re)return f.length=E,f;var nt=ke(Re);try{f[E]=nt}catch(rt){try{Te(x)}finally{throw rt}}E++}}function s(l,c,f){var w=o(c,f,!1);if(m(w)||!w.delete(l))return!1;if(w.size===0){var v=t.get(c);m(v)||(v.delete(f),v.size===0&&t.delete(v))}return!0}}function Qe(e){var t=e.defineMetadata,n=e.hasOwnMetadata,o=e.getOwnMetadata,p=e.getOwnMetadataKeys,S=e.deleteMetadata,T=new z,y={isProviderFor:function(s,l){var c=T.get(s);return!m(c)&&c.has(l)?!0:p(s,l).length?(m(c)&&(c=new W,T.set(s,c)),c.add(l),!0):!1},OrdinaryDefineOwnMetadata:t,OrdinaryHasOwnMetadata:n,OrdinaryGetOwnMetadata:o,OrdinaryOwnMetadataKeys:p,OrdinaryDeleteMetadata:S};return y}function U(e,t,n){var o=Y.getProvider(e,t);if(!m(o))return o;if(n){if(Y.setProvider(e,t,ce))return ce;throw new Error("Illegal state.")}}function Ke(){var e={},t=[],n=(function(){function y(s,l,c){this._index=0,this._keys=s,this._values=l,this._selector=c}return y.prototype["@@iterator"]=function(){return this},y.prototype[g]=function(){return this},y.prototype.next=function(){var s=this._index;if(s>=0&&s<this._keys.length){var l=this._selector(this._keys[s],this._values[s]);return s+1>=this._keys.length?(this._index=-1,this._keys=t,this._values=t):this._index++,{value:l,done:!1}}return{value:void 0,done:!0}},y.prototype.throw=function(s){throw this._index>=0&&(this._index=-1,this._keys=t,this._values=t),s},y.prototype.return=function(s){return this._index>=0&&(this._index=-1,this._keys=t,this._values=t),{value:s,done:!0}},y})(),o=(function(){function y(){this._keys=[],this._values=[],this._cacheKey=e,this._cacheIndex=-2}return Object.defineProperty(y.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),y.prototype.has=function(s){return this._find(s,!1)>=0},y.prototype.get=function(s){var l=this._find(s,!1);return l>=0?this._values[l]:void 0},y.prototype.set=function(s,l){var c=this._find(s,!0);return this._values[c]=l,this},y.prototype.delete=function(s){var l=this._find(s,!1);if(l>=0){for(var c=this._keys.length,f=l+1;f<c;f++)this._keys[f-1]=this._keys[f],this._values[f-1]=this._values[f];return this._keys.length--,this._values.length--,ie(s,this._cacheKey)&&(this._cacheKey=e,this._cacheIndex=-2),!0}return!1},y.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=e,this._cacheIndex=-2},y.prototype.keys=function(){return new n(this._keys,this._values,p)},y.prototype.values=function(){return new n(this._keys,this._values,S)},y.prototype.entries=function(){return new n(this._keys,this._values,T)},y.prototype["@@iterator"]=function(){return this.entries()},y.prototype[g]=function(){return this.entries()},y.prototype._find=function(s,l){if(!ie(this._cacheKey,s)){this._cacheIndex=-1;for(var c=0;c<this._keys.length;c++)if(ie(this._keys[c],s)){this._cacheIndex=c;break}}return this._cacheIndex<0&&l&&(this._cacheIndex=this._keys.length,this._keys.push(s),this._values.push(void 0)),this._cacheIndex},y})();return o;function p(y,s){return y}function S(y,s){return s}function T(y,s){return[y,s]}}function et(){var e=(function(){function t(){this._map=new L}return Object.defineProperty(t.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),t.prototype.has=function(n){return this._map.has(n)},t.prototype.add=function(n){return this._map.set(n,n),this},t.prototype.delete=function(n){return this._map.delete(n)},t.prototype.clear=function(){this._map.clear()},t.prototype.keys=function(){return this._map.keys()},t.prototype.values=function(){return this._map.keys()},t.prototype.entries=function(){return this._map.entries()},t.prototype["@@iterator"]=function(){return this.keys()},t.prototype[g]=function(){return this.keys()},t})();return e}function tt(){var e=16,t=_.create(),n=o();return(function(){function s(){this._key=o()}return s.prototype.has=function(l){var c=p(l,!1);return c!==void 0?_.has(c,this._key):!1},s.prototype.get=function(l){var c=p(l,!1);return c!==void 0?_.get(c,this._key):void 0},s.prototype.set=function(l,c){var f=p(l,!0);return f[this._key]=c,this},s.prototype.delete=function(l){var c=p(l,!1);return c!==void 0?delete c[this._key]:!1},s.prototype.clear=function(){this._key=o()},s})();function o(){var s;do s="@@WeakMap@@"+y();while(_.has(t,s));return t[s]=!0,s}function p(s,l){if(!a.call(s,n)){if(!l)return;Object.defineProperty(s,n,{value:_.create()})}return s[n]}function S(s,l){for(var c=0;c<l;++c)s[c]=Math.random()*255|0;return s}function T(s){if(typeof Uint8Array=="function"){var l=new Uint8Array(s);return typeof crypto<"u"?crypto.getRandomValues(l):typeof msCrypto<"u"?msCrypto.getRandomValues(l):S(l,s),l}return S(new Array(s),s)}function y(){var s=T(e);s[6]=s[6]&79|64,s[8]=s[8]&191|128;for(var l="",c=0;c<e;++c){var f=s[c];(c===4||c===6||c===8)&&(l+="-"),f<16&&(l+="0"),l+=f.toString(16).toLowerCase()}return l}}function ae(e){return e.__=void 0,delete e.__,e}})})(_e||(_e={}))});var vt={};ct(vt,{PurenowRuntimeCli:()=>q,PurenowRuntimeStacksDeployService:()=>B,RuntimeDeploymentStrategy:()=>ee,RuntimeTemplateService:()=>Q,buildStaticHtml:()=>Ce,createRuntimeCli:()=>gt});module.exports=ft(vt);var Jt=I(X());var Bt=I(X()),V=I(require("process")),J=require("@worktif/purenow/bin");var k=I(require("fs")),O=I(require("path")),Ee=require("@worktif/purenow/infra"),se=require("@worktif/purenow/bin"),Q=class{constructor(r=process.cwd()){this.cwd=r;let i=[O.join(__dirname,"templates"),O.join(__dirname,"..","..","..","src","bin","templates"),O.join(O.dirname(process.argv[1]||""),"templates")],a=i.find(u=>k.existsSync(u));a?this.templatesDir=a:this.templatesDir=i[0]}async scaffold(r,i,a,u="purenow"){let d=O.join(this.templatesDir,u,r);if(!k.existsSync(d))throw new se.ValidationError(`Template '${r}' not found`,"Available templates: purenow-basic");let g=O.resolve(this.cwd,i);this.validateTargetDirectory(g,a.force),k.existsSync(g)||k.mkdirSync(g,{recursive:!0});let M={projectName:a.projectName};await this.copyTemplateFiles(d,g,M),await this.generateConfig(g,a.projectName),await this.generateTsConfig(g)}async generateConfig(r,i){let a=`/*
2
+ * Purenow Configuration
3
+ *
4
+ * This file configures your Purenow serverless React SSR application.
5
+ * See: https://github.com/worktif/purenow
6
+ */
7
+
8
+ import { PurenowCliConfig } from '@worktif/purenow';
9
+
10
+ const config: PurenowCliConfig = {
11
+ projectName: '${i}',
12
+
13
+ stages: [
14
+ {
15
+ name: 'dev',
16
+ awsRegion: 'us-east-1',
17
+ // awsProfile: 'default', // Optional: AWS profile to use
18
+ },
19
+ {
20
+ name: 'staging',
21
+ awsRegion: 'us-east-1',
22
+ // domain: 'example.com', // Optional: custom domain
23
+ // subdomain: 'staging', // Optional: subdomain prefix
24
+ },
25
+ {
26
+ name: 'prod',
27
+ awsRegion: 'us-east-1',
28
+ // domain: 'example.com',
29
+ },
30
+ ],
31
+
32
+ paths: {
33
+ srcDir: 'src',
34
+ reactEntry: 'src/index.tsx',
35
+ outDir: 'out/dist',
36
+ cdkDir: 'cdk',
37
+ },
38
+
39
+ infraMode: 'cdk',
40
+
41
+ features: {
42
+ enableSeo: false,
43
+ enableManifest: true,
44
+ enableWarmup: false,
45
+ clearCacheOnDeploy: true,
46
+ },
47
+ };
48
+
49
+ export default config;
50
+ `,u=O.join(r,"purenow.config.ts");k.writeFileSync(u,a,"utf-8")}async generateTsConfig(r){let i={compilerOptions:{target:"ES2020",lib:["ES2020","DOM","DOM.Iterable"],jsx:"react-jsx",module:"commonjs",moduleResolution:"node",resolveJsonModule:!0,allowJs:!0,outDir:"./out/tsc",rootDir:"./",strict:!0,esModuleInterop:!0,skipLibCheck:!0,forceConsistentCasingInFileNames:!0,experimentalDecorators:!0,emitDecoratorMetadata:!0,declaration:!0,declarationMap:!0,sourceMap:!0,baseUrl:".",paths:{"@core/*":["src/core/*"],"@lib/*":["src/lib/*"],"@utils/*":["src/utils/*"],"@bin/*":["src/bin/*"]}},include:["src/**/*"],exclude:["node_modules","out","dist","cdk.out"]},a=O.join(r,"tsconfig.json");k.writeFileSync(a,JSON.stringify(i,null,2),"utf-8")}validateTargetDirectory(r,i){if(!k.existsSync(r))return;if(k.readdirSync(r).length>0&&!i)throw new se.ValidationError("Target directory is not empty",`Use --force flag to overwrite existing files in ${r}`)}cdkDirectoryExists(r=this.cwd){let i=O.resolve(r,"cdk");return k.existsSync(i)&&k.existsSync(O.join(i,"bin","app.ts"))}async copyTemplateFiles(r,i,a){let u=k.readdirSync(r,{withFileTypes:!0});for(let d of u){let g=O.join(r,d.name),M=d.name;d.name==="gitignore.template"?M=".gitignore":d.name.endsWith(".template")&&(M=d.name.replace(/\.template$/,""));let R=O.join(i,M);if(d.isDirectory())k.existsSync(R)||k.mkdirSync(R,{recursive:!0}),await this.copyTemplateFiles(g,R,a);else{let D=k.readFileSync(g,"utf-8");D=this.substituteVariables(D,a),k.writeFileSync(R,D,"utf-8")}}}substituteVariables(r,i){let a=r;for(let[u,d]of Object.entries(i)){let g=new RegExp(`\\{\\{\\s*${u}\\s*\\}\\}`,"g"),M=u==="projectName"?(0,Ee.sanitizeStackName)(d):d;a=a.replace(g,M)}return a}};var K=I(require("fs")),H=require("@worktif/purenow/infra"),$=require("@worktif/purenow/bin"),B=class extends $.StacksDeployService{constructor(i=process.cwd()){super(i);this.cwd=i;this.DEFAULT_CDK_DIR="cdk"}async executeDeploy(i,a){let{stage:u,config:d}=i,g=(0,H.sanitizeStackName)(`${i.config.projectName}-PurenowInfra-${u}`),M=(0,H.sanitizeStackName)(`${i.config.projectName}-PurenowRuntime-${u}`),R=(0,H.sanitizeStackName)(`${i.config.projectName}-RuntimeWeb-${u}`);if(!(0,$.getStage)(d,u))throw new $.DeploymentError(`Stage '${u}' not found in configuration`,`Available stages: ${d.stages.map(z=>z.name).join(", ")}`);console.log("Deploying Infrastructure stack...");let _=await this.deployCdkStack(g,u,d);if(!_.success)throw new $.DeploymentError("Infrastructure deployment failed","Runtime stack will not be deployed. Fix Infra issues and retry.");console.log("Deploying PurenowRuntime stack...");let j=await this.deployCdkStack(M,u,d);if(!j.success)throw new $.DeploymentError("Runtime deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");console.log("Deploying RuntimeWeb stack...");let L=await this.deployCdkStack(R,u,d);if(!L.success)throw new $.DeploymentError("RuntimeWeb deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");let W=Date.now()-a;return{success:!0,infraStack:_,runtimeStack:j,runtimeWebStack:L,duration:W}}parseStackOutputs(i,a){let u=super.parseStackOutputs(i,a);if(!K.existsSync(a))return u;try{let d=K.readFileSync(a,"utf-8"),M=JSON.parse(d)[i];M&&(u.lambdaArnList=Object.keys(M).filter(R=>R.match(/(?:Lambda)[a-zA-Z]+Arn$/)).map(R=>M[R]))}catch(d){console.warn(`Failed to parse outputs file for ${i}: ${d instanceof Error?d.message:String(d)}`)}return u}getRegionSignature(i){return i?i.split("-").filter(Boolean).map(a=>a[0]??"").join(""):""}resourceName({name:i,serviceName:a,stage:u,region:d}){let g=(0,H.sanitizeStackName)(this.getRegionSignature(d||"us-east-1"));return`${a}-${i}-${g}-${u}`}};var ee=class{constructor(){this.role="deployment";this.name="runtime-purenow-runtime-stacks"}async validateDeployment(r){try{return r.envValidator.isValid(),r.logger.info("Runtime deployment validation passed"),!0}catch(i){return r.logger.error(`Runtime deployment validation failed: ${i instanceof Error?i.message:String(i)}`),!1}}async executeDeployment(r,i){let a=i,{logger:u,options:d}=a;try{if(!(await r.stacksDeployService.deploy({stage:d.stage,config:r.config,skipBuild:d.skipBuild||!1})).success)throw new Error("Runtime Target stacks deployment failed");u.info("Runtime Target stack deployed successfully"),u.success("Infrastructure stack deployed successfully")}catch(g){throw u.error(`Runtime Target deployment failed: ${g instanceof Error?g.message:String(g)}`),g}}async postDeployment(r){}};var Et=I(X());var G=I(require("path")),P=I(require("fs")),te=5*1024*1024,ue=10*1024*1024,De=1*1024*1024;function dt(){let h=process.cwd(),r=G.default.join(h,"public/index.html"),i=!0;if(!P.default.existsSync(r)){if(i)return console.warn(`
51
+ `+"=".repeat(80)),console.warn("DEPRECATION WARNING: Missing public/index.html"),console.warn("=".repeat(80)),console.warn(`
52
+ File not found: ${r}`),console.warn(`
53
+ The Purenow framework is using a fallback HTML template.`),console.warn("This fallback will be removed in a future version."),console.warn(`
54
+ Action required: Create public/index.html in your project root.`),console.warn(`
55
+ Minimal template structure:`),console.warn(""),console.warn("<!DOCTYPE html>"),console.warn('<html lang="en">'),console.warn(" <head>"),console.warn(' <meta charset="utf-8" />'),console.warn(' <meta name="viewport" content="width=device-width, initial-scale=1" />'),console.warn(" </head>"),console.warn(" <body>"),console.warn(' <div id="root-purenow"></div>'),console.warn(" </body>"),console.warn("</html>"),console.warn(`
56
+ `+"=".repeat(80)+`
57
+ `),ht();throw new Error(`
58
+ ${"=".repeat(80)}
59
+ BUILD ERROR: Missing public/index.html
60
+ ${"=".repeat(80)}
61
+
62
+ File not found: ${r}
63
+
64
+ The Purenow framework requires a base HTML template in your project.
65
+
66
+ Action required: Create public/index.html with the following minimal structure:
67
+
68
+ <!DOCTYPE html>
69
+ <html lang="en">
70
+ <head>
71
+ <meta charset="utf-8" />
72
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
73
+ </head>
74
+ <body>
75
+ <div id="root-purenow"></div>
76
+ </body>
77
+ </html>
78
+
79
+ ${"=".repeat(80)}
80
+ `)}let a=P.default.readFileSync(r,"utf-8");if(!a||a.trim().length===0)throw new Error(`
81
+ ${"=".repeat(80)}
82
+ BUILD ERROR: Empty public/index.html
83
+ ${"=".repeat(80)}
84
+
85
+ File location: ${r}
86
+
87
+ The file exists but is empty. It must contain a valid HTML document structure.
88
+
89
+ Action required: Add HTML content to public/index.html.
90
+
91
+ ${"=".repeat(80)}
92
+ `);return pt(a,r),mt(a,r),a}function pt(h,r){let i=Buffer.byteLength(h,"utf-8"),a=(i/(1024*1024)).toFixed(2);if(i>te){let u=(te/1048576).toFixed(2);throw new Error(`
93
+ ${"=".repeat(80)}
94
+ BUILD ERROR: HTML template too large
95
+ ${"=".repeat(80)}
96
+
97
+ File: ${r}
98
+ Size: ${a} MB
99
+ Maximum allowed: ${u} MB
100
+
101
+ The HTML template is too large and will cause the Lambda bundle to exceed
102
+ the AWS 10MB deployment limit.
103
+
104
+ Action required: Reduce the size of public/index.html by:
105
+ - Removing inline styles (use external CSS files instead)
106
+ - Removing inline scripts (use external JS files instead)
107
+ - Removing large embedded data (use external files instead)
108
+ - Minimizing HTML comments and whitespace
109
+
110
+ ${"=".repeat(80)}
111
+ `)}if(i>De){let u=(De/1048576).toFixed(2);console.warn(`
112
+ `+"=".repeat(80)),console.warn("WARNING: Large HTML template detected"),console.warn("=".repeat(80)),console.warn(`
113
+ File: ${r}`),console.warn(`Size: ${a} MB (threshold: ${u} MB)`),console.warn(`
114
+ A large HTML template increases Lambda bundle size and cold start time.`),console.warn(`
115
+ Consider:`),console.warn(" - Moving inline styles to external CSS files"),console.warn(" - Moving inline scripts to external JS files"),console.warn(" - Reducing embedded data and comments"),console.warn(`
116
+ `+"=".repeat(80)+`
117
+ `)}}function mt(h,r){let i=[];/<html[^>]*>/i.test(h)||i.push("<html>"),/<head[^>]*>/i.test(h)||i.push("<head>"),/<body[^>]*>/i.test(h)||i.push("<body>"),i.length>0&&(console.warn(`
118
+ `+"=".repeat(80)),console.warn("WARNING: Invalid HTML structure detected"),console.warn("=".repeat(80)),console.warn(`
119
+ File: ${r}`),console.warn(`Missing required tags: ${i.join(", ")}`),console.warn(`
120
+ The HTML template may not render correctly at runtime.`),console.warn(`
121
+ Action recommended: Add the missing tags to public/index.html.`),console.warn(`
122
+ `+"=".repeat(80)+`
123
+ `))}function ht(){return`<!DOCTYPE html>
124
+ <html lang="en">
125
+ <head>
126
+ <meta charset="utf-8" />
127
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
128
+ <meta name="theme-color" content="#000000" />
129
+ </head>
130
+ <body>
131
+ <noscript>You need to enable JavaScript to run this app.</noscript>
132
+ <div id="root-internal">Loading...</div>
133
+ <div id="root-purenow"></div>
134
+ </body>
135
+ </html>`}function yt(h){if(!P.default.existsSync(h)){console.warn(`Warning: Could not validate bundle size - embedded file not found: ${h}`);return}let r=P.default.statSync(h).size,i=(r/(1024*1024)).toFixed(2);if(r>te)throw new Error(`
136
+ ${"=".repeat(80)}
137
+ BUILD ERROR: Embedded template file too large
138
+ ${"=".repeat(80)}
139
+
140
+ File: ${h}
141
+ Size: ${i} MB
142
+ Maximum allowed: ${(te/(1024*1024)).toFixed(2)} MB
143
+
144
+ The embedded template file will cause the Lambda bundle to exceed the
145
+ AWS 10MB deployment limit.
146
+
147
+ Action required: Reduce the size of public/index.html.
148
+
149
+ ${"=".repeat(80)}
150
+ `);let a=G.default.join(__dirname,"../../out/dist/lambda/bundle.js");if(P.default.existsSync(a)){let u=P.default.statSync(a).size,d=(u/(1024*1024)).toFixed(2);console.log(` Lambda bundle size: ${d} MB (existing bundle)`),u>ue?(console.warn(`
151
+ `+"=".repeat(80)),console.warn("WARNING: Existing Lambda bundle exceeds AWS limit"),console.warn("=".repeat(80)),console.warn(`
152
+ Bundle: ${a}`),console.warn(`Size: ${d} MB`),console.warn(`AWS Lambda limit: ${(ue/(1024*1024)).toFixed(2)} MB`),console.warn(`
153
+ Note: This is the existing bundle before template embedding.`),console.warn("The bundle will be rebuilt with the new template."),console.warn(`
154
+ If the bundle size issue persists after rebuild:`),console.warn(" 1. Externalize large dependencies in esbuild config"),console.warn(" 2. Use Lambda layers for large dependencies"),console.warn(" 3. Reduce the size of public/index.html if needed"),console.warn(`
155
+ `+"=".repeat(80)+`
156
+ `)):u>8388608&&(console.warn(`
157
+ `+"=".repeat(80)),console.warn("WARNING: Lambda bundle approaching size limit"),console.warn("=".repeat(80)),console.warn(`
158
+ Bundle size: ${d} MB`),console.warn(`AWS limit: ${(ue/(1024*1024)).toFixed(2)} MB`),console.warn(`
159
+ Consider optimizing the bundle to avoid deployment failures.`),console.warn(`
160
+ `+"=".repeat(80)+`
161
+ `))}}function wt(){let h=dt(),r=`/*
162
+ * Elastic License 2.0
163
+ * Copyright (C) 2025\u2013present Raman Marozau, Work Target Insight Function. All rights reserved.
164
+ * Contact: raman@worktif.com
165
+ *
166
+ * This file is part of the Licensed Work: worktif.purenow.cdk <worktif_purenow_cdk>.
167
+ * Use of this software is governed by the Elastic License 2.0; see the LICENSE file
168
+ * or https://www.elastic.co/licensing/elastic-license for details.
169
+ *
170
+ * Re-licensing notice:
171
+ * This file was previously distributed under the Business Source License 1.1 (BUSL-1.1).
172
+ * As of 2025-09-22, it is re-licensed under Elastic License 2.0.
173
+ *
174
+ * SPDX-License-Identifier: Elastic-2.0
175
+ */
176
+
177
+ /**
178
+ * Embedded HTML template from public/index.html.
179
+ *
180
+ * This file is auto-generated at build time by bin/deploy/generate-html-template.js.
181
+ * DO NOT EDIT THIS FILE MANUALLY - changes will be overwritten on next build.
182
+ *
183
+ * To modify the HTML template, edit public/index.html in your project root.
184
+ */
185
+
186
+ export const HTML_TEMPLATE = ${JSON.stringify(h)};
187
+ `,i=G.default.join(__dirname,"../../src/core/services/template/html-template.embedded.ts"),a=G.default.dirname(i);P.default.existsSync(a)||P.default.mkdirSync(a,{recursive:!0}),P.default.writeFileSync(i,r,"utf-8");let u=(h.length/1024).toFixed(2);yt(i)}function Ce(h=!1){try{wt(),h&&process.exit(0)}catch(r){console.error(`
188
+ `+"=".repeat(80)),console.error("BUILD FAILED: HTML Template Generation Error"),console.error("=".repeat(80)),console.error(`
189
+ `+r.message),r.stack&&process.env.DEBUG&&(console.error(`
190
+ Stack trace:`),console.error(r.stack)),h&&process.exit(1)}}var le=class extends Error{constructor(i,a,u){super(i);this.code=a;this.hint=u;this.name="RuntimeCliError",Error.captureStackTrace(this,this.constructor)}};var ne=class{formatError(r,i=!1){let a=[];return a.push(`Error: ${r.name||"RuntimeError"}`),a.push(""),a.push(`Message: ${r.message}`),a.push(""),r instanceof le&&r.hint&&(a.push(`Hint: ${r.hint}`),a.push("")),i&&r.stack&&(a.push("--- Stack Trace (--verbose) ---"),a.push(r.stack),a.push("")),a.join(`
191
+ `)}formatValidationError(r,i,a=!1){let u=[];return u.push("Validation Error"),u.push(""),u.push(`Field: ${r}`),u.push(`Issue: ${i}`),u.push(""),a&&(u.push("--- Technical Details (--verbose) ---"),u.push(`Field validation failed for: ${r}`),u.push(`Validation message: ${i}`),u.push("")),u.join(`
192
+ `)}formatDeploymentError(r,i,a,u=!1){let d=[];return d.push("Deployment Error"),d.push(""),d.push(`Stack: ${r}`),d.push(`Operation: ${i}`),d.push(`Issue: ${a}`),d.push(""),d.push("Troubleshooting:"),d.push("1. Check AWS credentials and permissions"),d.push("2. Verify stack configuration"),d.push("3. Review CloudFormation events in AWS Console"),d.push(""),u&&(d.push("--- Technical Details (--verbose) ---"),d.push(`Stack name: ${r}`),d.push(`Failed operation: ${i}`),d.push(`Error details: ${a}`),d.push("")),d.join(`
193
+ `)}};var q=class h extends J.PurenowCli{static{this.defaultToolName="runtime"}constructor(){super(void 0,{toolName:J.PurenowCli.defaultToolName,title:"Runtime target framework for AWS Lambda",description:"Runtime target framework for AWS Lambda",fallbackVersion:"0.2.135"}),this.commands=(0,J.purenowCommandConfig)(h.defaultToolName)}async createContext(r,i=V.default.cwd()){let a=await super.createContext(r,i),u=new B(i);return{...a,stacksDeployService:u}}async run(r){await this.program.parseAsync(r||V.default.argv)}static handleError(r){let i=new ne;if(r instanceof Error){let a=i.formatError(r,!!V.default.env.DEBUG);console.error(a)}else console.error("Unknown error:",String(r));V.default.exit(1)}};function gt(){return new q}0&&(module.exports={PurenowRuntimeCli,PurenowRuntimeStacksDeployService,RuntimeDeploymentStrategy,RuntimeTemplateService,buildStaticHtml,createRuntimeCli});
194
+ /*! Bundled license information:
195
+
196
+ reflect-metadata/Reflect.js:
197
+ (*! *****************************************************************************
198
+ Copyright (C) Microsoft. All rights reserved.
199
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
200
+ this file except in compliance with the License. You may obtain a copy of the
201
+ License at http://www.apache.org/licenses/LICENSE-2.0
202
+
203
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
204
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
205
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
206
+ MERCHANTABLITY OR NON-INFRINGEMENT.
207
+
208
+ See the Apache Version 2.0 License for specific language governing permissions
209
+ and limitations under the License.
210
+ ***************************************************************************** *)
211
+ */
212
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi9zcmMvYmluL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vcHVyZW5vdy1ydW50aW1lLWNsaS50cyIsICIuLi8uLi8uLi9zcmMvYmluL3NlcnZpY2VzL3RlbXBsYXRlLnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9zZXJ2aWNlcy9wdXJlbm93LXJ1bnRpbWUtc3RhY2tzLWRlcGxveS5zZXJ2aWNlLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvcHVyZW5vdy1ydW50aW1lLWRlcGxveW1lbnQuc3RyYXRlZ3kudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9zZXJ2aWNlcy9wdXJlbm93LXJ1bnRpbWUtc3RhY2tzLWRlcGxveS5zZXJ2aWNlLnR5cGVzLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvdXRpbHMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi91dGlscy9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xudmFyIFJlZmxlY3Q7XG4oZnVuY3Rpb24gKFJlZmxlY3QpIHtcbiAgICAvLyBNZXRhZGF0YSBQcm9wb3NhbFxuICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvXG4gICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09IFwib2JqZWN0XCIgPyBnbG9iYWxUaGlzIDpcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzbG9wcHlNb2RlVGhpcygpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihyb290LlJlZmxlY3QsIGV4cG9ydGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmYWN0b3J5KGV4cG9ydGVyLCByb290KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJvb3QuUmVmbGVjdCA9IFJlZmxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZUV4cG9ydGVyKHRhcmdldCwgcHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZnVuY3Rpb25UaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oXCJyZXR1cm4gdGhpcztcIikoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpbmRpcmVjdEV2YWxUaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgMCwgZXZhbCkoXCIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSgpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNsb3BweU1vZGVUaGlzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uVGhpcygpIHx8IGluZGlyZWN0RXZhbFRoaXMoKTtcbiAgICAgICAgfVxuICAgIH0pKGZ1bmN0aW9uIChleHBvcnRlciwgcm9vdCkge1xuICAgICAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICAgICAgLy8gZmVhdHVyZSB0ZXN0IGZvciBTeW1ib2wgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHZhciB0b1ByaW1pdGl2ZVN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wudG9QcmltaXRpdmUgOiBcIkBAdG9QcmltaXRpdmVcIjtcbiAgICAgICAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC5pdGVyYXRvciA6IFwiQEBpdGVyYXRvclwiO1xuICAgICAgICB2YXIgc3VwcG9ydHNDcmVhdGUgPSB0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiOyAvLyBmZWF0dXJlIHRlc3QgZm9yIE9iamVjdC5jcmVhdGUgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNQcm90byA9IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXk7IC8vIGZlYXR1cmUgdGVzdCBmb3IgX19wcm90b19fIHN1cHBvcnRcbiAgICAgICAgdmFyIGRvd25MZXZlbCA9ICFzdXBwb3J0c0NyZWF0ZSAmJiAhc3VwcG9ydHNQcm90bztcbiAgICAgICAgdmFyIEhhc2hNYXAgPSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYW4gb2JqZWN0IGluIGRpY3Rpb25hcnkgbW9kZSAoYS5rLmEuIFwic2xvd1wiIG1vZGUgaW4gdjgpXG4gICAgICAgICAgICBjcmVhdGU6IHN1cHBvcnRzQ3JlYXRlXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeShPYmplY3QuY3JlYXRlKG51bGwpKTsgfVxuICAgICAgICAgICAgICAgIDogc3VwcG9ydHNQcm90b1xuICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHsgX19wcm90b19fOiBudWxsIH0pOyB9XG4gICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoe30pOyB9LFxuICAgICAgICAgICAgaGFzOiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGtleSBpbiBtYXA7IH0sXG4gICAgICAgICAgICBnZXQ6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSkgPyBtYXBba2V5XSA6IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBtYXBba2V5XTsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gTG9hZCBnbG9iYWwgb3Igc2hpbSB2ZXJzaW9ucyBvZiBNYXAsIFNldCwgYW5kIFdlYWtNYXBcbiAgICAgICAgdmFyIGZ1bmN0aW9uUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKTtcbiAgICAgICAgdmFyIF9NYXAgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gTWFwIDogQ3JlYXRlTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9TZXQgPSB0eXBlb2YgU2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gU2V0IDogQ3JlYXRlU2V0UG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9XZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIHJlZ2lzdHJ5U3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgPyBTeW1ib2wuZm9yKFwiQHJlZmxlY3QtbWV0YWRhdGE6cmVnaXN0cnlcIikgOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtZXRhZGF0YVJlZ2lzdHJ5ID0gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCk7XG4gICAgICAgIHZhciBtZXRhZGF0YVByb3ZpZGVyID0gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihtZXRhZGF0YVJlZ2lzdHJ5KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGxpZXMgYSBzZXQgb2YgZGVjb3JhdG9ycyB0byBhIHByb3BlcnR5IG9mIGEgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIGRlY29yYXRvcnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9ycy5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSB0byBkZWNvcmF0ZS5cbiAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBrZXkuXG4gICAgICAgICAqIEByZW1hcmtzIERlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgRXhhbXBsZSA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGF0dHJpYnV0ZXMpICYmICFJc1VuZGVmaW5lZChhdHRyaWJ1dGVzKSAmJiAhSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKElzTnVsbChhdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGVDb25zdHJ1Y3RvcihkZWNvcmF0b3JzLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVjb3JhdGVcIiwgZGVjb3JhdGUpO1xuICAgICAgICAvLyA0LjEuMiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNyZWZsZWN0Lm1ldGFkYXRhXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmF1bHQgbWV0YWRhdGEgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBvbiBhIGNsYXNzLCBjbGFzcyBtZW1iZXIsIG9yIHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEgZW50cnkuXG4gICAgICAgICAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBgbWV0YWRhdGFLZXlgIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlIHRhcmdldCBhbmQgdGFyZ2V0IGtleSwgdGhlXG4gICAgICAgICAqIG1ldGFkYXRhVmFsdWUgZm9yIHRoYXQga2V5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yLCBUeXBlU2NyaXB0IG9ubHkpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgcHJvcGVydHk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSAmJiAhSXNQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBBIHZhbHVlIHRoYXQgY29udGFpbnMgYXR0YWNoZWQgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gZGVjb3JhdG9yIGZhY3RvcnkgYXMgbWV0YWRhdGEtcHJvZHVjaW5nIGFubm90YXRpb24uXG4gICAgICAgICAqICAgICBmdW5jdGlvbiBNeUFubm90YXRpb24ob3B0aW9ucyk6IERlY29yYXRvciB7XG4gICAgICAgICAqICAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleT8pID0+IFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCB0YXJnZXQsIGtleSk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWZpbmVNZXRhZGF0YVwiLCBkZWZpbmVNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluOyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJoYXNNZXRhZGF0YVwiLCBoYXNNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IGhhcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Q7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc093bk1ldGFkYXRhXCIsIGhhc093bk1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFcIiwgZ2V0TWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFcIiwgZ2V0T3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE1ldGFkYXRhS2V5c1wiLCBnZXRNZXRhZGF0YUtleXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFLZXlzXCIsIGdldE93bk1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBtZXRhZGF0YSBlbnRyeSBmcm9tIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIGtleS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGVudHJ5IHdhcyBmb3VuZCBhbmQgZGVsZXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcih0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVsZXRlTWV0YWRhdGFcIiwgZGVsZXRlTWV0YWRhdGEpO1xuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZGVjb3JhdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGRlY29yYXRlZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjEuMSBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc21ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICghSXNOdWxsKHBhcmVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4ocHJvdmlkZXIuT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgcHJvdmlkZXIuT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjYuMSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgb3duS2V5cyA9IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEtleXMgPSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICAgICAgICAgICAgaWYgKHBhcmVudEtleXMubGVuZ3RoIDw9IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICBpZiAob3duS2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50S2V5cztcbiAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgb3duS2V5c18xID0gb3duS2V5czsgX2kgPCBvd25LZXlzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IG93bktleXNfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgcGFyZW50S2V5c18xID0gcGFyZW50S2V5czsgX2EgPCBwYXJlbnRLZXlzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcmVudEtleXNfMVtfYV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNiBFQ01BU2NyaXB0IERhdGEgVHlwZXMgYW5kIFZhbHVlc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xuICAgICAgICBmdW5jdGlvbiBUeXBlKHgpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIE51bGwgKi87XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOiByZXR1cm4gMCAvKiBVbmRlZmluZWQgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIDIgLyogQm9vbGVhbiAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHJldHVybiAzIC8qIFN0cmluZyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6IHJldHVybiA0IC8qIFN5bWJvbCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHJldHVybiA1IC8qIE51bWJlciAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHJldHVybiB4ID09PSBudWxsID8gMSAvKiBOdWxsICovIDogNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDYgLyogT2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS4xIFRoZSBVbmRlZmluZWQgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXVuZGVmaW5lZC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzVW5kZWZpbmVkKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjIgVGhlIE51bGwgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLW51bGwtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc051bGwoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjUgVGhlIFN5bWJvbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtc3ltYm9sLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNTeW1ib2woeCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS43IFRoZSBPYmplY3QgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc09iamVjdCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgPyB4ICE9PSBudWxsIDogdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEgVHlwZSBDb252ZXJzaW9uXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGUtY29udmVyc2lvblxuICAgICAgICAvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQsIFByZWZlcnJlZFR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoVHlwZShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogVW5kZWZpbmVkICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAxIC8qIE51bGwgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDIgLyogQm9vbGVhbiAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSA1IC8qIE51bWJlciAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhpbnQgPSBQcmVmZXJyZWRUeXBlID09PSAzIC8qIFN0cmluZyAqLyA/IFwic3RyaW5nXCIgOiBQcmVmZXJyZWRUeXBlID09PSA1IC8qIE51bWJlciAqLyA/IFwibnVtYmVyXCIgOiBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgIHZhciBleG90aWNUb1ByaW0gPSBHZXRNZXRob2QoaW5wdXQsIHRvUHJpbWl0aXZlU3ltYm9sKTtcbiAgICAgICAgICAgIGlmIChleG90aWNUb1ByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG4gICAgICAgICAgICAgICAgaWYgKElzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIGhpbnQgPT09IFwiZGVmYXVsdFwiID8gXCJudW1iZXJcIiA6IGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xLjEgT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuICAgICAgICAgICAgaWYgKGhpbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMSA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzEuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlT2YuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMiA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzIuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjIgVG9Cb29sZWFuKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLXRvYm9vbGVhblxuICAgICAgICBmdW5jdGlvbiBUb0Jvb2xlYW4oYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWFyZ3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xMiBUb1N0cmluZyhhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9zdHJpbmdcbiAgICAgICAgZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjE0IFRvUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAzIC8qIFN0cmluZyAqLyk7XG4gICAgICAgICAgICBpZiAoSXNTeW1ib2woa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yIFRlc3RpbmcgYW5kIENvbXBhcmlzb24gT3BlcmF0aW9uc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZXN0aW5nLWFuZC1jb21wYXJpc29uLW9wZXJhdGlvbnNcbiAgICAgICAgLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxuICAgICAgICBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShhcmd1bWVudClcbiAgICAgICAgICAgICAgICA6IGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgID8gYXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuMyBJc0NhbGxhYmxlKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlXG4gICAgICAgIGZ1bmN0aW9uIElzQ2FsbGFibGUoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuNCBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG4gICAgICAgIGZ1bmN0aW9uIElzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi43IElzUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBTYW1lVmFsdWVaZXJvKHgsIHkpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB5IHx8IHggIT09IHggJiYgeSAhPT0geTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjMgT3BlcmF0aW9ucyBvbiBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24tb2JqZWN0c1xuICAgICAgICAvLyA3LjMuOSBHZXRNZXRob2QoViwgUClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG4gICAgICAgIGZ1bmN0aW9uIEdldE1ldGhvZChWLCBQKSB7XG4gICAgICAgICAgICB2YXIgZnVuYyA9IFZbUF07XG4gICAgICAgICAgICBpZiAoZnVuYyA9PT0gdW5kZWZpbmVkIHx8IGZ1bmMgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQgT3BlcmF0aW9ucyBvbiBJdGVyYXRvciBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24taXRlcmF0b3Itb2JqZWN0c1xuICAgICAgICBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmopIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBHZXRNZXRob2Qob2JqLCBpdGVyYXRvclN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUobWV0aG9kKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIGZyb20gQ2FsbFxuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbWV0aG9kLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QoaXRlcmF0b3IpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNCBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtaXRlcmF0b3J2YWx1ZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC41IEl0ZXJhdG9yU3RlcChpdGVyYXRvcilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JzdGVwXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IGZhbHNlIDogcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yY2xvc2VcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIGYgPSBpdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgIGYuY2FsbChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gOS4xIE9yZGluYXJ5IE9iamVjdCBJbnRlcm5hbCBNZXRob2RzIGFuZCBJbnRlcm5hbCBTbG90c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgLy8gOS4xLjEuMSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5Z2V0cHJvdG90eXBlb2ZcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIE8gIT09IFwiZnVuY3Rpb25cIiB8fCBPID09PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc2V0IF9fcHJvdG9fXyBpbiBFUzUsIGFzIGl0J3Mgbm9uLXN0YW5kYXJkLlxuICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4gQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICAgIC8vIG11c3QgZWl0aGVyIHNldCBfX3Byb3RvX18gb24gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIC8vIG9yIGVuc3VyZSBlYWNoIGNsYXNzIGhhcyBhIHZhbGlkIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb24gaXRzIHByb3RvdHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBwb2ludHMgYmFjayB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBGdW5jdGlvbi5bW1Byb3RvdHlwZV1dLCB0aGVuIHRoaXMgaXMgZGVmaW5hdGVseSBpbmhlcml0ZWQuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gaW4gRVM2IG9yIHdoZW4gdXNpbmcgX19wcm90b19fIGluIGEgY29tcGF0aWJsZSBicm93c2VyLlxuICAgICAgICAgICAgaWYgKHByb3RvICE9PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGUsIG51bGwsIG9yIHVuZGVmaW5lZCwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPLnByb3RvdHlwZTtcbiAgICAgICAgICAgIHZhciBwcm90b3R5cGVQcm90byA9IHByb3RvdHlwZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICAgICAgICAgIGlmIChwcm90b3R5cGVQcm90byA9PSBudWxsIHx8IHByb3RvdHlwZVByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB3YXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90b3R5cGVQcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNvbWUga2luZCBvZiBzZWxmLXJlZmVyZW5jZSwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PT0gTylcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Vlc3MgYXQgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdsb2JhbCBtZXRhZGF0YSByZWdpc3RyeVxuICAgICAgICAvLyAtIEFsbG93cyBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiYCBhbmQgYGltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGEvbm8tY29uZmxpY3RcImAgdG8gaW50ZXJvcGVyYXRlLlxuICAgICAgICAvLyAtIFVzZXMgaXNvbGF0ZWQgbWV0YWRhdGEgaWYgYFJlZmxlY3RgIGlzIGZyb3plbiBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGNhbiBiZSBpbnN0YWxsZWQuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgcmVnaXN0cnkgdXNlZCB0byBhbGxvdyBtdWx0aXBsZSBgcmVmbGVjdC1tZXRhZGF0YWAgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpIHtcbiAgICAgICAgICAgIHZhciBmYWxsYmFjaztcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICEocmVnaXN0cnlTeW1ib2wgaW4gcm9vdC5SZWZsZWN0KSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiByb290LlJlZmxlY3QuZGVmaW5lTWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIGludGVyb3BlcmF0ZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgYHJlZmxlY3QtbWV0YWRhdGFgIHRoYXQgZGlkIG5vdCBzdXBwb3J0IGEgcmVnaXN0cnkuXG4gICAgICAgICAgICAgICAgZmFsbGJhY2sgPSBDcmVhdGVGYWxsYmFja1Byb3ZpZGVyKHJvb3QuUmVmbGVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZmlyc3Q7XG4gICAgICAgICAgICB2YXIgc2Vjb25kO1xuICAgICAgICAgICAgdmFyIHJlc3Q7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0UHJvdmlkZXJNYXAgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlclByb3ZpZGVyOiByZWdpc3RlclByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIGdldFByb3ZpZGVyOiBnZXRQcm92aWRlcixcbiAgICAgICAgICAgICAgICBzZXRQcm92aWRlcjogc2V0UHJvdmlkZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZShyZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBwcm92aWRlciB0byBhIGZyb3plbiByZWdpc3RyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZhbGxiYWNrID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoZmlyc3QpOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZpcnN0ID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoc2Vjb25kKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vjb25kID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdC5hZGQocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZpcnN0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChzZWNvbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kLmlzUHJvdmlkZXJGb3IoTywgUCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEl0ZXJhdG9yVmFsdWUobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZhbGxiYWNrKSAmJiBmYWxsYmFjay5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFByb3ZpZGVyKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXJNYXAgPSB0YXJnZXRQcm92aWRlck1hcC5nZXQoTyk7XG4gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJNYXAuZ2V0KFApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3ZpZGVyTWFwLnNldChPLCBwcm92aWRlck1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAuc2V0KFAsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gaGFzUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSBwcm92aWRlciB8fCBzZWNvbmQgPT09IHByb3ZpZGVyIHx8ICFJc1VuZGVmaW5lZChyZXN0KSAmJiByZXN0Lmhhcyhwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghaGFzUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIHByb3ZpZGVyIG5vdCByZWdpc3RlcmVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nUHJvdmlkZXIgPSBnZXRQcm92aWRlcihPLCBQKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQcm92aWRlciAhPT0gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChleGlzdGluZ1Byb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvciBjcmVhdGVzIHRoZSBzaGFyZWQgcmVnaXN0cnkgb2YgbWV0YWRhdGEgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdHJ5U3ltYm9sKSAmJiBJc09iamVjdChyb290LlJlZmxlY3QpICYmIE9iamVjdC5pc0V4dGVuc2libGUocm9vdC5SZWZsZWN0KSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkgPSByb290LlJlZmxlY3RbcmVnaXN0cnlTeW1ib2xdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhUmVnaXN0cnkpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IENyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3QuUmVmbGVjdCwgcmVnaXN0cnlTeW1ib2wsIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1ldGFkYXRhUmVnaXN0cnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVJlZ2lzdHJ5O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1ldGFkYXRhUHJvdmlkZXIocmVnaXN0cnkpIHtcbiAgICAgICAgICAgIC8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90XG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGFkYXRhLmhhcyhQKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGE6IE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogT3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBPcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzOiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkucmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcik7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KE8sIHRhcmdldE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLnNldChQLCBtZXRhZGF0YU1hcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cnkuc2V0UHJvdmlkZXIoTywgUCwgcHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZFRhcmdldE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZGVsZXRlKE8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgcHJvdmlkZXIgZm9yIHRhcmdldC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4obWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjUuMSBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcC5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgdmFyIGtleXNPYmogPSBtZXRhZGF0YU1hcC5rZXlzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3Ioa2V5c09iaik7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmxlbmd0aCA9IGs7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUoTWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1ldGFkYXRhLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUodGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocmVmbGVjdCkge1xuICAgICAgICAgICAgdmFyIGRlZmluZU1ldGFkYXRhID0gcmVmbGVjdC5kZWZpbmVNZXRhZGF0YSwgaGFzT3duTWV0YWRhdGEgPSByZWZsZWN0Lmhhc093bk1ldGFkYXRhLCBnZXRPd25NZXRhZGF0YSA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhS2V5cyA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzLCBkZWxldGVNZXRhZGF0YSA9IHJlZmxlY3QuZGVsZXRlTWV0YWRhdGE7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFPd25lciA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbWV0YWRhdGFPd25lci5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkgJiYgbWV0YWRhdGFQcm9wZXJ0eVNldC5oYXMoUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd25NZXRhZGF0YUtleXMoTywgUCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbmV3IF9TZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU93bmVyLnNldChPLCBtZXRhZGF0YVByb3BlcnR5U2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQuYWRkKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogZGVmaW5lTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogaGFzT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlHZXRPd25NZXRhZGF0YTogZ2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IGdldE93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBkZWxldGVNZXRhZGF0YSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHByb3ZpZGVyIGZvciBhbiBvYmplY3QuIElmIHRoZSBvYmplY3QgaGFzIG5vIG1ldGFkYXRhIHByb3ZpZGVyIGFuZCB0aGlzIGlzIGZvciBhIGNyZWF0ZSBvcGVyYXRpb24sXG4gICAgICAgICAqIHRoZW4gdGhpcyBtb2R1bGUncyBtZXRhZGF0YSBwcm92aWRlciBpcyBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCBDcmVhdGUpIHtcbiAgICAgICAgICAgIHZhciByZWdpc3RlcmVkUHJvdmlkZXIgPSBtZXRhZGF0YVJlZ2lzdHJ5LmdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RlcmVkUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRQcm92aWRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFSZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBtZXRhZGF0YVByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFQcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIE1hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlU2VudGluZWwgPSB7fTtcbiAgICAgICAgICAgIHZhciBhcnJheVNlbnRpbmVsID0gW107XG4gICAgICAgICAgICB2YXIgTWFwSXRlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwSXRlcmF0b3Ioa2V5cywgdmFsdWVzLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3NlbGVjdG9yKHRoaXMuX2tleXNbaW5kZXhdLCB0aGlzLl92YWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gdGhpcy5fa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcEl0ZXJhdG9yO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHZhciBNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpID49IDA7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLl92YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXNbaSAtIDFdID0gdGhpcy5fa2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaSAtIDFdID0gdGhpcy5fdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKGtleSwgdGhpcy5fY2FjaGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0S2V5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldFZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRFbnRyeSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2ZpbmQgPSBmdW5jdGlvbiAoa2V5LCBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTYW1lVmFsdWVaZXJvKHRoaXMuX2NhY2hlS2V5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2FtZVZhbHVlWmVybyh0aGlzLl9rZXlzW2ldLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0S2V5KGtleSwgXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRWYWx1ZShfLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFNldCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVNldFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIFNldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZXQucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5zaXplOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5zZXQodmFsdWUsIHZhbHVlKSwgdGhpczsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fbWFwLmNsZWFyKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgRmlsbFJhbmRvbUJ5dGVzKGFycmF5LCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IEFycmF5KHNpemUpLCBzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIENyZWF0ZVVVSUQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBHZW5SYW5kb21CeXRlcyhVVUlEX1NJWkUpO1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcmFuZG9tIC0gUkZDIDQxMjIgXHUwMEE3IDQuNFxuICAgICAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzZdICYgMHg0ZiB8IDB4NDA7XG4gICAgICAgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gJiAweGJmIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBVVUlEX1NJWkU7ICsrb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBieXRlID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSA0IHx8IG9mZnNldCA9PT0gNiB8fCBvZmZzZXQgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCItXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDwgMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBieXRlLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXMgYSBoZXVyaXN0aWMgdXNlZCBieSB2OCBhbmQgY2hha3JhIHRvIGZvcmNlIGFuIG9iamVjdCBpbnRvIGRpY3Rpb25hcnkgbW9kZS5cbiAgICAgICAgZnVuY3Rpb24gTWFrZURpY3Rpb25hcnkob2JqKSB7XG4gICAgICAgICAgICBvYmouX18gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkZWxldGUgb2JqLl9fO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoUmVmbGVjdCB8fCAoUmVmbGVjdCA9IHt9KSk7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBFeHBvcnQgcnVudGltZS1zcGVjaWZpYyBzZXJ2aWNlcyAoYXZvaWQgY29uZmxpY3RzIHdpdGggcHVyZW5vdylcbmV4cG9ydCB7IFB1cmVub3dSdW50aW1lQ2xpIH0gZnJvbSAnQGJpbi9wdXJlbm93LXJ1bnRpbWUtY2xpJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGUgc2VydmljZSB3aXRoIGRpZmZlcmVudCBuYW1lcyB0byBhdm9pZCBjb25mbGljdHNcbmV4cG9ydCB7XG4gIFRlbXBsYXRlU2VydmljZSBhcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlLFxuICBTY2FmZm9sZE9wdGlvbnMgYXMgUnVudGltZVNjYWZmb2xkT3B0aW9ucyxcbiAgVGVtcGxhdGVDb250ZXh0IGFzIFJ1bnRpbWVUZW1wbGF0ZUNvbnRleHQsXG4gIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSxcbiAgUnVudGltZURlcGxveW1lbnRTdHJhdGVneSxcbiAgYnVpbGRTdGF0aWNIdG1sLFxuICBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsXG4gIFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHMsXG4gIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0LFxufSBmcm9tICcuL3NlcnZpY2VzJztcblxuZXhwb3J0ICogZnJvbSAnQGJpbi9wdXJlbm93LXJ1bnRpbWUtY2xpJztcblxuLy8gZXhwb3J0IHsgUHVyZW5vd1J1bnRpbWVDbGkgfSBmcm9tICcuL3NlcnZpY2VzL3B1cmVub3ctcnVudGltZS1kZXBsb3ltZW50LnN0cmF0ZWd5JztcbiIsICIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdwcm9jZXNzJztcblxuaW1wb3J0IHsgR2xvYmFsT3B0aW9ucywgUHVyZW5vd0NsaSwgUHVyZW5vd0NsaUNvbnRleHQsIHB1cmVub3dDb21tYW5kQ29uZmlnIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuXG5pbXBvcnQgeyBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSB9IGZyb20gJ0BiaW4vc2VydmljZXMnO1xuXG5pbXBvcnQgeyBSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciB9IGZyb20gJy4vdXRpbHMvZXJyb3JzJztcblxuLyoqXG4gKiBSdW50aW1lIENMSSB0aGF0IHByb3Blcmx5IGV4dGVuZHMgUHVyZW5vd0NsaSB1c2luZyB0aGUgZXh0ZW5zaWJsZSBhcmNoaXRlY3R1cmVcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHVyZW5vdydzIEV4dGVuc2libGVDbGlDb3JlLmFkZENvbW1hbmRzKCkgYW5kIGFkZEFjdGlvbnMoKVxuICogdG8gYWRkIHJ1bnRpbWUtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB3aGlsZSBwcmVzZXJ2aW5nIGFsbCBleGlzdGluZyBwdXJlbm93IGNvbW1hbmRzLlxuICovXG5leHBvcnQgY2xhc3MgUHVyZW5vd1J1bnRpbWVDbGkgZXh0ZW5kcyBQdXJlbm93Q2xpIHtcbiAgc3RhdGljIGRlZmF1bHRUb29sTmFtZTogc3RyaW5nID0gJ3J1bnRpbWUnO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEluaXRpYWxpemUgd2l0aCBydW50aW1lLXNwZWNpZmljIHN0cmF0ZWdpZXNcbiAgICAvLyBjb25zdCBzdHJhdGVnaWVzID0gbmV3IFN0cmF0ZWd5Q29udGFpbmVyKCk7XG4gICAgLy9cbiAgICAvLyAvLyBBZGQgcnVudGltZSBkZXBsb3ltZW50IHN0cmF0ZWd5IGZvciB0aHJlZS1zdGFjayBkZXBsb3ltZW50XG4gICAgLy8gc3RyYXRlZ2llcy5hZGRTdHJhdGVneShuZXcgUnVudGltZURlcGxveW1lbnRTdHJhdGVneSgpKTtcblxuICAgIHN1cGVyKHZvaWQgMCAvKnN0cmF0ZWdpZXMqLywge1xuICAgICAgdG9vbE5hbWU6IFB1cmVub3dDbGkuZGVmYXVsdFRvb2xOYW1lLFxuICAgICAgdGl0bGU6ICdSdW50aW1lIHRhcmdldCBmcmFtZXdvcmsgZm9yIEFXUyBMYW1iZGEnLFxuICAgICAgZGVzY3JpcHRpb246ICdSdW50aW1lIHRhcmdldCBmcmFtZXdvcmsgZm9yIEFXUyBMYW1iZGEnLFxuICAgICAgZmFsbGJhY2tWZXJzaW9uOiAnMC4yLjEzNScsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbW1hbmRzID0gcHVyZW5vd0NvbW1hbmRDb25maWcoUHVyZW5vd1J1bnRpbWVDbGkuZGVmYXVsdFRvb2xOYW1lKTtcblxuICAgIC8vIEluaXRpYWxpemUgcnVudGltZS13ZWIgZXh0ZW5zaW9uc1xuICAgIC8vIHRoaXMucnVudGltZUV4dGVuc2lvbnMgPSBuZXcgUnVudGltZVdlYkNsaUV4dGVuc2lvbnMoKTtcblxuICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIGNvbW1hbmRzIHVzaW5nIGV4dGVuc2libGUgYXJjaGl0ZWN0dXJlXG4gICAgLy8gQG5vdGU6IGlzIG5vdCBuZWNlc3NhcnksIHdlIGV4cGVjdCB0byByZWRlZmluZSBkZXBsb3ltZW50IHN0cmF0ZWd5IG9ubHlcbiAgICAvLyB0aGlzLmFkZFJ1bnRpbWVDb21tYW5kcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBQdXJlbm93LXNwZWNpZmljIGNvbnRleHQgd2l0aCBhbGwgcmVxdWlyZWQgc2VydmljZXNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDb250ZXh0PFQgZXh0ZW5kcyBQdXJlbm93Q2xpQ29udGV4dCA9IFB1cmVub3dSdW50aW1lQ2xpQ29udGV4dD4oXG4gICAgZ2xvYmFsT3B0czogR2xvYmFsT3B0aW9ucywgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBwdXJlbm93Q29udGV4dCA9XG4gICAgICBhd2FpdCBzdXBlci5jcmVhdGVDb250ZXh0PFB1cmVub3dDbGlDb250ZXh0PihnbG9iYWxPcHRzLCBjd2QpO1xuXG4gICAgLy8gQ3JlYXRlIHN0YWNrcyBkZXBsb3ltZW50IHNlcnZpY2VcbiAgICBjb25zdCBzdGFja3NEZXBsb3lTZXJ2aWNlID0gbmV3IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZShjd2QpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnB1cmVub3dDb250ZXh0LFxuICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIENMSSB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKi9cbiAgYXN5bmMgcnVuKGFyZ3M/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucHJvZ3JhbS5wYXJzZUFzeW5jKGFyZ3MgfHwgcHJvY2Vzcy5hcmd2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXJyb3JzIHdpdGggc3RydWN0dXJlZCBsb2dnaW5nIChubyBlbW9qaSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaGFuZGxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBuZXZlciB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IFJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyKCk7XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc3QgZm9ybWF0dGVkRXJyb3IgPSBmb3JtYXR0ZXIuZm9ybWF0RXJyb3IoZXJyb3IsICEhcHJvY2Vzcy5lbnYuREVCVUcpO1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRFcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gZXJyb3I6JywgU3RyaW5nKGVycm9yKSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBDTEkgaW5zdGFuY2UgdGhhdCBwcm9wZXJseSBleHRlbmRzIHB1cmVub3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJ1bnRpbWVDbGkoKTogUHVyZW5vd1J1bnRpbWVDbGkge1xuICByZXR1cm4gbmV3IFB1cmVub3dSdW50aW1lQ2xpKCk7XG59XG5cbi8vIC8qKlxuLy8gICogTWFpbiBDTEkgZW50cnkgcG9pbnQgdXNpbmcgcHJvcGVyIHB1cmVub3cgZXh0ZW5zaW9uXG4vLyAgKi9cbi8vIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuLy8gICB0cnkge1xuLy8gICAgIC8vIENyZWF0ZSBDTEkgaW5zdGFuY2UgdGhhdCBleHRlbmRzIFB1cmVub3dDbGlcbi8vICAgICBjb25zdCBjbGkgPSBjcmVhdGVSdW50aW1lQ2xpKCk7XG4vL1xuLy8gICAgIC8vIFBhcnNlIGFuZCBleGVjdXRlIENMSSBjb21tYW5kc1xuLy8gICAgIGF3YWl0IGNsaS5ydW4oKTtcbi8vICAgfSBjYXRjaCAoZXJyb3IpIHtcbi8vICAgICBQdXJlbm93UnVudGltZUNsaS5oYW5kbGVFcnJvcihlcnJvcik7XG4vLyAgIH1cbi8vIH1cblxuLy8gUnVuIENMSSBpZiB0aGlzIGZpbGUgaXMgZXhlY3V0ZWQgZGlyZWN0bHlcbi8vIGlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuLy8gICBtYWluKCkuY2F0Y2goUHVyZW5vd1J1bnRpbWVDbGkuaGFuZGxlRXJyb3IpO1xuLy8gfVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHNhbml0aXplU3RhY2tOYW1lIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9pbmZyYSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2NhZmZvbGRpbmcgYSBuZXcgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYWZmb2xkT3B0aW9ucyB7XG4gIC8qKiBQcm9qZWN0IG5hbWUgKi9cbiAgcHJvamVjdE5hbWU6IHN0cmluZztcbiAgLyoqIEZvcmNlIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyAqL1xuICBmb3JjZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUZW1wbGF0ZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gY29udGV4dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlQ29udGV4dCB7XG4gIHByb2plY3ROYW1lOiBzdHJpbmc7XG5cbiAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIHByb2plY3Qgc2NhZmZvbGRpbmcgYW5kIHRlbXBsYXRlIG1hbmFnZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVzRGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICAvLyBUZW1wbGF0ZXMgYXJlIGxvY2F0ZWQgaW4gdGhlIHBhY2thZ2UncyBiaW4vdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIC8vIFdoZW4gYnVuZGxlZCwgd2UgbmVlZCB0byBmaW5kIHRoZSB0ZW1wbGF0ZXMgcmVsYXRpdmUgdG8gdGhlIENMSSBiaW5hcnkgbG9jYXRpb25cbiAgICAvLyBUaGUgQ0xJIGJpbmFyeSBpcyBhdCBvdXQvZGlzdC9iaW4vcHVyZW5vdy5qcywgdGVtcGxhdGVzIGFyZSBhdCBvdXQvZGlzdC9iaW4vdGVtcGxhdGVzL1xuXG4gICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZiB0aGlzIG1vZHVsZVxuICAgIC8vIEluIGJ1bmRsZWQgY29kZSwgX19kaXJuYW1lIG1pZ2h0IG5vdCBiZSByZWxpYWJsZSwgc28gd2UgdHJ5IG11bHRpcGxlIHN0cmF0ZWdpZXNcbiAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgLy8gV2hlbiBydW5uaW5nIGZyb20gaW5zdGFsbGVkIHBhY2thZ2U6IG5vZGVfbW9kdWxlcy9Ad29ya3RpZi9wdXJlbm93L291dC9kaXN0L2Jpbi90ZW1wbGF0ZXNcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICd0ZW1wbGF0ZXMnKSxcbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIHNvdXJjZSBkdXJpbmcgZGV2ZWxvcG1lbnRcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdzcmMnLCAnYmluJywgJ3RlbXBsYXRlcycpLFxuICAgICAgLy8gQWx0ZXJuYXRpdmU6IHJlbGF0aXZlIHRvIHByb2Nlc3MuYXJndlsxXSAodGhlIHNjcmlwdCBiZWluZyBleGVjdXRlZClcbiAgICAgIHBhdGguam9pbihwYXRoLmRpcm5hbWUocHJvY2Vzcy5hcmd2WzFdIHx8ICcnKSwgJ3RlbXBsYXRlcycpLFxuICAgIF07XG5cbiAgICBjb25zdCBmb3VuZFBhdGggPSBwb3NzaWJsZVBhdGhzLmZpbmQocCA9PiB7XG4gICAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKHApO1xuICAgICAgcmV0dXJuIGV4aXN0cztcbiAgICB9KTtcblxuICAgIGlmICghZm91bmRQYXRoKSB7XG4gICAgICAvLyBGYWxsYmFjazogdXNlIGZpcnN0IHBhdGggYW5kIGxldCB2YWxpZGF0aW9uIGVycm9yIGhhbmRsZSBpdFxuICAgICAgdGhpcy50ZW1wbGF0ZXNEaXIgPSBwb3NzaWJsZVBhdGhzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBsYXRlc0RpciA9IGZvdW5kUGF0aDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NhZmZvbGQgYSBuZXcgcHJvamVjdCBmcm9tIGEgdGVtcGxhdGVcbiAgICovXG4gIGFzeW5jIHNjYWZmb2xkKFxuICAgIHRlbXBsYXRlTmFtZTogc3RyaW5nLFxuICAgIHRhcmdldERpcjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNjYWZmb2xkT3B0aW9ucyxcbiAgICBjb3JlRGlyOiBzdHJpbmcgPSAncHVyZW5vdycsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnRlbXBsYXRlc0RpciwgY29yZURpciwgdGVtcGxhdGVOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRlbXBsYXRlIGV4aXN0c1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgVGVtcGxhdGUgJyR7dGVtcGxhdGVOYW1lfScgbm90IGZvdW5kYCxcbiAgICAgICAgYEF2YWlsYWJsZSB0ZW1wbGF0ZXM6IHB1cmVub3ctYmFzaWNgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0YXJnZXQgZGlyZWN0b3J5XG4gICAgY29uc3QgcmVzb2x2ZWRUYXJnZXREaXIgPSBwYXRoLnJlc29sdmUodGhpcy5jd2QsIHRhcmdldERpcik7XG4gICAgdGhpcy52YWxpZGF0ZVRhcmdldERpcmVjdG9yeShyZXNvbHZlZFRhcmdldERpciwgb3B0aW9ucy5mb3JjZSk7XG5cbiAgICAvLyBDcmVhdGUgdGFyZ2V0IGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlc29sdmVkVGFyZ2V0RGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKHJlc29sdmVkVGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHRlbXBsYXRlIGZpbGVzXG4gICAgY29uc3QgY29udGV4dDogVGVtcGxhdGVDb250ZXh0ID0ge1xuICAgICAgcHJvamVjdE5hbWU6IG9wdGlvbnMucHJvamVjdE5hbWUsXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMuY29weVRlbXBsYXRlRmlsZXModGVtcGxhdGVQYXRoLCByZXNvbHZlZFRhcmdldERpciwgY29udGV4dCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBjb25maWd1cmF0aW9uIGZpbGVzXG4gICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUNvbmZpZyhyZXNvbHZlZFRhcmdldERpciwgb3B0aW9ucy5wcm9qZWN0TmFtZSk7XG4gICAgYXdhaXQgdGhpcy5nZW5lcmF0ZVRzQ29uZmlnKHJlc29sdmVkVGFyZ2V0RGlyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBwdXJlbm93LmNvbmZpZy50cyBmaWxlXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmZpZyh0YXJnZXREaXI6IHN0cmluZywgcHJvamVjdE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBgLypcbiAqIFB1cmVub3cgQ29uZmlndXJhdGlvblxuICogXG4gKiBUaGlzIGZpbGUgY29uZmlndXJlcyB5b3VyIFB1cmVub3cgc2VydmVybGVzcyBSZWFjdCBTU1IgYXBwbGljYXRpb24uXG4gKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS93b3JrdGlmL3B1cmVub3dcbiAqL1xuXG5pbXBvcnQgeyBQdXJlbm93Q2xpQ29uZmlnIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdyc7XG5cbmNvbnN0IGNvbmZpZzogUHVyZW5vd0NsaUNvbmZpZyA9IHtcbiAgcHJvamVjdE5hbWU6ICcke3Byb2plY3ROYW1lfScsXG4gIFxuICBzdGFnZXM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnZGV2JyxcbiAgICAgIGF3c1JlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICAvLyBhd3NQcm9maWxlOiAnZGVmYXVsdCcsIC8vIE9wdGlvbmFsOiBBV1MgcHJvZmlsZSB0byB1c2VcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzdGFnaW5nJyxcbiAgICAgIGF3c1JlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICAvLyBkb21haW46ICdleGFtcGxlLmNvbScsIC8vIE9wdGlvbmFsOiBjdXN0b20gZG9tYWluXG4gICAgICAvLyBzdWJkb21haW46ICdzdGFnaW5nJywgLy8gT3B0aW9uYWw6IHN1YmRvbWFpbiBwcmVmaXhcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdwcm9kJyxcbiAgICAgIGF3c1JlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICAvLyBkb21haW46ICdleGFtcGxlLmNvbScsXG4gICAgfSxcbiAgXSxcbiAgXG4gIHBhdGhzOiB7XG4gICAgc3JjRGlyOiAnc3JjJyxcbiAgICByZWFjdEVudHJ5OiAnc3JjL2luZGV4LnRzeCcsXG4gICAgb3V0RGlyOiAnb3V0L2Rpc3QnLFxuICAgIGNka0RpcjogJ2NkaycsXG4gIH0sXG4gIFxuICBpbmZyYU1vZGU6ICdjZGsnLFxuICBcbiAgZmVhdHVyZXM6IHtcbiAgICBlbmFibGVTZW86IGZhbHNlLFxuICAgIGVuYWJsZU1hbmlmZXN0OiB0cnVlLFxuICAgIGVuYWJsZVdhcm11cDogZmFsc2UsXG4gICAgY2xlYXJDYWNoZU9uRGVwbG95OiB0cnVlLFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnO1xuYDtcblxuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAncHVyZW5vdy5jb25maWcudHMnKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGNvbmZpZ0NvbnRlbnQsICd1dGYtOCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRzY29uZmlnLmpzb24gZmlsZVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUc0NvbmZpZyh0YXJnZXREaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IHtcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICB0YXJnZXQ6ICdFUzIwMjAnLFxuICAgICAgICBsaWI6IFsnRVMyMDIwJywgJ0RPTScsICdET00uSXRlcmFibGUnXSxcbiAgICAgICAganN4OiAncmVhY3QtanN4JyxcbiAgICAgICAgbW9kdWxlOiAnY29tbW9uanMnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnbm9kZScsXG4gICAgICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLFxuICAgICAgICBhbGxvd0pzOiB0cnVlLFxuICAgICAgICBvdXREaXI6ICcuL291dC90c2MnLFxuICAgICAgICByb290RGlyOiAnLi8nLFxuICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSxcbiAgICAgICAgc2tpcExpYkNoZWNrOiB0cnVlLFxuICAgICAgICBmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lczogdHJ1ZSxcbiAgICAgICAgZXhwZXJpbWVudGFsRGVjb3JhdG9yczogdHJ1ZSxcbiAgICAgICAgZW1pdERlY29yYXRvck1ldGFkYXRhOiB0cnVlLFxuICAgICAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICAgICAgZGVjbGFyYXRpb25NYXA6IHRydWUsXG4gICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgICAgYmFzZVVybDogJy4nLFxuICAgICAgICBwYXRoczoge1xuICAgICAgICAgICdAY29yZS8qJzogWydzcmMvY29yZS8qJ10sXG4gICAgICAgICAgJ0BsaWIvKic6IFsnc3JjL2xpYi8qJ10sXG4gICAgICAgICAgJ0B1dGlscy8qJzogWydzcmMvdXRpbHMvKiddLFxuICAgICAgICAgICdAYmluLyonOiBbJ3NyYy9iaW4vKiddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGluY2x1ZGU6IFsnc3JjLyoqLyonXSxcbiAgICAgIGV4Y2x1ZGU6IFsnbm9kZV9tb2R1bGVzJywgJ291dCcsICdkaXN0JywgJ2Nkay5vdXQnXSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHNjb25maWdQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodHNjb25maWdDb250ZW50LCBudWxsLCAyKSxcbiAgICAgICd1dGYtOCcsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0YXJnZXQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGFyZ2V0RGlyZWN0b3J5KHRhcmdldERpcjogc3RyaW5nLCBmb3JjZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXREaXIpKSB7XG4gICAgICByZXR1cm47IC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBzYWZlIHRvIGNyZWF0ZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGRpcmVjdG9yeSBpcyBlbXB0eVxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmModGFyZ2V0RGlyKTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCAmJiAhZm9yY2UpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdUYXJnZXQgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eScsXG4gICAgICAgIGBVc2UgLS1mb3JjZSBmbGFnIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBpbiAke3RhcmdldERpcn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgQ0RLIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0c1xuICAgKi9cbiAgY2RrRGlyZWN0b3J5RXhpc3RzKGN3ZDogc3RyaW5nID0gdGhpcy5jd2QpOiBib29sZWFuIHtcbiAgICBjb25zdCBjZGtEaXIgPSBwYXRoLnJlc29sdmUoY3dkLCAnY2RrJyk7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMoY2RrRGlyKSAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjZGtEaXIsICdiaW4nLCAnYXBwLnRzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGVtcGxhdGUgZmlsZXMgcmVjdXJzaXZlbHkgd2l0aCB2YXJpYWJsZSBzdWJzdGl0dXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weVRlbXBsYXRlRmlsZXMoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIHRhcmdldFBhdGg6IHN0cmluZyxcbiAgICBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhzb3VyY2VQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBwYXRoLmpvaW4oc291cmNlUGF0aCwgZW50cnkubmFtZSk7XG4gICAgICBsZXQgdGFyZ2V0RmlsZU5hbWUgPSBlbnRyeS5uYW1lO1xuXG4gICAgICAvLyBIYW5kbGUgc3BlY2lhbCBmaWxlIHJlbmFtZXNcbiAgICAgIC8vIGdpdGlnbm9yZS50ZW1wbGF0ZSAtPiAuZ2l0aWdub3JlIChucG0gZXhjbHVkZXMgLmdpdGlnbm9yZSBmcm9tIHBhY2thZ2VzKVxuICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09ICdnaXRpZ25vcmUudGVtcGxhdGUnKSB7XG4gICAgICAgIHRhcmdldEZpbGVOYW1lID0gJy5naXRpZ25vcmUnO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIC50ZW1wbGF0ZSBleHRlbnNpb24gZnJvbSBhbGwgdGVtcGxhdGUgZmlsZXNcbiAgICAgIGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy50ZW1wbGF0ZScpKSB7XG4gICAgICAgIHRhcmdldEZpbGVOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKC9cXC50ZW1wbGF0ZSQvLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpbGUgPSBwYXRoLmpvaW4odGFyZ2V0UGF0aCwgdGFyZ2V0RmlsZU5hbWUpO1xuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAvLyBDcmVhdGUgZGlyZWN0b3J5IGFuZCByZWN1cnNlXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXRGaWxlKSkge1xuICAgICAgICAgIGZzLm1rZGlyU3luYyh0YXJnZXRGaWxlLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlUZW1wbGF0ZUZpbGVzKHNvdXJjZUZpbGUsIHRhcmdldEZpbGUsIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ29weSBmaWxlIHdpdGggdmFyaWFibGUgc3Vic3RpdHV0aW9uXG4gICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNvdXJjZUZpbGUsICd1dGYtOCcpO1xuICAgICAgICBjb250ZW50ID0gdGhpcy5zdWJzdGl0dXRlVmFyaWFibGVzKGNvbnRlbnQsIGNvbnRleHQpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRhcmdldEZpbGUsIGNvbnRlbnQsICd1dGYtOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzdGl0dXRlIHRlbXBsYXRlIHZhcmlhYmxlcyBpbiBjb250ZW50XG4gICAqL1xuICBwcml2YXRlIHN1YnN0aXR1dGVWYXJpYWJsZXMoY29udGVudDogc3RyaW5nLCBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBjb250ZW50O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29udGV4dCkpIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXHtcXFxce1xcXFxzKiR7a2V5fVxcXFxzKlxcXFx9XFxcXH1gLCAnZycpO1xuICAgICAgLy8gT25seSBzYW5pdGl6ZSBwcm9qZWN0TmFtZSBmb3IgQ0RLIGNvbXBhdGliaWxpdHksIGxlYXZlIG90aGVyIHZhbHVlcyBhcy1pc1xuICAgICAgY29uc3QgZmluYWxWYWx1ZSA9IGtleSA9PT0gJ3Byb2plY3ROYW1lJyA/IHNhbml0aXplU3RhY2tOYW1lKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UocmVnZXgsIGZpbmFsVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHNhbml0aXplU3RhY2tOYW1lLCBQdXJlbm93SW5mcmFSZXNvdXJjZU9wdGlvbnMsIFB1cmVub3dJbmZyYVJlc291cmNlcyB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvaW5mcmEnO1xuaW1wb3J0IHtcbiAgRGVwbG95bWVudEVycm9yLFxuICB0eXBlIERlcGxveW1lbnRPdXRwdXRzLFxuICBnZXRTdGFnZSxcbiAgU3RhY2tzRGVwbG95T3B0aW9ucyxcbiAgU3RhY2tzRGVwbG95U2VydmljZSxcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuaW1wb3J0IHsgUHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cywgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgfSBmcm9tICcuL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHlwZXMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UgZXh0ZW5kcyBTdGFja3NEZXBsb3lTZXJ2aWNlIGltcGxlbWVudHMgUHVyZW5vd0luZnJhUmVzb3VyY2VzIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERFRkFVTFRfQ0RLX0RJUiA9ICdjZGsnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFR3b1N0YWNrRGVwbG95U2VydmljZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGN3ZCAtIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHByb2plY3Qgcm9vdClcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICBzdXBlcihjd2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGZpcnN0IGRlcGxveW1lbnQgd29ya2Zsb3c6IGRlcGxveSBJbmZyYSBcdTIxOTIgcmVhZCBvdXRwdXRzIFx1MjE5MiBkZXBsb3kgUnVudGltZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBEZXBsb3ltZW50IG9wdGlvbnNcbiAgICogQHBhcmFtIHN0YXJ0VGltZSAtIERlcGxveW1lbnQgc3RhcnQgdGltZXN0YW1wXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBkZXBsb3ltZW50IHJlc3VsdFxuICAgKiBAdGhyb3dzIHtEZXBsb3ltZW50RXJyb3J9IElmIEluZnJhIG9yIFJ1bnRpbWUgZGVwbG95bWVudCBmYWlsc1xuICAgKlxuICAgKiBAdG9kbzogY29tcGxldGUgZXh0ZW5zaWJsZSBkZXBsb3ltZW50IGFwcHJvYWNoIHdpdGggZHVyYXRpb24gbWV0cmljIGF0dGVuZGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBleGVjdXRlRGVwbG95PFQgZXh0ZW5kcyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVJlc3VsdCA9IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0PihcbiAgICBvcHRpb25zOiBTdGFja3NEZXBsb3lPcHRpb25zLFxuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IHN0YWdlLCBjb25maWcgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBTYW5pdGl6ZSBzdGFjayBuYW1lcyBmb3IgQVdTIENsb3VkRm9ybWF0aW9uIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCBpbmZyYVN0YWNrTmFtZSA9IHNhbml0aXplU3RhY2tOYW1lKGAke29wdGlvbnMuY29uZmlnLnByb2plY3ROYW1lfS1QdXJlbm93SW5mcmEtJHtzdGFnZX1gKTtcbiAgICBjb25zdCBydW50aW1lU3RhY2tOYW1lID0gc2FuaXRpemVTdGFja05hbWUoYCR7b3B0aW9ucy5jb25maWcucHJvamVjdE5hbWV9LVB1cmVub3dSdW50aW1lLSR7c3RhZ2V9YCk7XG4gICAgY29uc3QgcnVudGltZVdlYlN0YWNrTmFtZSA9IHNhbml0aXplU3RhY2tOYW1lKGAke29wdGlvbnMuY29uZmlnLnByb2plY3ROYW1lfS1SdW50aW1lV2ViLSR7c3RhZ2V9YCk7XG5cbiAgICBjb25zdCBzdGFnZUNvbmZpZyA9IGdldFN0YWdlKGNvbmZpZywgc3RhZ2UpO1xuICAgIGlmICghc3RhZ2VDb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgIGBTdGFnZSAnJHtzdGFnZX0nIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgYEF2YWlsYWJsZSBzdGFnZXM6ICR7Y29uZmlnLnN0YWdlcy5tYXAoKHM6IGFueSkgPT4gcy5uYW1lKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbnN0IGNsb3VkRm9ybWF0aW9uQ2xpZW50ID0gbmV3IENsb3VkRm9ybWF0aW9uQ2xpZW50KHtcbiAgICAvLyAgIHJlZ2lvbjogc3RhZ2VDb25maWcuYXdzUmVnaW9uLFxuICAgIC8vIH0pO1xuXG4gICAgLy8gU3RlcCAxOiBEZXBsb3kgSW5mcmEgc3RhY2tcbiAgICBjb25zb2xlLmxvZygnRGVwbG95aW5nIEluZnJhc3RydWN0dXJlIHN0YWNrLi4uJyk7XG4gICAgY29uc3QgaW5mcmFSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveUNka1N0YWNrKFxuICAgICAgaW5mcmFTdGFja05hbWUsXG4gICAgICBzdGFnZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgaWYgKCFpbmZyYVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAnSW5mcmFzdHJ1Y3R1cmUgZGVwbG95bWVudCBmYWlsZWQnLFxuICAgICAgICAnUnVudGltZSBzdGFjayB3aWxsIG5vdCBiZSBkZXBsb3llZC4gRml4IEluZnJhIGlzc3VlcyBhbmQgcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBSZWFkIEluZnJhIG91dHB1dHNcbiAgICAvLyBjb25zb2xlLmxvZygnUmVhZGluZyBJbmZyYXN0cnVjdHVyZSBvdXRwdXRzLi4uJyk7XG4gICAgLy8gY29uc3QgaW5mcmFPdXRwdXRzID0gYXdhaXQgdGhpcy5nZXRJbmZyYU91dHB1dHMoY2xvdWRGb3JtYXRpb25DbGllbnQsIHN0YWdlLCBjb25maWcsIGluZnJhU3RhY2tOYW1lLCBzdGFnZUNvbmZpZz8uYXdzUHJvZmlsZSk7XG4gICAgLy8gY29uc29sZS5sb2coYFJldHJpZXZlZCAke09iamVjdC5rZXlzKGluZnJhT3V0cHV0cykubGVuZ3RofSBvdXRwdXRzIGZyb20gSW5mcmFzdHJ1Y3R1cmUgc3RhY2tgKTtcblxuICAgIC8vIFN0ZXAgMzogRGVwbG95IFJ1bnRpbWUgc3RhY2tcbiAgICBjb25zb2xlLmxvZygnRGVwbG95aW5nIFB1cmVub3dSdW50aW1lIHN0YWNrLi4uJyk7XG4gICAgY29uc3QgcnVudGltZVJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95Q2RrU3RhY2soXG4gICAgICBydW50aW1lU3RhY2tOYW1lLFxuICAgICAgc3RhZ2UsXG4gICAgICBjb25maWcsXG4gICAgKTtcblxuICAgIGlmICghcnVudGltZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAnUnVudGltZSBkZXBsb3ltZW50IGZhaWxlZCcsXG4gICAgICAgICdJbmZyYXN0cnVjdHVyZSBpcyBkZXBsb3llZCBzdWNjZXNzZnVsbHkuIEZpeCBSdW50aW1lIGlzc3VlcyBhbmQgcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAzOiBEZXBsb3kgUnVudGltZSBzdGFja1xuICAgIGNvbnNvbGUubG9nKCdEZXBsb3lpbmcgUnVudGltZVdlYiBzdGFjay4uLicpO1xuICAgIGNvbnN0IHJ1bnRpbWVXZWJSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveUNka1N0YWNrKFxuICAgICAgcnVudGltZVdlYlN0YWNrTmFtZSxcbiAgICAgIHN0YWdlLFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICBpZiAoIXJ1bnRpbWVXZWJSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgJ1J1bnRpbWVXZWIgZGVwbG95bWVudCBmYWlsZWQnLFxuICAgICAgICAnSW5mcmFzdHJ1Y3R1cmUgaXMgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5LiBGaXggUnVudGltZSBpc3N1ZXMgYW5kIHJldHJ5LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgaW5mcmFTdGFjazogaW5mcmFSZXN1bHQsXG4gICAgICBydW50aW1lU3RhY2s6IHJ1bnRpbWVSZXN1bHQsXG4gICAgICBydW50aW1lV2ViU3RhY2s6IHJ1bnRpbWVXZWJSZXN1bHQsXG4gICAgICBkdXJhdGlvbixcbiAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgZGVwbG95bWVudCBvdXRwdXRzIGZyb20gQ0RLIG91dHB1dHMgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHN0YWNrTmFtZSAtIE5hbWUgb2YgdGhlIENsb3VkRm9ybWF0aW9uIHN0YWNrXG4gICAqIEByZXR1cm5zIERlcGxveW1lbnQgb3V0cHV0cyBtYXBcbiAgICpcbiAgICogQGltcG9ydGFudDogT1BUSU1JU0UgVEhJUyBTT0xVVElPTlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0gb3V0cHV0c1BhdGhcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZVN0YWNrT3V0cHV0cyhzdGFja05hbWU6IHN0cmluZywgb3V0cHV0c1BhdGg6IHN0cmluZyk6IERlcGxveW1lbnRPdXRwdXRzIHtcbiAgICBjb25zdCBvdXRwdXRzOiBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzID0gc3VwZXIucGFyc2VTdGFja091dHB1dHMoc3RhY2tOYW1lLCBvdXRwdXRzUGF0aCkgYXMgUHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cztcblxuICAgIGlmICghZnMuZXhpc3RzU3luYyhvdXRwdXRzUGF0aCkpIHtcbiAgICAgIHJldHVybiBvdXRwdXRzO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXRzRmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMob3V0cHV0c1BhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgY2RrT3V0cHV0cyA9IEpTT04ucGFyc2Uob3V0cHV0c0ZpbGVDb250ZW50KTtcblxuICAgICAgLy8gQ0RLIG91dHB1dHMgZmlsZSBzdHJ1Y3R1cmU6IHsgXCJTdGFja05hbWVcIjogeyBcIk91dHB1dEtleVwiOiBcIk91dHB1dFZhbHVlXCIgfSB9XG4gICAgICBjb25zdCBzdGFja091dHB1dHMgPSBjZGtPdXRwdXRzW3N0YWNrTmFtZV07XG4gICAgICBpZiAoc3RhY2tPdXRwdXRzKSB7XG4gICAgICAgIG91dHB1dHMubGFtYmRhQXJuTGlzdCA9IE9iamVjdC5rZXlzKHN0YWNrT3V0cHV0cylcbiAgICAgICAgICAuZmlsdGVyKChrZXk6IHN0cmluZykgPT4ga2V5Lm1hdGNoKC8oPzpMYW1iZGEpW2EtekEtWl0rQXJuJC8pKVxuICAgICAgICAgIC5tYXAoKGxhbWJkYU1hdGNoOiBhbnkpID0+IHN0YWNrT3V0cHV0c1tsYW1iZGFNYXRjaF0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvdXRwdXRzIGZpbGUgZm9yICR7c3RhY2tOYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dHM7XG4gIH1cblxuXG4gIC8vIEBub3RlOiBkdXBsaWNhdGVzXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzaWduYXR1cmUgZm9yIHRoZSBwcm92aWRlZCByZWdpb24gYnkgZXh0cmFjdGluZyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggc2VnbWVudCBpbiB0aGUgcmVnaW9uIHN0cmluZywgZGVsaW1pdGVkIGJ5IGh5cGhlbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpb24gLSBUaGUgcmVnaW9uIHN0cmluZyB0byBnZW5lcmF0ZSB0aGUgc2lnbmF0dXJlIGZyb20uIEl0IGlzIGV4cGVjdGVkIHRvIGJlIGEgaHlwaGVuLXNlcGFyYXRlZCBzdHJpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCByZWdpb24gc2lnbmF0dXJlLCBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggdmFsaWQgc2VnbWVudC4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGlucHV0IGlzIGludmFsaWQgb3IgZW1wdHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UmVnaW9uU2lnbmF0dXJlKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXJlZ2lvbikgcmV0dXJuICcnO1xuXG4gICAgcmV0dXJuIHJlZ2lvblxuICAgICAgLnNwbGl0KCctJylcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAocGFydCA9PiBwYXJ0WzBdID8/ICcnKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlc291cmNlIG5hbWUgYnkgY29uY2F0ZW5hdGluZyBzZXJ2aWNlIG5hbWUsIHJlc291cmNlIG5hbWUsXG4gICAqIHNpbXBsaWZpZWQgcmVnaW9uLCBhbmQgc3RhZ2Ugd2l0aCBoeXBoZW5zIGFzIHNlcGFyYXRvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5uYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNlcnZpY2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZWdpb25TaW1wbGlmaWVkIC0gVGhlIHNpbXBsaWZpZWQgcmVnaW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc3RhZ2UgLSBUaGUgZGVwbG95bWVudCBzdGFnZSBvZiB0aGUgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb25jYXRlbmF0ZWQgcmVzb3VyY2UgbmFtZS5cbiAgICovXG4gIHB1YmxpYyByZXNvdXJjZU5hbWUoeyBuYW1lLCBzZXJ2aWNlTmFtZSwgc3RhZ2UsIHJlZ2lvbiB9OiBQdXJlbm93SW5mcmFSZXNvdXJjZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2lvblNpbXBsaWZpZWQgPSBzYW5pdGl6ZVN0YWNrTmFtZSh0aGlzLmdldFJlZ2lvblNpZ25hdHVyZShyZWdpb24gfHwgJ3VzLWVhc3QtMScpKTtcbiAgICByZXR1cm4gYCR7c2VydmljZU5hbWV9LSR7bmFtZX0tJHtyZWdpb25TaW1wbGlmaWVkfS0ke3N0YWdlfWA7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogUmVhY3QgU2VydmVybGVzcyA8cmVhY3Qtc2VydmVybGVzcz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IERlcGxveW1lbnRTdHJhdGVneSwgUHVyZW5vd0NsaUNvbnRleHQgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5pbXBvcnQgeyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UgfSBmcm9tICcuL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHJ1bnRpbWUgY29udGV4dCBmb3IgdGhlIFB1cmVub3cgQ0xJLCBleHRlbmRpbmcgdGhlIGJhc2UgUHVyZW5vdyBDTEkgY29udGV4dFxuICogd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0IGV4dGVuZHMgUHVyZW5vd0NsaUNvbnRleHQge1xuICBzdGFja3NEZXBsb3lTZXJ2aWNlOiBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2U7XG59XG5cbi8qKlxuICogUnVudGltZSBkZXBsb3ltZW50IHN0cmF0ZWd5IHRoYXQgaW1wbGVtZW50cyBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50XG4gKlxuICogVGhpcyBzdHJhdGVneSBleHRlbmRzIHB1cmVub3cncyB0d28tc3RhY2sgZGVwbG95bWVudCB0byBzdXBwb3J0IHRocmVlIHN0YWNrczpcbiAqIDEuIEluZnJhc3RydWN0dXJlIFN0YWNrIChleGlzdGluZylcbiAqIDIuIFJ1bnRpbWUgU3RhY2sgKGV4aXN0aW5nKVxuICogMy4gQWRkaXRpb25hbCBSdW50aW1lIFN0YWNrIChuZXcpXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRGVwbG95bWVudFN0cmF0ZWd5IGltcGxlbWVudHMgRGVwbG95bWVudFN0cmF0ZWd5IHtcbiAgcmVhZG9ubHkgcm9sZSA9ICdkZXBsb3ltZW50JztcbiAgcmVhZG9ubHkgbmFtZSA9ICdydW50aW1lLXB1cmVub3ctcnVudGltZS1zdGFja3MnO1xuXG4gIC8qKlxuICAgKiBQcmUtZGVwbG95bWVudCB2YWxpZGF0aW9uIGZvciBydW50aW1lLXNwZWNpZmljIHJlcXVpcmVtZW50c1xuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVEZXBsb3ltZW50PFQgZXh0ZW5kcyBQdXJlbm93Q2xpQ29udGV4dCA9IFB1cmVub3dDbGlDb250ZXh0Pihjb250ZXh0OiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIEFXUyBjcmVkZW50aWFscyAocmVxdWlyZWQgZm9yIGRlcGxveW1lbnQpXG4gICAgICBjb250ZXh0LmVudlZhbGlkYXRvci5pc1ZhbGlkKCk7XG5cblxuXG4gICAgICAvLyBWYWxpZGF0ZSBydW50aW1lLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAgICAgIC8vIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBjb250ZXh0LmNvbmZpZy47XG4gICAgICAvLyBpZiAocnVudGltZUNvbmZpZz8uZW5hYmxlVGhpcmRTdGFjayAmJiAhcnVudGltZUNvbmZpZy5ydW50aW1lV2ViTW9kZSkge1xuICAgICAgLy8gICBjb250ZXh0LmxvZ2dlci5lcnJvcignUnVudGltZS13ZWIgbW9kZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIFJ1bnRpbWUgQ29yZSBzdGFjayBpcyBlbmFibGVkJyk7XG4gICAgICAvLyAgIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIH1cblxuICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygnUnVudGltZSBkZXBsb3ltZW50IHZhbGlkYXRpb24gcGFzc2VkJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGV4dC5sb2dnZXIuZXJyb3IoYFJ1bnRpbWUgZGVwbG95bWVudCB2YWxpZGF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudCBpbnN0ZWFkIG9mIHR3byBzdGFja3NcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVEZXBsb3ltZW50PFQgZXh0ZW5kcyBQdXJlbm93Q2xpQ29udGV4dCA9IFB1cmVub3dDbGlDb250ZXh0PihcbiAgICBjb250ZXh0OiBULFxuICAgIGNvbmZpZzogdW5rbm93bixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVwbG95Q29uZmlnID0gY29uZmlnIGFzIHtcbiAgICAgIHN0YWNrc0RlcGxveVNlcnZpY2U6IGFueTtcbiAgICAgIG9wdGlvbnM6IGFueTtcbiAgICAgIGxvZ2dlcjogYW55O1xuICAgICAgY3dkOiBzdHJpbmc7XG4gICAgICBlbnZWYWxpZGF0b3I6IGFueTtcbiAgICB9O1xuXG4gICAgY29uc3QgeyBsb2dnZXIsIG9wdGlvbnMgfSA9IGRlcGxveUNvbmZpZztcblxuICAgIHRyeSB7XG4gICAgICAvLyBsb2dnZXIuaW5mbygnU3RhcnRpbmcgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudC4uLicpO1xuXG4gICAgICAvLyBVc2UgdGhlIHJ1bnRpbWUgc3RhY2tzIGRlcGxveSBzZXJ2aWNlIGZvciBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50XG4gICAgICBjb25zdCBydW50aW1lU3RhY2tzU2VydmljZSA9IGNvbnRleHQuc3RhY2tzRGVwbG95U2VydmljZSBhcyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2U7XG5cbiAgICAgIC8vIEV4ZWN1dGUgdGhlIFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bnRpbWVTdGFja3NTZXJ2aWNlLmRlcGxveSh7XG4gICAgICAgIHN0YWdlOiBvcHRpb25zLnN0YWdlLFxuICAgICAgICBjb25maWc6IGNvbnRleHQuY29uZmlnLFxuICAgICAgICBza2lwQnVpbGQ6IG9wdGlvbnMuc2tpcEJ1aWxkIHx8IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW50aW1lIFRhcmdldCBzdGFja3MgZGVwbG95bWVudCBmYWlsZWQnKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ1J1bnRpbWUgVGFyZ2V0IHN0YWNrIGRlcGxveWVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoJ0luZnJhc3RydWN0dXJlIHN0YWNrIGRlcGxveWVkIHN1Y2Nlc3NmdWxseScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnQgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0LWRlcGxveW1lbnQgYWN0aW9ucyBmb3IgcnVudGltZS1zcGVjaWZpYyB0YXNrc1xuICAgKi9cbiAgYXN5bmMgcG9zdERlcGxveW1lbnQocmVzdWx0OiB7IHN1Y2Nlc3M6IGJvb2xlYW47IGVycm9yPzogdW5rbm93biB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQG5vdGU6IHBvc3QtZGVwbG95bWVudCBpcyBub3QgcmVxdWlyZWQgZm9yIFB1cmVub3cgUnVudGltZVxuICAgIC8vIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgIC8vICAgY29uc29sZS5sb2coJ1J1bnRpbWUgZGVwbG95bWVudCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgLy8gICBjb25zb2xlLmxvZygnQWxsIHRocmVlIHN0YWNrcyBkZXBsb3llZCBhbmQgY29uZmlndXJlZCcpO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICBjb25zb2xlLmVycm9yKCdSdW50aW1lIGRlcGxveW1lbnQgZmFpbGVkJyk7XG4gICAgLy8gICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIHJlc3VsdC5lcnJvciBpbnN0YW5jZW9mIEVycm9yID8gcmVzdWx0LmVycm9yLm1lc3NhZ2UgOiBTdHJpbmcocmVzdWx0LmVycm9yKSk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuICB9XG59XG5cbi8vIC8qKlxuLy8gICogVGhlIGBQdXJlbm93UnVudGltZUNsaWAgY2xhc3MgZXh0ZW5kcyB0aGUgYFB1cmVub3dDbGlgIHRvIHByb3ZpZGUgZnVuY3Rpb25hbGl0eVxuLy8gICogc3BlY2lmaWMgdG8gdGhlIFB1cmVub3cgcnVudGltZSwgaW5jbHVkaW5nIHRoZSBjcmVhdGlvbiBvZiBhIGNvbnRleHQgd2l0aCBhZGRpdGlvbmFsIHNlcnZpY2VzLlxuLy8gICovXG4vLyBleHBvcnQgY2xhc3MgUHVyZW5vd1J1bnRpbWVDbGkgZXh0ZW5kcyBQdXJlbm93Q2xpIHtcbi8vICAgY29uc3RydWN0b3Ioc3RyYXRlZ2llcz86IFN0cmF0ZWd5Q29udGFpbmVyKSB7XG4vLyAgICAgc3VwZXIoc3RyYXRlZ2llcyk7XG4vLyAgIH1cbi8vXG4vLyAgIC8qKlxuLy8gICAgKiBDcmVhdGUgUHVyZW5vdy1zcGVjaWZpYyBjb250ZXh0IHdpdGggYWxsIHJlcXVpcmVkIHNlcnZpY2VzXG4vLyAgICAqL1xuLy8gICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQ29udGV4dDxUIGV4dGVuZHMgUHVyZW5vd0NsaUNvbnRleHQgPSBQdXJlbm93UnVudGltZUNsaUNvbnRleHQ+KGdsb2JhbE9wdHM6IEdsb2JhbE9wdGlvbnMsIGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSk6IFByb21pc2U8VD4ge1xuLy8gICAgIGNvbnN0IHB1cmVub3dDb250ZXh0ID1cbi8vICAgICAgIGF3YWl0IHN1cGVyLmNyZWF0ZUNvbnRleHQ8UHVyZW5vd0NsaUNvbnRleHQ+KGdsb2JhbE9wdHMsIGN3ZCk7XG4vL1xuLy8gICAgIC8vIENyZWF0ZSBzdGFja3MgZGVwbG95bWVudCBzZXJ2aWNlXG4vLyAgICAgY29uc3Qgc3RhY2tzRGVwbG95U2VydmljZSA9IG5ldyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UoY3dkKTtcbi8vXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIC4uLnB1cmVub3dDb250ZXh0LFxuLy8gICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbi8vICAgICB9IGFzIHVua25vd24gYXMgVDtcbi8vICAgfVxuLy8gfVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBSZWFjdCBTZXJ2ZXJsZXNzIDxyZWFjdC1zZXJ2ZXJsZXNzPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcbmltcG9ydCB7IHR5cGUgRGVwbG95bWVudFJlc3VsdCwgU3RhY2tzRGVwbG95UmVzdWx0LCBEZXBsb3ltZW50T3V0cHV0cyB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgZGVwbG95aW5nIHJ1bnRpbWUgc3RhY2tzIGluIHRoZSBQdXJlbm93IHN5c3RlbS5cbiAqIFRoaXMgdHlwZSBleHRlbmRzIHRoZSBTdGFja3NEZXBsb3lSZXN1bHQsIGFkZGluZyBhIHNwZWNpZmljIHJlc3VsdCBmb3IgdGhlIHJ1bnRpbWUgc3RhY2sgZGVwbG95bWVudC5cbiAqXG4gKiBQcm9wZXJ0aWVzOlxuICogLSBydW50aW1lU3RhY2s6IFByb3ZpZGVzIHRoZSBkZXBsb3ltZW50IHJlc3VsdCBzcGVjaWZpYyB0byB0aGUgcnVudGltZSBzdGFjaywgY29udGFpbmluZyBkZXRhaWxzIGFuZCBzdGF0dXMgb2YgdGhlIHJ1bnRpbWUgc3RhY2sgZGVwbG95bWVudCBwcm9jZXNzLlxuICpcbiAqIFVzZSB0aGlzIHR5cGUgdG8gZW5jYXBzdWxhdGUgYW5kIG1hbmFnZSByZXN1bHRzIHJlbGF0ZWQgdG8gYm90aCBnZW5lcmFsIHN0YWNrIGRlcGxveW1lbnRzIGFuZCBzcGVjaWZpYyBydW50aW1lIHN0YWNrIGRlcGxveW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVJlc3VsdCA9IFN0YWNrc0RlcGxveVJlc3VsdCAmIHtcbiAgcnVudGltZVN0YWNrOiBEZXBsb3ltZW50UmVzdWx0O1xufVxuXG5leHBvcnQgdHlwZSBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzID0gRGVwbG95bWVudE91dHB1dHMgJiB7XG4gIGxhbWJkYUFybkxpc3Q6IHN0cmluZ1tdO1xufVxuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5cbi8qKlxuICogR2VuZXJhdGUgaHRtbC10ZW1wbGF0ZS5lbWJlZGRlZC50cyBmaWxlIHdpdGggdGhlIEhUTUwgdGVtcGxhdGUgY29uc3RhbnQuXG4gKlxuICogVGhpcyBzY3JpcHQgaXMgcnVuIGF0IGJ1aWxkIHRpbWUgdG8gZW1iZWQgdGhlIHVzZXIncyBwdWJsaWMvaW5kZXguaHRtbFxuICogaW50byB0aGUgTGFtYmRhIGJ1bmRsZSBhcyBhIFR5cGVTY3JpcHQgY29uc3RhbnQuIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZFxuICogZm9yIGZpbGUgc3lzdGVtIHJlYWRzIGF0IHJ1bnRpbWUgYW5kIGVuc3VyZXMgdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZVxuICogaW4gdGhlIExhbWJkYSBlbnZpcm9ubWVudC5cbiAqXG4gKiBUaGUgc2NyaXB0OlxuICogMS4gTG9hZHMgdGhlIEhUTUwgdGVtcGxhdGUgdXNpbmcgSHRtbFRlbXBsYXRlTG9hZGVyIGxvZ2ljXG4gKiAyLiBWYWxpZGF0ZXMgdGhlIHRlbXBsYXRlIHN0cnVjdHVyZSBhbmQgc2l6ZVxuICogMy4gR2VuZXJhdGVzIGEgVHlwZVNjcmlwdCBmaWxlIHdpdGggdGhlIHRlbXBsYXRlIGFzIGEgY29uc3RhbnRcbiAqIDQuIFdyaXRlcyB0aGUgZmlsZSB0byBzcmMvY29yZS9zZXJ2aWNlcy90ZW1wbGF0ZS9odG1sLXRlbXBsYXRlLmVtYmVkZGVkLnRzXG4gKiA1LiBWYWxpZGF0ZXMgdGhlIHJlc3VsdGluZyBidW5kbGUgc2l6ZSBpbXBhY3RcbiAqXG4gKiBUaGlzIGZpbGUgaXMgdGhlbiBpbXBvcnRlZCBieSBIdG1sVGVtcGxhdGVTZXJ2aWNlIGF0IHJ1bnRpbWUuXG4gKi9cblxuLy8gQ29uc3RhbnRzIGZvciB2YWxpZGF0aW9uXG5jb25zdCBNQVhfVEVNUExBVEVfU0laRV9CWVRFUyA9IDUgKiAxMDI0ICogMTAyNDsgLy8gNU1CIChjb25zZXJ2YXRpdmUgbGltaXQgdG8gc3RheSB1bmRlciAxME1CIExhbWJkYSBsaW1pdClcbmNvbnN0IExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCA9IDEwICogMTAyNCAqIDEwMjQ7IC8vIDEwTUIgQVdTIExhbWJkYSBsaW1pdFxuY29uc3QgVEVNUExBVEVfU0laRV9XQVJOSU5HX1RIUkVTSE9MRCA9IDEgKiAxMDI0ICogMTAyNDsgLy8gMU1CIHdhcm5pbmcgdGhyZXNob2xkXG5cbmZ1bmN0aW9uIGxvYWRUZW1wbGF0ZSgpIHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdwdWJsaWMvaW5kZXguaHRtbCcpO1xuICBjb25zdCB1c2VGYWxsYmFjayA9IHRydWU7IC8vIERlZmF1bHQgdG8gdHJ1ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXG4gIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgaWYgKHVzZUZhbGxiYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSk7XG4gICAgICBjb25zb2xlLndhcm4oJ0RFUFJFQ0FUSU9OIFdBUk5JTkc6IE1pc3NpbmcgcHVibGljL2luZGV4Lmh0bWwnKTtcbiAgICAgIGNvbnNvbGUud2FybignPScucmVwZWF0KDgwKSk7XG4gICAgICBjb25zb2xlLndhcm4oYFxcbkZpbGUgbm90IGZvdW5kOiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICAgIGNvbnNvbGUud2FybignXFxuVGhlIFB1cmVub3cgZnJhbWV3b3JrIGlzIHVzaW5nIGEgZmFsbGJhY2sgSFRNTCB0ZW1wbGF0ZS4nKTtcbiAgICAgIGNvbnNvbGUud2FybignVGhpcyBmYWxsYmFjayB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4nKTtcbiAgICAgIGNvbnNvbGUud2FybignXFxuQWN0aW9uIHJlcXVpcmVkOiBDcmVhdGUgcHVibGljL2luZGV4Lmh0bWwgaW4geW91ciBwcm9qZWN0IHJvb3QuJyk7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbk1pbmltYWwgdGVtcGxhdGUgc3RydWN0dXJlOicpO1xuICAgICAgY29uc29sZS53YXJuKCcnKTtcbiAgICAgIGNvbnNvbGUud2FybignPCFET0NUWVBFIGh0bWw+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJzxodG1sIGxhbmc9XCJlblwiPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDxoZWFkPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz4nKTtcbiAgICAgIGNvbnNvbGUud2FybignICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgPC9oZWFkPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDxib2R5PicpO1xuICAgICAgY29uc29sZS53YXJuKCcgICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDwvYm9keT4nKTtcbiAgICAgIGNvbnNvbGUud2FybignPC9odG1sPicpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG5cbiAgICAgIHJldHVybiBnZXREZWZhdWx0VGVtcGxhdGUoKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogTWlzc2luZyBwdWJsaWMvaW5kZXguaHRtbFxcbmAgK1xuICAgICAgYCR7Jz0nLnJlcGVhdCg4MCl9XFxuXFxuYCArXG4gICAgICBgRmlsZSBub3QgZm91bmQ6ICR7dGVtcGxhdGVQYXRofVxcblxcbmAgK1xuICAgICAgYFRoZSBQdXJlbm93IGZyYW1ld29yayByZXF1aXJlcyBhIGJhc2UgSFRNTCB0ZW1wbGF0ZSBpbiB5b3VyIHByb2plY3QuXFxuXFxuYCArXG4gICAgICBgQWN0aW9uIHJlcXVpcmVkOiBDcmVhdGUgcHVibGljL2luZGV4Lmh0bWwgd2l0aCB0aGUgZm9sbG93aW5nIG1pbmltYWwgc3RydWN0dXJlOlxcblxcbmAgK1xuICAgICAgYDwhRE9DVFlQRSBodG1sPlxcbmAgK1xuICAgICAgYDxodG1sIGxhbmc9XCJlblwiPlxcbmAgK1xuICAgICAgYCAgPGhlYWQ+XFxuYCArXG4gICAgICBgICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiIC8+XFxuYCArXG4gICAgICBgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+XFxuYCArXG4gICAgICBgICA8L2hlYWQ+XFxuYCArXG4gICAgICBgICA8Ym9keT5cXG5gICtcbiAgICAgIGAgICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PlxcbmAgK1xuICAgICAgYCAgPC9ib2R5PlxcbmAgK1xuICAgICAgYDwvaHRtbD5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWQgZmlsZSBjb250ZW50XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmLTgnKTtcblxuICAvLyBDaGVjayBpZiBmaWxlIGlzIGVtcHR5XG4gIGlmICghY29udGVudCB8fCBjb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogRW1wdHkgcHVibGljL2luZGV4Lmh0bWxcXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcblxcbmAgK1xuICAgICAgYEZpbGUgbG9jYXRpb246ICR7dGVtcGxhdGVQYXRofVxcblxcbmAgK1xuICAgICAgYFRoZSBmaWxlIGV4aXN0cyBidXQgaXMgZW1wdHkuIEl0IG11c3QgY29udGFpbiBhIHZhbGlkIEhUTUwgZG9jdW1lbnQgc3RydWN0dXJlLlxcblxcbmAgK1xuICAgICAgYEFjdGlvbiByZXF1aXJlZDogQWRkIEhUTUwgY29udGVudCB0byBwdWJsaWMvaW5kZXguaHRtbC5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRlbXBsYXRlIHNpemVcbiAgdmFsaWRhdGVUZW1wbGF0ZVNpemUoY29udGVudCwgdGVtcGxhdGVQYXRoKTtcblxuICAvLyBWYWxpZGF0ZSBIVE1MIHN0cnVjdHVyZVxuICB2YWxpZGF0ZVRlbXBsYXRlKGNvbnRlbnQsIHRlbXBsYXRlUGF0aCk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGVtcGxhdGVTaXplKGh0bWw6IHN0cmluZywgdGVtcGxhdGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2l6ZUJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoaHRtbCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHNpemVNQiA9IChzaXplQnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuXG4gIC8vIENoZWNrIGlmIHRlbXBsYXRlIGV4Y2VlZHMgbWF4aW11bSBzaXplXG4gIGlmIChzaXplQnl0ZXMgPiBNQVhfVEVNUExBVEVfU0laRV9CWVRFUykge1xuICAgIGNvbnN0IG1heFNpemVNQiA9IChNQVhfVEVNUExBVEVfU0laRV9CWVRFUyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFxcbiR7Jz0nLnJlcGVhdCg4MCl9XFxuYCArXG4gICAgICBgQlVJTEQgRVJST1I6IEhUTUwgdGVtcGxhdGUgdG9vIGxhcmdlXFxuYCArXG4gICAgICBgJHsnPScucmVwZWF0KDgwKX1cXG5cXG5gICtcbiAgICAgIGBGaWxlOiAke3RlbXBsYXRlUGF0aH1cXG5gICtcbiAgICAgIGBTaXplOiAke3NpemVNQn0gTUJcXG5gICtcbiAgICAgIGBNYXhpbXVtIGFsbG93ZWQ6ICR7bWF4U2l6ZU1CfSBNQlxcblxcbmAgK1xuICAgICAgYFRoZSBIVE1MIHRlbXBsYXRlIGlzIHRvbyBsYXJnZSBhbmQgd2lsbCBjYXVzZSB0aGUgTGFtYmRhIGJ1bmRsZSB0byBleGNlZWRcXG5gICtcbiAgICAgIGB0aGUgQVdTIDEwTUIgZGVwbG95bWVudCBsaW1pdC5cXG5cXG5gICtcbiAgICAgIGBBY3Rpb24gcmVxdWlyZWQ6IFJlZHVjZSB0aGUgc2l6ZSBvZiBwdWJsaWMvaW5kZXguaHRtbCBieTpcXG5gICtcbiAgICAgIGAgIC0gUmVtb3ZpbmcgaW5saW5lIHN0eWxlcyAodXNlIGV4dGVybmFsIENTUyBmaWxlcyBpbnN0ZWFkKVxcbmAgK1xuICAgICAgYCAgLSBSZW1vdmluZyBpbmxpbmUgc2NyaXB0cyAodXNlIGV4dGVybmFsIEpTIGZpbGVzIGluc3RlYWQpXFxuYCArXG4gICAgICBgICAtIFJlbW92aW5nIGxhcmdlIGVtYmVkZGVkIGRhdGEgKHVzZSBleHRlcm5hbCBmaWxlcyBpbnN0ZWFkKVxcbmAgK1xuICAgICAgYCAgLSBNaW5pbWl6aW5nIEhUTUwgY29tbWVudHMgYW5kIHdoaXRlc3BhY2VcXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdhcm4gaWYgdGVtcGxhdGUgaXMgYXBwcm9hY2hpbmcgdGhlIHdhcm5pbmcgdGhyZXNob2xkXG4gIGlmIChzaXplQnl0ZXMgPiBURU1QTEFURV9TSVpFX1dBUk5JTkdfVEhSRVNIT0xEKSB7XG4gICAgY29uc3Qgd2FybmluZ1RocmVzaG9sZE1CID0gKFRFTVBMQVRFX1NJWkVfV0FSTklOR19USFJFU0hPTEQgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IExhcmdlIEhUTUwgdGVtcGxhdGUgZGV0ZWN0ZWQnKTtcbiAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybihgXFxuRmlsZTogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgY29uc29sZS53YXJuKGBTaXplOiAke3NpemVNQn0gTUIgKHRocmVzaG9sZDogJHt3YXJuaW5nVGhyZXNob2xkTUJ9IE1CKWApO1xuICAgIGNvbnNvbGUud2FybignXFxuQSBsYXJnZSBIVE1MIHRlbXBsYXRlIGluY3JlYXNlcyBMYW1iZGEgYnVuZGxlIHNpemUgYW5kIGNvbGQgc3RhcnQgdGltZS4nKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcbkNvbnNpZGVyOicpO1xuICAgIGNvbnNvbGUud2FybignICAtIE1vdmluZyBpbmxpbmUgc3R5bGVzIHRvIGV4dGVybmFsIENTUyBmaWxlcycpO1xuICAgIGNvbnNvbGUud2FybignICAtIE1vdmluZyBpbmxpbmUgc2NyaXB0cyB0byBleHRlcm5hbCBKUyBmaWxlcycpO1xuICAgIGNvbnNvbGUud2FybignICAtIFJlZHVjaW5nIGVtYmVkZGVkIGRhdGEgYW5kIGNvbW1lbnRzJyk7XG4gICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUZW1wbGF0ZShodG1sOiBzdHJpbmcsIHRlbXBsYXRlUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IG1pc3NpbmdUYWdzID0gW107XG5cbiAgaWYgKCEvPGh0bWxbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGh0bWw+Jyk7XG4gIH1cbiAgaWYgKCEvPGhlYWRbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGhlYWQ+Jyk7XG4gIH1cbiAgaWYgKCEvPGJvZHlbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGJvZHk+Jyk7XG4gIH1cblxuICBpZiAobWlzc2luZ1RhZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IEludmFsaWQgSFRNTCBzdHJ1Y3R1cmUgZGV0ZWN0ZWQnKTtcbiAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybihgXFxuRmlsZTogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgY29uc29sZS53YXJuKGBNaXNzaW5nIHJlcXVpcmVkIHRhZ3M6ICR7bWlzc2luZ1RhZ3Muam9pbignLCAnKX1gKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcblRoZSBIVE1MIHRlbXBsYXRlIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseSBhdCBydW50aW1lLicpO1xuICAgIGNvbnNvbGUud2FybignXFxuQWN0aW9uIHJlY29tbWVuZGVkOiBBZGQgdGhlIG1pc3NpbmcgdGFncyB0byBwdWJsaWMvaW5kZXguaHRtbC4nKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSArICdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VGVtcGxhdGUoKSB7XG4gIHJldHVybiBgPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIiAvPlxuICAgIDxtZXRhIG5hbWU9XCJ0aGVtZS1jb2xvclwiIGNvbnRlbnQ9XCIjMDAwMDAwXCIgLz5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bm9zY3JpcHQ+WW91IG5lZWQgdG8gZW5hYmxlIEphdmFTY3JpcHQgdG8gcnVuIHRoaXMgYXBwLjwvbm9zY3JpcHQ+XG4gICAgPGRpdiBpZD1cInJvb3QtaW50ZXJuYWxcIj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+YDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVCdW5kbGVTaXplKGVtYmVkZGVkRmlsZVBhdGg6IGFueSkge1xuICAvLyBDaGVjayBpZiB0aGUgZW1iZWRkZWQgZmlsZSBleGlzdHNcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGVtYmVkZGVkRmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBDb3VsZCBub3QgdmFsaWRhdGUgYnVuZGxlIHNpemUgLSBlbWJlZGRlZCBmaWxlIG5vdCBmb3VuZDogJHtlbWJlZGRlZEZpbGVQYXRofWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVtYmVkZGVkRmlsZVNpemUgPSBmcy5zdGF0U3luYyhlbWJlZGRlZEZpbGVQYXRoKS5zaXplO1xuICBjb25zdCBlbWJlZGRlZEZpbGVTaXplTUIgPSAoZW1iZWRkZWRGaWxlU2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG5cbiAgLy8gY29uc29sZS5sb2coYCAgRW1iZWRkZWQgZmlsZSBzaXplOiAke2VtYmVkZGVkRmlsZVNpemVNQn0gTUJgKTtcblxuICAvLyBFc3RpbWF0ZSBpbXBhY3Qgb24gTGFtYmRhIGJ1bmRsZVxuICAvLyBUaGUgZW1iZWRkZWQgZmlsZSB3aWxsIGJlIHBhcnQgb2YgdGhlIExhbWJkYSBidW5kbGUsIHNvIHdlIGNoZWNrIGlmIGl0J3MgcmVhc29uYWJsZVxuICBpZiAoZW1iZWRkZWRGaWxlU2l6ZSA+IE1BWF9URU1QTEFURV9TSVpFX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFxcbiR7Jz0nLnJlcGVhdCg4MCl9XFxuYCArXG4gICAgICBgQlVJTEQgRVJST1I6IEVtYmVkZGVkIHRlbXBsYXRlIGZpbGUgdG9vIGxhcmdlXFxuYCArXG4gICAgICBgJHsnPScucmVwZWF0KDgwKX1cXG5cXG5gICtcbiAgICAgIGBGaWxlOiAke2VtYmVkZGVkRmlsZVBhdGh9XFxuYCArXG4gICAgICBgU2l6ZTogJHtlbWJlZGRlZEZpbGVTaXplTUJ9IE1CXFxuYCArXG4gICAgICBgTWF4aW11bSBhbGxvd2VkOiAkeyhNQVhfVEVNUExBVEVfU0laRV9CWVRFUyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CXFxuXFxuYCArXG4gICAgICBgVGhlIGVtYmVkZGVkIHRlbXBsYXRlIGZpbGUgd2lsbCBjYXVzZSB0aGUgTGFtYmRhIGJ1bmRsZSB0byBleGNlZWQgdGhlXFxuYCArXG4gICAgICBgQVdTIDEwTUIgZGVwbG95bWVudCBsaW1pdC5cXG5cXG5gICtcbiAgICAgIGBBY3Rpb24gcmVxdWlyZWQ6IFJlZHVjZSB0aGUgc2l6ZSBvZiBwdWJsaWMvaW5kZXguaHRtbC5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIExhbWJkYSBidW5kbGUgZXhpc3RzIGFuZCB2YWxpZGF0ZSBpdHMgc2l6ZVxuICAvLyBOb3RlOiBUaGlzIGlzIGluZm9ybWF0aW9uYWwgb25seSBkdXJpbmcgdGVtcGxhdGUgZ2VuZXJhdGlvbiwgYXMgdGhlIGJ1bmRsZVxuICAvLyBtYXkgbm90IGhhdmUgYmVlbiByZWJ1aWx0IHlldCB3aXRoIHRoZSBuZXcgdGVtcGxhdGVcbiAgY29uc3QgbGFtYmRhQnVuZGxlUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9vdXQvZGlzdC9sYW1iZGEvYnVuZGxlLmpzJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxhbWJkYUJ1bmRsZVBhdGgpKSB7XG4gICAgY29uc3QgYnVuZGxlU2l6ZSA9IGZzLnN0YXRTeW5jKGxhbWJkYUJ1bmRsZVBhdGgpLnNpemU7XG4gICAgY29uc3QgYnVuZGxlU2l6ZU1CID0gKGJ1bmRsZVNpemUgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuXG4gICAgY29uc29sZS5sb2coYCAgTGFtYmRhIGJ1bmRsZSBzaXplOiAke2J1bmRsZVNpemVNQn0gTUIgKGV4aXN0aW5nIGJ1bmRsZSlgKTtcblxuICAgIC8vIE9ubHkgd2FybiBhYm91dCBidW5kbGUgc2l6ZSwgZG9uJ3QgZmFpbCB0aGUgYnVpbGRcbiAgICAvLyBUaGUgYnVuZGxlIHdpbGwgYmUgcmVidWlsdCBhZnRlciB0aGlzIHNjcmlwdCBydW5zXG4gICAgaWYgKGJ1bmRsZVNpemUgPiBMQU1CREFfQlVORExFX1NJWkVfTElNSVQpIHtcbiAgICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogRXhpc3RpbmcgTGFtYmRhIGJ1bmRsZSBleGNlZWRzIEFXUyBsaW1pdCcpO1xuICAgICAgY29uc29sZS53YXJuKCc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybihgXFxuQnVuZGxlOiAke2xhbWJkYUJ1bmRsZVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oYFNpemU6ICR7YnVuZGxlU2l6ZU1CfSBNQmApO1xuICAgICAgY29uc29sZS53YXJuKGBBV1MgTGFtYmRhIGxpbWl0OiAkeyhMQU1CREFfQlVORExFX1NJWkVfTElNSVQgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpfSBNQmApO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5Ob3RlOiBUaGlzIGlzIHRoZSBleGlzdGluZyBidW5kbGUgYmVmb3JlIHRlbXBsYXRlIGVtYmVkZGluZy4nKTtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIGJ1bmRsZSB3aWxsIGJlIHJlYnVpbHQgd2l0aCB0aGUgbmV3IHRlbXBsYXRlLicpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5JZiB0aGUgYnVuZGxlIHNpemUgaXNzdWUgcGVyc2lzdHMgYWZ0ZXIgcmVidWlsZDonKTtcbiAgICAgIGNvbnNvbGUud2FybignICAxLiBFeHRlcm5hbGl6ZSBsYXJnZSBkZXBlbmRlbmNpZXMgaW4gZXNidWlsZCBjb25maWcnKTtcbiAgICAgIGNvbnNvbGUud2FybignICAyLiBVc2UgTGFtYmRhIGxheWVycyBmb3IgbGFyZ2UgZGVwZW5kZW5jaWVzJyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgMy4gUmVkdWNlIHRoZSBzaXplIG9mIHB1YmxpYy9pbmRleC5odG1sIGlmIG5lZWRlZCcpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdhcm4gaWYgYnVuZGxlIGlzIGFwcHJvYWNoaW5nIHRoZSBsaW1pdCAoPjhNQilcbiAgICAgIGNvbnN0IGJ1bmRsZVdhcm5pbmdUaHJlc2hvbGQgPSA4ICogMTAyNCAqIDEwMjQ7XG4gICAgICBpZiAoYnVuZGxlU2l6ZSA+IGJ1bmRsZVdhcm5pbmdUaHJlc2hvbGQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IExhbWJkYSBidW5kbGUgYXBwcm9hY2hpbmcgc2l6ZSBsaW1pdCcpO1xuICAgICAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICBjb25zb2xlLndhcm4oYFxcbkJ1bmRsZSBzaXplOiAke2J1bmRsZVNpemVNQn0gTUJgKTtcbiAgICAgICAgY29uc29sZS53YXJuKGBBV1MgbGltaXQ6ICR7KExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CYCk7XG4gICAgICAgIGNvbnNvbGUud2FybignXFxuQ29uc2lkZXIgb3B0aW1pemluZyB0aGUgYnVuZGxlIHRvIGF2b2lkIGRlcGxveW1lbnQgZmFpbHVyZXMuJyk7XG4gICAgICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApICsgJ1xcbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVtYmVkZGVkVGVtcGxhdGVGaWxlKCkge1xuICAvLyBjb25zb2xlLmxvZygnXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgLy8gY29uc29sZS5sb2coJ0dlbmVyYXRpbmcgSFRNTCBUZW1wbGF0ZSBFbWJlZGRpbmcnKTtcbiAgLy8gY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG5cbiAgLy8gTG9hZCB0aGUgSFRNTCB0ZW1wbGF0ZVxuICBjb25zdCB0ZW1wbGF0ZSA9IGxvYWRUZW1wbGF0ZSgpO1xuXG4gIC8vIEdlbmVyYXRlIFR5cGVTY3JpcHQgZmlsZSBjb250ZW50XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gYC8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBFbWJlZGRlZCBIVE1MIHRlbXBsYXRlIGZyb20gcHVibGljL2luZGV4Lmh0bWwuXG4gKiBcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGJ5IGJpbi9kZXBsb3kvZ2VuZXJhdGUtaHRtbC10ZW1wbGF0ZS5qcy5cbiAqIERPIE5PVCBFRElUIFRISVMgRklMRSBNQU5VQUxMWSAtIGNoYW5nZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBvbiBuZXh0IGJ1aWxkLlxuICogXG4gKiBUbyBtb2RpZnkgdGhlIEhUTUwgdGVtcGxhdGUsIGVkaXQgcHVibGljL2luZGV4Lmh0bWwgaW4geW91ciBwcm9qZWN0IHJvb3QuXG4gKi9cblxuZXhwb3J0IGNvbnN0IEhUTUxfVEVNUExBVEUgPSAke0pTT04uc3RyaW5naWZ5KHRlbXBsYXRlKX07XG5gO1xuXG4gIC8vIFdyaXRlIHRvIHNyYy9jb3JlL3NlcnZpY2VzL3RlbXBsYXRlL2h0bWwtdGVtcGxhdGUuZW1iZWRkZWQudHNcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihcbiAgICBfX2Rpcm5hbWUsXG4gICAgJy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL3RlbXBsYXRlL2h0bWwtdGVtcGxhdGUuZW1iZWRkZWQudHMnLFxuICApO1xuXG4gIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gIGNvbnN0IG91dHB1dERpciA9IHBhdGguZGlybmFtZShvdXRwdXRQYXRoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcbiAgICBmcy5ta2RpclN5bmMob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgZmlsZUNvbnRlbnQsICd1dGYtOCcpO1xuXG4gIGNvbnN0IHRlbXBsYXRlU2l6ZUtCID0gKHRlbXBsYXRlLmxlbmd0aCAvIDEwMjQpLnRvRml4ZWQoMik7XG4gIC8vIGNvbnNvbGUubG9nKGBcdTI3MTMgR2VuZXJhdGVkOiAke291dHB1dFBhdGh9YCk7XG4gIC8vIGNvbnNvbGUubG9nKGAgIFRlbXBsYXRlIHNpemU6ICR7dGVtcGxhdGVTaXplS0J9IEtCYCk7XG5cbiAgLy8gVmFsaWRhdGUgYnVuZGxlIHNpemVcbiAgdmFsaWRhdGVCdW5kbGVTaXplKG91dHB1dFBhdGgpO1xuXG4gIC8vIGNvbnNvbGUubG9nKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAvLyBjb25zb2xlLmxvZygnSFRNTCBUZW1wbGF0ZSBFbWJlZGRpbmcgQ29tcGxldGUnKTtcbiAgLy8gY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0YXRpY0h0bWwoc2hvdWxkRXhpdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIC8vIFJ1biB0aGUgZ2VuZXJhdG9yXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVFbWJlZGRlZFRlbXBsYXRlRmlsZSgpO1xuICAgIGlmIChzaG91bGRFeGl0KSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLmVycm9yKCdCVUlMRCBGQUlMRUQ6IEhUTUwgVGVtcGxhdGUgR2VuZXJhdGlvbiBFcnJvcicpO1xuICAgIGNvbnNvbGUuZXJyb3IoJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1xcbicgKyBlcnJvci5tZXNzYWdlKTtcbiAgICBpZiAoZXJyb3Iuc3RhY2sgJiYgcHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1xcblN0YWNrIHRyYWNlOicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgfVxuICAgIGlmIChzaG91bGRFeGl0KSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cblxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgUnVudGltZSBDTEkgZXJyb3JzXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNsaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvZGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGludD86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDbGlFcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCBvciBtaXNzaW5nXG4gKiBFeHRlbmRzIHB1cmVub3cgQ29uZmlnRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNvbmZpZ0Vycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfQ09ORklHX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDb25maWdFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGJ1aWxkIG9wZXJhdGlvbnMgZmFpbFxuICogRXh0ZW5kcyBwdXJlbm93IEJ1aWxkRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUJ1aWxkRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9CVUlMRF9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lQnVpbGRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGRlcGxveW1lbnQgb3BlcmF0aW9ucyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgRGVwbG95bWVudEVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9ERVBMT1lNRU5UX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVEZXBsb3ltZW50RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSB2YWxpZGF0aW9uIGNoZWNrcyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgVmFsaWRhdGlvbkVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9WQUxJREFUSU9OX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVWYWxpZGF0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRnJpZW5kbHkgZXJyb3IgZm9ybWF0dGVyIGZvciBydW50aW1lIHdvcmtzcGFjZVxuICogRm9sbG93cyBwdXJlbm93IEZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIgcGF0dGVybiB3aXRob3V0IGVtb2ppXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciB7XG4gIC8qKlxuICAgKiBGb3JtYXQgZXJyb3IgYXMgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXRFcnJvcihlcnJvcjogRXJyb3IsIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBIZWFkZXIgd2l0aG91dCBlbW9qaVxuICAgIGxpbmVzLnB1c2goYEVycm9yOiAke2Vycm9yLm5hbWUgfHwgJ1J1bnRpbWVFcnJvcid9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBFcnJvciBtZXNzYWdlXG4gICAgbGluZXMucHVzaChgTWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gSGludCBpZiBhdmFpbGFibGVcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSdW50aW1lQ2xpRXJyb3IgJiYgZXJyb3IuaGludCkge1xuICAgICAgbGluZXMucHVzaChgSGludDogJHtlcnJvci5oaW50fWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gU3RhY2sgdHJhY2UgaW4gdmVyYm9zZSBtb2RlXG4gICAgaWYgKHZlcmJvc2UgJiYgZXJyb3Iuc3RhY2spIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBTdGFjayBUcmFjZSAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goZXJyb3Iuc3RhY2spO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB2YWxpZGF0aW9uIGVycm9yIHdpdGhvdXQgZW1vamlcbiAgICovXG4gIGZvcm1hdFZhbGlkYXRpb25FcnJvcihcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnVmFsaWRhdGlvbiBFcnJvcicpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goYEZpZWxkOiAke2ZpZWxkTmFtZX1gKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHttZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBUZWNobmljYWwgRGV0YWlscyAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goYEZpZWxkIHZhbGlkYXRpb24gZmFpbGVkIGZvcjogJHtmaWVsZE5hbWV9YCk7XG4gICAgICBsaW5lcy5wdXNoKGBWYWxpZGF0aW9uIG1lc3NhZ2U6ICR7bWVzc2FnZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgZGVwbG95bWVudCBlcnJvciB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXREZXBsb3ltZW50RXJyb3IoXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJ0RlcGxveW1lbnQgRXJyb3InKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKGBTdGFjazogJHtzdGFja05hbWV9YCk7XG4gICAgbGluZXMucHVzaChgT3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHttZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgbGluZXMucHVzaCgnVHJvdWJsZXNob290aW5nOicpO1xuICAgIGxpbmVzLnB1c2goJzEuIENoZWNrIEFXUyBjcmVkZW50aWFscyBhbmQgcGVybWlzc2lvbnMnKTtcbiAgICBsaW5lcy5wdXNoKCcyLiBWZXJpZnkgc3RhY2sgY29uZmlndXJhdGlvbicpO1xuICAgIGxpbmVzLnB1c2goJzMuIFJldmlldyBDbG91ZEZvcm1hdGlvbiBldmVudHMgaW4gQVdTIENvbnNvbGUnKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gVGVjaG5pY2FsIERldGFpbHMgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGBTdGFjayBuYW1lOiAke3N0YWNrTmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goYEZhaWxlZCBvcGVyYXRpb246ICR7b3BlcmF0aW9ufWApO1xuICAgICAgbGluZXMucHVzaChgRXJyb3IgZGV0YWlsczogJHttZXNzYWdlfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG59XG5cbi8qKlxuICogU3RydWN0dXJlZCBsb2dnZXIgZm9yIHJ1bnRpbWUgd29ya3NwYWNlXG4gKiBGb2xsb3dzIHB1cmVub3cgbG9nZ2luZyBwYXR0ZXJucyB3aXRob3V0IGVtb2ppXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lU3RydWN0dXJlZExvZ2dlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnd2FybicsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS53YXJuKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogJHttZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmVyYm9zZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBjb25zb2xlLmRlYnVnKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJvb0JBQUEsSUFBQUEsRUFBQUMsR0FBQSxLQWNBLElBQUlDLElBQ0gsU0FBVUEsRUFBUyxFQUdmLFNBQVVDLEVBQVMsQ0FDaEIsSUFBSUMsRUFBTyxPQUFPLFlBQWUsU0FBVyxXQUN4QyxPQUFPLFFBQVcsU0FBVyxPQUN6QixPQUFPLE1BQVMsU0FBVyxLQUN2QixPQUFPLE1BQVMsU0FBVyxLQUN2QkMsRUFBZSxFQUMzQkMsRUFBV0MsRUFBYUwsQ0FBTyxFQUMvQixPQUFPRSxFQUFLLFFBQVksTUFDeEJFLEVBQVdDLEVBQWFILEVBQUssUUFBU0UsQ0FBUSxHQUVsREgsRUFBUUcsRUFBVUYsQ0FBSSxFQUNsQixPQUFPQSxFQUFLLFFBQVksTUFDeEJBLEVBQUssUUFBVUYsR0FFbkIsU0FBU0ssRUFBYUMsRUFBUUMsRUFBVSxDQUNwQyxPQUFPLFNBQVVDLEVBQUtDLEVBQU8sQ0FDekIsT0FBTyxlQUFlSCxFQUFRRSxFQUFLLENBQUUsYUFBYyxHQUFNLFNBQVUsR0FBTSxNQUFPQyxDQUFNLENBQUMsRUFDbkZGLEdBQ0FBLEVBQVNDLEVBQUtDLENBQUssQ0FDM0IsQ0FDSixDQUNBLFNBQVNDLEdBQWUsQ0FDcEIsR0FBSSxDQUNBLE9BQU8sU0FBUyxjQUFjLEVBQUUsQ0FDcEMsTUFDVSxDQUFFLENBQ2hCLENBQ0EsU0FBU0MsR0FBbUIsQ0FDeEIsR0FBSSxDQUNBLFNBQWdCLE1BQU0saUNBQWlDLENBQzNELE1BQ1Us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VyxnQkFDckIsTUFBTywwQ0FDUCxZQUFhLDBDQUNiLGdCQUFpQixTQUNuQixDQUFDLEVBRUQsS0FBSyxZQUFXLHdCQUFxQkEsRUFBa0IsZUFBZSxDQVF4RSxDQUtBLE1BQWdCLGNBQ2RDLEVBQTJCQyxFQUFjLEVBQUFDLFFBQVEsSUFBSSxFQUN6QyxDQUNaLElBQU1DLEVBQ0osTUFBTSxNQUFNLGNBQWlDSCxFQUFZQyxDQUFHLEVBR3hERyxFQUFzQixJQUFJQyxFQUFrQ0osQ0FBRyxFQUVyRSxNQUFPLENBQ0wsR0FBR0UsRUFDSCxvQkFBQUMsQ0FDRixDQUNGLENBS0EsTUFBTSxJQUFJRSxFQUFnQyxDQUN4QyxNQUFNLEtBQUssUUFBUSxXQUFXQSxHQUFRLEVBQUFKLFFBQVEsSUFBSSxDQUNwRCxDQUtBLE9BQWMsWUFBWUssRUFBdUIsQ0FDL0MsSUFBTUMsRUFBWSxJQUFJQyxHQUV0QixHQUFJRixhQUFpQixNQUFPLENBQzFCLElBQU1HLEVBQWlCRixFQUFVLFlBQVlELEVBQU8sQ0FBQyxDQUFDLEVBQUFMLFFBQVEsSUFBSSxLQUFLLEVBQ3ZFLFFBQVEsTUFBTVEsQ0FBYyxDQUM5QixNQUNFLFFBQVEsTUFBTSxpQkFBa0IsT0FBT0gsQ0FBSyxDQUFDLEVBRS9DLEVBQUFMLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQ0YsRUFLTyxTQUFTUyxJQUFzQyxDQUNwRCxPQUFPLElBQUliLENBQ2IiLAogICJuYW1lcyI6IFsicmVxdWlyZV9SZWZsZWN0IiwgIl9fY29tbW9uSlNNaW4iLCAiUmVmbGVjdCIsICJmYWN0b3J5IiwgInJvb3QiLCAic2xvcHB5TW9kZVRoaXMiLCAiZXhwb3J0ZXIiLCAibWFrZUV4cG9ydGVyIiwgInRhcmdldCIsICJwcmV2aW91cyIsICJrZXkiLCAidmFsdWUiLCAiZnVuY3Rpb25UaGlzIiwgImluZGlyZWN0RXZhbFRoaXMiLCAiaGFzT3duIiwgInN1cHBvcnRzU3ltYm9sIiwgInRvUHJpbWl0aXZlU3ltYm9sIiwgIml0ZXJhdG9yU3ltYm9sIiwgInN1cHBvcnRzQ3JlYXRlIiwgInN1cHBvcnRzUHJvdG8iLCAiZG93bkxldmVsIiwgIkhhc2hNYXAiLCAiTWFrZURpY3Rpb25hcnkiLCAibWFwIiwgImZ1bmN0aW9uUHJvdG90eXBlIiwgIl9NYXAiLCAiQ3JlYXRlTWFwUG9seWZpbGwiLCAiX1NldCIsICJDcmVhdGVTZXRQb2x5ZmlsbCIsICJfV2Vha01hcCIsICJDcmVhdGVXZWFrTWFwUG9seWZpbGwiLCAicmVnaXN0cnlTeW1ib2wiLCAibWV0YWRhdGFSZWdpc3RyeSIsICJHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkiLCAibWV0YWRhdGFQcm92aWRlciIsICJDcmVhdGVNZXRhZGF0YVByb3ZpZGVyIiwgImRlY29yYXRlIiwgImRlY29yYXRvcnMiLCAicHJvcGVydHlLZXkiLCAiYXR0cmlidXRlcyIsICJJc1VuZGVmaW5lZCIsICJJc0FycmF5IiwgIklzQ29uc3RydWN0b3IiLCAiRGVjb3JhdGVDb25zdHJ1Y3RvciIsICJJc09iamVjdCIsICJJc051bGwiLCAiVG9Qcm9wZXJ0eUtleSIsICJEZWNvcmF0ZVByb3BlcnR5IiwgIm1ldGFkYXRhIiwgIm1ldGFkYXRhS2V5IiwgIm1ldGFkYXRhVmFsdWUiLCAiZGVjb3JhdG9yIiwgIklzUHJvcGVydHlLZXkiLCAiT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSIsICJkZWZpbmVNZXRhZGF0YSIsICJoYXNNZXRhZGF0YSIsICJPcmRpbmFyeUhhc01ldGFkYXRhIiwgImhhc093bk1ldGFkYXRhIiwgIk9yZGluYXJ5SGFzT3duTWV0YWRhdGEiLCAiZ2V0TWV0YWRhdGEiLCAiT3JkaW5hcnlHZXRNZXRhZGF0YSIsICJnZXRPd25NZXRhZGF0YSIsICJPcmRpbmFyeUdldE93bk1ldGFkYXRhIiwgImdldE1ldGFkYXRhS2V5cyIsICJPcmRpbmFyeU1ldGFkYXRhS2V5cyIsICJnZXRPd25NZXRhZGF0YUtleXMiLCAiT3JkaW5hcnlPd25NZXRhZGF0YUtleXMiLCAiZGVsZXRlTWV0YWRhdGEiLCAicHJvdmlkZXIiLCAiR2V0TWV0YWRhdGFQcm92aWRlciIsICJpIiwgImRlY29yYXRlZCIsICJkZXNjcmlwdG9yIiwgIk1ldGFkYXRhS2V5IiwgIk8iLCAiUCIsICJwYXJlbnQiLCAiT3JkaW5hcnlHZXRQcm90b3R5cGVPZiIsICJUb0Jvb2xlYW4iLCAiTWV0YWRhdGFWYWx1ZSIsICJvd25LZXlzIiwgInBhcmVudEtleXMiLCAic2V0IiwgImtleXMiLCAiX2kiLCAib3duS2V5c18xIiwgImhhc0tleSIsICJfYSIsICJwYXJlbnRLZXlzXzEiLCAiVHlwZSIsICJ4IiwgIklzU3ltYm9sIiwgIlRvUHJpbWl0aXZlIiwgImlucHV0IiwgIlByZWZlcnJlZFR5cGUiLCAiaGludCIsICJleG90aWNUb1ByaW0iLCAiR2V0TWV0aG9kIiwgInJlc3VsdCIsICJPcmRpbmFyeVRvUHJpbWl0aXZlIiwgInRvU3RyaW5nXzEiLCAiSXNDYWxsYWJsZSIsICJ2YWx1ZU9mIiwgInRvU3RyaW5nXzIiLCAiYXJndW1lbnQiLCAiVG9TdHJpbmciLCAiU2FtZVZhbHVlWmVybyIsICJ5IiwgIlYiLCAiZnVuYyIsICJHZXRJdGVyYXRvciIsICJvYmoiLCAibWV0aG9kIiwgIml0ZXJhdG9yIiwgIkl0ZXJhdG9yVmFsdWUiLCAiaXRlclJlc3VsdCIsICJJdGVyYXRvclN0ZXAiLCAiSXRlcmF0b3JDbG9zZSIsICJmIiwgInByb3RvIiwgInByb3RvdHlwZSIsICJwcm90b3R5cGVQcm90byIsICJjb25zdHJ1Y3RvciIsICJDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwgImZhbGxiYWNrIiwgIkNyZWF0ZUZhbGxiYWNrUHJvdmlkZXIiLCAiZmlyc3QiLCAic2Vjb25kIiwgInJlc3QiLCAidGFyZ2V0UHJvdmlkZXJNYXAiLCAicmVnaXN0cnkiLCAicmVnaXN0ZXJQcm92aWRlciIsICJnZXRQcm92aWRlciIsICJzZXRQcm92aWRlciIsICJnZXRQcm92aWRlck5vQ2FjaGUiLCAibmV4dCIsICJwcm92aWRlck1hcCIsICJoYXNQcm92aWRlciIsICJleGlzdGluZ1Byb3ZpZGVyIiwgInRhcmdldE1ldGFkYXRhIiwgIk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEiLCAiR2V0T3JDcmVhdGVNZXRhZGF0YU1hcCIsICJDcmVhdGUiLCAiY3JlYXRlZFRhcmdldE1ldGFkYXRhIiwgIm1ldGFkYXRhTWFwIiwgImtleXNPYmoiLCAiayIsICJuZXh0VmFsdWUiLCAiZSIsICJyZWZsZWN0IiwgIm1ldGFkYXRhT3duZXIiLCAibWV0YWRhdGFQcm9wZXJ0eVNldCIsICJyZWdpc3RlcmVkUHJvdmlkZXIiLCAiY2FjaGVTZW50aW5lbCIsICJhcnJheVNlbnRpbmVsIiwgIk1hcEl0ZXJhdG9yIiwgInZhbHVlcyIsICJzZWxlY3RvciIsICJpbmRleCIsICJlcnJvciIsICJNYXAiLCAic2l6ZSIsICJnZXRLZXkiLCAiZ2V0VmFsdWUiLCAiZ2V0RW50cnkiLCAiaW5zZXJ0IiwgIl8iLCAiU2V0IiwgIlVVSURfU0laRSIsICJyb290S2V5IiwgIkNyZWF0ZVVuaXF1ZUtleSIsICJXZWFrTWFwIiwgInRhYmxlIiwgIkdldE9yQ3JlYXRlV2Vha01hcFRhYmxlIiwgIkNyZWF0ZVVVSUQiLCAiY3JlYXRlIiwgIkZpbGxSYW5kb21CeXRlcyIsICJidWZmZXIiLCAiR2VuUmFuZG9tQnl0ZXMiLCAiYXJyYXkiLCAiZGF0YSIsICJvZmZzZXQiLCAiYnl0ZSIsICJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIlB1cmVub3dSdW50aW1lQ2xpIiwgIlB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSIsICJSdW50aW1lRGVwbG95bWVudFN0cmF0ZWd5IiwgIlRlbXBsYXRlU2VydmljZSIsICJidWlsZFN0YXRpY0h0bWwiLCAiY3JlYXRlUnVudGltZUNsaSIsICJfX3RvQ29tbW9uSlMiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3Byb2Nlc3MiLCAiaW1wb3J0X2JpbiIsICJmcyIsICJwYXRoIiwgImltcG9ydF9pbmZyYSIsICJpbXBvcnRfYmluIiwgIlRlbXBsYXRlU2VydmljZSIsICJjd2QiLCAicG9zc2libGVQYXRocyIsICJmb3VuZFBhdGgiLCAicCIsICJ0ZW1wbGF0ZU5hbWUiLCAidGFyZ2V0RGlyIiwgIm9wdGlvbnMiLCAiY29yZURpciIsICJ0ZW1wbGF0ZVBhdGgiLCAicmVzb2x2ZWRUYXJnZXREaXIiLCAiY29udGV4dCIsICJwcm9qZWN0TmFtZSIsICJjb25maWdDb250ZW50IiwgImNvbmZpZ1BhdGgiLCAidHNjb25maWdDb250ZW50IiwgInRzY29uZmlnUGF0aCIsICJmb3JjZSIsICJjZGtEaXIiLCAic291cmNlUGF0aCIsICJ0YXJnZXRQYXRoIiwgImVudHJpZXMiLCAiZW50cnkiLCAic291cmNlRmlsZSIsICJ0YXJnZXRGaWxlTmFtZSIsICJ0YXJnZXRGaWxlIiwgImNvbnRlbnQiLCAicmVzdWx0IiwgImtleSIsICJ2YWx1ZSIsICJyZWdleCIsICJmaW5hbFZhbHVlIiwgImZzIiwgImltcG9ydF9pbmZyYSIsICJpbXBvcnRfYmluIiwgIlB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSIsICJjd2QiLCAib3B0aW9ucyIsICJzdGFydFRpbWUiLCAic3RhZ2UiLCAiY29uZmlnIiwgImluZnJhU3RhY2tOYW1lIiwgInJ1bnRpbWVTdGFja05hbWUiLCAicnVudGltZVdlYlN0YWNrTmFtZSIsICJzIiwgImluZnJhUmVzdWx0IiwgInJ1bnRpbWVSZXN1bHQiLCAicnVudGltZVdlYlJlc3VsdCIsICJkdXJhdGlvbiIsICJzdGFja05hbWUiLCAib3V0cHV0c1BhdGgiLCAib3V0cHV0cyIsICJvdXRwdXRzRmlsZUNvbnRlbnQiLCAic3RhY2tPdXRwdXRzIiwgImtleSIsICJsYW1iZGFNYXRjaCIsICJlcnJvciIsICJyZWdpb24iLCAicGFydCIsICJuYW1lIiwgInNlcnZpY2VOYW1lIiwgInJlZ2lvblNpbXBsaWZpZWQiLCAiUnVudGltZURlcGxveW1lbnRTdHJhdGVneSIsICJjb250ZXh0IiwgImVycm9yIiwgImNvbmZpZyIsICJkZXBsb3lDb25maWciLCAibG9nZ2VyIiwgIm9wdGlvbnMiLCAicmVzdWx0IiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mcyIsICJNQVhfVEVNUExBVEVfU0laRV9CWVRFUyIsICJMQU1CREFfQlVORExFX1NJWkVfTElNSVQiLCAiVEVNUExBVEVfU0laRV9XQVJOSU5HX1RIUkVTSE9MRCIsICJsb2FkVGVtcGxhdGUiLCAicHJvamVjdFJvb3QiLCAidGVtcGxhdGVQYXRoIiwgInBhdGgiLCAidXNlRmFsbGJhY2siLCAiZnMiLCAiZ2V0RGVmYXVsdFRlbXBsYXRlIiwgImNvbnRlbnQiLCAidmFsaWRhdGVUZW1wbGF0ZVNpemUiLCAidmFsaWRhdGVUZW1wbGF0ZSIsICJodG1sIiwgInNpemVCeXRlcyIsICJzaXplTUIiLCAibWF4U2l6ZU1CIiwgIndhcm5pbmdUaHJlc2hvbGRNQiIsICJtaXNzaW5nVGFncyIsICJ2YWxpZGF0ZUJ1bmRsZVNpemUiLCAiZW1iZWRkZWRGaWxlUGF0aCIsICJlbWJlZGRlZEZpbGVTaXplIiwgImVtYmVkZGVkRmlsZVNpemVNQiIsICJsYW1iZGFCdW5kbGVQYXRoIiwgImJ1bmRsZVNpemUiLCAiYnVuZGxlU2l6ZU1CIiwgImdlbmVyYXRlRW1iZWRkZWRUZW1wbGF0ZUZpbGUiLCAidGVtcGxhdGUiLCAiZmlsZUNvbnRlbnQiLCAib3V0cHV0UGF0aCIsICJvdXRwdXREaXIiLCAidGVtcGxhdGVTaXplS0IiLCAiYnVpbGRTdGF0aWNIdG1sIiwgInNob3VsZEV4aXQiLCAiZXJyb3IiLCAiUnVudGltZUNsaUVycm9yIiwgIm1lc3NhZ2UiLCAiY29kZSIsICJoaW50IiwgIlJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyIiwgImVycm9yIiwgInZlcmJvc2UiLCAibGluZXMiLCAiUnVudGltZUNsaUVycm9yIiwgImZpZWxkTmFtZSIsICJtZXNzYWdlIiwgInN0YWNrTmFtZSIsICJvcGVyYXRpb24iLCAiUHVyZW5vd1J1bnRpbWVDbGkiLCAiX1B1cmVub3dSdW50aW1lQ2xpIiwgImdsb2JhbE9wdHMiLCAiY3dkIiwgInByb2Nlc3MiLCAicHVyZW5vd0NvbnRleHQiLCAic3RhY2tzRGVwbG95U2VydmljZSIsICJQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UiLCAiYXJncyIsICJlcnJvciIsICJmb3JtYXR0ZXIiLCAiUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIiLCAiZm9ybWF0dGVkRXJyb3IiLCAiY3JlYXRlUnVudGltZUNsaSJdCn0K