mage-engine 3.21.1 → 3.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nvmrc +1 -0
- package/.prettierrc.js +20 -0
- package/dist/mage.js +187 -148
- package/package.json +1 -1
package/.nvmrc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
14.19.3
|
package/.prettierrc.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
printWidth: 100,
|
|
5
|
+
trailingComma: "all",
|
|
6
|
+
arrowParens: "avoid",
|
|
7
|
+
semi: true,
|
|
8
|
+
tabWidth: 4,
|
|
9
|
+
|
|
10
|
+
overrides: [
|
|
11
|
+
{
|
|
12
|
+
files: ["*.md"],
|
|
13
|
+
options: { printWidth: 120 },
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
files: [".toolsharerc"],
|
|
17
|
+
options: { parser: "yaml" },
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
};
|
package/dist/mage.js
CHANGED
|
@@ -371,28 +371,7 @@ function _createForOfIteratorHelper(o, allowArrayLike) {
|
|
|
371
371
|
}
|
|
372
372
|
}
|
|
373
373
|
};
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
function getAugmentedNamespace(n) {
|
|
377
|
-
if (n.__esModule) return n;
|
|
378
|
-
var a = Object.defineProperty({}, '__esModule', {value: true});
|
|
379
|
-
Object.keys(n).forEach(function (k) {
|
|
380
|
-
var d = Object.getOwnPropertyDescriptor(n, k);
|
|
381
|
-
Object.defineProperty(a, k, d.get ? d : {
|
|
382
|
-
enumerable: true,
|
|
383
|
-
get: function () {
|
|
384
|
-
return n[k];
|
|
385
|
-
}
|
|
386
|
-
});
|
|
387
|
-
});
|
|
388
|
-
return a;
|
|
389
|
-
}var between$1 = {exports: {}};/* Between.js v0.1.2-fix.2 */
|
|
390
|
-
|
|
391
|
-
(function (module, exports) {
|
|
392
|
-
!function(t,n){module.exports=n();}(commonjsGlobal,function(){function O(t){return (O="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function r(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r);}}function n(t,n,e){return n&&r(t.prototype,n),e&&r(t,e),t}function M(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function I(t){return (I=Object.getPrototypeOf||function(t){return t.__proto__})(t)}function o(t,n){return (o=Object.setPrototypeOf||function(t,n){return t.__proto__=n,t})(t,n)}function u(t,n,e){return (u="undefined"!=typeof Reflect&&Reflect.construct?Reflect.construct:function(t,n,e){var r=[null];r.push.apply(r,n);var u=new(t.bind.apply(t,r));return e&&o(u,e.prototype),u}).apply(null,arguments)}function _(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var t=function(o){var a={},i=[];(o=o||this).on=function(t,n,e){return (a[t]=a[t]||[]).push([n,e]),o},o.off=function(t,n){t||(a={});for(var e=a[t]||i,r=e.length=n?e.length:0;r--;)n==e[r][0]&&e.splice(r,1);return o},o.emit=function(t){for(var n,e=a[t]||i,r=0<e.length?e.slice(0,e.length):e,u=0;n=r[u++];)n[0].apply(n[1],i.slice.call(arguments,1));return o};};var V=function(t,n,e){return t*(1-e)+n*e},e="undefined"!=typeof window?window:"undefined"!=typeof commonjsGlobal?commonjsGlobal:"undefined"!=typeof self?self:{};function a(t,n){return t(n={exports:{}},n.exports),n.exports}for(var i=a(function(t){var n=t.exports={Linear:{None:function(t){return t}},Quadratic:{In:function(t){return t*t},Out:function(t){return t*(2-t)},InOut:function(t){return (t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)}},Cubic:{In:function(t){return t*t*t},Out:function(t){return --t*t*t+1},InOut:function(t){return (t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)}},Quartic:{In:function(t){return t*t*t*t},Out:function(t){return 1- --t*t*t*t},InOut:function(t){return (t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)}},Quintic:{In:function(t){return t*t*t*t*t},Out:function(t){return --t*t*t*t*t+1},InOut:function(t){return (t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)}},Sinusoidal:{In:function(t){return 1-Math.cos(t*Math.PI/2)},Out:function(t){return Math.sin(t*Math.PI/2)},InOut:function(t){return .5*(1-Math.cos(Math.PI*t))}},Exponential:{In:function(t){return 0===t?0:Math.pow(1024,t-1)},Out:function(t){return 1===t?1:1-Math.pow(2,-10*t)},InOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))}},Circular:{In:function(t){return 1-Math.sqrt(1-t*t)},Out:function(t){return Math.sqrt(1- --t*t)},InOut:function(t){return (t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)}},Elastic:{In:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),-e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4))},Out:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),e*Math.pow(2,-10*t)*Math.sin((t-n)*(2*Math.PI)/.4)+1)},InOut:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),(t*=2)<1?e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4)*-.5:e*Math.pow(2,-10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4)*.5+1)}},Back:{In:function(t){return t*t*(2.70158*t-1.70158)},Out:function(t){return --t*t*(2.70158*t+1.70158)+1},InOut:function(t){var n=2.5949095;return (t*=2)<1?t*t*((n+1)*t-n)*.5:.5*((t-=2)*t*((n+1)*t+n)+2)}},Bounce:{In:function(t){return 1-n.Bounce.Out(1-t)},Out:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},InOut:function(t){return t<.5?.5*n.Bounce.In(2*t):.5*n.Bounce.Out(2*t-1)+.5}}};}),c=(i.Linear,i.Quadratic,i.Cubic,i.Quartic,i.Quintic,i.Sinusoidal,i.Exponential,i.Circular,i.Elastic,i.Back,i.Bounce,a(function(a){(function(){var t,n,e,r,u,o;"undefined"!=typeof performance&&null!==performance&&performance.now?a.exports=function(){return performance.now()}:"undefined"!=typeof process&&null!==process&&process.hrtime?(a.exports=function(){return (t()-u)/1e6},n=process.hrtime,r=(t=function(){var t;return 1e9*(t=n())[0]+t[1]})(),o=1e9*process.uptime(),u=r-o):Date.now?(a.exports=function(){return Date.now()-e},e=Date.now()):(a.exports=function(){return (new Date).getTime()-e},e=(new Date).getTime());}).call(e);})),l="undefined"==typeof window?e:window,f=["moz","webkit"],s="AnimationFrame",p=l["request"+s],h=l["cancel"+s]||l["cancelRequest"+s],m=0;!p&&m<f.length;m++)p=l[f[m]+"Request"+s],h=l[f[m]+"Cancel"+s]||l[f[m]+"CancelRequest"+s];if(!p||!h){var d=0,y=0,v=[];p=function(t){if(0===v.length){var n=c(),e=Math.max(0,1e3/60-(n-d));d=e+n,setTimeout(function(){for(var t=v.slice(0),n=v.length=0;n<t.length;n++)if(!t[n].cancelled)try{t[n].callback(d);}catch(t){setTimeout(function(){throw t},0);}},Math.round(e));}return v.push({handle:++y,callback:t,cancelled:!1}),y},h=function(t){for(var n=0;n<v.length;n++)v[n].handle===t&&(v[n].cancelled=!0);};}var b=function(t){return p.call(l,t)};b.cancel=function(){h.apply(l,arguments);},b.polyfill=function(t){t||(t=l),t.requestAnimationFrame=p,t.cancelAnimationFrame=h;};var w,k,P=[],T=Symbol("type"),j=Symbol("start_time"),x=Symbol("completed"),D=Symbol("paused"),g=requestAnimationFrame||b,A=Date.now();!function t(){g(t),w=Date.now(),k=w-A;for(var n=0;n<P.length;n++)P[n][x]||P[n](k,Date.now()-P[n][j]);A=w;}();var E=function(t){function g(e,t){var n,r,u,o;!function(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}(this,g),u=this,o=I(g).call(this),M(_(_(r=!o||"object"!=typeof o&&"function"!=typeof o?_(u):o)),"update",function(){var e=_(_(r))._updateValue;return function(t,n){r[x]||r[D]||(0===r.localTime&&r.emit("start",r.value,_(_(r))),e(r.ease(r.loopFunction.progress(Math.min(1,(n||r.localTime)/r.duration)))),r.emit("update",r.value,_(_(r)),t),r.localTime>=r.duration&&r.loopFunction.complete(function(){r[x]=!0,r.emit("complete",r.value,_(_(r)));}),r.localTime+=t);}});var a=r.plugin=Object.values(g._plugins).reduce(function(t,n){return t||n&&n.test&&n.test(e)&&n},!1),i=a&&a.name||("object"===O(e)?Array.isArray(e)?"array":"object":"number");if(a){var c=a.initialize(e,t);e=c.startValue,t=c.destValue,r.data=c.data;}switch(Object.assign(_(_(r)),(M(n={duration:1e3,localTime:0,startValue:e,destValue:t,loopMode:"once",loopFunction:g.DEFAULT_LOOP,ease:function(t){return t},value:"array"===i?[].concat(e):"object"===i?Object.assign({},e):e},x,!1),M(n,T,i),M(n,j,Date.now()),M(n,D,!1),n)),r[T]){case"number":r._updateValue=function(t){r.value=V(r.startValue,r.destValue,t);};break;case"array":var l=r.value.length,f=_(_(r)),s=f.startValue,p=f.destValue,h=f.value;r._updateValue=function(t){for(var n=0;n<l;n++)h[n]=V(s[n],p[n],t);};break;case"object":var m=Object.keys(r.startValue),d=m.length,y=_(_(r)),v=y.startValue,b=y.destValue,w=y.value;r._updateValue=function(t){for(var n=0;n<d;n++){var e=m[n];w[e]=V(v[e],b[e],t);}};break;default:r.plugin?r._updateValue=function(t){r.value=r.plugin.interpolate(r.startValue,r.destValue,t,r.data);}:(console.warn("Between: startValue type was unrecognized."),r._updateValue=function(){return null});}return P.push(r.update()),r}return n(g,null,[{key:"between",value:function(){for(var t=arguments.length,n=new Array(t),e=0;e<t;e++)n[e]=arguments[e];return u(g,n)}}]),n(g,[{key:"pause",value:function(){return this[D]=!0,this.emit("pause",this.value,this,k),this}},{key:"play",value:function(){return this[D]=!1,this.emit("play",this.value,this,k),this}},{key:"easing",value:function(t){return this.ease=t,this}},{key:"time",value:function(t){return this.duration=t,this}},{key:"loop",value:function(){for(var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"once",n="__loop_".concat(t),e=arguments.length,r=new Array(1<e?e-1:0),u=1;u<e;u++)r[u-1]=arguments[u];return this.loopFunction=n in this?Object.assign({},g.DEFAULT_LOOP,this[n].apply(this,r)):g.DEFAULT_LOOP,this}},{key:"__loop_repeat",value:function(t){var n=this,e=t;return this.times=0,{complete:function(t){n.localTime=0,Number.isInteger(e)&&++n.times===e?t():Number.isInteger(e)||++n.times;}}}},{key:"__loop_bounce",value:function(t){var n=this,e=t,r=1;return this.times=0,{complete:function(t){n.localTime=0,r=-r,Number.isInteger(e)&&++n.times===e?t():Number.isInteger(e)||++n.times;},progress:function(t){return 0<r?t:1-t}}}},{key:"isPaused",get:function(){return this[D]}}]),function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");o(t.prototype,n&&n.prototype),n&&o(t,n);}(g,t),g}(t);return M(E,"DEFAULT_LOOP",{complete:function(t){return t()},progress:function(t){return t}}),E.Easing=i,E._plugins={},E});
|
|
393
|
-
}(between$1));
|
|
394
|
-
|
|
395
|
-
var between = between$1.exports;/*! *****************************************************************************
|
|
374
|
+
}/*! *****************************************************************************
|
|
396
375
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
397
376
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
398
377
|
this file except in compliance with the License. You may obtain a copy of the
|
|
@@ -53990,6 +53969,11 @@ var LABEL_DOMELEMENT_MISSING = "".concat(PREFIX, " Could not create Label, domEl
|
|
|
53990
53969
|
value: function __check() {
|
|
53991
53970
|
return true;
|
|
53992
53971
|
}
|
|
53972
|
+
}, {
|
|
53973
|
+
key: "__isStatic",
|
|
53974
|
+
value: function __isStatic() {
|
|
53975
|
+
return false;
|
|
53976
|
+
}
|
|
53993
53977
|
}, {
|
|
53994
53978
|
key: "__hasStarted",
|
|
53995
53979
|
value: function __hasStarted() {
|
|
@@ -54017,6 +54001,7 @@ var LABEL_DOMELEMENT_MISSING = "".concat(PREFIX, " Could not create Label, domEl
|
|
|
54017
54001
|
|
|
54018
54002
|
this.__name = name || this.constructor.name;
|
|
54019
54003
|
this.hasStarted = false;
|
|
54004
|
+
this.isDisposed = false;
|
|
54020
54005
|
this.options = {};
|
|
54021
54006
|
}
|
|
54022
54007
|
|
|
@@ -55356,7 +55341,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
|
|
|
55356
55341
|
url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
|
|
55357
55342
|
return new Worker(url, options);
|
|
55358
55343
|
};
|
|
55359
|
-
}var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczplbGVtZW50OnJlc2V0JywKICAgICAgICBBUFBMWTogewogICAgICAgICAgSU1QVUxTRTogJ3BoeXNpY3M6ZWxlbWVudDphcHBseTppbXB1bHNlJwogICAgICAgIH0KICAgICAgfSwKICAgICAgVkVISUNMRTogewogICAgICAgIFNFVDogewogICAgICAgICAgUE9TSVRJT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnBvc2l0aW9uJywKICAgICAgICAgIFFVQVRFUk5JT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnF1YXRlcm5pb24nCiAgICAgICAgfSwKICAgICAgICBSRVNFVDogJ3BoeXNpY3M6dmVoaWNsZTpyZXNldCcsCiAgICAgICAgU1BFRUQ6ICdwaHlzaWNzOnZlaGljbGU6c3BlZWQnLAogICAgICAgIERJUkVDVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpkaXJlY3Rpb24nCiAgICAgIH0sCiAgICAgIEVGRkVDVFM6IHsKICAgICAgICBFWFBMT1NJT046ICdwaHlzaWNzOmVmZmVjdHM6ZXhwbG9zaW9uJwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgewogICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7CgogICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOwogICAgICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7CiAgICAgICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7CiAgICAgIH0KCiAgICAgIHJldHVybiBrZXlzOwogICAgfQoKICAgIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkgewogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OwogICAgICAgIGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7CiAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgfSk7CiAgICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7CiAgICAgIGlmIChrZXkgaW4gb2JqKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgICB9CgogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHZhciBEaXNwYXRjaGVyID0gZnVuY3Rpb24gRGlzcGF0Y2hlcigpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpc3BhdGNoZXIpOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUGh5c2ljc1VwZGF0ZSIsIGZ1bmN0aW9uIChkdCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuVVBEQVRFLAogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUmVhZHlFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlJFQURZCiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kVGVybWluYXRlRXZlbnQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEUKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRCb2R5VXBkYXRlIiwgZnVuY3Rpb24gKHV1aWQsIHBvc2l0aW9uLCByb3RhdGlvbiwgZHQsIGV4dHJhRGF0YSkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZShfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEUsCiAgICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgeDogcG9zaXRpb24ueCgpLAogICAgICAgICAgICB5OiBwb3NpdGlvbi55KCksCiAgICAgICAgICAgIHo6IHBvc2l0aW9uLnooKQogICAgICAgICAgfSwKICAgICAgICAgIHF1YXRlcm5pb246IHsKICAgICAgICAgICAgeDogcm90YXRpb24ueCgpLAogICAgICAgICAgICB5OiByb3RhdGlvbi55KCksCiAgICAgICAgICAgIHo6IHJvdGF0aW9uLnooKSwKICAgICAgICAgICAgdzogcm90YXRpb24udygpCiAgICAgICAgICB9CiAgICAgICAgfSwgZXh0cmFEYXRhKSwge30sIHsKICAgICAgICAgIGR0OiBkdAogICAgICAgIH0pKTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmREaXNwYXRjaEV2ZW50IiwgZnVuY3Rpb24gKHV1aWQsIGV2ZW50TmFtZSwgZXZlbnREYXRhKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5ESVNQQVRDSCwKICAgICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKICAgICAgICAgIGV2ZW50RGF0YTogZXZlbnREYXRhCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfTsKICAgIHZhciBkaXNwYXRjaGVyJDEgPSBuZXcgRGlzcGF0Y2hlcigpOwoKICAgIHZhciBhcHBseU1hdHJpeDRUb1ZlY3RvcjMgPSBmdW5jdGlvbiBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoX3JlZikgewogICAgICB2YXIgX3JlZiR4ID0gX3JlZi54LAogICAgICAgICAgeCA9IF9yZWYkeCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkeCwKICAgICAgICAgIF9yZWYkeSA9IF9yZWYueSwKICAgICAgICAgIHkgPSBfcmVmJHkgPT09IHZvaWQgMCA/IDAgOiBfcmVmJHksCiAgICAgICAgICBfcmVmJHogPSBfcmVmLnosCiAgICAgICAgICB6ID0gX3JlZiR6ID09PSB2b2lkIDAgPyAwIDogX3JlZiR6OwogICAgICB2YXIgbWF0cml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTsKICAgICAgdmFyIHcgPSAxIC8gKG1hdHJpeFszXSAqIHggKyBtYXRyaXhbN10gKiB5ICsgbWF0cml4WzExXSAqIHogKyBtYXRyaXhbMTVdKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB4OiAobWF0cml4WzBdICogeCArIG1hdHJpeFs0XSAqIHkgKyBtYXRyaXhbOF0gKiB6ICsgbWF0cml4WzEyXSkgKiB3LAogICAgICAgIHk6IChtYXRyaXhbMV0gKiB4ICsgbWF0cml4WzVdICogeSArIG1hdHJpeFs5XSAqIHogKyBtYXRyaXhbMTNdKSAqIHcsCiAgICAgICAgejogKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbNl0gKiB5ICsgbWF0cml4WzEwXSAqIHogKyBtYXRyaXhbMTRdKSAqIHcKICAgICAgfTsKICAgIH07CgogICAgdmFyIGNyZWF0ZVJpZ2lkQm9keSA9IGZ1bmN0aW9uIGNyZWF0ZVJpZ2lkQm9keShzaGFwZSwgb3B0aW9ucykgewogICAgICB2YXIgdXVpZCA9IG9wdGlvbnMudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBvcHRpb25zLnF1YXRlcm5pb24sCiAgICAgICAgICBtYXNzID0gb3B0aW9ucy5tYXNzLAogICAgICAgICAgZnJpY3Rpb24gPSBvcHRpb25zLmZyaWN0aW9uLAogICAgICAgICAgX29wdGlvbnMkcmVzdGl0dXRpb24gPSBvcHRpb25zLnJlc3RpdHV0aW9uLAogICAgICAgICAgcmVzdGl0dXRpb24gPSBfb3B0aW9ucyRyZXN0aXR1dGlvbiA9PT0gdm9pZCAwID8gLjkgOiBfb3B0aW9ucyRyZXN0aXR1dGlvbiwKICAgICAgICAgIF9vcHRpb25zJGRhbXBpbmcgPSBvcHRpb25zLmRhbXBpbmcsCiAgICAgICAgICBkYW1waW5nID0gX29wdGlvbnMkZGFtcGluZyA9PT0gdm9pZCAwID8gewogICAgICAgIGxpbmVhcjogMC4yLAogICAgICAgIGFuZ3VsYXI6IDAuMgogICAgICB9IDogX29wdGlvbnMkZGFtcGluZzsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7CiAgICAgIHZhciBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7CiAgICAgIHNoYXBlLmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgcmJJbmZvID0gbmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBzaGFwZSwgbG9jYWxJbmVydGlhKTsKICAgICAgdmFyIGJvZHkgPSBuZXcgQW1tby5idFJpZ2lkQm9keShyYkluZm8pOwoKICAgICAgaWYgKG1hc3MgPiAwKSB7CiAgICAgICAgYm9keS5zZXRGcmljdGlvbihmcmljdGlvbik7CiAgICAgICAgYm9keS5zZXRSZXN0aXR1dGlvbihyZXN0aXR1dGlvbik7CiAgICAgICAgYm9keS5zZXREYW1waW5nKGRhbXBpbmcubGluZWFyLCBkYW1waW5nLmFuZ3VsYXIpOwogICAgICAgIGJvZHkuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgfSAvLyBzdG9yaW5nIHV1aWQgZm9yIGZ1dHVyZSByZWZlcmVuY2UKCgogICAgICBib2R5LnV1aWQgPSB1dWlkOwogICAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgIHJldHVybiBib2R5OwogICAgfTsKICAgIHZhciBhZGRNb2RlbCA9IGZ1bmN0aW9uIGFkZE1vZGVsKG9wdGlvbnMpIHsKICAgICAgdmFyIHV1aWQgPSBvcHRpb25zLnV1aWQsCiAgICAgICAgICB2ZXJ0aWNlcyA9IG9wdGlvbnMudmVydGljZXMsCiAgICAgICAgICBtYXRyaWNlcyA9IG9wdGlvbnMubWF0cmljZXMsCiAgICAgICAgICBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzLAogICAgICAgICAgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IG9wdGlvbnMucXVhdGVybmlvbiwKICAgICAgICAgIF9vcHRpb25zJG1hc3MgPSBvcHRpb25zLm1hc3MsCiAgICAgICAgICBtYXNzID0gX29wdGlvbnMkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJG1hc3MsCiAgICAgICAgICBfb3B0aW9ucyRmcmljdGlvbiA9IG9wdGlvbnMuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9vcHRpb25zJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX29wdGlvbnMkZnJpY3Rpb247CiAgICAgIHZhciBzY2FsZSA9IERFRkFVTFRfU0NBTEU7CiAgICAgIHZhciBidGEgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIGJ0YiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgYnRjID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciB0cmlNZXNoID0gbmV3IEFtbW8uYnRUcmlhbmdsZU1lc2godHJ1ZSwgZmFsc2UpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjb21wb25lbnRzID0gdmVydGljZXNbaV07CiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tpXSA/IGluZGV4ZXNbaV0gOiBudWxsOwogICAgICAgIHZhciBtYXRyaXggPSBBcnJheS5mcm9tKG1hdHJpY2VzW2ldKTsKCiAgICAgICAgaWYgKGluZGV4KSB7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGluZGV4Lmxlbmd0aDsgaiArPSAzKSB7CiAgICAgICAgICAgIHZhciBhaSA9IGluZGV4W2pdICogMzsKICAgICAgICAgICAgdmFyIGJpID0gaW5kZXhbaiArIDFdICogMzsKICAgICAgICAgICAgdmFyIGNpID0gaW5kZXhbaiArIDJdICogMzsKICAgICAgICAgICAgdmFyIHZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2FpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2FpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1thaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIHZhciB2YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tiaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tiaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbYmkgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICB2YXIgdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbY2ldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbY2kgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2NpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgYnRhLnNldFZhbHVlKHZhLngsIHZhLnksIHZhLnopOwogICAgICAgICAgICBidGIuc2V0VmFsdWUodmIueCwgdmIueSwgdmIueik7CiAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZSh2Yy54LCB2Yy55LCB2Yy56KTsKICAgICAgICAgICAgdHJpTWVzaC5hZGRUcmlhbmdsZShidGEsIGJ0YiwgYnRjLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBjb21wb25lbnRzLmxlbmd0aDsgX2ogKz0gOSkgewogICAgICAgICAgICB2YXIgX3ZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgMF0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgdmFyIF92YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDNdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyA0XSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgNV0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIHZhciBfdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyA2XSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgN10sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDhdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICBidGEuc2V0VmFsdWUoX3ZhLngsIF92YS55LCBfdmEueik7CiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZShfdmIueCwgX3ZiLnksIF92Yi56KTsKICAgICAgICAgICAgYnRjLnNldFZhbHVlKF92Yy54LCBfdmMueSwgX3ZjLnopOwogICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBsb2NhbFNjYWxlID0gbmV3IEFtbW8uYnRWZWN0b3IzKHNjYWxlLngsIHNjYWxlLnksIHNjYWxlLnopOwogICAgICB0cmlNZXNoLnNldFNjYWxpbmcobG9jYWxTY2FsZSk7CiAgICAgIEFtbW8uZGVzdHJveShsb2NhbFNjYWxlKTsKICAgICAgdmFyIGNvbGxpc2lvblNoYXBlID0gbmV3IEFtbW8uYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSh0cmlNZXNoLCB0cnVlLCB0cnVlKTsKICAgICAgY29sbGlzaW9uU2hhcGUucmVzb3VyY2VzID0gW3RyaU1lc2hdOwogICAgICBBbW1vLmRlc3Ryb3koYnRhKTsKICAgICAgQW1tby5kZXN0cm95KGJ0Yik7CiAgICAgIEFtbW8uZGVzdHJveShidGMpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjb2xsaXNpb25TaGFwZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5NRVNILAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgYWRkQm94ID0gZnVuY3Rpb24gYWRkQm94KGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aWR0aCA9IGRhdGEud2lkdGgsCiAgICAgICAgICBsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGhlaWdodCA9IGRhdGEuaGVpZ2h0LAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9kYXRhJG1hc3MsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX2RhdGEkZnJpY3Rpb247CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogMC41LCBoZWlnaHQgKiAwLjUsIGxlbmd0aCAqIDAuNSkpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5CT1gsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBhZGRTcGhlcmUgPSBmdW5jdGlvbiBhZGRTcGhlcmUoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHJhZGl1cyA9IGRhdGEucmFkaXVzLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MyID0gZGF0YS5tYXNzLAogICAgICAgICAgbWFzcyA9IF9kYXRhJG1hc3MyID09PSB2b2lkIDAgPyAwIDogX2RhdGEkbWFzczIsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbjIgPSBkYXRhLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfZGF0YSRmcmljdGlvbjIgPT09IHZvaWQgMCA/IDIgOiBfZGF0YSRmcmljdGlvbjI7CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoZ2VvbWV0cnksIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuU1BIRVJFLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgc2V0TGluZWFyVmVsb2NpdHkgPSBmdW5jdGlvbiBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgX2RhdGEkdmVsb2NpdHkgPSBkYXRhLnZlbG9jaXR5LAogICAgICAgICAgdmVsb2NpdHkgPSBfZGF0YSR2ZWxvY2l0eSA9PT0gdm9pZCAwID8gREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgOiBfZGF0YSR2ZWxvY2l0eTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQuYm9keTsKCiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKCiAgICAgIGlmIChtb3Rpb25TdGF0ZSkgewogICAgICAgIHZhciBsaW5lYXJWZWxvY2l0eSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTsKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBBbW1vLmRlc3Ryb3kobGluZWFyVmVsb2NpdHkpOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFBvc2l0aW9uID0gZnVuY3Rpb24gc2V0UG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDIgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50Mi5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIHJlc2V0RWxlbWVudCA9IGZ1bmN0aW9uIHJlc2V0RWxlbWVudChkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDMgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50My5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIGFwcGx5SW1wdXNlID0gZnVuY3Rpb24gYXBwbHlJbXB1c2UoX3JlZikgewogICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkaW1wdWxzZSA9IF9yZWYuaW1wdWxzZSwKICAgICAgICAgIGltcHVsc2UgPSBfcmVmJGltcHVsc2UgPT09IHZvaWQgMCA/IERFRkFVTFRfSU1QVUxTRSA6IF9yZWYkaW1wdWxzZTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50NC5ib2R5OwoKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIGltcHVsc2VWZWN0b3IgPSBuZXcgQW1tby5idFZlY3RvcjMoaW1wdWxzZS54LCBpbXB1bHNlLnksIGltcHVsc2Uueik7CiAgICAgICAgYm9keS5hcHBseUNlbnRyYWxJbXB1bHNlKGltcHVsc2VWZWN0b3IpOwogICAgICAgIEFtbW8uZGVzdHJveShpbXB1bHNlVmVjdG9yKTsKICAgICAgfQogICAgfTsKICAgIHZhciBoYW5kbGVFbGVtZW50VXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlRWxlbWVudFVwZGF0ZShfcmVmMiwgZHQpIHsKICAgICAgdmFyIGJvZHkgPSBfcmVmMi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYyLnV1aWQ7CiAgICAgICAgICBfcmVmMi5zdGF0ZTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgb3JpZ2luID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgIHZhciByb3RhdGlvbiA9IHRyYW5zZm9ybS5nZXRSb3RhdGlvbigpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGFkZFBsYXllciA9IGZ1bmN0aW9uIGFkZFBsYXllcihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbjsKICAgICAgdmFyIGNhcHN1bGUgPSBuZXcgQW1tby5idENhcHN1bGVTaGFwZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY2Fwc3VsZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7IC8vIGRpc2FibGlpbmcgcm90YXRpb24gZm9yIGNvbGxpc2lvbnMKCiAgICAgIGJvZHkuc2V0QW5ndWxhckZhY3RvcigwKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuUExBWUVSLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgaGFuZGxlUGxheWVyVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlUGxheWVyVXBkYXRlKF9yZWYsIGR0KSB7CiAgICAgIHZhciBib2R5ID0gX3JlZi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSA6IF9yZWYkc3RhdGU7CiAgICAgIHZhciBtb3ZlbWVudCA9IHN0YXRlLm1vdmVtZW50OwogICAgICAgICAgc3RhdGUuZGlyZWN0aW9uOwogICAgICAgICAgdmFyIGNhbWVyYURpcmVjdGlvbiA9IHN0YXRlLmNhbWVyYURpcmVjdGlvbjsKICAgICAgICAgIHN0YXRlLnF1YXRlcm5pb247CiAgICAgICAgICBzdGF0ZS5wb3NpdGlvbjsKICAgICAgdmFyIE1BWF9TUEVFRCA9IDE7CiAgICAgIHZhciB3YWxrVmVsb2NpdHkgPSAuMTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgbGluZWFyVmVsb2NpdHkgPSBib2R5LmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgdmFyIHNwZWVkID0gbGluZWFyVmVsb2NpdHkubGVuZ3RoKCk7CiAgICAgICAgdmFyIGZvcndhcmREaXIgPSB0cmFuc2Zvcm0uZ2V0QmFzaXMoKS5nZXRSb3coMik7CiAgICAgICAgZm9yd2FyZERpci5ub3JtYWxpemUoKTsKICAgICAgICB2YXIgd2Fsa0RpcmVjdGlvbiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLjAsIDAuMCwgMC4wKTsKICAgICAgICB2YXIgd2Fsa1NwZWVkID0gd2Fsa1ZlbG9jaXR5ICogZHQ7CgogICAgICAgIGlmIChtb3ZlbWVudC5mb3J3YXJkKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgKyBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSArIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgKyBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgLSBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSAtIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgLSBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW1vdmVtZW50LmZvcndhcmQgJiYgIW1vdmVtZW50LmJhY2t3YXJkcykgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKiAwLjIpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKiAwLjIpOwogICAgICAgIH0gZWxzZSBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHsKICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFgobGluZWFyVmVsb2NpdHkueCgpICsgY2FtZXJhRGlyZWN0aW9uLnggKiB3YWxrU3BlZWQpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKyBjYW1lcmFEaXJlY3Rpb24ueiAqIHdhbGtTcGVlZCk7CiAgICAgICAgfQoKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBib2R5LmdldE1vdGlvblN0YXRlKCkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBib2R5LnNldENlbnRlck9mTWFzc1RyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgICAgdmFyIHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIENsb2NrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gQ2xvY2soKSB7CiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsb2NrKTsKCiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBudWxsOwogICAgICB9CgogICAgICBfY3JlYXRlQ2xhc3MoQ2xvY2ssIFt7CiAgICAgICAga2V5OiAiZ2V0RGVsdGEiLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWx0YSgpIHsKICAgICAgICAgIHZhciB0aW1lID0gRGF0ZS5ub3coKTsKCiAgICAgICAgICBpZiAodGhpcy50aW1lc3RhbXApIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHRoaXMudGltZXN0YW1wOwogICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWU7CiAgICAgICAgICAgIHJldHVybiBkZWx0YTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gQ2xvY2s7CiAgICB9KCk7CgogICAgdmFyIFdvcmxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gV29ybGQoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdvcmxkKTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpbml0IiwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBfb3B0aW9ucyRncmF2aXR5ID0gb3B0aW9ucy5ncmF2aXR5LAogICAgICAgICAgICAgIGdyYXZpdHkgPSBfb3B0aW9ucyRncmF2aXR5ID09PSB2b2lkIDAgPyBHUkFWSVRZIDogX29wdGlvbnMkZ3Jhdml0eTsKICAgICAgICAgIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSBuZXcgQW1tby5idERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uKCk7CiAgICAgICAgICBfdGhpcy5kaXNwYXRjaGVyID0gbmV3IEFtbW8uYnRDb2xsaXNpb25EaXNwYXRjaGVyKF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgX3RoaXMuYnJvYWRwaGFzZSA9IG5ldyBBbW1vLmJ0RGJ2dEJyb2FkcGhhc2UoKTsKICAgICAgICAgIF90aGlzLnNvbHZlciA9IG5ldyBBbW1vLmJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyKCk7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkID0gbmV3IEFtbW8uYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQoX3RoaXMuZGlzcGF0Y2hlciwgX3RoaXMuYnJvYWRwaGFzZSwgX3RoaXMuc29sdmVyLCBfdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTsKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnNldEdyYXZpdHkobmV3IEFtbW8uYnRWZWN0b3IzKGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnopKTsgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGdob3N0T2JqZWN0IGNvbGxpc2lvbnMKCgogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5nZXRCcm9hZHBoYXNlKCkuZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUoKS5zZXRJbnRlcm5hbEdob3N0UGFpckNhbGxiYWNrKG5ldyBBbW1vLmJ0R2hvc3RQYWlyQ2FsbGJhY2soKSk7CgogICAgICAgICAgX3RoaXMuaW5pdGlhbGlzZWQgPSB0cnVlOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInJlbW92ZUVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5maWx0ZXIoZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdLmRlbGV0ZWQ7CiAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImhhc0VsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5pbmNsdWRlcyh1dWlkKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJnZXRFbGVtZW50IiwgZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpc0luaXRpYWxpc2VkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmluaXRpYWxpc2VkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldER5bmFtaWNzV29ybGQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuZHluYW1pY3NXb3JsZDsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRSaWdpZEJvZHkiLCBmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiYWRkQWN0aW9uIiwgZnVuY3Rpb24gKGFjdGlvbikgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRBY3Rpb24oYWN0aW9uKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRDb2xsaXNpb25PYmplY3QiLCBmdW5jdGlvbiAoY29sbGlzaW9uT2JqZWN0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZENvbGxpc2lvbk9iamVjdChjb2xsaXNpb25PYmplY3QpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInN0ZXBTaW11bGF0aW9uIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnN0ZXBTaW11bGF0aW9uKGR0KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzaW11bGF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBkdCA9IF90aGlzLmNsb2NrLmdldERlbHRhKCk7CgogICAgICAgICAgX3RoaXMuc3RlcFNpbXVsYXRpb24oZHQpOwoKICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuQk9YOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5TUEhFUkU6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLk1FU0g6CiAgICAgICAgICAgICAgICAgIGhhbmRsZUVsZW1lbnRVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlBMQVlFUjoKICAgICAgICAgICAgICAgICAgaGFuZGxlUGxheWVyVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5WRUhJQ0xFOgogICAgICAgICAgICAgICAgICBoYW5kbGVWZWhpY2xlVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBfdGhpcy5jYWxjdWxhdGVDb2xsaXNpb25zKCk7CgogICAgICAgICAgX3RoaXMucmVtb3ZlRGVsZXRlZEVsZW1lbnRzKCk7CgogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRQaHlzaWNzVXBkYXRlKGR0KTsKICAgICAgICAgIF90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnNpbXVsYXRlLmJpbmQoX3RoaXMpKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJjYWxjdWxhdGVDb2xsaXNpb25zIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGFtbW9EaXNwYXRjaGVyID0gX3RoaXMuZHluYW1pY3NXb3JsZC5nZXREaXNwYXRjaGVyKCk7CgogICAgICAgICAgdmFyIG51bU1hbmlmb2xkcyA9IGFtbW9EaXNwYXRjaGVyLmdldE51bU1hbmlmb2xkcygpOwoKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTWFuaWZvbGRzOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNvbnRhY3RNYW5pZm9sZCA9IGFtbW9EaXNwYXRjaGVyLmdldE1hbmlmb2xkQnlJbmRleEludGVybmFsKGkpOwogICAgICAgICAgICB2YXIgcmIwID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MCgpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICAgICAgdmFyIHJiMSA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTEoKSwgQW1tby5idFJpZ2lkQm9keSk7CiAgICAgICAgICAgIHZhciBudW1Db250YWN0cyA9IGNvbnRhY3RNYW5pZm9sZC5nZXROdW1Db250YWN0cygpOyAvLyB0aGlzIGl0ZXJhdGlvbiBkb2Vzbid0IGhhdmUgdXVpZHMKCiAgICAgICAgICAgIGlmICghcmIwLnV1aWQgfHwgIXJiMS51dWlkKSBjb250aW51ZTsKICAgICAgICAgICAgdmFyIGNvbnRhY3RzID0gW107CgogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bUNvbnRhY3RzOyBqKyspIHsKICAgICAgICAgICAgICB2YXIgY29udGFjdFBvaW50ID0gY29udGFjdE1hbmlmb2xkLmdldENvbnRhY3RQb2ludChqKTsKICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBjb250YWN0UG9pbnQuZ2V0RGlzdGFuY2UoKTsKICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiAwLjApIGNvbnRpbnVlOwogICAgICAgICAgICAgIHZhciB2ZWxvY2l0eTAgPSByYjAuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICAgICAgICB2YXIgdmVsb2NpdHkxID0gcmIxLmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25BKCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25CKCk7CiAgICAgICAgICAgICAgdmFyIGxvY2FsUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QSgpOwogICAgICAgICAgICAgIHZhciBsb2NhbFBvczEgPSBjb250YWN0UG9pbnQuZ2V0X21fbG9jYWxQb2ludEIoKTsKICAgICAgICAgICAgICBjb250YWN0cy5wdXNoKHsKICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZSwKICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbewogICAgICAgICAgICAgICAgICB1dWlkOiByYjAudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MC55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkwLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczAueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMC56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICB1dWlkOiByYjEudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MS55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkxLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczEueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMS56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMC51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMS51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRFbGVtZW50IiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgIF90aGlzLmVsZW1lbnRzW2RhdGEudXVpZF0gPSBkYXRhOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInVwZGF0ZUJvZHlTdGF0ZSIsIGZ1bmN0aW9uIChfcmVmKSB7CiAgICAgICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgICAgICBzdGF0ZSA9IF9yZWYuc3RhdGU7CgogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUpLCBzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAidGVybWluYXRlIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmR5bmFtaWNzV29ybGQpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLnNvbHZlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuZGlzcGF0Y2hlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7CiAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShfdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7CiAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFRlcm1pbmF0ZUV2ZW50KCk7CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMuZWxlbWVudHMgPSB7fTsKICAgICAgICB0aGlzLmluaXRpYWxpc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmJyb2FkcGhhc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5zb2x2ZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSBudWxsOwogICAgICAgIHRoaXMuY2xvY2sgPSBuZXcgQ2xvY2soKTsKICAgICAgfQoKICAgICAgX2NyZWF0ZUNsYXNzKFdvcmxkLCBbewogICAgICAgIGtleTogImRpc3Bvc2VCb2R5IiwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZUJvZHkoX3JlZjIpIHsKICAgICAgICAgIHZhciB1dWlkID0gX3JlZjIudXVpZDsKICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHV1aWQpOwogICAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnJlbW92ZVJpZ2lkQm9keShlbGVtZW50LmJvZHkpOwogICAgICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHV1aWQpOwogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRFbGVtZW50RGlzcG9zZWQoewogICAgICAgICAgICB1dWlkOiB1dWlkCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH1dKTsKCiAgICAgIHJldHVybiBXb3JsZDsKICAgIH0oKTsKICAgIHZhciB3b3JsZCA9IG5ldyBXb3JsZCgpOwoKICAgIHZhciBERUZBVUxUX1JPTExfSU5GTFVFTkNFID0gMC4yOwogICAgdmFyIERFRkFVTFRfRlJJQ1RJT04gPSAxMDAwOwogICAgdmFyIERFRkFVTFRfTUFTUyA9IDgwMDsKICAgIHZhciBhZGRWZWhpY2xlID0gZnVuY3Rpb24gYWRkVmVoaWNsZShkYXRhKSB7CiAgICAgIHZhciBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdoZWVscyA9IGRhdGEud2hlZWxzLAogICAgICAgICAgX2RhdGEkbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzID09PSB2b2lkIDAgPyBERUZBVUxUX01BU1MgOiBfZGF0YSRtYXNzLAogICAgICAgICAgX2RhdGEkd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgd2lkdGggPSBfZGF0YSR3aWR0aCA9PT0gdm9pZCAwID8gMS44IDogX2RhdGEkd2lkdGgsCiAgICAgICAgICBfZGF0YSRoZWlnaHQgPSBkYXRhLmhlaWdodCwKICAgICAgICAgIGhlaWdodCA9IF9kYXRhJGhlaWdodCA9PT0gdm9pZCAwID8gLjYgOiBfZGF0YSRoZWlnaHQsCiAgICAgICAgICBfZGF0YSRsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGxlbmd0aCA9IF9kYXRhJGxlbmd0aCA9PT0gdm9pZCAwID8gNCA6IF9kYXRhJGxlbmd0aCwKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24gPT09IHZvaWQgMCA/IERFRkFVTFRfRlJJQ1RJT04gOiBfZGF0YSRmcmljdGlvbiwKICAgICAgICAgIF9kYXRhJHJvbGxJbmZsdWVuY2UgPSBkYXRhLnJvbGxJbmZsdWVuY2UsCiAgICAgICAgICByb2xsSW5mbHVlbmNlID0gX2RhdGEkcm9sbEluZmx1ZW5jZSA9PT0gdm9pZCAwID8gREVGQVVMVF9ST0xMX0lORkxVRU5DRSA6IF9kYXRhJHJvbGxJbmZsdWVuY2UsCiAgICAgICAgICBfZGF0YSR3aGVlbHNPcHRpb25zID0gZGF0YS53aGVlbHNPcHRpb25zLAogICAgICAgICAgd2hlZWxzT3B0aW9ucyA9IF9kYXRhJHdoZWVsc09wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkd2hlZWxzT3B0aW9ucywKICAgICAgICAgIF9kYXRhJHN1c3BlbnNpb25zID0gZGF0YS5zdXNwZW5zaW9ucywKICAgICAgICAgIHN1c3BlbnNpb25zID0gX2RhdGEkc3VzcGVuc2lvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkc3VzcGVuc2lvbnM7CiAgICAgIHZhciBfd2hlZWxzT3B0aW9ucyRiYWNrID0gd2hlZWxzT3B0aW9ucy5iYWNrLAogICAgICAgICAgYmFjayA9IF93aGVlbHNPcHRpb25zJGJhY2sgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkYmFjaywKICAgICAgICAgIF93aGVlbHNPcHRpb25zJGZyb250ID0gd2hlZWxzT3B0aW9ucy5mcm9udCwKICAgICAgICAgIGZyb250ID0gX3doZWVsc09wdGlvbnMkZnJvbnQgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkZnJvbnQ7CiAgICAgIHZhciBfYmFjayRheGlzUG9zaXRpb24gPSBiYWNrLmF4aXNQb3NpdGlvbiwKICAgICAgICAgIGF4aXNQb3NpdGlvbkJhY2sgPSBfYmFjayRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IC0xIDogX2JhY2skYXhpc1Bvc2l0aW9uLAogICAgICAgICAgX2JhY2skcmFkaXVzID0gYmFjay5yYWRpdXMsCiAgICAgICAgICB3aGVlbFJhZGl1c0JhY2sgPSBfYmFjayRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2JhY2skcmFkaXVzLAogICAgICAgICAgX2JhY2skaGFsZlRyYWNrID0gYmFjay5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0JhY2sgPSBfYmFjayRoYWxmVHJhY2sgPT09IHZvaWQgMCA/IDEgOiBfYmFjayRoYWxmVHJhY2ssCiAgICAgICAgICBfYmFjayRheGlzSGVpZ2h0ID0gYmFjay5heGlzSGVpZ2h0LAogICAgICAgICAgd2hlZWxBeGlzSGVpZ2h0QmFjayA9IF9iYWNrJGF4aXNIZWlnaHQgPT09IHZvaWQgMCA/IC4zIDogX2JhY2skYXhpc0hlaWdodDsKICAgICAgdmFyIF9mcm9udCRheGlzUG9zaXRpb24gPSBmcm9udC5heGlzUG9zaXRpb24sCiAgICAgICAgICBheGlzUG9zaXRpb25Gcm9udCA9IF9mcm9udCRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IDEuNyA6IF9mcm9udCRheGlzUG9zaXRpb24sCiAgICAgICAgICBfZnJvbnQkcmFkaXVzID0gZnJvbnQucmFkaXVzLAogICAgICAgICAgd2hlZWxSYWRpdXNGcm9udCA9IF9mcm9udCRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2Zyb250JHJhZGl1cywKICAgICAgICAgIF9mcm9udCRoYWxmVHJhY2sgPSBmcm9udC5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0Zyb250ID0gX2Zyb250JGhhbGZUcmFjayA9PT0gdm9pZCAwID8gMSA6IF9mcm9udCRoYWxmVHJhY2ssCiAgICAgICAgICBfZnJvbnQkYXhpc0hlaWdodCA9IGZyb250LmF4aXNIZWlnaHQsCiAgICAgICAgICB3aGVlbEF4aXNIZWlnaHRGcm9udCA9IF9mcm9udCRheGlzSGVpZ2h0ID09PSB2b2lkIDAgPyAuMyA6IF9mcm9udCRheGlzSGVpZ2h0OwogICAgICB2YXIgX3N1c3BlbnNpb25zJHN0aWZmbmVzID0gc3VzcGVuc2lvbnMuc3RpZmZuZXNzLAogICAgICAgICAgc3RpZmZuZXNzID0gX3N1c3BlbnNpb25zJHN0aWZmbmVzID09PSB2b2lkIDAgPyAyMC4wIDogX3N1c3BlbnNpb25zJHN0aWZmbmVzLAogICAgICAgICAgX3N1c3BlbnNpb25zJGRhbXBpbmcgPSBzdXNwZW5zaW9ucy5kYW1waW5nLAogICAgICAgICAgZGFtcGluZyA9IF9zdXNwZW5zaW9ucyRkYW1waW5nID09PSB2b2lkIDAgPyAyLjMgOiBfc3VzcGVuc2lvbnMkZGFtcGluZywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRjb21wcmVzcyA9IHN1c3BlbnNpb25zLmNvbXByZXNzaW9uLAogICAgICAgICAgY29tcHJlc3Npb24gPSBfc3VzcGVuc2lvbnMkY29tcHJlc3MgPT09IHZvaWQgMCA/IDQuNCA6IF9zdXNwZW5zaW9ucyRjb21wcmVzcywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRyZXN0TGVuZyA9IHN1c3BlbnNpb25zLnJlc3RMZW5ndGgsCiAgICAgICAgICByZXN0TGVuZ3RoID0gX3N1c3BlbnNpb25zJHJlc3RMZW5nID09PSB2b2lkIDAgPyAwLjYgOiBfc3VzcGVuc2lvbnMkcmVzdExlbmc7IC8vIENoYXNzaXMKCiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogLjUsIGhlaWdodCAqIC41LCBsZW5ndGggKiAuNSkpOwogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTsKICAgICAgdmFyIGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTsKICAgICAgZ2VvbWV0cnkuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciBjaGFzc2lzID0gbmV3IEFtbW8uYnRSaWdpZEJvZHkobmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBnZW9tZXRyeSwgbG9jYWxJbmVydGlhKSk7CiAgICAgIGNoYXNzaXMuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGNoYXNzaXMpOyAvLyBSYXljYXN0IFZlaGljbGUKCiAgICAgIHZhciB0dW5pbmcgPSBuZXcgQW1tby5idFZlaGljbGVUdW5pbmcoKTsKICAgICAgdmFyIHJheUNhc3RlciA9IG5ldyBBbW1vLmJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIod29ybGQuZ2V0RHluYW1pY3NXb3JsZCgpKTsKICAgICAgdmFyIHZlaGljbGUgPSBuZXcgQW1tby5idFJheWNhc3RWZWhpY2xlKHR1bmluZywgY2hhc3NpcywgcmF5Q2FzdGVyKTsKICAgICAgdmVoaWNsZS5zZXRDb29yZGluYXRlU3lzdGVtKDAsIDEsIDIpOwogICAgICB3b3JsZC5hZGRBY3Rpb24odmVoaWNsZSk7CiAgICAgIHZhciB3aGVlbERpcmVjdGlvbkNTMCA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAtMSwgMCk7CiAgICAgIHZhciB3aGVlbEF4bGVDUyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygtMSwgMCwgMCk7CgogICAgICB2YXIgYWRkV2hlZWwgPSBmdW5jdGlvbiBhZGRXaGVlbChpc0Zyb250LCBwb3MsIHJhZGl1cykgewogICAgICAgIHZhciB3aGVlbEluZm8gPSB2ZWhpY2xlLmFkZFdoZWVsKHBvcywgd2hlZWxEaXJlY3Rpb25DUzAsIHdoZWVsQXhsZUNTLCByZXN0TGVuZ3RoLCByYWRpdXMsIHR1bmluZywgaXNGcm9udCk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3Moc3RpZmZuZXNzKTsKICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ1JlbGF4YXRpb24oZGFtcGluZyk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdDb21wcmVzc2lvbihjb21wcmVzc2lvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX2ZyaWN0aW9uU2xpcChmcmljdGlvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3JvbGxJbmZsdWVuY2Uocm9sbEluZmx1ZW5jZSk7CiAgICAgIH07CgogICAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMygtd2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tCYWNrLCB3aGVlbEF4aXNIZWlnaHRCYWNrLCBheGlzUG9zaXRpb25CYWNrKSwgd2hlZWxSYWRpdXNCYWNrKTsKICAgICAgdmVoaWNsZS51dWlkID0gdXVpZDsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdHlwZTogVFlQRVMuVkVISUNMRSwKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHZlaGljbGU6IHZlaGljbGUsCiAgICAgICAgd2hlZWxzOiB3aGVlbHMsCiAgICAgICAgb3B0aW9uczogZGF0YSwKICAgICAgICBzdGF0ZTogREVGQVVMVF9WRUhJQ0xFX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBzZXRWZWhpY2xlUG9zaXRpb24gPSBmdW5jdGlvbiBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFZlaGljbGVRdWF0ZXJuaW9uID0gZnVuY3Rpb24gc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcmVzZXRWZWhpY2xlID0gZnVuY3Rpb24gcmVzZXRWZWhpY2xlKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CgogICAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7CiAgICAgICAgdmFyIGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciBoYW5kbGVWZWhpY2xlVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlVmVoaWNsZVVwZGF0ZShfcmVmLCBkdCkgewogICAgICB2YXIgdmVoaWNsZSA9IF9yZWYudmVoaWNsZSwKICAgICAgICAgIHdoZWVscyA9IF9yZWYud2hlZWxzLAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1ZFSElDTEVfU1RBVEUgOiBfcmVmJHN0YXRlLAogICAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLAogICAgICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJG9wdGlvbnM7CiAgICAgIHZhciBicmVha2luZ0ZvcmNlID0gMDsKICAgICAgdmFyIGVuZ2luZUZvcmNlID0gMDsKICAgICAgdmFyIF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSA9IG9wdGlvbnMuc3RlZXJpbmdDbGFtcCwKICAgICAgICAgIHN0ZWVyaW5nQ2xhbXAgPSBfb3B0aW9ucyRzdGVlcmluZ0NsYW0gPT09IHZvaWQgMCA/IERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAgOiBfb3B0aW9ucyRzdGVlcmluZ0NsYW0sCiAgICAgICAgICBfb3B0aW9ucyRzdGVlcmluZ0luY3IgPSBvcHRpb25zLnN0ZWVyaW5nSW5jcmVtZW50LAogICAgICAgICAgc3RlZXJpbmdJbmNyZW1lbnQgPSBfb3B0aW9ucyRzdGVlcmluZ0luY3IgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UIDogX29wdGlvbnMkc3RlZXJpbmdJbmNyLAogICAgICAgICAgX29wdGlvbnMkbWF4RW5naW5lRm9yID0gb3B0aW9ucy5tYXhFbmdpbmVGb3JjZSwKICAgICAgICAgIG1heEVuZ2luZUZvcmNlID0gX29wdGlvbnMkbWF4RW5naW5lRm9yID09PSB2b2lkIDAgPyBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UgOiBfb3B0aW9ucyRtYXhFbmdpbmVGb3IsCiAgICAgICAgICBfb3B0aW9ucyRtYXhCcmVha2luZ0YgPSBvcHRpb25zLm1heEJyZWFraW5nRm9yY2UsCiAgICAgICAgICBtYXhCcmVha2luZ0ZvcmNlID0gX29wdGlvbnMkbWF4QnJlYWtpbmdGID09PSB2b2lkIDAgPyBERUZBVUxUX01BWF9CUkVBS0lOR19GT1JDRSA6IF9vcHRpb25zJG1heEJyZWFraW5nRjsKCiAgICAgIGlmIChzdGF0ZS5hY2NlbGVyYXRpb24pIHsKICAgICAgICBpZiAoc3BlZWQgPCAtMSkgYnJlYWtpbmdGb3JjZSA9IG1heEJyZWFraW5nRm9yY2U7ZWxzZSBlbmdpbmVGb3JjZSA9IG1heEVuZ2luZUZvcmNlOwogICAgICB9CgogICAgICBpZiAoc3RhdGUuYnJha2luZykgewogICAgICAgIGlmIChzcGVlZCA+IDEpIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO2Vsc2UgZW5naW5lRm9yY2UgPSAtbWF4RW5naW5lRm9yY2UgLyAyOwogICAgICB9CgogICAgICBpZiAoc3RhdGUubGVmdCkgewogICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCBzdGVlcmluZ0NsYW1wKSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgKz0gc3RlZXJpbmdJbmNyZW1lbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHN0YXRlLnJpZ2h0KSB7CiAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gLXN0ZWVyaW5nQ2xhbXApIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA8IC1zdGVlcmluZ0luY3JlbWVudCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O2Vsc2UgewogICAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gc3RlZXJpbmdJbmNyZW1lbnQpIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDtlbHNlIHsKICAgICAgICAgICAgICBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB2ZWhpY2xlLmFwcGx5RW5naW5lRm9yY2UoZW5naW5lRm9yY2UsIEJBQ0tfTEVGVCk7CiAgICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSAvIDIsIEZST05UX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRTdGVlcmluZ1ZhbHVlKHN0YXRlLnZlaGljbGVTdGVlcmluZywgRlJPTlRfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0U3RlZXJpbmdWYWx1ZShzdGF0ZS52ZWhpY2xlU3RlZXJpbmcsIEZST05UX1JJR0hUKTsKICAgICAgdmFyIHRtLCBwLCBxLCBpOwogICAgICB2YXIgbiA9IHZlaGljbGUuZ2V0TnVtV2hlZWxzKCk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdmVoaWNsZS51cGRhdGVXaGVlbFRyYW5zZm9ybShpLCB0cnVlKTsKICAgICAgICB0bSA9IHZlaGljbGUuZ2V0V2hlZWxUcmFuc2Zvcm1XUyhpKTsKICAgICAgICBwID0gdG0uZ2V0T3JpZ2luKCk7CiAgICAgICAgcSA9IHRtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgdmFyIHdoZWVsVVVJRCA9IHdoZWVsc1tpXTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZEJvZHlVcGRhdGUod2hlZWxVVUlELCBwLCBxLCBkdCk7CiAgICAgIH0KCiAgICAgIHRtID0gdmVoaWNsZS5nZXRDaGFzc2lzV29ybGRUcmFuc2Zvcm0oKTsKICAgICAgcCA9IHRtLmdldE9yaWdpbigpOwogICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTsKICAgICAgdmFyIGRpcmVjdGlvbiA9IHZlaGljbGUuZ2V0Rm9yd2FyZFZlY3RvcigpOwogICAgICB2YXIgc3BlZWQgPSB2ZWhpY2xlLmdldEN1cnJlbnRTcGVlZEttSG91cigpOwogICAgICB2YXIgZXh0cmFEYXRhID0gewogICAgICAgIGRpcmVjdGlvbjogewogICAgICAgICAgeDogZGlyZWN0aW9uLngoKSwKICAgICAgICAgIHk6IGRpcmVjdGlvbi55KCksCiAgICAgICAgICB6OiBkaXJlY3Rpb24ueigpCiAgICAgICAgfSwKICAgICAgICBzcGVlZDogc3BlZWQKICAgICAgfTsKICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHV1aWQsIHAsIHEsIGR0LCBleHRyYURhdGEpOwogICAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUodXVpZCwgc3RhdGUpOwogICAgfTsKCiAgICB2YXIgY3JlYXRlR2hvc3RDb2xsaWRlciA9IGZ1bmN0aW9uIGNyZWF0ZUdob3N0Q29sbGlkZXIocmFkaXVzLCBwb3NpdGlvbikgewogICAgICB2YXIgZ2hvc3RDb2xsaWRlciA9IG5ldyBBbW1vLmJ0R2hvc3RPYmplY3QoKTsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGdob3N0Q29sbGlkZXIuc2V0Q29sbGlzaW9uU2hhcGUobmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpKTsKICAgICAgZ2hvc3RDb2xsaWRlci5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihwb3NpdGlvbik7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24oMCwgMCwgMCwgMSkpOwogICAgICBnaG9zdENvbGxpZGVyLnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZ2hvc3RDb2xsaWRlcjogZ2hvc3RDb2xsaWRlciwKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybQogICAgICB9OwogICAgfTsKICAgIHZhciBmb3JFYWNoR2hvc3RDb2xsaXNpb24gPSBmdW5jdGlvbiBmb3JFYWNoR2hvc3RDb2xsaXNpb24oZ2hvc3RDb2xsaWRlcikgewogICAgICB2YXIgZm9yRWFjaENhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmdW5jdGlvbiAoKSB7fTsKICAgICAgdmFyIGNvbGxpc2lvbnMgPSBnaG9zdENvbGxpZGVyLmdldE51bU92ZXJsYXBwaW5nT2JqZWN0cygpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xsaXNpb25zOyBpKyspIHsKICAgICAgICB2YXIgb2JqZWN0ID0gQW1tby5jYXN0T2JqZWN0KGdob3N0Q29sbGlkZXIuZ2V0T3ZlcmxhcHBpbmdPYmplY3QoaSksIEFtbW8uYnRSaWdpZEJvZHkpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG9iamVjdC5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGZvckVhY2hDYWxsYmFjayhvYmplY3QsIHRyYW5zZm9ybSwgaSk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgZ2V0RXhwbG9zaW9uUG9zaXRpb24gPSBmdW5jdGlvbiBnZXRFeHBsb3Npb25Qb3NpdGlvbih1dWlkLCBwb3NpdGlvbikgewogICAgICB2YXIgZXhwbG9zaW9uUG9zaXRpb24gPSBwb3NpdGlvbjsKCiAgICAgIGlmICghZXhwbG9zaW9uUG9zaXRpb24pIHsKICAgICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQuYm9keTsKCiAgICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgZXhwbG9zaW9uUG9zaXRpb24gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBleHBsb3Npb25Qb3NpdGlvbjsKICAgIH07CiAgICB2YXIgZ2V0RXhwbG9zaW9uSW1wdWxzZSA9IGZ1bmN0aW9uIGdldEV4cGxvc2lvbkltcHVsc2UocG9zaXRpb24sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkgewogICAgICB2YXIgZGlzdGFuY2UgPSBwb3NpdGlvbi5vcF9zdWIoZXhwbG9zaW9uUG9zaXRpb24pOwogICAgICBkaXN0YW5jZS5ub3JtYWxpemUoKTsKICAgICAgdmFyIGltcHVsc2UgPSBkaXN0YW5jZS5vcF9tdWwoc3RyZW5ndGgpOwogICAgICBpbXB1bHNlLnNldFkoaW1wdWxzZS55KCkgKyBzdHJlbmd0aCk7CiAgICAgIHJldHVybiBpbXB1bHNlOwogICAgfTsKICAgIHZhciBjcmVhdGVFeHBsb3Npb24gPSBmdW5jdGlvbiBjcmVhdGVFeHBsb3Npb24oX3JlZikgewogICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gX3JlZi5wb3NpdGlvbiwKICAgICAgICAgIF9yZWYkcmFkaXVzID0gX3JlZi5yYWRpdXMsCiAgICAgICAgICByYWRpdXMgPSBfcmVmJHJhZGl1cyA9PT0gdm9pZCAwID8gRVhQTE9TSU9OX1NJWkVTLlNNQUxMIDogX3JlZiRyYWRpdXMsCiAgICAgICAgICBfcmVmJHN0cmVuZ3RoID0gX3JlZi5zdHJlbmd0aCwKICAgICAgICAgIHN0cmVuZ3RoID0gX3JlZiRzdHJlbmd0aCA9PT0gdm9pZCAwID8gRVhQTE9TSU9OX1NUUkVOR1RIUy5NRURJVU0gOiBfcmVmJHN0cmVuZ3RoOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgZXhwbG9zaW9uUG9zaXRpb24gPSBnZXRFeHBsb3Npb25Qb3NpdGlvbih1dWlkLCBwb3NpdGlvbik7CgogICAgICAgIHZhciBfY3JlYXRlR2hvc3RDb2xsaWRlciA9IGNyZWF0ZUdob3N0Q29sbGlkZXIocmFkaXVzLCBleHBsb3Npb25Qb3NpdGlvbiksCiAgICAgICAgICAgIGdob3N0Q29sbGlkZXIgPSBfY3JlYXRlR2hvc3RDb2xsaWRlci5naG9zdENvbGxpZGVyLAogICAgICAgICAgICB0cmFuc2Zvcm0gPSBfY3JlYXRlR2hvc3RDb2xsaWRlci50cmFuc2Zvcm07CgogICAgICAgIHdvcmxkLmFkZENvbGxpc2lvbk9iamVjdChnaG9zdENvbGxpZGVyKTsKICAgICAgICBmb3JFYWNoR2hvc3RDb2xsaXNpb24oZ2hvc3RDb2xsaWRlciwgZnVuY3Rpb24gKG9iamVjdCwgb2JqZWN0VHJhbnNmb3JtKSB7CiAgICAgICAgICB2YXIgb3JpZ2luID0gb2JqZWN0VHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgICAgb2JqZWN0LmFjdGl2YXRlKHRydWUpOwogICAgICAgICAgb2JqZWN0LmFwcGx5Q2VudHJhbEltcHVsc2UoZ2V0RXhwbG9zaW9uSW1wdWxzZShvcmlnaW4sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkpOwogICAgICAgIH0pOwogICAgICAgIHdvcmxkLmdldER5bmFtaWNzV29ybGQoKS5yZW1vdmVDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgQW1tby5kZXN0cm95KGdob3N0Q29sbGlkZXIpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGhhbmRsZUxvYWRFdmVudCA9IGZ1bmN0aW9uIGhhbmRsZUxvYWRFdmVudChvcHRpb25zKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoQW1tbykgewogICAgICAgIHNlbGYuQW1tbyA9IEFtbW87CgogICAgICAgIG9ubWVzc2FnZSA9IGZ1bmN0aW9uIG9ubWVzc2FnZShfcmVmKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IF9yZWYuZGF0YTsKCiAgICAgICAgICBzd2l0Y2ggKGRhdGEuZXZlbnQpIHsKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuQk9YOgogICAgICAgICAgICAgIGFkZEJveChkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlNQSEVSRToKICAgICAgICAgICAgICBhZGRTcGhlcmUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5WRUhJQ0xFOgogICAgICAgICAgICAgIGFkZFZlaGljbGUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5NT0RFTDoKICAgICAgICAgICAgICBhZGRNb2RlbChkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlBMQVlFUjoKICAgICAgICAgICAgICBhZGRQbGF5ZXIoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULkxJTkVBUl9WRUxPQ0lUWToKICAgICAgICAgICAgICBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5SRVNFVDoKICAgICAgICAgICAgICByZXNldEVsZW1lbnQoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULlBPU0lUSU9OOgogICAgICAgICAgICAgIHNldFBvc2l0aW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5QT1NJVElPTjoKICAgICAgICAgICAgICBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuU0VULlFVQVRFUk5JT046CiAgICAgICAgICAgICAgc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuUkVTRVQ6CiAgICAgICAgICAgICAgcmVzZXRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkFQUExZLklNUFVMU0U6CiAgICAgICAgICAgICAgYXBwbHlJbXB1c2UoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuVVBEQVRFOgogICAgICAgICAgICAgIHdvcmxkLnVwZGF0ZUJvZHlTdGF0ZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5ESVNQT1NFOgogICAgICAgICAgICAgIHdvcmxkLmRpc3Bvc2VCb2R5KGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FRkZFQ1RTLkVYUExPU0lPTjoKICAgICAgICAgICAgICBjcmVhdGVFeHBsb3Npb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURToKICAgICAgICAgICAgICB3b3JsZC50ZXJtaW5hdGUoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB3b3JsZC5pbml0KG9wdGlvbnMpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kUmVhZHlFdmVudCgpOwogICAgICAgIHdvcmxkLnNpbXVsYXRlKCk7CiAgICAgIH07CiAgICB9OwoKICAgIHZhciBsb2FkQW1tbyA9IGZ1bmN0aW9uIGxvYWRBbW1vKG9wdGlvbnMpIHsKICAgICAgdmFyIHNjcmlwdFVybCA9IG9wdGlvbnMuaG9zdCArICcvJyArIChvcHRpb25zLnBhdGggfHwgTElCUkFSWV9OQU1FKTsKICAgICAgaW1wb3J0U2NyaXB0cyhzY3JpcHRVcmwpOwogICAgICBBbW1vKCkudGhlbihoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykpOwogICAgfTsKCiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZjIpIHsKICAgICAgdmFyIGRhdGEgPSBfcmVmMi5kYXRhOwoKICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5MT0FELkFNTU86CiAgICAgICAgICBsb2FkQW1tbyhkYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9OwoKfSkoKTsKCg==', null, false);
|
|
55344
|
+
}var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczplbGVtZW50OnJlc2V0JywKICAgICAgICBBUFBMWTogewogICAgICAgICAgSU1QVUxTRTogJ3BoeXNpY3M6ZWxlbWVudDphcHBseTppbXB1bHNlJwogICAgICAgIH0KICAgICAgfSwKICAgICAgVkVISUNMRTogewogICAgICAgIFNFVDogewogICAgICAgICAgUE9TSVRJT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnBvc2l0aW9uJywKICAgICAgICAgIFFVQVRFUk5JT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnF1YXRlcm5pb24nCiAgICAgICAgfSwKICAgICAgICBSRVNFVDogJ3BoeXNpY3M6dmVoaWNsZTpyZXNldCcsCiAgICAgICAgU1BFRUQ6ICdwaHlzaWNzOnZlaGljbGU6c3BlZWQnLAogICAgICAgIERJUkVDVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpkaXJlY3Rpb24nCiAgICAgIH0sCiAgICAgIEVGRkVDVFM6IHsKICAgICAgICBFWFBMT1NJT046ICdwaHlzaWNzOmVmZmVjdHM6ZXhwbG9zaW9uJwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgewogICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7CgogICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOwogICAgICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7CiAgICAgICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7CiAgICAgIH0KCiAgICAgIHJldHVybiBrZXlzOwogICAgfQoKICAgIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkgewogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OwogICAgICAgIGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7CiAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgfSk7CiAgICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7CiAgICAgIGlmIChrZXkgaW4gb2JqKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgICB9CgogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHZhciBEaXNwYXRjaGVyID0gZnVuY3Rpb24gRGlzcGF0Y2hlcigpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpc3BhdGNoZXIpOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUGh5c2ljc1VwZGF0ZSIsIGZ1bmN0aW9uIChkdCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuVVBEQVRFLAogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUmVhZHlFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlJFQURZCiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kVGVybWluYXRlRXZlbnQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEUKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRCb2R5VXBkYXRlIiwgZnVuY3Rpb24gKHV1aWQsIHBvc2l0aW9uLCByb3RhdGlvbiwgZHQsIGV4dHJhRGF0YSkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZShfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEUsCiAgICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgeDogcG9zaXRpb24ueCgpLAogICAgICAgICAgICB5OiBwb3NpdGlvbi55KCksCiAgICAgICAgICAgIHo6IHBvc2l0aW9uLnooKQogICAgICAgICAgfSwKICAgICAgICAgIHF1YXRlcm5pb246IHsKICAgICAgICAgICAgeDogcm90YXRpb24ueCgpLAogICAgICAgICAgICB5OiByb3RhdGlvbi55KCksCiAgICAgICAgICAgIHo6IHJvdGF0aW9uLnooKSwKICAgICAgICAgICAgdzogcm90YXRpb24udygpCiAgICAgICAgICB9CiAgICAgICAgfSwgZXh0cmFEYXRhKSwge30sIHsKICAgICAgICAgIGR0OiBkdAogICAgICAgIH0pKTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmREaXNwYXRjaEV2ZW50IiwgZnVuY3Rpb24gKHV1aWQsIGV2ZW50TmFtZSwgZXZlbnREYXRhKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5ESVNQQVRDSCwKICAgICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKICAgICAgICAgIGV2ZW50RGF0YTogZXZlbnREYXRhCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfTsKICAgIHZhciBkaXNwYXRjaGVyJDEgPSBuZXcgRGlzcGF0Y2hlcigpOwoKICAgIHZhciBhcHBseU1hdHJpeDRUb1ZlY3RvcjMgPSBmdW5jdGlvbiBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoX3JlZikgewogICAgICB2YXIgX3JlZiR4ID0gX3JlZi54LAogICAgICAgICAgeCA9IF9yZWYkeCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkeCwKICAgICAgICAgIF9yZWYkeSA9IF9yZWYueSwKICAgICAgICAgIHkgPSBfcmVmJHkgPT09IHZvaWQgMCA/IDAgOiBfcmVmJHksCiAgICAgICAgICBfcmVmJHogPSBfcmVmLnosCiAgICAgICAgICB6ID0gX3JlZiR6ID09PSB2b2lkIDAgPyAwIDogX3JlZiR6OwogICAgICB2YXIgbWF0cml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTsKICAgICAgdmFyIHcgPSAxIC8gKG1hdHJpeFszXSAqIHggKyBtYXRyaXhbN10gKiB5ICsgbWF0cml4WzExXSAqIHogKyBtYXRyaXhbMTVdKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB4OiAobWF0cml4WzBdICogeCArIG1hdHJpeFs0XSAqIHkgKyBtYXRyaXhbOF0gKiB6ICsgbWF0cml4WzEyXSkgKiB3LAogICAgICAgIHk6IChtYXRyaXhbMV0gKiB4ICsgbWF0cml4WzVdICogeSArIG1hdHJpeFs5XSAqIHogKyBtYXRyaXhbMTNdKSAqIHcsCiAgICAgICAgejogKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbNl0gKiB5ICsgbWF0cml4WzEwXSAqIHogKyBtYXRyaXhbMTRdKSAqIHcKICAgICAgfTsKICAgIH07CgogICAgdmFyIGNyZWF0ZVJpZ2lkQm9keSA9IGZ1bmN0aW9uIGNyZWF0ZVJpZ2lkQm9keShzaGFwZSwgb3B0aW9ucykgewogICAgICB2YXIgdXVpZCA9IG9wdGlvbnMudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBvcHRpb25zLnF1YXRlcm5pb24sCiAgICAgICAgICBtYXNzID0gb3B0aW9ucy5tYXNzLAogICAgICAgICAgZnJpY3Rpb24gPSBvcHRpb25zLmZyaWN0aW9uLAogICAgICAgICAgX29wdGlvbnMkcmVzdGl0dXRpb24gPSBvcHRpb25zLnJlc3RpdHV0aW9uLAogICAgICAgICAgcmVzdGl0dXRpb24gPSBfb3B0aW9ucyRyZXN0aXR1dGlvbiA9PT0gdm9pZCAwID8gLjkgOiBfb3B0aW9ucyRyZXN0aXR1dGlvbiwKICAgICAgICAgIF9vcHRpb25zJGRhbXBpbmcgPSBvcHRpb25zLmRhbXBpbmcsCiAgICAgICAgICBkYW1waW5nID0gX29wdGlvbnMkZGFtcGluZyA9PT0gdm9pZCAwID8gewogICAgICAgIGxpbmVhcjogMC4yLAogICAgICAgIGFuZ3VsYXI6IDAuMgogICAgICB9IDogX29wdGlvbnMkZGFtcGluZzsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7CiAgICAgIHZhciBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7CiAgICAgIHNoYXBlLmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgcmJJbmZvID0gbmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBzaGFwZSwgbG9jYWxJbmVydGlhKTsKICAgICAgdmFyIGJvZHkgPSBuZXcgQW1tby5idFJpZ2lkQm9keShyYkluZm8pOwoKICAgICAgaWYgKG1hc3MgPiAwKSB7CiAgICAgICAgYm9keS5zZXRGcmljdGlvbihmcmljdGlvbik7CiAgICAgICAgYm9keS5zZXRSZXN0aXR1dGlvbihyZXN0aXR1dGlvbik7CiAgICAgICAgYm9keS5zZXREYW1waW5nKGRhbXBpbmcubGluZWFyLCBkYW1waW5nLmFuZ3VsYXIpOwogICAgICAgIGJvZHkuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgfSAvLyBzdG9yaW5nIHV1aWQgZm9yIGZ1dHVyZSByZWZlcmVuY2UKCgogICAgICBib2R5LnV1aWQgPSB1dWlkOwogICAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgIHJldHVybiBib2R5OwogICAgfTsKICAgIHZhciBhZGRNb2RlbCA9IGZ1bmN0aW9uIGFkZE1vZGVsKG9wdGlvbnMpIHsKICAgICAgdmFyIHV1aWQgPSBvcHRpb25zLnV1aWQsCiAgICAgICAgICB2ZXJ0aWNlcyA9IG9wdGlvbnMudmVydGljZXMsCiAgICAgICAgICBtYXRyaWNlcyA9IG9wdGlvbnMubWF0cmljZXMsCiAgICAgICAgICBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzLAogICAgICAgICAgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IG9wdGlvbnMucXVhdGVybmlvbiwKICAgICAgICAgIF9vcHRpb25zJG1hc3MgPSBvcHRpb25zLm1hc3MsCiAgICAgICAgICBtYXNzID0gX29wdGlvbnMkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJG1hc3MsCiAgICAgICAgICBfb3B0aW9ucyRmcmljdGlvbiA9IG9wdGlvbnMuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9vcHRpb25zJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX29wdGlvbnMkZnJpY3Rpb247CiAgICAgIHZhciBzY2FsZSA9IERFRkFVTFRfU0NBTEU7CiAgICAgIHZhciBidGEgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIGJ0YiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgYnRjID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciB0cmlNZXNoID0gbmV3IEFtbW8uYnRUcmlhbmdsZU1lc2godHJ1ZSwgZmFsc2UpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjb21wb25lbnRzID0gdmVydGljZXNbaV07CiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tpXSA/IGluZGV4ZXNbaV0gOiBudWxsOwogICAgICAgIHZhciBtYXRyaXggPSBBcnJheS5mcm9tKG1hdHJpY2VzW2ldKTsKCiAgICAgICAgaWYgKGluZGV4KSB7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGluZGV4Lmxlbmd0aDsgaiArPSAzKSB7CiAgICAgICAgICAgIHZhciBhaSA9IGluZGV4W2pdICogMzsKICAgICAgICAgICAgdmFyIGJpID0gaW5kZXhbaiArIDFdICogMzsKICAgICAgICAgICAgdmFyIGNpID0gaW5kZXhbaiArIDJdICogMzsKICAgICAgICAgICAgdmFyIHZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2FpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2FpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1thaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIHZhciB2YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tiaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tiaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbYmkgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICB2YXIgdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbY2ldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbY2kgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2NpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgYnRhLnNldFZhbHVlKHZhLngsIHZhLnksIHZhLnopOwogICAgICAgICAgICBidGIuc2V0VmFsdWUodmIueCwgdmIueSwgdmIueik7CiAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZSh2Yy54LCB2Yy55LCB2Yy56KTsKICAgICAgICAgICAgdHJpTWVzaC5hZGRUcmlhbmdsZShidGEsIGJ0YiwgYnRjLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBjb21wb25lbnRzLmxlbmd0aDsgX2ogKz0gOSkgewogICAgICAgICAgICB2YXIgX3ZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgMF0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgdmFyIF92YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDNdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyA0XSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgNV0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIHZhciBfdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyA2XSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgN10sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDhdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICBidGEuc2V0VmFsdWUoX3ZhLngsIF92YS55LCBfdmEueik7CiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZShfdmIueCwgX3ZiLnksIF92Yi56KTsKICAgICAgICAgICAgYnRjLnNldFZhbHVlKF92Yy54LCBfdmMueSwgX3ZjLnopOwogICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBsb2NhbFNjYWxlID0gbmV3IEFtbW8uYnRWZWN0b3IzKHNjYWxlLngsIHNjYWxlLnksIHNjYWxlLnopOwogICAgICB0cmlNZXNoLnNldFNjYWxpbmcobG9jYWxTY2FsZSk7CiAgICAgIEFtbW8uZGVzdHJveShsb2NhbFNjYWxlKTsKICAgICAgdmFyIGNvbGxpc2lvblNoYXBlID0gbmV3IEFtbW8uYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSh0cmlNZXNoLCB0cnVlLCB0cnVlKTsKICAgICAgY29sbGlzaW9uU2hhcGUucmVzb3VyY2VzID0gW3RyaU1lc2hdOwogICAgICBBbW1vLmRlc3Ryb3koYnRhKTsKICAgICAgQW1tby5kZXN0cm95KGJ0Yik7CiAgICAgIEFtbW8uZGVzdHJveShidGMpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjb2xsaXNpb25TaGFwZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5NRVNILAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgYWRkQm94ID0gZnVuY3Rpb24gYWRkQm94KGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aWR0aCA9IGRhdGEud2lkdGgsCiAgICAgICAgICBsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGhlaWdodCA9IGRhdGEuaGVpZ2h0LAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9kYXRhJG1hc3MsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX2RhdGEkZnJpY3Rpb247CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogMC41LCBoZWlnaHQgKiAwLjUsIGxlbmd0aCAqIDAuNSkpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5CT1gsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBhZGRTcGhlcmUgPSBmdW5jdGlvbiBhZGRTcGhlcmUoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHJhZGl1cyA9IGRhdGEucmFkaXVzLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MyID0gZGF0YS5tYXNzLAogICAgICAgICAgbWFzcyA9IF9kYXRhJG1hc3MyID09PSB2b2lkIDAgPyAwIDogX2RhdGEkbWFzczIsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbjIgPSBkYXRhLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfZGF0YSRmcmljdGlvbjIgPT09IHZvaWQgMCA/IDIgOiBfZGF0YSRmcmljdGlvbjI7CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoZ2VvbWV0cnksIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuU1BIRVJFLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgc2V0TGluZWFyVmVsb2NpdHkgPSBmdW5jdGlvbiBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgX2RhdGEkdmVsb2NpdHkgPSBkYXRhLnZlbG9jaXR5LAogICAgICAgICAgdmVsb2NpdHkgPSBfZGF0YSR2ZWxvY2l0eSA9PT0gdm9pZCAwID8gREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgOiBfZGF0YSR2ZWxvY2l0eTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQuYm9keTsKCiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKCiAgICAgIGlmIChtb3Rpb25TdGF0ZSkgewogICAgICAgIHZhciBsaW5lYXJWZWxvY2l0eSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTsKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBBbW1vLmRlc3Ryb3kobGluZWFyVmVsb2NpdHkpOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFBvc2l0aW9uID0gZnVuY3Rpb24gc2V0UG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDIgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50Mi5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIHJlc2V0RWxlbWVudCA9IGZ1bmN0aW9uIHJlc2V0RWxlbWVudChkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDMgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50My5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIGFwcGx5SW1wdXNlID0gZnVuY3Rpb24gYXBwbHlJbXB1c2UoX3JlZikgewogICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkaW1wdWxzZSA9IF9yZWYuaW1wdWxzZSwKICAgICAgICAgIGltcHVsc2UgPSBfcmVmJGltcHVsc2UgPT09IHZvaWQgMCA/IERFRkFVTFRfSU1QVUxTRSA6IF9yZWYkaW1wdWxzZTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50NC5ib2R5OwoKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIGltcHVsc2VWZWN0b3IgPSBuZXcgQW1tby5idFZlY3RvcjMoaW1wdWxzZS54LCBpbXB1bHNlLnksIGltcHVsc2Uueik7CiAgICAgICAgYm9keS5hcHBseUNlbnRyYWxJbXB1bHNlKGltcHVsc2VWZWN0b3IpOwogICAgICAgIEFtbW8uZGVzdHJveShpbXB1bHNlVmVjdG9yKTsKICAgICAgfQogICAgfTsKICAgIHZhciBoYW5kbGVFbGVtZW50VXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlRWxlbWVudFVwZGF0ZShfcmVmMiwgZHQpIHsKICAgICAgdmFyIGJvZHkgPSBfcmVmMi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYyLnV1aWQ7CiAgICAgICAgICBfcmVmMi5zdGF0ZTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgb3JpZ2luID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgIHZhciByb3RhdGlvbiA9IHRyYW5zZm9ybS5nZXRSb3RhdGlvbigpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGFkZFBsYXllciA9IGZ1bmN0aW9uIGFkZFBsYXllcihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbjsKICAgICAgdmFyIGNhcHN1bGUgPSBuZXcgQW1tby5idENhcHN1bGVTaGFwZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY2Fwc3VsZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7IC8vIGRpc2FibGlpbmcgcm90YXRpb24gZm9yIGNvbGxpc2lvbnMKCiAgICAgIGJvZHkuc2V0QW5ndWxhckZhY3RvcigwKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuUExBWUVSLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgaGFuZGxlUGxheWVyVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlUGxheWVyVXBkYXRlKF9yZWYsIGR0KSB7CiAgICAgIHZhciBib2R5ID0gX3JlZi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSA6IF9yZWYkc3RhdGU7CiAgICAgIHZhciBtb3ZlbWVudCA9IHN0YXRlLm1vdmVtZW50OwogICAgICAgICAgc3RhdGUuZGlyZWN0aW9uOwogICAgICAgICAgdmFyIGNhbWVyYURpcmVjdGlvbiA9IHN0YXRlLmNhbWVyYURpcmVjdGlvbjsKICAgICAgICAgIHN0YXRlLnF1YXRlcm5pb247CiAgICAgICAgICBzdGF0ZS5wb3NpdGlvbjsKICAgICAgdmFyIE1BWF9TUEVFRCA9IDE7CiAgICAgIHZhciB3YWxrVmVsb2NpdHkgPSAuMTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgbGluZWFyVmVsb2NpdHkgPSBib2R5LmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgdmFyIHNwZWVkID0gbGluZWFyVmVsb2NpdHkubGVuZ3RoKCk7CiAgICAgICAgdmFyIGZvcndhcmREaXIgPSB0cmFuc2Zvcm0uZ2V0QmFzaXMoKS5nZXRSb3coMik7CiAgICAgICAgZm9yd2FyZERpci5ub3JtYWxpemUoKTsKICAgICAgICB2YXIgd2Fsa0RpcmVjdGlvbiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLjAsIDAuMCwgMC4wKTsKICAgICAgICB2YXIgd2Fsa1NwZWVkID0gd2Fsa1ZlbG9jaXR5ICogZHQ7CgogICAgICAgIGlmIChtb3ZlbWVudC5mb3J3YXJkKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgKyBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSArIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgKyBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgLSBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSAtIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgLSBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW1vdmVtZW50LmZvcndhcmQgJiYgIW1vdmVtZW50LmJhY2t3YXJkcykgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKiAwLjIpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKiAwLjIpOwogICAgICAgIH0gZWxzZSBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHsKICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFgobGluZWFyVmVsb2NpdHkueCgpICsgY2FtZXJhRGlyZWN0aW9uLnggKiB3YWxrU3BlZWQpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKyBjYW1lcmFEaXJlY3Rpb24ueiAqIHdhbGtTcGVlZCk7CiAgICAgICAgfQoKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBib2R5LmdldE1vdGlvblN0YXRlKCkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBib2R5LnNldENlbnRlck9mTWFzc1RyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgICAgdmFyIHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIHJlcXVlc3ROZXh0RnJhbWUgPSBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZWxmLndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZWxmLm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZWxmLm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgc2VsZi5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBmdW5jdGlvbiAoY2FsbGJhY2ssIGVsZW1lbnQpIHsKICAgICAgc2VsZi5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gMTIwKTsKICAgIH07CgogICAgdmFyIENsb2NrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gQ2xvY2soKSB7CiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsb2NrKTsKCiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBudWxsOwogICAgICB9CgogICAgICBfY3JlYXRlQ2xhc3MoQ2xvY2ssIFt7CiAgICAgICAga2V5OiAiZ2V0RGVsdGEiLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWx0YSgpIHsKICAgICAgICAgIHZhciB0aW1lID0gRGF0ZS5ub3coKTsKCiAgICAgICAgICBpZiAodGhpcy50aW1lc3RhbXApIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHRoaXMudGltZXN0YW1wOwogICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWU7CiAgICAgICAgICAgIHJldHVybiBkZWx0YTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gQ2xvY2s7CiAgICB9KCk7CgogICAgdmFyIFdvcmxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gV29ybGQoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdvcmxkKTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpbml0IiwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBfb3B0aW9ucyRncmF2aXR5ID0gb3B0aW9ucy5ncmF2aXR5LAogICAgICAgICAgICAgIGdyYXZpdHkgPSBfb3B0aW9ucyRncmF2aXR5ID09PSB2b2lkIDAgPyBHUkFWSVRZIDogX29wdGlvbnMkZ3Jhdml0eTsKICAgICAgICAgIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSBuZXcgQW1tby5idERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uKCk7CiAgICAgICAgICBfdGhpcy5kaXNwYXRjaGVyID0gbmV3IEFtbW8uYnRDb2xsaXNpb25EaXNwYXRjaGVyKF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgX3RoaXMuYnJvYWRwaGFzZSA9IG5ldyBBbW1vLmJ0RGJ2dEJyb2FkcGhhc2UoKTsKICAgICAgICAgIF90aGlzLnNvbHZlciA9IG5ldyBBbW1vLmJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyKCk7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkID0gbmV3IEFtbW8uYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQoX3RoaXMuZGlzcGF0Y2hlciwgX3RoaXMuYnJvYWRwaGFzZSwgX3RoaXMuc29sdmVyLCBfdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTsKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnNldEdyYXZpdHkobmV3IEFtbW8uYnRWZWN0b3IzKGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnopKTsgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGdob3N0T2JqZWN0IGNvbGxpc2lvbnMKCgogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5nZXRCcm9hZHBoYXNlKCkuZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUoKS5zZXRJbnRlcm5hbEdob3N0UGFpckNhbGxiYWNrKG5ldyBBbW1vLmJ0R2hvc3RQYWlyQ2FsbGJhY2soKSk7CgogICAgICAgICAgX3RoaXMuaW5pdGlhbGlzZWQgPSB0cnVlOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInJlbW92ZUVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5maWx0ZXIoZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdLmRlbGV0ZWQ7CiAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImhhc0VsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5pbmNsdWRlcyh1dWlkKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJnZXRFbGVtZW50IiwgZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpc0luaXRpYWxpc2VkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmluaXRpYWxpc2VkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldER5bmFtaWNzV29ybGQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuZHluYW1pY3NXb3JsZDsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRSaWdpZEJvZHkiLCBmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiYWRkQWN0aW9uIiwgZnVuY3Rpb24gKGFjdGlvbikgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRBY3Rpb24oYWN0aW9uKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRDb2xsaXNpb25PYmplY3QiLCBmdW5jdGlvbiAoY29sbGlzaW9uT2JqZWN0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZENvbGxpc2lvbk9iamVjdChjb2xsaXNpb25PYmplY3QpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInN0ZXBTaW11bGF0aW9uIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnN0ZXBTaW11bGF0aW9uKGR0KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzaW11bGF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBkdCA9IF90aGlzLmNsb2NrLmdldERlbHRhKCk7CgogICAgICAgICAgX3RoaXMuc3RlcFNpbXVsYXRpb24oZHQpOwoKICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuQk9YOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5TUEhFUkU6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLk1FU0g6CiAgICAgICAgICAgICAgICAgIGhhbmRsZUVsZW1lbnRVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlBMQVlFUjoKICAgICAgICAgICAgICAgICAgaGFuZGxlUGxheWVyVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5WRUhJQ0xFOgogICAgICAgICAgICAgICAgICBoYW5kbGVWZWhpY2xlVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBfdGhpcy5jYWxjdWxhdGVDb2xsaXNpb25zKCk7CgogICAgICAgICAgX3RoaXMucmVtb3ZlRGVsZXRlZEVsZW1lbnRzKCk7CgogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRQaHlzaWNzVXBkYXRlKGR0KTsKICAgICAgICAgIF90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdE5leHRGcmFtZShfdGhpcy5zaW11bGF0ZS5iaW5kKF90aGlzKSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiY2FsY3VsYXRlQ29sbGlzaW9ucyIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBhbW1vRGlzcGF0Y2hlciA9IF90aGlzLmR5bmFtaWNzV29ybGQuZ2V0RGlzcGF0Y2hlcigpOwoKICAgICAgICAgIHZhciBudW1NYW5pZm9sZHMgPSBhbW1vRGlzcGF0Y2hlci5nZXROdW1NYW5pZm9sZHMoKTsKCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU1hbmlmb2xkczsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjb250YWN0TWFuaWZvbGQgPSBhbW1vRGlzcGF0Y2hlci5nZXRNYW5pZm9sZEJ5SW5kZXhJbnRlcm5hbChpKTsKICAgICAgICAgICAgdmFyIHJiMCA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTAoKSwgQW1tby5idFJpZ2lkQm9keSk7CiAgICAgICAgICAgIHZhciByYjEgPSBBbW1vLmNhc3RPYmplY3QoY29udGFjdE1hbmlmb2xkLmdldEJvZHkxKCksIEFtbW8uYnRSaWdpZEJvZHkpOwogICAgICAgICAgICB2YXIgbnVtQ29udGFjdHMgPSBjb250YWN0TWFuaWZvbGQuZ2V0TnVtQ29udGFjdHMoKTsgLy8gdGhpcyBpdGVyYXRpb24gZG9lc24ndCBoYXZlIHV1aWRzCgogICAgICAgICAgICBpZiAoIXJiMC51dWlkIHx8ICFyYjEudXVpZCkgY29udGludWU7CiAgICAgICAgICAgIHZhciBjb250YWN0cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Db250YWN0czsgaisrKSB7CiAgICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludCA9IGNvbnRhY3RNYW5pZm9sZC5nZXRDb250YWN0UG9pbnQoaik7CiAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlID0gY29udGFjdFBvaW50LmdldERpc3RhbmNlKCk7CiAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gMC4wKSBjb250aW51ZTsKICAgICAgICAgICAgICB2YXIgdmVsb2NpdHkwID0gcmIwLmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgICAgICAgdmFyIHZlbG9jaXR5MSA9IHJiMS5nZXRMaW5lYXJWZWxvY2l0eSgpOwogICAgICAgICAgICAgIHZhciB3b3JsZFBvczAgPSBjb250YWN0UG9pbnQuZ2V0X21fcG9zaXRpb25Xb3JsZE9uQSgpOwogICAgICAgICAgICAgIHZhciB3b3JsZFBvczEgPSBjb250YWN0UG9pbnQuZ2V0X21fcG9zaXRpb25Xb3JsZE9uQigpOwogICAgICAgICAgICAgIHZhciBsb2NhbFBvczAgPSBjb250YWN0UG9pbnQuZ2V0X21fbG9jYWxQb2ludEEoKTsKICAgICAgICAgICAgICB2YXIgbG9jYWxQb3MxID0gY29udGFjdFBvaW50LmdldF9tX2xvY2FsUG9pbnRCKCk7CiAgICAgICAgICAgICAgY29udGFjdHMucHVzaCh7CiAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGlzdGFuY2UsCiAgICAgICAgICAgICAgICBlbGVtZW50czogW3sKICAgICAgICAgICAgICAgICAgdXVpZDogcmIwLnV1aWQsCiAgICAgICAgICAgICAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgICAgICAgICAgICAgeDogdmVsb2NpdHkwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB2ZWxvY2l0eTAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHZlbG9jaXR5MC56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgd29ybGRQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiB3b3JsZFBvczAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHdvcmxkUG9zMC55KCksCiAgICAgICAgICAgICAgICAgICAgejogd29ybGRQb3MwLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBsb2NhbFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IGxvY2FsUG9zMC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogbG9jYWxQb3MwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiBsb2NhbFBvczAueigpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgdXVpZDogcmIxLnV1aWQsCiAgICAgICAgICAgICAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgICAgICAgICAgICAgeDogdmVsb2NpdHkxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB2ZWxvY2l0eTEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHZlbG9jaXR5MS56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgd29ybGRQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiB3b3JsZFBvczEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHdvcmxkUG9zMS55KCksCiAgICAgICAgICAgICAgICAgICAgejogd29ybGRQb3MxLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBsb2NhbFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IGxvY2FsUG9zMS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogbG9jYWxQb3MxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiBsb2NhbFBvczEueigpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRGlzcGF0Y2hFdmVudChyYjAudXVpZCwgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5DT0xMSVNJT04sIHsKICAgICAgICAgICAgICBjb250YWN0czogY29udGFjdHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRGlzcGF0Y2hFdmVudChyYjEudXVpZCwgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5DT0xMSVNJT04sIHsKICAgICAgICAgICAgICBjb250YWN0czogY29udGFjdHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiYWRkRWxlbWVudCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICBfdGhpcy5lbGVtZW50c1tkYXRhLnV1aWRdID0gZGF0YTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJ1cGRhdGVCb2R5U3RhdGUiLCBmdW5jdGlvbiAoX3JlZikgewogICAgICAgICAgdmFyIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICAgICAgc3RhdGUgPSBfcmVmLnN0YXRlOwoKICAgICAgICAgIGlmIChfdGhpcy5oYXNFbGVtZW50KHV1aWQpKSB7CiAgICAgICAgICAgIF90aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIF90aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlKSwgc3RhdGUpOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInRlcm1pbmF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5keW5hbWljc1dvcmxkKTsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5zb2x2ZXIpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmRpc3BhdGNoZXIpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX3RoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQpOwogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRUZXJtaW5hdGVFdmVudCgpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLmVsZW1lbnRzID0ge307CiAgICAgICAgdGhpcy5pbml0aWFsaXNlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5icm9hZHBoYXNlID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuc29sdmVyID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZCA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gbnVsbDsKICAgICAgICB0aGlzLmNsb2NrID0gbmV3IENsb2NrKCk7CiAgICAgIH0KCiAgICAgIF9jcmVhdGVDbGFzcyhXb3JsZCwgW3sKICAgICAgICBrZXk6ICJkaXNwb3NlQm9keSIsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2VCb2R5KF9yZWYyKSB7CiAgICAgICAgICB2YXIgdXVpZCA9IF9yZWYyLnV1aWQ7CiAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTsKICAgICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5yZW1vdmVSaWdpZEJvZHkoZWxlbWVudC5ib2R5KTsKICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh1dWlkKTsKICAgICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRWxlbWVudERpc3Bvc2VkKHsKICAgICAgICAgICAgdXVpZDogdXVpZAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gV29ybGQ7CiAgICB9KCk7CiAgICB2YXIgd29ybGQgPSBuZXcgV29ybGQoKTsKCiAgICB2YXIgREVGQVVMVF9ST0xMX0lORkxVRU5DRSA9IDAuMjsKICAgIHZhciBERUZBVUxUX0ZSSUNUSU9OID0gMTAwMDsKICAgIHZhciBERUZBVUxUX01BU1MgPSA4MDA7CiAgICB2YXIgYWRkVmVoaWNsZSA9IGZ1bmN0aW9uIGFkZFZlaGljbGUoZGF0YSkgewogICAgICB2YXIgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aGVlbHMgPSBkYXRhLndoZWVscywKICAgICAgICAgIF9kYXRhJG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzcyA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVNTIDogX2RhdGEkbWFzcywKICAgICAgICAgIF9kYXRhJHdpZHRoID0gZGF0YS53aWR0aCwKICAgICAgICAgIHdpZHRoID0gX2RhdGEkd2lkdGggPT09IHZvaWQgMCA/IDEuOCA6IF9kYXRhJHdpZHRoLAogICAgICAgICAgX2RhdGEkaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBoZWlnaHQgPSBfZGF0YSRoZWlnaHQgPT09IHZvaWQgMCA/IC42IDogX2RhdGEkaGVpZ2h0LAogICAgICAgICAgX2RhdGEkbGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICBsZW5ndGggPSBfZGF0YSRsZW5ndGggPT09IHZvaWQgMCA/IDQgOiBfZGF0YSRsZW5ndGgsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uID09PSB2b2lkIDAgPyBERUZBVUxUX0ZSSUNUSU9OIDogX2RhdGEkZnJpY3Rpb24sCiAgICAgICAgICBfZGF0YSRyb2xsSW5mbHVlbmNlID0gZGF0YS5yb2xsSW5mbHVlbmNlLAogICAgICAgICAgcm9sbEluZmx1ZW5jZSA9IF9kYXRhJHJvbGxJbmZsdWVuY2UgPT09IHZvaWQgMCA/IERFRkFVTFRfUk9MTF9JTkZMVUVOQ0UgOiBfZGF0YSRyb2xsSW5mbHVlbmNlLAogICAgICAgICAgX2RhdGEkd2hlZWxzT3B0aW9ucyA9IGRhdGEud2hlZWxzT3B0aW9ucywKICAgICAgICAgIHdoZWVsc09wdGlvbnMgPSBfZGF0YSR3aGVlbHNPcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9kYXRhJHdoZWVsc09wdGlvbnMsCiAgICAgICAgICBfZGF0YSRzdXNwZW5zaW9ucyA9IGRhdGEuc3VzcGVuc2lvbnMsCiAgICAgICAgICBzdXNwZW5zaW9ucyA9IF9kYXRhJHN1c3BlbnNpb25zID09PSB2b2lkIDAgPyB7fSA6IF9kYXRhJHN1c3BlbnNpb25zOwogICAgICB2YXIgX3doZWVsc09wdGlvbnMkYmFjayA9IHdoZWVsc09wdGlvbnMuYmFjaywKICAgICAgICAgIGJhY2sgPSBfd2hlZWxzT3B0aW9ucyRiYWNrID09PSB2b2lkIDAgPyB7fSA6IF93aGVlbHNPcHRpb25zJGJhY2ssCiAgICAgICAgICBfd2hlZWxzT3B0aW9ucyRmcm9udCA9IHdoZWVsc09wdGlvbnMuZnJvbnQsCiAgICAgICAgICBmcm9udCA9IF93aGVlbHNPcHRpb25zJGZyb250ID09PSB2b2lkIDAgPyB7fSA6IF93aGVlbHNPcHRpb25zJGZyb250OwogICAgICB2YXIgX2JhY2skYXhpc1Bvc2l0aW9uID0gYmFjay5heGlzUG9zaXRpb24sCiAgICAgICAgICBheGlzUG9zaXRpb25CYWNrID0gX2JhY2skYXhpc1Bvc2l0aW9uID09PSB2b2lkIDAgPyAtMSA6IF9iYWNrJGF4aXNQb3NpdGlvbiwKICAgICAgICAgIF9iYWNrJHJhZGl1cyA9IGJhY2sucmFkaXVzLAogICAgICAgICAgd2hlZWxSYWRpdXNCYWNrID0gX2JhY2skcmFkaXVzID09PSB2b2lkIDAgPyAuNCA6IF9iYWNrJHJhZGl1cywKICAgICAgICAgIF9iYWNrJGhhbGZUcmFjayA9IGJhY2suaGFsZlRyYWNrLAogICAgICAgICAgd2hlZWxIYWxmVHJhY2tCYWNrID0gX2JhY2skaGFsZlRyYWNrID09PSB2b2lkIDAgPyAxIDogX2JhY2skaGFsZlRyYWNrLAogICAgICAgICAgX2JhY2skYXhpc0hlaWdodCA9IGJhY2suYXhpc0hlaWdodCwKICAgICAgICAgIHdoZWVsQXhpc0hlaWdodEJhY2sgPSBfYmFjayRheGlzSGVpZ2h0ID09PSB2b2lkIDAgPyAuMyA6IF9iYWNrJGF4aXNIZWlnaHQ7CiAgICAgIHZhciBfZnJvbnQkYXhpc1Bvc2l0aW9uID0gZnJvbnQuYXhpc1Bvc2l0aW9uLAogICAgICAgICAgYXhpc1Bvc2l0aW9uRnJvbnQgPSBfZnJvbnQkYXhpc1Bvc2l0aW9uID09PSB2b2lkIDAgPyAxLjcgOiBfZnJvbnQkYXhpc1Bvc2l0aW9uLAogICAgICAgICAgX2Zyb250JHJhZGl1cyA9IGZyb250LnJhZGl1cywKICAgICAgICAgIHdoZWVsUmFkaXVzRnJvbnQgPSBfZnJvbnQkcmFkaXVzID09PSB2b2lkIDAgPyAuNCA6IF9mcm9udCRyYWRpdXMsCiAgICAgICAgICBfZnJvbnQkaGFsZlRyYWNrID0gZnJvbnQuaGFsZlRyYWNrLAogICAgICAgICAgd2hlZWxIYWxmVHJhY2tGcm9udCA9IF9mcm9udCRoYWxmVHJhY2sgPT09IHZvaWQgMCA/IDEgOiBfZnJvbnQkaGFsZlRyYWNrLAogICAgICAgICAgX2Zyb250JGF4aXNIZWlnaHQgPSBmcm9udC5heGlzSGVpZ2h0LAogICAgICAgICAgd2hlZWxBeGlzSGVpZ2h0RnJvbnQgPSBfZnJvbnQkYXhpc0hlaWdodCA9PT0gdm9pZCAwID8gLjMgOiBfZnJvbnQkYXhpc0hlaWdodDsKICAgICAgdmFyIF9zdXNwZW5zaW9ucyRzdGlmZm5lcyA9IHN1c3BlbnNpb25zLnN0aWZmbmVzcywKICAgICAgICAgIHN0aWZmbmVzcyA9IF9zdXNwZW5zaW9ucyRzdGlmZm5lcyA9PT0gdm9pZCAwID8gMjAuMCA6IF9zdXNwZW5zaW9ucyRzdGlmZm5lcywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRkYW1waW5nID0gc3VzcGVuc2lvbnMuZGFtcGluZywKICAgICAgICAgIGRhbXBpbmcgPSBfc3VzcGVuc2lvbnMkZGFtcGluZyA9PT0gdm9pZCAwID8gMi4zIDogX3N1c3BlbnNpb25zJGRhbXBpbmcsCiAgICAgICAgICBfc3VzcGVuc2lvbnMkY29tcHJlc3MgPSBzdXNwZW5zaW9ucy5jb21wcmVzc2lvbiwKICAgICAgICAgIGNvbXByZXNzaW9uID0gX3N1c3BlbnNpb25zJGNvbXByZXNzID09PSB2b2lkIDAgPyA0LjQgOiBfc3VzcGVuc2lvbnMkY29tcHJlc3MsCiAgICAgICAgICBfc3VzcGVuc2lvbnMkcmVzdExlbmcgPSBzdXNwZW5zaW9ucy5yZXN0TGVuZ3RoLAogICAgICAgICAgcmVzdExlbmd0aCA9IF9zdXNwZW5zaW9ucyRyZXN0TGVuZyA9PT0gdm9pZCAwID8gMC42IDogX3N1c3BlbnNpb25zJHJlc3RMZW5nOyAvLyBDaGFzc2lzCgogICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQW1tby5idEJveFNoYXBlKG5ldyBBbW1vLmJ0VmVjdG9yMyh3aWR0aCAqIC41LCBoZWlnaHQgKiAuNSwgbGVuZ3RoICogLjUpKTsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7CiAgICAgIHZhciBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7CiAgICAgIGdlb21ldHJ5LmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgY2hhc3NpcyA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5KG5ldyBBbW1vLmJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyhtYXNzLCBtb3Rpb25TdGF0ZSwgZ2VvbWV0cnksIGxvY2FsSW5lcnRpYSkpOwogICAgICBjaGFzc2lzLnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7CiAgICAgIHdvcmxkLmFkZFJpZ2lkQm9keShjaGFzc2lzKTsgLy8gUmF5Y2FzdCBWZWhpY2xlCgogICAgICB2YXIgdHVuaW5nID0gbmV3IEFtbW8uYnRWZWhpY2xlVHVuaW5nKCk7CiAgICAgIHZhciByYXlDYXN0ZXIgPSBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkLmdldER5bmFtaWNzV29ybGQoKSk7CiAgICAgIHZhciB2ZWhpY2xlID0gbmV3IEFtbW8uYnRSYXljYXN0VmVoaWNsZSh0dW5pbmcsIGNoYXNzaXMsIHJheUNhc3Rlcik7CiAgICAgIHZlaGljbGUuc2V0Q29vcmRpbmF0ZVN5c3RlbSgwLCAxLCAyKTsKICAgICAgd29ybGQuYWRkQWN0aW9uKHZlaGljbGUpOwogICAgICB2YXIgd2hlZWxEaXJlY3Rpb25DUzAgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgLTEsIDApOwogICAgICB2YXIgd2hlZWxBeGxlQ1MgPSBuZXcgQW1tby5idFZlY3RvcjMoLTEsIDAsIDApOwoKICAgICAgdmFyIGFkZFdoZWVsID0gZnVuY3Rpb24gYWRkV2hlZWwoaXNGcm9udCwgcG9zLCByYWRpdXMpIHsKICAgICAgICB2YXIgd2hlZWxJbmZvID0gdmVoaWNsZS5hZGRXaGVlbChwb3MsIHdoZWVsRGlyZWN0aW9uQ1MwLCB3aGVlbEF4bGVDUywgcmVzdExlbmd0aCwgcmFkaXVzLCB0dW5pbmcsIGlzRnJvbnQpOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9zdXNwZW5zaW9uU3RpZmZuZXNzKHN0aWZmbmVzcyk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdSZWxheGF0aW9uKGRhbXBpbmcpOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV93aGVlbHNEYW1waW5nQ29tcHJlc3Npb24oY29tcHJlc3Npb24pOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9mcmljdGlvblNsaXAoZnJpY3Rpb24pOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9yb2xsSW5mbHVlbmNlKHJvbGxJbmZsdWVuY2UpOwogICAgICB9OwoKICAgICAgYWRkV2hlZWwodHJ1ZSwgbmV3IEFtbW8uYnRWZWN0b3IzKHdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpOwogICAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpOwogICAgICBhZGRXaGVlbChmYWxzZSwgbmV3IEFtbW8uYnRWZWN0b3IzKC13aGVlbEhhbGZUcmFja0JhY2ssIHdoZWVsQXhpc0hlaWdodEJhY2ssIGF4aXNQb3NpdGlvbkJhY2spLCB3aGVlbFJhZGl1c0JhY2spOwogICAgICBhZGRXaGVlbChmYWxzZSwgbmV3IEFtbW8uYnRWZWN0b3IzKHdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7CiAgICAgIHZlaGljbGUudXVpZCA9IHV1aWQ7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHR5cGU6IFRZUEVTLlZFSElDTEUsCiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICB2ZWhpY2xlOiB2ZWhpY2xlLAogICAgICAgIHdoZWVsczogd2hlZWxzLAogICAgICAgIG9wdGlvbnM6IGRhdGEsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfVkVISUNMRV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgc2V0VmVoaWNsZVBvc2l0aW9uID0gZnVuY3Rpb24gc2V0VmVoaWNsZVBvc2l0aW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciBzZXRWZWhpY2xlUXVhdGVybmlvbiA9IGZ1bmN0aW9uIHNldFZlaGljbGVRdWF0ZXJuaW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CgogICAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7CiAgICAgICAgdmFyIGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHJlc2V0VmVoaWNsZSA9IGZ1bmN0aW9uIHJlc2V0VmVoaWNsZShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgaGFuZGxlVmVoaWNsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVZlaGljbGVVcGRhdGUoX3JlZiwgZHQpIHsKICAgICAgdmFyIHZlaGljbGUgPSBfcmVmLnZlaGljbGUsCiAgICAgICAgICB3aGVlbHMgPSBfcmVmLndoZWVscywKICAgICAgICAgIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBfcmVmJHN0YXRlID0gX3JlZi5zdGF0ZSwKICAgICAgICAgIHN0YXRlID0gX3JlZiRzdGF0ZSA9PT0gdm9pZCAwID8gREVGQVVMVF9WRUhJQ0xFX1NUQVRFIDogX3JlZiRzdGF0ZSwKICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucywKICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zOwogICAgICB2YXIgYnJlYWtpbmdGb3JjZSA9IDA7CiAgICAgIHZhciBlbmdpbmVGb3JjZSA9IDA7CiAgICAgIHZhciBfb3B0aW9ucyRzdGVlcmluZ0NsYW0gPSBvcHRpb25zLnN0ZWVyaW5nQ2xhbXAsCiAgICAgICAgICBzdGVlcmluZ0NsYW1wID0gX29wdGlvbnMkc3RlZXJpbmdDbGFtID09PSB2b2lkIDAgPyBERUZBVUxUX1NURUVSSU5HX0NMQU1QIDogX29wdGlvbnMkc3RlZXJpbmdDbGFtLAogICAgICAgICAgX29wdGlvbnMkc3RlZXJpbmdJbmNyID0gb3B0aW9ucy5zdGVlcmluZ0luY3JlbWVudCwKICAgICAgICAgIHN0ZWVyaW5nSW5jcmVtZW50ID0gX29wdGlvbnMkc3RlZXJpbmdJbmNyID09PSB2b2lkIDAgPyBERUZBVUxUX1NURUVSSU5HX0lOQ1JFTUVOVCA6IF9vcHRpb25zJHN0ZWVyaW5nSW5jciwKICAgICAgICAgIF9vcHRpb25zJG1heEVuZ2luZUZvciA9IG9wdGlvbnMubWF4RW5naW5lRm9yY2UsCiAgICAgICAgICBtYXhFbmdpbmVGb3JjZSA9IF9vcHRpb25zJG1heEVuZ2luZUZvciA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVhfRU5HSU5FX0ZPUkNFIDogX29wdGlvbnMkbWF4RW5naW5lRm9yLAogICAgICAgICAgX29wdGlvbnMkbWF4QnJlYWtpbmdGID0gb3B0aW9ucy5tYXhCcmVha2luZ0ZvcmNlLAogICAgICAgICAgbWF4QnJlYWtpbmdGb3JjZSA9IF9vcHRpb25zJG1heEJyZWFraW5nRiA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgOiBfb3B0aW9ucyRtYXhCcmVha2luZ0Y7CgogICAgICBpZiAoc3RhdGUuYWNjZWxlcmF0aW9uKSB7CiAgICAgICAgaWYgKHNwZWVkIDwgLTEpIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO2Vsc2UgZW5naW5lRm9yY2UgPSBtYXhFbmdpbmVGb3JjZTsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLmJyYWtpbmcpIHsKICAgICAgICBpZiAoc3BlZWQgPiAxKSBicmVha2luZ0ZvcmNlID0gbWF4QnJlYWtpbmdGb3JjZTtlbHNlIGVuZ2luZUZvcmNlID0gLW1heEVuZ2luZUZvcmNlIC8gMjsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLmxlZnQpIHsKICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nIDwgc3RlZXJpbmdDbGFtcCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdGF0ZS5yaWdodCkgewogICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IC1zdGVlcmluZ0NsYW1wKSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgLT0gc3RlZXJpbmdJbmNyZW1lbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCAtc3RlZXJpbmdJbmNyZW1lbnQpIHN0YXRlLnZlaGljbGVTdGVlcmluZyArPSBzdGVlcmluZ0luY3JlbWVudDtlbHNlIHsKICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IHN0ZWVyaW5nSW5jcmVtZW50KSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgLT0gc3RlZXJpbmdJbmNyZW1lbnQ7ZWxzZSB7CiAgICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX0xFRlQpOwogICAgICB2ZWhpY2xlLmFwcGx5RW5naW5lRm9yY2UoZW5naW5lRm9yY2UsIEJBQ0tfUklHSFQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlIC8gMiwgRlJPTlRfUklHSFQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UsIEJBQ0tfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0U3RlZXJpbmdWYWx1ZShzdGF0ZS52ZWhpY2xlU3RlZXJpbmcsIEZST05UX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9SSUdIVCk7CiAgICAgIHZhciB0bSwgcCwgcSwgaTsKICAgICAgdmFyIG4gPSB2ZWhpY2xlLmdldE51bVdoZWVscygpOwoKICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHZlaGljbGUudXBkYXRlV2hlZWxUcmFuc2Zvcm0oaSwgdHJ1ZSk7CiAgICAgICAgdG0gPSB2ZWhpY2xlLmdldFdoZWVsVHJhbnNmb3JtV1MoaSk7CiAgICAgICAgcCA9IHRtLmdldE9yaWdpbigpOwogICAgICAgIHEgPSB0bS5nZXRSb3RhdGlvbigpOwogICAgICAgIHZhciB3aGVlbFVVSUQgPSB3aGVlbHNbaV07CiAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHdoZWVsVVVJRCwgcCwgcSwgZHQpOwogICAgICB9CgogICAgICB0bSA9IHZlaGljbGUuZ2V0Q2hhc3Npc1dvcmxkVHJhbnNmb3JtKCk7CiAgICAgIHAgPSB0bS5nZXRPcmlnaW4oKTsKICAgICAgcSA9IHRtLmdldFJvdGF0aW9uKCk7CiAgICAgIHZhciBkaXJlY3Rpb24gPSB2ZWhpY2xlLmdldEZvcndhcmRWZWN0b3IoKTsKICAgICAgdmFyIHNwZWVkID0gdmVoaWNsZS5nZXRDdXJyZW50U3BlZWRLbUhvdXIoKTsKICAgICAgdmFyIGV4dHJhRGF0YSA9IHsKICAgICAgICBkaXJlY3Rpb246IHsKICAgICAgICAgIHg6IGRpcmVjdGlvbi54KCksCiAgICAgICAgICB5OiBkaXJlY3Rpb24ueSgpLAogICAgICAgICAgejogZGlyZWN0aW9uLnooKQogICAgICAgIH0sCiAgICAgICAgc3BlZWQ6IHNwZWVkCiAgICAgIH07CiAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBwLCBxLCBkdCwgZXh0cmFEYXRhKTsKICAgICAgd29ybGQudXBkYXRlQm9keVN0YXRlKHV1aWQsIHN0YXRlKTsKICAgIH07CgogICAgdmFyIGNyZWF0ZUdob3N0Q29sbGlkZXIgPSBmdW5jdGlvbiBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgcG9zaXRpb24pIHsKICAgICAgdmFyIGdob3N0Q29sbGlkZXIgPSBuZXcgQW1tby5idEdob3N0T2JqZWN0KCk7CiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICBnaG9zdENvbGxpZGVyLnNldENvbGxpc2lvblNoYXBlKG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKSk7CiAgICAgIGdob3N0Q29sbGlkZXIuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4ocG9zaXRpb24pOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKDAsIDAsIDAsIDEpKTsKICAgICAgZ2hvc3RDb2xsaWRlci5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICByZXR1cm4gewogICAgICAgIGdob3N0Q29sbGlkZXI6IGdob3N0Q29sbGlkZXIsCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0KICAgICAgfTsKICAgIH07CiAgICB2YXIgZm9yRWFjaEdob3N0Q29sbGlzaW9uID0gZnVuY3Rpb24gZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIpIHsKICAgICAgdmFyIGZvckVhY2hDYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkge307CiAgICAgIHZhciBjb2xsaXNpb25zID0gZ2hvc3RDb2xsaWRlci5nZXROdW1PdmVybGFwcGluZ09iamVjdHMoKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sbGlzaW9uczsgaSsrKSB7CiAgICAgICAgdmFyIG9iamVjdCA9IEFtbW8uY2FzdE9iamVjdChnaG9zdENvbGxpZGVyLmdldE92ZXJsYXBwaW5nT2JqZWN0KGkpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBvYmplY3QuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBmb3JFYWNoQ2FsbGJhY2sob2JqZWN0LCB0cmFuc2Zvcm0sIGkpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvblBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pIHsKICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gcG9zaXRpb247CgogICAgICBpZiAoIWV4cGxvc2lvblBvc2l0aW9uKSB7CiAgICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50LmJvZHk7CgogICAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBtb3Rpb25TdGF0ZS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGV4cGxvc2lvblBvc2l0aW9uID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICB9CgogICAgICByZXR1cm4gZXhwbG9zaW9uUG9zaXRpb247CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvbkltcHVsc2UgPSBmdW5jdGlvbiBnZXRFeHBsb3Npb25JbXB1bHNlKHBvc2l0aW9uLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpIHsKICAgICAgdmFyIGRpc3RhbmNlID0gcG9zaXRpb24ub3Bfc3ViKGV4cGxvc2lvblBvc2l0aW9uKTsKICAgICAgZGlzdGFuY2Uubm9ybWFsaXplKCk7CiAgICAgIHZhciBpbXB1bHNlID0gZGlzdGFuY2Uub3BfbXVsKHN0cmVuZ3RoKTsKICAgICAgaW1wdWxzZS5zZXRZKGltcHVsc2UueSgpICsgc3RyZW5ndGgpOwogICAgICByZXR1cm4gaW1wdWxzZTsKICAgIH07CiAgICB2YXIgY3JlYXRlRXhwbG9zaW9uID0gZnVuY3Rpb24gY3JlYXRlRXhwbG9zaW9uKF9yZWYpIHsKICAgICAgdmFyIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IF9yZWYucG9zaXRpb24sCiAgICAgICAgICBfcmVmJHJhZGl1cyA9IF9yZWYucmFkaXVzLAogICAgICAgICAgcmFkaXVzID0gX3JlZiRyYWRpdXMgPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TSVpFUy5TTUFMTCA6IF9yZWYkcmFkaXVzLAogICAgICAgICAgX3JlZiRzdHJlbmd0aCA9IF9yZWYuc3RyZW5ndGgsCiAgICAgICAgICBzdHJlbmd0aCA9IF9yZWYkc3RyZW5ndGggPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TVFJFTkdUSFMuTUVESVVNIDogX3JlZiRzdHJlbmd0aDsKCiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pOwoKICAgICAgICB2YXIgX2NyZWF0ZUdob3N0Q29sbGlkZXIgPSBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgZXhwbG9zaW9uUG9zaXRpb24pLAogICAgICAgICAgICBnaG9zdENvbGxpZGVyID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIuZ2hvc3RDb2xsaWRlciwKICAgICAgICAgICAgdHJhbnNmb3JtID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIudHJhbnNmb3JtOwoKICAgICAgICB3b3JsZC5hZGRDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIsIGZ1bmN0aW9uIChvYmplY3QsIG9iamVjdFRyYW5zZm9ybSkgewogICAgICAgICAgdmFyIG9yaWdpbiA9IG9iamVjdFRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICAgIG9iamVjdC5hY3RpdmF0ZSh0cnVlKTsKICAgICAgICAgIG9iamVjdC5hcHBseUNlbnRyYWxJbXB1bHNlKGdldEV4cGxvc2lvbkltcHVsc2Uob3JpZ2luLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpKTsKICAgICAgICB9KTsKICAgICAgICB3b3JsZC5nZXREeW5hbWljc1dvcmxkKCkucmVtb3ZlQ29sbGlzaW9uT2JqZWN0KGdob3N0Q29sbGlkZXIpOwogICAgICAgIEFtbW8uZGVzdHJveShnaG9zdENvbGxpZGVyKTsKICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnNmb3JtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBoYW5kbGVMb2FkRXZlbnQgPSBmdW5jdGlvbiBoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykgewogICAgICByZXR1cm4gZnVuY3Rpb24gKEFtbW8pIHsKICAgICAgICBzZWxmLkFtbW8gPSBBbW1vOwoKICAgICAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZikgewogICAgICAgICAgdmFyIGRhdGEgPSBfcmVmLmRhdGE7CgogICAgICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELkJPWDoKICAgICAgICAgICAgICBhZGRCb3goZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5TUEhFUkU6CiAgICAgICAgICAgICAgYWRkU3BoZXJlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuVkVISUNMRToKICAgICAgICAgICAgICBhZGRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuTU9ERUw6CiAgICAgICAgICAgICAgYWRkTW9kZWwoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5QTEFZRVI6CiAgICAgICAgICAgICAgYWRkUGxheWVyKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5MSU5FQVJfVkVMT0NJVFk6CiAgICAgICAgICAgICAgc2V0TGluZWFyVmVsb2NpdHkoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuUkVTRVQ6CiAgICAgICAgICAgICAgcmVzZXRFbGVtZW50KGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5QT1NJVElPTjoKICAgICAgICAgICAgICBzZXRQb3NpdGlvbihkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TRVQuUE9TSVRJT046CiAgICAgICAgICAgICAgc2V0VmVoaWNsZVBvc2l0aW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5RVUFURVJOSU9OOgogICAgICAgICAgICAgIHNldFZlaGljbGVRdWF0ZXJuaW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlJFU0VUOgogICAgICAgICAgICAgIHJlc2V0VmVoaWNsZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5BUFBMWS5JTVBVTFNFOgogICAgICAgICAgICAgIGFwcGx5SW1wdXNlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlVQREFURToKICAgICAgICAgICAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuRElTUE9TRToKICAgICAgICAgICAgICB3b3JsZC5kaXNwb3NlQm9keShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUZGRUNUUy5FWFBMT1NJT046CiAgICAgICAgICAgICAgY3JlYXRlRXhwbG9zaW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEU6CiAgICAgICAgICAgICAgd29ybGQudGVybWluYXRlKCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgd29ybGQuaW5pdChvcHRpb25zKTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFJlYWR5RXZlbnQoKTsKICAgICAgICB3b3JsZC5zaW11bGF0ZSgpOwogICAgICB9OwogICAgfTsKCiAgICB2YXIgbG9hZEFtbW8gPSBmdW5jdGlvbiBsb2FkQW1tbyhvcHRpb25zKSB7CiAgICAgIHZhciBzY3JpcHRVcmwgPSBvcHRpb25zLmhvc3QgKyAnLycgKyAob3B0aW9ucy5wYXRoIHx8IExJQlJBUllfTkFNRSk7CiAgICAgIGltcG9ydFNjcmlwdHMoc2NyaXB0VXJsKTsKICAgICAgQW1tbygpLnRoZW4oaGFuZGxlTG9hZEV2ZW50KG9wdGlvbnMpKTsKICAgIH07CgogICAgb25tZXNzYWdlID0gZnVuY3Rpb24gb25tZXNzYWdlKF9yZWYyKSB7CiAgICAgIHZhciBkYXRhID0gX3JlZjIuZGF0YTsKCiAgICAgIHN3aXRjaCAoZGF0YS5ldmVudCkgewogICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuTE9BRC5BTU1POgogICAgICAgICAgbG9hZEFtbW8oZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfTsKCn0pKCk7Cgo=', null, false);
|
|
55360
55345
|
/* eslint-enable */var PHYSICS_EVENTS = {
|
|
55361
55346
|
DISPATCH: 'physics:dispatch',
|
|
55362
55347
|
TERMINATE: 'physics:terminate',
|
|
@@ -57751,7 +57736,7 @@ function applyMiddleware() {
|
|
|
57751
57736
|
|
|
57752
57737
|
var thunk = createThunkMiddleware();
|
|
57753
57738
|
thunk.withExtraArgument = createThunkMiddleware;var name = "mage-engine";
|
|
57754
|
-
var version$1 = "3.
|
|
57739
|
+
var version$1 = "3.22.0";
|
|
57755
57740
|
var description = "A WebGL Javascript Game Engine, built on top of THREE.js and many other libraries.";
|
|
57756
57741
|
var main = "dist/mage.js";
|
|
57757
57742
|
var author$1 = {
|
|
@@ -59984,7 +59969,28 @@ var prepareModel = function prepareModel(model) {
|
|
|
59984
59969
|
setUpLightsAndShadows(mesh);
|
|
59985
59970
|
});
|
|
59986
59971
|
return model;
|
|
59987
|
-
};var
|
|
59972
|
+
};var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
59973
|
+
|
|
59974
|
+
function getAugmentedNamespace(n) {
|
|
59975
|
+
if (n.__esModule) return n;
|
|
59976
|
+
var a = Object.defineProperty({}, '__esModule', {value: true});
|
|
59977
|
+
Object.keys(n).forEach(function (k) {
|
|
59978
|
+
var d = Object.getOwnPropertyDescriptor(n, k);
|
|
59979
|
+
Object.defineProperty(a, k, d.get ? d : {
|
|
59980
|
+
enumerable: true,
|
|
59981
|
+
get: function () {
|
|
59982
|
+
return n[k];
|
|
59983
|
+
}
|
|
59984
|
+
});
|
|
59985
|
+
});
|
|
59986
|
+
return a;
|
|
59987
|
+
}var between$1 = {exports: {}};/* Between.js v0.1.2-fix.2 */
|
|
59988
|
+
|
|
59989
|
+
(function (module, exports) {
|
|
59990
|
+
!function(t,n){module.exports=n();}(commonjsGlobal,function(){function O(t){return (O="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function r(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r);}}function n(t,n,e){return n&&r(t.prototype,n),e&&r(t,e),t}function M(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function I(t){return (I=Object.getPrototypeOf||function(t){return t.__proto__})(t)}function o(t,n){return (o=Object.setPrototypeOf||function(t,n){return t.__proto__=n,t})(t,n)}function u(t,n,e){return (u="undefined"!=typeof Reflect&&Reflect.construct?Reflect.construct:function(t,n,e){var r=[null];r.push.apply(r,n);var u=new(t.bind.apply(t,r));return e&&o(u,e.prototype),u}).apply(null,arguments)}function _(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var t=function(o){var a={},i=[];(o=o||this).on=function(t,n,e){return (a[t]=a[t]||[]).push([n,e]),o},o.off=function(t,n){t||(a={});for(var e=a[t]||i,r=e.length=n?e.length:0;r--;)n==e[r][0]&&e.splice(r,1);return o},o.emit=function(t){for(var n,e=a[t]||i,r=0<e.length?e.slice(0,e.length):e,u=0;n=r[u++];)n[0].apply(n[1],i.slice.call(arguments,1));return o};};var V=function(t,n,e){return t*(1-e)+n*e},e="undefined"!=typeof window?window:"undefined"!=typeof commonjsGlobal?commonjsGlobal:"undefined"!=typeof self?self:{};function a(t,n){return t(n={exports:{}},n.exports),n.exports}for(var i=a(function(t){var n=t.exports={Linear:{None:function(t){return t}},Quadratic:{In:function(t){return t*t},Out:function(t){return t*(2-t)},InOut:function(t){return (t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)}},Cubic:{In:function(t){return t*t*t},Out:function(t){return --t*t*t+1},InOut:function(t){return (t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)}},Quartic:{In:function(t){return t*t*t*t},Out:function(t){return 1- --t*t*t*t},InOut:function(t){return (t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)}},Quintic:{In:function(t){return t*t*t*t*t},Out:function(t){return --t*t*t*t*t+1},InOut:function(t){return (t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)}},Sinusoidal:{In:function(t){return 1-Math.cos(t*Math.PI/2)},Out:function(t){return Math.sin(t*Math.PI/2)},InOut:function(t){return .5*(1-Math.cos(Math.PI*t))}},Exponential:{In:function(t){return 0===t?0:Math.pow(1024,t-1)},Out:function(t){return 1===t?1:1-Math.pow(2,-10*t)},InOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))}},Circular:{In:function(t){return 1-Math.sqrt(1-t*t)},Out:function(t){return Math.sqrt(1- --t*t)},InOut:function(t){return (t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)}},Elastic:{In:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),-e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4))},Out:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),e*Math.pow(2,-10*t)*Math.sin((t-n)*(2*Math.PI)/.4)+1)},InOut:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),(t*=2)<1?e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4)*-.5:e*Math.pow(2,-10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4)*.5+1)}},Back:{In:function(t){return t*t*(2.70158*t-1.70158)},Out:function(t){return --t*t*(2.70158*t+1.70158)+1},InOut:function(t){var n=2.5949095;return (t*=2)<1?t*t*((n+1)*t-n)*.5:.5*((t-=2)*t*((n+1)*t+n)+2)}},Bounce:{In:function(t){return 1-n.Bounce.Out(1-t)},Out:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},InOut:function(t){return t<.5?.5*n.Bounce.In(2*t):.5*n.Bounce.Out(2*t-1)+.5}}};}),c=(i.Linear,i.Quadratic,i.Cubic,i.Quartic,i.Quintic,i.Sinusoidal,i.Exponential,i.Circular,i.Elastic,i.Back,i.Bounce,a(function(a){(function(){var t,n,e,r,u,o;"undefined"!=typeof performance&&null!==performance&&performance.now?a.exports=function(){return performance.now()}:"undefined"!=typeof process&&null!==process&&process.hrtime?(a.exports=function(){return (t()-u)/1e6},n=process.hrtime,r=(t=function(){var t;return 1e9*(t=n())[0]+t[1]})(),o=1e9*process.uptime(),u=r-o):Date.now?(a.exports=function(){return Date.now()-e},e=Date.now()):(a.exports=function(){return (new Date).getTime()-e},e=(new Date).getTime());}).call(e);})),l="undefined"==typeof window?e:window,f=["moz","webkit"],s="AnimationFrame",p=l["request"+s],h=l["cancel"+s]||l["cancelRequest"+s],m=0;!p&&m<f.length;m++)p=l[f[m]+"Request"+s],h=l[f[m]+"Cancel"+s]||l[f[m]+"CancelRequest"+s];if(!p||!h){var d=0,y=0,v=[];p=function(t){if(0===v.length){var n=c(),e=Math.max(0,1e3/60-(n-d));d=e+n,setTimeout(function(){for(var t=v.slice(0),n=v.length=0;n<t.length;n++)if(!t[n].cancelled)try{t[n].callback(d);}catch(t){setTimeout(function(){throw t},0);}},Math.round(e));}return v.push({handle:++y,callback:t,cancelled:!1}),y},h=function(t){for(var n=0;n<v.length;n++)v[n].handle===t&&(v[n].cancelled=!0);};}var b=function(t){return p.call(l,t)};b.cancel=function(){h.apply(l,arguments);},b.polyfill=function(t){t||(t=l),t.requestAnimationFrame=p,t.cancelAnimationFrame=h;};var w,k,P=[],T=Symbol("type"),j=Symbol("start_time"),x=Symbol("completed"),D=Symbol("paused"),g=requestAnimationFrame||b,A=Date.now();!function t(){g(t),w=Date.now(),k=w-A;for(var n=0;n<P.length;n++)P[n][x]||P[n](k,Date.now()-P[n][j]);A=w;}();var E=function(t){function g(e,t){var n,r,u,o;!function(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}(this,g),u=this,o=I(g).call(this),M(_(_(r=!o||"object"!=typeof o&&"function"!=typeof o?_(u):o)),"update",function(){var e=_(_(r))._updateValue;return function(t,n){r[x]||r[D]||(0===r.localTime&&r.emit("start",r.value,_(_(r))),e(r.ease(r.loopFunction.progress(Math.min(1,(n||r.localTime)/r.duration)))),r.emit("update",r.value,_(_(r)),t),r.localTime>=r.duration&&r.loopFunction.complete(function(){r[x]=!0,r.emit("complete",r.value,_(_(r)));}),r.localTime+=t);}});var a=r.plugin=Object.values(g._plugins).reduce(function(t,n){return t||n&&n.test&&n.test(e)&&n},!1),i=a&&a.name||("object"===O(e)?Array.isArray(e)?"array":"object":"number");if(a){var c=a.initialize(e,t);e=c.startValue,t=c.destValue,r.data=c.data;}switch(Object.assign(_(_(r)),(M(n={duration:1e3,localTime:0,startValue:e,destValue:t,loopMode:"once",loopFunction:g.DEFAULT_LOOP,ease:function(t){return t},value:"array"===i?[].concat(e):"object"===i?Object.assign({},e):e},x,!1),M(n,T,i),M(n,j,Date.now()),M(n,D,!1),n)),r[T]){case"number":r._updateValue=function(t){r.value=V(r.startValue,r.destValue,t);};break;case"array":var l=r.value.length,f=_(_(r)),s=f.startValue,p=f.destValue,h=f.value;r._updateValue=function(t){for(var n=0;n<l;n++)h[n]=V(s[n],p[n],t);};break;case"object":var m=Object.keys(r.startValue),d=m.length,y=_(_(r)),v=y.startValue,b=y.destValue,w=y.value;r._updateValue=function(t){for(var n=0;n<d;n++){var e=m[n];w[e]=V(v[e],b[e],t);}};break;default:r.plugin?r._updateValue=function(t){r.value=r.plugin.interpolate(r.startValue,r.destValue,t,r.data);}:(console.warn("Between: startValue type was unrecognized."),r._updateValue=function(){return null});}return P.push(r.update()),r}return n(g,null,[{key:"between",value:function(){for(var t=arguments.length,n=new Array(t),e=0;e<t;e++)n[e]=arguments[e];return u(g,n)}}]),n(g,[{key:"pause",value:function(){return this[D]=!0,this.emit("pause",this.value,this,k),this}},{key:"play",value:function(){return this[D]=!1,this.emit("play",this.value,this,k),this}},{key:"easing",value:function(t){return this.ease=t,this}},{key:"time",value:function(t){return this.duration=t,this}},{key:"loop",value:function(){for(var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"once",n="__loop_".concat(t),e=arguments.length,r=new Array(1<e?e-1:0),u=1;u<e;u++)r[u-1]=arguments[u];return this.loopFunction=n in this?Object.assign({},g.DEFAULT_LOOP,this[n].apply(this,r)):g.DEFAULT_LOOP,this}},{key:"__loop_repeat",value:function(t){var n=this,e=t;return this.times=0,{complete:function(t){n.localTime=0,Number.isInteger(e)&&++n.times===e?t():Number.isInteger(e)||++n.times;}}}},{key:"__loop_bounce",value:function(t){var n=this,e=t,r=1;return this.times=0,{complete:function(t){n.localTime=0,r=-r,Number.isInteger(e)&&++n.times===e?t():Number.isInteger(e)||++n.times;},progress:function(t){return 0<r?t:1-t}}}},{key:"isPaused",get:function(){return this[D]}}]),function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");o(t.prototype,n&&n.prototype),n&&o(t,n);}(g,t),g}(t);return M(E,"DEFAULT_LOOP",{complete:function(t){return t()},progress:function(t){return t}}),E.Easing=i,E._plugins={},E});
|
|
59991
|
+
}(between$1));
|
|
59992
|
+
|
|
59993
|
+
var between = between$1.exports;var LOOPING = {
|
|
59988
59994
|
BOUNCE: 'bounce',
|
|
59989
59995
|
REPEAT: 'repeat',
|
|
59990
59996
|
NONE: false
|
|
@@ -60034,15 +60040,15 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60034
60040
|
function Entity() {
|
|
60035
60041
|
var _this;
|
|
60036
60042
|
|
|
60037
|
-
var
|
|
60043
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
60038
60044
|
|
|
60039
60045
|
_classCallCheck(this, Entity);
|
|
60040
60046
|
|
|
60041
|
-
var _options$serializable =
|
|
60047
|
+
var _options$serializable = options.serializable,
|
|
60042
60048
|
serializable = _options$serializable === void 0 ? true : _options$serializable,
|
|
60043
|
-
_options$tag =
|
|
60044
|
-
tag = _options$tag === void 0 ?
|
|
60045
|
-
_options$tags =
|
|
60049
|
+
_options$tag = options.tag,
|
|
60050
|
+
tag = _options$tag === void 0 ? "" : _options$tag,
|
|
60051
|
+
_options$tags = options.tags,
|
|
60046
60052
|
tags = _options$tags === void 0 ? [] : _options$tags;
|
|
60047
60053
|
_this = _super.call(this);
|
|
60048
60054
|
|
|
@@ -60072,18 +60078,21 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60072
60078
|
});
|
|
60073
60079
|
|
|
60074
60080
|
_defineProperty$1(_assertThisInitialized(_this), "hasScripts", function () {
|
|
60075
|
-
return _this.
|
|
60081
|
+
return _this.allScripts().length > 0;
|
|
60076
60082
|
});
|
|
60077
60083
|
|
|
60078
|
-
_defineProperty$1(_assertThisInitialized(_this), "
|
|
60079
|
-
return
|
|
60080
|
-
|
|
60081
|
-
|
|
60082
|
-
|
|
60083
|
-
|
|
60084
|
-
|
|
60085
|
-
|
|
60086
|
-
|
|
60084
|
+
_defineProperty$1(_assertThisInitialized(_this), "allScripts", function () {
|
|
60085
|
+
return [].concat(_toConsumableArray(_this.dynamicScripts), _toConsumableArray(_this.staticScripts));
|
|
60086
|
+
});
|
|
60087
|
+
|
|
60088
|
+
_defineProperty$1(_assertThisInitialized(_this), "updateScriptsIndexes", function () {
|
|
60089
|
+
var update = function update(s, i) {
|
|
60090
|
+
return s.index = i;
|
|
60091
|
+
};
|
|
60092
|
+
|
|
60093
|
+
_this.dynamicScripts.forEach(update);
|
|
60094
|
+
|
|
60095
|
+
_this.staticScripts.forEach(update);
|
|
60087
60096
|
});
|
|
60088
60097
|
|
|
60089
60098
|
_defineProperty$1(_assertThisInitialized(_this), "isMesh", function () {
|
|
@@ -60125,12 +60134,13 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60125
60134
|
}
|
|
60126
60135
|
});
|
|
60127
60136
|
|
|
60128
|
-
_this.options = _objectSpread2$1(_objectSpread2$1({},
|
|
60137
|
+
_this.options = _objectSpread2$1(_objectSpread2$1({}, options), {}, {
|
|
60129
60138
|
serializable: serializable,
|
|
60130
60139
|
tag: tag,
|
|
60131
60140
|
tags: tags
|
|
60132
60141
|
});
|
|
60133
|
-
_this.
|
|
60142
|
+
_this.dynamicScripts = [];
|
|
60143
|
+
_this.staticScripts = [];
|
|
60134
60144
|
_this.tags = [];
|
|
60135
60145
|
_this.children = [];
|
|
60136
60146
|
_this.isMage = true;
|
|
@@ -60156,7 +60166,8 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60156
60166
|
}, {
|
|
60157
60167
|
key: "reset",
|
|
60158
60168
|
value: function reset() {
|
|
60159
|
-
this.
|
|
60169
|
+
this.dynamicScripts = [];
|
|
60170
|
+
this.staticScripts = [];
|
|
60160
60171
|
this.children = [];
|
|
60161
60172
|
this.isMage = true;
|
|
60162
60173
|
this.parent = false;
|
|
@@ -60290,7 +60301,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60290
60301
|
var index = this.children.findIndex(function (m) {
|
|
60291
60302
|
return m.equals(element);
|
|
60292
60303
|
});
|
|
60293
|
-
if (index) this.children.splice(index, 1);
|
|
60304
|
+
if (index !== -1) this.children.splice(index, 1);
|
|
60294
60305
|
} else {
|
|
60295
60306
|
this.body.remove(element.getBody());
|
|
60296
60307
|
}
|
|
@@ -60363,20 +60374,18 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60363
60374
|
key: "disposeScripts",
|
|
60364
60375
|
value: function disposeScripts() {
|
|
60365
60376
|
if (this.hasScripts()) {
|
|
60366
|
-
var length = this.
|
|
60377
|
+
var length = this.allScripts().length;
|
|
60367
60378
|
|
|
60368
60379
|
for (var i = 0; i < length; i++) {
|
|
60369
|
-
var _this$
|
|
60370
|
-
script = _this$
|
|
60371
|
-
enabled = _this$
|
|
60380
|
+
var _this$allScripts$i = this.allScripts()[i],
|
|
60381
|
+
script = _this$allScripts$i.script,
|
|
60382
|
+
enabled = _this$allScripts$i.enabled;
|
|
60372
60383
|
|
|
60373
60384
|
if (enabled) {
|
|
60374
60385
|
script.onDispose();
|
|
60375
60386
|
|
|
60376
60387
|
script.__setStartedFlag(false);
|
|
60377
60388
|
}
|
|
60378
|
-
|
|
60379
|
-
delete this.scripts[i];
|
|
60380
60389
|
}
|
|
60381
60390
|
}
|
|
60382
60391
|
}
|
|
@@ -60386,7 +60395,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60386
60395
|
var _this4 = this;
|
|
60387
60396
|
|
|
60388
60397
|
if (this.hasScripts()) {
|
|
60389
|
-
this.
|
|
60398
|
+
this.allScripts().forEach(function (_ref4) {
|
|
60390
60399
|
var script = _ref4.script,
|
|
60391
60400
|
enabled = _ref4.enabled,
|
|
60392
60401
|
options = _ref4.options;
|
|
@@ -60403,7 +60412,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60403
60412
|
key: "update",
|
|
60404
60413
|
value: function update(dt) {
|
|
60405
60414
|
if (this.hasScripts()) {
|
|
60406
|
-
this.
|
|
60415
|
+
this.dynamicScripts.forEach(function (_ref5) {
|
|
60407
60416
|
var script = _ref5.script,
|
|
60408
60417
|
enabled = _ref5.enabled;
|
|
60409
60418
|
|
|
@@ -60417,7 +60426,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60417
60426
|
key: "onPhysicsUpdate",
|
|
60418
60427
|
value: function onPhysicsUpdate(dt) {
|
|
60419
60428
|
if (this.hasScripts()) {
|
|
60420
|
-
this.
|
|
60429
|
+
this.dynamicScripts.forEach(function (_ref6) {
|
|
60421
60430
|
var script = _ref6.script,
|
|
60422
60431
|
enabled = _ref6.enabled;
|
|
60423
60432
|
|
|
@@ -60456,6 +60465,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60456
60465
|
type: ENTITY_EVENTS.DISPOSE
|
|
60457
60466
|
});
|
|
60458
60467
|
this.reset();
|
|
60468
|
+
this.disposed = true;
|
|
60459
60469
|
}
|
|
60460
60470
|
}, {
|
|
60461
60471
|
key: "addStateMachine",
|
|
@@ -60501,33 +60511,22 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60501
60511
|
}, {
|
|
60502
60512
|
key: "getScript",
|
|
60503
60513
|
value: function getScript(name) {
|
|
60504
|
-
|
|
60505
|
-
return script.name === name;
|
|
60506
|
-
})[0].script;
|
|
60507
|
-
|
|
60508
|
-
if (script) {
|
|
60509
|
-
return script;
|
|
60510
|
-
} else {
|
|
60514
|
+
if (!this.hasScript(name)) {
|
|
60511
60515
|
console.warn(SCRIPT_NOT_FOUND);
|
|
60512
60516
|
return false;
|
|
60513
60517
|
}
|
|
60518
|
+
|
|
60519
|
+
var script = this.allScripts().filter(function (script) {
|
|
60520
|
+
return script.name === name;
|
|
60521
|
+
})[0].script;
|
|
60522
|
+
return script;
|
|
60514
60523
|
}
|
|
60515
60524
|
}, {
|
|
60516
|
-
key: "
|
|
60517
|
-
value: function
|
|
60518
|
-
|
|
60519
|
-
|
|
60520
|
-
|
|
60521
|
-
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
60522
|
-
var enabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
60523
|
-
var parsedScripts = this.parseScripts(scripts, options, enabled);
|
|
60524
|
-
this.scripts = [].concat(_toConsumableArray(this.scripts), [parsedScripts]);
|
|
60525
|
-
|
|
60526
|
-
if (enabled) {
|
|
60527
|
-
parsedScripts.forEach(function (parsed) {
|
|
60528
|
-
return parsed.start(_this6, parsed.options);
|
|
60529
|
-
});
|
|
60530
|
-
}
|
|
60525
|
+
key: "hasScript",
|
|
60526
|
+
value: function hasScript(name) {
|
|
60527
|
+
return this.allScripts().filter(function (script) {
|
|
60528
|
+
return script.name === name;
|
|
60529
|
+
}).length;
|
|
60531
60530
|
}
|
|
60532
60531
|
}, {
|
|
60533
60532
|
key: "addScript",
|
|
@@ -60538,12 +60537,22 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60538
60537
|
enabled = _options$enabled === void 0 ? true : _options$enabled;
|
|
60539
60538
|
|
|
60540
60539
|
if (script) {
|
|
60541
|
-
|
|
60540
|
+
var payload = {
|
|
60542
60541
|
script: script,
|
|
60543
60542
|
name: name,
|
|
60544
60543
|
enabled: enabled,
|
|
60545
60544
|
options: options
|
|
60546
|
-
}
|
|
60545
|
+
};
|
|
60546
|
+
|
|
60547
|
+
if (script.__isStatic()) {
|
|
60548
|
+
this.staticScripts.push(_objectSpread2$1(_objectSpread2$1({}, payload), {}, {
|
|
60549
|
+
index: this.staticScripts.length
|
|
60550
|
+
}));
|
|
60551
|
+
} else {
|
|
60552
|
+
this.dynamicScripts.push(_objectSpread2$1(_objectSpread2$1({}, payload), {}, {
|
|
60553
|
+
index: this.dynamicScripts.length
|
|
60554
|
+
}));
|
|
60555
|
+
}
|
|
60547
60556
|
|
|
60548
60557
|
if (enabled) {
|
|
60549
60558
|
script.start(this, options);
|
|
@@ -60554,6 +60563,31 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60554
60563
|
|
|
60555
60564
|
return script;
|
|
60556
60565
|
}
|
|
60566
|
+
}, {
|
|
60567
|
+
key: "removeScript",
|
|
60568
|
+
value: function removeScript(name) {
|
|
60569
|
+
var all = this.allScripts();
|
|
60570
|
+
var allIndex = all.findIndex(function (script) {
|
|
60571
|
+
return script.name === name;
|
|
60572
|
+
});
|
|
60573
|
+
var _all$allIndex = all[allIndex],
|
|
60574
|
+
script = _all$allIndex.script,
|
|
60575
|
+
index = _all$allIndex.index;
|
|
60576
|
+
|
|
60577
|
+
if (script) {
|
|
60578
|
+
script.onDispose();
|
|
60579
|
+
|
|
60580
|
+
if (script.__isStatic()) {
|
|
60581
|
+
this.staticScripts.splice(index, 1);
|
|
60582
|
+
} else {
|
|
60583
|
+
this.dynamicScripts.splice(index, 1);
|
|
60584
|
+
}
|
|
60585
|
+
|
|
60586
|
+
this.updateScriptsIndexes();
|
|
60587
|
+
} else {
|
|
60588
|
+
console.log(SCRIPT_NOT_FOUND);
|
|
60589
|
+
}
|
|
60590
|
+
}
|
|
60557
60591
|
}, {
|
|
60558
60592
|
key: "enableScripts",
|
|
60559
60593
|
value: function enableScripts() {
|
|
@@ -60655,7 +60689,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60655
60689
|
value: function getWorldTransform() {
|
|
60656
60690
|
var position = this.getBody().getWorldPosition(new Vector3$1());
|
|
60657
60691
|
var quaternion = this.getBody().getWorldQuaternion(new Quaternion(0, 0, 0, 1));
|
|
60658
|
-
var rotation = new Euler(0, 0, 0,
|
|
60692
|
+
var rotation = new Euler(0, 0, 0, "XYZ").setFromQuaternion(quaternion, "XYZ");
|
|
60659
60693
|
return {
|
|
60660
60694
|
position: position,
|
|
60661
60695
|
rotation: rotation,
|
|
@@ -60681,7 +60715,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60681
60715
|
}, {
|
|
60682
60716
|
key: "scaleTo",
|
|
60683
60717
|
value: function scaleTo() {
|
|
60684
|
-
var
|
|
60718
|
+
var _this6 = this;
|
|
60685
60719
|
|
|
60686
60720
|
var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getScale();
|
|
60687
60721
|
var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
|
|
@@ -60699,7 +60733,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60699
60733
|
}, scale);
|
|
60700
60734
|
|
|
60701
60735
|
var onUpdate = function onUpdate(value) {
|
|
60702
|
-
return !
|
|
60736
|
+
return !_this6.isDisposed() && _this6.setScale(value);
|
|
60703
60737
|
};
|
|
60704
60738
|
|
|
60705
60739
|
return tweenTo({
|
|
@@ -60714,7 +60748,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60714
60748
|
}, {
|
|
60715
60749
|
key: "rotateTo",
|
|
60716
60750
|
value: function rotateTo() {
|
|
60717
|
-
var
|
|
60751
|
+
var _this7 = this;
|
|
60718
60752
|
|
|
60719
60753
|
var rotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getRotation();
|
|
60720
60754
|
var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
|
|
@@ -60732,7 +60766,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60732
60766
|
}, rotation);
|
|
60733
60767
|
|
|
60734
60768
|
var onUpdate = function onUpdate(value) {
|
|
60735
|
-
return !
|
|
60769
|
+
return !_this7.isDisposed() && _this7.setRotation(value);
|
|
60736
60770
|
};
|
|
60737
60771
|
|
|
60738
60772
|
return tweenTo({
|
|
@@ -60747,7 +60781,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60747
60781
|
}, {
|
|
60748
60782
|
key: "goTo",
|
|
60749
60783
|
value: function goTo() {
|
|
60750
|
-
var
|
|
60784
|
+
var _this8 = this;
|
|
60751
60785
|
|
|
60752
60786
|
var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getPosition();
|
|
60753
60787
|
var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
|
|
@@ -60765,7 +60799,7 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60765
60799
|
}, position);
|
|
60766
60800
|
|
|
60767
60801
|
var onUpdate = function onUpdate(value) {
|
|
60768
|
-
return !
|
|
60802
|
+
return !_this8.isDisposed() && _this8.setPosition(value);
|
|
60769
60803
|
};
|
|
60770
60804
|
|
|
60771
60805
|
return tweenTo({
|
|
@@ -60846,16 +60880,19 @@ var tweenTo = function tweenTo(origin, target) {
|
|
|
60846
60880
|
}, {
|
|
60847
60881
|
key: "mapScriptsToJSON",
|
|
60848
60882
|
value: function mapScriptsToJSON() {
|
|
60849
|
-
this.
|
|
60883
|
+
this.allScripts().reduce(function (acc, _ref8) {
|
|
60850
60884
|
var name = _ref8.name,
|
|
60851
60885
|
_ref8$options = _ref8.options,
|
|
60852
|
-
options = _ref8$options === void 0 ? {} : _ref8$options
|
|
60886
|
+
options = _ref8$options === void 0 ? {} : _ref8$options,
|
|
60887
|
+
script = _ref8.script;
|
|
60853
60888
|
acc.names.push(name);
|
|
60854
60889
|
acc.options.push(options);
|
|
60890
|
+
acc.static.push(script.__isStatic());
|
|
60855
60891
|
return acc;
|
|
60856
60892
|
}, {
|
|
60857
60893
|
names: [],
|
|
60858
|
-
options: []
|
|
60894
|
+
options: [],
|
|
60895
|
+
static: []
|
|
60859
60896
|
});
|
|
60860
60897
|
}
|
|
60861
60898
|
}, {
|
|
@@ -61837,14 +61874,63 @@ var Element$1 = /*#__PURE__*/function (_Entity) {
|
|
|
61837
61874
|
}]);
|
|
61838
61875
|
|
|
61839
61876
|
return Camera;
|
|
61840
|
-
}(Entity);var
|
|
61877
|
+
}(Entity);var Color = /*#__PURE__*/function () {
|
|
61878
|
+
_createClass(Color, null, [{
|
|
61879
|
+
key: "randomColor",
|
|
61880
|
+
value: function randomColor() {
|
|
61881
|
+
var asNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
61882
|
+
var letters = '0123456789ABCDEF'.split('');
|
|
61883
|
+
var color = '';
|
|
61884
|
+
|
|
61885
|
+
for (var i = 0; i < 6; i++) {
|
|
61886
|
+
color += letters[Math.floor(Math.random() * 16)];
|
|
61887
|
+
}
|
|
61888
|
+
|
|
61889
|
+
return asNumber ? Number("0x".concat(color)) : "#".concat(color);
|
|
61890
|
+
}
|
|
61891
|
+
}, {
|
|
61892
|
+
key: "componentToHex",
|
|
61893
|
+
value: function componentToHex(c) {
|
|
61894
|
+
var hex = c.toString(16);
|
|
61895
|
+
return hex.length == 1 ? "0" + hex : hex;
|
|
61896
|
+
}
|
|
61897
|
+
}, {
|
|
61898
|
+
key: "gbToHex",
|
|
61899
|
+
value: function gbToHex(r, g, b) {
|
|
61900
|
+
return "0x" + Color.componentToHex(r) + Color.componentToHex(g) + Color.componentToHex(b);
|
|
61901
|
+
}
|
|
61902
|
+
}, {
|
|
61903
|
+
key: "getIntValueFromHex",
|
|
61904
|
+
value: function getIntValueFromHex(hex) {
|
|
61905
|
+
return parseInt(hex, 16);
|
|
61906
|
+
}
|
|
61907
|
+
}]);
|
|
61908
|
+
|
|
61909
|
+
function Color(color) {
|
|
61910
|
+
_classCallCheck(this, Color);
|
|
61911
|
+
|
|
61912
|
+
this.color = new Color$1(color);
|
|
61913
|
+
}
|
|
61914
|
+
|
|
61915
|
+
_createClass(Color, [{
|
|
61916
|
+
key: "getColor",
|
|
61917
|
+
value: function getColor() {
|
|
61918
|
+
return this.color;
|
|
61919
|
+
}
|
|
61920
|
+
}]);
|
|
61921
|
+
|
|
61922
|
+
return Color;
|
|
61923
|
+
}();var Grid = /*#__PURE__*/function (_Element) {
|
|
61841
61924
|
_inherits(Grid, _Element);
|
|
61842
61925
|
|
|
61843
61926
|
var _super = _createSuper(Grid);
|
|
61844
61927
|
|
|
61845
|
-
function Grid(size, division
|
|
61928
|
+
function Grid(size, division) {
|
|
61846
61929
|
var _this;
|
|
61847
61930
|
|
|
61931
|
+
var color1 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Color.randomColor(true);
|
|
61932
|
+
var color2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Color.randomColor(true);
|
|
61933
|
+
|
|
61848
61934
|
_classCallCheck(this, Grid);
|
|
61849
61935
|
|
|
61850
61936
|
var options = {
|
|
@@ -61852,7 +61938,7 @@ var Element$1 = /*#__PURE__*/function (_Entity) {
|
|
|
61852
61938
|
division: division,
|
|
61853
61939
|
color1: color1,
|
|
61854
61940
|
color2: color2,
|
|
61855
|
-
name: generateRandomName(
|
|
61941
|
+
name: generateRandomName("GridHelper")
|
|
61856
61942
|
};
|
|
61857
61943
|
_this = _super.call(this, options);
|
|
61858
61944
|
var body = new GridHelper(size, division, color1, color2);
|
|
@@ -61970,7 +62056,7 @@ var Axes = /*#__PURE__*/function (_Element) {
|
|
|
61970
62056
|
var _this;
|
|
61971
62057
|
|
|
61972
62058
|
var side = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
|
|
61973
|
-
var color = arguments.length > 1 ? arguments[1] :
|
|
62059
|
+
var color = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Color.randomColor(true);
|
|
61974
62060
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
61975
62061
|
|
|
61976
62062
|
_classCallCheck(this, Cube);
|
|
@@ -62002,7 +62088,7 @@ var Axes = /*#__PURE__*/function (_Element) {
|
|
|
62002
62088
|
var _this;
|
|
62003
62089
|
|
|
62004
62090
|
var radius = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
|
|
62005
|
-
var color = arguments.length > 1 ? arguments[1] :
|
|
62091
|
+
var color = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Color.randomColor(true);
|
|
62006
62092
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
62007
62093
|
|
|
62008
62094
|
_classCallCheck(this, Sphere);
|
|
@@ -62036,8 +62122,8 @@ var Axes = /*#__PURE__*/function (_Element) {
|
|
|
62036
62122
|
|
|
62037
62123
|
var radiusTop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
|
|
62038
62124
|
var radiusBottom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
|
|
62039
|
-
var height = arguments.length > 2 ? arguments[2] :
|
|
62040
|
-
var color = arguments.length > 3 ? arguments[3] :
|
|
62125
|
+
var height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
|
|
62126
|
+
var color = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Color.randomColor(true);
|
|
62041
62127
|
var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
|
|
62042
62128
|
|
|
62043
62129
|
_classCallCheck(this, Cylinder);
|
|
@@ -62208,24 +62294,23 @@ var Plane = /*#__PURE__*/function (_Element) {
|
|
|
62208
62294
|
function Plane(height, width) {
|
|
62209
62295
|
var _this;
|
|
62210
62296
|
|
|
62211
|
-
var
|
|
62297
|
+
var color = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Color.randomColor(true);
|
|
62298
|
+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
62212
62299
|
|
|
62213
62300
|
_classCallCheck(this, Plane);
|
|
62214
62301
|
|
|
62215
62302
|
_this = _super.call(this, options);
|
|
62216
|
-
var _options$
|
|
62217
|
-
color = _options$color === void 0 ? 0xfffffff : _options$color,
|
|
62218
|
-
_options$transparent = options.transparent,
|
|
62303
|
+
var _options$transparent = options.transparent,
|
|
62219
62304
|
transparent = _options$transparent === void 0 ? false : _options$transparent,
|
|
62220
62305
|
_options$opacity = options.opacity,
|
|
62221
62306
|
opacity = _options$opacity === void 0 ? 1 : _options$opacity;
|
|
62222
|
-
material = new MeshBasicMaterial({
|
|
62307
|
+
var material = new MeshBasicMaterial({
|
|
62223
62308
|
color: color,
|
|
62224
62309
|
side: DoubleSide,
|
|
62225
62310
|
transparent: transparent,
|
|
62226
62311
|
opacity: opacity
|
|
62227
62312
|
});
|
|
62228
|
-
geometry = new PlaneGeometry(width, height);
|
|
62313
|
+
var geometry = new PlaneGeometry(width, height);
|
|
62229
62314
|
|
|
62230
62315
|
_this.setBody({
|
|
62231
62316
|
geometry: geometry,
|
|
@@ -62267,7 +62352,7 @@ var Plane = /*#__PURE__*/function (_Element) {
|
|
|
62267
62352
|
var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
|
|
62268
62353
|
var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
|
|
62269
62354
|
var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
|
|
62270
|
-
var color = arguments.length > 3 ? arguments[3] :
|
|
62355
|
+
var color = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Color.randomColor(true);
|
|
62271
62356
|
var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
|
|
62272
62357
|
|
|
62273
62358
|
_classCallCheck(this, Box);
|
|
@@ -90605,53 +90690,7 @@ var Label = /*#__PURE__*/function (_Element) {
|
|
|
90605
90690
|
}]);
|
|
90606
90691
|
|
|
90607
90692
|
return Label;
|
|
90608
|
-
}(Element$1);var
|
|
90609
|
-
_createClass(Color, null, [{
|
|
90610
|
-
key: "randomColor",
|
|
90611
|
-
value: function randomColor() {
|
|
90612
|
-
var asNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
90613
|
-
var letters = '0123456789ABCDEF'.split('');
|
|
90614
|
-
var color = '';
|
|
90615
|
-
|
|
90616
|
-
for (var i = 0; i < 6; i++) {
|
|
90617
|
-
color += letters[Math.floor(Math.random() * 16)];
|
|
90618
|
-
}
|
|
90619
|
-
|
|
90620
|
-
return asNumber ? Number("0x".concat(color)) : "#".concat(color);
|
|
90621
|
-
}
|
|
90622
|
-
}, {
|
|
90623
|
-
key: "componentToHex",
|
|
90624
|
-
value: function componentToHex(c) {
|
|
90625
|
-
var hex = c.toString(16);
|
|
90626
|
-
return hex.length == 1 ? "0" + hex : hex;
|
|
90627
|
-
}
|
|
90628
|
-
}, {
|
|
90629
|
-
key: "gbToHex",
|
|
90630
|
-
value: function gbToHex(r, g, b) {
|
|
90631
|
-
return "0x" + Color.componentToHex(r) + Color.componentToHex(g) + Color.componentToHex(b);
|
|
90632
|
-
}
|
|
90633
|
-
}, {
|
|
90634
|
-
key: "getIntValueFromHex",
|
|
90635
|
-
value: function getIntValueFromHex(hex) {
|
|
90636
|
-
return parseInt(hex, 16);
|
|
90637
|
-
}
|
|
90638
|
-
}]);
|
|
90639
|
-
|
|
90640
|
-
function Color(color) {
|
|
90641
|
-
_classCallCheck(this, Color);
|
|
90642
|
-
|
|
90643
|
-
this.color = new Color$1(color);
|
|
90644
|
-
}
|
|
90645
|
-
|
|
90646
|
-
_createClass(Color, [{
|
|
90647
|
-
key: "getColor",
|
|
90648
|
-
value: function getColor() {
|
|
90649
|
-
return this.color;
|
|
90650
|
-
}
|
|
90651
|
-
}]);
|
|
90652
|
-
|
|
90653
|
-
return Color;
|
|
90654
|
-
}();var DEFAULT_RADIUS = 5;
|
|
90693
|
+
}(Element$1);var DEFAULT_RADIUS = 5;
|
|
90655
90694
|
var DEFAULT_HEIGHT = 5;
|
|
90656
90695
|
var DEFAULT_RADIAL_SEGMENTS = 8;
|
|
90657
90696
|
var DEFAULT_HEIGHT_SEGMENTS = 1;
|